diff --git a/packages/generators/init-template/default/webpack.configjs.tpl b/packages/generators/init-template/default/webpack.configjs.tpl index e695d21dd5b..e28bd23cb96 100644 --- a/packages/generators/init-template/default/webpack.configjs.tpl +++ b/packages/generators/init-template/default/webpack.configjs.tpl @@ -25,39 +25,32 @@ module.exports = { { test: /\\.(js|jsx)$/, loader: 'babel-loader', - }, -<% } %><% if (langType == "Typescript") { %> + },<% } %><% if (langType == "Typescript") { %> { test: /\\.(ts|tsx)$/, loader: 'ts-loader', exclude: ['/node_modules/'], - }, -<% } %><% if (cssType == 'CSS') { %> + },<% } %><% if (isCSS && !isPostCSS) { %> { test: /\.css$/i, - use: ['style-loader', 'css-loader'], - }, -<% } %><% if (cssType == 'SASS') { %> + use: ['style-loader','css-loader'], + },<% } %><% if (cssType == 'SASS') { %> { test: /\.s[ac]ss$/i, - use: ['style-loader', 'css-loader', 'sass-loader'], - }, -<% } %><% if (cssType == 'LESS') { %> + use: ['style-loader', 'css-loader', <% if (isPostCSS) { %>'postcss-loader', <% } %>'sass-loader'], + },<% } %><% if (cssType == 'LESS') { %> { test: /\.less$/i, - loader: 'less-loader', - }, -<% } %><% if (cssType == 'Stylus') { %> + use: [<% if (isPostCSS) { %>'style-loader', 'css-loader', 'postcss-loader', <% } %>'less-loader'], + },<% } %><% if (cssType == 'Stylus') { %> { test: /\.styl$/, - loader: 'stylus-loader', - }, -<% } %><% if (cssType == 'PostCSS') { %> + use: [<% if (isPostCSS) { %>'style-loader', 'css-loader', 'postcss-loader', <% } %>'stylus-loader'], + },<% } %><% if (isPostCSS && isCSS) { %> { test: /\.css$/i, use: ['style-loader', 'css-loader', 'postcss-loader'], - }, -<% } %> + },<% } %> { test: /\.(eot|svg|ttf|woff|woff2|png|jpg|gif)$/, type: 'asset', diff --git a/packages/generators/src/handlers/default.ts b/packages/generators/src/handlers/default.ts index cdb4d8f2e28..588f4b2db1e 100644 --- a/packages/generators/src/handlers/default.ts +++ b/packages/generators/src/handlers/default.ts @@ -51,20 +51,38 @@ export async function questions(self: CustomGenerator, Question: Record { const { stdout, stderr } = await runPromptWithAnswers( assetsPath, ['init'], - [`${ENTER}`, `n${ENTER}`, `n${ENTER}`, `${DOWN}${DOWN}${ENTER}`], + [`${ENTER}`, `n${ENTER}`, `n${ENTER}`, `${DOWN}${DOWN}${ENTER}`, `n${ENTER}`, `n${ENTER}`], ); expect(stdout).toContain('Project has been initialised with webpack!'); expect(stderr).toContain('webpack.config.js'); @@ -190,11 +190,55 @@ describe('init command', () => { expect(readFromWebpackConfig(assetsPath)).toMatchSnapshot(); }); + it('should use sass with postcss in project when selected', async () => { + const { stdout, stderr } = await runPromptWithAnswers( + assetsPath, + ['init'], + [`${ENTER}`, `n${ENTER}`, `n${ENTER}`, `${DOWN}${DOWN}${ENTER}`, `n${ENTER}`, `y${ENTER}`], + ); + expect(stdout).toContain('Project has been initialised with webpack!'); + expect(stderr).toContain('webpack.config.js'); + + // Test files + const files = ['package.json', 'src', 'src/index.js', 'webpack.config.js', 'postcss.config.js']; + files.forEach((file) => { + expect(existsSync(resolve(assetsPath, file))).toBeTruthy(); + }); + + // Check if the generated package.json file content matches the snapshot + expect(readFromPkgJSON(assetsPath)).toMatchSnapshot(); + + // Check if the generated webpack configuration matches the snapshot + expect(readFromWebpackConfig(assetsPath)).toMatchSnapshot(); + }); + + it('should use sass and css with postcss in project when selected', async () => { + const { stdout, stderr } = await runPromptWithAnswers( + assetsPath, + ['init'], + [`${ENTER}`, `n${ENTER}`, `n${ENTER}`, `${DOWN}${DOWN}${ENTER}`, `y${ENTER}`, `y${ENTER}`], + ); + expect(stdout).toContain('Project has been initialised with webpack!'); + expect(stderr).toContain('webpack.config.js'); + + // Test files + const files = ['package.json', 'src', 'src/index.js', 'webpack.config.js', 'postcss.config.js']; + files.forEach((file) => { + expect(existsSync(resolve(assetsPath, file))).toBeTruthy(); + }); + + // Check if the generated package.json file content matches the snapshot + expect(readFromPkgJSON(assetsPath)).toMatchSnapshot(); + + // Check if the generated webpack configuration matches the snapshot + expect(readFromWebpackConfig(assetsPath)).toMatchSnapshot(); + }); + it('should use less in project when selected', async () => { const { stdout, stderr } = await runPromptWithAnswers( assetsPath, ['init'], - [`${ENTER}`, `n${ENTER}`, `n${ENTER}`, `${DOWN}${DOWN}${DOWN}${ENTER}`], + [`${ENTER}`, `n${ENTER}`, `n${ENTER}`, `${DOWN}${DOWN}${DOWN}${ENTER}`, `n${ENTER}`, `n${ENTER}`], ); expect(stdout).toContain('Project has been initialised with webpack!'); expect(stderr).toContain('webpack.config.js'); @@ -216,7 +260,7 @@ describe('init command', () => { const { stdout, stderr } = await runPromptWithAnswers( assetsPath, ['init'], - [`${ENTER}`, `n${ENTER}`, `n${ENTER}`, `${DOWN}${DOWN}${DOWN}${DOWN}${ENTER}`], + [`${ENTER}`, `n${ENTER}`, `n${ENTER}`, `${DOWN}${DOWN}${DOWN}${DOWN}${ENTER}`, `n${ENTER}`, `n${ENTER}`], ); expect(stdout).toContain('Project has been initialised with webpack!'); expect(stderr).toContain('webpack.config.js'); @@ -257,7 +301,7 @@ describe('init command', () => { const { stdout, stderr } = await runPromptWithAnswers( assetsPath, ['init'], - [`${ENTER}`, `n${ENTER}`, `n${ENTER}`, `${DOWN}${DOWN}${DOWN}${DOWN}${DOWN}${ENTER}`], + [`${ENTER}`, `n${ENTER}`, `n${ENTER}`, `${DOWN}${ENTER}`, ENTER], ); expect(stdout).toContain('Project has been initialised with webpack!'); expect(stderr).toContain('webpack.config.js');