on master help sign in
executable-config: Add DOM injector and ghcjs lookup
commit9562b99979e8272d8ec333092993c475978d0f8f authorAli Abrar <aliabrar@gmail.com> dateFri 16 Feb 2018, 19:12 (9 years ago) parent61723ee
6 files changed+72−3
lib/executable-config/default.nix+1 lib/executable-config/inject/obelisk-executable-config-inject.cabal+17 lib/executable-config/inject/src/Obelisk/ExecutableConfig/Inject.hs+17 lib/executable-config/lookup/default.nix+8−2 lib/executable-config/lookup/obelisk-executable-config.cabal+12−1 lib/executable-config/lookup/src-ghcjs/Obelisk/ExecutableConfig.hs+17
lib/executable-config/default.nix+1
@@ -27,6 +27,7 @@ in with nixpkgs.haskell.lib; {
2727 inject = injectConfig;
2828 };
2929 web = {
30+ inject = self: self.callCabal2nix "obelisk-executable-config-inject" (filterGitSource ./inject) {};
3031 };
3132 };
3233}
lib/executable-config/inject/obelisk-executable-config-inject.cabalnew file+17
@@ -0,0 +1,17 @@
1+name: obelisk-executable-config-inject
2+version: 0.1
3+cabal-version: >= 1.2
4+build-type: Simple
5+
6+library
7+ hs-source-dirs: src
8+
9+ build-depends:
10+ base,
11+ bytestring,
12+ filepath,
13+ reflex-dom,
14+ text,
15+ transformers
16+
17+ exposed-modules: Obelisk.ExecutableConfig.Inject
lib/executable-config/inject/src/Obelisk/ExecutableConfig/Inject.hsnew file+17
@@ -0,0 +1,17 @@
1+{-# LANGUAGE OverloadedStrings #-}
2+module Obelisk.ExecutableConfig.Inject where
3+
4+import Data.ByteString (ByteString)
5+import qualified Data.ByteString as BS
6+import Data.Semigroup ((<>))
7+import qualified Data.Text as T
8+import qualified Data.Text.Encoding as T
9+import Reflex.Dom
10+import System.FilePath ((</>))
11+
12+inject :: FilePath -> IO ByteString
13+inject item = do
14+ f <- BS.readFile $ "exe-config" </> item
15+ fmap snd $ renderStatic $
16+ elAttr "script" ("type" =: "text/plain" <> "id" =: ("config-" <> T.pack item)) $
17+ text $ T.decodeUtf8 f
lib/executable-config/lookup/default.nix+8−2
@@ -1,8 +1,10 @@
1−{ hostPlatform, mkDerivation, base, bytestring, filepath, stdenv, text
2−, transformers, android-activity, jsaddle-wkwebview
1+{ hostPlatform, ghc
2+, mkDerivation, base, bytestring, filepath, stdenv, text, transformers
3+, android-activity ? null, jsaddle-wkwebview ? null, ghcjs-dom ? null
34}:
45let isAndroid = hostPlatform.libc == "bionic";
56 isIOS = hostPlatform.isDarwin && hostPlatform.isAArch64;
7+ isGhcjs = ghc.isGhcjs or false;
68in mkDerivation {
79 pname = "obelisk-executable-config";
810 version = "0.1";
@@ -13,12 +15,16 @@ in mkDerivation {
1315 android-activity
1416 ] else if isIOS then [
1517 jsaddle-wkwebview
18+ ] else if isGhcjs then [
19+ ghcjs-dom
1620 ] else [
1721 ]);
1822 configureFlags = if isAndroid then [
1923 "-fandroid"
2024 ] else if isIOS then [
2125 "-fios"
26+ ] else if isGhcjs then [
27+ "-fghcjs"
2228 ] else [
2329 ];
2430 license = stdenv.lib.licenses.bsd3;
lib/executable-config/lookup/obelisk-executable-config.cabal+12−1
@@ -13,11 +13,17 @@ flag android
1313 default: False
1414 manual: True
1515
16+flag ghcjs
17+ description: Build for ghcjs
18+ default: False
19+ manual: True
20+
1621library
1722 hs-source-dirs: src
1823 if flag(ios)
1924 hs-source-dirs: src-ios
2025 build-depends: jsaddle-wkwebview
26+ exposed-modules: Obelisk.ExecutableConfig
2127 else
2228 if flag(android)
2329 hs-source-dirs: src-android
@@ -25,6 +31,12 @@ library
2531 other-modules: Obelisk.ExecutableConfig.Internal.AssetManager
2632 build-depends: android-activity
2733 ld-options: -landroid
34+ exposed-modules: Obelisk.ExecutableConfig
35+ else
36+ if flag(ghcjs)
37+ hs-source-dirs: src-ghcjs
38+ build-depends: ghcjs-dom
39+ exposed-modules: Obelisk.ExecutableConfig
2840
2941 build-depends:
3042 base,
@@ -33,5 +45,4 @@ library
3345 text,
3446 transformers
3547
36− exposed-modules: Obelisk.ExecutableConfig
3748 other-modules: Obelisk.ExecutableConfig.Internal
lib/executable-config/lookup/src-ghcjs/Obelisk/ExecutableConfig.hsnew file+17
@@ -0,0 +1,17 @@
1+{-# LANGUAGE OverloadedStrings #-}
2+module Obelisk.ExecutableConfig where
3+
4+import Control.Monad.Trans.Maybe
5+import Data.Semigroup ((<>))
6+import Data.Text (Text)
7+import GHCJS.DOM
8+import GHCJS.DOM.Document
9+import GHCJS.DOM.Element
10+import GHCJS.DOM.NonElementParentNode
11+
12+get :: Text -> IO (Maybe Text)
13+get item = runMaybeT $ do
14+ doc <- MaybeT currentDocument
15+ e <- MaybeT $ getElementById doc $ "config-" <> item
16+ getInnerHTML e
17+