0 | ||| The `Node` generator.
 1 | module Compiler.ES.Node
 2 |
 3 | import Idris.Env
 4 | import Idris.Syntax
 5 |
 6 | import Compiler.ES.Codegen
 7 |
 8 | import Compiler.Common
 9 |
10 | import Libraries.Utils.Path
11 |
12 | import System
13 | import System.File.Permissions
14 |
15 | %default covering
16 |
17 | envNode : String
18 | envNode = "/usr/bin/env node"
19 |
20 | findNode : IO String
21 | findNode = do
22 |    Nothing <- idrisGetEnv "NODE"
23 |       | Just node => pure node
24 |    path <- pathLookup ["node"]
25 |    pure $ fromMaybe envNode path
26 |
27 | ||| Compile a TT expression to Node
28 | compileToNode :
29 |   Ref Ctxt Defs ->
30 |   Ref Syn SyntaxInfo ->
31 |   ClosedTerm -> Core String
32 | compileToNode c s tm = do
33 |   js <- compileToES c s Node tm ["node", "javascript"]
34 |   pure $ shebang ++ js
35 |   where
36 |     shebang : String
37 |     shebang = "#!\{envNode}\n"
38 |
39 | ||| Node implementation of the `compileExpr` interface.
40 | compileExpr :
41 |   Ref Ctxt Defs ->
42 |   Ref Syn SyntaxInfo ->
43 |   (tmpDir : String) ->
44 |   (outputDir : String) ->
45 |   ClosedTerm ->
46 |   (outfile : String) ->
47 |   Core (Maybe String)
48 | compileExpr c s tmpDir outputDir tm outfile =
49 |   do es <- compileToNode c s tm
50 |      let out = outputDir </> outfile
51 |      Core.writeFile out es
52 |      coreLift_ $ chmodRaw out 0o755
53 |      pure (Just out)
54 |
55 | ||| Node implementation of the `executeExpr` interface.
56 | executeExpr :
57 |   Ref Ctxt Defs ->
58 |   Ref Syn SyntaxInfo ->
59 |   (tmpDir : String) -> ClosedTerm -> Core ()
60 | executeExpr c s tmpDir tm =
61 |   do let outn = tmpDir </> "_tmp_node.js"
62 |      js <- compileToNode c s tm
63 |      Core.writeFile outn js
64 |      node <- coreLift findNode
65 |      quoted_node <- pure $ "\"" ++ node ++ "\"" -- Windows often have a space in the path.
66 |      coreLift_ $ system (quoted_node ++ " " ++ outn)
67 |
68 | ||| Codegen wrapper for Node implementation.
69 | export
70 | codegenNode : Codegen
71 | codegenNode = MkCG compileExpr executeExpr Nothing Nothing
72 |