UNPKG

nativescript

Version:

Command-line interface for building NativeScript projects

160 lines • 8.68 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const path = require("path"); const _ = require("lodash"); const constants_1 = require("../constants"); const helpers_1 = require("../common/helpers"); const yok_1 = require("../common/yok"); const color_1 = require("../color"); class TestInitCommand { constructor($packageManager, $projectData, $errors, $options, $prompter, $fs, $resources, $pluginsService, $logger, $testInitializationService) { this.$packageManager = $packageManager; this.$projectData = $projectData; this.$errors = $errors; this.$options = $options; this.$prompter = $prompter; this.$fs = $fs; this.$resources = $resources; this.$pluginsService = $pluginsService; this.$logger = $logger; this.$testInitializationService = $testInitializationService; this.allowedParameters = []; this.karmaConfigAdditionalFrameworks = { mocha: ["chai"], }; this.$projectData.initializeProjectData(); } async execute(args) { const projectDir = this.$projectData.projectDir; const frameworkToInstall = this.$options.framework || (await this.$prompter.promptForChoice("Select testing framework:", constants_1.TESTING_FRAMEWORKS)); if (constants_1.TESTING_FRAMEWORKS.indexOf(frameworkToInstall) === -1) { this.$errors.failWithHelp(`Unknown or unsupported unit testing framework: ${frameworkToInstall}.`); } const projectFilesExtension = this.$projectData.projectType === constants_1.ProjectTypes.TsFlavorName || this.$projectData.projectType === constants_1.ProjectTypes.NgFlavorName ? ".ts" : ".js"; let modulesToInstall = []; try { modulesToInstall = this.$testInitializationService.getDependencies(frameworkToInstall); } catch (err) { this.$errors.fail(`Unable to install the unit testing dependencies. Error: '${err.message}'`); } modulesToInstall = modulesToInstall.filter((moduleToInstall) => !moduleToInstall.projectType || moduleToInstall.projectType === projectFilesExtension); for (const mod of modulesToInstall) { let moduleToInstall = mod.name; moduleToInstall += `@${mod.version}`; await this.$packageManager.install(moduleToInstall, projectDir, { "save-dev": true, "save-exact": true, optional: false, disableNpmInstall: this.$options.disableNpmInstall, frameworkPath: this.$options.frameworkPath, ignoreScripts: this.$options.ignoreScripts, path: this.$options.path, }); const modulePath = path.join(projectDir, "node_modules", mod.name); const modulePackageJsonPath = path.join(modulePath, "package.json"); const modulePackageJsonContent = this.$fs.readJson(modulePackageJsonPath); const modulePeerDependencies = modulePackageJsonContent.peerDependencies || {}; for (const peerDependency in modulePeerDependencies) { const isPeerDependencyExcluded = _.includes(mod.excludedPeerDependencies, peerDependency); if (isPeerDependencyExcluded) { continue; } const dependencyVersion = modulePeerDependencies[peerDependency] || "*"; // catch errors when a peerDependency is already installed // e.g karma is installed; karma-jasmine depends on karma and will try to install it again try { await this.$packageManager.install(`${peerDependency}@${dependencyVersion}`, projectDir, { "save-dev": true, "save-exact": true, disableNpmInstall: false, frameworkPath: this.$options.frameworkPath, ignoreScripts: this.$options.ignoreScripts, path: this.$options.path, }); } catch (e) { this.$logger.error(e.message); } } } await this.$pluginsService.add("@nativescript/unit-test-runner", this.$projectData); this.$logger.clearScreen(); const bufferedLogs = []; const testsDir = path.join(this.$projectData.appDirectoryPath, "tests"); const projectTestsDir = path.relative(this.$projectData.projectDir, testsDir); const relativeTestsDir = path.relative(this.$projectData.appDirectoryPath, testsDir); let shouldCreateSampleTests = true; if (this.$fs.exists(testsDir)) { const specFilenamePattern = `<filename>.spec${projectFilesExtension}`; bufferedLogs.push(color_1.color.yellow([ `Note: The "${projectTestsDir}" directory already exists, will not create example tests in the project.`, `You may create "${specFilenamePattern}" files anywhere you'd like.`, "", ].join("\n"))); shouldCreateSampleTests = false; } this.$fs.ensureDirectoryExists(testsDir); const frameworks = [frameworkToInstall] .concat(this.karmaConfigAdditionalFrameworks[frameworkToInstall] || []) .map((fw) => `'${fw}'`) .join(", "); const testFiles = `'${(0, helpers_1.fromWindowsRelativePathToUnix)(relativeTestsDir)}/**/*${projectFilesExtension}'`; const karmaConfTemplate = this.$resources.readText("test/karma.conf.js"); const karmaConf = _.template(karmaConfTemplate)({ frameworks, testFiles, basePath: this.$projectData.getAppDirectoryRelativePath(), }); this.$fs.writeFile(path.join(projectDir, "karma.conf.js"), karmaConf); const exampleFilePath = this.$resources.resolvePath(`test/example.${frameworkToInstall}${projectFilesExtension}`); const targetExampleTestPath = path.join(testsDir, `example.spec${projectFilesExtension}`); if (shouldCreateSampleTests && this.$fs.exists(exampleFilePath)) { this.$fs.copyFile(exampleFilePath, targetExampleTestPath); const targetExampleTestRelativePath = path.relative(projectDir, targetExampleTestPath); bufferedLogs.push(`Added example test: ${color_1.color.yellow(targetExampleTestRelativePath)}`); } // test main entry const testMainResourcesPath = this.$resources.resolvePath(`test/test-main${projectFilesExtension}`); const testMainPath = path.join(this.$projectData.appDirectoryPath, `test${projectFilesExtension}`); if (!this.$fs.exists(testMainPath)) { this.$fs.copyFile(testMainResourcesPath, testMainPath); const testMainRelativePath = path.relative(projectDir, testMainPath); bufferedLogs.push(`Main test entrypoint created: ${color_1.color.yellow(testMainRelativePath)}`); } const testTsConfigTemplate = this.$resources.readText("test/tsconfig.spec.json"); const testTsConfig = _.template(testTsConfigTemplate)({ basePath: this.$projectData.getAppDirectoryRelativePath(), }); this.$fs.writeFile(path.join(projectDir, "tsconfig.spec.json"), testTsConfig); bufferedLogs.push(`Added/replaced ${color_1.color.yellow("tsconfig.spec.json")}`); const greyDollarSign = color_1.color.grey("$"); this.$logger.info([ [ color_1.color.green(`Tests using`), color_1.color.cyan(frameworkToInstall), color_1.color.green(`were successfully initialized.`), ].join(" "), "", ...bufferedLogs, "", color_1.color.yellow(`Note: @nativescript/unit-test-runner was included in "dependencies" as a convenience to automatically adjust your app's Info.plist on iOS and AndroidManifest.xml on Android to ensure the socket connects properly.`), "", color_1.color.yellow(`For production you may want to move to "devDependencies" and manage the settings yourself.`), "", "", `You can now run your tests:`, "", ` ${greyDollarSign} ${color_1.color.green("ns test ios")}`, ` ${greyDollarSign} ${color_1.color.green("ns test android")}`, "", ].join("\n")); } } yok_1.injector.registerCommand("test|init", TestInitCommand); //# sourceMappingURL=test-init.js.map