Skip to content

Commit 25d8577

Browse files
committed
Move child_process to its own package.
0 parents  commit 25d8577

File tree

8 files changed

+350
-0
lines changed

8 files changed

+350
-0
lines changed

.gitignore

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
/.*
2+
!/.gitignore
3+
bower_components/
4+
node_modules/
5+
output/
6+
tmp/
7+
npm-debug.log

README.md

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
# Module Documentation
2+
3+
## Module Node.ChildProcess
4+
5+
### Types
6+
7+
newtype ChildProcess where
8+
ChildProcess :: ChildProcessRec -> ChildProcess
9+
10+
type ChildProcessRec = { disconnect :: forall eff. Fn0 (Eff eff Unit), send :: forall eff r. Fn2 { | r } Handle (Eff eff Unit), kill :: forall eff. Fn1 Signal Boolean, connected :: Boolean, pid :: Number, stdout :: Stream Stdout, stdin :: Stream Stdin, stderr :: Stream Stderr }
11+
12+
data Handle :: *
13+
14+
data Spawn :: !
15+
16+
type SpawnOptions = { gid :: Number, uid :: Number, detached :: Boolean, env :: forall r. { | r }, stdio :: [String], cwd :: String }
17+
18+
data Stderr :: !
19+
20+
data Stdin :: !
21+
22+
data Stdout :: !
23+
24+
data Stream :: ! -> *
25+
26+
27+
### Type Class Instances
28+
29+
instance eventEmitterChildProcess :: EventEmitter ChildProcess
30+
31+
instance eventEmitterStreamStderr :: EventEmitter (Stream Stderr)
32+
33+
instance eventEmitterStreamStdin :: EventEmitter (Stream Stdin)
34+
35+
instance eventEmitterStreamStdout :: EventEmitter (Stream Stdout)
36+
37+
38+
### Values
39+
40+
closeEvent :: Event
41+
42+
defaultSpawnOptions :: SpawnOptions
43+
44+
disconnectEvent :: Event
45+
46+
errorEvent :: Event
47+
48+
exitEvent :: Event
49+
50+
messageEvent :: Event
51+
52+
process :: forall r. { env :: { | r } }
53+
54+
spawn :: forall eff. String -> [String] -> SpawnOptions -> Eff (spawn :: Spawn | eff) ChildProcess
55+
56+
undefined :: forall a. a
57+
58+
59+
## Module Node.ChildProcess.Signal
60+
61+
### Types
62+
63+
newtype Signal
64+
65+
66+
### Type Class Instances
67+
68+
instance showSignal :: Show Signal
69+
70+
71+

bower.json

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
{
2+
"name": "purescript-node-child-process",
3+
"version": "0.0.0",
4+
"description": "PureScript bindings to child_process.",
5+
"license": "MIT",
6+
"dependencies": {
7+
"purescript-node-events": "~0.0.5"
8+
}
9+
}

gulpfile.js

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
'use strict'
2+
3+
var gulp = require('gulp')
4+
, purescript = require('gulp-purescript')
5+
;
6+
7+
var paths = {
8+
src: 'src/**/*.purs',
9+
bowerSrc: [
10+
'bower_components/purescript-*/src/**/*.purs',
11+
'bower_components/purescript-*/src/**/*.purs.hs'
12+
],
13+
dest: '',
14+
docsDest: 'README.md'
15+
};
16+
17+
var options = {
18+
compiler: {},
19+
docgen: {}
20+
};
21+
22+
var compile = function(compiler) {
23+
var psc = compiler(options.compiler);
24+
psc.on('error', function(e) {
25+
console.error(e.message);
26+
psc.end();
27+
});
28+
return gulp.src([paths.src].concat(paths.bowerSrc))
29+
.pipe(psc)
30+
.pipe(gulp.dest(paths.dest));
31+
};
32+
33+
gulp.task('make', function() {
34+
return compile(purescript.pscMake);
35+
});
36+
37+
gulp.task('browser', function() {
38+
return compile(purescript.psc);
39+
});
40+
41+
gulp.task('docs', function() {
42+
var docgen = purescript.docgen(options.docgen);
43+
docgen.on('error', function(e) {
44+
console.error(e.message);
45+
docgen.end();
46+
});
47+
return gulp.src(paths.src)
48+
.pipe(docgen)
49+
.pipe(gulp.dest(paths.docsDest));
50+
});
51+
52+
gulp.task('watch-browser', function() {
53+
gulp.watch(paths.src, ['browser', 'docs']);
54+
});
55+
56+
gulp.task('watch-make', function() {
57+
gulp.watch(paths.src, ['make', 'docs']);
58+
});
59+
60+
gulp.task('default', ['make', 'docs']);

package.json

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
{
2+
"name": "purescript-node-child-process",
3+
"version": "0.0.0",
4+
"description": "PureScript bindings to child_process.",
5+
"license": "MIT",
6+
"devDependencies": {
7+
"gulp": "^3.8.7",
8+
"gulp-purescript": "0.0.9"
9+
}
10+
}

src/Node/ChildProcess.purs

Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
module Node.ChildProcess where
2+
3+
import Control.Monad.Eff (Eff())
4+
5+
import Data.Function (Fn0(), Fn1(), Fn2())
6+
7+
import Node.ChildProcess.Signal (Signal(..))
8+
import Node.Events (Event(..), EventEmitter)
9+
10+
foreign import data Handle :: *
11+
foreign import data Spawn :: !
12+
foreign import data Stream :: ! -> *
13+
foreign import data Stderr :: !
14+
foreign import data Stdin :: !
15+
foreign import data Stdout :: !
16+
17+
newtype ChildProcess = ChildProcess ChildProcessRec
18+
19+
type ChildProcessRec =
20+
{ stderr :: Stream Stderr
21+
, stdin :: Stream Stdin
22+
, stdout :: Stream Stdout
23+
, pid :: Number
24+
, connected :: Boolean
25+
, kill :: forall eff. Fn1 Signal Boolean
26+
, send :: forall eff r. Fn2 { | r} Handle (Eff eff Unit)
27+
, disconnect :: forall eff. Fn0 (Eff eff Unit)
28+
}
29+
30+
type SpawnOptions =
31+
{ cwd :: String
32+
, stdio :: [String]
33+
, env :: forall r. { | r}
34+
, detached :: Boolean
35+
, uid :: Number
36+
, gid :: Number
37+
}
38+
39+
instance eventEmitterStreamStderr :: EventEmitter (Stream Stderr)
40+
instance eventEmitterStreamStdin :: EventEmitter (Stream Stdin)
41+
instance eventEmitterStreamStdout :: EventEmitter (Stream Stdout)
42+
43+
instance eventEmitterChildProcess :: EventEmitter ChildProcess
44+
45+
closeEvent :: Event
46+
closeEvent = Event "close"
47+
48+
disconnectEvent :: Event
49+
disconnectEvent = Event "disconnect"
50+
51+
errorEvent :: Event
52+
errorEvent = Event "error"
53+
54+
exitEvent :: Event
55+
exitEvent = Event "exit"
56+
57+
messageEvent :: Event
58+
messageEvent = Event "message"
59+
60+
foreign import spawn
61+
"function spawn(command) {\
62+
\ return function(args) {\
63+
\ return function(opts) {\
64+
\ return function() {\
65+
\ return require('child_process').spawn(command, args, opts);\
66+
\ }\
67+
\ }\
68+
\ }\
69+
\}" :: forall eff. String -> [String] -> SpawnOptions -> Eff (spawn :: Spawn | eff) ChildProcess
70+
71+
defaultSpawnOptions :: SpawnOptions
72+
defaultSpawnOptions =
73+
{ cwd: undefined
74+
, stdio: ["pipe", "pipe", "pipe"]
75+
, env: process.env
76+
, detached: false
77+
, uid: undefined
78+
, gid: undefined
79+
}
80+
81+
-- There's gotta be a better way.
82+
foreign import undefined :: forall a. a
83+
foreign import process :: forall r. {env :: { | r}}

src/Node/ChildProcess/Signal.purs

Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
module Node.ChildProcess.Signal
2+
( Signal()
3+
, sigabrt
4+
, sigalrm
5+
, sigbus
6+
, sigchld
7+
, sigcld
8+
, sigcont
9+
, sigemt
10+
, sigfpe
11+
, sighup
12+
, sigill
13+
, siginfo
14+
, sigint
15+
, sigio
16+
, sigiot
17+
, sigkill
18+
, siglost
19+
, sigpipe
20+
, sigpoll
21+
, sigprof
22+
, sigpwr
23+
, sigquit
24+
, sigsegv
25+
, sigstkflt
26+
, sigstop
27+
, sigsys
28+
, sigterm
29+
, sigtrap
30+
, sigtstp
31+
, sigttin
32+
, sigttou
33+
, sigunused
34+
, sigurg
35+
, sigusr1
36+
, sigusr2
37+
, sigvtalrm
38+
, sigwinch
39+
, sigxcpu
40+
, sigxfsz
41+
) where
42+
43+
newtype Signal = Signal String
44+
45+
sigabrt = Signal "SIGABRT"
46+
sigalrm = Signal "SIGALRM"
47+
sigbus = Signal "SIGBUS"
48+
sigchld = Signal "SIGCHLD"
49+
sigcld = Signal "SIGCLD"
50+
sigcont = Signal "SIGCONT"
51+
sigemt = Signal "SIGEMT"
52+
sigfpe = Signal "SIGFPE"
53+
sighup = Signal "SIGHUP"
54+
sigill = Signal "SIGILL"
55+
siginfo = Signal "SIGINFO"
56+
sigint = Signal "SIGINT"
57+
sigio = Signal "SIGIO"
58+
sigiot = Signal "SIGIOT"
59+
sigkill = Signal "SIGKILL"
60+
siglost = Signal "SIGLOST"
61+
sigpipe = Signal "SIGPIPE"
62+
sigpoll = Signal "SIGPOLL"
63+
sigprof = Signal "SIGPROF"
64+
sigpwr = Signal "SIGPWR"
65+
sigquit = Signal "SIGQUIT"
66+
sigsegv = Signal "SIGSEGV"
67+
sigstkflt = Signal "SIGSTKFLT"
68+
sigstop = Signal "SIGSTOP"
69+
sigsys = Signal "SIGSYS"
70+
sigterm = Signal "SIGTERM"
71+
sigtrap = Signal "SIGTRAP"
72+
sigtstp = Signal "SIGTSTP"
73+
sigttin = Signal "SIGTTIN"
74+
sigttou = Signal "SIGTTOU"
75+
sigunused = Signal "SIGUNUSED"
76+
sigurg = Signal "SIGURG"
77+
sigusr1 = Signal "SIGUSR1"
78+
sigusr2 = Signal "SIGUSR2"
79+
sigvtalrm = Signal "SIGVTALRM"
80+
sigwinch = Signal "SIGWINCH"
81+
sigxcpu = Signal "SIGXCPU"
82+
sigxfsz = Signal "SIGXFSZ"
83+
84+
instance showSignal :: Show Signal where
85+
show (Signal sig) = sig

test/Node/ChildProcess.purs

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
module Test.Node.ChildProcess where
2+
3+
import Data.Function (mkFn2, runFn1)
4+
5+
import Debug.Trace
6+
7+
import Node.ChildProcess
8+
import Node.ChildProcess.Signal
9+
import Node.Events
10+
11+
foreign import toString
12+
"function toString(x) {\
13+
\ return x == null ? 'null' : x.toString();\
14+
\}" :: forall a. a -> String
15+
16+
main = do
17+
ChildProcess ls <- spawn "ls" ["-la"] defaultSpawnOptions
18+
on closeEvent (mkFn2 \code sig ->
19+
trace $ "ls exited with code: " ++
20+
(toString code) ++
21+
"\nfrom signal: " ++
22+
(toString sig))
23+
(ChildProcess ls)
24+
on (Event "data") (toString >>> trace) ls.stdout
25+
pure $ runFn1 ls.kill sigterm

0 commit comments

Comments
 (0)