@analogjs/vitest-angular
Version:
Vitest Builder for Angular
75 lines • 11.9 kB
JavaScript
const CLEANED_ELEMENT_MARKER = '__analogSnapshotCleaned__';
export const attributesToRemovePatterns = [
'ng-reflect',
'_nghost',
'_ngcontent',
'ng-version',
];
export const attributesToClean = {
class: [/^(?:mat|cdk|ng).*-\w*\d+-\d+$/, /^ng-star-inserted$/],
id: [/^(?:mat|cdk|ng).*-\w*\d+$/],
for: [/^(?:mat|cdk|ng).*-\d+$/],
'aria-owns': [/^(?:mat|cdk|ng).*-\d+$/],
'aria-labelledby': [/^(?:mat|cdk|ng).*-\d+$/],
'aria-controls': [/^(?:mat|cdk|ng).*-\d+$/],
'aria-describedby': [/^(?:mat|cdk|ng).*-\d+$/],
};
const hasAttributesToRemove = (attribute) => attributesToRemovePatterns.some((removePattern) => attribute.name.startsWith(removePattern));
const hasAttributesToClean = (attribute) => Object.prototype.hasOwnProperty.call(attributesToClean, attribute.name);
const attributeNeedsCleaning = (attribute) => hasAttributesToClean(attribute) &&
attribute.value
.split(' ')
.some((attrValue) => attributesToClean[attribute.name].some((attributeCleanRegex) => attributeCleanRegex.test(attrValue)));
const shouldSerializeElement = (node) => {
if (node.parentElement?.tagName === 'BODY' && node.hasAttribute('id')) {
return true;
}
return Array.from(node.attributes).some((attribute) => hasAttributesToRemove(attribute) || attributeNeedsCleaning(attribute));
};
function cleanAngularElementAttributes(node) {
const nodeCopy = node.cloneNode(true);
Object.defineProperty(nodeCopy, CLEANED_ELEMENT_MARKER, {
configurable: true,
value: true,
});
if (node.parentElement?.tagName === 'BODY') {
nodeCopy.removeAttribute('id');
}
Array.from(nodeCopy.attributes).forEach((attribute) => {
if (hasAttributesToRemove(attribute)) {
nodeCopy.removeAttribute(attribute.name);
return;
}
if (hasAttributesToClean(attribute)) {
const cleanedValue = attribute.value
.split(' ')
.filter((attrValue) => !attributesToClean[attribute.name].some((attributeCleanRegex) => attributeCleanRegex.test(attrValue)))
.join(' ');
if (cleanedValue === '') {
nodeCopy.removeAttribute(attribute.name);
return;
}
nodeCopy.setAttribute(attribute.name, cleanedValue);
}
});
return nodeCopy;
}
export function createNoNgAttributesSnapshotSerializer() {
return {
serialize(val, config, indentation, depth, refs, printer) {
const cleanedNode = cleanAngularElementAttributes(val);
if (shouldSerializeElement(cleanedNode)) {
throw new Error(`NoNgAttributes serializer did not stabilize for <${cleanedNode.tagName.toLowerCase()}>`);
}
return printer(cleanedNode, config, indentation, depth, refs);
},
test(val) {
const matches = typeof Element !== 'undefined' &&
val instanceof Element &&
!val[CLEANED_ELEMENT_MARKER] &&
shouldSerializeElement(val);
return matches;
},
};
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm8tbmctYXR0cmlidXRlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL3ZpdGVzdC1hbmd1bGFyL3NyYy9saWIvc25hcHNob3Qtc2VyaWFsaXplcnMvbm8tbmctYXR0cmlidXRlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxNQUFNLHNCQUFzQixHQUFHLDJCQUEyQixDQUFDO0FBRTNELE1BQU0sQ0FBQyxNQUFNLDBCQUEwQixHQUFHO0lBQ3hDLFlBQVk7SUFDWixTQUFTO0lBQ1QsWUFBWTtJQUNaLFlBQVk7Q0FDYixDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0saUJBQWlCLEdBQTZCO0lBQ3pELEtBQUssRUFBRSxDQUFDLCtCQUErQixFQUFFLG9CQUFvQixDQUFDO0lBQzlELEVBQUUsRUFBRSxDQUFDLDJCQUEyQixDQUFDO0lBQ2pDLEdBQUcsRUFBRSxDQUFDLHdCQUF3QixDQUFDO0lBQy9CLFdBQVcsRUFBRSxDQUFDLHdCQUF3QixDQUFDO0lBQ3ZDLGlCQUFpQixFQUFFLENBQUMsd0JBQXdCLENBQUM7SUFDN0MsZUFBZSxFQUFFLENBQUMsd0JBQXdCLENBQUM7SUFDM0Msa0JBQWtCLEVBQUUsQ0FBQyx3QkFBd0IsQ0FBQztDQUMvQyxDQUFDO0FBRUYsTUFBTSxxQkFBcUIsR0FBRyxDQUFDLFNBQWUsRUFBVyxFQUFFLENBQ3pELDBCQUEwQixDQUFDLElBQUksQ0FBQyxDQUFDLGFBQWEsRUFBRSxFQUFFLENBQ2hELFNBQVMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxDQUN6QyxDQUFDO0FBRUosTUFBTSxvQkFBb0IsR0FBRyxDQUFDLFNBQWUsRUFBVyxFQUFFLENBQ3hELE1BQU0sQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7QUFFMUUsTUFBTSxzQkFBc0IsR0FBRyxDQUFDLFNBQWUs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TUFBTSxJQUFJLEtBQUssQ0FDYixvREFBb0QsV0FBVyxDQUFDLE9BQU8sQ0FBQyxXQUFXLEVBQUUsR0FBRyxDQUN6RixDQUFDO1lBQ0osQ0FBQztZQUVELE9BQU8sT0FBTyxDQUFDLFdBQVcsRUFBRSxNQUFNLEVBQUUsV0FBVyxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQztRQUNoRSxDQUFDO1FBQ0QsSUFBSSxDQUFDLEdBQUc7WUFDTixNQUFNLE9BQU8sR0FDWCxPQUFPLE9BQU8sS0FBSyxXQUFXO2dCQUM5QixHQUFHLFlBQVksT0FBTztnQkFDdEIsQ0FBRSxHQUF5QyxDQUFDLHNCQUFzQixDQUFDO2dCQUNuRSxzQkFBc0IsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUU5QixPQUFPLE9BQU8sQ0FBQztRQUNqQixDQUFDO0tBQ0YsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyB0eXBlIFNuYXBzaG90U2VyaWFsaXplciB9IGZyb20gJ3ZpdGVzdCc7XG5cbmNvbnN0IENMRUFORURfRUxFTUVOVF9NQVJLRVIgPSAnX19hbmFsb2dTbmFwc2hvdENsZWFuZWRfXyc7XG5cbmV4cG9ydCBjb25zdCBhdHRyaWJ1dGVzVG9SZW1vdmVQYXR0ZXJucyA9IFtcbiAgJ25nLXJlZmxlY3QnLFxuICAnX25naG9zdCcsXG4gICdfbmdjb250ZW50JyxcbiAgJ25nLXZlcnNpb24nLFxuXTtcblxuZXhwb3J0IGNvbnN0IGF0dHJpYnV0ZXNUb0NsZWFuOiBSZWNvcmQ8c3RyaW5nLCBSZWdFeHBbXT4gPSB7XG4gIGNsYXNzOiBbL14oPzptYXR8Y2RrfG5nKS4qLVxcdypcXGQrLVxcZCskLywgL15uZy1zdGFyLWluc2VydGVkJC9dLFxuICBpZDogWy9eKD86bWF0fGNka3xuZykuKi1cXHcqXFxkKyQvXSxcbiAgZm9yOiBbL14oPzptYXR8Y2RrfG5nKS4qLVxcZCskL10sXG4gICdhcmlhLW93bnMnOiBbL14oPzptYXR8Y2RrfG5nKS4qLVxcZCskL10sXG4gICdhcmlhLWxhYmVsbGVkYnknOiBbL14oPzptYXR8Y2RrfG5nKS4qLVxcZCskL10sXG4gICdhcmlhLWNvbnRyb2xzJzogWy9eKD86bWF0fGNka3xuZykuKi1cXGQrJC9dLFxuICAnYXJpYS1kZXNjcmliZWRieSc6IFsvXig/Om1hdHxjZGt8bmcpLiotXFxkKyQvXSxcbn07XG5cbmNvbnN0IGhhc0F0dHJpYnV0ZXNUb1JlbW92ZSA9IChhdHRyaWJ1dGU6IEF0dHIpOiBib29sZWFuID0+XG4gIGF0dHJpYnV0ZXNUb1JlbW92ZVBhdHRlcm5zLnNvbWUoKHJlbW92ZVBhdHRlcm4pID0+XG4gICAgYXR0cmlidXRlLm5hbWUuc3RhcnRzV2l0aChyZW1vdmVQYXR0ZXJuKSxcbiAgKTtcblxuY29uc3QgaGFzQXR0cmlidXRlc1RvQ2xlYW4gPSAoYXR0cmlidXRlOiBBdHRyKTogYm9vbGVhbiA9PlxuICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYXR0cmlidXRlc1RvQ2xlYW4sIGF0dHJpYnV0ZS5uYW1lKTtcblxuY29uc3QgYXR0cmlidXRlTmVlZHNDbGVhbmluZyA9IChhdHRyaWJ1dGU6IEF0dHIpOiBib29sZWFuID0+XG4gIGhhc0F0dHJpYnV0ZXNUb0NsZWFuKGF0dHJpYnV0ZSkgJiZcbiAgYXR0cmlidXRlLnZhbHVlXG4gICAgLnNwbGl0KCcgJylcbiAgICAuc29tZSgoYXR0clZhbHVlKSA9PlxuICAgICAgYXR0cmlidXRlc1RvQ2xlYW5bYXR0cmlidXRlLm5hbWVdLnNvbWUoKGF0dHJpYnV0ZUNsZWFuUmVnZXgpID0+XG4gICAgICAgIGF0dHJpYnV0ZUNsZWFuUmVnZXgudGVzdChhdHRyVmFsdWUpLFxuICAgICAgKSxcbiAgICApO1xuXG5jb25zdCBzaG91bGRTZXJpYWxpemVFbGVtZW50ID0gKG5vZGU6IEVsZW1lbnQpOiBib29sZWFuID0+IHtcbiAgaWYgKG5vZGUucGFyZW50RWxlbWVudD8udGFnTmFtZSA9PT0gJ0JPRFknICYmIG5vZGUuaGFzQXR0cmlidXRlKCdpZCcpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICByZXR1cm4gQXJyYXkuZnJvbShub2RlLmF0dHJpYnV0ZXMpLnNvbWUoXG4gICAgKGF0dHJpYnV0ZSkgPT5cbiAgICAgIGhhc0F0dHJpYnV0ZXNUb1JlbW92ZShhdHRyaWJ1dGUpIHx8IGF0dHJpYnV0ZU5lZWRzQ2xlYW5pbmcoYXR0cmlidXRlKSxcbiAgKTtcbn07XG5cbmZ1bmN0aW9uIGNsZWFuQW5ndWxhckVsZW1lbnRBdHRyaWJ1dGVzKG5vZGU6IEVsZW1lbnQpOiBFbGVtZW50IHtcbiAgY29uc3Qgbm9kZUNvcHkgPSBub2RlLmNsb25lTm9kZSh0cnVlKSBhcyBFbGVtZW50O1xuXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShub2RlQ29weSwgQ0xFQU5FRF9FTEVNRU5UX01BUktFUiwge1xuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICB2YWx1ZTogdHJ1ZSxcbiAgfSk7XG5cbiAgaWYgKG5vZGUucGFyZW50RWxlbWVudD8udGFnTmFtZSA9PT0gJ0JPRFknKSB7XG4gICAgbm9kZUNvcHkucmVtb3ZlQXR0cmlidXRlKCdpZCcpO1xuICB9XG5cbiAgQXJyYXkuZnJvbShub2RlQ29weS5hdHRyaWJ1dGVzKS5mb3JFYWNoKChhdHRyaWJ1dGUpID0+IHtcbiAgICBpZiAoaGFzQXR0cmlidXRlc1RvUmVtb3ZlKGF0dHJpYnV0ZSkpIHtcbiAgICAgIG5vZGVDb3B5LnJlbW92ZUF0dHJpYnV0ZShhdHRyaWJ1dGUubmFtZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGhhc0F0dHJpYnV0ZXNUb0NsZWFuKGF0dHJpYnV0ZSkpIHtcbiAgICAgIGNvbnN0IGNsZWFuZWRWYWx1ZSA9IGF0dHJpYnV0ZS52YWx1ZVxuICAgICAgICAuc3BsaXQoJyAnKVxuICAgICAgICAuZmlsdGVyKFxuICAgICAgICAgIChhdHRyVmFsdWUpID0+XG4gICAgICAgICAgICAhYXR0cmlidXRlc1RvQ2xlYW5bYXR0cmlidXRlLm5hbWVdLnNvbWUoKGF0dHJpYnV0ZUNsZWFuUmVnZXgpID0+XG4gICAgICAgICAgICAgIGF0dHJpYnV0ZUNsZWFuUmVnZXgudGVzdChhdHRyVmFsdWUpLFxuICAgICAgICAgICAgKSxcbiAgICAgICAgKVxuICAgICAgICAuam9pbignICcpO1xuXG4gICAgICBpZiAoY2xlYW5lZFZhbHVlID09PSAnJykge1xuICAgICAgICBub2RlQ29weS5yZW1vdmVBdHRyaWJ1dGUoYXR0cmlidXRlLm5hbWUpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIG5vZGVDb3B5LnNldEF0dHJpYnV0ZShhdHRyaWJ1dGUubmFtZSwgY2xlYW5lZFZhbHVlKTtcbiAgICB9XG4gIH0pO1xuXG4gIHJldHVybiBub2RlQ29weTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZU5vTmdBdHRyaWJ1dGVzU25hcHNob3RTZXJpYWxpemVyKCk6IFNuYXBzaG90U2VyaWFsaXplciB7XG4gIHJldHVybiB7XG4gICAgc2VyaWFsaXplKHZhbCwgY29uZmlnLCBpbmRlbnRhdGlvbiwgZGVwdGgsIHJlZnMsIHByaW50ZXIpOiBzdHJpbmcge1xuICAgICAgY29uc3QgY2xlYW5lZE5vZGUgPSBjbGVhbkFuZ3VsYXJFbGVtZW50QXR0cmlidXRlcyh2YWwpO1xuXG4gICAgICBpZiAoc2hvdWxkU2VyaWFsaXplRWxlbWVudChjbGVhbmVkTm9kZSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBOb05nQXR0cmlidXRlcyBzZXJpYWxpemVyIGRpZCBub3Qgc3RhYmlsaXplIGZvciA8JHtjbGVhbmVkTm9kZS50YWdOYW1lLnRvTG93ZXJDYXNlKCl9PmAsXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBwcmludGVyKGNsZWFuZWROb2RlLCBjb25maWcsIGluZGVudGF0aW9uLCBkZXB0aCwgcmVmcyk7XG4gICAgfSxcbiAgICB0ZXN0KHZhbCk6IGJvb2xlYW4ge1xuICAgICAgY29uc3QgbWF0Y2hlcyA9XG4gICAgICAgIHR5cGVvZiBFbGVtZW50ICE9PSAndW5kZWZpbmVkJyAmJlxuICAgICAgICB2YWwgaW5zdGFuY2VvZiBFbGVtZW50ICYmXG4gICAgICAgICEodmFsIGFzIEVsZW1lbnQgJiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilbQ0xFQU5FRF9FTEVNRU5UX01BUktFUl0gJiZcbiAgICAgICAgc2hvdWxkU2VyaWFsaXplRWxlbWVudCh2YWwpO1xuXG4gICAgICByZXR1cm4gbWF0Y2hlcztcbiAgICB9LFxuICB9O1xufVxuIl19