UNPKG

@analogjs/vitest-angular

Version:

Vitest Builder for Angular

95 lines 10.9 kB
/** * 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=