@analogjs/vitest-angular
Version:
Vitest Builder for Angular
95 lines • 10.9 kB
JavaScript
/**
* Check if is an Angular fixture
*
* @param val Angular fixture
* @returns boolean who check if is an angular fixture
*/
function isAngularFixture(val) {
if (typeof val !== 'object') {
return false;
}
if (val['componentRef'] || val['componentInstance']) {
return true;
}
if (val['componentType']) {
return true;
}
// * Angular fixture keys in Fixture component Object
const fixtureKeys = [
'componentRef',
'ngZone',
'effectRunner',
'_autoDetect',
'_isStable',
'_isDestroyed',
'_resolve',
'_promise',
'_onUnstableSubscription',
'_onStableSubscription',
'_onMicrotaskEmptySubscription',
'_onErrorSubscription',
'changeDetectorRef',
'elementRef',
'debugElement',
'componentInstance',
'nativeElement',
];
// * Angular fixture keys in Fixture componentRef Object
const fixtureComponentRefKeys = [
'location',
'_rootLView',
'_tNode',
'previousInputValues',
'instance',
'changeDetectorRef',
'hostView',
'componentType',
];
return (JSON.stringify(Object.keys(val)) === JSON.stringify(fixtureKeys) ||
JSON.stringify(Object.keys(val)) === JSON.stringify(fixtureComponentRefKeys));
}
/**
* Serialize Angular fixture for Vitest
*
* @param fixture Angular Fixture Component
* @returns HTML Child Node
*/
function fixtureVitestSerializer(fixture) {
// * Get Component meta data
const componentType = (fixture && fixture.componentType
? fixture.componentType
: fixture.componentRef.componentType);
let inputsData = '';
const selector = Reflect.getOwnPropertyDescriptor(componentType, '__annotations__')?.value[0]
?.selector ?? componentType.ɵcmp?.selectors[0]?.[0];
if (componentType && componentType.propDecorators) {
inputsData = Object.entries(componentType.propDecorators)
.map(([key, value]) => `${key}="${value}"`)
.join('');
}
// * Get DOM Elements
const divElement = fixture && fixture.nativeElement
? fixture.nativeElement
: fixture.location.nativeElement;
// * Convert string data to HTML data
const doc = new DOMParser().parseFromString(`<${selector} ${inputsData}>${divElement.innerHTML}</${selector}>`, 'text/html');
return doc.body.childNodes[0];
}
function normalizeSnapshotOutput(value) {
return (value
// Inline snapshots should not fail after formatters strip trailing spaces.
.replace(/[ \t]+$/gm, '')
// Comment removal can leave repeated empty lines in pretty-printed output.
.replace(/\n{3,}/g, '\n\n'));
}
export function createAngularFixtureSnapshotSerializer() {
return {
serialize(val, config, indentation, depth, refs, printer) {
return normalizeSnapshotOutput(printer(fixtureVitestSerializer(val), config, indentation, depth, refs));
},
test(val) {
return val && isAngularFixture(val);
},
};
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5ndWxhci1maXh0dXJlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvdml0ZXN0LWFuZ3VsYXIvc3JjL2xpYi9zbmFwc2hvdC1zZXJpYWxpemVycy9hbmd1bGFyLWZpeHR1cmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBR0E7Ozs7O0dBS0c7QUFDSCxTQUFTLGdCQUFnQixDQUFDLEdBQVE7SUFDaEMsSUFBSSxPQUFPLEdBQUcsS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUM1QixPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFRCxJQUFJLEdBQUcsQ0FBQyxjQUFjLENBQUMsSUFBSSxHQUFHLENBQUMsbUJBQW1CLENBQUMsRUFBRSxDQUFDO1FBQ3BELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVELElBQUksR0FBRyxDQUFDLGVBQWUsQ0FBQyxFQUFFLENBQUM7UUFDekIsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQscURBQXFEO0lBQ3JELE1BQU0sV0FBVyxHQUFHO1FBQ2xCLGNBQWM7UUFDZCxRQUFRO1FBQ1IsY0FBYztRQUNkLGFBQWE7UUFDYixXQUFXO1FBQ1gsY0FBYztRQUNkLFVBQVU7UUFDVixVQUFVO1FBQ1YseUJBQXlCO1FBQ3pCLHVCQUF1QjtRQUN2QiwrQkFBK0I7UUFDL0Isc0JBQXNCO1FBQ3RCLG1CQUFtQjtRQUNuQixZQUFZO1FBQ1osY0FBYztRQUNkLG1CQUFtQjtRQUNuQixlQUFlO0tBQ2hCLENBQUM7SUFFRix3REFBd0Q7SUFDeEQsTUFBTSx1QkFBdUIsR0FBRztRQUM5QixVQUFVO1FBQ1YsWUFBWTtRQUNaLFFBQVE7UUFDUixxQkFBcUI7UUFDckIsVUFBVTtRQUNWLG1CQUFtQjtRQUNuQixVQUFVO1FBQ1YsZUFBZTtLQUNoQixDQUFDO0lBRUYsT0FBTyxDQUNMLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLElBQUksQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDO1FBQ2hFLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLElBQUksQ0FBQyxTQUFTLENBQUMsdUJBQXVCLENBQUMsQ0FDN0UsQ0FBQztBQUNKLENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILFNBQVMsdUJBQXVCLENBQUMsT0FBWTtJQUMzQyw0QkFBNEI7SUFDNUIsTUFBTSxhQUFhLEdBQUcsQ0FDcEIsT0FBTyxJQUFJLE9BQU8sQ0FBQyxhQUFhO1FBQzlCLENBQUMsQ0FBQyxPQUFPLENBQUMsYUFBYTtRQUN2QixDQUFDLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxhQUFhLENBQ2hDLENBQUM7SUFFVCxJQUFJLFVBQVUsR0FBVyxFQUFFLENBQUM7SUFFNUIsTUFBTSxRQUFRLEdBQ1osT0FBTyxDQUFDLHdCQUF3QixDQUFDLGFBQWEsRUFBRSxpQkFBaUIsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDMUUsRUFBRSxRQUFRLElBQUksYUFBYSxDQUFDLElBQUksRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUV4RCxJQUFJLGFBQWEsSUFBSSxhQUFhLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDbEQsVUFBVSxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLGNBQWMsQ0FBQzthQUN0RCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxHQUFHLEtBQUssS0FBSyxHQUFHLENBQUM7YUFDMUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ2QsQ0FBQztJQUVELHFCQUFxQjtJQUNyQixNQUFNLFVBQVUsR0FDZCxPQUFPLElBQUksT0FBTyxDQUFDLGFBQWE7UUFDOUIsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxhQUFhO1FBQ3ZCLENBQUMsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQztJQUVyQyxxQ0FBcUM7SUFDckMsTUFBTSxHQUFHLEdBQUcsSUFBSSxTQUFTLEVBQUUsQ0FBQyxlQUFlLENBQ3pDLElBQUksUUFBUSxJQUFJLFVBQVUsSUFBSSxVQUFVLENBQUMsU0FBUyxLQUFLLFFBQVEsR0FBRyxFQUNsRSxXQUFXLENBQ1osQ0FBQztJQUVGLE9BQU8sR0FBRyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEMsQ0FBQztBQUVELFNBQVMsdUJBQXVCLENBQUMsS0FBYTtJQUM1QyxPQUFPLENBQ0wsS0FBSztRQUNILDJFQUEyRTtTQUMxRSxPQUFPLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQztRQUN6QiwyRUFBMkU7U0FDMUUsT0FBTyxDQUFDLFNBQVMsRUFBRSxNQUFNLENBQUMsQ0FDOUIsQ0FBQztBQUNKLENBQUM7QUFFRCxNQUFNLFVBQVUsc0NBQXNDO0lBQ3BELE9BQU87UUFDTCxTQUFTLENBQUMsR0FBRyxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxPQUFPO1lBQ3RELE9BQU8sdUJBQXVCLENBQzVCLE9BQU8sQ0FBQyx1QkFBdUIsQ0FBQyxHQUFHLENBQUMsRUFBRSxNQUFNLEVBQUUsV0FBVyxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FDeEUsQ0FBQztRQUNKLENBQUM7UUFDRCxJQUFJLENBQUMsR0FBRztZQUNOLE9BQU8sR0FBRyxJQUFJLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3RDLENBQUM7S0FDRixDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgQ29tcG9uZW50Rml4dHVyZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUvdGVzdGluZyc7XG5pbXBvcnQgdHlwZSB7IFNuYXBzaG90U2VyaWFsaXplciB9IGZyb20gJ3ZpdGVzdCc7XG5cbi8qKlxuICogQ2hlY2sgaWYgaXMgYW4gQW5ndWxhciBmaXh0dXJlXG4gKlxuICogQHBhcmFtIHZhbCBBbmd1bGFyIGZpeHR1cmVcbiAqIEByZXR1cm5zIGJvb2xlYW4gd2hvIGNoZWNrIGlmIGlzIGFuIGFuZ3VsYXIgZml4dHVyZVxuICovXG5mdW5jdGlvbiBpc0FuZ3VsYXJGaXh0dXJlKHZhbDogYW55KTogYm9vbGVhbiB7XG4gIGlmICh0eXBlb2YgdmFsICE9PSAnb2JqZWN0Jykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmICh2YWxbJ2NvbXBvbmVudFJlZiddIHx8IHZhbFsnY29tcG9uZW50SW5zdGFuY2UnXSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaWYgKHZhbFsnY29tcG9uZW50VHlwZSddKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvLyAqIEFuZ3VsYXIgZml4dHVyZSBrZXlzIGluIEZpeHR1cmUgY29tcG9uZW50IE9iamVjdFxuICBjb25zdCBmaXh0dXJlS2V5cyA9IFtcbiAgICAnY29tcG9uZW50UmVmJyxcbiAgICAnbmdab25lJyxcbiAgICAnZWZmZWN0UnVubmVyJyxcbiAgICAnX2F1dG9EZXRlY3QnLFxuICAgICdfaXNTdGFibGUnLFxuICAgICdfaXNEZXN0cm95ZWQnLFxuICAgICdfcmVzb2x2ZScsXG4gICAgJ19wcm9taXNlJyxcbiAgICAnX29uVW5zdGFibGVTdWJzY3JpcHRpb24nLFxuICAgICdfb25TdGFibGVTdWJzY3JpcHRpb24nLFxuICAgICdfb25NaWNyb3Rhc2tFbXB0eVN1YnNjcmlwdGlvbicsXG4gICAgJ19vbkVycm9yU3Vic2NyaXB0aW9uJyxcbiAgICAnY2hhbmdlRGV0ZWN0b3JSZWYnLFxuICAgICdlbGVtZW50UmVmJyxcbiAgICAnZGVidWdFbGVtZW50JyxcbiAgICAnY29tcG9uZW50SW5zdGFuY2UnLFxuICAgICduYXRpdmVFbGVtZW50JyxcbiAgXTtcblxuICAvLyAqIEFuZ3VsYXIgZml4dHVyZSBrZXlzIGluIEZpeHR1cmUgY29tcG9uZW50UmVmIE9iamVjdFxuICBjb25zdCBmaXh0dXJlQ29tcG9uZW50UmVmS2V5cyA9IFtcbiAgICAnbG9jYXRpb24nLFxuICAgICdfcm9vdExWaWV3JyxcbiAgICAnX3ROb2RlJyxcbiAgICAncHJldmlvdXNJbnB1dFZhbHVlcycsXG4gICAgJ2luc3RhbmNlJyxcbiAgICAnY2hhbmdlRGV0ZWN0b3JSZWYnLFxuICAgICdob3N0VmlldycsXG4gICAgJ2NvbXBvbmVudFR5cGUnLFxuICBdO1xuXG4gIHJldHVybiAoXG4gICAgSlNPTi5zdHJpbmdpZnkoT2JqZWN0LmtleXModmFsKSkgPT09IEpTT04uc3RyaW5naWZ5KGZpeHR1cmVLZXlzKSB8fFxuICAgIEpTT04uc3RyaW5naWZ5KE9iamVjdC5rZXlzKHZhbCkpID09PSBKU09OLnN0cmluZ2lmeShmaXh0dXJlQ29tcG9uZW50UmVmS2V5cylcbiAgKTtcbn1cblxuLyoqXG4gKiBTZXJpYWxpemUgQW5ndWxhciBmaXh0dXJlIGZvciBWaXRlc3RcbiAqXG4gKiBAcGFyYW0gZml4dHVyZSBBbmd1bGFyIEZpeHR1cmUgQ29tcG9uZW50XG4gKiBAcmV0dXJucyBIVE1MIENoaWxkIE5vZGVcbiAqL1xuZnVuY3Rpb24gZml4dHVyZVZpdGVzdFNlcmlhbGl6ZXIoZml4dHVyZTogYW55KSB7XG4gIC8vICogR2V0IENvbXBvbmVudCBtZXRhIGRhdGFcbiAgY29uc3QgY29tcG9uZW50VHlwZSA9IChcbiAgICBmaXh0dXJlICYmIGZpeHR1cmUuY29tcG9uZW50VHlwZVxuICAgICAgPyBmaXh0dXJlLmNvbXBvbmVudFR5cGVcbiAgICAgIDogZml4dHVyZS5jb21wb25lbnRSZWYuY29tcG9uZW50VHlwZVxuICApIGFzIGFueTtcblxuICBsZXQgaW5wdXRzRGF0YTogc3RyaW5nID0gJyc7XG5cbiAgY29uc3Qgc2VsZWN0b3IgPVxuICAgIFJlZmxlY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGNvbXBvbmVudFR5cGUsICdfX2Fubm90YXRpb25zX18nKT8udmFsdWVbMF1cbiAgICAgID8uc2VsZWN0b3IgPz8gY29tcG9uZW50VHlwZS7JtWNtcD8uc2VsZWN0b3JzWzBdPy5bMF07XG5cbiAgaWYgKGNvbXBvbmVudFR5cGUgJiYgY29tcG9uZW50VHlwZS5wcm9wRGVjb3JhdG9ycykge1xuICAgIGlucHV0c0RhdGEgPSBPYmplY3QuZW50cmllcyhjb21wb25lbnRUeXBlLnByb3BEZWNvcmF0b3JzKVxuICAgICAgLm1hcCgoW2tleSwgdmFsdWVdKSA9PiBgJHtrZXl9PVwiJHt2YWx1ZX1cImApXG4gICAgICAuam9pbignJyk7XG4gIH1cblxuICAvLyAqIEdldCBET00gRWxlbWVudHNcbiAgY29uc3QgZGl2RWxlbWVudCA9XG4gICAgZml4dHVyZSAmJiBmaXh0dXJlLm5hdGl2ZUVsZW1lbnRcbiAgICAgID8gZml4dHVyZS5uYXRpdmVFbGVtZW50XG4gICAgICA6IGZpeHR1cmUubG9jYXRpb24ubmF0aXZlRWxlbWVudDtcblxuICAvLyAqIENvbnZlcnQgc3RyaW5nIGRhdGEgdG8gSFRNTCBkYXRhXG4gIGNvbnN0IGRvYyA9IG5ldyBET01QYXJzZXIoKS5wYXJzZUZyb21TdHJpbmcoXG4gICAgYDwke3NlbGVjdG9yfSAke2lucHV0c0RhdGF9PiR7ZGl2RWxlbWVudC5pbm5lckhUTUx9PC8ke3NlbGVjdG9yfT5gLFxuICAgICd0ZXh0L2h0bWwnLFxuICApO1xuXG4gIHJldHVybiBkb2MuYm9keS5jaGlsZE5vZGVzWzBdO1xufVxuXG5mdW5jdGlvbiBub3JtYWxpemVTbmFwc2hvdE91dHB1dCh2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIChcbiAgICB2YWx1ZVxuICAgICAgLy8gSW5saW5lIHNuYXBzaG90cyBzaG91bGQgbm90IGZhaWwgYWZ0ZXIgZm9ybWF0dGVycyBzdHJpcCB0cmFpbGluZyBzcGFjZXMuXG4gICAgICAucmVwbGFjZSgvWyBcXHRdKyQvZ20sICcnKVxuICAgICAgLy8gQ29tbWVudCByZW1vdmFsIGNhbiBsZWF2ZSByZXBlYXRlZCBlbXB0eSBsaW5lcyBpbiBwcmV0dHktcHJpbnRlZCBvdXRwdXQuXG4gICAgICAucmVwbGFjZSgvXFxuezMsfS9nLCAnXFxuXFxuJylcbiAgKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUFuZ3VsYXJGaXh0dXJlU25hcHNob3RTZXJpYWxpemVyKCk6IFNuYXBzaG90U2VyaWFsaXplciB7XG4gIHJldHVybiB7XG4gICAgc2VyaWFsaXplKHZhbCwgY29uZmlnLCBpbmRlbnRhdGlvbiwgZGVwdGgsIHJlZnMsIHByaW50ZXIpIHtcbiAgICAgIHJldHVybiBub3JtYWxpemVTbmFwc2hvdE91dHB1dChcbiAgICAgICAgcHJpbnRlcihmaXh0dXJlVml0ZXN0U2VyaWFsaXplcih2YWwpLCBjb25maWcsIGluZGVudGF0aW9uLCBkZXB0aCwgcmVmcyksXG4gICAgICApO1xuICAgIH0sXG4gICAgdGVzdCh2YWwpIHtcbiAgICAgIHJldHVybiB2YWwgJiYgaXNBbmd1bGFyRml4dHVyZSh2YWwpO1xuICAgIH0sXG4gIH07XG59XG4iXX0=