diff --git a/.vscode/launch.json b/.vscode/launch.json index 1e31432536..a361c5e51d 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -7,17 +7,23 @@ { "type": "node", "request": "launch", - "name": "Launch Program (Node 6+)", - "program": "${workspaceRoot}/lib/nativescript-cli.js", - "cwd": "${workspaceRoot}", + "cwd": "${workspaceRoot}/scratch", "sourceMaps": true, - // define the arguments that you would like to pass to CLI, for example - // "args": [ "build", "android", "--justlaunch" ] - "args": [ + "name": "Launch CLI (Node 6+)", + "program": "${workspaceRoot}/lib/nativescript-cli.js", - ] + // example commands + "args": [ "create", "cliapp"] + // "args": [ "platform", "add", "android@1.3.0", "--path", "cliapp"] + // "args": [ "platform", "remove", "android", "--path", "cliapp"] + // "args": [ "plugin", "add", "nativescript-barcodescanner", "--path", "cliapp"] + // "args": [ "plugin", "remove", "nativescript-barcodescanner", "--path", "cliapp"] + // "args": [ "build", "android", "--path", "cliapp"] + // "args": [ "run", "android", "--path", "cliapp"] + // "args": [ "debug", "android", "--path", "cliapp"] + // "args": [ "livesync", "android", "--path", "cliapp"] + // "args": [ "livesync", "android", "--watch", "--path", "cliapp"] }, - { // in case you want to debug a single test, modify it's code to be `it.only(...` instead of `it(...` "type": "node", @@ -34,7 +40,7 @@ "--harmony" ], "request": "launch", - "name": "Launch Program (Node 4, Node 5)", + "name": "Launch CLI (Node 4, Node 5)", "program": "${workspaceRoot}/lib/nativescript-cli.js", "cwd": "${workspaceRoot}", "sourceMaps": true, diff --git a/lib/constants.ts b/lib/constants.ts index db1657fbfd..c2780f07cc 100644 --- a/lib/constants.ts +++ b/lib/constants.ts @@ -21,6 +21,8 @@ export class PackageVersion { static LATEST = "latest"; } +export let PackageJsonKeysToKeep : Array = ["name", "main", "android", "version"]; + export class SaveOptions { static PRODUCTION = "save"; static DEV = "save-dev"; diff --git a/lib/services/project-service.ts b/lib/services/project-service.ts index 2681a31915..62f109f966 100644 --- a/lib/services/project-service.ts +++ b/lib/services/project-service.ts @@ -76,7 +76,9 @@ export class ProjectService implements IProjectService { try { //TODO: plamen5kov: move copy of template and npm uninstall in prepareTemplate logic this.createProjectCore(projectDir, appPath, projectId).wait(); - this.mergeProjectAndTemplateProperties(projectDir, appPath); //merging dependencies from template (dev && prod) + let templatePackageJsonData = this.getDataFromJson(appPath); + this.mergeProjectAndTemplateProperties(projectDir, templatePackageJsonData); //merging dependencies from template (dev && prod) + this.removeMergedDependencies(projectDir, templatePackageJsonData); this.$npm.install(projectDir, projectDir, { "ignore-scripts": this.$options.ignoreScripts }).wait(); selectedTemplate = selectedTemplate || ""; let templateName = (constants.RESERVED_TEMPLATE_NAMES[selectedTemplate.toLowerCase()] || selectedTemplate/*user template*/) || constants.RESERVED_TEMPLATE_NAMES["default"]; @@ -93,26 +95,43 @@ export class ProjectService implements IProjectService { }).future()(); } - private mergeProjectAndTemplateProperties(projectDir: string, templatePath: string): void { + private getDataFromJson(templatePath: string): any { let templatePackageJsonPath = path.join(templatePath, constants.PACKAGE_JSON_FILE_NAME); + if(this.$fs.exists(templatePackageJsonPath)) { + let templatePackageJsonData = this.$fs.readJson(templatePackageJsonPath); + return templatePackageJsonData; + } else { + this.$logger.trace(`Template ${templatePath} does not have ${constants.PACKAGE_JSON_FILE_NAME} file.`); + } + return null; + } + + private removeMergedDependencies(projectDir: string, templatePackageJsonData: any) : void { + let extractedTemplatePackageJsonPath = path.join(projectDir, constants.APP_FOLDER_NAME, constants.PACKAGE_JSON_FILE_NAME); + for(let key in templatePackageJsonData) { + if(constants.PackageJsonKeysToKeep.indexOf(key) === -1) { + delete templatePackageJsonData[key]; + } + } + + this.$logger.trace("Deleting unnecessary information from template json."); + this.$fs.writeJson(extractedTemplatePackageJsonPath, templatePackageJsonData); + } - if (this.$fs.exists(templatePackageJsonPath)) { + private mergeProjectAndTemplateProperties(projectDir: string, templatePackageJsonData: any): void { + if(templatePackageJsonData) { let projectPackageJsonPath = path.join(projectDir, constants.PACKAGE_JSON_FILE_NAME); let projectPackageJsonData = this.$fs.readJson(projectPackageJsonPath); this.$logger.trace("Initial project package.json data: ", projectPackageJsonData); - let templatePackageJsonData = this.$fs.readJson(templatePackageJsonPath); - if (projectPackageJsonData.dependencies || templatePackageJsonData.dependencies) { + if(projectPackageJsonData.dependencies || templatePackageJsonData.dependencies) { projectPackageJsonData.dependencies = this.mergeDependencies(projectPackageJsonData.dependencies, templatePackageJsonData.dependencies); } if (projectPackageJsonData.devDependencies || templatePackageJsonData.devDependencies) { projectPackageJsonData.devDependencies = this.mergeDependencies(projectPackageJsonData.devDependencies, templatePackageJsonData.devDependencies); } - this.$logger.trace("New project package.json data: ", projectPackageJsonData); this.$fs.writeJson(projectPackageJsonPath, projectPackageJsonData); - } else { - this.$logger.trace(`Template ${templatePath} does not have ${constants.PACKAGE_JSON_FILE_NAME} file.`); } }