Skip to content

Commit 4aeed49

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
1 parent 48038a5 commit 4aeed49

File tree

1 file changed

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

1 file changed

+16
-27
lines changed

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

Lines changed: 16 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,15 @@ 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(
559+
`/node_modules/${name}/package.json`,
560+
) as JsonSchemaForNpmPackageJsonFiles;
561+
installedVersion = version;
564562
}
565563

566564
const packageVersionsNonDeprecated: string[] = [];
@@ -590,7 +588,7 @@ function _buildPackageInfo(
590588
);
591589
}
592590

593-
const installedPackageJson = npmPackageJson.versions[installedVersion] || packageContent;
591+
const installedPackageJson = npmPackageJson.versions[installedVersion] || pkgJsonExists;
594592
if (!installedPackageJson) {
595593
throw new SchematicsException(
596594
`An unexpected error happened; package ${name} has no version ${installedVersion}.`,
@@ -783,23 +781,14 @@ function _addPeerDependencies(
783781
}
784782

785783
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-
}
784+
const { dependencies, devDependencies, peerDependencies } = tree.readJson(
785+
'/package.json',
786+
) as JsonSchemaForNpmPackageJsonFiles;
798787

799788
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]>),
789+
...(Object.entries(peerDependencies || {}) as Array<[string, VersionRange]>),
790+
...(Object.entries(devDependencies || {}) as Array<[string, VersionRange]>),
791+
...(Object.entries(dependencies || {}) as Array<[string, VersionRange]>),
803792
];
804793
}
805794

0 commit comments

Comments
 (0)