@taiga-ui/dompurify
Version:
Inclusive Angular API for DOMPurify
46 lines • 6.74 kB
JavaScript
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