Skip to content

Commit 238eb06

Browse files
Merge pull request #3557 from NativeScript/vladimirov/fix-assets-structure
fix(assets-generation): Do not fail in case some App_Resources are missing
2 parents 06ebba9 + 391eb84 commit 238eb06

File tree

2 files changed

+59
-4
lines changed

2 files changed

+59
-4
lines changed

lib/services/project-data-service.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,7 @@ export class ProjectDataService implements IProjectDataService {
125125

126126
private async getIOSAssetSubGroup(dirPath: string): Promise<IAssetSubGroup> {
127127
const pathToContentJson = path.join(dirPath, AssetConstants.iOSResourcesFileName);
128-
const content = <IAssetSubGroup>this.$fs.readJson(pathToContentJson);
128+
const content = this.$fs.exists(pathToContentJson) && <IAssetSubGroup>this.$fs.readJson(pathToContentJson) || { images: [] };
129129

130130
const imageDefinitions = this.getImageDefinitions().ios;
131131

test/services/project-data-service.ts

Lines changed: 58 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,9 @@ import { Yok } from "../../lib/common/yok";
22
import { assert } from "chai";
33
import { ProjectDataService } from "../../lib/services/project-data-service";
44
import { LoggerStub } from "../stubs";
5-
import { NATIVESCRIPT_PROPS_INTERNAL_DELIMITER } from '../../lib/constants';
5+
import { NATIVESCRIPT_PROPS_INTERNAL_DELIMITER, PACKAGE_JSON_FILE_NAME, AssetConstants } from '../../lib/constants';
66
import { DevicePlatformsConstants } from "../../lib/common/mobile/device-platforms-constants";
7+
import { basename } from "path";
78

89
const CLIENT_NAME_KEY_IN_PROJECT_FILE = "nativescript";
910

@@ -53,19 +54,38 @@ const createTestInjector = (readTextData?: string): IInjector => {
5354

5455
readText: (filename: string, encoding?: IReadFileOptions | string): string => {
5556
return readTextData;
56-
}
57+
},
58+
59+
exists: (filePath: string): boolean => basename(filePath) === PACKAGE_JSON_FILE_NAME,
60+
61+
readJson: (filePath: string): any => null,
62+
63+
enumerateFilesInDirectorySync: (directoryPath: string,
64+
filterCallback?: (_file: string, _stat: IFsStats) => boolean,
65+
opts?: { enumerateDirectories?: boolean, includeEmptyDirectories?: boolean },
66+
foundFiles?: string[]): string[] => []
5767
});
5868

5969
testInjector.register("logger", LoggerStub);
6070

6171
testInjector.register("projectDataService", ProjectDataService);
6272

63-
testInjector.register("androidResourcesMigrationService", {});
73+
testInjector.register("androidResourcesMigrationService", {
74+
hasMigrated: (appResourcesDir: string): boolean => true
75+
});
6476

6577
testInjector.register("devicePlatformsConstants", DevicePlatformsConstants);
6678

6779
testInjector.register("injector", testInjector);
6880

81+
testInjector.register("errors", {});
82+
83+
testInjector.register("projectHelper", {
84+
sanitizeName: (appName: string): string => appName
85+
});
86+
87+
testInjector.register("options", {});
88+
6989
return testInjector;
7090
};
7191

@@ -244,4 +264,39 @@ describe("projectDataService", () => {
244264
assert.deepEqual(dataPassedToWriteJson, { dependencies: {} });
245265
});
246266
});
267+
268+
describe("getAssetsStructure", () => {
269+
it("does not fail when App_Resources/Android and App_Resources/iOS do not exist", async () => {
270+
const defaultEmptyData: any = {};
271+
defaultEmptyData[CLIENT_NAME_KEY_IN_PROJECT_FILE] = {};
272+
const testInjector = createTestInjector(JSON.stringify(defaultEmptyData));
273+
const fs = testInjector.resolve<IFileSystem>("fs");
274+
fs.readJson = (filePath: string): any => {
275+
if (basename(filePath) === AssetConstants.imageDefinitionsFileName) {
276+
return { android: {}, ios: {} };
277+
}
278+
279+
throw new Error(`Unable to read file ${filePath}`);
280+
};
281+
282+
const projectDataService = testInjector.resolve<IProjectDataService>("projectDataService");
283+
const assetStructure = await projectDataService.getAssetsStructure({ projectDir: "." });
284+
const emptyAssetStructure: IAssetGroup = {
285+
icons: {
286+
images: []
287+
},
288+
splashBackgrounds: {
289+
images: []
290+
},
291+
splashCenterImages: {
292+
images: []
293+
},
294+
splashImages: {
295+
images: []
296+
}
297+
};
298+
299+
assert.deepEqual(assetStructure, { ios: emptyAssetStructure, android: _.merge(_.cloneDeep(emptyAssetStructure), { splashImages: null }) });
300+
});
301+
});
247302
});

0 commit comments

Comments
 (0)