@analogjs/vitest-angular
Version:
Vitest Builder for Angular
104 lines • 11.4 kB
JavaScript
const env = globalThis;
/**
* Allows Vitest to handle Angular test fixtures
*
* Vitest Snapshot guide ==> https://vitest.dev/guide/snapshot.html
*
* @returns customSnapshotSerializer for Angular Fixture Component
*/
const customSnapshotSerializer = () => {
function serialize(val, config, indentation, depth, refs, printer) {
// `printer` is a function that serializes a value using existing plugins.
return `${printer(fixtureVitestSerializer(val), config, indentation, depth, refs)}`;
}
function test(val) {
// * If it's a ComponentFixture we apply the transformation rules
return val && isAngularFixture(val);
}
return {
serialize,
test,
};
};
/**
* 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;
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];
}
['expect'].forEach((methodName) => {
const originalvitestFn = env[methodName];
return originalvitestFn.addSnapshotSerializer(customSnapshotSerializer());
});
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2V0dXAtc25hcHNob3RzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vcGFja2FnZXMvdml0ZXN0LWFuZ3VsYXIvc2V0dXAtc25hcHNob3RzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxNQUFNLEdBQUcsR0FBRyxVQUFpQixDQUFDO0FBRTlCOzs7Ozs7R0FNRztBQUNILE1BQU0sd0JBQXdCLEdBQUcsR0FBRyxFQUFFO0lBQ3BDLFNBQVMsU0FBUyxDQUNoQixHQUFRLEVBQ1IsTUFBVyxFQUNYLFdBQWdCLEVBQ2hCLEtBQVUsRUFDVixJQUFTLEVBQ1QsT0FBWTtRQUVaLDBFQUEwRTtRQUMxRSxPQUFPLEdBQUcsT0FBTyxDQUNmLHVCQUF1QixDQUFDLEdBQUcsQ0FBQyxFQUM1QixNQUFNLEVBQ04sV0FBVyxFQUNYLEtBQUssRUFDTCxJQUFJLENBQ0wsRUFBRSxDQUFDO0lBQ04sQ0FBQztJQUNELFNBQVMsSUFBSSxDQUFDLEdBQVE7UUFDcEIsaUVBQWlFO1FBQ2pFLE9BQU8sR0FBRyxJQUFJLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ3RDLENBQUM7SUFDRCxPQUFPO1FBQ0wsU0FBUztRQUNULElBQUk7S0FDTCxDQUFDO0FBQ0osQ0FBQyxDQUFDO0FBRUY7Ozs7O0dBS0c7QUFDSCxTQUFTLGdCQUFnQixDQUFDLEdBQVE7SUFDaEMsSUFBSSxPQUFPLEdBQUcsS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUM1QixPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFRCxJQUFJLEdBQUcsQ0FBQyxjQUFjLENBQUMsSUFBSSxHQUFHLENBQUMsbUJBQW1CLENBQUMsRUFBRSxDQUFDO1FBQ3BELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVELElBQUksR0FBRyxDQUFDLGVBQWUsQ0FBQyxFQUFFLENBQUM7UUFDekIsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQscURBQXFEO0lBQ3JELE1BQU0sV0FBVyxHQUFHO1FBQ2xCLGNBQWM7UUFDZCxRQUFRO1FBQ1IsY0FBYztRQUNkLGFBQWE7UUFDYixXQUFXO1FBQ1gsY0FBYztRQUNkLFVBQVU7UUFDVixVQUFVO1FBQ1YseUJBQXlCO1FBQ3pCLHVCQUF1QjtRQUN2QiwrQkFBK0I7UUFDL0Isc0JBQXNCO1FBQ3RCLG1CQUFtQjtRQUNuQixZQUFZO1FBQ1osY0FBYztRQUNkLG1CQUFtQjtRQUNuQixlQUFlO0tBQ2hCLENBQUM7SUFFRix3REFBd0Q7SUFDeEQsTUFBTSx1QkFBdUIsR0FBRztRQUM5QixVQUFVO1FBQ1YsWUFBWTtRQUNaLFFBQVE7UUFDUixxQkFBcUI7UUFDckIsVUFBVTtRQUNWLG1CQUFtQjtRQUNuQixVQUFVO1FBQ1YsZUFBZTtLQUNoQixDQUFDO0lBRUYsT0FBTyxDQUNMLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLElBQUksQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDO1FBQ2hFLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLElBQUksQ0FBQyxTQUFTLENBQUMsdUJBQXVCLENBQUMsQ0FDN0UsQ0FBQztBQUNKLENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILFNBQVMsdUJBQXVCLENBQUMsT0FBWTtJQUMzQyw0QkFBNEI7SUFDNUIsTUFBTSxhQUFhLEdBQUcsQ0FDcEIsT0FBTyxJQUFJLE9BQU8sQ0FBQyxhQUFhO1FBQzlCLENBQUMsQ0FBQyxPQUFPLENBQUMsYUFBYTtRQUN2QixDQUFDLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxhQUFhLENBQ2hDLENBQUM7SUFFVCxJQUFJLFVBQVUsR0FBVyxFQUFFLENBQUM7SUFFNUIsTUFBTSxRQUFRLEdBQUcsT0FBTyxDQUFDLHdCQUF3QixDQUMvQyxhQUFhLEVBQ2IsaUJBQWlCLENBQ2xCLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQztJQUVyQixJQUFJLGFBQWEsSUFBSSxhQUFhLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDbEQsVUFBVSxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLGNBQWMsQ0FBQzthQUN0RCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxHQUFHLEtBQUssS0FBSyxHQUFHLENBQUM7YUFDMUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ2QsQ0FBQztJQUVELHFCQUFxQjtJQUNyQixNQUFNLFVBQVUsR0FDZCxPQUFPLElBQUksT0FBTyxDQUFDLGFBQWE7UUFDOUIsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxhQUFhO1FBQ3ZCLENBQUMsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQztJQUVyQyxxQ0FBcUM7SUFDckMsTUFBTSxHQUFHLEdBQUcsSUFBSSxTQUFTLEVBQUUsQ0FBQyxlQUFlLENBQ3pDLElBQUksUUFBUSxJQUFJLFVBQVUsSUFBSSxVQUFVLENBQUMsU0FBUyxLQUFLLFFBQVEsR0FBRyxFQUNsRSxXQUFXLENBQ1osQ0FBQztJQUVGLE9BQU8sR0FBRyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEMsQ0FBQztBQUVELENBQUMsUUFBUSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsVUFBVSxFQUFFLEVBQUU7SUFDaEMsTUFBTSxnQkFBZ0IsR0FBRyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDekMsT0FBTyxnQkFBZ0IsQ0FBQyxxQkFBcUIsQ0FBQyx3QkFBd0IsRUFBRSxDQUFDLENBQUM7QUFDNUUsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJjb25zdCBlbnYgPSBnbG9iYWxUaGlzIGFzIGFueTtcblxuLyoqXG4gKiBBbGxvd3MgVml0ZXN0IHRvIGhhbmRsZSBBbmd1bGFyIHRlc3QgZml4dHVyZXNcbiAqXG4gKiBWaXRlc3QgU25hcHNob3QgZ3VpZGUgPT0+IGh0dHBzOi8vdml0ZXN0LmRldi9ndWlkZS9zbmFwc2hvdC5odG1sXG4gKlxuICogQHJldHVybnMgY3VzdG9tU25hcHNob3RTZXJpYWxpemVyIGZvciBBbmd1bGFyIEZpeHR1cmUgQ29tcG9uZW50XG4gKi9cbmNvbnN0IGN1c3RvbVNuYXBzaG90U2VyaWFsaXplciA9ICgpID0+IHtcbiAgZnVuY3Rpb24gc2VyaWFsaXplKFxuICAgIHZhbDogYW55LFxuICAgIGNvbmZpZzogYW55LFxuICAgIGluZGVudGF0aW9uOiBhbnksXG4gICAgZGVwdGg6IGFueSxcbiAgICByZWZzOiBhbnksXG4gICAgcHJpbnRlcjogYW55LFxuICApOiBzdHJpbmcge1xuICAgIC8vIGBwcmludGVyYCBpcyBhIGZ1bmN0aW9uIHRoYXQgc2VyaWFsaXplcyBhIHZhbHVlIHVzaW5nIGV4aXN0aW5nIHBsdWdpbnMuXG4gICAgcmV0dXJuIGAke3ByaW50ZXIoXG4gICAgICBmaXh0dXJlVml0ZXN0U2VyaWFsaXplcih2YWwpLFxuICAgICAgY29uZmlnLFxuICAgICAgaW5kZW50YXRpb24sXG4gICAgICBkZXB0aCxcbiAgICAgIHJlZnMsXG4gICAgKX1gO1xuICB9XG4gIGZ1bmN0aW9uIHRlc3QodmFsOiBhbnkpOiBib29sZWFuIHtcbiAgICAvLyAqIElmIGl0J3MgYSBDb21wb25lbnRGaXh0dXJlIHdlIGFwcGx5IHRoZSB0cmFuc2Zvcm1hdGlvbiBydWxlc1xuICAgIHJldHVybiB2YWwgJiYgaXNBbmd1bGFyRml4dHVyZSh2YWwpO1xuICB9XG4gIHJldHVybiB7XG4gICAgc2VyaWFsaXplLFxuICAgIHRlc3QsXG4gIH07XG59O1xuXG4vKipcbiAqIENoZWNrIGlmIGlzIGFuIEFuZ3VsYXIgZml4dHVyZVxuICpcbiAqIEBwYXJhbSB2YWwgQW5ndWxhciBmaXh0dXJlXG4gKiBAcmV0dXJucyBib29sZWFuIHdobyBjaGVjayBpZiBpcyBhbiBhbmd1bGFyIGZpeHR1cmVcbiAqL1xuZnVuY3Rpb24gaXNBbmd1bGFyRml4dHVyZSh2YWw6IGFueSk6IGJvb2xlYW4ge1xuICBpZiAodHlwZW9mIHZhbCAhPT0gJ29iamVjdCcpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAodmFsWydjb21wb25lbnRSZWYnXSB8fCB2YWxbJ2NvbXBvbmVudEluc3RhbmNlJ10pIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGlmICh2YWxbJ2NvbXBvbmVudFR5cGUnXSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLy8gKiBBbmd1bGFyIGZpeHR1cmUga2V5cyBpbiBGaXh0dXJlIGNvbXBvbmVudCBPYmplY3RcbiAgY29uc3QgZml4dHVyZUtleXMgPSBbXG4gICAgJ2NvbXBvbmVudFJlZicsXG4gICAgJ25nWm9uZScsXG4gICAgJ2VmZmVjdFJ1bm5lcicsXG4gICAgJ19hdXRvRGV0ZWN0JyxcbiAgICAnX2lzU3RhYmxlJyxcbiAgICAnX2lzRGVzdHJveWVkJyxcbiAgICAnX3Jlc29sdmUnLFxuICAgICdfcHJvbWlzZScsXG4gICAgJ19vblVuc3RhYmxlU3Vic2NyaXB0aW9uJyxcbiAgICAnX29uU3RhYmxlU3Vic2NyaXB0aW9uJyxcbiAgICAnX29uTWljcm90YXNrRW1wdHlTdWJzY3JpcHRpb24nLFxuICAgICdfb25FcnJvclN1YnNjcmlwdGlvbicsXG4gICAgJ2NoYW5nZURldGVjdG9yUmVmJyxcbiAgICAnZWxlbWVudFJlZicsXG4gICAgJ2RlYnVnRWxlbWVudCcsXG4gICAgJ2NvbXBvbmVudEluc3RhbmNlJyxcbiAgICAnbmF0aXZlRWxlbWVudCcsXG4gIF07XG5cbiAgLy8gKiBBbmd1bGFyIGZpeHR1cmUga2V5cyBpbiBGaXh0dXJlIGNvbXBvbmVudFJlZiBPYmplY3RcbiAgY29uc3QgZml4dHVyZUNvbXBvbmVudFJlZktleXMgPSBbXG4gICAgJ2xvY2F0aW9uJyxcbiAgICAnX3Jvb3RMVmlldycsXG4gICAgJ190Tm9kZScsXG4gICAgJ3ByZXZpb3VzSW5wdXRWYWx1ZXMnLFxuICAgICdpbnN0YW5jZScsXG4gICAgJ2NoYW5nZURldGVjdG9yUmVmJyxcbiAgICAnaG9zdFZpZXcnLFxuICAgICdjb21wb25lbnRUeXBlJyxcbiAgXTtcblxuICByZXR1cm4gKFxuICAgIEpTT04uc3RyaW5naWZ5KE9iamVjdC5rZXlzKHZhbCkpID09PSBKU09OLnN0cmluZ2lmeShmaXh0dXJlS2V5cykgfHxcbiAgICBKU09OLnN0cmluZ2lmeShPYmplY3Qua2V5cyh2YWwpKSA9PT0gSlNPTi5zdHJpbmdpZnkoZml4dHVyZUNvbXBvbmVudFJlZktleXMpXG4gICk7XG59XG5cbi8qKlxuICogU2VyaWFsaXplIEFuZ3VsYXIgZml4dHVyZSBmb3IgVml0ZXN0XG4gKlxuICogQHBhcmFtIGZpeHR1cmUgQW5ndWxhciBGaXh0dXJlIENvbXBvbmVudFxuICogQHJldHVybnMgSFRNTCBDaGlsZCBOb2RlXG4gKi9cbmZ1bmN0aW9uIGZpeHR1cmVWaXRlc3RTZXJpYWxpemVyKGZpeHR1cmU6IGFueSkge1xuICAvLyAqIEdldCBDb21wb25lbnQgbWV0YSBkYXRhXG4gIGNvbnN0IGNvbXBvbmVudFR5cGUgPSAoXG4gICAgZml4dHVyZSAmJiBmaXh0dXJlLmNvbXBvbmVudFR5cGVcbiAgICAgID8gZml4dHVyZS5jb21wb25lbnRUeXBlXG4gICAgICA6IGZpeHR1cmUuY29tcG9uZW50UmVmLmNvbXBvbmVudFR5cGVcbiAgKSBhcyBhbnk7XG5cbiAgbGV0IGlucHV0c0RhdGE6IHN0cmluZyA9ICcnO1xuXG4gIGNvbnN0IHNlbGVjdG9yID0gUmVmbGVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoXG4gICAgY29tcG9uZW50VHlwZSxcbiAgICAnX19hbm5vdGF0aW9uc19fJyxcbiAgKT8udmFsdWVbMF0uc2VsZWN0b3I7XG5cbiAgaWYgKGNvbXBvbmVudFR5cGUgJiYgY29tcG9uZW50VHlwZS5wcm9wRGVjb3JhdG9ycykge1xuICAgIGlucHV0c0RhdGEgPSBPYmplY3QuZW50cmllcyhjb21wb25lbnRUeXBlLnByb3BEZWNvcmF0b3JzKVxuICAgICAgLm1hcCgoW2tleSwgdmFsdWVdKSA9PiBgJHtrZXl9PVwiJHt2YWx1ZX1cImApXG4gICAgICAuam9pbignJyk7XG4gIH1cblxuICAvLyAqIEdldCBET00gRWxlbWVudHNcbiAgY29uc3QgZGl2RWxlbWVudCA9XG4gICAgZml4dHVyZSAmJiBmaXh0dXJlLm5hdGl2ZUVsZW1lbnRcbiAgICAgID8gZml4dHVyZS5uYXRpdmVFbGVtZW50XG4gICAgICA6IGZpeHR1cmUubG9jYXRpb24ubmF0aXZlRWxlbWVudDtcblxuICAvLyAqIENvbnZlcnQgc3RyaW5nIGRhdGEgdG8gSFRNTCBkYXRhXG4gIGNvbnN0IGRvYyA9IG5ldyBET01QYXJzZXIoKS5wYXJzZUZyb21TdHJpbmcoXG4gICAgYDwke3NlbGVjdG9yfSAke2lucHV0c0RhdGF9PiR7ZGl2RWxlbWVudC5pbm5lckhUTUx9PC8ke3NlbGVjdG9yfT5gLFxuICAgICd0ZXh0L2h0bWwnLFxuICApO1xuXG4gIHJldHVybiBkb2MuYm9keS5jaGlsZE5vZGVzWzBdO1xufVxuXG5bJ2V4cGVjdCddLmZvckVhY2goKG1ldGhvZE5hbWUpID0+IHtcbiAgY29uc3Qgb3JpZ2luYWx2aXRlc3RGbiA9IGVudlttZXRob2ROYW1lXTtcbiAgcmV0dXJuIG9yaWdpbmFsdml0ZXN0Rm4uYWRkU25hcHNob3RTZXJpYWxpemVyKGN1c3RvbVNuYXBzaG90U2VyaWFsaXplcigpKTtcbn0pO1xuIl19
;