Skip to content

Commit

Permalink
fix(@angular/build): allow .json file replacements with application b…
Browse files Browse the repository at this point in the history
…uilds

When using the `application` builder, the `fileReplacements` option will
now work as it previous did with the `browser` builder when replacing
JSON files.
  • Loading branch information
clydin committed Nov 26, 2024
1 parent 11289c4 commit c81dd81
Show file tree
Hide file tree
Showing 2 changed files with 62 additions and 0 deletions.
Original file line number Diff line number Diff line change
@@ -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');
});
});
});
Original file line number Diff line number Diff line change
Expand Up @@ -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
if (pluginOptions.jit) {
setupJitPluginCallbacks(
Expand Down

0 comments on commit c81dd81

Please sign in to comment.