@qodalis/angular-cli
Version:
A lightweight and flexible command-line interface (CLI) tool designed to streamline workflows and automate tasks for developers.
103 lines • 13.8 kB
JavaScript
import { Injectable } from '@angular/core';
import * as i0 from "@angular/core";
import * as i1 from "../storage/cli-key-value-store";
export class CliPackageManagerService {
constructor(store) {
this.store = store;
this.storageKey = 'cli-packages';
this.QODALIS_COMMAND_PREFIX = '@qodalis/cli-';
}
/**
* Retrieves the list of packages
* @returns {Package[]} Array of packages
*/
async getPackages() {
const oldPackages = localStorage.getItem('cliPackages');
if (oldPackages) {
localStorage.removeItem('cliPackages');
await this.store.set(this.storageKey, JSON.parse(oldPackages));
}
const packages = await this.store.get(this.storageKey);
return packages ? packages : [];
}
/**
* Retrieves a package by name from the list.
* @param packageName {string} The name of the package to retrieve
* @returns {Package | undefined} The package if found, undefined otherwise
*/
async getPackage(packageName) {
return (await this.getPackages()).find((p) => p.name === packageName ||
p.name === this.QODALIS_COMMAND_PREFIX + packageName);
}
/**
* Checks if a package with the given name exists in the list.
* @param packageName {string} The name of the package to check
* @returns {boolean} True if the package exists, false otherwise
*/
async hasPackage(packageName) {
return (await this.getPackage(packageName)) !== undefined;
}
/**
* Adds a new package to the list and saves it in storage.
* @param pkg {Package} The package to add
*/
async addPackage(pkg) {
const packages = await this.getPackages();
if (packages.find((p) => p.name === pkg.name)) {
throw new Error(`Package with name "${pkg.name}" already exists.`);
}
packages.push(pkg);
await this.savePackages(packages);
}
/**
* Removes a package by name and saves the updated list in storage
* @param packageName {string} The name of the package to remove
*/
async removePackage(packageName) {
const packages = await this.getPackages();
const packageToRemove = packages.find((p) => p.name === packageName ||
p.name === this.QODALIS_COMMAND_PREFIX + packageName);
if (!packageToRemove) {
throw new Error(`Package with name "${packageName}" not found.`);
}
const updatedPackages = packages.filter((p) => p.name !== packageToRemove.name);
if (packages.length === updatedPackages.length) {
throw new Error(`Package with name "${packageName}" not found.`);
}
this.savePackages(updatedPackages);
return packageToRemove;
}
/**
* Updates an existing package in the list and saves the updated list in storage.
* @param pkg {Package} The updated package
* @throws {Error} If the package to update is not found
* @returns {void}
* @throws {Error} If the package to update is not found
* @returns {void}
*/
async updatePackage(pkg) {
const packages = await this.getPackages();
const index = packages.findIndex((p) => p.name === pkg.name);
if (index === -1) {
throw new Error(`Package with name "${pkg.name}" not found.`);
}
packages[index] = pkg;
await this.savePackages(packages);
}
/**
* Saves the list of packages to storage.
* @param packages {Package[]} The list of packages to save
*/
async savePackages(packages) {
await this.store.set(this.storageKey, packages);
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: CliPackageManagerService, deps: [{ token: i1.CliKeyValueStore }], target: i0.ɵɵFactoryTarget.Injectable }); }
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: CliPackageManagerService, providedIn: 'root' }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: CliPackageManagerService, decorators: [{
type: Injectable,
args: [{
providedIn: 'root',
}]
}], ctorParameters: function () { return [{ type: i1.CliKeyValueStore }]; } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpLXBhY2thZ2UtbWFuYWdlci5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY2xpL3NyYy9saWIvY2xpL3NlcnZpY2VzL2NsaS1wYWNrYWdlLW1hbmFnZXIuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDOzs7QUFPM0MsTUFBTSxPQUFPLHdCQUF3QjtJQUtqQyxZQUE2QixLQUF1QjtRQUF2QixVQUFLLEdBQUwsS0FBSyxDQUFrQjtRQUpuQyxlQUFVLEdBQUcsY0FBYyxDQUFDO1FBRXRDLDJCQUFzQixHQUFHLGVBQWUsQ0FBQztJQUVPLENBQUM7SUFFeEQ7OztPQUdHO0lBQ0gsS0FBSyxDQUFDLFdBQVc7UUFDYixNQUFNLFdBQVcsR0FBRyxZQUFZLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQ3hELElBQUksV0FBVyxFQUFFO1lBQ2IsWUFBWSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsQ0FBQztZQUN2QyxNQUFNLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDO1NBQ2xFO1FBRUQsTUFBTSxRQUFRLEdBQUcsTUFBTSxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBWSxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7UUFFbEUsT0FBTyxRQUFRLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0lBQ3BDLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsS0FBSyxDQUFDLFVBQVUsQ0FBQyxXQUFtQjtRQUNoQyxPQUFPLENBQUMsTUFBTSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQ2xDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FD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VCx3QkFBd0I7a0JBSHBDLFVBQVU7bUJBQUM7b0JBQ1IsVUFBVSxFQUFFLE1BQU07aUJBQ3JCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgUGFja2FnZSB9IGZyb20gJ0Bxb2RhbGlzL2NsaS1jb3JlJztcbmltcG9ydCB7IENsaUtleVZhbHVlU3RvcmUgfSBmcm9tICcuLi9zdG9yYWdlL2NsaS1rZXktdmFsdWUtc3RvcmUnO1xuXG5ASW5qZWN0YWJsZSh7XG4gICAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxufSlcbmV4cG9ydCBjbGFzcyBDbGlQYWNrYWdlTWFuYWdlclNlcnZpY2Uge1xuICAgIHByaXZhdGUgcmVhZG9ubHkgc3RvcmFnZUtleSA9ICdjbGktcGFja2FnZXMnO1xuXG4gICAgcHVibGljIFFPREFMSVNfQ09NTUFORF9QUkVGSVggPSAnQHFvZGFsaXMvY2xpLSc7XG5cbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IHN0b3JlOiBDbGlLZXlWYWx1ZVN0b3JlKSB7fVxuXG4gICAgLyoqXG4gICAgICogUmV0cmlldmVzIHRoZSBsaXN0IG9mIHBhY2thZ2VzXG4gICAgICogQHJldHVybnMge1BhY2thZ2VbXX0gQXJyYXkgb2YgcGFja2FnZXNcbiAgICAgKi9cbiAgICBhc3luYyBnZXRQYWNrYWdlcygpOiBQcm9taXNlPFBhY2thZ2VbXT4ge1xuICAgICAgICBjb25zdCBvbGRQYWNrYWdlcyA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdjbGlQYWNrYWdlcycpO1xuICAgICAgICBpZiAob2xkUGFja2FnZXMpIHtcbiAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKCdjbGlQYWNrYWdlcycpO1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5zdG9yZS5zZXQodGhpcy5zdG9yYWdlS2V5LCBKU09OLnBhcnNlKG9sZFBhY2thZ2VzKSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBwYWNrYWdlcyA9IGF3YWl0IHRoaXMuc3RvcmUuZ2V0PFBhY2thZ2VbXT4odGhpcy5zdG9yYWdlS2V5KTtcblxuICAgICAgICByZXR1cm4gcGFja2FnZXMgPyBwYWNrYWdlcyA6IFtdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHJpZXZlcyBhIHBhY2thZ2UgYnkgbmFtZSBmcm9tIHRoZSBsaXN0LlxuICAgICAqIEBwYXJhbSBwYWNrYWdlTmFtZSB7c3RyaW5nfSBUaGUgbmFtZSBvZiB0aGUgcGFja2FnZSB0byByZXRyaWV2ZVxuICAgICAqIEByZXR1cm5zIHtQYWNrYWdlIHwgdW5kZWZpbmVkfSBUaGUgcGFja2FnZSBpZiBmb3VuZCwgdW5kZWZpbmVkIG90aGVyd2lzZVxuICAgICAqL1xuICAgIGFzeW5jIGdldFBhY2thZ2UocGFja2FnZU5hbWU6IHN0cmluZyk6IFByb21pc2U8UGFja2FnZSB8IHVuZGVmaW5lZD4ge1xuICAgICAgICByZXR1cm4gKGF3YWl0IHRoaXMuZ2V0UGFja2FnZXMoKSkuZmluZChcbiAgICAgICAgICAgIChwKSA9PlxuICAgICAgICAgICAgICAgIHAubmFtZSA9PT0gcGFja2FnZU5hbWUgfHxcbiAgICAgICAgICAgICAgICBwLm5hbWUgPT09IHRoaXMuUU9EQUxJU19DT01NQU5EX1BSRUZJWCArIHBhY2thZ2VOYW1lLFxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBhIHBhY2thZ2Ugd2l0aCB0aGUgZ2l2ZW4gbmFtZSBleGlzdHMgaW4gdGhlIGxpc3QuXG4gICAgICogQHBhcmFtIHBhY2thZ2VOYW1lIHtzdHJpbmd9IFRoZSBuYW1lIG9mIHRoZSBwYWNrYWdlIHRvIGNoZWNrXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdGhlIHBhY2thZ2UgZXhpc3RzLCBmYWxzZSBvdGhlcndpc2VcbiAgICAgKi9cbiAgICBhc3luYyBoYXNQYWNrYWdlKHBhY2thZ2VOYW1lOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICAgICAgcmV0dXJuIChhd2FpdCB0aGlzLmdldFBhY2thZ2UocGFja2FnZU5hbWUpKSAhPT0gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFkZHMgYSBuZXcgcGFja2FnZSB0byB0aGUgbGlzdCBhbmQgc2F2ZXMgaXQgaW4gc3RvcmFnZS5cbiAgICAgKiBAcGFyYW0gcGtnIHtQYWNrYWdlfSBUaGUgcGFja2FnZSB0byBhZGRcbiAgICAgKi9cbiAgICBhc3luYyBhZGRQYWNrYWdlKHBrZzogUGFja2FnZSk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBjb25zdCBwYWNrYWdlcyA9IGF3YWl0IHRoaXMuZ2V0UGFja2FnZXMoKTtcbiAgICAgICAgaWYgKHBhY2thZ2VzLmZpbmQoKHApID0+IHAubmFtZSA9PT0gcGtnLm5hbWUpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFBhY2thZ2Ugd2l0aCBuYW1lIFwiJHtwa2cubmFtZX1cIiBhbHJlYWR5IGV4aXN0cy5gKTtcbiAgICAgICAgfVxuICAgICAgICBwYWNrYWdlcy5wdXNoKHBrZyk7XG4gICAgICAgIGF3YWl0IHRoaXMuc2F2ZVBhY2thZ2VzKHBhY2thZ2VzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGEgcGFja2FnZSBieSBuYW1lIGFuZCBzYXZlcyB0aGUgdXBkYXRlZCBsaXN0IGluIHN0b3JhZ2VcbiAgICAgKiBAcGFyYW0gcGFja2FnZU5hbWUge3N0cmluZ30gVGhlIG5hbWUgb2YgdGhlIHBhY2thZ2UgdG8gcmVtb3ZlXG4gICAgICovXG4gICAgYXN5bmMgcmVtb3ZlUGFja2FnZShwYWNrYWdlTmFtZTogc3RyaW5nKTogUHJvbWlzZTxQYWNrYWdlPiB7XG4gICAgICAgIGNvbnN0IHBhY2thZ2VzID0gYXdhaXQgdGhpcy5nZXRQYWNrYWdlcygpO1xuICAgICAgICBjb25zdCBwYWNrYWdlVG9SZW1vdmUgPSBwYWNrYWdlcy5maW5kKFxuICAgICAgICAgICAgKHApID0+XG4gICAgICAgICAgICAgICAgcC5uYW1lID09PSBwYWNrYWdlTmFtZSB8fFxuICAgICAgICAgICAgICAgIHAubmFtZSA9PT0gdGhpcy5RT0RBTElTX0NPTU1BTkRfUFJFRklYICsgcGFja2FnZU5hbWUsXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKCFwYWNrYWdlVG9SZW1vdmUpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgUGFja2FnZSB3aXRoIG5hbWUgXCIke3BhY2thZ2VOYW1lfVwiIG5vdCBmb3VuZC5gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHVwZGF0ZWRQYWNrYWdlcyA9IHBhY2thZ2VzLmZpbHRlcihcbiAgICAgICAgICAgIChwKSA9PiBwLm5hbWUgIT09IHBhY2thZ2VUb1JlbW92ZS5uYW1lLFxuICAgICAgICApO1xuXG4gICAgICAgIGlmIChwYWNrYWdlcy5sZW5ndGggPT09IHVwZGF0ZWRQYWNrYWdlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgUGFja2FnZSB3aXRoIG5hbWUgXCIke3BhY2thZ2VOYW1lfVwiIG5vdCBmb3VuZC5gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuc2F2ZVBhY2thZ2VzKHVwZGF0ZWRQYWNrYWdlcyk7XG5cbiAgICAgICAgcmV0dXJuIHBhY2thZ2VUb1JlbW92ZSE7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXBkYXRlcyBhbiBleGlzdGluZyBwYWNrYWdlIGluIHRoZSBsaXN0IGFuZCBzYXZlcyB0aGUgdXBkYXRlZCBsaXN0IGluIHN0b3JhZ2UuXG4gICAgICogQHBhcmFtIHBrZyB7UGFja2FnZX0gVGhlIHVwZGF0ZWQgcGFja2FnZVxuICAgICAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGUgcGFja2FnZSB0byB1cGRhdGUgaXMgbm90IGZvdW5kXG4gICAgICogQHJldHVybnMge3ZvaWR9XG4gICAgICogQHRocm93cyB7RXJyb3J9IElmIHRoZSBwYWNrYWdlIHRvIHVwZGF0ZSBpcyBub3QgZm91bmRcbiAgICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICAgKi9cbiAgICBhc3luYyB1cGRhdGVQYWNrYWdlKHBrZzogUGFja2FnZSk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBjb25zdCBwYWNrYWdlcyA9IGF3YWl0IHRoaXMuZ2V0UGFja2FnZXMoKTtcbiAgICAgICAgY29uc3QgaW5kZXggPSBwYWNrYWdlcy5maW5kSW5kZXgoKHApID0+IHAubmFtZSA9PT0gcGtnLm5hbWUpO1xuICAgICAgICBpZiAoaW5kZXggPT09IC0xKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFBhY2thZ2Ugd2l0aCBuYW1lIFwiJHtwa2cubmFtZX1cIiBub3QgZm91bmQuYCk7XG4gICAgICAgIH1cbiAgICAgICAgcGFja2FnZXNbaW5kZXhdID0gcGtnO1xuICAgICAgICBhd2FpdCB0aGlzLnNhdmVQYWNrYWdlcyhwYWNrYWdlcyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2F2ZXMgdGhlIGxpc3Qgb2YgcGFja2FnZXMgdG8gc3RvcmFnZS5cbiAgICAgKiBAcGFyYW0gcGFja2FnZXMge1BhY2thZ2VbXX0gVGhlIGxpc3Qgb2YgcGFja2FnZXMgdG8gc2F2ZVxuICAgICAqL1xuICAgIHByaXZhdGUgYXN5bmMgc2F2ZVBhY2thZ2VzKHBhY2thZ2VzOiBQYWNrYWdlW10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5zdG9yZS5zZXQodGhpcy5zdG9yYWdlS2V5LCBwYWNrYWdlcyk7XG4gICAgfVxufVxuIl19