Skip to content

Commit 42d72ef

Browse files
committed
fix(@angular/build): skip vite transformation of CSS-like assets
This change ensures that Vite's CSS transformation is only applied to actual stylesheets and not assets. Closes #30792 (cherry picked from commit 7a18373)
1 parent 0489fe7 commit 42d72ef

File tree

2 files changed

+44
-2
lines changed

2 files changed

+44
-2
lines changed

packages/angular/build/src/builders/dev-server/tests/behavior/build-assets_spec.ts

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,11 @@ import { describeServeBuilder } from '../jasmine-helpers';
1212
import { BASE_OPTIONS, DEV_SERVER_BUILDER_INFO } from '../setup';
1313

1414
describeServeBuilder(executeDevServer, DEV_SERVER_BUILDER_INFO, (harness, setupTarget) => {
15+
beforeEach(async () => {
16+
// Application code is not needed for these tests
17+
await harness.writeFile('src/main.ts', 'console.log("TEST");');
18+
});
19+
1520
const javascriptFileContent =
1621
"import {foo} from 'unresolved'; /* a comment */const foo = `bar`;\n\n\n";
1722

@@ -53,6 +58,42 @@ describeServeBuilder(executeDevServer, DEV_SERVER_BUILDER_INFO, (harness, setupT
5358
expect(await response?.text()).toContain(javascriptFileContent);
5459
});
5560

61+
it('serves a project CSS asset unmodified', async () => {
62+
const cssFileContent = 'p { color: blue };';
63+
await harness.writeFile('src/extra.css', cssFileContent);
64+
65+
setupTarget(harness, {
66+
assets: ['src/extra.css'],
67+
});
68+
69+
harness.useTarget('serve', {
70+
...BASE_OPTIONS,
71+
});
72+
73+
const { result, response } = await executeOnceAndFetch(harness, 'extra.css');
74+
75+
expect(result?.success).toBeTrue();
76+
expect(await response?.text()).toBe(cssFileContent);
77+
});
78+
79+
it('serves a project SCSS asset unmodified', async () => {
80+
const cssFileContent = 'p { color: blue };';
81+
await harness.writeFile('src/extra.scss', cssFileContent);
82+
83+
setupTarget(harness, {
84+
assets: ['src/extra.scss'],
85+
});
86+
87+
harness.useTarget('serve', {
88+
...BASE_OPTIONS,
89+
});
90+
91+
const { result, response } = await executeOnceAndFetch(harness, 'extra.scss');
92+
93+
expect(result?.success).toBeTrue();
94+
expect(await response?.text()).toBe(cssFileContent);
95+
});
96+
5697
it('should return 404 for non existing assets', async () => {
5798
setupTarget(harness, {
5899
assets: [],

packages/angular/build/src/tools/vite/middlewares/assets-middleware.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ export interface ComponentStyleRecord {
2020
reload?: boolean;
2121
}
2222

23+
const CSS_PREPROCESSOR_REGEXP = /\.(?:s[ac]ss|less|css)$/;
2324
const JS_TS_REGEXP = /\.[cm]?[tj]sx?$/;
2425

2526
export function createAngularAssetsMiddleware(
@@ -43,8 +44,8 @@ export function createAngularAssetsMiddleware(
4344
// Rewrite all build assets to a vite raw fs URL
4445
const asset = assets.get(pathname);
4546
if (asset) {
46-
// This is a workaround to serve JS and TS files without Vite transformations.
47-
if (JS_TS_REGEXP.test(extension)) {
47+
// This is a workaround to serve CSS, JS and TS files without Vite transformations.
48+
if (JS_TS_REGEXP.test(extension) || CSS_PREPROCESSOR_REGEXP.test(extension)) {
4849
const contents = readFileSync(asset.source);
4950
const etag = `W/${createHash('sha256').update(contents).digest('hex')}`;
5051
if (checkAndHandleEtag(req, res, etag)) {

0 commit comments

Comments
 (0)