From 6ca30d86beaf46a6897f3dceedadb14c7f2a30b9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miroslav=20Jona=C5=A1?= Date: Wed, 9 Jun 2021 16:32:27 +0200 Subject: [PATCH] fix(repo): fix flaky cross-os new line check (#5938) --- e2e/cli/src/cli.test.ts | 3 +++ e2e/utils/index.ts | 2 +- packages/tao/src/commands/migrate.ts | 13 ++++++++--- packages/tao/src/utils/fileutils.ts | 32 ++++++++++++++++++++++++---- 4 files changed, 42 insertions(+), 8 deletions(-) diff --git a/e2e/cli/src/cli.test.ts b/e2e/cli/src/cli.test.ts index facf3354f5..962d77319f 100644 --- a/e2e/cli/src/cli.test.ts +++ b/e2e/cli/src/cli.test.ts @@ -270,6 +270,9 @@ describe('migrate', () => { // updates package.json const packageJson = readJson(`package.json`); expect(packageJson.dependencies['migrate-child-package']).toEqual('9.0.0'); + // should keep new line on package + const packageContent = readFile('package.json'); + expect(packageContent.charCodeAt(packageContent.length - 1)).toEqual(10); // creates migrations.json const migrationsJson = readJson(`migrations.json`); diff --git a/e2e/utils/index.ts b/e2e/utils/index.ts index 645a823297..af0e316398 100644 --- a/e2e/utils/index.ts +++ b/e2e/utils/index.ts @@ -472,7 +472,7 @@ export function readJson(f: string): any { export function readFile(f: string) { const ff = f.startsWith('/') ? f : tmpProjPath(f); - return readFileSync(ff).toString(); + return readFileSync(ff, 'utf-8'); } export function rmDist() { diff --git a/packages/tao/src/commands/migrate.ts b/packages/tao/src/commands/migrate.ts index 1f12182ede..1e2d7c2790 100644 --- a/packages/tao/src/commands/migrate.ts +++ b/packages/tao/src/commands/migrate.ts @@ -13,7 +13,11 @@ import { } from '../shared/package-manager'; import { FsTree } from '../shared/tree'; import { flushChanges } from './generate'; -import { readJsonFile, writeJsonFile } from '../utils/fileutils'; +import { + JsonReadOptions, + readJsonFile, + writeJsonFile, +} from '../utils/fileutils'; export type MigrationsJson = { version: string; @@ -503,7 +507,8 @@ function updatePackageJson( } ) { const packageJsonPath = join(root, 'package.json'); - const json = readJsonFile(packageJsonPath); + const parseOptions: JsonReadOptions = {}; + const json = readJsonFile(packageJsonPath, parseOptions); Object.keys(updatedPackages).forEach((p) => { if (json.devDependencies && json.devDependencies[p]) { json.devDependencies[p] = updatedPackages[p].version; @@ -514,7 +519,9 @@ function updatePackageJson( json.dependencies[p] = updatedPackages[p].version; } }); - writeJsonFile(packageJsonPath, json); + writeJsonFile(packageJsonPath, json, { + appendNewLine: parseOptions.endsWithNewline, + }); } async function generateMigrationsJsonAndUpdatePackageJson( diff --git a/packages/tao/src/utils/fileutils.ts b/packages/tao/src/utils/fileutils.ts index 305e91462b..8c0f13d600 100644 --- a/packages/tao/src/utils/fileutils.ts +++ b/packages/tao/src/utils/fileutils.ts @@ -4,6 +4,22 @@ import { readFileSync, writeFileSync } from 'fs'; import { dirname } from 'path'; import { ensureDirSync } from 'fs-extra'; +export interface JsonReadOptions extends JsonParseOptions { + /** + * mutable field recording whether JSON ends with new line + * @default false + */ + endsWithNewline?: boolean; +} + +export interface JsonWriteOptions extends JsonSerializeOptions { + /** + * whether to append new line at the end of JSON file + * @default false + */ + appendNewLine?: boolean; +} + /** * Reads a JSON file and returns the object the JSON content represents. * @@ -13,9 +29,13 @@ import { ensureDirSync } from 'fs-extra'; */ export function readJsonFile( path: string, - options?: JsonParseOptions + options?: JsonReadOptions ): T { - return parseJson(readFileSync(path, 'utf-8'), options); + const content = readFileSync(path, 'utf-8'); + if (options) { + options.endsWithNewline = content.charCodeAt(content.length - 1) === 10; + } + return parseJson(content, options); } /** @@ -28,8 +48,12 @@ export function readJsonFile( export function writeJsonFile( path: string, data: T, - options?: JsonSerializeOptions + options?: JsonWriteOptions ): void { ensureDirSync(dirname(path)); - writeFileSync(path, serializeJson(data, options), { encoding: 'utf-8' }); + const serializedJson = serializeJson(data, options); + const content = options?.appendNewLine + ? `${serializedJson}\n` + : serializedJson; + writeFileSync(path, content, { encoding: 'utf-8' }); }