Skip to content

Commit 077131b

Browse files
Merge pull request #3933 from NativeScript/vladimirov/fix-project-create-scoped-packages
fix: unable to create project from scoped package template
2 parents edc3b11 + a571193 commit 077131b

File tree

3 files changed

+53
-3
lines changed

3 files changed

+53
-3
lines changed

lib/definitions/project.d.ts

+5
Original file line numberDiff line numberDiff line change
@@ -238,6 +238,11 @@ interface ITemplateData {
238238
* The whole content of package.json file
239239
*/
240240
templatePackageJsonContent: ITemplatePackageJsonContent;
241+
242+
/**
243+
* The version of the package used for creating the application.
244+
*/
245+
version: string;
241246
}
242247

243248
interface ITemplatePackageJsonContent extends IBasePluginData {

lib/services/project-templates-service.ts

+11-3
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,16 @@ export class ProjectTemplatesService implements IProjectTemplatesService {
1919
originalTemplateName = constants.RESERVED_TEMPLATE_NAMES["default"];
2020
}
2121

22-
// support <reserved_name>@<version> syntax
23-
const [name, version] = originalTemplateName.split("@");
22+
// support <reserved_name>@<version> syntax, for example [email protected]
23+
// support <scoped_package_name>@<version> syntax, for example @nativescript/[email protected]
24+
const lastIndexOfAtSign = originalTemplateName.lastIndexOf("@");
25+
let name = originalTemplateName;
26+
let version = "";
27+
if (lastIndexOfAtSign > 0) {
28+
name = originalTemplateName.substr(0, lastIndexOfAtSign);
29+
version = originalTemplateName.substr(lastIndexOfAtSign + 1);
30+
}
31+
2432
const templateName = constants.RESERVED_TEMPLATE_NAMES[name.toLowerCase()] || name;
2533
const fullTemplateName = version ? `${templateName}@${version}` : templateName;
2634
const templatePackageJsonContent = await this.getTemplatePackageJsonContent(fullTemplateName);
@@ -49,7 +57,7 @@ export class ProjectTemplatesService implements IProjectTemplatesService {
4957
});
5058
}
5159

52-
return { templateName, templatePath, templateVersion, templatePackageJsonContent };
60+
return { templateName, templatePath, templateVersion, templatePackageJsonContent, version };
5361
}
5462

5563
private async getTemplateVersion(templateName: string): Promise<string> {

test/project-templates-service.ts

+37
Original file line numberDiff line numberDiff line change
@@ -220,5 +220,42 @@ describe("project-templates-service", () => {
220220
});
221221

222222
});
223+
224+
describe("uses correct version", () => {
225+
[
226+
{
227+
name: "is correct when package version is passed",
228+
templateName: "[email protected]",
229+
expectedVersion: "1.0.0",
230+
expectedTemplateName: "some-template"
231+
},
232+
{
233+
name: "is correct when reserved package name with version is passed",
234+
templateName: "[email protected]",
235+
expectedVersion: "1.0.0",
236+
expectedTemplateName: "tns-template-hello-world-ts"
237+
},
238+
{
239+
name: "is correct when scoped package name without version is passed",
240+
templateName: "@nativescript/vue-template",
241+
expectedVersion: "",
242+
expectedTemplateName: "@nativescript/vue-template"
243+
},
244+
{
245+
name: "is correct when scoped package name with version is passed",
246+
templateName: "@nativescript/[email protected]",
247+
expectedVersion: "1.0.0",
248+
expectedTemplateName: "@nativescript/vue-template"
249+
}
250+
].forEach(testCase => {
251+
it(testCase.name, async () => {
252+
const testInjector = createTestInjector();
253+
const projectTemplatesService = testInjector.resolve<IProjectTemplatesService>("projectTemplatesService");
254+
const { version, templateName } = await projectTemplatesService.prepareTemplate(testCase.templateName, "tempFolder");
255+
assert.strictEqual(version, testCase.expectedVersion);
256+
assert.strictEqual(templateName, testCase.expectedTemplateName);
257+
});
258+
});
259+
});
223260
});
224261
});

0 commit comments

Comments
 (0)