UNPKG

@taiga-ui/dompurify

Version:
116 lines (108 loc) 4.93 kB
import * as i0 from '@angular/core'; import { InjectionToken, inject, SecurityContext, Injectable, Pipe } from '@angular/core'; import { DomSanitizer } from '@angular/platform-browser'; import { DOCUMENT } from '@angular/common'; import dompurify from 'dompurify'; /** * Token for {@link NgDompurifyConfig} */ const DOMPURIFY_CONFIG = new InjectionToken('[DOMPURIFY_CONFIG]: Config for DOMPurify', { factory: () => ({}), providedIn: 'root', }); /** * Token for adding hooks to DOMPurify, see {@link addHook} */ const DOMPURIFY_HOOKS = new InjectionToken('[DOMPURIFY_HOOKS]: Hooks for DOMPurify', { factory: () => [], providedIn: 'root', }); /** * A function that takes style rule value as input and returns a sanitized string * * NOTE: Angular 10 removed CSS sanitation so by default this method does nothing */ const SANITIZE_STYLE = new InjectionToken('[SANITIZE_STYLE]: A function that sanitizes value for a CSS rule', { factory: () => (value) => value, providedIn: 'root', }); const createDOMPurify = dompurify; /** * Implementation of Angular {@link Sanitizer} purifying via DOMPurify * * use {@link DOMPURIFY_CONFIG} token to provide config ({@link NgDompurifyConfig}) * use {@link SANITIZE_STYLE} token to provide a style sanitizing method ({@link SanitizeStyle}) * use {@link DOMPURIFY_HOOKS} token to provide a hooks for DOMPurify ({@link addHook}) * * Ambient type cannot be used without @dynamic https://github.com/angular/angular/issues/23395 * @dynamic */ class NgDompurifySanitizer { constructor() { this.config = inject(DOMPURIFY_CONFIG); this.sanitizeStyle = inject(SANITIZE_STYLE); this.domPurify = createDOMPurify(inject(DOCUMENT).defaultView); inject(DOMPURIFY_HOOKS).forEach(({ name, hook }) => { this.domPurify.addHook(name, hook); }); } sanitize(context, value, config = this.config) { if (context === SecurityContext.SCRIPT) { throw new Error('DOMPurify does not support SCRIPT context'); } return context === SecurityContext.STYLE ? this.sanitizeStyle(String(value)) : this.domPurify.sanitize(String(value || ''), config); } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: NgDompurifySanitizer, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); } static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: NgDompurifySanitizer, providedIn: 'root' }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: NgDompurifySanitizer, decorators: [{ type: Injectable, args: [{ providedIn: 'root', }] }], ctorParameters: function () { return []; } }); /** * Pipe that transforms dirty content to clean via {@link NgDompurifySanitizer} */ class NgDompurifyPipe { constructor() { this.sanitizer = inject(NgDompurifySanitizer); this.domSanitizer = inject(DomSanitizer); } transform(value, context = SecurityContext.HTML, config) { return this.bypassSecurityTrust(context, this.sanitizer.sanitize(context, value, config)); } bypassSecurityTrust(context, purifiedValue) { switch (context) { case SecurityContext.HTML: return this.domSanitizer.bypassSecurityTrustHtml(purifiedValue); case SecurityContext.RESOURCE_URL: return this.domSanitizer.bypassSecurityTrustResourceUrl(purifiedValue); case SecurityContext.SCRIPT: return this.domSanitizer.bypassSecurityTrustScript(purifiedValue); case SecurityContext.STYLE: return this.domSanitizer.bypassSecurityTrustStyle(purifiedValue); case SecurityContext.URL: return this.domSanitizer.bypassSecurityTrustUrl(purifiedValue); case SecurityContext.NONE: default: return null; } } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: NgDompurifyPipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe }); } static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "16.2.12", ngImport: i0, type: NgDompurifyPipe, isStandalone: true, name: "dompurify" }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: NgDompurifyPipe, decorators: [{ type: Pipe, args: [{ standalone: true, name: 'dompurify', }] }] }); /** * Generated bundle index. Do not edit. */ export { DOMPURIFY_CONFIG, DOMPURIFY_HOOKS, NgDompurifyPipe, NgDompurifySanitizer, SANITIZE_STYLE }; //# sourceMappingURL=taiga-ui-dompurify.mjs.map