fix(angular): remove unnecessary addition of module file extensions (#7725)

This commit is contained in:
Jason Jean 2021-11-12 16:36:59 -05:00 committed by GitHub
parent 24bbb848eb
commit 18f2e703dd
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 5 additions and 226 deletions

View File

@ -21,6 +21,5 @@ transformIgnorePatterns: ['node_modules/(?!.*\\\\.mjs$)'],
'jest-preset-angular/build/serializers/ng-snapshot', 'jest-preset-angular/build/serializers/ng-snapshot',
'jest-preset-angular/build/serializers/html-comment', 'jest-preset-angular/build/serializers/html-comment',
], ],
};"
moduleFileExtensions: ['mjs', 'ts', 'js', 'html'], };"
`; `;

View File

@ -100,7 +100,6 @@ snapshotSerializers: [
'jest-preset-angular/build/serializers/ng-snapshot', 'jest-preset-angular/build/serializers/ng-snapshot',
'jest-preset-angular/build/serializers/html-comment', 'jest-preset-angular/build/serializers/html-comment',
], ],
moduleFileExtensions: ['mjs', 'ts', 'js', 'html'],
};" };"
`); `);
}); });
@ -155,7 +154,6 @@ snapshotSerializers: [
'jest-preset-angular/build/serializers/ng-snapshot', 'jest-preset-angular/build/serializers/ng-snapshot',
'jest-preset-angular/build/serializers/html-comment', 'jest-preset-angular/build/serializers/html-comment',
], ],
moduleFileExtensions: ['mjs', 'ts', 'js', 'html'],
};" };"
`); `);
}); });
@ -200,7 +198,6 @@ transform: {
'^.+\\\\.(ts|mjs|js|html)$': 'jest-preset-angular', '^.+\\\\.(ts|mjs|js|html)$': 'jest-preset-angular',
}, },
transformIgnorePatterns: ['node_modules/(?!.*\\\\.mjs$)'], transformIgnorePatterns: ['node_modules/(?!.*\\\\.mjs$)'],
moduleFileExtensions: ['mjs', 'ts', 'js', 'html'],
};" };"
`); `);
}); });
@ -249,165 +246,4 @@ transform: {
" "
`); `);
}); });
it('should add the mjs extension to a config with existing moduleFileExtensions property', () => {
// ARRANGE
const jestConfig = `module.exports = {
preset: '../../jest.preset.js',
coverageDirectory: '../../coverage/libs/common-platform',
moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx', 'html'],
setupFilesAfterEnv: ['<rootDir>/src/test-setup.ts'],
transform: {
'^.+\\.(ts|js|html)$': 'jest-preset-angular',
},
globals: {
'ts-jest': {
stringifyContentPathRegex: '\\\\.(html|svg)$',
astTransformers: [
'jest-preset-angular/build/InlineFilesTransformer',
'jest-preset-angular/build/StripStylesTransformer',
],
tsconfig: '<rootDir>/tsconfig.spec.json',
},
},
displayName: 'common-platform',
};
`;
// ACT
const updatedFile = replaceTransformAndAddIgnorePattern(jestConfig);
// ASSERT
expect(updatedFile).toMatchInlineSnapshot(`
"module.exports = {
preset: '../../jest.preset.js',
coverageDirectory: '../../coverage/libs/common-platform',
moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx', 'html', 'mjs'],
setupFilesAfterEnv: ['<rootDir>/src/test-setup.ts'],
transform: {
'^.+\\\\.(ts|mjs|js|html)$': 'jest-preset-angular',
},
transformIgnorePatterns: ['node_modules/(?!.*\\\\.mjs$)'],
globals: {
'ts-jest': {
stringifyContentPathRegex: '\\\\\\\\.(html|svg)$',
astTransformers: [
'jest-preset-angular/build/InlineFilesTransformer',
'jest-preset-angular/build/StripStylesTransformer',
],
tsconfig: '<rootDir>/tsconfig.spec.json',
},
},
displayName: 'common-platform',
};
"
`);
});
it('should not add the mjs extension to a config with existing moduleFileExtensions property with mjs extension', () => {
// ARRANGE
const jestConfig = `module.exports = {
preset: '../../jest.preset.js',
coverageDirectory: '../../coverage/libs/common-platform',
moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx', 'html', 'mjs'],
setupFilesAfterEnv: ['<rootDir>/src/test-setup.ts'],
transform: {
'^.+\\.(ts|js|html)$': 'jest-preset-angular',
},
globals: {
'ts-jest': {
stringifyContentPathRegex: '\\\\.(html|svg)$',
astTransformers: [
'jest-preset-angular/build/InlineFilesTransformer',
'jest-preset-angular/build/StripStylesTransformer',
],
tsconfig: '<rootDir>/tsconfig.spec.json',
},
},
displayName: 'common-platform',
};
`;
// ACT
const updatedFile = replaceTransformAndAddIgnorePattern(jestConfig);
// ASSERT
expect(updatedFile).toMatchInlineSnapshot(`
"module.exports = {
preset: '../../jest.preset.js',
coverageDirectory: '../../coverage/libs/common-platform',
moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx', 'html', 'mjs'],
setupFilesAfterEnv: ['<rootDir>/src/test-setup.ts'],
transform: {
'^.+\\\\.(ts|mjs|js|html)$': 'jest-preset-angular',
},
transformIgnorePatterns: ['node_modules/(?!.*\\\\.mjs$)'],
globals: {
'ts-jest': {
stringifyContentPathRegex: '\\\\\\\\.(html|svg)$',
astTransformers: [
'jest-preset-angular/build/InlineFilesTransformer',
'jest-preset-angular/build/StripStylesTransformer',
],
tsconfig: '<rootDir>/tsconfig.spec.json',
},
},
displayName: 'common-platform',
};
"
`);
});
it('should add the moduleFileExtensions property with mjs extension', () => {
// ARRANGE
const jestConfig = `module.exports = {
preset: '../../jest.preset.js',
coverageDirectory: '../../coverage/libs/common-platform',
setupFilesAfterEnv: ['<rootDir>/src/test-setup.ts'],
transform: {
'^.+\\.(ts|js|html)$': 'jest-preset-angular',
},
globals: {
'ts-jest': {
stringifyContentPathRegex: '\\\\.(html|svg)$',
astTransformers: [
'jest-preset-angular/build/InlineFilesTransformer',
'jest-preset-angular/build/StripStylesTransformer',
],
tsconfig: '<rootDir>/tsconfig.spec.json',
},
},
displayName: 'common-platform',
};
`;
// ACT
const updatedFile = replaceTransformAndAddIgnorePattern(jestConfig);
// ASSERT
expect(updatedFile).toMatchInlineSnapshot(`
"module.exports = {
preset: '../../jest.preset.js',
coverageDirectory: '../../coverage/libs/common-platform',
setupFilesAfterEnv: ['<rootDir>/src/test-setup.ts'],
transform: {
'^.+\\\\.(ts|mjs|js|html)$': 'jest-preset-angular',
},
transformIgnorePatterns: ['node_modules/(?!.*\\\\.mjs$)'],
globals: {
'ts-jest': {
stringifyContentPathRegex: '\\\\\\\\.(html|svg)$',
astTransformers: [
'jest-preset-angular/build/InlineFilesTransformer',
'jest-preset-angular/build/StripStylesTransformer',
],
tsconfig: '<rootDir>/tsconfig.spec.json',
},
},
displayName: 'common-platform',
moduleFileExtensions: ['mjs', 'ts', 'js', 'html'], };
"
`);
});
}); });

View File

@ -1,9 +1,5 @@
import type { Tree } from '@nrwl/devkit'; import type { Tree } from '@nrwl/devkit';
import type { import type { Node, PropertyAssignment } from 'typescript';
Node,
ObjectLiteralExpression,
PropertyAssignment,
} from 'typescript';
import { formatFiles, getProjects } from '@nrwl/devkit'; import { formatFiles, getProjects } from '@nrwl/devkit';
import { tsquery } from '@phenomnomnominal/tsquery'; import { tsquery } from '@phenomnomnominal/tsquery';
@ -28,6 +24,8 @@ export default async function (tree: Tree) {
angularProjects[projectName] = [jestConfigPath, jestConfig]; angularProjects[projectName] = [jestConfigPath, jestConfig];
} }
} }
await formatFiles(tree);
} }
for (const [_, [jestConfigPath, jestFileContents]] of Object.entries( for (const [_, [jestConfigPath, jestFileContents]] of Object.entries(
@ -50,7 +48,6 @@ export function replaceTransformAndAddIgnorePattern(fileContents: string) {
return updatedFileContents; return updatedFileContents;
} }
updatedFileContents = updateModuleFileExtenstions(updatedFileContents);
return updatedFileContents; return updatedFileContents;
} }
@ -111,51 +108,3 @@ function updateTransformIgnorePattern(fileContents: string) {
transformEndIndex transformEndIndex
)}${TRANSFORM_IGNORE_PATTERN_STRING}${fileContents.slice(transformEndIndex)}`; )}${TRANSFORM_IGNORE_PATTERN_STRING}${fileContents.slice(transformEndIndex)}`;
} }
function updateModuleFileExtenstions(fileContents: string) {
const MODULE_FILE_EXTENSIONS_AST_QUERY =
'Identifier[name=moduleFileExtensions] ~ ArrayLiteralExpression > StringLiteral';
const MODULE_FILE_EXTENSIONS_STRING = 'mjs';
const MODULE_FILE_EXTENSIONS_FULL_STRING = `moduleFileExtensions: ['mjs', 'ts', 'js', 'html'],`;
const ast = tsquery.ast(fileContents);
const moduleFileExtensionsNodes = tsquery(
ast,
MODULE_FILE_EXTENSIONS_AST_QUERY,
{
visitAllChildren: true,
}
);
if (!moduleFileExtensionsNodes || moduleFileExtensionsNodes.length === 0) {
// add the full property
const insertPosition = fileContents.lastIndexOf('}') - 1;
return `${fileContents.slice(
0,
insertPosition
)}\n${MODULE_FILE_EXTENSIONS_FULL_STRING}${fileContents.slice(
insertPosition
)}`;
}
// check if the extension already exists
const hasExtensionAlready = Boolean(
moduleFileExtensionsNodes.find((node) =>
node.getText().includes(MODULE_FILE_EXTENSIONS_STRING)
)
);
if (hasExtensionAlready) {
return fileContents;
}
// add the extension
const insertPosition =
moduleFileExtensionsNodes[moduleFileExtensionsNodes.length - 1].getEnd();
return `${fileContents.slice(
0,
insertPosition
)}, '${MODULE_FILE_EXTENSIONS_STRING}'${fileContents.slice(insertPosition)}`;
}

View File

@ -8,12 +8,7 @@ module.exports = {
stringifyContentPathRegex: '\\.(html|svg)$', stringifyContentPathRegex: '\\.(html|svg)$',
} }
},<% if(testEnvironment) { %> },<% if(testEnvironment) { %>
testEnvironment: '<%= testEnvironment %>',<% } %><% if(skipSerializers){ %> testEnvironment: '<%= testEnvironment %>',<% } %>
transform: {
<% if (supportTsx){ %>'^.+\\.[tj]sx?$'<% } else { %>'^.+\\.[tj]s$'<% } %>: <% if (transformer == 'babel-jest') { %>'babel-jest'<% } else { %> 'ts-jest' <% } %>
},<% if (supportTsx) { %>
moduleFileExtensions: ['mjs', 'ts', 'tsx', 'js', 'jsx'],<% } else { %>
moduleFileExtensions: ['mjs', 'ts', 'js', 'html'],<% } %><% } %>
coverageDirectory: '<%= offsetFromRoot %>coverage/<%= projectRoot %>', coverageDirectory: '<%= offsetFromRoot %>coverage/<%= projectRoot %>',
transform: { transform: {
'^.+\\.(ts|mjs|js|html)$': 'jest-preset-angular' '^.+\\.(ts|mjs|js|html)$': 'jest-preset-angular'