@cisstech/nge
Version:
NG Essentials is a collection of libraries for Angular developers.
71 lines • 10.2 kB
JavaScript
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