UNPKG

@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
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