UNPKG

@analogjs/vitest-angular

Version:

Vitest Builder for Angular

104 lines 11.4 kB
"use strict"; 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