Skip to content

Commit 235c840

Browse files
committed
fix(@angular-devkit/build-angular): handle regular expressions in proxy config when using Vite
This commit enables proxies to have a RegExp as context when using Vite. See: https://vitejs.dev/config/server-options#server-proxy Closes #26970 (cherry picked from commit 822e7a4)
1 parent a0e3060 commit 235c840

File tree

2 files changed

+63
-2
lines changed

2 files changed

+63
-2
lines changed

packages/angular_devkit/build_angular/src/builders/dev-server/tests/options/proxy-config_spec.ts

+62-1
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,13 @@
77
*/
88

99
import { createServer } from 'node:http';
10+
import { JasmineBuilderHarness } from '../../../../testing/jasmine-helpers';
1011
import { executeDevServer } from '../../index';
1112
import { executeOnceAndFetch } from '../execute-fetch';
1213
import { describeServeBuilder } from '../jasmine-helpers';
1314
import { BASE_OPTIONS, DEV_SERVER_BUILDER_INFO } from '../setup';
1415

15-
describeServeBuilder(executeDevServer, DEV_SERVER_BUILDER_INFO, (harness, setupTarget) => {
16+
describeServeBuilder(executeDevServer, DEV_SERVER_BUILDER_INFO, (harness, setupTarget, isVite) => {
1617
describe('option: "proxyConfig"', () => {
1718
beforeEach(async () => {
1819
setupTarget(harness);
@@ -235,6 +236,15 @@ describeServeBuilder(executeDevServer, DEV_SERVER_BUILDER_INFO, (harness, setupT
235236
await proxyServer.close();
236237
}
237238
});
239+
240+
/**
241+
* ****************************************************************************************************
242+
* ********************************** Below only Vite specific tests **********************************
243+
* ****************************************************************************************************
244+
*/
245+
if (isVite) {
246+
viteOnlyTests(harness);
247+
}
238248
});
239249
});
240250

@@ -261,3 +271,54 @@ async function createProxyServer() {
261271
close: () => new Promise<void>((resolve) => proxyServer.close(() => resolve())),
262272
};
263273
}
274+
275+
/**
276+
* Vite specific tests
277+
*/
278+
function viteOnlyTests(harness: JasmineBuilderHarness<unknown>): void {
279+
it('proxies support regexp as context', async () => {
280+
harness.useTarget('serve', {
281+
...BASE_OPTIONS,
282+
proxyConfig: 'proxy.config.json',
283+
});
284+
285+
const proxyServer = await createProxyServer();
286+
try {
287+
await harness.writeFiles({
288+
'proxy.config.json': `
289+
{ "^/api/.*": { "target": "http://127.0.0.1:${proxyServer.address.port}" } }
290+
`,
291+
});
292+
293+
const { result, response } = await executeOnceAndFetch(harness, '/api/test');
294+
295+
expect(result?.success).toBeTrue();
296+
expect(await response?.text()).toContain('TEST_API_RETURN');
297+
} finally {
298+
await proxyServer.close();
299+
}
300+
});
301+
302+
it('proxies support negated regexp as context', async () => {
303+
harness.useTarget('serve', {
304+
...BASE_OPTIONS,
305+
proxyConfig: 'proxy.config.json',
306+
});
307+
308+
const proxyServer = await createProxyServer();
309+
try {
310+
await harness.writeFiles({
311+
'proxy.config.json': `
312+
{ "^\\/(?!something).*": { "target": "http://127.0.0.1:${proxyServer.address.port}" } }
313+
`,
314+
});
315+
316+
const { result, response } = await executeOnceAndFetch(harness, '/api/test');
317+
318+
expect(result?.success).toBeTrue();
319+
expect(await response?.text()).toContain('TEST_API_RETURN');
320+
} finally {
321+
await proxyServer.close();
322+
}
323+
});
324+
}

packages/angular_devkit/build_angular/src/utils/load-proxy-config.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,7 @@ function normalizeProxyConfiguration(
128128

129129
// TODO: Consider upstreaming glob support
130130
for (const key of Object.keys(normalizedProxy)) {
131-
if (isDynamicPattern(key)) {
131+
if (key[0] !== '^' && isDynamicPattern(key)) {
132132
const pattern = makeRegExpFromGlob(key).source;
133133
normalizedProxy[pattern] = normalizedProxy[key];
134134
delete normalizedProxy[key];

0 commit comments

Comments
 (0)