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
JavaScript
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==