Skip to content

Commit 95b79eb

Browse files
NathanWalkerrigor789
authored andcommitted
chore: config handling
1 parent 6987ec2 commit 95b79eb

File tree

8 files changed

+89
-87
lines changed

8 files changed

+89
-87
lines changed

PublicAPI.md

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -221,11 +221,10 @@ Returns an IProjectData object that is initialized with the provided package.jso
221221
/**
222222
* Returns an initialized IProjectData object containing data about the NativeScript project in the provided projectDir
223223
* @param {string} packageJsonContent The content of the project.json file in the root of the project
224-
* @param {string} nsconfigContent The content of the nsconfig.json file in the root of the project
225224
* @param {string} projectDir The path to the project
226225
* @returns {IProjectData} Information about the NativeScript project
227226
*/
228-
getProjectDataFromContent(packageJsonContent: string, nsconfigContent: string, projectDir?: string): IProjectData
227+
getProjectDataFromContent(packageJsonContent: string, projectDir?: string): IProjectData
229228
```
230229
231230
### getNsConfigDefaultContent

lib/definitions/project.d.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -171,7 +171,7 @@ interface IProjectData extends ICreateProjectData {
171171
* @returns {void}
172172
*/
173173
initializeProjectData(projectDir?: string): void;
174-
initializeProjectDataFromContent(packageJsonContent: string, nsconfigContent: string, projectDir?: string): void;
174+
initializeProjectDataFromContent(packageJsonContent: string, projectDir?: string): void;
175175
getAppDirectoryPath(projectDir?: string): string;
176176
getAppDirectoryRelativePath(): string;
177177
getAppResourcesDirectoryPath(projectDir?: string): string;
@@ -275,7 +275,7 @@ interface IProjectConfigService {
275275
* read the nativescript.config.(js|ts) file
276276
* @returns {INsConfig} the parsed config data
277277
*/
278-
readConfig(): INsConfig;
278+
readConfig(projectDir?: string): INsConfig;
279279
/**
280280
* Get value for a given config key path
281281
* @param key the property key path

lib/project-data.ts

Lines changed: 27 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,11 @@ import * as _ from 'lodash';
44
import { parseJson } from "./common/helpers";
55
import { EOL } from "os";
66
import { cache } from "./common/decorators";
7-
import { IProjectData, INsConfig } from "./definitions/project";
7+
import { IProjectData, INsConfig, IProjectConfigService } from "./definitions/project";
88
import { IAndroidResourcesMigrationService, IStaticConfig, IOptions } from "./declarations";
99
import { IStringDictionary, IFileSystem, IErrors, IProjectHelper } from "./common/declarations";
1010
import { injector } from "./common/yok";
11+
import { IInjector } from "./common/definitions/yok";
1112

1213
interface IProjectType {
1314
type: string;
@@ -82,9 +83,14 @@ export class ProjectData implements IProjectData {
8283
private $projectHelper: IProjectHelper,
8384
private $staticConfig: IStaticConfig,
8485
private $options: IOptions,
85-
private $logger: ILogger,
86+
private $logger: ILogger,
87+
private $injector: IInjector,
8688
private $androidResourcesMigrationService: IAndroidResourcesMigrationService,
87-
private $devicePlatformsConstants: Mobile.IDevicePlatformsConstants) { }
89+
private $devicePlatformsConstants: Mobile.IDevicePlatformsConstants) { }
90+
91+
get projectConfig(): IProjectConfigService {
92+
return this.$injector.resolve('projectConfigService');
93+
}
8894

8995
public initializeProjectData(projectDir?: string): void {
9096
projectDir = projectDir || this.$projectHelper.projectDir;
@@ -95,9 +101,8 @@ export class ProjectData implements IProjectData {
95101

96102
if (this.$fs.exists(projectFilePath)) {
97103
const packageJsonContent = this.$fs.readText(projectFilePath);
98-
const nsConfigContent = this.getNsConfigContent(projectDir);
99104

100-
this.initializeProjectDataFromContent(packageJsonContent, nsConfigContent, projectDir);
105+
this.initializeProjectDataFromContent(packageJsonContent, projectDir);
101106
}
102107

103108
return;
@@ -106,37 +111,27 @@ export class ProjectData implements IProjectData {
106111
this.errorInvalidProject(projectDir);
107112
}
108113

109-
public initializeProjectDataFromContent(packageJsonContent: string, nsconfigContent: string, projectDir?: string): void {
114+
public initializeProjectDataFromContent(packageJsonContent: string, projectDir?: string): void {
110115
projectDir = projectDir || this.$projectHelper.projectDir || "";
111116
const projectFilePath = this.getProjectFilePath(projectDir);
112-
// If no project found, projectDir should be null
113-
let nsData = null;
114-
let nsConfig: INsConfig = null;
117+
// If no project found, projectDir should be null
118+
let nsConfig: INsConfig = this.projectConfig.readConfig(projectDir);
115119
let packageJsonData = null;
116120

117121
try {
118122
packageJsonData = parseJson(packageJsonContent);
119-
nsData = packageJsonData[this.$staticConfig.CLIENT_NAME_KEY_IN_PROJECT_FILE];
120123
} catch (err) {
121124
this.$errors.fail(`The project file ${this.projectFilePath} is corrupted. ${EOL}` +
122125
`Consider restoring an earlier version from your source control or backup.${EOL}` +
123126
`Additional technical info: ${err.toString()}`);
124127
}
125128

126-
try {
127-
nsConfig = nsconfigContent ? <INsConfig>parseJson(nsconfigContent) : null;
128-
} catch (err) {
129-
this.$errors.fail(`The NativeScript configuration file ${constants.CONFIG_NS_FILE_NAME} is corrupted. ${EOL}` +
130-
`Consider restoring an earlier version from your source control or backup.${EOL}` +
131-
`Additional technical info: ${err.toString()}`);
132-
}
133-
134-
if (nsData) {
129+
if (nsConfig) {
135130
this.projectDir = projectDir;
136131
this.projectName = this.$projectHelper.sanitizeName(path.basename(projectDir));
137132
this.platformsDir = path.join(projectDir, constants.PLATFORMS_DIR_NAME);
138133
this.projectFilePath = projectFilePath;
139-
this.projectIdentifiers = this.initializeProjectIdentifiers(nsData.id);
134+
this.projectIdentifiers = this.initializeProjectIdentifiers(nsConfig);
140135
this.dependencies = packageJsonData.dependencies;
141136
this.devDependencies = packageJsonData.devDependencies;
142137
this.projectType = this.getProjectType();
@@ -207,22 +202,8 @@ export class ProjectData implements IProjectData {
207202
return constants.APP_FOLDER_NAME;
208203
}
209204

210-
private getNsConfigContent(projectDir: string): string {
211-
if (!projectDir) {
212-
return null;
213-
}
214-
215-
const configNSFilePath = path.join(projectDir, this.getNsConfigRelativePath());
216-
217-
if (!this.$fs.exists(configNSFilePath)) {
218-
return null;
219-
}
220-
221-
return this.$fs.readText(configNSFilePath);
222-
}
223-
224205
public getNsConfigRelativePath(): string {
225-
return constants.CONFIG_NS_FILE_NAME;
206+
return constants.CONFIG_FILE_NAME_JS;
226207
}
227208

228209
private resolveToProjectDir(pathToResolve: string, projectDir?: string): string {
@@ -237,21 +218,17 @@ export class ProjectData implements IProjectData {
237218
return path.resolve(projectDir, pathToResolve);
238219
}
239220

240-
private initializeProjectIdentifiers(data: string | Mobile.IProjectIdentifier): Mobile.IProjectIdentifier {
241-
let identifier: Mobile.IProjectIdentifier;
242-
data = data || "";
243-
244-
if (typeof data === "string") {
245-
identifier = {
246-
android: data,
247-
ios: data
248-
};
249-
} else {
250-
identifier = {
251-
android: data.android || "",
252-
ios: data.ios || ""
253-
};
254-
}
221+
private initializeProjectIdentifiers(config: INsConfig): Mobile.IProjectIdentifier {
222+
let identifier: Mobile.IProjectIdentifier = {
223+
ios: '',
224+
android: ''
225+
};
226+
if (config.ios) {
227+
identifier.ios = config.ios.id || config.id;
228+
}
229+
if (config.android) {
230+
identifier.android = config.android.id || config.id;
231+
}
255232

256233
return identifier;
257234
}

lib/services/project-config-service.ts

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,21 +5,26 @@ import * as ts from 'typescript';
55
import { IFileSystem } from "../common/declarations";
66
import { injector } from "../common/yok";
77
import { IProjectData, INsConfig, IProjectConfigService } from "../definitions/project";
8+
import { IInjector } from "../common/definitions/yok";
89

910
export class ProjectConfigService implements IProjectConfigService {
1011
private _config: INsConfig;
1112

1213
constructor(
1314
private $fs: IFileSystem,
1415
private $logger: ILogger,
15-
private $projectData: IProjectData,
16+
private $injector: IInjector
1617
) {
1718

1819
}
1920

20-
public readConfig(): INsConfig {
21-
const configJSFilePath = path.join(this.$projectData.projectDir, CONFIG_FILE_NAME_JS);
22-
const configTSFilePath = path.join(this.$projectData.projectDir, CONFIG_FILE_NAME_TS);
21+
get projectData(): IProjectData {
22+
return this.$injector.resolve('projectData');
23+
}
24+
25+
public readConfig(projectDir?: string): INsConfig {
26+
const configJSFilePath = path.join(projectDir || this.projectData.projectDir, CONFIG_FILE_NAME_JS);
27+
const configTSFilePath = path.join(projectDir || this.projectData.projectDir, CONFIG_FILE_NAME_TS);
2328

2429
const hasTS = this.$fs.exists(configTSFilePath);
2530
const hasJS = this.$fs.exists(configJSFilePath);

lib/services/project-data-service.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -91,10 +91,10 @@ export class ProjectDataService implements IProjectDataService {
9191
}
9292

9393
@exported("projectDataService")
94-
public getProjectDataFromContent(packageJsonContent: string, nsconfigContent: string, projectDir?: string): IProjectData {
94+
public getProjectDataFromContent(packageJsonContent: string, projectDir?: string): IProjectData {
9595
projectDir = projectDir || this.defaultProjectDir;
9696
this.projectDataCache[projectDir] = this.projectDataCache[projectDir] || this.$injector.resolve<IProjectData>(ProjectData);
97-
this.projectDataCache[projectDir].initializeProjectDataFromContent(packageJsonContent, nsconfigContent, projectDir);
97+
this.projectDataCache[projectDir].initializeProjectDataFromContent(packageJsonContent, projectDir);
9898
return this.projectDataCache[projectDir];
9999
}
100100

test/plugins-service.ts

Lines changed: 21 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ import { PackageInstallationManager } from "../lib/package-installation-manager"
55
import { NodePackageManager } from "../lib/node-package-manager";
66
import { YarnPackageManager } from "../lib/yarn-package-manager";
77
import { PnpmPackageManager } from "../lib/pnpm-package-manager";
8-
import { FileSystem } from "../lib/common/file-system";
98
import { ProjectData } from "../lib/project-data";
109
import { ChildProcess } from "../lib/common/child-process";
1110
import { Options } from "../lib/options";
@@ -35,16 +34,18 @@ import StaticConfigLib = require("../lib/config");
3534
import * as path from "path";
3635
import * as temp from "temp";
3736
import * as _ from 'lodash';
38-
import { PLUGINS_BUILD_DATA_FILENAME } from '../lib/constants';
37+
import { PLUGINS_BUILD_DATA_FILENAME, CONFIG_FILE_NAME_JS, CONFIG_FILE_NAME_TS } from '../lib/constants';//PACKAGE_JSON_FILE_NAME
3938
import { GradleCommandService } from '../lib/services/android/gradle-command-service';
4039
import { GradleBuildService } from '../lib/services/android/gradle-build-service';
4140
import { GradleBuildArgsService } from '../lib/services/android/gradle-build-args-service';
4241
import * as util from "util";
4342
import { IPluginData, IPluginsService } from '../lib/definitions/plugins';
4443
import { IProjectData } from '../lib/definitions/project';
45-
import { IStringDictionary } from '../lib/common/declarations';
44+
import { IStringDictionary, IReadFileOptions } from '../lib/common/declarations';
4645
import { IInjector } from '../lib/common/definitions/yok';
4746
import { IEventActionData, IGoogleAnalyticsData } from '../lib/common/definitions/google-analytics';
47+
import { ProjectConfigService } from '../lib/services/project-config-service';
48+
// import { basename } from 'path';
4849
temp.track();
4950

5051
let isErrorThrown = false;
@@ -65,8 +66,20 @@ function createTestInjector() {
6566
testInjector.register("packageManager", PackageManager);
6667
testInjector.register("npm", NodePackageManager);
6768
testInjector.register("yarn", YarnPackageManager);
68-
testInjector.register("pnpm", PnpmPackageManager);
69-
testInjector.register("fs", FileSystem);
69+
testInjector.register("pnpm", PnpmPackageManager);
70+
const fileSystemStub = new stubs.FileSystemStub();
71+
fileSystemStub.readText = (filename: string, encoding?: IReadFileOptions | string): string => {
72+
if (filename.indexOf("package.json") > -1) {
73+
return `{}`;//packageJsonContent;
74+
} else if (filename.indexOf(CONFIG_FILE_NAME_JS) > -1) {
75+
return `module.exports = {}`;
76+
} else if (filename.indexOf(CONFIG_FILE_NAME_TS) > -1) {
77+
return `export default {}`;
78+
}
79+
};
80+
fileSystemStub.exists = (filePath: string): boolean => true;
81+
testInjector.register("fs", fileSystemStub);
82+
7083
testInjector.register("adb", {});
7184
testInjector.register("androidDebugBridgeResultHandler", {});
7285
testInjector.register("projectData", ProjectData);
@@ -167,7 +180,8 @@ function createTestInjector() {
167180
setShouldDispose: (shouldDispose: boolean): void => undefined
168181
});
169182
testInjector.register("nodeModulesDependenciesBuilder", {});
170-
testInjector.register("tempService", stubs.TempServiceStub);
183+
testInjector.register("tempService", stubs.TempServiceStub);
184+
testInjector.register("projectConfigService", ProjectConfigService);
171185

172186
return testInjector;
173187
}
@@ -224,7 +238,7 @@ async function addPluginWhenExpectingToFail(testInjector: IInjector, plugin: str
224238
assert.isTrue(isErrorThrown);
225239
}
226240

227-
describe("Plugins service", () => {
241+
describe.only("Plugins service", () => {
228242
let testInjector: IInjector;
229243
const commands = ["add", "install"];
230244
beforeEach(() => {

test/project-data.ts

Lines changed: 22 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
import { ProjectData } from "../lib/project-data";
21
import { Yok } from "../lib/common/yok";
32
import { DevicePlatformsConstants } from "../lib/common/mobile/device-platforms-constants";
43
import { assert } from "chai";
@@ -7,6 +6,8 @@ import * as path from "path";
76
import { IProjectData } from "../lib/definitions/project";
87
import { IInjector } from "../lib/common/definitions/yok";
98
import { IStringDictionary, IProjectHelper } from "../lib/common/declarations";
9+
import { ProjectConfigService } from "../lib/services/project-config-service";
10+
import { ProjectData } from "../lib/project-data";
1011

1112
describe("projectData", () => {
1213
const createTestInjector = (): IInjector => {
@@ -15,7 +16,7 @@ describe("projectData", () => {
1516
testInjector.register("projectHelper", {
1617
projectDir: null,
1718
sanitizeName: (name: string) => name
18-
});
19+
});
1920

2021
testInjector.register("fs", {
2122
exists: () => true,
@@ -39,29 +40,33 @@ describe("projectData", () => {
3940
testInjector.register("androidResourcesMigrationService", {
4041
hasMigrated: () => true
4142
});
42-
43-
testInjector.register("projectData", ProjectData);
43+
testInjector.register("projectData", ProjectData);
44+
45+
testInjector.register("projectConfigService", ProjectConfigService);
4446

4547
return testInjector;
4648
};
4749

4850
const projectDir = "projectDir";
49-
const prepareTest = (opts?: { packageJsonData?: { dependencies?: IStringDictionary, devDependencies: IStringDictionary }, nsconfigData?: { shared?: boolean, webpackConfigPath?: string } }): IProjectData => {
51+
const prepareTest = (opts?: { packageJsonData?: { dependencies?: IStringDictionary, devDependencies: IStringDictionary }, configData?: { shared?: boolean, webpackConfigPath?: string } }): IProjectData => {
5052
const testInjector = createTestInjector();
5153
const fs = testInjector.resolve("fs");
52-
fs.exists = (filePath: string) => filePath && (path.basename(filePath) === "package.json" || (path.basename(filePath) === "nsconfig.json" && opts && opts.nsconfigData));
54+
fs.exists = (filePath: string) => {
55+
return filePath && (path.basename(filePath) === "package.json" || path.basename(filePath) === "nativescript.config.js")
56+
};
5357

5458
fs.readText = (filePath: string) => {
5559
if (path.basename(filePath) === "package.json") {
5660
return JSON.stringify({
57-
nativescript: {
58-
id: "com.test.testid"
59-
},
6061
dependencies: opts && opts.packageJsonData && opts.packageJsonData.dependencies,
6162
devDependencies: opts && opts.packageJsonData && opts.packageJsonData.devDependencies
6263
});
63-
} else if (path.basename(filePath) === "nsconfig.json" && opts && opts.nsconfigData) {
64-
return JSON.stringify(opts.nsconfigData);
64+
} else if (path.basename(filePath) === "nativescript.config.js") {
65+
if (opts && opts.configData) {
66+
return typeof opts.configData === 'string' ? opts.configData : `module.exports = JSON.parse('${JSON.stringify(opts.configData)}')`;
67+
} else {
68+
return `module.exports = {}`;
69+
}
6570
}
6671

6772
return null;
@@ -83,7 +88,7 @@ describe("projectData", () => {
8388
packageJsonData: {
8489
dependencies,
8590
devDependencies
86-
}
91+
}
8792
});
8893
assert.deepEqual(projectData.projectType, expectedProjecType);
8994
};
@@ -132,17 +137,17 @@ describe("projectData", () => {
132137
});
133138

134139
it("is false when nsconfig.json exists, but shared value is not populated", () => {
135-
const projectData = prepareTest({ nsconfigData: { shared: undefined } });
140+
const projectData = prepareTest({ configData: { shared: undefined } });
136141
assert.isFalse(projectData.isShared);
137142
});
138143

139144
it("is false when nsconfig.json exists and shared value is false", () => {
140-
const projectData = prepareTest({ nsconfigData: { shared: false } });
145+
const projectData = prepareTest({ configData: { shared: false } });
141146
assert.isFalse(projectData.isShared);
142147
});
143148

144149
it("is true when nsconfig.json exists and shared value is true", () => {
145-
const projectData = prepareTest({ nsconfigData: { shared: true } });
150+
const projectData = prepareTest({ configData: { shared: true } });
146151
assert.isTrue(projectData.isShared);
147152
});
148153
});
@@ -155,13 +160,13 @@ describe("projectData", () => {
155160

156161
it("returns correct path when full path is set in nsconfig.json", () => {
157162
const pathToConfig = path.resolve(path.join("/testDir", "innerDir", "mywebpack.config.js"));
158-
const projectData = prepareTest({ nsconfigData: { webpackConfigPath: pathToConfig } });
163+
const projectData = prepareTest({ configData: { webpackConfigPath: pathToConfig } });
159164
assert.equal(projectData.webpackConfigPath, pathToConfig);
160165
});
161166

162167
it("returns correct path when relative path is set in nsconfig.json", () => {
163168
const pathToConfig = path.resolve(path.join("projectDir", "innerDir", "mywebpack.config.js"));
164-
const projectData = prepareTest({ nsconfigData: { webpackConfigPath: path.join("./innerDir", "mywebpack.config.js") } });
169+
const projectData = prepareTest({ configData: { webpackConfigPath: path.join("./innerDir", "mywebpack.config.js") } });
165170
assert.equal(projectData.webpackConfigPath, pathToConfig);
166171
});
167172
});

0 commit comments

Comments
 (0)