arvis-linker
Version:
Make Arvis extensions installable from npm
101 lines (100 loc) • 5.55 kB
JavaScript
;
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.unlinkArvisGlobalModule = exports.linkArvisGlobalModule = void 0;
const sudo_block_1 = __importDefault(require("sudo-block"));
const global_dirs_1 = __importDefault(require("global-dirs"));
const path_1 = __importDefault(require("path"));
const read_pkg_up_1 = __importDefault(require("read-pkg-up"));
const env_paths_1 = __importDefault(require("env-paths"));
const fs_extra_1 = __importDefault(require("fs-extra"));
const arvis_extension_validator_1 = require("arvis-extension-validator");
const path_exists_1 = __importDefault(require("path-exists"));
const is_admin_1 = __importDefault(require("is-admin"));
const link_1 = __importDefault(require("./lib/link"));
const readJson5_1 = require("./lib/readJson5");
const path_2 = require("./lib/path");
const findUnvalidSymlink_1 = __importDefault(require("./lib/findUnvalidSymlink"));
const userConfig_1 = require("./lib/userConfig");
const extensionReload_1 = require("./lib/extensionReload");
const envPaths = env_paths_1.default('arvis');
// Prevent running as `sudo`
sudo_block_1.default();
const linkArvisGlobalModule = () => __awaiter(void 0, void 0, void 0, function* () {
if (process.platform === 'win32') {
const hasAdminPermission = yield is_admin_1.default();
if (!hasAdminPermission)
throw new Error('Run command by admin permission!');
}
const pkgResult = yield read_pkg_up_1.default();
if (!pkgResult)
throw new Error('Error: extension\'s package.json not found!');
const packageName = pkgResult.pkg.name;
const src = path_1.default.resolve(global_dirs_1.default.npm.packages, packageName);
if (!fs_extra_1.default.pathExistsSync(src)) {
throw new Error(`Module not exists in global package, '${src}'`);
}
const workflowJsonPath = path_1.default.resolve(src, 'arvis-workflow.json');
const pluginJsonPath = path_1.default.resolve(src, 'arvis-plugin.json');
const isWorkflow = yield path_exists_1.default(workflowJsonPath);
const isPlugin = yield path_exists_1.default(pluginJsonPath);
if (!isWorkflow && !isPlugin) {
throw new Error('This package seems to be not Arvis extension!');
}
const config = yield readJson5_1.readJson5(isWorkflow ? workflowJsonPath : pluginJsonPath);
const type = isWorkflow ? 'workflow' : 'plugin';
if (config.platform && !config.platform.includes(process.platform)) {
throw new Error(`This extension does not supports '${process.platform}'!\nCheck the extension info on '${config.webAddress}'.`);
}
const { creator, name } = config;
const bundleId = `${creator}.${name}`;
const { errorMsg, valid: extensionValid } = arvis_extension_validator_1.validate(config, type, {
strict: false
});
if (!extensionValid) {
throw new Error(`It seems arvis extension json format is invalid.\n\n${errorMsg}`);
}
const dest = path_1.default.resolve(envPaths.data, `${type}s`, bundleId);
try {
yield link_1.default(src, dest);
}
catch (err) {
throw new Error(`Symlink Error:\n\n${err}`);
}
const migratedConfig = userConfig_1.applyUserConfigs((yield userConfig_1.getUserConfigs())[bundleId], config);
yield fs_extra_1.default.writeJSON(path_1.default.resolve(dest, `arvis-${type}.json`), migratedConfig, { encoding: 'utf-8', spaces: 4 });
yield extensionReload_1.forceReload(bundleId, type);
});
exports.linkArvisGlobalModule = linkArvisGlobalModule;
const unlinkArvisGlobalModule = () => __awaiter(void 0, void 0, void 0, function* () {
const workflowDest = path_1.default.resolve(envPaths.data, 'workflows');
const pluginDest = path_1.default.resolve(envPaths.data, 'plugins');
const unvalidWorkflowSymlinks = yield findUnvalidSymlink_1.default(workflowDest, 'workflow');
const unvalidPluginSymlinks = yield findUnvalidSymlink_1.default(pluginDest, 'plugin');
yield Promise.all([...unvalidWorkflowSymlinks, ...unvalidPluginSymlinks].map((invalidPath) => __awaiter(void 0, void 0, void 0, function* () {
if (invalidPath) {
yield fs_extra_1.default.remove(invalidPath);
}
})));
if (unvalidWorkflowSymlinks.length > 0) {
console.log(`Following unvalidWorkflowSymlinks were removed.\n\n${unvalidWorkflowSymlinks.join('\n')}`);
console.log('\n');
}
if (unvalidPluginSymlinks.length > 0) {
console.log(`Following unvalidPluginSymlinks were removed.\n\n${unvalidPluginSymlinks.join('\n')}`);
console.log('\n');
}
fs_extra_1.default.writeFileSync(path_2.arvisRenewExtensionFlagFilePath, '');
});
exports.unlinkArvisGlobalModule = unlinkArvisGlobalModule;