UNPKG

@dataunlocker/defender-angular

Version:

DataUnlocker Defender for Angular applications.

129 lines (124 loc) 4.85 kB
import * as i1 from '@angular/common'; import { isPlatformBrowser, CommonModule } from '@angular/common'; import * as i0 from '@angular/core'; import { EventEmitter, inject, PLATFORM_ID, ChangeDetectorRef, ElementRef, Output, ViewChild, Component } from '@angular/core'; import { onLoad, onError } from '@dataunlocker/defender'; const REGEX_TARGET_BLANK = /(\starget=['"]_blank['"])/g; const REGEX_HREF = /(\shref=['"])[^'"]+/g; const REGEX_HREF_REPLACE = '$1#'; const innerHTML = 'innerHTML'; const nativeElement = 'nativeElement'; const detectChanges = 'detectChanges'; const createElement = 'createElement'; const sanitizeInnerHTML = (obj) => obj?.[innerHTML] .replace(REGEX_TARGET_BLANK, '') .replace(REGEX_HREF, REGEX_HREF_REPLACE) || ''; // Prototype self-checks const selfCheck = () => { const d = document[createElement]('div'); const e = document[createElement]('a'); const dn = Date.now() + ''; d.appendChild(e); e.href = '#' + dn; return sanitizeInnerHTML(d).length === d[innerHTML].length - dn.length; }; class DefenderComponent { /** SSR-rendered content */ a; b; /** Emitted when DataUnlocker Defender loads. Contains data returned from Secure Enclave, if any. */ loaded = new EventEmitter(); /** Emitted when DataUnlocker Defender errors. It may happen before or after `loaded`. Contains the error code. */ errored = new EventEmitter(); /** isLoaded */ c = false; /** isError */ d = false; /** isStarted */ e = false; /** isBrowser */ f = isPlatformBrowser(inject(PLATFORM_ID)); j = inject(ChangeDetectorRef); ngAfterViewInit() { if (!this.f) return; if (!selfCheck()) this.d = true; let html = ''; try { html = sanitizeInnerHTML(this.a?.[nativeElement]); } catch { } this.e = true; if (this.b) { this.b[nativeElement][innerHTML] = html; } this.j[detectChanges](); onLoad((data) => { this.c = true; this.d = false; this.j[detectChanges](); this.loaded.emit(data); }); onError((code) => { this.c = true; this.d = true; this.j[detectChanges](); this.errored.emit(code); }); } ngAfterViewChecked() { if (this.f && !this.e) this.d = true; } static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.7", ngImport: i0, type: DefenderComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.7", type: DefenderComponent, isStandalone: true, selector: "defender", outputs: { loaded: "loaded", errored: "errored" }, viewQueries: [{ propertyName: "a", first: true, predicate: ["a"], descendants: true, read: ElementRef }, { propertyName: "b", first: true, predicate: ["b"], descendants: true, read: ElementRef }], ngImport: i0, template: ` <div *ngIf="!c && !e" #a> <ng-container *ngTemplateOutlet="o"></ng-container> </div> <div *ngIf="c && !d"> <ng-container *ngTemplateOutlet="o"></ng-container> </div> <div #b *ngIf="!c || d"></div> <ng-template #o> <ng-content></ng-content> </ng-template> `, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }] }); } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.7", ngImport: i0, type: DefenderComponent, decorators: [{ type: Component, args: [{ selector: 'defender', standalone: true, imports: [CommonModule], template: ` <div *ngIf="!c && !e" #a> <ng-container *ngTemplateOutlet="o"></ng-container> </div> <div *ngIf="c && !d"> <ng-container *ngTemplateOutlet="o"></ng-container> </div> <div #b *ngIf="!c || d"></div> <ng-template #o> <ng-content></ng-content> </ng-template> `, }] }], propDecorators: { a: [{ type: ViewChild, args: ['a', { read: ElementRef }] }], b: [{ type: ViewChild, args: ['b', { read: ElementRef }] }], loaded: [{ type: Output }], errored: [{ type: Output }] } }); /* * Public API Surface of defender-angular */ /** * Generated bundle index. Do not edit. */ export { DefenderComponent };