Full Code of eeue56/servelm for AI

master 78b147a7836e cached
21 files
48.9 KB
12.7k tokens
1 requests
Download .txt
Repository: eeue56/servelm
Branch: master
Commit: 78b147a7836e
Files: 21
Total size: 48.9 KB

Directory structure:
gitextract_5yerz_kn/

├── .gitignore
├── LICENSE
├── README.md
├── elm-package.json
├── example/
│   ├── client/
│   │   ├── App.elm
│   │   ├── HomepageStylesheet.elm
│   │   ├── Stylesheets.elm
│   │   └── elm-package.json
│   ├── elm-package.json
│   ├── run.sh
│   └── server/
│       ├── Main.elm
│       └── ServerSideClient/
│           ├── App.elm
│           ├── HomepageStylesheet.elm
│           └── Stylesheets.elm
└── src/
    ├── Http/
    │   ├── Listeners.elm
    │   ├── Request.elm
    │   ├── Response/
    │   │   └── Write.elm
    │   ├── Response.elm
    │   └── Server.elm
    └── Native/
        ├── Http/
        │   └── Response/
        │       └── Write.js
        └── Http.js

================================================
FILE CONTENTS
================================================

================================================
FILE: .gitignore
================================================
example/*.js
elm-stuff/
.DS_Store
node_modules/
elm.js
.comp


================================================
FILE: LICENSE
================================================
The MIT License (MIT)

Copyright (c) 2015 Isaac Shapira

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.



================================================
FILE: README.md
================================================
# Servelm - Elm Http Server

# Deprecated. Server side elm is not designed to work this way.




This server, along with rtfeldman's Elm stylesheets, means that we can now have full stack Elm support. At no point in the development of an application will you have to write anything other than Elm!

It now supports server-side rendering of elm-html.

A demo can be found [here](http://107.170.81.176/). The styling is done through compile-time correct CSS provided by [elm-stylesheets](https://github.com/rtfeldman/elm-stylesheets).

# APIs exposed

The Http.Server module allows you to create servers and run them.

## Sending out Elm

Use the `Http.Response.writeElm` function to compile an Elm file on request. It will compile an Elm file found with `name + ".elm""`. It will write the output to a file in the same folder as `name + ".html"`. This will then be served out to the client. There is basic caching involved at the moment, which works based on the lifecycle of the server. Restart the server if you make any changes.

This is enabled by the [node-elm-compiler](https://github.com/rtfeldman/node-elm-compiler) package.

It also supports server-side rendering of elm-html, through using the [vdom-to-html](https://github.com/nthtran/vdom-to-html) package.


## Get started

To start Elm inside of Node simply this to the end of your compiled Elm code.

```JavaScript
Elm.worker(Elm.Main);
```

Take a look at `example/run.sh` to see a complete usage

```bash
elm make example/server/Main.elm --output=example/main.js
echo "Elm.worker(Elm.Main);" >> example/main.js
node example/main.js
```

## Run the example

This project depends on Node.js and the `node` command.

```bash
example/run.sh
```

Then load up the browser to see it working!


# Credit

Originally inspired by https://github.com/Fresheyeball/elm-http-server.

There was some great work already there, I just cleaned it up a little and integrated it with some other packages.



================================================
FILE: elm-package.json
================================================
{
    "version": "1.0.0",
    "summary": "",
    "repository": "https://github.com/eeue56/servelm.git",
    "license": "MIT",
    "source-directories": [
        "src/",
        "example/",
        "example/server/"
    ],
    "exposed-modules": [
        "Http"
    ],
    "native-modules": true,
    "dependencies": {
        "elm-lang/core": "2.1.0 <= v < 3.0.0",
        "evancz/elm-html": "4.0.1 <= v < 5.0.0",
        "evancz/virtual-dom": "2.1.0 <= v < 3.0.0"
    },
    "elm-version": "0.15.1 <= v < 0.16.0"
}


================================================
FILE: example/client/App.elm
================================================
module App where

import Html exposing (..)
import Html.Attributes exposing (id, src, href)
import HomepageStylesheet exposing (..)
import Stylesheets
import Json.Encode as Encode


main : Html
main =
    div
        [ id "dave" ]
        [
            div [ Html.Attributes.property "innerHTML" (Encode.string ("<style>" ++ (Stylesheets.prettyPrint 4 HomepageStylesheet.exports) ++ "</style>")) ] [],

            div
                [ ]
                [ a
                    [ href "/App.elm"
                    ]
                    [ text "This site was entirely written in Elm! Try /App.elm to see the source for this page!"
                    ]
                ]
        ]


================================================
FILE: example/client/HomepageStylesheet.elm
================================================
module HomepageStylesheet where

import Stylesheets exposing (..)

exports =
    css
        |%| body
            |-| backgroundColor (rgb 173 191 160)
            |-| boxSizing borderBox
            |-| padding 12 px


================================================
FILE: example/client/Stylesheets.elm
================================================
module Stylesheets where

{-
    Implementation notes:

    - strip out []()""'' - so:
    - toString ["html", "body"] -> "[\"html\",\"body\"]" -> "html,body"

    How would you write this?

    html, body, .foo, .bar
        width: 100%
-}

import String

prettyPrint : Int -> Style class id -> String
prettyPrint =
    prettyPrintHelp 0


prettyPrintHelp : Int -> Int -> Style class id -> String
prettyPrintHelp indentLevel indentSpaces (Style selector attributes children) =
    if (indentLevel == 0) && (String.isEmpty selector) then
        children
            |> List.map (prettyPrintHelp indentLevel indentSpaces)
            |> String.join "\n\n"
    else
        let
            indentStr =
                String.repeat (indentSpaces * indentLevel) " "

            subIndentStr =
                indentStr ++ String.repeat (indentSpaces) " "

            attrsStr =
                if List.isEmpty attributes then
                    ""
                else
                    attributes
                        |> List.map attributeToString
                        |> String.join subIndentStr
                        |> (++) subIndentStr

            prettyPrintChild =
                prettyPrintHelp (indentLevel + 1) indentSpaces

            childrenStr =
                if List.isEmpty children then
                    ""
                else
                    children
                        |> List.map prettyPrintChild
                        |> String.join subIndentStr
                        |> (++) subIndentStr
        in
            indentStr ++ selector ++ " {\n"
                ++ attrsStr
                ++ childrenStr
                ++ "}"


attributeToString : Attribute -> String
attributeToString (Attribute str) =
    str ++ ";\n"


{- Tags -}

html = Tag "html"
body = Tag "body"
header = Tag "header"
nav = Tag "nav"
div = Tag "div"
span = Tag "span"
img = Tag "img"
nowrap = Tag "nowrap"
button = Tag "button"
h1 = Tag "h1"
h2 = Tag "h2"
h3 = Tag "h3"
h4 = Tag "h4"
p = Tag "p"
ol = Tag "ol"
input = Tag "input"

tagToString (Tag str) = str


-- TODO these are just for @media - maybe improve type guarantees?
screen = "screen"
print = "print"

-- TODO this is just for ::selection - maybe improve type guarantees?
selection = "selection"


{- Units -}

inheritToString : (a -> String) -> InheritOr a -> String
inheritToString translate value =
    case value of
        Inherit ->
            "inherit"

        NotInherit notInherit ->
            translate notInherit


autoToString : (a -> String) -> AutoOr a -> String
autoToString translate value =
    case value of
        Auto ->
            "auto"

        NotAuto notAuto ->
            translate notAuto

noneToString : (a -> String) -> NoneOr a -> String
noneToString translate value =
    case value of
        None ->
            "none"

        NotNone notNone ->
            translate notNone


unitsToString : Units -> String
unitsToString =
    (\(ExplicitUnits str) -> str)
        |> inheritToString


boxSizingToString : BoxSizing -> String
boxSizingToString =
    (\(ExplicitBoxSizing str) -> str)
        |> inheritToString


overflowToString : Overflow -> String
overflowToString =
    (\(ExplicitOverflow str) -> str)
        |> autoToString
        |> inheritToString


displayToString : Display -> String
displayToString =
    (\(ExplicitDisplay str) -> str)
        |> noneToString
        |> inheritToString


verticalAlignToString : VerticalAlign -> String
verticalAlignToString =
    (\(ExplicitVerticalAlign str) -> str)
        |> inheritToString


whiteSpaceToString : WhiteSpace -> String
whiteSpaceToString =
    (\(ExplicitWhiteSpace str) -> str)
        |> autoToString
        |> inheritToString

colorToString : Color -> String
colorToString =
    (\(ExplicitColor str) -> str)
        |> autoToString
        |> inheritToString


numberToString : number -> String
numberToString num =
    toString (num + 0)


textShadowToString : TextShadow -> String
textShadowToString =
    explicitTextShadowToString
        |> noneToString
        |> inheritToString


explicitTextShadowToString : ExplicitTextShadow -> String
explicitTextShadowToString value =
    case value of
        NoTextShadow ->
            "TODO"

outlineStyleToString : OutlineStyle -> String
outlineStyleToString (OutlineStyle str) = str


opacityStyleToString : OpacityStyle -> String
opacityStyleToString (OpacityStyle str) = str


type Tag
    = Tag String

type InheritOr a
    = Inherit
    | NotInherit a

type AutoOr a
    = Auto
    | NotAuto a

type NoneOr a
    = None
    | NotNone a

type alias BoxSizing = InheritOr ExplicitBoxSizing
type alias Overflow = InheritOr (AutoOr ExplicitOverflow)
type alias Display = InheritOr (NoneOr ExplicitDisplay)
type alias WhiteSpace = InheritOr (AutoOr ExplicitWhiteSpace)
type alias Color = InheritOr (AutoOr ExplicitColor)
type alias TextShadow = InheritOr (NoneOr ExplicitTextShadow)
type alias Outline = InheritOr ExplicitOutline
type alias Units = InheritOr ExplicitUnits
type alias VerticalAlign = InheritOr ExplicitVerticalAlign

type ExplicitUnits = ExplicitUnits String
type ExplicitBoxSizing = ExplicitBoxSizing String
type ExplicitOverflow = ExplicitOverflow String
type ExplicitDisplay = ExplicitDisplay String
type ExplicitWhiteSpace = ExplicitWhiteSpace String
type ExplicitColor = ExplicitColor String
type ExplicitVerticalAlign = ExplicitVerticalAlign String

type ExplicitOutline
    = ExplicitOutline Float ExplicitUnits OutlineStyle OpacityStyle

type OutlineStyle
    = OutlineStyle String

type OpacityStyle
    = OpacityStyle String

type ExplicitTextShadow
    = NoTextShadow

solid : OutlineStyle
solid = OutlineStyle "solid"

transparent : OpacityStyle
transparent = OpacityStyle "transparent"

rgb : number -> number -> number -> Color
rgb r g b =
    ExplicitColor ("rgb(" ++ (numberToString r) ++ ", " ++ (numberToString g) ++ ", " ++ (numberToString b) ++ ")")
        |> NotAuto |> NotInherit


rgba : number -> number -> number -> number -> Color
rgba r g b a =
    ExplicitColor ("rgba(" ++ (numberToString r) ++ ", " ++ (numberToString g) ++ ", " ++ (numberToString b) ++ ", " ++ (numberToString a) ++ ")")
        |> NotAuto |> NotInherit


hex : String -> Color
hex str =
    ExplicitColor ("#" ++ str)
        |> NotAuto |> NotInherit

pct : Units
pct = "%" |> ExplicitUnits |> NotInherit

em : Units
em = "em" |> ExplicitUnits |> NotInherit

px : Units
px = "px" |> ExplicitUnits |> NotInherit

borderBox = "border-box" |> ExplicitBoxSizing |> NotInherit

visible : Display
visible = "visible" |> ExplicitDisplay |> NotNone |> NotInherit

block : Display
block = "block" |> ExplicitDisplay |> NotNone |> NotInherit

inlineBlock : Display
inlineBlock = "inline-block" |> ExplicitDisplay |> NotNone |> NotInherit

inline : Display
inline = "inline" |> ExplicitDisplay |> NotNone |> NotInherit

none : InheritOr (NoneOr a)
none = None |> NotInherit

auto : InheritOr (AutoOr a)
auto = Auto |> NotInherit

inherit : InheritOr a
inherit = Inherit

noWrap : WhiteSpace
noWrap = "no-wrap" |> ExplicitWhiteSpace |> NotAuto |> NotInherit

top : VerticalAlign
top = "top" |> ExplicitVerticalAlign |> NotInherit

middle : VerticalAlign
middle = "middle" |> ExplicitVerticalAlign |> NotInherit

bottom : VerticalAlign
bottom = "bottom" |> ExplicitVerticalAlign |> NotInherit


{- Attributes -}

attr1 name translate value =
    Attribute (name ++ ": " ++ (translate value))


attr2 name translateA translateB valueA valueB =
    Attribute (name ++ ": " ++ (translateA valueA) ++ (translateB valueB))


attr3 name translateA translateB translateC valueA valueB valueC =
    Attribute (name ++ ": " ++ (translateA valueA) ++ (translateB valueB) ++ (translateC valueC))


attr4 name translateA translateB translateC translateD valueA valueB valueC valueD =
    Attribute (name ++ ": " ++ (translateA valueA) ++ (translateB valueB) ++ (translateC valueC) ++ (translateD valueD))


attr5 name translateA translateB translateC translateD translateE valueA valueB valueC valueD valueE =
    Attribute (name ++ ": " ++ (translateA valueA) ++ (translateB valueB) ++ (translateC valueC) ++ (translateD valueD) ++ (translateE valueE))


verticalAlign : VerticalAlign -> Attribute
verticalAlign =
    attr1 "vertical-align" verticalAlignToString


display : Display -> Attribute
display =
    attr1 "display" displayToString


opacity : OpacityStyle -> Attribute
opacity =
    attr1 "opacity" toString


width : number -> Units -> Attribute
width =
    attr2 "width" numberToString unitsToString


minWidth : number -> Units -> Attribute
minWidth =
    attr2 "min-width" numberToString unitsToString


height : number -> Units -> Attribute
height =
    attr2 "height" numberToString unitsToString


minHeight : number -> Units -> Attribute
minHeight =
    attr2 "min-height" numberToString unitsToString


padding : number -> Units -> Attribute
padding =
    attr2 "padding" numberToString unitsToString

paddingTop : number -> Units -> Attribute
paddingTop =
    attr2 "padding-top" numberToString unitsToString

paddingBottom : number -> Units -> Attribute
paddingBottom =
    attr2 "padding-bottom" numberToString unitsToString

paddingRight : number -> Units -> Attribute
paddingRight =
    attr2 "padding-right" numberToString unitsToString

paddingLeft : number -> Units -> Attribute
paddingLeft =
    attr2 "padding-left" numberToString unitsToString

margin : number -> Units -> Attribute
margin =
    attr2 "margin" numberToString unitsToString

marginTop : number -> Units -> Attribute
marginTop =
    attr2 "margin-top" numberToString unitsToString

marginBottom : number -> Units -> Attribute
marginBottom =
    attr2 "margin-bottom" numberToString unitsToString

marginRight : number -> Units -> Attribute
marginRight =
    attr2 "margin-right" numberToString unitsToString

marginLeft : number -> Units -> Attribute
marginLeft =
    attr2 "margin-left" numberToString unitsToString

boxSizing : BoxSizing -> Attribute
boxSizing =
    attr1 "box-sizing" boxSizingToString


overflowX : Overflow -> Attribute
overflowX =
    attr1 "overflow-x" overflowToString


overflowY : Overflow -> Attribute
overflowY =
    attr1 "overflow-y" overflowToString


whiteSpace : WhiteSpace -> Attribute
whiteSpace =
    attr1 "white-space" whiteSpaceToString





backgroundColor : Color -> Attribute
backgroundColor =
    attr1 "background-color" colorToString


color : Color -> Attribute
color =
    attr1 "color" colorToString


media : a -> String
media value =
    "media " ++ (toString value)
    -- TODO

textShadow : TextShadow -> Attribute
textShadow =
    attr1 "text-shadow" textShadowToString


outline : Float -> Units -> OutlineStyle -> OpacityStyle -> Attribute
outline =
    attr4
        "outline"
            toString unitsToString
            (\str -> " " ++ outlineStyleToString str ++ " ")
            opacityStyleToString


{- Types -}

type Style class id
    = Style String (List Attribute) (List (Style class id))


type Attribute
    = Attribute String


css : Style class id
css =
    Style "" [] []


styleWithPrefix : String -> Style class id -> a -> Style class id
styleWithPrefix prefix (Style selector attrs children) childSelector =
    children ++ [ Style (prefix ++ (toString childSelector)) [] [] ]
        |> Style selector attrs


(|%|) : Style class id -> Tag -> Style class id
(|%|) (Style selector attrs children) tag =
    children ++ [ Style (tagToString tag) [] [] ]
        |> Style selector attrs


(|%|=) : Style class id -> List Tag -> Style class id
(|%|=) (Style selector attrs children) tags =
    let
        childSelector =
            tags
                |> List.map tagToString
                |> String.join ", "
    in
        children ++ [ Style childSelector [] [] ]
            |> Style selector attrs


(|@|) : Style class id -> a -> Style class id
(|@|) = styleWithPrefix "@"


(|::|) : Style class id -> a -> Style class id
(|::|) = styleWithPrefix "::"


(|>%|) : Style class id -> Tag -> Style class id
(|>%|) (Style selector attrs children) tag =
    case splitStartLast children of
        ( _, Nothing ) ->
            children ++ [ Style (selector ++ " > " ++ tagToString tag) [] [] ]
                |> Style selector attrs

        ( start, Just (Style activeSelector _ _) ) ->
            children ++ [ Style (activeSelector ++ " > " ++ tagToString tag) [] [] ]
                |> Style selector attrs


(|>%|=) : Style class id -> List Tag -> Style class id
(|>%|=) (Style selector attrs children) tags =
    let
        selectorFromTag tag =
            case splitStartLast children of
                ( _, Nothing ) ->
                    selector ++ " > " ++ tagToString tag

                ( start, Just (Style activeSelector _ _) ) ->
                    activeSelector ++ " > " ++ tagToString tag

        childSelector =
            tags
                |> List.map selectorFromTag
                |> String.join ", "
    in
        children ++ [ Style childSelector [] [] ]
            |> Style selector attrs


(|.|) : Style class id -> class -> Style class id
(|.|) = styleWithPrefix "."


(|#|) : Style class id -> id -> Style class id
(|#|) = styleWithPrefix "#"


(|>.|) : Style class id -> a -> Style class id
(|>.|) = styleWithPrefix ">."


(|!|) : Style class id -> Attribute -> Style class id
(|!|) style (Attribute attrString) =
    transformActiveChild (addAttr (Attribute (attrString ++ " !important"))) style


(|-|) : Style class id -> Attribute -> Style class id
(|-|) style attr =
    transformActiveChild (addAttr attr) style


addAttr : Attribute -> Style a b -> Style a b
addAttr attr (Style selector attrs children) =
    Style selector (attrs ++ [ attr ]) children


transformActiveChild : (Style a b -> Style a b) -> Style a b -> Style a b
transformActiveChild transform (( Style selector attrs children ) as style) =
    case splitStartLast children of
        ( _, Nothing ) ->
            transform style

        ( inactiveChildren, Just activeChild ) ->
            Style
                selector
                attrs
                (inactiveChildren ++ [ transform activeChild ])


splitStartLast : List a -> (List a, Maybe a)
splitStartLast list =
    case list of
        [] ->
            ( [], Nothing )

        elem :: [] ->
            ( [], Just elem )

        elem :: rest ->
            let
                ( start, last ) =
                    splitStartLast rest
            in
                ( elem :: start, last )



================================================
FILE: example/client/elm-package.json
================================================
{
    "version": "1.0.0",
    "summary": "helpful summary of your project, less than 80 characters",
    "repository": "https://github.com/USER/PROJECT.git",
    "license": "BSD3",
    "source-directories": [
        "."
    ],
    "exposed-modules": [],
    "dependencies": {
        "elm-lang/core": "2.1.0 <= v < 3.0.0",
        "evancz/elm-html": "4.0.1 <= v < 5.0.0"
    },
    "elm-version": "0.15.1 <= v < 0.16.0"
}

================================================
FILE: example/elm-package.json
================================================
{
    "version": "1.0.0",
    "summary": "helpful summary of your project, less than 80 characters",
    "repository": "https://github.com/USER/PROJECT.git",
    "license": "BSD3",
    "source-directories": [
        ".",
        "server/",
        "server/Client"
    ],
    "exposed-modules": [],
    "dependencies": {
        "elm-lang/core": "2.1.0 <= v < 3.0.0",
        "evancz/elm-html": "4.0.1 <= v < 5.0.0"
    },
    "elm-version": "0.15.1 <= v < 0.16.0"
}


================================================
FILE: example/run.sh
================================================
elm make example/server/Main.elm --output=example/main.js
echo "Elm.worker(Elm.Main);" >> example/main.js
node example/main.js


================================================
FILE: example/server/Main.elm
================================================
module Main where

import Http.Server exposing (..)
import Http.Request exposing (emptyReq, Request, Method(..))
import Http.Response exposing (emptyRes, Response)
import Http.Response.Write exposing
  ( writeHtml, writeJson
  , writeElm, writeFile
  , writeNode)

import Task exposing (..)
import Signal exposing (..)
import Json.Encode as Json

import ServerSideClient.App exposing (main)


server : Mailbox (Request, Response)
server = mailbox (emptyReq, emptyRes)

route : (Request, Response) -> Task x ()
route (req, res) =
  case req.method of
    GET -> case req.url of
      "/" ->
        writeElm "/client/App" res
      "/App.elm" ->
        writeFile "/client/App.elm" res
      "/foo" ->
        writeHtml "<h1>Foozle!</h1>" res
      "/bar" ->
        writeNode main res
      url ->
        writeHtml ("You tried to go to " ++ url) res

    POST ->
      res |>
        writeJson (Json.object [("foo", Json.string "bar")])

    NOOP ->
      succeed ()

    _ ->
      res |>
        writeJson (Json.string "unknown method!")

port reply : Signal (Task x ())
port reply = route <~ dropRepeats server.signal

port serve : Task x Server
port serve = createServer'
  server.address
  8080
  "Listening on 8080"


================================================
FILE: example/server/ServerSideClient/App.elm
================================================
module ServerSideClient.App where

import Html exposing (..)
import Html.Attributes exposing (id, src, href)
import ServerSideClient.HomepageStylesheet exposing (exports)
import ServerSideClient.Stylesheets as Stylesheets
import Json.Encode as Encode


main : Html
main =
    div
        [ id "dave" ]
        [
            div [ Html.Attributes.property "innerHTML" (Encode.string ("<style>" ++ (Stylesheets.prettyPrint 4 exports) ++ "</style>")) ] [],

            div
                [ ]
                [ text "This page was rendered on the server!"
                ]
        ]


================================================
FILE: example/server/ServerSideClient/HomepageStylesheet.elm
================================================
module ServerSideClient.HomepageStylesheet where

import ServerSideClient.Stylesheets exposing (..)

exports =
    css
        |%| body
            |-| backgroundColor (rgb 173 191 160)
            |-| boxSizing borderBox
            |-| padding 12 px


================================================
FILE: example/server/ServerSideClient/Stylesheets.elm
================================================
module ServerSideClient.Stylesheets where

{-
    Implementation notes:

    - strip out []()""'' - so:
    - toString ["html", "body"] -> "[\"html\",\"body\"]" -> "html,body"

    How would you write this?

    html, body, .foo, .bar
        width: 100%
-}

import String

prettyPrint : Int -> Style class id -> String
prettyPrint =
    prettyPrintHelp 0


prettyPrintHelp : Int -> Int -> Style class id -> String
prettyPrintHelp indentLevel indentSpaces (Style selector attributes children) =
    if (indentLevel == 0) && (String.isEmpty selector) then
        children
            |> List.map (prettyPrintHelp indentLevel indentSpaces)
            |> String.join "\n\n"
    else
        let
            indentStr =
                String.repeat (indentSpaces * indentLevel) " "

            subIndentStr =
                indentStr ++ String.repeat (indentSpaces) " "

            attrsStr =
                if List.isEmpty attributes then
                    ""
                else
                    attributes
                        |> List.map attributeToString
                        |> String.join subIndentStr
                        |> (++) subIndentStr

            prettyPrintChild =
                prettyPrintHelp (indentLevel + 1) indentSpaces

            childrenStr =
                if List.isEmpty children then
                    ""
                else
                    children
                        |> List.map prettyPrintChild
                        |> String.join subIndentStr
                        |> (++) subIndentStr
        in
            indentStr ++ selector ++ " {\n"
                ++ attrsStr
                ++ childrenStr
                ++ "}"


attributeToString : Attribute -> String
attributeToString (Attribute str) =
    str ++ ";\n"


{- Tags -}

html = Tag "html"
body = Tag "body"
header = Tag "header"
nav = Tag "nav"
div = Tag "div"
span = Tag "span"
img = Tag "img"
nowrap = Tag "nowrap"
button = Tag "button"
h1 = Tag "h1"
h2 = Tag "h2"
h3 = Tag "h3"
h4 = Tag "h4"
p = Tag "p"
ol = Tag "ol"
input = Tag "input"

tagToString (Tag str) = str


-- TODO these are just for @media - maybe improve type guarantees?
screen = "screen"
print = "print"

-- TODO this is just for ::selection - maybe improve type guarantees?
selection = "selection"


{- Units -}

inheritToString : (a -> String) -> InheritOr a -> String
inheritToString translate value =
    case value of
        Inherit ->
            "inherit"

        NotInherit notInherit ->
            translate notInherit


autoToString : (a -> String) -> AutoOr a -> String
autoToString translate value =
    case value of
        Auto ->
            "auto"

        NotAuto notAuto ->
            translate notAuto

noneToString : (a -> String) -> NoneOr a -> String
noneToString translate value =
    case value of
        None ->
            "none"

        NotNone notNone ->
            translate notNone


unitsToString : Units -> String
unitsToString =
    (\(ExplicitUnits str) -> str)
        |> inheritToString


boxSizingToString : BoxSizing -> String
boxSizingToString =
    (\(ExplicitBoxSizing str) -> str)
        |> inheritToString


overflowToString : Overflow -> String
overflowToString =
    (\(ExplicitOverflow str) -> str)
        |> autoToString
        |> inheritToString


displayToString : Display -> String
displayToString =
    (\(ExplicitDisplay str) -> str)
        |> noneToString
        |> inheritToString


verticalAlignToString : VerticalAlign -> String
verticalAlignToString =
    (\(ExplicitVerticalAlign str) -> str)
        |> inheritToString


whiteSpaceToString : WhiteSpace -> String
whiteSpaceToString =
    (\(ExplicitWhiteSpace str) -> str)
        |> autoToString
        |> inheritToString

colorToString : Color -> String
colorToString =
    (\(ExplicitColor str) -> str)
        |> autoToString
        |> inheritToString


numberToString : number -> String
numberToString num =
    toString (num + 0)


textShadowToString : TextShadow -> String
textShadowToString =
    explicitTextShadowToString
        |> noneToString
        |> inheritToString


explicitTextShadowToString : ExplicitTextShadow -> String
explicitTextShadowToString value =
    case value of
        NoTextShadow ->
            "TODO"

outlineStyleToString : OutlineStyle -> String
outlineStyleToString (OutlineStyle str) = str


opacityStyleToString : OpacityStyle -> String
opacityStyleToString (OpacityStyle str) = str


type Tag
    = Tag String

type InheritOr a
    = Inherit
    | NotInherit a

type AutoOr a
    = Auto
    | NotAuto a

type NoneOr a
    = None
    | NotNone a

type alias BoxSizing = InheritOr ExplicitBoxSizing
type alias Overflow = InheritOr (AutoOr ExplicitOverflow)
type alias Display = InheritOr (NoneOr ExplicitDisplay)
type alias WhiteSpace = InheritOr (AutoOr ExplicitWhiteSpace)
type alias Color = InheritOr (AutoOr ExplicitColor)
type alias TextShadow = InheritOr (NoneOr ExplicitTextShadow)
type alias Outline = InheritOr ExplicitOutline
type alias Units = InheritOr ExplicitUnits
type alias VerticalAlign = InheritOr ExplicitVerticalAlign

type ExplicitUnits = ExplicitUnits String
type ExplicitBoxSizing = ExplicitBoxSizing String
type ExplicitOverflow = ExplicitOverflow String
type ExplicitDisplay = ExplicitDisplay String
type ExplicitWhiteSpace = ExplicitWhiteSpace String
type ExplicitColor = ExplicitColor String
type ExplicitVerticalAlign = ExplicitVerticalAlign String

type ExplicitOutline
    = ExplicitOutline Float ExplicitUnits OutlineStyle OpacityStyle

type OutlineStyle
    = OutlineStyle String

type OpacityStyle
    = OpacityStyle String

type ExplicitTextShadow
    = NoTextShadow

solid : OutlineStyle
solid = OutlineStyle "solid"

transparent : OpacityStyle
transparent = OpacityStyle "transparent"

rgb : number -> number -> number -> Color
rgb r g b =
    ExplicitColor ("rgb(" ++ (numberToString r) ++ ", " ++ (numberToString g) ++ ", " ++ (numberToString b) ++ ")")
        |> NotAuto |> NotInherit


rgba : number -> number -> number -> number -> Color
rgba r g b a =
    ExplicitColor ("rgba(" ++ (numberToString r) ++ ", " ++ (numberToString g) ++ ", " ++ (numberToString b) ++ ", " ++ (numberToString a) ++ ")")
        |> NotAuto |> NotInherit


hex : String -> Color
hex str =
    ExplicitColor ("#" ++ str)
        |> NotAuto |> NotInherit

pct : Units
pct = "%" |> ExplicitUnits |> NotInherit

em : Units
em = "em" |> ExplicitUnits |> NotInherit

px : Units
px = "px" |> ExplicitUnits |> NotInherit

borderBox = "border-box" |> ExplicitBoxSizing |> NotInherit

visible : Display
visible = "visible" |> ExplicitDisplay |> NotNone |> NotInherit

block : Display
block = "block" |> ExplicitDisplay |> NotNone |> NotInherit

inlineBlock : Display
inlineBlock = "inline-block" |> ExplicitDisplay |> NotNone |> NotInherit

inline : Display
inline = "inline" |> ExplicitDisplay |> NotNone |> NotInherit

none : InheritOr (NoneOr a)
none = None |> NotInherit

auto : InheritOr (AutoOr a)
auto = Auto |> NotInherit

inherit : InheritOr a
inherit = Inherit

noWrap : WhiteSpace
noWrap = "no-wrap" |> ExplicitWhiteSpace |> NotAuto |> NotInherit

top : VerticalAlign
top = "top" |> ExplicitVerticalAlign |> NotInherit

middle : VerticalAlign
middle = "middle" |> ExplicitVerticalAlign |> NotInherit

bottom : VerticalAlign
bottom = "bottom" |> ExplicitVerticalAlign |> NotInherit


{- Attributes -}

attr1 name translate value =
    Attribute (name ++ ": " ++ (translate value))


attr2 name translateA translateB valueA valueB =
    Attribute (name ++ ": " ++ (translateA valueA) ++ (translateB valueB))


attr3 name translateA translateB translateC valueA valueB valueC =
    Attribute (name ++ ": " ++ (translateA valueA) ++ (translateB valueB) ++ (translateC valueC))


attr4 name translateA translateB translateC translateD valueA valueB valueC valueD =
    Attribute (name ++ ": " ++ (translateA valueA) ++ (translateB valueB) ++ (translateC valueC) ++ (translateD valueD))


attr5 name translateA translateB translateC translateD translateE valueA valueB valueC valueD valueE =
    Attribute (name ++ ": " ++ (translateA valueA) ++ (translateB valueB) ++ (translateC valueC) ++ (translateD valueD) ++ (translateE valueE))


verticalAlign : VerticalAlign -> Attribute
verticalAlign =
    attr1 "vertical-align" verticalAlignToString


display : Display -> Attribute
display =
    attr1 "display" displayToString


opacity : OpacityStyle -> Attribute
opacity =
    attr1 "opacity" toString


width : number -> Units -> Attribute
width =
    attr2 "width" numberToString unitsToString


minWidth : number -> Units -> Attribute
minWidth =
    attr2 "min-width" numberToString unitsToString


height : number -> Units -> Attribute
height =
    attr2 "height" numberToString unitsToString


minHeight : number -> Units -> Attribute
minHeight =
    attr2 "min-height" numberToString unitsToString


padding : number -> Units -> Attribute
padding =
    attr2 "padding" numberToString unitsToString

paddingTop : number -> Units -> Attribute
paddingTop =
    attr2 "padding-top" numberToString unitsToString

paddingBottom : number -> Units -> Attribute
paddingBottom =
    attr2 "padding-bottom" numberToString unitsToString

paddingRight : number -> Units -> Attribute
paddingRight =
    attr2 "padding-right" numberToString unitsToString

paddingLeft : number -> Units -> Attribute
paddingLeft =
    attr2 "padding-left" numberToString unitsToString

margin : number -> Units -> Attribute
margin =
    attr2 "margin" numberToString unitsToString

marginTop : number -> Units -> Attribute
marginTop =
    attr2 "margin-top" numberToString unitsToString

marginBottom : number -> Units -> Attribute
marginBottom =
    attr2 "margin-bottom" numberToString unitsToString

marginRight : number -> Units -> Attribute
marginRight =
    attr2 "margin-right" numberToString unitsToString

marginLeft : number -> Units -> Attribute
marginLeft =
    attr2 "margin-left" numberToString unitsToString

boxSizing : BoxSizing -> Attribute
boxSizing =
    attr1 "box-sizing" boxSizingToString


overflowX : Overflow -> Attribute
overflowX =
    attr1 "overflow-x" overflowToString


overflowY : Overflow -> Attribute
overflowY =
    attr1 "overflow-y" overflowToString


whiteSpace : WhiteSpace -> Attribute
whiteSpace =
    attr1 "white-space" whiteSpaceToString





backgroundColor : Color -> Attribute
backgroundColor =
    attr1 "background-color" colorToString


color : Color -> Attribute
color =
    attr1 "color" colorToString


media : a -> String
media value =
    "media " ++ (toString value)
    -- TODO

textShadow : TextShadow -> Attribute
textShadow =
    attr1 "text-shadow" textShadowToString


outline : Float -> Units -> OutlineStyle -> OpacityStyle -> Attribute
outline =
    attr4
        "outline"
            toString unitsToString
            (\str -> " " ++ outlineStyleToString str ++ " ")
            opacityStyleToString


{- Types -}

type Style class id
    = Style String (List Attribute) (List (Style class id))


type Attribute
    = Attribute String


css : Style class id
css =
    Style "" [] []


styleWithPrefix : String -> Style class id -> a -> Style class id
styleWithPrefix prefix (Style selector attrs children) childSelector =
    children ++ [ Style (prefix ++ (toString childSelector)) [] [] ]
        |> Style selector attrs


(|%|) : Style class id -> Tag -> Style class id
(|%|) (Style selector attrs children) tag =
    children ++ [ Style (tagToString tag) [] [] ]
        |> Style selector attrs


(|%|=) : Style class id -> List Tag -> Style class id
(|%|=) (Style selector attrs children) tags =
    let
        childSelector =
            tags
                |> List.map tagToString
                |> String.join ", "
    in
        children ++ [ Style childSelector [] [] ]
            |> Style selector attrs


(|@|) : Style class id -> a -> Style class id
(|@|) = styleWithPrefix "@"


(|::|) : Style class id -> a -> Style class id
(|::|) = styleWithPrefix "::"


(|>%|) : Style class id -> Tag -> Style class id
(|>%|) (Style selector attrs children) tag =
    case splitStartLast children of
        ( _, Nothing ) ->
            children ++ [ Style (selector ++ " > " ++ tagToString tag) [] [] ]
                |> Style selector attrs

        ( start, Just (Style activeSelector _ _) ) ->
            children ++ [ Style (activeSelector ++ " > " ++ tagToString tag) [] [] ]
                |> Style selector attrs


(|>%|=) : Style class id -> List Tag -> Style class id
(|>%|=) (Style selector attrs children) tags =
    let
        selectorFromTag tag =
            case splitStartLast children of
                ( _, Nothing ) ->
                    selector ++ " > " ++ tagToString tag

                ( start, Just (Style activeSelector _ _) ) ->
                    activeSelector ++ " > " ++ tagToString tag

        childSelector =
            tags
                |> List.map selectorFromTag
                |> String.join ", "
    in
        children ++ [ Style childSelector [] [] ]
            |> Style selector attrs


(|.|) : Style class id -> class -> Style class id
(|.|) = styleWithPrefix "."


(|#|) : Style class id -> id -> Style class id
(|#|) = styleWithPrefix "#"


(|>.|) : Style class id -> a -> Style class id
(|>.|) = styleWithPrefix ">."


(|!|) : Style class id -> Attribute -> Style class id
(|!|) style (Attribute attrString) =
    transformActiveChild (addAttr (Attribute (attrString ++ " !important"))) style


(|-|) : Style class id -> Attribute -> Style class id
(|-|) style attr =
    transformActiveChild (addAttr attr) style


addAttr : Attribute -> Style a b -> Style a b
addAttr attr (Style selector attrs children) =
    Style selector (attrs ++ [ attr ]) children


transformActiveChild : (Style a b -> Style a b) -> Style a b -> Style a b
transformActiveChild transform (( Style selector attrs children ) as style) =
    case splitStartLast children of
        ( _, Nothing ) ->
            transform style

        ( inactiveChildren, Just activeChild ) ->
            Style
                selector
                attrs
                (inactiveChildren ++ [ transform activeChild ])


splitStartLast : List a -> (List a, Maybe a)
splitStartLast list =
    case list of
        [] ->
            ( [], Nothing )

        elem :: [] ->
            ( [], Just elem )

        elem :: rest ->
            let
                ( start, last ) =
                    splitStartLast rest
            in
                ( elem :: start, last )



================================================
FILE: src/Http/Listeners.elm
================================================
module Http.Listeners (on) where
{-| Module for event listener helpers

@docs on
-}

import Native.Http

{-| Wrapper for creating even listeners
-}
on : String -> target -> Signal input
on = Native.Http.on


================================================
FILE: src/Http/Request.elm
================================================
module Http.Request
  ( Method(..)
  , Request, emptyReq
  , onCloseReq
  ) where

{-| Stuff for dealing with requests
# Handle Requests
@docs Request, emptyReq

@docs Method

# Events

@docs onCloseReq
-}

import Http.Listeners exposing (on)

{-| Standard Http Methods, useful for routing -}
type Method
  = GET
  | POST
  | PUT
  | DELETE
  | NOOP


{-| Node.js native Request object
[Node Docs](https://nodejs.org/api/http.html#http_http_incomingmessage) -}
type alias Request =
  { url : String
  , method : Method }


{-| `emptyReq` is a dummy Native Request object incase you need it, as the initial value of
a `Signal.Mailbox` for example. -}
emptyReq : Request
emptyReq =
  { url = ""
  , method = NOOP }


{-| "Close" events as a Signal for Request objects.
[Node docs](https://nodejs.org/api/http.html#http_event_close_2) -}
onCloseReq : Request -> Signal ()
onCloseReq = on "close"




================================================
FILE: src/Http/Response/Write.elm
================================================
module Http.Response.Write
  ( write, writeHead
  , writeHtml, writeJson
  , writeFile, writeElm
  , writeNode
  , end) where


import Native.Http.Response.Write
import Task exposing (Task, andThen)
import VirtualDom exposing (Node)
import Json.Encode as Json
import Http.Response exposing (textHtml, applicationJson, Header, Response, StatusCode)

{-| Write Headers to a Response
[Node Docs](https://nodejs.org/api/http.html#http_response_writehead_statuscode_statusmessage_headers) -}
writeHead : StatusCode -> Header -> Response -> Task x Response
writeHead = Native.Http.Response.Write.writeHead

{-| Write body to a Response
[Node Docs](https://nodejs.org/api/http.html#http_response_write_chunk_encoding_callback) -}
write : String -> Response -> Task x Response
write = Native.Http.Response.Write.write

{-| End a Response
[Node Docs](https://nodejs.org/api/http.html#http_response_end_data_encoding_callback) -}
end : Response -> Task x ()
end = Native.Http.Response.Write.end

writeAs : Header -> String -> Response -> Task x ()
writeAs header html res =
  writeHead 200 header res
  `andThen` write html `andThen` end

{-| Write out HTML to a Response. For example

    res `writeHtml` "<h1>Howdy</h1>"

 -}
writeHtml : String -> Response -> Task x ()
writeHtml = writeAs textHtml

{-| Write out JSON to a Response. For example
    res `writeJson` Json.object
      [ ("foo", Json.string "bar")
      , ("baz", Json.int 0) ]
-}
writeJson : Json.Value -> Response -> Task x ()
writeJson val res =
  writeAs applicationJson (Json.encode 0 val) res

{-| write a file -}
writeFile : String -> Response -> Task a ()
writeFile file res =
  writeHead 200 textHtml res
    `andThen` Native.Http.Response.Write.writeFile file
    `andThen` end

{-| write elm! -}
writeElm : String -> Response -> Task a ()
writeElm file res =
  writeHead 200 textHtml res
    `andThen` Native.Http.Response.Write.writeElm file
    `andThen` end

writeNode : Node -> Response -> Task a ()
writeNode node res =
  writeHead 200 textHtml res
    `andThen` Native.Http.Response.Write.writeNode node
    `andThen` end


================================================
FILE: src/Http/Response.elm
================================================
module Http.Response
  ( Response, StatusCode, Header
  , emptyRes
  , textHtml, applicationJson
  , onCloseRes, onFinishRes
  ) where

import Http.Listeners exposing (on)


{-| An http header, such as content type -}
type alias Header = (String, String)

{-| StatusCode ie 200 or 404 -}
type alias StatusCode = Int

{-| Node.js native Response object
[Node Docs](https://nodejs.org/api/http.html#http_class_http_serverresponse) -}
type alias Response =
  { statusCode : StatusCode }

{-| `emptyRes` is a dummy Native Response object incase you need it, as the initial value of
a `Signal.Mailbox` for example. -}
emptyRes : Response
emptyRes =
  { statusCode = 418 }

{-| Html Header {"Content-Type":"text/html"}-}
textHtml : Header
textHtml = ("Content-Type", "text/html")

{-| Json Header {"Content-Type":"application/json"}-}
applicationJson : Header
applicationJson = ("Content-Type", "application/json")


{-| "Close" events as a Signal for Response objects.
[Node docs](https://nodejs.org/api/http.html#http_event_close_1) -}
onCloseRes : Response -> Signal ()
onCloseRes = on "close"

{-| "Finsh" events as a Signal for Response objects.
[Node docs](https://nodejs.org/api/http.html#http_event_finish) -}
onFinishRes : Response -> Signal ()
onFinishRes = on "finish"


================================================
FILE: src/Http/Server.elm
================================================
module Http.Server
  ( createServer, createServer', listen
  , Port, Server
  , onRequest, onClose) where

{-| Simple bindings to Node.js's Http.Server

# Init the server

## Instaniation
@docs createServer, createServer'

## Actually listen
@docs listen

## Types
@docs Server, Port

# Listen for events
@docs onRequest, onClose
-}

import Task exposing (Task, succeed, andThen)
import Signal exposing (Address, Mailbox, mailbox)
import Json.Encode as Json

import Http.Request exposing (Request)
import Http.Response exposing (Response)
import Http.Listeners exposing (on)

import Native.Http

{-| Port number for the server to listen -}
type alias Port = Int


{-| Node.js native Server object
[Node Docs](https://nodejs.org/api/http.html#http_class_http_server) -}
type Server = Server

{-| "Request" events as a Signal.
[Node docs](https://nodejs.org/api/http.html#http_event_request) -}
onRequest : Server -> Signal (Request, Response)
onRequest = on "request"

{-| "Close" events as a Signal for Servers.
[Node docs](https://nodejs.org/api/http.html#http_event_close) -}
onClose : Server -> Signal ()
onClose = on "close"


{-| Create a new Http Server, and send (Request, Response) to an Address. For example

    port serve : Task x Server
    port serve = createServer server.address

[Node docs](https://nodejs.org/api/http.html#http_http_createserver_requestlistener)
-}
createServer : Address (Request, Response) -> Task x Server
createServer = Native.Http.createServer

{-| Create a Http Server and listen in one command! For example
    port serve : Task x Server
    port serve = createServer' server.address 8080 "Alive on 8080!"
-}

createServer' : Address (Request, Response) -> Port -> String -> Task x Server
createServer' address port' text  =
  createServer address `andThen` listen port' text

{-| Command Server to listen on a specific port,
    and echo a message to the console when active.
    Task will not resolve until listening is successful.
    For example

    port listen : Task x Server
    port listen = listen 8080 "Listening on 8080" server

[Node Docs](https://nodejs.org/api/http.html#http_server_listen_port_hostname_backlog_callback)
-}
listen : Port -> String -> Server -> Task x Server
listen = Native.Http.listen


================================================
FILE: src/Native/Http/Response/Write.js
================================================
var COMPILED_DIR = '.comp';

var writeHead = function writeHead(Task) {
    return function (code, header, res) {
        var o = {};
        return Task.asyncFunction(function (callback) {
            o[header._0] = header._1;
            res.writeHead(code, o);
            return callback(Task.succeed(res));
        });
    };
};

var write = function write(Task) {
    return function (message, res) {
        return Task.asyncFunction(function (callback) {
            res.write(message);
            return callback(Task.succeed(res));
        });
    };
};

var writeFile = function writeFile(fs, mime, Task){
    return function (fileName, res) {
        return Task.asyncFunction(function (callback) {
            var file = __dirname + fileName;
            var type = mime.lookup(file);

            res.writeHead('Content-Type', type);

            fs.readFile(file, function (e, data) {
                res.end(data);
                return callback(Task.succeed(res));
            });

        });
    };
};

var compile

var writeElm = function writeElm(fs, mime, crypto, compiler, Task){

    var compile = function(file, outFile, onClose){
        // switch to the directory that the elm-app is served out of

        var dirIndex = file.lastIndexOf('/');
        var dir = file.substr(0, dirIndex);
        process.chdir(dir);

        compiler.compile([file + '.elm'], {
            output: outFile,
            yes: true
        }).on('close', onClose);
    }

    return function (fileName, res) {
        var compiledFile = COMPILED_DIR + fileName + '.html';

        // if the file is already compiled, just send it out
        if (fs.existsSync(compiledFile)) {
            return writeFile(fs, mime, Task)("/" + compiledFile, res);
        }

        return Task.asyncFunction(function (callback) {
            var file = __dirname + fileName;
            var outFile = __dirname + "/" + compiledFile;

            // when the file is compiled, attempt to send it out
            var onClose = function(exitCode) {
                var type = mime.lookup(file + '.html');
                res.writeHead('Content-Type', type);

                fs.readFile(outFile, function (e, data) {
                    res.end(data);
                    return callback(Task.succeed(res));
                });
            };

            compile(file, outFile, onClose);
        });
    };
};

var writeNode = function writeNode(toHtml, Task){
    return function(node, res) {
        return write(Task)(toHtml(node), res);
    };
};

var end = function end(Task, Tuple0) {
    return function (res) {
        return Task.asyncFunction(function (callback) {
            return (function () {
                res.end();
                return callback(Task.succeed(Tuple0));
            })();
        });
    };
};

var make = function make(localRuntime) {
    localRuntime.Native = localRuntime.Native || {};
    localRuntime.Native.Http = localRuntime.Native.Http || {};
    localRuntime.Native.Http.Response = localRuntime.Native.Http.Response || {};
    localRuntime.Native.Http.Response.Write = localRuntime.Native.Http.Response.Write || {};

    if (localRuntime.Native.Http.Response.Write.values) {
        return localRuntime.Native.Http.Response.Write.values;
    }

    var fs = require('fs');
    var crypto = require('crypto');

    var mime = require('mime');
    var compiler = require('node-elm-compiler');
    var toHtml = require('vdom-to-html');

    var Task = Elm.Native.Task.make(localRuntime);
    var Utils = Elm.Native.Utils.make(localRuntime);
    var Tuple0 = Utils['Tuple0'];


    return {
        'writeHead': F3(writeHead(Task)),
        'writeFile': F2(writeFile(fs, mime, Task)),
        'writeElm': F2(writeElm(fs, mime, crypto, compiler, Task)),
        'writeNode': F2(writeNode(toHtml, Task)),
        'write': F2(write(Task)),
        'toHtml': toHtml,
        'end': end(Task, Tuple0)
    };
};

Elm.Native = Elm.Native || {};
Elm.Native.Http = Elm.Native.Http || {};
Elm.Native.Http.Response = Elm.Native.Http.Response || {};
Elm.Native.Http.Response.Write = Elm.Native.Http.Response.Write || {};
Elm.Native.Http.Response.Write.make = make;

if (typeof window === "undefined") {
    window = global;
}


================================================
FILE: src/Native/Http.js
================================================
var COMPILED_DIR = '.comp';

// take a name as a string, return an elm object of the type
// the name given
var wrap_with_type = function(item){
    return {
        ctor: item
    };
};

// make the directory for compiled Elm code
var make_compile_dir = function(fs, dir){
    if (typeof dir === "undefined"){
        dir = COMPILED_DIR;
    }

    if (!fs.existsSync(dir)){
       fs.mkdirSync(dir);
    }
};

var createServer = function createServer(fs, http, Tuple2, Task) {
    return function (address) {
        make_compile_dir(fs, __dirname + "/" + COMPILED_DIR);

        var send = address._0;
        var server = http.createServer(function (request, response) {
            request.method = wrap_with_type(request.method);
            return Task.perform(send(Tuple2(request, response)));
        });
        return Task.asyncFunction(function (callback) {
            return callback(Task.succeed(server));
        });
    };
};

var listen = function listen(Task) {
    return function (port, echo, server) {
        return Task.asyncFunction(function (callback) {
            return server.listen(port, function () {
                console.log(echo);
                return callback(Task.succeed(server));
            });
        });
    };
};

var on = function on(Signal) {
    return function (eventName, x) {
        return x.on(eventName, function (request, response) {
            if (typeof(request) == 'undefined') {
                return Signal.input(eventName, Tuple0);
            }
            return Signal.input(eventName, Tuple(request, response));
        });
    };
};
var make = function make(localRuntime) {
    localRuntime.Native = localRuntime.Native || {};
    localRuntime.Native.Http = localRuntime.Native.Http || {};


    if (localRuntime.Native.Http.values) {
        return localRuntime.Native.Http.values;
    }

    var http = require('http');
    var fs = require('fs');
    var mime = require('mime');

    var Task = Elm.Native.Task.make(localRuntime);
    var Utils = Elm.Native.Utils.make(localRuntime);
    var Signal = Elm.Native.Signal.make(localRuntime);
    var Tuple0 = Utils['Tuple0'];
    var Tuple2 = Utils['Tuple2'];

    return {
        'createServer': createServer(fs, http, Tuple2, Task),
        'listen': F3(listen(Task)),
        'on': F2(on(Signal, Tuple0))
    };
};
Elm.Native.Http = {};
Elm.Native.Http.make = make;

if (typeof window === "undefined") {
    window = global;
}
Download .txt
gitextract_5yerz_kn/

├── .gitignore
├── LICENSE
├── README.md
├── elm-package.json
├── example/
│   ├── client/
│   │   ├── App.elm
│   │   ├── HomepageStylesheet.elm
│   │   ├── Stylesheets.elm
│   │   └── elm-package.json
│   ├── elm-package.json
│   ├── run.sh
│   └── server/
│       ├── Main.elm
│       └── ServerSideClient/
│           ├── App.elm
│           ├── HomepageStylesheet.elm
│           └── Stylesheets.elm
└── src/
    ├── Http/
    │   ├── Listeners.elm
    │   ├── Request.elm
    │   ├── Response/
    │   │   └── Write.elm
    │   ├── Response.elm
    │   └── Server.elm
    └── Native/
        ├── Http/
        │   └── Response/
        │       └── Write.js
        └── Http.js
Condensed preview — 21 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (54K chars).
[
  {
    "path": ".gitignore",
    "chars": 61,
    "preview": "example/*.js\nelm-stuff/\n.DS_Store\nnode_modules/\nelm.js\n.comp\n"
  },
  {
    "path": "LICENSE",
    "chars": 1081,
    "preview": "The MIT License (MIT)\n\nCopyright (c) 2015 Isaac Shapira\n\nPermission is hereby granted, free of charge, to any person obt"
  },
  {
    "path": "README.md",
    "chars": 1953,
    "preview": "# Servelm - Elm Http Server\n\n# Deprecated. Server side elm is not designed to work this way.\n\n\n\n\nThis server, along with"
  },
  {
    "path": "elm-package.json",
    "chars": 518,
    "preview": "{\n    \"version\": \"1.0.0\",\n    \"summary\": \"\",\n    \"repository\": \"https://github.com/eeue56/servelm.git\",\n    \"license\": \""
  },
  {
    "path": "example/client/App.elm",
    "chars": 683,
    "preview": "module App where\n\nimport Html exposing (..)\nimport Html.Attributes exposing (id, src, href)\nimport HomepageStylesheet ex"
  },
  {
    "path": "example/client/HomepageStylesheet.elm",
    "chars": 218,
    "preview": "module HomepageStylesheet where\n\nimport Stylesheets exposing (..)\n\nexports =\n    css\n        |%| body\n            |-| ba"
  },
  {
    "path": "example/client/Stylesheets.elm",
    "chars": 14511,
    "preview": "module Stylesheets where\n\n{-\n    Implementation notes:\n\n    - strip out []()\"\"'' - so:\n    - toString [\"html\", \"body\"] -"
  },
  {
    "path": "example/client/elm-package.json",
    "chars": 422,
    "preview": "{\n    \"version\": \"1.0.0\",\n    \"summary\": \"helpful summary of your project, less than 80 characters\",\n    \"repository\": \""
  },
  {
    "path": "example/elm-package.json",
    "chars": 467,
    "preview": "{\n    \"version\": \"1.0.0\",\n    \"summary\": \"helpful summary of your project, less than 80 characters\",\n    \"repository\": \""
  },
  {
    "path": "example/run.sh",
    "chars": 127,
    "preview": "elm make example/server/Main.elm --output=example/main.js\necho \"Elm.worker(Elm.Main);\" >> example/main.js\nnode example/m"
  },
  {
    "path": "example/server/Main.elm",
    "chars": 1223,
    "preview": "module Main where\n\nimport Http.Server exposing (..)\nimport Http.Request exposing (emptyReq, Request, Method(..))\nimport "
  },
  {
    "path": "example/server/ServerSideClient/App.elm",
    "chars": 582,
    "preview": "module ServerSideClient.App where\n\nimport Html exposing (..)\nimport Html.Attributes exposing (id, src, href)\nimport Serv"
  },
  {
    "path": "example/server/ServerSideClient/HomepageStylesheet.elm",
    "chars": 252,
    "preview": "module ServerSideClient.HomepageStylesheet where\n\nimport ServerSideClient.Stylesheets exposing (..)\n\nexports =\n    css\n "
  },
  {
    "path": "example/server/ServerSideClient/Stylesheets.elm",
    "chars": 14528,
    "preview": "module ServerSideClient.Stylesheets where\n\n{-\n    Implementation notes:\n\n    - strip out []()\"\"'' - so:\n    - toString ["
  },
  {
    "path": "src/Http/Listeners.elm",
    "chars": 206,
    "preview": "module Http.Listeners (on) where\n{-| Module for event listener helpers\n\n@docs on\n-}\n\nimport Native.Http\n\n{-| Wrapper for"
  },
  {
    "path": "src/Http/Request.elm",
    "chars": 895,
    "preview": "module Http.Request\n  ( Method(..)\n  , Request, emptyReq\n  , onCloseReq\n  ) where\n\n{-| Stuff for dealing with requests\n#"
  },
  {
    "path": "src/Http/Response/Write.elm",
    "chars": 2096,
    "preview": "module Http.Response.Write\n  ( write, writeHead\n  , writeHtml, writeJson\n  , writeFile, writeElm\n  , writeNode\n  , end) "
  },
  {
    "path": "src/Http/Response.elm",
    "chars": 1274,
    "preview": "module Http.Response\n  ( Response, StatusCode, Header\n  , emptyRes\n  , textHtml, applicationJson\n  , onCloseRes, onFinis"
  },
  {
    "path": "src/Http/Server.elm",
    "chars": 2260,
    "preview": "module Http.Server\n  ( createServer, createServer', listen\n  , Port, Server\n  , onRequest, onClose) where\n\n{-| Simple bi"
  },
  {
    "path": "src/Native/Http/Response/Write.js",
    "chars": 4250,
    "preview": "var COMPILED_DIR = '.comp';\n\nvar writeHead = function writeHead(Task) {\n    return function (code, header, res) {\n      "
  },
  {
    "path": "src/Native/Http.js",
    "chars": 2452,
    "preview": "var COMPILED_DIR = '.comp';\n\n// take a name as a string, return an elm object of the type\n// the name given\nvar wrap_wit"
  }
]

About this extraction

This page contains the full source code of the eeue56/servelm GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 21 files (48.9 KB), approximately 12.7k tokens. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!