From a643d30f3a0c45546bd6e159be9a4eaf3eb6ec48 Mon Sep 17 00:00:00 2001 From: Omar Shibli Date: Mon, 8 Jun 2026 11:59:00 +0300 Subject: [PATCH] fix(plugin-bff): preserve package manifest newline --- .../plugin-bff/src/utils/clientGenerator.ts | 17 +++++--- .../plugin-bff/tests/clientGenerator.test.ts | 43 +++++++++++++++++++ 2 files changed, 55 insertions(+), 5 deletions(-) create mode 100644 packages/cli/plugin-bff/tests/clientGenerator.test.ts diff --git a/packages/cli/plugin-bff/src/utils/clientGenerator.ts b/packages/cli/plugin-bff/src/utils/clientGenerator.ts index cbe724c56880..db81cb96bfd7 100644 --- a/packages/cli/plugin-bff/src/utils/clientGenerator.ts +++ b/packages/cli/plugin-bff/src/utils/clientGenerator.ts @@ -203,10 +203,13 @@ async function setPackage( mergePackageJson(packageJson, addFiles, typesVersions, exports); - await fs.promises.writeFile( - packagePath, - JSON.stringify(packageJson, null, 2), - ); + const handle = await fs.promises.open(packagePath, 'w'); + try { + await handle.write(JSON.stringify(packageJson, null, 2)); + await handle.write('\n'); + } finally { + await handle.close(); + } } catch (error) { logger.error(`package.json update failed: ${error}`); } @@ -275,7 +278,11 @@ async function clientGenerator(draftOptions: APILoaderOptions) { logger.error(`Client bundle generate failed: ${error}`); } - setPackage(sourceList, draftOptions.appDir, draftOptions.relativeDistPath); + await setPackage( + sourceList, + draftOptions.appDir, + draftOptions.relativeDistPath, + ); } export default clientGenerator; diff --git a/packages/cli/plugin-bff/tests/clientGenerator.test.ts b/packages/cli/plugin-bff/tests/clientGenerator.test.ts new file mode 100644 index 000000000000..d3e19ab9c31f --- /dev/null +++ b/packages/cli/plugin-bff/tests/clientGenerator.test.ts @@ -0,0 +1,43 @@ +import os from 'os'; +import path from 'path'; +import { fs } from '@modern-js/utils'; +import clientGenerator from '../src/utils/clientGenerator'; + +describe('clientGenerator', () => { + it('writes package.json with a trailing newline', async () => { + const appDir = await fs.mkdtemp(path.join(os.tmpdir(), 'bff-client-gen-')); + const lambdaDir = path.join(appDir, 'api', 'lambda'); + + try { + await fs.mkdir(lambdaDir, { recursive: true }); + await fs.writeFile( + path.join(lambdaDir, 'user.ts'), + 'export default function handler() {}', + ); + await fs.writeFile( + path.join(appDir, 'package.json'), + JSON.stringify({ name: 'test-app' }, null, 2), + ); + + await clientGenerator({ + prefix: '/api', + appDir, + apiDir: path.join(appDir, 'api'), + lambdaDir, + existLambda: false, + relativeDistPath: 'dist', + relativeApiPath: 'api', + }); + + const packageContent = await fs.readFile( + path.join(appDir, 'package.json'), + 'utf8', + ); + + expect(packageContent.endsWith('\n')).toBe(true); + expect(JSON.parse(packageContent).exports).toHaveProperty('./api/user'); + } finally { + await fs.remove(appDir); + } + }); +});