@@ -16,11 +16,12 @@ import Data.Char
16import Data.List
16import Data.List
17import qualified Data.Map as Map
17import qualified Data.Map as Map
18import System.IO
18import System.IO
19+import System.Directory
20idrNamespace :: String
21idrNamespace :: String
21idrNamespace = "__IDR__"
22idrNamespace = "__IDR__"
23−data JSTarget = Node | JavaScript
24+data JSTarget = Node | JavaScript deriving Eq
25codegenJavaScript
26codegenJavaScript
26 :: JSTarget
27 :: JSTarget
@@ -29,17 +30,25 @@ codegenJavaScript
29 -> OutputType
30 -> OutputType
31codegenJavaScript target definitions filename outputType = do
32codegenJavaScript target definitions filename outputType = do
32− let runtime = case target of
33+ let (header, runtime) = case target of
33− Node -> "-node"
34+ Node ->
35+ ("#!/usr/bin/env node\n", "-node")
34− JavaScript -> "-browser"
36+ JavaScript ->
35 path <- getDataDir
38 path <- getDataDir
36 idrRuntime <- readFile $ path ++ "/js/Runtime-common.js"
39 idrRuntime <- readFile $ path ++ "/js/Runtime-common.js"
37 tgtRuntime <- readFile $ concat [path, "/js/Runtime", runtime, ".js"]
40 tgtRuntime <- readFile $ concat [path, "/js/Runtime", runtime, ".js"]
38− writeFile filename (idrRuntime
41+ writeFile filename ( header
39 ++ tgtRuntime
43 ++ tgtRuntime
40 ++ modules
44 ++ modules
41 ++ functions
45 ++ functions
42 ++ mainLoop)
46 ++ mainLoop)
48+ setPermissions filename (emptyPermissions { readable = True
49+ , executable = target == Node
44 def = map (first translateNamespace) definitions
53 def = map (first translateNamespace) definitions