(target js: (define fs (require 'fs)))
(target js: (define child_process (require 'child_process)))
(target lua:
(define call-with-file (f path mode)
(let |h,e| ((get io 'open) path mode)
(unless h
(error e))
(with x (f h)
((get h 'close) h)))))
(define read-file (path)
(target
js: ((get fs 'readFileSync) path 'utf8)
lua: (call-with-file
(fn (f) ((get f 'read) f '*a))
path)))
(define write-file (path data)
(target
js: ((get fs 'writeFileSync) path data 'utf8)
lua: (call-with-file
(fn (f) ((get f 'write) f data))
path 'w)))
(define file-exists? (path)
(target
js: (and ((get fs 'existsSync) path 'utf8)
((get ((get fs 'statSync) path) 'isFile)))
lua: (let f ((get io 'open) path)
(and (is? f)
(with r (or (is? ((get f 'read) f 0))
(= 0 ((get f 'seek) f 'end)))
((get f 'close) f))))))
(define directory-exists? (path)
(target
js: (and ((get fs 'existsSync) path 'utf8)
((get ((get fs 'statSync) path) 'isDirectory)))
lua: (let f ((get io 'open) path)
(and (is? f)
(with r (and (not ((get f 'read) f 0))
(not (= 0 ((get f 'seek) f 'end))))
((get f 'close) f))))))
(define path-separator
(target
js: (get (require 'path) 'sep)
lua: (char (get (get _G 'package) 'config) 0)))
(define path-join parts
(or (reduce (fn (x y) (cat x path-separator y)) parts) ""))
(define get-environment-variable (name)
(target
js: (get (get process 'env) name)
lua: ((get os 'getenv) name)))
(define write (x)
(target js: (let out (get process 'stdout)
((get out 'write) x))
lua: ((get io 'write) x)))
(define exit (code)
(target js: ((get process 'exit) code)
lua: ((get os 'exit) code)))
(define argv
(target js: (cut (get process 'argv) 2) lua: arg))
(define reload (module)
(wipe (target
lua: (get (get package 'loaded) module)
js: (get (get require 'cache) ((get require 'resolve) module))))
(require module))
(define run (command)
(target
js: ((get ((get child_process 'execSync) command) 'toString))
lua: (let f ((get io 'popen) command)
(with x ((get f 'read) f '*all)
((get f 'close) f)))))
(export read-file
write-file
file-exists?
directory-exists?
path-separator
path-join
get-environment-variable
write
exit
argv
reload
run)