Skip to content

Instantly share code, notes, and snippets.

@manlon
Created June 8, 2016 00:08
Show Gist options
  • Save manlon/f3990f79084ffccae1792a2cb17ed5e5 to your computer and use it in GitHub Desktop.
Save manlon/f3990f79084ffccae1792a2cb17ed5e5 to your computer and use it in GitHub Desktop.
var fs = require("fs");
var express = require("express");
var jsdom = require("jsdom");
var serializeDocument = require("jsdom").serializeDocument;
var elmSrc = fs.readFileSync("./elm.js"); // Elm program with Main module and signalInit port
var html = `
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Hello World!</title>
<script src="elm.js"></script>
</head>
<body>
<h1>Hello World!</h1>
<div id="elm-main" />
<script src="bootstrap.js"></script>
</body>
</html>
`;
var bootstrap = `
var node = document.getElementById('elm-main');
var elmApp = Elm.Main.embed(node);
elmApp.ports.signalInit.subscribe(function(){
if(window.onElmInit){ window.onElmInit(); }
});
`;
var app = express();
app.get("/elm.js", function(req, resp){
resp.send(elmSrc);
});
app.get("/bootstrap.js", function(req, resp){
resp.send(bootstrap);
});
app.get("/", function(req, resp){
jsdom.env({
html: html,
src: [ elmSrc, bootstrap ],
done: function(err, window){
window.onElmInit = function(){
var node = window.document.getElementById('elm-main');
var inputs = node.querySelectorAll("input");
for(var i = 0; i < inputs.length; i++){
if(inputs[i].value){
inputs[i].defaultValue = inputs[i].value;
}
}
resp.send(serializeDocument(window.document));
}
},
});
});
app.listen(3000);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment