Skip to content

Commit b07246a

Browse files
committed
fix(@angular/cli): prevent BOM errors in package.json during ng update
To prevent `JSON.parse` errors triggered by Byte Order Marks (BOMs) in package.json files, the `readJson` tree method is now utilized for more reliable BOM handling. Closes #27052 (cherry picked from commit 782c718)
1 parent da1c38c commit b07246a

File tree

1 file changed

+14
-27
lines changed
  • packages/angular/cli/src/commands/update/schematic

1 file changed

+14
-27
lines changed

packages/angular/cli/src/commands/update/schematic/index.ts

Lines changed: 14 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -267,13 +267,7 @@ function _performUpdate(
267267
throw new SchematicsException('Could not find a package.json. Are you in a Node project?');
268268
}
269269

270-
let packageJson: JsonSchemaForNpmPackageJsonFiles;
271-
try {
272-
packageJson = JSON.parse(packageJsonContent.toString()) as JsonSchemaForNpmPackageJsonFiles;
273-
} catch (e) {
274-
assertIsError(e);
275-
throw new SchematicsException('package.json could not be parsed: ' + e.message);
276-
}
270+
const packageJson = tree.readJson('/package.json') as JsonSchemaForNpmPackageJsonFiles;
277271

278272
const updateDependency = (deps: Record<string, string>, name: string, newVersion: string) => {
279273
const oldVersion = deps[name];
@@ -556,11 +550,13 @@ function _buildPackageInfo(
556550

557551
// Find out the currently installed version. Either from the package.json or the node_modules/
558552
// TODO: figure out a way to read package-lock.json and/or yarn.lock.
553+
const pkgJsonPath = `/node_modules/${name}/package.json`;
554+
const pkgJsonExists = tree.exists(pkgJsonPath);
555+
559556
let installedVersion: string | undefined | null;
560-
const packageContent = tree.read(`/node_modules/${name}/package.json`);
561-
if (packageContent) {
562-
const content = JSON.parse(packageContent.toString()) as JsonSchemaForNpmPackageJsonFiles;
563-
installedVersion = content.version;
557+
if (pkgJsonExists) {
558+
const { version } = tree.readJson(pkgJsonPath) as JsonSchemaForNpmPackageJsonFiles;
559+
installedVersion = version;
564560
}
565561

566562
const packageVersionsNonDeprecated: string[] = [];
@@ -590,7 +586,7 @@ function _buildPackageInfo(
590586
);
591587
}
592588

593-
const installedPackageJson = npmPackageJson.versions[installedVersion] || packageContent;
589+
const installedPackageJson = npmPackageJson.versions[installedVersion] || pkgJsonExists;
594590
if (!installedPackageJson) {
595591
throw new SchematicsException(
596592
`An unexpected error happened; package ${name} has no version ${installedVersion}.`,
@@ -783,23 +779,14 @@ function _addPeerDependencies(
783779
}
784780

785781
function _getAllDependencies(tree: Tree): Array<readonly [string, VersionRange]> {
786-
const packageJsonContent = tree.read('/package.json');
787-
if (!packageJsonContent) {
788-
throw new SchematicsException('Could not find a package.json. Are you in a Node project?');
789-
}
790-
791-
let packageJson: JsonSchemaForNpmPackageJsonFiles;
792-
try {
793-
packageJson = JSON.parse(packageJsonContent.toString()) as JsonSchemaForNpmPackageJsonFiles;
794-
} catch (e) {
795-
assertIsError(e);
796-
throw new SchematicsException('package.json could not be parsed: ' + e.message);
797-
}
782+
const { dependencies, devDependencies, peerDependencies } = tree.readJson(
783+
'/package.json',
784+
) as JsonSchemaForNpmPackageJsonFiles;
798785

799786
return [
800-
...(Object.entries(packageJson.peerDependencies || {}) as Array<[string, VersionRange]>),
801-
...(Object.entries(packageJson.devDependencies || {}) as Array<[string, VersionRange]>),
802-
...(Object.entries(packageJson.dependencies || {}) as Array<[string, VersionRange]>),
787+
...(Object.entries(peerDependencies || {}) as Array<[string, VersionRange]>),
788+
...(Object.entries(devDependencies || {}) as Array<[string, VersionRange]>),
789+
...(Object.entries(dependencies || {}) as Array<[string, VersionRange]>),
803790
];
804791
}
805792

0 commit comments

Comments
 (0)