@@ -6,6 +6,10 @@ import com.intellij.execution.RunnerAndConfigurationSettings
66import com.intellij.execution.configurations.ConfigurationFactory
77import com.intellij.execution.executors.DefaultRunExecutor
88import com.intellij.execution.runners.ExecutionUtil
9+ import com.intellij.lang.javascript.buildTools.npm.PackageJsonUtil
10+ import com.intellij.lang.javascript.buildTools.npm.rc.NpmConfigurationType
11+ import com.intellij.lang.javascript.buildTools.npm.rc.NpmRunConfiguration
12+ import com.intellij.lang.javascript.buildTools.npm.rc.NpmRunSettings
913import com.intellij.lang.javascript.psi.JSCallExpression
1014import com.intellij.lang.javascript.psi.JSExpression
1115import com.intellij.lang.javascript.psi.JSLiteralExpression
@@ -17,6 +21,8 @@ import com.intellij.openapi.actionSystem.AnActionEvent
1721import com.intellij.openapi.actionSystem.CommonDataKeys
1822import com.intellij.openapi.actionSystem.PlatformDataKeys
1923import com.intellij.openapi.fileEditor.FileDocumentManager
24+ import com.intellij.openapi.project.Project
25+ import com.intellij.openapi.vfs.VirtualFile
2026import com.intellij.openapi.wm.ToolWindowId
2127import com.intellij.psi.PsiElement
2228import com.jetbrains.nodejs.run.NodeJsRunConfiguration
@@ -34,6 +40,22 @@ fun JSCallExpression.isTest(): Boolean {
3440 return false
3541}
3642
43+ fun getConfigurationName (fileName : String , testName : String? ): String {
44+ return if (testName != null ) {
45+ " ava $fileName $testName "
46+ } else {
47+ " ava $fileName "
48+ }
49+ }
50+
51+ fun getRunArguments (relPath : String , testName : String? ): String {
52+ return if (testName != null ) {
53+ " -m \" $testName \" -v $relPath "
54+ } else {
55+ " -v $relPath "
56+ }
57+ }
58+
3759class AvaJavaScriptTestRunnerRunConfigurationGenerator : AnAction () {
3860 companion object {
3961 fun performAction (e : AnActionEvent , debug : Boolean = false, offset : Int? = null) {
@@ -58,30 +80,16 @@ class AvaJavaScriptTestRunnerRunConfigurationGenerator : AnAction() {
5880 val fileName = Paths .get(filePath).fileName.toString()
5981 val basePath = project.basePath
6082 val relPath = if (basePath == null ) fileName else currentFile.path.substring(basePath.length + 1 )
61- val node : NodeJsRunConfiguration ? =
62- NodeJsRunConfiguration .getDefaultRunConfiguration(project)?.clone() as NodeJsRunConfiguration ?
63- if (node == null ) {
64- writeError( " NodeJS run configuration type not found " )
65- return
83+
84+ val configuration = if ( AppSettingsState .selectedCommand) {
85+ this .createNodeJsRunConfiguration(project, fileName, relPath, testName)
86+ } else {
87+ this .createNPMRunConfiguration(project, currentFile, fileName, relPath, testName)
6688 }
67- val factory: ConfigurationFactory ? = node.factory
68- if (factory == null ) {
69- writeError(" Factory not found" )
89+
90+ if (configuration == null ) {
7091 return
7192 }
72- node.workingDirectory = basePath
73- node.inputPath = AppSettingsState .inputPath
74- if (testName != null ) {
75- node.name = " ava $fileName $testName "
76- node.applicationParameters = " -m \" $testName \" -v $relPath "
77- } else {
78- node.name = " ava $fileName "
79- node.applicationParameters = " -v $relPath "
80- }
81- val runManager = RunManager .getInstance(project)
82- val configuration: RunnerAndConfigurationSettings = runManager.createConfiguration(node, factory)
83- runManager.addConfiguration(configuration)
84- runManager.selectedConfiguration = configuration
8593
8694 if (debug) {
8795 val executor = ExecutorRegistry .getInstance().getExecutorById(ToolWindowId .DEBUG )
@@ -125,6 +133,70 @@ class AvaJavaScriptTestRunnerRunConfigurationGenerator : AnAction() {
125133 }
126134 return getTestName(element.parent)
127135 }
136+
137+ private fun createNodeJsRunConfiguration (
138+ project : Project ,
139+ fileName : String ,
140+ relPath : String ,
141+ testName : String? ,
142+ ): RunnerAndConfigurationSettings ? {
143+ val node: NodeJsRunConfiguration ? =
144+ NodeJsRunConfiguration .getDefaultRunConfiguration(project)?.clone() as NodeJsRunConfiguration ?
145+ if (node == null ) {
146+ writeError(" NodeJS run configuration type not found" )
147+ return null
148+ }
149+ val factory: ConfigurationFactory ? = node.factory
150+ if (factory == null ) {
151+ writeError(" Factory not found" )
152+ return null
153+ }
154+ node.workingDirectory = project.basePath
155+ node.inputPath = AppSettingsState .inputPath
156+ node.name = getConfigurationName(fileName, testName)
157+ node.applicationParameters = getRunArguments(relPath, testName)
158+
159+ val runManager = RunManager .getInstance(project)
160+ val configuration: RunnerAndConfigurationSettings = runManager.createConfiguration(node, factory)
161+ runManager.addConfiguration(configuration)
162+ runManager.selectedConfiguration = configuration
163+
164+ return configuration
165+ }
166+
167+ private fun createNPMRunConfiguration (
168+ project : Project ,
169+ currentFile : VirtualFile ,
170+ fileName : String ,
171+ relPath : String ,
172+ testName : String? ,
173+ ): RunnerAndConfigurationSettings ? {
174+ val npmRunSettingsBuilder = NpmRunSettings .builder()
175+ val packageJsonPath = PackageJsonUtil .findUpPackageJson(currentFile)?.path
176+
177+ if (packageJsonPath == null ) {
178+ return null
179+ }
180+
181+ npmRunSettingsBuilder.setPackageJsonPath(packageJsonPath)
182+
183+ npmRunSettingsBuilder.setArguments(getRunArguments(relPath, testName))
184+ npmRunSettingsBuilder.setScriptNames(listOf (AppSettingsState .npmScriptsText))
185+
186+ val npmRunConfiguration = NpmRunConfiguration (
187+ project,
188+ NpmConfigurationType .getInstance(),
189+ getConfigurationName(fileName, testName)
190+ )
191+ npmRunConfiguration.runSettings = npmRunSettingsBuilder.build()
192+
193+ val runManager = RunManager .getInstance(project)
194+ val configuration = runManager.createConfiguration(npmRunConfiguration, NpmConfigurationType .getInstance())
195+ runManager.addConfiguration(configuration)
196+ runManager.selectedConfiguration = configuration
197+
198+ return configuration
199+ }
128200 }
129201
130202 override fun actionPerformed (e : AnActionEvent ) {
0 commit comments