@qodalis/angular-cli
Version:
A lightweight and flexible command-line interface (CLI) tool designed to streamline workflows and automate tasks for developers.
102 lines • 14.4 kB
JavaScript
import { Inject, Injectable } from '@angular/core';
import { CliIcon, delay, initializeBrowserEnvironment, } from '@qodalis/cli-core';
import { CliCommandProcessor_TOKEN, CliProcessorsRegistry_TOKEN, } from '../../tokens';
import { CliCommandExecutionContext } from '../../context';
import { CliKeyValueStore } from '../../storage/cli-key-value-store';
import * as i0 from "@angular/core";
export class CliBoot {
constructor(implementations, registry) {
this.implementations = implementations;
this.registry = registry;
this.initialized = false;
this.initializing = false;
}
async boot(context) {
context.spinner?.show(CliIcon.Rocket + ' Booting...');
if (this.initialized || this.initializing) {
await this.bootShared(context);
context.spinner?.hide();
return;
}
this.initializing = true;
await this.registerServices(context);
initializeBrowserEnvironment({
context,
handlers: [
async (module) => {
await this.registerUmdModule(module, context);
},
],
});
let processors = this.implementations;
//TODO: refactor in a better way
if (!context.options?.usersModule?.enabled) {
processors = processors.filter((p) => p.metadata?.module !== 'users');
}
processors.forEach((impl) => this.registry.registerProcessor(impl));
await this.bootShared(context);
context.spinner?.hide();
this.initialized = true;
}
async bootShared(context) {
await this.initializeProcessorsInternal(context, this.registry.processors);
await delay(300);
}
async initializeProcessorsInternal(context, processors, parent) {
try {
for (const p of processors) {
p.parent = parent;
if (p.initialize) {
const processorContext = new CliCommandExecutionContext(context, p);
await processorContext.state.initialize();
await p.initialize(processorContext);
}
if (p.processors && p.processors.length > 0) {
await this.initializeProcessorsInternal(context, p.processors, p);
}
}
}
catch (e) {
context.writer.writeError(`Error initializing processors: ${e}`);
}
}
async registerServices(context) {
context.services.set([
{
provide: 'cli-key-value-store',
useValue: context.services.get(CliKeyValueStore),
},
]);
}
async registerUmdModule(module, context) {
const { logger } = context;
if (!module) {
return;
}
if (module.processors) {
logger.info('Registering processors from module ' + module.name);
for (const processor of module.processors) {
this.registry.registerProcessor(processor);
}
await this.initializeProcessorsInternal(context, module.processors);
}
else {
logger.warn(`Module ${module.name} has no processors`);
}
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: CliBoot, deps: [{ token: CliCommandProcessor_TOKEN }, { token: CliProcessorsRegistry_TOKEN }], target: i0.ɵɵFactoryTarget.Injectable }); }
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: CliBoot, providedIn: 'root' }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: CliBoot, decorators: [{
type: Injectable,
args: [{
providedIn: 'root',
}]
}], ctorParameters: function () { return [{ type: undefined, decorators: [{
type: Inject,
args: [CliCommandProcessor_TOKEN]
}] }, { type: undefined, decorators: [{
type: Inject,
args: [CliProcessorsRegistry_TOKEN]
}] }]; } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpLWJvb3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jbGkvc3JjL2xpYi9jbGkvc2VydmljZXMvc3lzdGVtL2NsaS1ib290LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ25ELE9BQU8sRUFDSCxPQUFPLEVBQ1AsS0FBSyxFQUtMLDRCQUE0QixHQUMvQixNQUFNLG1CQUFtQixDQUFDO0FBQzNCLE9BQU8sRUFDSCx5QkFBeUIsRUFDekIsMkJBQTJCLEdBQzlCLE1BQU0sY0FBYyxDQUFDO0FBQ3RCLE9BQU8sRUFBRSwwQkFBMEIsRUFBdUIsTUFBTSxlQUFlLENBQUM7QUFDaEYsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sbUNBQW1DLENBQUM7O0FBS3JFLE1BQU0sT0FBTyxPQUFPO0lBSWhCLFlBRXFCLGVBQXVDLEVBR3ZDLFFBQXNDO1FBSHRDLG9CQUFlLEdBQWYsZUFBZSxDQUF3QjtRQUd2QyxhQUFRLEdBQVIsUUFBUSxDQUE4QjtRQVJuRCxnQkFBVyxHQUFHLEtBQUssQ0FBQztRQUNwQixpQkFBWSxHQUFHLEtBQUssQ0FBQztJQVExQixDQUFDO0lBRUcsS0FBSyxDQUFDLElBQUksQ0FBQyxPQUE0QjtRQUMxQyxPQUFPLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxHQUFHLGNBQWMsQ0FBQyxDQUFDO1FBRXZELElBQUksSUFBSSxDQUFDLFdBQVcsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFO1lBQ3ZDLE1BQU0sSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUUvQixPQUFPLENBQUMsT0FBTyxFQUFFLElBQUksRUFBRSxDQUFDO1lBRXhCLE9BQU87U0FDVjtRQUVELElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDO1FBRXpCLE1BQU0sSUFB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QUFxQyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNqRSxLQUFLLE1BQU0sU0FBUyxJQUFJLE1BQU0sQ0FBQyxVQUFVLEVBQUU7Z0JBQ3ZDLElBQUksQ0FBQyxRQUFRLENBQUMsaUJBQWlCLENBQUMsU0FBUyxDQUFDLENBQUM7YUFDOUM7WUFFRCxNQUFNLElBQUksQ0FBQyw0QkFBNEIsQ0FBQyxPQUFPLEVBQUUsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1NBQ3ZFO2FBQU07WUFDSCxNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsTUFBTSxDQUFDLElBQUksb0JBQW9CLENBQUMsQ0FBQztTQUMxRDtJQUNMLENBQUM7K0dBOUhRLE9BQU8sa0JBS0oseUJBQXlCLGFBR3pCLDJCQUEyQjttSEFSOUIsT0FBTyxjQUZKLE1BQU07OzRGQUVULE9BQU87a0JBSG5CLFVBQVU7bUJBQUM7b0JBQ1IsVUFBVSxFQUFFLE1BQU07aUJBQ3JCOzswQkFNUSxNQUFNOzJCQUFDLHlCQUF5Qjs7MEJBR2hDLE1BQU07MkJBQUMsMkJBQTJCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0LCBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICAgIENsaUljb24sXG4gICAgZGVsYXksXG4gICAgSUNsaUNvbW1hbmRDaGlsZFByb2Nlc3NvcixcbiAgICBJQ2xpQ29tbWFuZFByb2Nlc3NvcixcbiAgICBJQ2xpQ29tbWFuZFByb2Nlc3NvclJlZ2lzdHJ5LFxuICAgIElDbGlVbWRNb2R1bGUsXG4gICAgaW5pdGlhbGl6ZUJyb3dzZXJFbnZpcm9ubWVudCxcbn0gZnJvbSAnQHFvZGFsaXMvY2xpLWNvcmUnO1xuaW1wb3J0IHtcbiAgICBDbGlDb21tYW5kUHJvY2Vzc29yX1RPS0VOLFxuICAgIENsaVByb2Nlc3NvcnNSZWdpc3RyeV9UT0tFTixcbn0gZnJvbSAnLi4vLi4vdG9rZW5zJztcbmltcG9ydCB7IENsaUNvbW1hbmRFeGVjdXRpb25Db250ZXh0LCBDbGlFeGVjdXRpb25Db250ZXh0IH0gZnJvbSAnLi4vLi4vY29udGV4dCc7XG5pbXBvcnQgeyBDbGlLZXlWYWx1ZVN0b3JlIH0gZnJvbSAnLi4vLi4vc3RvcmFnZS9jbGkta2V5LXZhbHVlLXN0b3JlJztcblxuQEluamVjdGFibGUoe1xuICAgIHByb3ZpZGVkSW46ICdyb290Jyxcbn0pXG5leHBvcnQgY2xhc3MgQ2xpQm9vdCB7XG4gICAgcHJpdmF0ZSBpbml0aWFsaXplZCA9IGZhbHNlO1xuICAgIHByaXZhdGUgaW5pdGlhbGl6aW5nID0gZmFsc2U7XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgQEluamVjdChDbGlDb21tYW5kUHJvY2Vzc29yX1RPS0VOKVxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGltcGxlbWVudGF0aW9uczogSUNsaUNvbW1hbmRQcm9jZXNzb3JbXSxcblxuICAgICAgICBASW5qZWN0KENsaVByb2Nlc3NvcnNSZWdpc3RyeV9UT0tFTilcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSByZWdpc3RyeTogSUNsaUNvbW1hbmRQcm9jZXNzb3JSZWdpc3RyeSxcbiAgICApIHt9XG5cbiAgICBwdWJsaWMgYXN5bmMgYm9vdChjb250ZXh0OiBDbGlFeGVjdXRpb25Db250ZXh0KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnRleHQuc3Bpbm5lcj8uc2hvdyhDbGlJY29uLlJvY2tldCArICcgIEJvb3RpbmcuLi4nKTtcblxuICAgICAgICBpZiAodGhpcy5pbml0aWFsaXplZCB8fCB0aGlzLmluaXRpYWxpemluZykge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5ib290U2hhcmVkKGNvbnRleHQpO1xuXG4gICAgICAgICAgICBjb250ZXh0LnNwaW5uZXI/LmhpZGUoKTtcblxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5pbml0aWFsaXppbmcgPSB0cnVlO1xuXG4gICAgICAgIGF3YWl0IHRoaXMucmVnaXN0ZXJTZXJ2aWNlcyhjb250ZXh0KTtcblxuICAgICAgICBpbml0aWFsaXplQnJvd3NlckVudmlyb25tZW50KHtcbiAgICAgICAgICAgIGNvbnRleHQsXG4gICAgICAgICAgICBoYW5kbGVyczogW1xuICAgICAgICAgICAgICAgIGFzeW5jIChtb2R1bGU6IElDbGlVbWRNb2R1bGUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5yZWdpc3RlclVtZE1vZHVsZShtb2R1bGUsIGNvbnRleHQpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdLFxuICAgICAgICB9KTtcblxuICAgICAgICBsZXQgcHJvY2Vzc29ycyA9IHRoaXMuaW1wbGVtZW50YXRpb25zO1xuXG4gICAgICAgIC8vVE9ETzogcmVmYWN0b3IgaW4gYSBiZXR0ZXIgd2F5XG4gICAgICAgIGlmICghY29udGV4dC5vcHRpb25zPy51c2Vyc01vZHVsZT8uZW5hYmxlZCkge1xuICAgICAgICAgICAgcHJvY2Vzc29ycyA9IHByb2Nlc3NvcnMuZmlsdGVyKFxuICAgICAgICAgICAgICAgIChwKSA9PiBwLm1ldGFkYXRhPy5tb2R1bGUgIT09ICd1c2VycycsXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgcHJvY2Vzc29ycy5mb3JFYWNoKChpbXBsKSA9PiB0aGlzLnJlZ2lzdHJ5LnJlZ2lzdGVyUHJvY2Vzc29yKGltcGwpKTtcblxuICAgICAgICBhd2FpdCB0aGlzLmJvb3RTaGFyZWQoY29udGV4dCk7XG5cbiAgICAgICAgY29udGV4dC5zcGlubmVyPy5oaWRlKCk7XG5cbiAgICAgICAgdGhpcy5pbml0aWFsaXplZCA9IHRydWU7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBib290U2hhcmVkKGNvbnRleHQ6IENsaUV4ZWN1dGlvbkNvbnRleHQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5pbml0aWFsaXplUHJvY2Vzc29yc0ludGVybmFsKFxuICAgICAgICAgICAgY29udGV4dCxcbiAgICAgICAgICAgIHRoaXMucmVnaXN0cnkucHJvY2Vzc29ycyxcbiAgICAgICAgKTtcblxuICAgICAgICBhd2FpdCBkZWxheSgzMDApO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgaW5pdGlhbGl6ZVByb2Nlc3NvcnNJbnRlcm5hbChcbiAgICAgICAgY29udGV4dDogQ2xpRXhlY3V0aW9uQ29udGV4dCxcbiAgICAgICAgcHJvY2Vzc29yczogSUNsaUNvbW1hbmRQcm9jZXNzb3JbXSxcbiAgICAgICAgcGFyZW50PzogSUNsaUNvbW1hbmRQcm9jZXNzb3IsXG4gICAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHAgb2YgcHJvY2Vzc29ycykge1xuICAgICAgICAgICAgICAgIChwIGFzIElDbGlDb21tYW5kQ2hpbGRQcm9jZXNzb3IpLnBhcmVudCA9IHBhcmVudDtcblxuICAgICAgICAgICAgICAgIGlmIChwLmluaXRpYWxpemUpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcHJvY2Vzc29yQ29udGV4dCA9IG5ldyBDbGlDb21tYW5kRXhlY3V0aW9uQ29udGV4dChcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQsXG4gICAgICAgICAgICAgICAgICAgICAgICBwLFxuICAgICAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHByb2Nlc3NvckNvbnRleHQuc3RhdGUuaW5pdGlhbGl6ZSgpO1xuXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHAuaW5pdGlhbGl6ZShwcm9jZXNzb3JDb250ZXh0KTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAocC5wcm9jZXNzb3JzICYmIHAucHJvY2Vzc29ycy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuaW5pdGlhbGl6ZVByb2Nlc3NvcnNJbnRlcm5hbChcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQsXG4gICAgICAgICAgICAgICAgICAgICAgICBwLnByb2Nlc3NvcnMsXG4gICAgICAgICAgICAgICAgICAgICAgICBwLFxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgY29udGV4dC53cml0ZXIud3JpdGVFcnJvcihgRXJyb3IgaW5pdGlhbGl6aW5nIHByb2Nlc3NvcnM6ICR7ZX1gKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgcmVnaXN0ZXJTZXJ2aWNlcyhcbiAgICAgICAgY29udGV4dDogQ2xpRXhlY3V0aW9uQ29udGV4dCxcbiAgICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29udGV4dC5zZXJ2aWNlcy5zZXQoW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHByb3ZpZGU6ICdjbGkta2V5LXZhbHVlLXN0b3JlJyxcbiAgICAgICAgICAgICAgICB1c2VWYWx1ZTogY29udGV4dC5zZXJ2aWNlcy5nZXQoQ2xpS2V5VmFsdWVTdG9yZSksXG4gICAgICAgICAgICB9LFxuICAgICAgICBdKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIHJlZ2lzdGVyVW1kTW9kdWxlKFxuICAgICAgICBtb2R1bGU6IElDbGlVbWRNb2R1bGUsXG4gICAgICAgIGNvbnRleHQ6IENsaUV4ZWN1dGlvbkNvbnRleHQsXG4gICAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IHsgbG9nZ2VyIH0gPSBjb250ZXh0O1xuICAgICAgICBpZiAoIW1vZHVsZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG1vZHVsZS5wcm9jZXNzb3JzKSB7XG4gICAgICAgICAgICBsb2dnZXIuaW5mbygnUmVnaXN0ZXJpbmcgcHJvY2Vzc29ycyBmcm9tIG1vZHVsZSAnICsgbW9kdWxlLm5hbWUpO1xuICAgICAgICAgICAgZm9yIChjb25zdCBwcm9jZXNzb3Igb2YgbW9kdWxlLnByb2Nlc3NvcnMpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJlZ2lzdHJ5LnJlZ2lzdGVyUHJvY2Vzc29yKHByb2Nlc3Nvcik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGF3YWl0IHRoaXMuaW5pdGlhbGl6ZVByb2Nlc3NvcnNJbnRlcm5hbChjb250ZXh0LCBtb2R1bGUucHJvY2Vzc29ycyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsb2dnZXIud2FybihgTW9kdWxlICR7bW9kdWxlLm5hbWV9IGhhcyBubyBwcm9jZXNzb3JzYCk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iXX0=