Add NodeJS wrapper, which executes the main function when run under Node.

This commit is contained in:
Robin Heggelund Hansen 2022-08-26 16:17:08 +02:00
parent 71f4fd97f3
commit 71af2c99b9
3 changed files with 39 additions and 0 deletions

View File

@ -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);
}
|]

View File

@ -134,6 +134,7 @@ Common gren-common
Canonicalize.Type
Compile
Generate.Html
Generate.Node
Generate.JavaScript
Generate.JavaScript.Builder
Generate.JavaScript.Expression

View File

@ -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