@sprucelabs/spruce-cli
Version:
Command line interface for building Spruce skills.
114 lines • 5.14 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const schema_1 = require("@sprucelabs/schema");
const spruce_skill_utils_1 = require("@sprucelabs/spruce-skill-utils");
const lodash_1 = require("lodash");
const InFlightEntertainment_1 = __importDefault(require("../../../InFlightEntertainment"));
const AbstractAction_1 = __importDefault(require("../../AbstractAction"));
const optionsSchema = (0, schema_1.buildSchema)({
id: 'updateDependenciesAction',
description: 'Clear lock files and node_modules and then reinstalls all modules.',
fields: {},
});
class UpdateDependenciesAction extends AbstractAction_1.default {
code = 'updateDependencies';
optionsSchema = optionsSchema;
commandAliases = ['update.dependencies', 'upgrade.dependencies'];
invocationMessage = 'Updating dependencies... 💪';
async execute(_options) {
const files = ['package-lock.json', 'yarn.lock', 'node_modules'];
for (const file of files) {
spruce_skill_utils_1.diskUtil.deleteFile(spruce_skill_utils_1.diskUtil.resolvePath(this.cwd, file));
}
try {
InFlightEntertainment_1.default.start(['Here we go!', 'Good luck!']);
const { totalDependencies, totalDevDependencies } = await this.installDependencies();
return {
headline: 'Update Complete!',
summaryLines: [
`${totalDependencies} dependencie${totalDependencies === 1 ? '' : 's'} updated! 💪`,
`${totalDevDependencies} dev dependencie${totalDevDependencies === 1 ? '' : 's'} updated! 💪`,
],
};
}
finally {
InFlightEntertainment_1.default.stop();
}
}
async installDependencies() {
const features = this.features.isInSpruceModule()
? await this.features.getInstalledFeatures()
: [];
const pkg = this.Service('pkg');
pkg.unset(['dependencies', '@sprucelabs/resolve-path-aliases']);
const pkgContents = pkg.readPackage();
let dependencies = Object.keys(pkgContents.dependencies ?? {}).map((d) => ({
stripped: d,
name: d,
})) ?? [];
let devDependencies = Object.keys(pkgContents.devDependencies ?? {}).map((d) => ({
stripped: d,
name: d,
})) ?? [];
for (const feature of features) {
for (const dep of feature.packageDependencies) {
const stripped = pkg.stripLatest(dep.name);
const name = pkg.buildPackageName(dep);
const isDev = (dep.isDev ||
devDependencies.find((d) => d.stripped === stripped)) &&
!dependencies.find((d) => d.stripped === stripped);
if (isDev) {
devDependencies.unshift({
stripped,
name,
});
}
else {
dependencies.unshift({
stripped,
name,
});
}
}
}
dependencies = (0, lodash_1.uniqBy)(dependencies, 'stripped').filter((d) => !this.isBlockedFromUpgrade(d.stripped, pkg));
devDependencies = (0, lodash_1.uniqBy)(devDependencies, 'stripped').filter((d) => !this.isBlockedFromUpgrade(d.stripped, pkg));
pkg.deleteLockFile();
const namespace = pkg.getSkillNamespace();
if (dependencies.length > 0) {
InFlightEntertainment_1.default.writeStatus(`Installing ${dependencies.length} dependenc${dependencies.length === 1 ? 'y' : 'ies'} for ${namespace}.`);
await pkg.install(dependencies.map((d) => d.name), {
shouldForceInstall: true,
shouldCleanupLockFiles: false,
});
}
if (devDependencies.length > 0) {
InFlightEntertainment_1.default.writeStatus(`Installing ${devDependencies.length} dev dependenc${dependencies.length === 1 ? 'y' : 'ies'} for ${namespace}.`);
await pkg.install(devDependencies.map((d) => d.name), {
shouldForceInstall: true,
isDev: true,
shouldCleanupLockFiles: false,
});
}
pkg.deleteLockFile();
return {
totalDependencies: dependencies.length,
totalDevDependencies: devDependencies.length,
};
}
blockUpgrade(name, pkg) {
const content = pkg.get('skill.upgradeIgnoreList') ?? [];
content.push(name);
pkg.set({ path: 'skill.upgradeIgnoreList', value: content });
}
isBlockedFromUpgrade(name, pkg) {
const content = pkg.get('skill.upgradeIgnoreList') ?? [];
const isBlocked = content.indexOf(name) > -1;
return isBlocked;
}
}
exports.default = UpdateDependenciesAction;
//# sourceMappingURL=UpdateDependenciesAction.js.map