Skip to content

Commit f24ab5c

Browse files
feat: add tracking for React and Svelte projecs
Add tracking in CLI analytics for React and Svelte project types. As we do not have templates for those two project types, when CLI detects a project from this type and the `tns update` command is executed, get the dependencies for update from the default hellow world JS template.
1 parent be3128a commit f24ab5c

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)