Skip to content

Commit 50d1af6

Browse files
author
Dimitar Tachev
authored
Merge pull request #4961 from NativeScript/vladimirov/tracking-project-types
feat: add tracking for React and Svelte projecs
2 parents 5988e8a + f24ab5c commit 50d1af6

File tree

5 files changed

+119
-14
lines changed

5 files changed

+119
-14
lines changed

lib/constants.ts

+2
Original file line numberDiff line numberDiff line change
@@ -136,6 +136,8 @@ export class ProjectTypes {
136136
public static VueFlavorName = VueFlavorName;
137137
public static TsFlavorName = "Pure TypeScript";
138138
public static JsFlavorName = "Pure JavaScript";
139+
public static ReactFlavorName = "React";
140+
public static SvelteFlavorName = "Svelte";
139141
}
140142
export const BUILD_OUTPUT_EVENT_NAME = "buildOutput";
141143
export const CONNECTION_ERROR_EVENT_NAME = "connectionError";

lib/controllers/update-controller.ts

+4
Original file line numberDiff line numberDiff line change
@@ -204,6 +204,10 @@ export class UpdateController extends UpdateControllerBase implements IUpdateCon
204204
template = constants.RESERVED_TEMPLATE_NAMES.javascript;
205205
break;
206206
}
207+
default: {
208+
template = constants.RESERVED_TEMPLATE_NAMES.javascript;
209+
break;
210+
}
207211
}
208212

209213
return template;

lib/project-data.ts

+8
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,14 @@ export class ProjectData implements IProjectData {
2727
type: constants.ProjectTypes.VueFlavorName,
2828
requiredDependencies: ["nativescript-vue"]
2929
},
30+
{
31+
type: constants.ProjectTypes.ReactFlavorName,
32+
requiredDependencies: ["react-nativescript"]
33+
},
34+
{
35+
type: constants.ProjectTypes.SvelteFlavorName,
36+
requiredDependencies: ["svelte-native"]
37+
},
3038
{
3139
type: constants.ProjectTypes.TsFlavorName,
3240
requiredDependencies: ["typescript", "nativescript-dev-typescript"]

test/controllers/update-controller.ts

+97-14
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import * as stubs from "./../stubs";
22
import * as yok from "../../lib/common/yok";
33
import { UpdateController } from "../../lib/controllers/update-controller";
44
import { assert } from "chai";
5-
import * as sinon from 'sinon';
5+
import * as sinon from "sinon";
66
import * as path from "path";
77
import { Options } from "../../lib/options";
88
import { StaticConfig } from "../../lib/config";
@@ -21,7 +21,7 @@ function createTestInjector(
2121
checkConsent: async (): Promise<void> => undefined,
2222
trackFeature: async (): Promise<void> => undefined
2323
});
24-
testInjector.register('errors', stubs.ErrorsStub);
24+
testInjector.register("errors", stubs.ErrorsStub);
2525
testInjector.register("staticConfig", StaticConfig);
2626
testInjector.register("projectData", {
2727
projectDir,
@@ -32,29 +32,29 @@ function createTestInjector(
3232
testInjector.register("migrateController", {
3333
shouldMigrate: () => { return false; },
3434
});
35-
testInjector.register('fs', stubs.FileSystemStub);
36-
testInjector.register('platformCommandHelper', {
35+
testInjector.register("fs", stubs.FileSystemStub);
36+
testInjector.register("platformCommandHelper", {
3737
getCurrentPlatformVersion: () => {
3838
return "5.2.0";
3939
}
4040
});
4141

42-
testInjector.register('packageManager', {
42+
testInjector.register("packageManager", {
4343
getTagVersion: () => {
4444
return "2.3.0";
4545
}
4646
});
4747
testInjector.register("addPlatformService", {
48-
setPlatformVersion: () => {/**/}
48+
setPlatformVersion: () => {/**/ }
4949
});
5050
testInjector.register("pluginsService", {
51-
addToPackageJson: () => {/**/}
51+
addToPackageJson: () => {/**/ }
5252
});
53-
testInjector.register('devicePlatformsConstants', DevicePlatformsConstants);
54-
testInjector.register('packageInstallationManager', stubs.PackageInstallationManagerStub);
55-
testInjector.register('platformsDataService', stubs.NativeProjectDataStub);
53+
testInjector.register("devicePlatformsConstants", DevicePlatformsConstants);
54+
testInjector.register("packageInstallationManager", stubs.PackageInstallationManagerStub);
55+
testInjector.register("platformsDataService", stubs.NativeProjectDataStub);
5656
testInjector.register("pacoteService", stubs.PacoteServiceStub);
57-
testInjector.register('projectDataService', stubs.ProjectDataService);
57+
testInjector.register("projectDataService", stubs.ProjectDataService);
5858
testInjector.register("updateController", UpdateController);
5959

6060
return testInjector;
@@ -78,7 +78,7 @@ describe("update controller method tests", () => {
7878
sandbox.stub(fs, "copyFile").throws();
7979
const updateController = testInjector.resolve("updateController");
8080

81-
await updateController.update({projectDir: projectFolder, version: "3.3.0"});
81+
await updateController.update({ projectDir: projectFolder, version: "3.3.0" });
8282

8383
assert.isTrue(deleteDirectory.calledWith(path.join(projectFolder, UpdateController.backupFolder)));
8484
assert.isFalse(deleteDirectory.calledWith(path.join(projectFolder, "platforms")));
@@ -90,7 +90,7 @@ describe("update controller method tests", () => {
9090
const copyFileStub = sandbox.stub(fs, "copyFile");
9191
const updateController = testInjector.resolve("updateController");
9292

93-
await updateController.update({projectDir: projectFolder, version: "3.3.0"});
93+
await updateController.update({ projectDir: projectFolder, version: "3.3.0" });
9494

9595
assert.isTrue(copyFileStub.calledWith(path.join(projectFolder, "package.json")));
9696
for (const folder of UpdateController.folders) {
@@ -108,11 +108,94 @@ describe("update controller method tests", () => {
108108
const updateController = testInjector.resolve("updateController");
109109
const tempDir = path.join(projectFolder, UpdateController.backupFolder);
110110

111-
await updateController.update({projectDir: projectFolder, version: "3.3.0"});
111+
await updateController.update({ projectDir: projectFolder, version: "3.3.0" });
112112

113113
assert.isTrue(copyFileStub.calledWith(path.join(tempDir, "package.json"), projectFolder));
114114
for (const folder of UpdateController.folders) {
115115
assert.isTrue(copyFileStub.calledWith(path.join(tempDir, folder), projectFolder));
116116
}
117117
});
118+
119+
for (const projectType of ["Angular", "React"]) {
120+
it(`should update dependencies from project type: ${projectType}`, async () => {
121+
const testInjector = createTestInjector();
122+
testInjector.resolve("platformCommandHelper").removePlatforms = () => {
123+
throw new Error();
124+
};
125+
126+
const fs = testInjector.resolve("fs");
127+
const copyFileStub = sandbox.stub(fs, "copyFile");
128+
const updateController = testInjector.resolve("updateController");
129+
const tempDir = path.join(projectFolder, UpdateController.backupFolder);
130+
131+
const projectDataService = testInjector.resolve<IProjectDataService>("projectDataService");
132+
projectDataService.getProjectData = (projectDir: string) => {
133+
return <any>{
134+
projectDir,
135+
projectType,
136+
dependencies: {
137+
"tns-core-modules": "0.1.0",
138+
},
139+
devDependencies: {
140+
"nativescript-dev-webpack": "1.1.3"
141+
}
142+
};
143+
};
144+
145+
const packageInstallationManager = testInjector.resolve<IPackageInstallationManager>("packageInstallationManager");
146+
const latestCompatibleVersion = "1.1.1";
147+
packageInstallationManager.getLatestCompatibleVersionSafe = async (packageName: string, referenceVersion?: string): Promise<string> => {
148+
assert.isString(packageName);
149+
assert.isFalse(_.isEmpty(packageName));
150+
return latestCompatibleVersion;
151+
};
152+
153+
const pacoteService = testInjector.resolve<IPacoteService>("pacoteService");
154+
pacoteService.manifest = async (packageName: string, options?: IPacoteManifestOptions): Promise<any> => {
155+
assert.isString(packageName);
156+
assert.isFalse(_.isEmpty(packageName));
157+
158+
return {
159+
dependencies: {
160+
"tns-core-modules": "1.0.0",
161+
"dep2": "1.1.0"
162+
},
163+
devDependencies: {
164+
"devDep1": "1.2.0",
165+
"nativescript-dev-webpack": "1.3.0"
166+
},
167+
name: "template1"
168+
};
169+
};
170+
171+
const pluginsService = testInjector.resolve<IPluginsService>("pluginsService");
172+
const dataAddedToPackageJson: IDictionary<any> = {
173+
dependencies: {},
174+
devDependencies: {}
175+
};
176+
pluginsService.addToPackageJson = (plugin: string, version: string, isDev: boolean, projectDir: string): void => {
177+
if (isDev) {
178+
dataAddedToPackageJson.devDependencies[plugin] = version;
179+
} else {
180+
dataAddedToPackageJson.dependencies[plugin] = version;
181+
}
182+
};
183+
184+
await updateController.update({ projectDir: projectFolder });
185+
186+
assert.isTrue(copyFileStub.calledWith(path.join(tempDir, "package.json"), projectFolder));
187+
for (const folder of UpdateController.folders) {
188+
assert.isTrue(copyFileStub.calledWith(path.join(tempDir, folder), projectFolder));
189+
}
190+
191+
assert.deepEqual(dataAddedToPackageJson, {
192+
dependencies: {
193+
"tns-core-modules": "1.0.0",
194+
},
195+
devDependencies: {
196+
"nativescript-dev-webpack": "1.3.0"
197+
}
198+
});
199+
});
200+
}
118201
});

test/project-data.ts

+8
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,14 @@ describe("projectData", () => {
100100
assertProjectType({ "nativescript-vue": "*" }, { "typescript": "*" }, "Vue.js");
101101
});
102102

103+
it("detects project as React when react-nativescript exists as dependency and typescript is devDependency", () => {
104+
assertProjectType({ "react-nativescript": "*" }, null, "React");
105+
});
106+
107+
it("detects project as Svelte when react-nativescript exists as dependency and typescript is devDependency", () => {
108+
assertProjectType({ "svelte-native": "*" }, null, "Svelte");
109+
});
110+
103111
it("detects project as TypeScript when nativescript-dev-typescript exists as dependency", () => {
104112
assertProjectType(null, { "nativescript-dev-typescript": "*" }, "Pure TypeScript");
105113
});

0 commit comments

Comments
 (0)