diff --git a/compiler/src/Generate/Node.hs b/compiler/src/Generate/Node.hs new file mode 100644 index 00000000..2c51897d --- /dev/null +++ b/compiler/src/Generate/Node.hs @@ -0,0 +1,33 @@ +{-# LANGUAGE OverloadedStrings #-} +{-# LANGUAGE QuasiQuotes #-} + +module Generate.Node + ( sandwich, + ) +where + +import Data.ByteString.Builder qualified as B +import Data.Name qualified as Name +import Text.RawString.QQ (r) + +-- SANDWICH + +sandwich :: Name.Name -> B.Builder -> B.Builder +sandwich moduleName javascript = + let name = Name.toBuilder moduleName + in [r|#!/usr/bin/env node + +try { +|] + <> javascript + <> [r| +|] + <> [r|this.Gren.|] + <> name + <> [r|.init({}); +} +catch (e) +{ +console.error(e); +} +|] diff --git a/gren.cabal b/gren.cabal index c42ad256..69be64d4 100644 --- a/gren.cabal +++ b/gren.cabal @@ -134,6 +134,7 @@ Common gren-common Canonicalize.Type Compile Generate.Html + Generate.Node Generate.JavaScript Generate.JavaScript.Builder Generate.JavaScript.Expression diff --git a/terminal/src/Make.hs b/terminal/src/Make.hs index b781ba0d..eecff336 100644 --- a/terminal/src/Make.hs +++ b/terminal/src/Make.hs @@ -21,6 +21,7 @@ import Directories qualified as Dirs import File qualified import Generate qualified import Generate.Html qualified as Html +import Generate.Node qualified as Node import Gren.Details qualified as Details import Gren.ModuleName qualified as ModuleName import Gren.Outline qualified as Outline @@ -92,6 +93,10 @@ runHelp root paths style (Flags debug optimize maybeOutput _ maybeDocs) = do builder <- toBuilder root details desiredMode artifacts generate style "index.html" (Html.sandwich name builder) (NE.List name []) + (Platform.Node, [name]) -> + do + builder <- toBuilder root details desiredMode artifacts + generate style "gren.js" (Node.sandwich name builder) (NE.List name []) (_, name : names) -> do builder <- toBuilder root details desiredMode artifacts