UNPKG

@taiga-ui/dompurify

Version:
46 lines 6.74 kB
import { DOCUMENT } from '@angular/common'; import { inject, Injectable, SecurityContext } from '@angular/core'; import dompurify from 'dompurify'; import { DOMPURIFY_CONFIG } from './tokens/dompurify-config'; import { DOMPURIFY_HOOKS } from './tokens/dompurify-hooks'; import { SANITIZE_STYLE } from './tokens/sanitize-style'; import * as i0 from "@angular/core"; 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' }); } } export { NgDompurifySanitizer }; i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: NgDompurifySanitizer, decorators: [{ type: Injectable, args: [{ providedIn: 'root', }] }], ctorParameters: function () { return []; } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmctZG9tcHVyaWZ5LnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9wcm9qZWN0cy9uZy1kb21wdXJpZnkvbGliL25nLWRvbXB1cmlmeS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxRQUFRLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUV6QyxPQUFPLEVBQUMsTUFBTSxFQUFFLFVBQVUsRUFBRSxlQUFlLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFFbEUsT0FBTyxTQUFTLE1BQU0sV0FBVyxDQUFDO0FBRWxDLE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLDJCQUEyQixDQUFDO0FBQzNELE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSwwQkFBMEIsQ0FBQztBQUN6RCxPQUFPLEVBQUMsY0FBYyxFQUFDLE1BQU0seUJBQXlCLENBQUM7O0FBR3ZELE1BQU0sZUFBZSxHQUFHLFNBQVMsQ0FBQztBQUVsQzs7Ozs7Ozs7O0dBU0c7QUFDSCxNQUdhLG9CQUFvQjtJQUs3QjtRQUppQixXQUFNLEdBQUcsTUFBTSxDQUFDLGdCQUFnQixDQUFDLENBQUM7UUFDbEMsa0JBQWEsR0FBRyxNQUFNLENBQUMsY0FBYyxDQUFDLENBQUM7UUFJcEQsSUFBSSxDQUFDLFNBQVMsR0FBRyxlQUFlLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLFdBQXFCLENBQUMsQ0FBQztRQUV6RSxNQUFNLENBQUMsZUFBZSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBQyxJQUFJLEVBQUUsSUFBSSxFQUFDLEVBQUUsRUFBRTtZQUM3QyxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDdkMsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRU0sUUFBUSxDQUNYLE9BQXdCLEVBQ3hCLEtBQTZDLEVBQzdDLFNBQTRCLElBQUksQ0FBQyxNQUFNO1FBRXZDLElBQUksT0FBTyxLQUFLLGVBQWUsQ0FBQyxNQUFNLEVBQUU7WUFDcEMsTUFBTSxJQUFJLEtBQUssQ0FBQywyQ0FBMkMsQ0FBQyxDQUFDO1NBQ2hFO1FBRUQsT0FBTyxPQUFPLEtBQUssZUFBZSxDQUFDLEtBQUs7WUFDcEMsQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ25DLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQy9ELENBQUM7K0dBekJRLG9CQUFvQjttSEFBcEIsb0JBQW9CLGNBRmpCLE1BQU07O1NBRVQsb0JBQW9COzRGQUFwQixvQkFBb0I7a0JBSGhDLFVBQVU7bUJBQUM7b0JBQ1IsVUFBVSxFQUFFLE1BQU07aUJBQ3JCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtET0NVTUVOVH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB0eXBlIHtTYW5pdGl6ZXJ9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtpbmplY3QsIEluamVjdGFibGUsIFNlY3VyaXR5Q29udGV4dH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgdHlwZSB7RE9NUHVyaWZ5SX0gZnJvbSAnZG9tcHVyaWZ5JztcbmltcG9ydCBkb21wdXJpZnkgZnJvbSAnZG9tcHVyaWZ5JztcblxuaW1wb3J0IHtET01QVVJJRllfQ09ORklHfSBmcm9tICcuL3Rva2Vucy9kb21wdXJpZnktY29uZmlnJztcbmltcG9ydCB7RE9NUFVSSUZZX0hPT0tTfSBmcm9tICcuL3Rva2Vucy9kb21wdXJpZnktaG9va3MnO1xuaW1wb3J0IHtTQU5JVElaRV9TVFlMRX0gZnJvbSAnLi90b2tlbnMvc2FuaXRpemUtc3R5bGUnO1xuaW1wb3J0IHR5cGUge05nRG9tcHVyaWZ5Q29uZmlnfSBmcm9tICcuL3R5cGVzL25nLWRvbXB1cmlmeS1jb25maWcnO1xuXG5jb25zdCBjcmVhdGVET01QdXJpZnkgPSBkb21wdXJpZnk7XG5cbi8qKlxuICogSW1wbGVtZW50YXRpb24gb2YgQW5ndWxhciB7QGxpbmsgU2FuaXRpemVyfSBwdXJpZnlpbmcgdmlhIERPTVB1cmlmeVxuICpcbiAqIHVzZSB7QGxpbmsgRE9NUFVSSUZZX0NPTkZJR30gdG9rZW4gdG8gcHJvdmlkZSBjb25maWcgKHtAbGluayBOZ0RvbXB1cmlmeUNvbmZpZ30pXG4gKiB1c2Uge0BsaW5rIFNBTklUSVpFX1NUWUxFfSB0b2tlbiB0byBwcm92aWRlIGEgc3R5bGUgc2FuaXRpemluZyBtZXRob2QgKHtAbGluayBTYW5pdGl6ZVN0eWxlfSlcbiAqIHVzZSB7QGxpbmsgRE9NUFVSSUZZX0hPT0tTfSB0b2tlbiB0byBwcm92aWRlIGEgaG9va3MgZm9yIERPTVB1cmlmeSAoe0BsaW5rIGFkZEhvb2t9KVxuICpcbiAqIEFtYmllbnQgdHlwZSBjYW5ub3QgYmUgdXNlZCB3aXRob3V0IEBkeW5hbWljIGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL2FuZ3VsYXIvaXNzdWVzLzIzMzk1XG4gKiBAZHluYW1pY1xuICovXG5ASW5qZWN0YWJsZSh7XG4gICAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxufSlcbmV4cG9ydCBjbGFzcyBOZ0RvbXB1cmlmeVNhbml0aXplciBpbXBsZW1lbnRzIFNhbml0aXplciB7XG4gICAgcHJpdmF0ZSByZWFkb25seSBjb25maWcgPSBpbmplY3QoRE9NUFVSSUZZX0NPTkZJRyk7XG4gICAgcHJpdmF0ZSByZWFkb25seSBzYW5pdGl6ZVN0eWxlID0gaW5qZWN0KFNBTklUSVpFX1NUWUxFKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGRvbVB1cmlmeTogRE9NUHVyaWZ5STtcblxuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmRvbVB1cmlmeSA9IGNyZWF0ZURPTVB1cmlmeShpbmplY3QoRE9DVU1FTlQpLmRlZmF1bHRWaWV3IGFzIFdpbmRvdyk7XG5cbiAgICAgICAgaW5qZWN0KERPTVBVUklGWV9IT09LUykuZm9yRWFjaCgoe25hbWUsIGhvb2t9KSA9PiB7XG4gICAgICAgICAgICB0aGlzLmRvbVB1cmlmeS5hZGRIb29rKG5hbWUsIGhvb2spO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2FuaXRpemUoXG4gICAgICAgIGNvbnRleHQ6IFNlY3VyaXR5Q29udGV4dCxcbiAgICAgICAgdmFsdWU6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gfCBzdHJpbmcgfCBudWxsLFxuICAgICAgICBjb25maWc6IE5nRG9tcHVyaWZ5Q29uZmlnID0gdGhpcy5jb25maWcsXG4gICAgKTogc3RyaW5nIHtcbiAgICAgICAgaWYgKGNvbnRleHQgPT09IFNlY3VyaXR5Q29udGV4dC5TQ1JJUFQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignRE9NUHVyaWZ5IGRvZXMgbm90IHN1cHBvcnQgU0NSSVBUIGNvbnRleHQnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBjb250ZXh0ID09PSBTZWN1cml0eUNvbnRleHQuU1RZTEVcbiAgICAgICAgICAgID8gdGhpcy5zYW5pdGl6ZVN0eWxlKFN0cmluZyh2YWx1ZSkpXG4gICAgICAgICAgICA6IHRoaXMuZG9tUHVyaWZ5LnNhbml0aXplKFN0cmluZyh2YWx1ZSB8fCAnJyksIGNvbmZpZyk7XG4gICAgfVxufVxuIl19