Skip to content

Commit 3f05cdb

Browse files
committed
fixup! Refactor PackageJsonEditor.
1 parent d0ec4d1 commit 3f05cdb

17 files changed

Lines changed: 261 additions & 106 deletions

common/reviews/api/rush-lib.api.md

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -137,9 +137,13 @@ export class CommonVersionsConfiguration {
137137
getAllPreferredVersions(): Map<string, string>;
138138
getPreferredVersionsHash(): string;
139139
readonly implicitlyPreferredVersions: boolean | undefined;
140+
// @deprecated (undocumented)
140141
static loadFromFile(jsonFilePath: string, rushConfiguration?: RushConfiguration): CommonVersionsConfiguration;
142+
static loadFromFileAsync(jsonFilePath: string, rushConfiguration?: RushConfiguration): Promise<CommonVersionsConfiguration>;
141143
readonly preferredVersions: Map<string, string>;
144+
// @deprecated (undocumented)
142145
save(): boolean;
146+
saveAsync(): Promise<boolean>;
143147
}
144148

145149
export { CredentialCache }
@@ -1097,15 +1101,19 @@ export class PackageJsonEditor {
10971101
readonly filePath: string;
10981102
// (undocumented)
10991103
static fromObject(object: IPackageJson, filename: string): PackageJsonEditor;
1100-
// (undocumented)
1104+
// @deprecated (undocumented)
11011105
static load(filePath: string): PackageJsonEditor;
11021106
// (undocumented)
1107+
static loadAsync(filePath: string): Promise<PackageJsonEditor>;
1108+
// (undocumented)
11031109
get name(): string;
11041110
// (undocumented)
11051111
removeDependency(packageName: string, dependencyType: DependencyType): void;
11061112
get resolutionsList(): ReadonlyArray<PackageJsonDependency>;
1107-
// (undocumented)
1113+
// @deprecated (undocumented)
11081114
saveIfModified(): boolean;
1115+
// (undocumented)
1116+
saveIfModifiedAsync(): Promise<boolean>;
11091117
saveToObject(): IPackageJson;
11101118
// (undocumented)
11111119
tryGetDependency(packageName: string): PackageJsonDependency | undefined;
@@ -1648,8 +1656,12 @@ export abstract class VersionPolicy {
16481656
// @internal
16491657
static load(versionPolicyJson: IVersionPolicyJson): VersionPolicy | undefined;
16501658
get policyName(): string;
1659+
// @deprecated (undocumented)
16511660
setDependenciesBeforeCommit(packageName: string, configuration: RushConfiguration): void;
1661+
setDependenciesBeforeCommitAsync(packageName: string, configuration: RushConfiguration): Promise<void>;
1662+
// @deprecated (undocumented)
16521663
setDependenciesBeforePublish(packageName: string, configuration: RushConfiguration): void;
1664+
setDependenciesBeforePublishAsync(packageName: string, configuration: RushConfiguration): Promise<void>;
16531665
abstract validate(versionString: string, packageName: string): void;
16541666
}
16551667

libraries/rush-lib/src/api/CommonVersionsConfiguration.ts

Lines changed: 46 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -186,17 +186,42 @@ export class CommonVersionsConfiguration {
186186
}
187187

188188
/**
189-
* Loads the common-versions.json data from the specified file path.
190-
* If the file has not been created yet, then an empty object is returned.
189+
* @deprecated Use {@link CommonVersionsConfiguration.loadFromFileAsync} method instead.
191190
*/
192191
public static loadFromFile(
193192
jsonFilePath: string,
194193
rushConfiguration?: RushConfiguration
195194
): CommonVersionsConfiguration {
196195
let commonVersionsJson: ICommonVersionsJson | undefined = undefined;
197-
198-
if (FileSystem.exists(jsonFilePath)) {
196+
try {
199197
commonVersionsJson = JsonFile.loadAndValidate(jsonFilePath, CommonVersionsConfiguration._jsonSchema);
198+
} catch (error) {
199+
if (!FileSystem.isNotExistError(error)) {
200+
throw error;
201+
}
202+
}
203+
204+
return new CommonVersionsConfiguration(commonVersionsJson, jsonFilePath, rushConfiguration);
205+
}
206+
207+
/**
208+
* Loads the common-versions.json data from the specified file path.
209+
* If the file has not been created yet, then an empty object is returned.
210+
*/
211+
public static async loadFromFileAsync(
212+
jsonFilePath: string,
213+
rushConfiguration?: RushConfiguration
214+
): Promise<CommonVersionsConfiguration> {
215+
let commonVersionsJson: ICommonVersionsJson | undefined = undefined;
216+
try {
217+
commonVersionsJson = await JsonFile.loadAndValidateAsync(
218+
jsonFilePath,
219+
CommonVersionsConfiguration._jsonSchema
220+
);
221+
} catch (error) {
222+
if (!FileSystem.isNotExistError(error)) {
223+
throw error;
224+
}
200225
}
201226

202227
return new CommonVersionsConfiguration(commonVersionsJson, jsonFilePath, rushConfiguration);
@@ -242,7 +267,7 @@ export class CommonVersionsConfiguration {
242267
}
243268

244269
/**
245-
* Writes the "common-versions.json" file to disk, using the filename that was passed to loadFromFile().
270+
* @deprecated Use {@link CommonVersionsConfiguration.saveAsync} method instead.
246271
*/
247272
public save(): boolean {
248273
if (this._modified) {
@@ -257,6 +282,22 @@ export class CommonVersionsConfiguration {
257282
return false;
258283
}
259284

285+
/**
286+
* Writes the "common-versions.json" file to disk, using the filename that was passed to loadFromFile().
287+
*/
288+
public async saveAsync(): Promise<boolean> {
289+
if (this._modified) {
290+
await JsonFile.saveAsync(this._serialize(), this.filePath, {
291+
updateExistingFile: true,
292+
ignoreUndefinedValues: true
293+
});
294+
this._modified = false;
295+
return true;
296+
}
297+
298+
return false;
299+
}
300+
260301
/**
261302
* Returns preferredVersions.
262303
*/

libraries/rush-lib/src/api/PackageJsonEditor.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -189,6 +189,9 @@ export class PackageJsonEditor {
189189
}
190190
}
191191

192+
/**
193+
* @deprecated Use {@link PackageJsonEditor.loadAsync} method instead.
194+
*/
192195
public static load(filePath: string): PackageJsonEditor {
193196
const packageJson: IPackageJson = JsonFile.load(filePath);
194197
return new PackageJsonEditor(filePath, packageJson);
@@ -318,6 +321,9 @@ export class PackageJsonEditor {
318321
this._modified = true;
319322
}
320323

324+
/**
325+
* @deprecated Use {@link PackageJsonEditor.saveIfModifiedAsync} method instead.
326+
*/
321327
public saveIfModified(): boolean {
322328
if (this._modified) {
323329
this._modified = false;

libraries/rush-lib/src/api/SaveCallbackPackageJsonEditor.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,8 @@ export class SaveCallbackPackageJsonEditor extends PackageJsonEditor {
2424
return new SaveCallbackPackageJsonEditor(options);
2525
}
2626

27-
public saveIfModified(): boolean {
28-
const modified: boolean = super.saveIfModified();
27+
public async saveIfModifiedAsync(): Promise<boolean> {
28+
const modified: boolean = await super.saveIfModifiedAsync();
2929
if (this._onSaved) {
3030
this._onSaved(this.saveToObject());
3131
}

libraries/rush-lib/src/api/Subspace.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -325,6 +325,7 @@ export class Subspace {
325325
this._rushConfiguration
326326
);
327327
}
328+
328329
return this._commonVersionsConfiguration;
329330
}
330331

libraries/rush-lib/src/api/VersionPolicy.ts

Lines changed: 103 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,66 @@ export enum VersionPolicyDefinitionName {
5252
'individualVersion'
5353
}
5454

55+
/**
56+
* Updates the dependencies in the package json editor to values used for publishing, if needed.
57+
*
58+
* @returns the updated package json editor if the version format for publish is 'exact', otherwise undefined.
59+
*/
60+
function updateDependenciesBeforePublish(
61+
packageName: string,
62+
configuration: RushConfiguration,
63+
versionFormatForPublish: VersionFormatForPublish
64+
): PackageJsonEditor | undefined {
65+
if (versionFormatForPublish === 'exact') {
66+
const project: RushConfigurationProject = configuration.getProjectByName(packageName)!;
67+
68+
const packageJsonEditor: PackageJsonEditor = project.packageJsonEditor;
69+
70+
for (const dependency of packageJsonEditor.dependencyList) {
71+
const rushDependencyProject: RushConfigurationProject | undefined = configuration.getProjectByName(
72+
dependency.name
73+
);
74+
75+
if (rushDependencyProject) {
76+
const dependencyVersion: string = rushDependencyProject.packageJson.version;
77+
78+
dependency.setVersion(dependencyVersion);
79+
}
80+
}
81+
82+
return packageJsonEditor;
83+
}
84+
}
85+
86+
/**
87+
* Updates the dependencies in the package json editor to values used for checked-in source, if needed.
88+
*
89+
* @returns the updated package json editor if the version format for commit is 'wildcard', otherwise undefined.
90+
*/
91+
function updateDependenciesBeforeCommit(
92+
packageName: string,
93+
configuration: RushConfiguration,
94+
versionFormatForCommit: VersionFormatForCommit
95+
): PackageJsonEditor | undefined {
96+
if (versionFormatForCommit === 'wildcard') {
97+
const project: RushConfigurationProject = configuration.getProjectByName(packageName)!;
98+
99+
const packageJsonEditor: PackageJsonEditor = project.packageJsonEditor;
100+
101+
for (const dependency of packageJsonEditor.dependencyList) {
102+
const rushDependencyProject: RushConfigurationProject | undefined = configuration.getProjectByName(
103+
dependency.name
104+
);
105+
106+
if (rushDependencyProject) {
107+
dependency.setVersion('*');
108+
}
109+
}
110+
111+
return packageJsonEditor;
112+
}
113+
}
114+
55115
/**
56116
* This is the base class for version policy which controls how versions get bumped.
57117
* @public
@@ -161,53 +221,63 @@ export abstract class VersionPolicy {
161221
public abstract validate(versionString: string, packageName: string): void;
162222

163223
/**
164-
* Tells the version policy to modify any dependencies in the target package
165-
* to values used for publishing.
224+
* @deprecated Use {@link VersionPolicy.setDependenciesBeforePublishAsync} method instead.
166225
*/
167226
public setDependenciesBeforePublish(packageName: string, configuration: RushConfiguration): void {
168-
if (this._versionFormatForPublish === 'exact') {
169-
const project: RushConfigurationProject = configuration.getProjectByName(packageName)!;
227+
const packageJsonEditor: PackageJsonEditor | undefined = updateDependenciesBeforePublish(
228+
packageName,
229+
configuration,
230+
this._versionFormatForPublish
231+
);
170232

171-
const packageJsonEditor: PackageJsonEditor = project.packageJsonEditor;
233+
packageJsonEditor?.saveIfModified();
234+
}
172235

173-
for (const dependency of packageJsonEditor.dependencyList) {
174-
const rushDependencyProject: RushConfigurationProject | undefined = configuration.getProjectByName(
175-
dependency.name
176-
);
236+
/**
237+
* Tells the version policy to modify any dependencies in the target package
238+
* to values used for publishing.
239+
*/
240+
public async setDependenciesBeforePublishAsync(
241+
packageName: string,
242+
configuration: RushConfiguration
243+
): Promise<void> {
244+
const packageJsonEditor: PackageJsonEditor | undefined = updateDependenciesBeforePublish(
245+
packageName,
246+
configuration,
247+
this._versionFormatForPublish
248+
);
177249

178-
if (rushDependencyProject) {
179-
const dependencyVersion: string = rushDependencyProject.packageJson.version;
250+
await packageJsonEditor?.saveIfModifiedAsync();
251+
}
180252

181-
dependency.setVersion(dependencyVersion);
182-
}
183-
}
253+
/**
254+
* @deprecated Use {@link VersionPolicy.setDependenciesBeforeCommitAsync} method instead.
255+
*/
256+
public setDependenciesBeforeCommit(packageName: string, configuration: RushConfiguration): void {
257+
const packageJsonEditor: PackageJsonEditor | undefined = updateDependenciesBeforeCommit(
258+
packageName,
259+
configuration,
260+
this._versionFormatForCommit
261+
);
184262

185-
packageJsonEditor.saveIfModified();
186-
}
263+
packageJsonEditor?.saveIfModified();
187264
}
188265

189266
/**
190267
* Tells the version policy to modify any dependencies in the target package
191268
* to values used for checked-in source.
192269
*/
193-
public setDependenciesBeforeCommit(packageName: string, configuration: RushConfiguration): void {
194-
if (this._versionFormatForCommit === 'wildcard') {
195-
const project: RushConfigurationProject = configuration.getProjectByName(packageName)!;
196-
197-
const packageJsonEditor: PackageJsonEditor = project.packageJsonEditor;
198-
199-
for (const dependency of packageJsonEditor.dependencyList) {
200-
const rushDependencyProject: RushConfigurationProject | undefined = configuration.getProjectByName(
201-
dependency.name
202-
);
203-
204-
if (rushDependencyProject) {
205-
dependency.setVersion('*');
206-
}
207-
}
270+
public async setDependenciesBeforeCommitAsync(
271+
packageName: string,
272+
configuration: RushConfiguration
273+
): Promise<void> {
274+
const packageJsonEditor: PackageJsonEditor | undefined = updateDependenciesBeforeCommit(
275+
packageName,
276+
configuration,
277+
this._versionFormatForCommit
278+
);
208279

209-
packageJsonEditor.saveIfModified();
210-
}
280+
await packageJsonEditor?.saveIfModifiedAsync();
211281
}
212282
}
213283

libraries/rush-lib/src/api/test/CommonVersionsConfiguration.test.ts

Lines changed: 22 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,9 @@ import { CommonVersionsConfiguration } from '../CommonVersionsConfiguration';
55
import type { RushConfiguration } from '../RushConfiguration';
66

77
describe(CommonVersionsConfiguration.name, () => {
8-
it('can load the file', () => {
8+
it('can load the file', async () => {
99
const filename: string = `${__dirname}/jsonFiles/common-versions.json`;
10-
const configuration: CommonVersionsConfiguration = CommonVersionsConfiguration.loadFromFile(
10+
const configuration: CommonVersionsConfiguration = await CommonVersionsConfiguration.loadFromFileAsync(
1111
filename,
1212
{} as RushConfiguration
1313
);
@@ -16,33 +16,39 @@ describe(CommonVersionsConfiguration.name, () => {
1616
expect(configuration.allowedAlternativeVersions.get('library-3')).toEqual(['^1.2.3']);
1717
});
1818

19-
it('gets `ensureConsistentVersions` from the file if it provides that value', () => {
19+
it('gets `ensureConsistentVersions` from the file if it provides that value', async () => {
2020
const filename: string = `${__dirname}/jsonFiles/common-versions-with-ensureConsistentVersionsTrue.json`;
21-
const configuration: CommonVersionsConfiguration = CommonVersionsConfiguration.loadFromFile(filename, {
22-
_ensureConsistentVersionsJsonValue: undefined,
23-
ensureConsistentVersions: false
24-
} as RushConfiguration);
21+
const configuration: CommonVersionsConfiguration = await CommonVersionsConfiguration.loadFromFileAsync(
22+
filename,
23+
{
24+
_ensureConsistentVersionsJsonValue: undefined,
25+
ensureConsistentVersions: false
26+
} as RushConfiguration
27+
);
2528

2629
expect(configuration.ensureConsistentVersions).toBe(true);
2730
});
2831

29-
it("gets `ensureConsistentVersions` from the rush configuration if common-versions.json doesn't provide that value", () => {
32+
it("gets `ensureConsistentVersions` from the rush configuration if common-versions.json doesn't provide that value", async () => {
3033
const filename: string = `${__dirname}/jsonFiles/common-versions.json`;
31-
const configuration: CommonVersionsConfiguration = CommonVersionsConfiguration.loadFromFile(filename, {
32-
_ensureConsistentVersionsJsonValue: false,
33-
ensureConsistentVersions: false
34-
} as RushConfiguration);
34+
const configuration: CommonVersionsConfiguration = await CommonVersionsConfiguration.loadFromFileAsync(
35+
filename,
36+
{
37+
_ensureConsistentVersionsJsonValue: false,
38+
ensureConsistentVersions: false
39+
} as RushConfiguration
40+
);
3541

3642
expect(configuration.ensureConsistentVersions).toBe(false);
3743
});
3844

39-
it('Does not allow `ensureConsistentVersions` to be set in both rush.json and common-versions.json', () => {
45+
it('Does not allow `ensureConsistentVersions` to be set in both rush.json and common-versions.json', async () => {
4046
const filename: string = `${__dirname}/jsonFiles/common-versions-with-ensureConsistentVersionsTrue.json`;
41-
expect(() =>
42-
CommonVersionsConfiguration.loadFromFile(filename, {
47+
await expect(() =>
48+
CommonVersionsConfiguration.loadFromFileAsync(filename, {
4349
_ensureConsistentVersionsJsonValue: false,
4450
ensureConsistentVersions: false
4551
} as RushConfiguration)
46-
).toThrowErrorMatchingSnapshot();
52+
).rejects.toThrowErrorMatchingSnapshot();
4753
});
4854
});

0 commit comments

Comments
 (0)