@dataunlocker/defender-angular
Version:
DataUnlocker Defender for Angular applications.
129 lines (124 loc) • 4.85 kB
JavaScript
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 };