UNPKG

@cisstech/nge

Version:

NG Essentials is a collection of libraries for Angular developers.

71 lines 10.2 kB
import { createNgModule, Injectable, } from '@angular/core'; import * as i0 from "@angular/core"; export class CompilerService { constructor() { this.modules = []; } async render(options) { const { component } = await this.resolveComponent(options.type, options.container.injector); return await this.renderComponent(options.inputs, options.container.createComponent(component, { index: 0, injector: options.container.injector, })); } async resolveComponent(type, injector) { // https://blog.ninja-squad.com/2019/05/07/what-is-angular-ivy/ // https://juristr.com/blog/2019/10/lazyload-module-ivy-viewengine if (!('ɵmod' in type) && !('ɵcmp' in type)) { throw new Error(`[render]: type "${type.name}" does not refers to a Component or a NgModule`); } let component = type; let componentInjector = injector; if ('ɵmod' in type) { const module = await this.resolveModuleInfo(type, injector); componentInjector = module.injector; component = module.instance.component; } return { component, injector: componentInjector, }; } async renderComponent(inputs, componentRef) { const changes = {}; const { instance, changeDetectorRef } = componentRef; if (inputs) { Object.keys(inputs).forEach((k) => { instance[k] = inputs[k]; changes[k] = { currentValue: inputs[k], previousValue: undefined, firstChange: true, isFirstChange: () => true, }; }); } if (instance.ngOnChanges) { await instance.ngOnChanges(changes); } changeDetectorRef.markForCheck(); return componentRef; } async resolveModuleInfo(type, injector) { const moduleInfo = this.modules.find((e) => e.type === type); if (moduleInfo) { return moduleInfo.module; } const module = createNgModule(type, injector); if (typeof module.instance.component !== 'function') { throw new Error(`[compiler]: The module "${type.name}" does not define a public "component" field.`); } this.modules.push({ type: type, module: module }); return module; } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.1", ngImport: i0, type: CompilerService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); } static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.1", ngImport: i0, type: CompilerService, providedIn: 'root' }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.1", ngImport: i0, type: CompilerService, decorators: [{ type: Injectable, args: [{ providedIn: 'root' }] }] }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcGlsZXIuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nZS9zZXJ2aWNlcy9zcmMvY29tcGlsZXIuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBRUwsY0FBYyxFQUNkLFVBQVUsR0FNWCxNQUFNLGVBQWUsQ0FBQTs7QUFHdEIsTUFBTSxPQUFPLGVBQWU7SUFENUI7UUFFbUIsWUFBTyxHQUFpQixFQUFFLENBQUE7S0F3RTVDO0lBdEVDLEtBQUssQ0FBQyxNQUFNLENBQUMsT0FBd0I7UUFDbkMsTUFBTSxFQUFFLFNBQVMsRUFBRSxHQUFHLE1BQU0sSUFBSSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQTtRQUMzRixPQUFPLE1BQU0sSUFBSSxDQUFDLGVBQWUsQ0FDL0IsT0FBTyxDQUFDLE1BQU0sRUFDZCxPQUFPLENBQUMsU0FBUyxDQUFDLGVBQWUsQ0FBQyxTQUFTLEVBQUU7WUFDM0MsS0FBSyxFQUFFLENBQUM7WUFDUixRQUFRLEVBQUUsT0FBTyxDQUFDLFNBQVMsQ0FBQyxRQUFRO1NBQ3JDLENBQUMsQ0FDSCxDQUFBO0lBQ0gsQ0FBQztJQUVELEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFlLEVBQUUsUUFBa0I7UUFDeEQsK0RBQStEO1FBQy9ELGtFQUFrRTtRQUVsRSxJQUFJLENBQUMsQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQzNDLE1BQU0sSUFBSSxLQUFLLENBQUMsbUJBQW1CLElBQUksQ0FBQyxJQUFJLGdEQUFnRCxDQUFDLENBQUE7UUFDL0YsQ0FBQztRQUVELElBQUksU0FBUyxHQUFjLElBQUksQ0FBQTtRQUMvQixJQUFJLGlCQUFpQixHQUFHLFFBQVEsQ0FBQTtRQUNoQyxJQUFJLE1BQU0sSUFBSSxJQUFJLEVBQUUsQ0FBQztZQUNuQixNQUFNLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLEVBQUUsUUFBUSxDQUFDLENBQUE7WUFDM0QsaUJBQWlCLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQTtZQUNuQyxTQUFTLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUE7UUFDdkMsQ0FBQztRQUVELE9BQU87WUFDTCxTQUFTO1lBQ1QsUUFBUSxFQUFFLGlCQUFpQjtTQUM1QixDQUFBO0lBQ0gsQ0FBQztJQUVPLEtBQUssQ0FBQyxlQUFlLENBQUMsTUFBVyxFQUFFLFlBQStCO1FBQ3hFLE1BQU0sT0FBTyxHQUFrQixFQUFFLENBQUE7UUFDakMsTUFBTSxFQUFFLFFBQVEsRUFBRSxpQkFBaUIsRUFBRSxHQUFHLFlBQVksQ0FBQTtRQUVwRCxJQUFJLE1BQU0sRUFBRSxDQUFDO1lBQ1gsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRTtnQkFDaEMsUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQTtnQkFDdkIsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHO29CQUNYLFlBQVksRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDO29CQUN2QixhQUFhLEVBQUUsU0FBUztvQkFDeEIsV0FBVyxFQUFFLElBQUk7b0JBQ2pCLGFBQWEsRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJO2lCQUMxQixDQUFBO1lBQ0gsQ0FBQyxDQUFDLENBQUE7UUFDSixDQUFDO1FBRUQsSUFBSSxRQUFRLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDekIsTUFBTSxRQUFRLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFBO1FBQ3JDLENBQUM7UUFFRCxpQkFBaUIsQ0FBQyxZQUFZLEVBQUUsQ0FBQTtRQUNoQyxPQUFPLFlBQVksQ0FBQTtJQUNyQixDQUFDO0lBRU8sS0FBSyxDQUFDLGlCQUFpQixDQUFDLElBQWUsRUFBRSxRQUFrQjtRQUNqRSxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxJQUFJLENBQUMsQ0FBQTtRQUM1RCxJQUFJLFVBQVUsRUFBRSxDQUFDO1lBQ2YsT0FBTyxVQUFVLENBQUMsTUFBTSxDQUFBO1FBQzFCLENBQUM7UUFFRCxNQUFNLE1BQU0sR0FBZ0MsY0FBYyxDQUFDLElBQUksRUFBRSxRQUFRLENBQUMsQ0FBQTtRQUMxRSxJQUFJLE9BQU8sTUFBTSxDQUFDLFFBQVEsQ0FBQyxTQUFTLEtBQUssVUFBVSxFQUFFLENBQUM7WUFDcEQsTUFBTSxJQUFJLEtBQUssQ0FBQywyQkFBMkIsSUFBSSxDQUFDLElBQUksK0NBQStDLENBQUMsQ0FBQTtRQUN0RyxDQUFDO1FBQ0QsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFBO1FBQ2pELE9BQU8sTUFBTSxDQUFBO0lBQ2YsQ0FBQzs4R0F4RVUsZUFBZTtrSEFBZixlQUFlLGNBREYsTUFBTTs7MkZBQ25CLGVBQWU7a0JBRDNCLFVBQVU7bUJBQUMsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ29tcG9uZW50UmVmLFxuICBjcmVhdGVOZ01vZHVsZSxcbiAgSW5qZWN0YWJsZSxcbiAgSW5qZWN0b3IsXG4gIE5nTW9kdWxlUmVmLFxuICBTaW1wbGVDaGFuZ2VzLFxuICBUeXBlLFxuICBWaWV3Q29udGFpbmVyUmVmLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJ1xuXG5ASW5qZWN0YWJsZSh7IHByb3ZpZGVkSW46ICdyb290JyB9KVxuZXhwb3J0IGNsYXNzIENvbXBpbGVyU2VydmljZSB7XG4gIHByaXZhdGUgcmVhZG9ubHkgbW9kdWxlczogTW9kdWxlSW5mb1tdID0gW11cblxuICBhc3luYyByZW5kZXIob3B0aW9uczogUmVuZGVyZXJPcHRpb25zKTogUHJvbWlzZTxDb21wb25lbnRSZWY8YW55Pj4ge1xuICAgIGNvbnN0IHsgY29tcG9uZW50IH0gPSBhd2FpdCB0aGlzLnJlc29sdmVDb21wb25lbnQob3B0aW9ucy50eXBlLCBvcHRpb25zLmNvbnRhaW5lci5pbmplY3RvcilcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5yZW5kZXJDb21wb25lbnQoXG4gICAgICBvcHRpb25zLmlucHV0cyxcbiAgICAgIG9wdGlvbnMuY29udGFpbmVyLmNyZWF0ZUNvbXBvbmVudChjb21wb25lbnQsIHtcbiAgICAgICAgaW5kZXg6IDAsXG4gICAgICAgIGluamVjdG9yOiBvcHRpb25zLmNvbnRhaW5lci5pbmplY3RvcixcbiAgICAgIH0pXG4gICAgKVxuICB9XG5cbiAgYXN5bmMgcmVzb2x2ZUNvbXBvbmVudCh0eXBlOiBUeXBlPGFueT4sIGluamVjdG9yOiBJbmplY3Rvcikge1xuICAgIC8vIGh0dHBzOi8vYmxvZy5uaW5qYS1zcXVhZC5jb20vMjAxOS8wNS8wNy93aGF0LWlzLWFuZ3VsYXItaXZ5L1xuICAgIC8vIGh0dHBzOi8vanVyaXN0ci5jb20vYmxvZy8yMDE5LzEwL2xhenlsb2FkLW1vZHVsZS1pdnktdmlld2VuZ2luZVxuXG4gICAgaWYgKCEoJ8m1bW9kJyBpbiB0eXBlKSAmJiAhKCfJtWNtcCcgaW4gdHlwZSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgW3JlbmRlcl06IHR5cGUgXCIke3R5cGUubmFtZX1cIiBkb2VzIG5vdCByZWZlcnMgdG8gYSBDb21wb25lbnQgb3IgYSBOZ01vZHVsZWApXG4gICAgfVxuXG4gICAgbGV0IGNvbXBvbmVudDogVHlwZTxhbnk+ID0gdHlwZVxuICAgIGxldCBjb21wb25lbnRJbmplY3RvciA9IGluamVjdG9yXG4gICAgaWYgKCfJtW1vZCcgaW4gdHlwZSkge1xuICAgICAgY29uc3QgbW9kdWxlID0gYXdhaXQgdGhpcy5yZXNvbHZlTW9kdWxlSW5mbyh0eXBlLCBpbmplY3RvcilcbiAgICAgIGNvbXBvbmVudEluamVjdG9yID0gbW9kdWxlLmluamVjdG9yXG4gICAgICBjb21wb25lbnQgPSBtb2R1bGUuaW5zdGFuY2UuY29tcG9uZW50XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGNvbXBvbmVudCxcbiAgICAgIGluamVjdG9yOiBjb21wb25lbnRJbmplY3RvcixcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHJlbmRlckNvbXBvbmVudChpbnB1dHM6IGFueSwgY29tcG9uZW50UmVmOiBDb21wb25lbnRSZWY8YW55Pik6IFByb21pc2U8Q29tcG9uZW50UmVmPGFueT4+IHtcbiAgICBjb25zdCBjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzID0ge31cbiAgICBjb25zdCB7IGluc3RhbmNlLCBjaGFuZ2VEZXRlY3RvclJlZiB9ID0gY29tcG9uZW50UmVmXG5cbiAgICBpZiAoaW5wdXRzKSB7XG4gICAgICBPYmplY3Qua2V5cyhpbnB1dHMpLmZvckVhY2goKGspID0+IHtcbiAgICAgICAgaW5zdGFuY2Vba10gPSBpbnB1dHNba11cbiAgICAgICAgY2hhbmdlc1trXSA9IHtcbiAgICAgICAgICBjdXJyZW50VmFsdWU6IGlucHV0c1trXSxcbiAgICAgICAgICBwcmV2aW91c1ZhbHVlOiB1bmRlZmluZWQsXG4gICAgICAgICAgZmlyc3RDaGFuZ2U6IHRydWUsXG4gICAgICAgICAgaXNGaXJzdENoYW5nZTogKCkgPT4gdHJ1ZSxcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9XG5cbiAgICBpZiAoaW5zdGFuY2UubmdPbkNoYW5nZXMpIHtcbiAgICAgIGF3YWl0IGluc3RhbmNlLm5nT25DaGFuZ2VzKGNoYW5nZXMpXG4gICAgfVxuXG4gICAgY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKClcbiAgICByZXR1cm4gY29tcG9uZW50UmVmXG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHJlc29sdmVNb2R1bGVJbmZvKHR5cGU6IFR5cGU8YW55PiwgaW5qZWN0b3I6IEluamVjdG9yKTogUHJvbWlzZTxOZ01vZHVsZVJlZjxJRHluYW1pY01vZHVsZT4+IHtcbiAgICBjb25zdCBtb2R1bGVJbmZvID0gdGhpcy5tb2R1bGVzLmZpbmQoKGUpID0+IGUudHlwZSA9PT0gdHlwZSlcbiAgICBpZiAobW9kdWxlSW5mbykge1xuICAgICAgcmV0dXJuIG1vZHVsZUluZm8ubW9kdWxlXG4gICAgfVxuXG4gICAgY29uc3QgbW9kdWxlOiBOZ01vZHVsZVJlZjxJRHluYW1pY01vZHVsZT4gPSBjcmVhdGVOZ01vZHVsZSh0eXBlLCBpbmplY3RvcilcbiAgICBpZiAodHlwZW9mIG1vZHVsZS5pbnN0YW5jZS5jb21wb25lbnQgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgW2NvbXBpbGVyXTogVGhlIG1vZHVsZSBcIiR7dHlwZS5uYW1lfVwiIGRvZXMgbm90IGRlZmluZSBhIHB1YmxpYyBcImNvbXBvbmVudFwiIGZpZWxkLmApXG4gICAgfVxuICAgIHRoaXMubW9kdWxlcy5wdXNoKHsgdHlwZTogdHlwZSwgbW9kdWxlOiBtb2R1bGUgfSlcbiAgICByZXR1cm4gbW9kdWxlXG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBSZW5kZXJlck9wdGlvbnMge1xuICB0eXBlOiBUeXBlPGFueT5cbiAgaW5wdXRzPzogYW55XG4gIGNvbnRhaW5lcjogVmlld0NvbnRhaW5lclJlZlxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElEeW5hbWljTW9kdWxlIHtcbiAgLyoqIFJlZmVyZW5jZSB0byB0aGUgbWFpbiBjb21wb25lbnQgb2YgdGhlIG1vZHVsZSAqL1xuICBjb21wb25lbnQ6IFR5cGU8YW55PlxufVxuXG5pbnRlcmZhY2UgTW9kdWxlSW5mbyB7XG4gIHR5cGU6IFR5cGU8YW55PlxuICBtb2R1bGU6IE5nTW9kdWxlUmVmPElEeW5hbWljTW9kdWxlPlxufVxuIl19