diff --git a/lib/definitions/project.d.ts b/lib/definitions/project.d.ts index bd5c32e68c..bd0ec0a546 100644 --- a/lib/definitions/project.d.ts +++ b/lib/definitions/project.d.ts @@ -238,6 +238,11 @@ interface ITemplateData { * The whole content of package.json file */ templatePackageJsonContent: ITemplatePackageJsonContent; + + /** + * The version of the package used for creating the application. + */ + version: string; } interface ITemplatePackageJsonContent extends IBasePluginData { diff --git a/lib/services/project-templates-service.ts b/lib/services/project-templates-service.ts index ed6bd37602..fba5c5cdd8 100644 --- a/lib/services/project-templates-service.ts +++ b/lib/services/project-templates-service.ts @@ -19,8 +19,16 @@ export class ProjectTemplatesService implements IProjectTemplatesService { originalTemplateName = constants.RESERVED_TEMPLATE_NAMES["default"]; } - // support @ syntax - const [name, version] = originalTemplateName.split("@"); + // support @ syntax, for example typescript@1.0.0 + // support @ syntax, for example @nativescript/vue-template@1.0.0 + const lastIndexOfAtSign = originalTemplateName.lastIndexOf("@"); + let name = originalTemplateName; + let version = ""; + if (lastIndexOfAtSign > 0) { + name = originalTemplateName.substr(0, lastIndexOfAtSign); + version = originalTemplateName.substr(lastIndexOfAtSign + 1); + } + const templateName = constants.RESERVED_TEMPLATE_NAMES[name.toLowerCase()] || name; const fullTemplateName = version ? `${templateName}@${version}` : templateName; const templatePackageJsonContent = await this.getTemplatePackageJsonContent(fullTemplateName); @@ -49,7 +57,7 @@ export class ProjectTemplatesService implements IProjectTemplatesService { }); } - return { templateName, templatePath, templateVersion, templatePackageJsonContent }; + return { templateName, templatePath, templateVersion, templatePackageJsonContent, version }; } private async getTemplateVersion(templateName: string): Promise { diff --git a/test/project-templates-service.ts b/test/project-templates-service.ts index f01140b7f1..ad9e12b27d 100644 --- a/test/project-templates-service.ts +++ b/test/project-templates-service.ts @@ -220,5 +220,42 @@ describe("project-templates-service", () => { }); }); + + describe("uses correct version", () => { + [ + { + name: "is correct when package version is passed", + templateName: "some-template@1.0.0", + expectedVersion: "1.0.0", + expectedTemplateName: "some-template" + }, + { + name: "is correct when reserved package name with version is passed", + templateName: "typescript@1.0.0", + expectedVersion: "1.0.0", + expectedTemplateName: "tns-template-hello-world-ts" + }, + { + name: "is correct when scoped package name without version is passed", + templateName: "@nativescript/vue-template", + expectedVersion: "", + expectedTemplateName: "@nativescript/vue-template" + }, + { + name: "is correct when scoped package name with version is passed", + templateName: "@nativescript/vue-template@1.0.0", + expectedVersion: "1.0.0", + expectedTemplateName: "@nativescript/vue-template" + } + ].forEach(testCase => { + it(testCase.name, async () => { + const testInjector = createTestInjector(); + const projectTemplatesService = testInjector.resolve("projectTemplatesService"); + const { version, templateName } = await projectTemplatesService.prepareTemplate(testCase.templateName, "tempFolder"); + assert.strictEqual(version, testCase.expectedVersion); + assert.strictEqual(templateName, testCase.expectedTemplateName); + }); + }); + }); }); });