UNPKG

ngx-dynamic-hooks

Version:

Automatically insert live Angular components into a dynamic string of content (based on their selector or any pattern of your choice) and render the result in the DOM.

72 lines 11.8 kB
import { SkipSelf, Optional, APP_INITIALIZER, Injectable } from '@angular/core'; // Don't remove InjectionToken here. It will compile with a dynamic import otherwise which breaks Ng<5 support import { DynamicHooksService } from './services/dynamicHooksService'; import { PLATFORM_SERVICE } from './services/platform/platformService'; import { DYNAMICHOOKS_ALLSETTINGS, DYNAMICHOOKS_ANCESTORSETTINGS, DYNAMICHOOKS_MODULESETTINGS } from './interfaces'; import * as i0 from "@angular/core"; export const allSettings = []; /** * Sets up global parsers and options for the ngx-dynamic-hooks library * * @param settings - Parsers/options to be are shared in this injection context * @param platformService - (optional) If desired, you can specify a custom PlatformService to use here */ export const provideDynamicHooks = (settings, platformService) => { const moduleSettings = Array.isArray(settings) ? { parsers: settings } : settings; if (moduleSettings !== undefined) { allSettings.push(moduleSettings); } const providers = [ { provide: APP_INITIALIZER, useFactory: () => () => { }, multi: true, deps: [DynamicHooksInitService] }, // Settings { provide: DYNAMICHOOKS_ALLSETTINGS, useValue: allSettings }, // AncestorSettings is a hierarchical array of provided settings // By having itself as a dependency with SkipSelf, a circular reference is avoided as Angular will look for DYNAMICHOOKS_ANCESTORSETTINGS in the parent injector. // It will keep traveling injectors upwards until it finds another or just use null as the dep. // Also, by returning a new array reference each time, the result will only contain the direct ancestor child settings, not all child settings from every module in the app. // See: https://stackoverflow.com/questions/49406615/is-there-a-way-how-to-use-angular-multi-providers-from-all-multiple-levels { provide: DYNAMICHOOKS_ANCESTORSETTINGS, useFactory: (ancestorSettings) => { ancestorSettings = Array.isArray(ancestorSettings) ? ancestorSettings : []; ancestorSettings = moduleSettings !== undefined ? [...ancestorSettings, moduleSettings] : ancestorSettings; return ancestorSettings; }, deps: [[new SkipSelf(), new Optional(), DYNAMICHOOKS_ANCESTORSETTINGS]] }, { provide: DYNAMICHOOKS_MODULESETTINGS, useValue: moduleSettings }, // Must provide a separate instance of DynamicHooksService each time you call provideDynamicHooks, // so it can see passed settings of this level DynamicHooksService ]; if (platformService) { providers.push({ provide: PLATFORM_SERVICE, useClass: platformService }); } return providers; }; /** * A service that will always be created on app init, even without using a DynamicHooksComponent */ class DynamicHooksInitService { ngOnDestroy() { // Reset allSettings on app close for the benefit of vite live reloads and tests (which does not destroy allSettings reference between app reloads) // Safer to do this only on app close rather than on app start as it acts like a cleanup function and the order of execution matters less allSettings.length = 0; } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: DynamicHooksInitService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); } static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: DynamicHooksInitService, providedIn: 'root' }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: DynamicHooksInitService, decorators: [{ type: Injectable, args: [{ providedIn: 'root' }] }] }); export const resetDynamicHooks = () => { allSettings.length = 0; }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHluYW1pY0hvb2tzUHJvdmlkZXJzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LWR5bmFtaWMtaG9va3Mvc3JjL2xpYi9keW5hbWljSG9va3NQcm92aWRlcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFRLFFBQVEsRUFBRSxRQUFRLEVBQVksZUFBZSxFQUFFLFVBQVUsRUFBYSxNQUFNLGVBQWUsQ0FBQyxDQUFDLDhHQUE4RztBQUUxTixPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUNyRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQW1CLE1BQU0scUNBQXFDLENBQUM7QUFDeEYsT0FBTyxFQUFFLHdCQUF3QixFQUFFLDZCQUE2QixFQUFFLDJCQUEyQixFQUFFLE1BQU0sY0FBYyxDQUFDOztBQUdwSCxNQUFNLENBQUMsTUFBTSxXQUFXLEdBQTJCLEVBQUUsQ0FBQztBQUV0RDs7Ozs7R0FLRztBQUNILE1BQU0sQ0FBQyxNQUFNLG1CQUFtQixHQUErRyxDQUFDLFFBQVEsRUFBRSxlQUFlLEVBQUUsRUFBRTtJQUMzSyxNQUFNLGNBQWMsR0FBbUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBQyxPQUFPLEVBQUUsUUFBUSxFQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQztJQUVoSCxJQUFJLGNBQWMsS0FBSyxTQUFTLEVBQUUsQ0FBQztRQUNqQyxXQUFXLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO0lBQ25DLENBQUM7SUFFRCxNQUFNLFNBQVMsR0FBZTtRQUM1QjtZQUNFLE9BQU8sRUFBRSxlQUFlO1lBQ3hCLFVBQVUsRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRSxDQUFDO1lBQzFCLEtBQUssRUFBRSxJQUFJO1lBQ1gsSUFBSSxFQUFFLENBQUMsdUJBQXVCLENBQUM7U0FDaEM7UUFFRCxXQUFXO1FBQ1gsRUFBRSxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsUUFBUSxFQUFFLFdBQVcsRUFBRTtRQUM1RCxnRUFBZ0U7UUFDaEUsaUtBQWlLO1FBQ2pLLCtGQUErRjtRQUMvRiw0S0FBNEs7UUFDNUssK0hBQStIO1FBQy9IO1lBQ0UsT0FBTyxFQUFFLDZCQUE2QjtZQUN0QyxVQUFVLEVBQUUsQ0FBQyxnQkFBd0MsRUFBRSxFQUFFO2dCQUN2RCxnQkFBZ0IsR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7Z0JBQzNFLGdCQUFnQixHQUFHLGNBQWMsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxnQkFBZ0IsRUFBRSxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUM7Z0JBQzNHLE9BQU8sZ0JBQWdCLENBQUM7WUFDMUIsQ0FBQztZQUNELElBQUksRUFBRSxDQUFDLENBQUMsSUFBSSxRQUFRLEVBQUUsRUFBRSxJQUFJLFFBQVEsRUFBRSxFQUFFLDZCQUE2QixDQUFDLENBQUM7U0FDeEU7UUFDRCxFQUFFLE9BQU8sRUFBRSwyQkFBMkIsRUFBRSxRQUFRLEVBQUUsY0FBYyxFQUFFO1FBRWxFLG1HQUFtRztRQUNuRyw4Q0FBOEM7UUFDOUMsbUJBQW1CO0tBQ3BCLENBQUE7SUFFRCxJQUFJLGVBQWUsRUFBRSxDQUFDO1FBQ3BCLFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFBRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsUUFBUSxFQUFFLGVBQWUsRUFBRSxDQUFDLENBQUM7SUFDM0UsQ0FBQztJQUVELE9BQU8sU0FBUyxDQUFDO0FBQ25CLENBQUMsQ0FBQTtBQUVEOztHQUVHO0FBQ0gsTUFHTSx1QkFBdUI7SUFDM0IsV0FBVztRQUNULG1KQUFtSjtRQUNuSix5SUFBeUk7UUFDekksV0FBVyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7SUFDekIsQ0FBQzsrR0FMRyx1QkFBdUI7bUhBQXZCLHVCQUF1QixjQUZmLE1BQU07OzRGQUVkLHVCQUF1QjtrQkFINUIsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkI7O0FBU0QsTUFBTSxDQUFDLE1BQU0saUJBQWlCLEdBQWUsR0FBRyxFQUFFO0lBQ2hELFdBQVcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO0FBQ3pCLENBQUMsQ0FBQSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFR5cGUsIFNraXBTZWxmLCBPcHRpb25hbCwgUHJvdmlkZXIsIEFQUF9JTklUSUFMSVpFUiwgSW5qZWN0YWJsZSwgT25EZXN0cm95IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7IC8vIERvbid0IHJlbW92ZSBJbmplY3Rpb25Ub2tlbiBoZXJlLiBJdCB3aWxsIGNvbXBpbGUgd2l0aCBhIGR5bmFtaWMgaW1wb3J0IG90aGVyd2lzZSB3aGljaCBicmVha3MgTmc8NSBzdXBwb3J0XG5pbXBvcnQgeyBEeW5hbWljSG9va3NTZXR0aW5ncyB9IGZyb20gJy4vc2VydmljZXMvc2V0dGluZ3Mvc2V0dGluZ3MnO1xuaW1wb3J0IHsgRHluYW1pY0hvb2tzU2VydmljZSB9IGZyb20gJy4vc2VydmljZXMvZHluYW1pY0hvb2tzU2VydmljZSc7XG5pbXBvcnQgeyBQTEFURk9STV9TRVJWSUNFLCBQbGF0Zm9ybVNlcnZpY2UgfSBmcm9tICcuL3NlcnZpY2VzL3BsYXRmb3JtL3BsYXRmb3JtU2VydmljZSc7XG5pbXBvcnQgeyBEWU5BTUlDSE9PS1NfQUxMU0VUVElOR1MsIERZTkFNSUNIT09LU19BTkNFU1RPUlNFVFRJTkdTLCBEWU5BTUlDSE9PS1NfTU9EVUxFU0VUVElOR1MgfSBmcm9tICcuL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgSG9va1BhcnNlckVudHJ5IH0gZnJvbSAnLi9zZXJ2aWNlcy9zZXR0aW5ncy9wYXJzZXJFbnRyeSc7XG5cbmV4cG9ydCBjb25zdCBhbGxTZXR0aW5nczogRHluYW1pY0hvb2tzU2V0dGluZ3NbXSA9IFtdO1xuXG4vKipcbiAqIFNldHMgdXAgZ2xvYmFsIHBhcnNlcnMgYW5kIG9wdGlvbnMgZm9yIHRoZSBuZ3gtZHluYW1pYy1ob29rcyBsaWJyYXJ5XG4gKlxuICogQHBhcmFtIHNldHRpbmdzIC0gUGFyc2Vycy9vcHRpb25zIHRvIGJlIGFyZSBzaGFyZWQgaW4gdGhpcyBpbmplY3Rpb24gY29udGV4dFxuICogQHBhcmFtIHBsYXRmb3JtU2VydmljZSAtIChvcHRpb25hbCkgSWYgZGVzaXJlZCwgeW91IGNhbiBzcGVjaWZ5IGEgY3VzdG9tIFBsYXRmb3JtU2VydmljZSB0byB1c2UgaGVyZVxuICovXG5leHBvcnQgY29uc3QgcHJvdmlkZUR5bmFtaWNIb29rczogKHNldHRpbmdzPzogRHluYW1pY0hvb2tzU2V0dGluZ3N8SG9va1BhcnNlckVudHJ5W10sIHBsYXRmb3JtU2VydmljZT86IFR5cGU8UGxhdGZvcm1TZXJ2aWNlPikgPT4gUHJvdmlkZXJbXSA9IChzZXR0aW5ncywgcGxhdGZvcm1TZXJ2aWNlKSA9PiB7XG4gIGNvbnN0IG1vZHVsZVNldHRpbmdzOiBEeW5hbWljSG9va3NTZXR0aW5nc3x1bmRlZmluZWQgPSBBcnJheS5pc0FycmF5KHNldHRpbmdzKSA/IHtwYXJzZXJzOiBzZXR0aW5nc30gOiBzZXR0aW5ncztcblxuICBpZiAobW9kdWxlU2V0dGluZ3MgIT09IHVuZGVmaW5lZCkge1xuICAgIGFsbFNldHRpbmdzLnB1c2gobW9kdWxlU2V0dGluZ3MpO1xuICB9XG5cbiAgY29uc3QgcHJvdmlkZXJzOiBQcm92aWRlcltdID0gW1xuICAgIHtcbiAgICAgIHByb3ZpZGU6IEFQUF9JTklUSUFMSVpFUixcbiAgICAgIHVzZUZhY3Rvcnk6ICgpID0+ICgpID0+IHt9LFxuICAgICAgbXVsdGk6IHRydWUsXG4gICAgICBkZXBzOiBbRHluYW1pY0hvb2tzSW5pdFNlcnZpY2VdXG4gICAgfSxcblxuICAgIC8vIFNldHRpbmdzXG4gICAgeyBwcm92aWRlOiBEWU5BTUlDSE9PS1NfQUxMU0VUVElOR1MsIHVzZVZhbHVlOiBhbGxTZXR0aW5ncyB9LFxuICAgIC8vIEFuY2VzdG9yU2V0dGluZ3MgaXMgYSBoaWVyYXJjaGljYWwgYXJyYXkgb2YgcHJvdmlkZWQgc2V0dGluZ3NcbiAgICAvLyBCeSBoYXZpbmcgaXRzZWxmIGFzIGEgZGVwZW5kZW5jeSB3aXRoIFNraXBTZWxmLCBhIGNpcmN1bGFyIHJlZmVyZW5jZSBpcyBhdm9pZGVkIGFzIEFuZ3VsYXIgd2lsbCBsb29rIGZvciBEWU5BTUlDSE9PS1NfQU5DRVNUT1JTRVRUSU5HUyBpbiB0aGUgcGFyZW50IGluamVjdG9yLlxuICAgIC8vIEl0IHdpbGwga2VlcCB0cmF2ZWxpbmcgaW5qZWN0b3JzIHVwd2FyZHMgdW50aWwgaXQgZmluZHMgYW5vdGhlciBvciBqdXN0IHVzZSBudWxsIGFzIHRoZSBkZXAuXG4gICAgLy8gQWxzbywgYnkgcmV0dXJuaW5nIGEgbmV3IGFycmF5IHJlZmVyZW5jZSBlYWNoIHRpbWUsIHRoZSByZXN1bHQgd2lsbCBvbmx5IGNvbnRhaW4gdGhlIGRpcmVjdCBhbmNlc3RvciBjaGlsZCBzZXR0aW5ncywgbm90IGFsbCBjaGlsZCBzZXR0aW5ncyBmcm9tIGV2ZXJ5IG1vZHVsZSBpbiB0aGUgYXBwLlxuICAgIC8vIFNlZTogaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvNDk0MDY2MTUvaXMtdGhlcmUtYS13YXktaG93LXRvLXVzZS1hbmd1bGFyLW11bHRpLXByb3ZpZGVycy1mcm9tLWFsbC1tdWx0aXBsZS1sZXZlbHNcbiAgICB7XG4gICAgICBwcm92aWRlOiBEWU5BTUlDSE9PS1NfQU5DRVNUT1JTRVRUSU5HUyxcbiAgICAgIHVzZUZhY3Rvcnk6IChhbmNlc3RvclNldHRpbmdzOiBEeW5hbWljSG9va3NTZXR0aW5nc1tdKSA9PiB7XG4gICAgICAgIGFuY2VzdG9yU2V0dGluZ3MgPSBBcnJheS5pc0FycmF5KGFuY2VzdG9yU2V0dGluZ3MpID8gYW5jZXN0b3JTZXR0aW5ncyA6IFtdO1xuICAgICAgICBhbmNlc3RvclNldHRpbmdzID0gbW9kdWxlU2V0dGluZ3MgIT09IHVuZGVmaW5lZCA/IFsuLi5hbmNlc3RvclNldHRpbmdzLCBtb2R1bGVTZXR0aW5nc10gOiBhbmNlc3RvclNldHRpbmdzO1xuICAgICAgICByZXR1cm4gYW5jZXN0b3JTZXR0aW5ncztcbiAgICAgIH0sXG4gICAgICBkZXBzOiBbW25ldyBTa2lwU2VsZigpLCBuZXcgT3B0aW9uYWwoKSwgRFlOQU1JQ0hPT0tTX0FOQ0VTVE9SU0VUVElOR1NdXVxuICAgIH0sXG4gICAgeyBwcm92aWRlOiBEWU5BTUlDSE9PS1NfTU9EVUxFU0VUVElOR1MsIHVzZVZhbHVlOiBtb2R1bGVTZXR0aW5ncyB9LFxuXG4gICAgLy8gTXVzdCBwcm92aWRlIGEgc2VwYXJhdGUgaW5zdGFuY2Ugb2YgRHluYW1pY0hvb2tzU2VydmljZSBlYWNoIHRpbWUgeW91IGNhbGwgcHJvdmlkZUR5bmFtaWNIb29rcywgXG4gICAgLy8gc28gaXQgY2FuIHNlZSBwYXNzZWQgc2V0dGluZ3Mgb2YgdGhpcyBsZXZlbFxuICAgIER5bmFtaWNIb29rc1NlcnZpY2VcbiAgXVxuXG4gIGlmIChwbGF0Zm9ybVNlcnZpY2UpIHtcbiAgICBwcm92aWRlcnMucHVzaCh7IHByb3ZpZGU6IFBMQVRGT1JNX1NFUlZJQ0UsIHVzZUNsYXNzOiBwbGF0Zm9ybVNlcnZpY2UgfSk7XG4gIH1cbiAgXG4gIHJldHVybiBwcm92aWRlcnM7XG59XG5cbi8qKlxuICogQSBzZXJ2aWNlIHRoYXQgd2lsbCBhbHdheXMgYmUgY3JlYXRlZCBvbiBhcHAgaW5pdCwgZXZlbiB3aXRob3V0IHVzaW5nIGEgRHluYW1pY0hvb2tzQ29tcG9uZW50XG4gKi9cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXG59KVxuY2xhc3MgRHluYW1pY0hvb2tzSW5pdFNlcnZpY2UgaW1wbGVtZW50cyBPbkRlc3Ryb3kge1xuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICAvLyBSZXNldCBhbGxTZXR0aW5ncyBvbiBhcHAgY2xvc2UgZm9yIHRoZSBiZW5lZml0IG9mIHZpdGUgbGl2ZSByZWxvYWRzIGFuZCB0ZXN0cyAod2hpY2ggZG9lcyBub3QgZGVzdHJveSBhbGxTZXR0aW5ncyByZWZlcmVuY2UgYmV0d2VlbiBhcHAgcmVsb2FkcylcbiAgICAvLyBTYWZlciB0byBkbyB0aGlzIG9ubHkgb24gYXBwIGNsb3NlIHJhdGhlciB0aGFuIG9uIGFwcCBzdGFydCBhcyBpdCBhY3RzIGxpa2UgYSBjbGVhbnVwIGZ1bmN0aW9uIGFuZCB0aGUgb3JkZXIgb2YgZXhlY3V0aW9uIG1hdHRlcnMgbGVzc1xuICAgIGFsbFNldHRpbmdzLmxlbmd0aCA9IDA7XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IHJlc2V0RHluYW1pY0hvb2tzOiAoKSA9PiB2b2lkID0gKCkgPT4ge1xuICBhbGxTZXR0aW5ncy5sZW5ndGggPSAwO1xufSJdfQ==