initial commit

This commit is contained in:
2021-08-05 10:48:00 +02:00
commit da4d094689
16 changed files with 5453 additions and 0 deletions

6
.gitignore vendored Normal file
View File

@@ -0,0 +1,6 @@
.parcel-cache
dist
elm-stuff
flake.lock
node_modules
result

61
client/default.nix Normal file
View File

@@ -0,0 +1,61 @@
{ pkgs }:
with pkgs;
let
yarnFilter = p: t: builtins.any (x: baseNameOf p == x) [
"package.json"
"yarn.lock"
];
yarnSrc = lib.cleanSourceWith {
filter = yarnFilter;
src = ./.;
};
in
rec {
shell = buildEnv { name = "homepage-devshell"; paths = homepage.buildInputs; };
nodeHeaders = fetchzip {
name = "node-v${pkgs.nodejs.version}-headers";
url = "https://nodejs.org/download/release/v${pkgs.nodejs.version}/node-v${pkgs.nodejs.version}-headers.tar.gz";
sha256 = "sha256-wnw/eK+hqawpLbqC+sA65EF7FBz/Q8zvSJfb70dVo4o=";
};
yarnPkgs = yarn2nix-moretea.mkYarnPackage {
src = yarnSrc;
publishBinsFor = [ "parcel" ];
pkgConfig.lmdb-store = {
buildInputs = [ nodePackages.node-gyp python3 pkgconfig ];
postInstall = ''
node-gyp --nodedir=${nodeHeaders} rebuild
'';
};
};
homepage = stdenv.mkDerivation {
name = "Homepage";
src = ./.;
buildInputs = with elmPackages; [
elm
elm-format
elm2nix
yarnPkgs
];
patchPhase = ''
ln -sf ${yarnPkgs}/libexec/*/node_modules .
'';
configurePhase = elmPackages.fetchElmDeps {
elmPackages = import ./elm-srcs.nix;
registryDat = ./registry.dat;
elmVersion = "0.19.1";
};
installPhase = ''
mkdir $out
parcel build --dist-dir $out index.html --no-source-maps --no-cache
'';
};
}

37
client/elm-srcs.nix Normal file
View File

@@ -0,0 +1,37 @@
{
"elm/html" = {
sha256 = "1n3gpzmpqqdsldys4ipgyl1zacn0kbpc3g4v3hdpiyfjlgh8bf3k";
version = "1.0.0";
};
"elm/browser" = {
sha256 = "0nagb9ajacxbbg985r4k9h0jadqpp0gp84nm94kcgbr5sf8i9x13";
version = "1.0.2";
};
"elm/core" = {
sha256 = "19w0iisdd66ywjayyga4kv2p1v9rxzqjaxhckp8ni6n8i0fb2dvf";
version = "1.0.5";
};
"elm/json" = {
sha256 = "0kjwrz195z84kwywaxhhlnpl3p251qlbm5iz6byd6jky2crmyqyh";
version = "1.1.3";
};
"elm/url" = {
sha256 = "0av8x5syid40sgpl5vd7pry2rq0q4pga28b4yykn9gd9v12rs3l4";
version = "1.0.0";
};
"elm/time" = {
sha256 = "0vch7i86vn0x8b850w1p69vplll1bnbkp8s383z7pinyg94cm2z1";
version = "1.0.0";
};
"elm/virtual-dom" = {
sha256 = "0q1v5gi4g336bzz1lgwpn5b1639lrn63d8y6k6pimcyismp2i1yg";
version = "1.0.2";
};
}

24
client/elm.json Normal file
View File

@@ -0,0 +1,24 @@
{
"type": "application",
"source-directories": [
"elm"
],
"elm-version": "0.19.1",
"dependencies": {
"direct": {
"elm/browser": "1.0.2",
"elm/core": "1.0.5",
"elm/html": "1.0.0"
},
"indirect": {
"elm/json": "1.1.3",
"elm/time": "1.0.0",
"elm/url": "1.0.0",
"elm/virtual-dom": "1.0.2"
}
},
"test-dependencies": {
"direct": {},
"indirect": {}
}
}

36
client/elm/Loading.elm Normal file
View File

@@ -0,0 +1,36 @@
module Loading exposing (..)
import Html as H exposing (Html)
import Html.Attributes as HA
import Html.Events as HE
type alias Model =
Int
type Msg
= Dec
| Inc
init =
0
view mdl =
H.div []
[ H.button [ HE.onClick Dec ] [ H.text "-" ]
, H.button [ HE.onClick Inc ] [ H.text "+" ]
, H.text <| String.fromInt mdl
]
update : Msg -> Model -> Model
update msg mdl =
case msg of
Dec ->
mdl - 1
Inc ->
mdl + 1

39
client/elm/Main.elm Normal file
View File

@@ -0,0 +1,39 @@
module Main exposing (main)
import Browser as B
import Html as H exposing (Html)
import Html.Attributes as HA
import Html.Events as HE
import Loading
main =
B.sandbox { init = init, update = update, view = view }
type Model
= LoadingMdl Loading.Model
type Msg
= LoadingMsg Loading.Msg
init : Model
init =
LoadingMdl Loading.init
view : Model -> Html Msg
view mdl =
case mdl of
LoadingMdl m ->
H.map LoadingMsg <| Loading.view m
update : Msg -> Model -> Model
update msg_ mdl_ =
case ( msg_, mdl_ ) of
( LoadingMsg msg, LoadingMdl mdl ) ->
LoadingMdl <| Loading.update msg mdl

8
client/index.html Normal file
View File

@@ -0,0 +1,8 @@
<!DOCTYPE html>
<head>
<meta charset="UTF-8">
</head>
<body>
<div id="root">Broken</div>
<script type="module" src="./index.js"> </script>
</body>

5
client/index.js Normal file
View File

@@ -0,0 +1,5 @@
import { Elm } from "./elm/Main.elm";
Elm.Main.init(
{ node: document.getElementById("root") }
);

13
client/package.json Normal file
View File

@@ -0,0 +1,13 @@
{
"name": "FlakeTest",
"version": "1.0.0",
"browserslist": "since 2015 or > 0.05%",
"repository": ".",
"license": "MIT",
"devDependencies": {
"@parcel/transformer-elm": "2.0.0-rc.0",
"parcel": "^2.0.0-rc.0"
},
"dependencies": {
}
}

BIN
client/registry.dat Normal file

Binary file not shown.

5055
client/yarn.lock Normal file

File diff suppressed because it is too large Load Diff

42
flake.lock generated Normal file
View File

@@ -0,0 +1,42 @@
{
"nodes": {
"flakeUtils": {
"locked": {
"lastModified": 1623875721,
"narHash": "sha256-A8BU7bjS5GirpAUv4QA+QnJ4CceLHkcXdRp4xITDB0s=",
"owner": "numtide",
"repo": "flake-utils",
"rev": "f7e004a55b120c02ecb6219596820fcd32ca8772",
"type": "github"
},
"original": {
"owner": "numtide",
"repo": "flake-utils",
"type": "github"
}
},
"nixpkgs": {
"locked": {
"lastModified": 1628152337,
"narHash": "sha256-GhvgTd/DKiloi6cDH3i/Ibab7jQixnJUfCTqObChvtE=",
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "aeda3e09c601800556f4da7e633827e417a5f62f",
"type": "github"
},
"original": {
"owner": "NixOS",
"repo": "nixpkgs",
"type": "github"
}
},
"root": {
"inputs": {
"flakeUtils": "flakeUtils",
"nixpkgs": "nixpkgs"
}
}
},
"root": "root",
"version": 7
}

50
flake.nix Normal file
View File

@@ -0,0 +1,50 @@
{
description = "A simple homepage";
inputs.flakeUtils.url = "github:numtide/flake-utils";
inputs.nixpkgs.url = "github:NixOS/nixpkgs";
outputs = { self, nixpkgs, flakeUtils }:
with flakeUtils.lib;
eachDefaultSystem (
system:
let
pkgs = import nixpkgs { inherit system; };
clientFilter = p: t: builtins.all (x: baseNameOf p != x) [
".parcel-cache"
"dist"
"elm-stuff"
"node_modules"
"result"
];
clientSrc = pkgs.lib.cleanSourceWith {
filter = clientFilter;
src = ./client;
};
serverSrc = pkgs.lib.cleanSourceWith {
filter = clientFilter;
src = ./server;
};
client = pkgs.callPackage clientSrc {
inherit pkgs;
};
server = pkgs.haskellPackages.callPackage serverSrc {
frontend = self.packages.${system}.homepage;
};
in
rec {
packages = {
inherit (client) hello yarnPkgs homepage;
inherit (server) server simple;
};
defaultPackage = self.packages.${system}.simple;
devShell = self.defaultPackage.${system};
}
);
}

30
server/app/Main.hs Normal file
View File

@@ -0,0 +1,30 @@
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE RecordWildCards #-}
module Main where
import Data.Semigroup ((<>))
import Network.Wai.Application.Static
import Network.Wai.Handler.Warp
import Options.Applicative
import System.FilePath
import WaiAppStatic.Types
import Data.Maybe
data Config = Config
{ location :: FilePath,
port :: Int
}
configP :: Parser Config
configP =
let location = strArgument (metavar "PATH" <> help "Directory to serve")
port = argument auto (metavar "PORT" <> value 12345)
in Config <$> location <*> port
main :: IO ()
main = do
Config {..} <- execParser $ info configP fullDesc
putStrLn $ "Location: " ++ location
putStrLn $ "Port: " ++ show port
run port . staticApp $ (defaultWebAppSettings location) {ssIndices = fromMaybe [] $ toPieces ["index.html"]}

19
server/default.nix Normal file
View File

@@ -0,0 +1,19 @@
{ pkgs, frontend }:
with pkgs;
let
server = haskell.lib.generateOptparseApplicativeCompletion "FlakeTest" (haskellPackages.callCabal2nix "FlakeTest" ./. {});
simple = runCommand "FlakeTest" {
src = server.src;
nativeBuildInputs = [ makeWrapper ];
} ''
makeWrapper ${server}/bin/FlakeTest $out/bin/FlakeTest \
--add-flags ${frontend} \
--add-flags 12345
'';
in
{
inherit server simple;
}

28
server/package.yaml Normal file
View File

@@ -0,0 +1,28 @@
_name: &name FlakeTest
name: *name
version: 1.0.0
ghc-options:
- -Wall
- -threaded
- -O2
dependencies:
- base
- filepath
- optparse-applicative
- wai
- wai-app-static
- warp
library:
source-dirs: src/
executables:
*name:
main: Main.hs
source-dirs: app/
dependencies:
- *name