Skip to content

Commit 2f1d876

Browse files
authored
feat: default template version based on cli major (#5517)
1 parent b5e3c5f commit 2f1d876

File tree

2 files changed

+31
-11
lines changed

2 files changed

+31
-11
lines changed

lib/services/project-templates-service.ts

+29-6
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import * as path from "path";
2+
import * as semver from "semver";
23
import * as constants from "../constants";
34
import { performanceLog } from "../common/decorators";
45
import {
@@ -9,6 +10,7 @@ import {
910
import {
1011
IPackageInstallationManager,
1112
INodePackageManager,
13+
IStaticConfig,
1214
} from "../declarations";
1315
import {
1416
IFileSystem,
@@ -26,7 +28,8 @@ export class ProjectTemplatesService implements IProjectTemplatesService {
2628
private $logger: ILogger,
2729
private $packageInstallationManager: IPackageInstallationManager,
2830
private $pacoteService: IPacoteService,
29-
private $packageManager: INodePackageManager
31+
private $packageManager: INodePackageManager,
32+
private $staticConfig: IStaticConfig
3033
) {}
3134

3235
@performanceLog()
@@ -45,11 +48,11 @@ export class ProjectTemplatesService implements IProjectTemplatesService {
4548
constants.RESERVED_TEMPLATE_NAMES[templateNameParts.name] ||
4649
templateNameParts.name;
4750

48-
const version =
49-
templateNameParts.version ||
50-
(await this.$packageInstallationManager.getLatestCompatibleVersionSafe(
51-
templateValue
52-
));
51+
const version = await this.getDesiredVersion(
52+
templateValue,
53+
templateNameParts.version
54+
);
55+
5356
const fullTemplateName = await this.$packageManager.getPackageFullName({
5457
name: templateValue,
5558
version: version,
@@ -116,5 +119,25 @@ export class ProjectTemplatesService implements IProjectTemplatesService {
116119
);
117120
}
118121
}
122+
123+
private async getDesiredVersion(
124+
templateName: string,
125+
defaultVersion?: string
126+
) {
127+
if (defaultVersion) {
128+
return defaultVersion;
129+
}
130+
131+
try {
132+
const cliMajorVersion = semver.parse(
133+
semver.coerce(this.$staticConfig.version)
134+
).major;
135+
return `^${cliMajorVersion}.0.0`;
136+
} catch (err) {
137+
return this.$packageInstallationManager.getLatestCompatibleVersionSafe(
138+
templateName
139+
);
140+
}
141+
}
119142
}
120143
injector.register("projectTemplatesService", ProjectTemplatesService);

test/project-templates-service.ts

+2-5
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@ import { IAnalyticsService, IFileSystem } from "../lib/common/declarations";
1616
import { IEventActionData } from "../lib/common/definitions/google-analytics";
1717

1818
const nativeScriptValidatedTemplatePath = "nsValidatedTemplatePath";
19-
const compatibleTemplateVersion = "1.2.3";
2019

2120
function createTestInjector(
2221
configuration: {
@@ -33,6 +32,7 @@ function createTestInjector(
3332
exists: (pathToCheck: string) => false,
3433
readJson: (pathToFile: string) => configuration.packageJsonContent || {},
3534
});
35+
injector.register("staticConfig", { version: "8.0.0" });
3636

3737
class NpmStub extends stubs.NodePackageManagerStub {
3838
public async install(
@@ -70,9 +70,6 @@ function createTestInjector(
7070

7171
return Promise.resolve(nativeScriptValidatedTemplatePath);
7272
}
73-
async getLatestCompatibleVersionSafe(packageName: string): Promise<string> {
74-
return compatibleTemplateVersion;
75-
}
7673
}
7774

7875
injector.register("packageInstallationManager", NpmInstallationManagerStub);
@@ -275,7 +272,7 @@ describe("project-templates-service", () => {
275272
{
276273
name: "is correct when scoped package name without version is passed",
277274
templateName: "@nativescript/vue-template",
278-
expectedVersion: compatibleTemplateVersion,
275+
expectedVersion: "^8.0.0",
279276
expectedTemplateName: "@nativescript/vue-template",
280277
},
281278
{

0 commit comments

Comments
 (0)