@@ -16,11 +16,12 @@ import Data.Char
1616import Data.List
1717import qualified Data.Map as Map
1818import System.IO
19+import System.Directory
1920
2021idrNamespace :: String
2122idrNamespace = "__IDR__"
2223
23−data JSTarget = Node | JavaScript
24+data JSTarget = Node | JavaScript deriving Eq
2425
2526codegenJavaScript
2627 :: JSTarget
@@ -29,17 +30,25 @@ codegenJavaScript
2930 -> OutputType
3031 -> IO ()
3132codegenJavaScript target definitions filename outputType = do
32− let runtime = case target of
33− Node -> "-node"
34− JavaScript -> "-browser"
33+ let (header, runtime) = case target of
34+ Node ->
35+ ("#!/usr/bin/env node\n", "-node")
36+ JavaScript ->
37+ ("", "-browser")
3538 path <- getDataDir
3639 idrRuntime <- readFile $ path ++ "/js/Runtime-common.js"
3740 tgtRuntime <- readFile $ concat [path, "/js/Runtime", runtime, ".js"]
38− writeFile filename (idrRuntime
41+ writeFile filename ( header
42+ ++ idrRuntime
3943 ++ tgtRuntime
4044 ++ modules
4145 ++ functions
4246 ++ mainLoop)
47+
48+ setPermissions filename (emptyPermissions { readable = True
49+ , executable = target == Node
50+ , writable = True
51+ })
4352 where
4453 def = map (first translateNamespace) definitions
4554