-
Notifications
You must be signed in to change notification settings - Fork 8
/
Copy pathKotlinShellScript.kt
121 lines (111 loc) · 5 KB
/
KotlinShellScript.kt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
package eu.jrie.jetbrains.kotlinshell
import eu.jrie.jetbrains.kotlinshell.processes.execution.ExecutionContext
import eu.jrie.jetbrains.kotlinshell.processes.execution.ProcessExecutable
import eu.jrie.jetbrains.kotlinshell.processes.pipeline.Pipeline
import eu.jrie.jetbrains.kotlinshell.processes.process.Process
import eu.jrie.jetbrains.kotlinshell.processes.process.ProcessState
import eu.jrie.jetbrains.kotlinshell.processes.process.system.SystemProcess
import eu.jrie.jetbrains.kotlinshell.shell.ScriptingShell
import eu.jrie.jetbrains.kotlinshell.shell.Shell
import kotlinx.coroutines.ExperimentalCoroutinesApi
import org.jetbrains.kotlin.mainKts.MainKtsConfigurator
import org.jetbrains.kotlin.script.util.DependsOn
import org.jetbrains.kotlin.script.util.Import
import org.jetbrains.kotlin.script.util.Repository
import java.io.File
import java.util.Collections.emptyMap
import kotlin.script.experimental.annotations.KotlinScript
import kotlin.script.experimental.api.ScriptAcceptedLocation
import kotlin.script.experimental.api.ScriptCompilationConfiguration
import kotlin.script.experimental.api.ScriptEvaluationConfiguration
import kotlin.script.experimental.api.acceptedLocations
import kotlin.script.experimental.api.defaultImports
import kotlin.script.experimental.api.ide
import kotlin.script.experimental.api.refineConfiguration
import kotlin.script.experimental.api.refineConfigurationBeforeEvaluate
import kotlin.script.experimental.api.scriptsInstancesSharing
import kotlin.script.experimental.jvm.dependenciesFromClassContext
import kotlin.script.experimental.jvm.jvm
import kotlin.script.experimental.jvmhost.jsr223.configureProvidedPropertiesFromJsr223Context
import kotlin.script.experimental.jvmhost.jsr223.importAllBindings
import kotlin.script.experimental.jvmhost.jsr223.jsr223
/**
* Script definition for writing shell scripts in Kotlin Script
*
* @see ScriptingShell
*/
@Suppress("unused")
@ExperimentalCoroutinesApi
@KotlinScript(
fileExtension = "sh.kts",
compilationConfiguration = KotlinShellScriptConfiguration::class,
evaluationConfiguration = KotlinShellScriptEvaluationConfiguration::class
)
open class KotlinShellScript (
val args: Array<String>
) : ScriptingShell(
emptyMap(),
File(System.getProperty("user.dir"))
)
@ExperimentalCoroutinesApi
class KotlinShellScriptConfiguration : ScriptCompilationConfiguration (
{
defaultImports(DependsOn::class, Repository::class, Import::class)
defaultImports(*ESSENTIAL_KOTLIN_SHELL_CLASSES)
defaultImports(*ESSENTIAL_KOTLIN_SHELL_IMPORTS)
jvm {
dependenciesFromClassContext(KotlinShellScriptConfiguration::class, "kotlin-shell-kts", "kotlin-stdlib", "kotlin-reflect")
}
refineConfiguration {
onAnnotations(DependsOn::class, Repository::class, Import::class, handler = MainKtsConfigurator())
}
ide {
acceptedLocations(ScriptAcceptedLocation.Everywhere)
}
jsr223 {
importAllBindings(true)
}
}
) {
companion object {
private val ESSENTIAL_KOTLIN_SHELL_CLASSES = arrayOf(
Shell::class,
ExecutionContext::class,
Process::class, SystemProcess::class, ProcessState::class, ProcessExecutable::class,
Pipeline::class
)
private val ESSENTIAL_KOTLIN_SHELL_IMPORTS = arrayOf(
"eu.jrie.jetbrains.kotlinshell.processes.process.ProcessChannel",
"eu.jrie.jetbrains.kotlinshell.processes.process.ProcessReceiveChannel",
"eu.jrie.jetbrains.kotlinshell.processes.process.ProcessSendChannel",
"eu.jrie.jetbrains.kotlinshell.processes.process.ProcessChannelUnit",
"eu.jrie.jetbrains.kotlinshell.shell.piping.PipelineContextLambda",
"eu.jrie.jetbrains.kotlinshell.shell.piping.PipelinePacketLambda",
"eu.jrie.jetbrains.kotlinshell.shell.piping.PipelineByteArrayLambda",
"eu.jrie.jetbrains.kotlinshell.shell.piping.PipelineStringLambda",
"eu.jrie.jetbrains.kotlinshell.shell.piping.PipelineStreamLambda",
"eu.jrie.jetbrains.kotlinshell.shell.ShellCommand",
"eu.jrie.jetbrains.kotlinshell.shell.up",
"eu.jrie.jetbrains.kotlinshell.shell.pre",
"eu.jrie.jetbrains.kotlinshell.shell.readonly",
"kotlinx.coroutines.channels.Channel",
"kotlinx.coroutines.delay",
"kotlinx.coroutines.channels.consumeEach",
"kotlinx.coroutines.delay",
"java.io.OutputStream",
"java.io.InputStream",
"kotlinx.io.core.ByteReadPacket",
"kotlinx.io.core.readBytes",
"kotlinx.io.core.writeFully",
"kotlinx.io.core.readText",
"kotlinx.io.core.writeText",
"kotlinx.io.streams.writePacket"
)
}
}
class KotlinShellScriptEvaluationConfiguration : ScriptEvaluationConfiguration (
{
scriptsInstancesSharing(true)
refineConfigurationBeforeEvaluate(::configureProvidedPropertiesFromJsr223Context)
}
)