From 67c7822ad3dd0aef02af36a2cd8f6265ec72815e Mon Sep 17 00:00:00 2001 From: Jack Hsu Date: Fri, 2 Dec 2022 16:56:23 -0500 Subject: [PATCH] fix(react): add missing style preprocessors when using Vite (#13600) --- docs/generated/packages/vite.json | 6 +++ .../application/application.spec.ts | 28 +++++++++++- .../src/generators/application/application.ts | 4 ++ .../lib/install-common-dependencies.ts | 35 +++++++++++++++ .../generators/component/component.spec.ts | 1 + .../component/files/__fileName__.tsx__tmpl__ | 2 +- .../lib/install-common-dependencies.ts | 44 +++++++++++++++++++ .../src/generators/library/library.spec.ts | 24 ++++++++++ .../react/src/generators/library/library.ts | 19 ++------ packages/react/src/utils/versions.ts | 5 +++ .../generators/configuration/configuration.ts | 1 + .../vite/src/generators/vitest/schema.d.ts | 1 + .../vite/src/generators/vitest/schema.json | 6 +++ .../src/generators/vitest/vitest-generator.ts | 21 +++++++++ .../vite/src/generators/vitest/vitest.spec.ts | 7 +++ packages/vite/src/utils/generator-utils.ts | 3 ++ packages/vite/src/utils/versions.ts | 4 ++ .../src/generators/application/application.ts | 1 + 18 files changed, 195 insertions(+), 17 deletions(-) create mode 100644 packages/react/src/generators/application/lib/install-common-dependencies.ts create mode 100644 packages/react/src/generators/library/lib/install-common-dependencies.ts diff --git a/docs/generated/packages/vite.json b/docs/generated/packages/vite.json index 6c9acaa5e8..5fdfd535c4 100644 --- a/docs/generated/packages/vite.json +++ b/docs/generated/packages/vite.json @@ -124,6 +124,12 @@ "type": "boolean", "default": false, "description": "Skip generating a vite config file" + }, + "coverageProvider": { + "type": "string", + "enum": ["c8", "istanbul"], + "default": "c8", + "description": "Coverage provider to use." } }, "required": ["project"], diff --git a/packages/react/src/generators/application/application.spec.ts b/packages/react/src/generators/application/application.spec.ts index d55676200d..34a8f68f8a 100644 --- a/packages/react/src/generators/application/application.spec.ts +++ b/packages/react/src/generators/application/application.spec.ts @@ -970,7 +970,8 @@ describe('app', () => { describe('setup React app with --bundler=vite', () => { let viteAppTree: Tree; - beforeAll(async () => { + + beforeEach(async () => { viteAppTree = createTreeWithEmptyV1Workspace(); await applicationGenerator(viteAppTree, { ...schema, bundler: 'vite' }); }); @@ -984,6 +985,7 @@ describe('app', () => { buildTarget: 'my-app:build', }); }); + it('should add dependencies in package.json', () => { const packageJson = readJson(viteAppTree, '/package.json'); @@ -1020,6 +1022,30 @@ describe('app', () => { viteAppTree.exists('/apps/insourceTests/src/app/app.spec.tsx') ).toBe(false); }); + + it.each` + style | pkg + ${'less'} | ${'less'} + ${'scss'} | ${'sass'} + ${'styl'} | ${'stylus'} + `( + 'should add style preprocessor when vite is used', + async ({ style, pkg }) => { + await applicationGenerator(viteAppTree, { + ...schema, + style, + bundler: 'vite', + unitTestRunner: 'vitest', + name: style, + }); + + expect(readJson(viteAppTree, 'package.json')).toMatchObject({ + devDependencies: { + [pkg]: expect.any(String), + }, + }); + } + ); }); describe('setting generator defaults', () => { diff --git a/packages/react/src/generators/application/application.ts b/packages/react/src/generators/application/application.ts index c6c88fc462..b3ca1a78c5 100644 --- a/packages/react/src/generators/application/application.ts +++ b/packages/react/src/generators/application/application.ts @@ -31,6 +31,7 @@ import { swcCoreVersion, swcLoaderVersion, } from '../../utils/versions'; +import { installCommonDependencies } from './lib/install-common-dependencies'; async function addLinting(host: Tree, options: NormalizedSchema) { const tasks: GeneratorCallback[] = []; @@ -122,6 +123,7 @@ export async function applicationGenerator(host: Tree, schema: Schema) { const vitestTask = await vitestGenerator(host, { uiFramework: 'react', + coverageProvider: 'c8', project: options.projectName, inSourceTests: options.inSourceTests, }); @@ -153,6 +155,8 @@ export async function applicationGenerator(host: Tree, schema: Schema) { // Handle tsconfig.spec.json for jest or vitest updateSpecConfig(host, options); + const stylePreprocessorTask = installCommonDependencies(host, options); + tasks.push(stylePreprocessorTask); const styledTask = addStyledModuleDependencies(host, options.styledModule); tasks.push(styledTask); const routingTask = addRouting(host, options); diff --git a/packages/react/src/generators/application/lib/install-common-dependencies.ts b/packages/react/src/generators/application/lib/install-common-dependencies.ts new file mode 100644 index 0000000000..17cf8ea21d --- /dev/null +++ b/packages/react/src/generators/application/lib/install-common-dependencies.ts @@ -0,0 +1,35 @@ +import { addDependenciesToPackageJson, Tree } from '@nrwl/devkit'; +import { + lessVersion, + sassVersion, + stylusVersion, +} from '../../../utils/versions'; +import { NormalizedSchema } from '../schema'; + +export function installCommonDependencies( + host: Tree, + options: NormalizedSchema +) { + let devDependencies = null; + + // Vite requires style preprocessors to be installed manually. + // `@nrwl/webpack` installs them automatically for now. + // TODO(jack): Once we clean up webpack we can remove this check + if (options.bundler === 'vite' || options.unitTestRunner === 'vitest') { + switch (options.style) { + case 'scss': + devDependencies = { sass: sassVersion }; + break; + case 'less': + devDependencies = { less: lessVersion }; + break; + case 'styl': + devDependencies = { stylus: stylusVersion }; + break; + } + } + + return devDependencies + ? addDependenciesToPackageJson(host, {}, devDependencies) + : function noop() {}; +} diff --git a/packages/react/src/generators/component/component.spec.ts b/packages/react/src/generators/component/component.spec.ts index 8e9727e9fc..27e097981d 100644 --- a/packages/react/src/generators/component/component.spec.ts +++ b/packages/react/src/generators/component/component.spec.ts @@ -312,6 +312,7 @@ describe('component', () => { .read('libs/my-lib/src/lib/hello/hello.tsx') .toString(); expect(content).toContain('