mirror of
https://github.com/angular/angular-cli.git
synced 2025-05-16 18:43:42 +08:00
fix(@angular/build): allow .json file replacements with application builds
When using the `application` builder, the `fileReplacements` option will now work as it previous did with the `browser` builder when replacing JSON files.
This commit is contained in:
parent
11289c4982
commit
c81dd817df
@ -0,0 +1,37 @@
|
|||||||
|
/**
|
||||||
|
* @license
|
||||||
|
* Copyright Google LLC All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Use of this source code is governed by an MIT-style license that can be
|
||||||
|
* found in the LICENSE file at https://angular.dev/license
|
||||||
|
*/
|
||||||
|
|
||||||
|
import { buildApplication } from '../../index';
|
||||||
|
import { APPLICATION_BUILDER_INFO, BASE_OPTIONS, describeBuilder } from '../setup';
|
||||||
|
|
||||||
|
describeBuilder(buildApplication, APPLICATION_BUILDER_INFO, (harness) => {
|
||||||
|
describe('Option: "fileReplacements"', () => {
|
||||||
|
it('should replace JSON files', async () => {
|
||||||
|
harness.useTarget('build', {
|
||||||
|
...BASE_OPTIONS,
|
||||||
|
fileReplacements: [{ replace: './src/one.json', with: './src/two.json' }],
|
||||||
|
});
|
||||||
|
|
||||||
|
await harness.modifyFile('tsconfig.json', (content) => {
|
||||||
|
const tsconfig = JSON.parse(content);
|
||||||
|
tsconfig.compilerOptions.resolveJsonModule = true;
|
||||||
|
|
||||||
|
return JSON.stringify(tsconfig);
|
||||||
|
});
|
||||||
|
|
||||||
|
await harness.writeFile('./src/one.json', '{ "x": 12345 }');
|
||||||
|
await harness.writeFile('./src/two.json', '{ "x": 67890 }');
|
||||||
|
await harness.writeFile('src/main.ts', 'import { x } from "./one.json";\n console.log(x);');
|
||||||
|
|
||||||
|
const { result } = await harness.executeOnce();
|
||||||
|
expect(result?.success).toBe(true);
|
||||||
|
harness.expectFile('dist/browser/main.js').content.not.toContain('12345');
|
||||||
|
harness.expectFile('dist/browser/main.js').content.toContain('67890');
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
@ -512,6 +512,31 @@ export function createCompilerPlugin(
|
|||||||
}),
|
}),
|
||||||
);
|
);
|
||||||
|
|
||||||
|
// Add a load handler if there are file replacement option entries for JSON files
|
||||||
|
if (
|
||||||
|
pluginOptions.fileReplacements &&
|
||||||
|
Object.keys(pluginOptions.fileReplacements).some((value) => value.endsWith('.json'))
|
||||||
|
) {
|
||||||
|
build.onLoad(
|
||||||
|
{ filter: /\.json$/ },
|
||||||
|
createCachedLoad(pluginOptions.loadResultCache, async (args) => {
|
||||||
|
const replacement = pluginOptions.fileReplacements?.[path.normalize(args.path)];
|
||||||
|
if (replacement) {
|
||||||
|
return {
|
||||||
|
contents: await import('fs/promises').then(({ readFile }) =>
|
||||||
|
readFile(path.normalize(replacement)),
|
||||||
|
),
|
||||||
|
loader: 'json' as const,
|
||||||
|
watchFiles: [replacement],
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
// If no replacement defined, let esbuild handle it directly
|
||||||
|
return null;
|
||||||
|
}),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
// Setup bundling of component templates and stylesheets when in JIT mode
|
// Setup bundling of component templates and stylesheets when in JIT mode
|
||||||
if (pluginOptions.jit) {
|
if (pluginOptions.jit) {
|
||||||
setupJitPluginCallbacks(
|
setupJitPluginCallbacks(
|
||||||
|
Loading…
x
Reference in New Issue
Block a user