on master help sign in
20 files changed+98−75
since splitsnapshots
unifiedsplit
.github/pull_request_template.md+2 ChangeLog.md+19−1 README.md+2−2 all-builds.nix+1−1 default.nix+8−3 dep/reflex-platform/github.json+3−3 haskell-overlays/misc-deps.nix+8−2 lib/command/obelisk-command.cabal+1−1 lib/command/src/Obelisk/Command.hs+3−8 lib/command/src/Obelisk/Command/Preprocessor.hs+3−2 lib/command/src/Obelisk/Command/Run.hs+11−14 lib/executable-config/lookup/src/Obelisk/Configs.hs+2 lib/route/src/Obelisk/Route.hs+3−2 lib/run/obelisk-run.cabal−1 lib/run/src/Obelisk/Run.hs+16−26 lib/snap-extras/src/Obelisk/Snap/Extras.hs+1−1 skeleton/backend/backend.cabal+2−2 skeleton/common/common.cabal+1−1 skeleton/default.nix+10−3 skeleton/frontend/frontend.cabal+2−2
.github/pull_request_template.md+2
@@ -3,6 +3,8 @@
33I have:
44
55 - [ ] Based work on latest `develop` branch
6+ - [ ] Followed the [contribution guide](https://github.com/obsidiansystems/obelisk/blob/develop/CONTRIBUTING.md#submitting-changes)
67 - [ ] Looked for lint in my changes with `hlint .` (lint found code you did not write can be left alone)
78 - [ ] Run the test suite: `$(nix-build -A selftest --no-out-link)`
9+ - [ ] [Updated the changelog](https://github.com/obsidiansystems/obelisk/blob/develop/CONTRIBUTING.md#in-the-changelog)
810 - [ ] (Optional) Run CI tests locally: `nix-build release.nix -A build.x86_64-linux --no-out-link` (or `x86_64-darwin` on macOS)
ChangeLog.md+19−1
@@ -2,8 +2,26 @@
22
33This project's release branch is `master`. This log is written from the perspective of the release branch: when changes hit `master`, they are considered released.
44
5−## Unreleased
5+## v0.9.1.0
66
7+* [#801](https://github.com/obsidiansystems/obelisk/pull/801): Remove errors and warning for local packages without a library component
8+* [#812](https://github.com/obsidiansystems/obelisk/pull/812): Add support for `NoImplicitPrelude` and other extensions disabled via `No`
9+* Pinned version bumps:
10+ * reflex-platform [0.7.0.0](https://github.com/reflex-frp/reflex-platform/releases/tag/v0.7.0.0)
11+ * hnix 0.8.0
12+* [#787](https://github.com/obsidiansystems/obelisk/pull/787): Set `immutable` cache control directive when serving content-addressed static assets
13+* Use iOS SDK 13.2
14+
15+
16+## v0.9.0.1
17+
18+* ([#810](https://github.com/obsidiansystems/obelisk/pull/810)) Fix loading of `all.js` in fully compiled web apps.
19+
20+## v0.9.0.0
21+
22+* **(Breaking change)** Backport nixpkgs upgrades to ACME/Let's Encrypt handling so that HTTPS deployments continue to work flawlessly. If your deployment is having trouble renewing [Let's Encrypt](https://letsencrypt.org/) certificates, upgrade to this version.
23+ * **IMPORTANT:** In order to use [Let's Encrypt](https://letsencrypt.org/) you must now accept their [terms of service](https://letsencrypt.org/repository/). To do that, add `terms.security.acme.acceptTerms = true;` to the `import ./.obelisk/impl {` section in your `default.nix`. The new skeleton application may serve as an [example](https://github.com/obsidiansystems/obelisk/blob/4759342ab3570888c027d4c58cb5694cb832d624/skeleton/default.nix#L13).
24+* Update reflex-platform dependency to v0.6.0.0
725* ([#715](https://github.com/obsidiansystems/obelisk/pull/715)) In `Obelisk.Route` deprecate `isoEncoder` and `prismEncoder` in favor of more precisely named `viewEncoder` and `reviewEncoder` (respectively) and improve documentation regarding contravariance of `reviewEncoder`.
826* ([#739](https://github.com/obsidiansystems/obelisk/pull/739)) Improve `ob shell` by allowing commands to be passed verbatim after a `--` argument. For example, `ob shell 'run command'` can now be written `ob shell -- run command`.
927* ([#735](https://github.com/obsidiansystems/obelisk/pull/735)) Fix regression causing custom `Prelude`s to break `ob run`/`ob watch`/`ob repl`.
README.md+2−2
@@ -114,7 +114,7 @@ First create a new EC2 instance:
1141141. Launch a NixOS 19.09 EC2 instance (we recommend [this AMI](https://console.aws.amazon.com/ec2/v2/home?region=us-east-1#LaunchInstanceWizard:ami=ami-00a8eeaf232a74f84))
1151151. In the instance configuration wizard ensure that your instance has at least 1GB RAM and 10GB disk space.
1161161. When prompted save your AWS private key (`~/myaws.pem`) somewhere safe. We'll need it later during deployment.
117−1. Go to "Security Groups", select your instance's security group and under "Inbound" tab add a new rule for HTTP port 80 and 443.
117+1. Go to "Security Groups", select your instance's security group and under "Inbound" tab add a new rule for HTTP port 80 and HTTPS port 443.
118118
119119At this stage your instance should be booting and become accessible shortly. Note down the hostname of your EC2 instance.
120120
@@ -221,7 +221,7 @@ Your account must also belong to an Apple Developer Team, if you want to access
2212211. Click accept to authorize on both the computer and the iPhone.
222222
223223##### Xcode
224−Install Xcode 8.2 (contains iOS SDK 10.2) and open it so that it runs its post install tool setup.
224+Install Xcode 11.2 (contains iOS SDK 13.2) and open it so that it runs its post install tool setup.
225225
226226These versions will work out of the box but iOS SDKs prior to 11.3 should also work. You can choose another installed version in `default.nix`
227227
all-builds.nix+1−1
@@ -1,6 +1,6 @@
11{ self-args ? {
22 config.android_sdk.accept_license = true;
3− iosSdkVersion = "10.2";
3+ iosSdkVersion = "13.2";
44 }
55, local-self ? import ./. self-args
66, supportedSystems ? [ builtins.currentSystem ]
default.nix+8−3
@@ -1,7 +1,10 @@
11{ system ? builtins.currentSystem
22, profiling ? false
3−, iosSdkVersion ? "10.2"
3+, iosSdkVersion ? "13.2"
44, config ? {}
5+, terms ? { # Accepted terms, conditions, and licenses
6+ security.acme.acceptTerms = false;
7+ }
58, reflex-platform-func ? import ./dep/reflex-platform
69}:
710let
@@ -114,7 +117,7 @@ in rec {
114117 "${routeHost}".email = adminEmail;
115118 } else {};
116119
117− security.acme.${if enableHttps then "acceptTerms" else null} = true;
120+ security.acme.${if enableHttps && (terms.security.acme.acceptTerms or false) then "acceptTerms" else null} = true;
118121 };
119122
120123 mkObeliskApp =
@@ -183,7 +186,9 @@ in rec {
183186 set -eux
184187 ln -s '${if profiling then backend else haskellLib.justStaticExecutables backend}'/bin/* $out/
185188 ln -s '${mkAssets assets}' $out/static.assets
186− ln -s '${mkAssets (compressedJs frontend optimizationLevel)}'/* $out
189+ for d in '${mkAssets (compressedJs frontend optimizationLevel)}'/*/; do
190+ ln -s "$d" "$out"/"$(basename "$d").assets"
191+ done
187192 echo ${version} > $out/version
188193 '';
189194
dep/reflex-platform/github.json+3−3
@@ -1,8 +1,8 @@
11{
22 "owner": "reflex-frp",
33 "repo": "reflex-platform",
4− "branch": "develop",
4+ "branch": "release/0.7.0.0",
55 "private": false,
6− "rev": "c21ec7036c8351185cd2feef9ce577b6a61c4f22",
7− "sha256": "0m4sdpz6qvngralpyprrbvsyi2zmfh2l3q5vhihwfp3842blvbfg"
6+ "rev": "27a7851a780ff21472d85f9a02fb84635ef9027a",
7+ "sha256": "1m4zlw91dpjlbdchjyxhvhv3k7lilm0qa17dhhww868xxc27sann"
88}
haskell-overlays/misc-deps.nix+8−2
@@ -9,8 +9,14 @@ let
99in
1010
1111{
12− hnix = haskellLib.dontCheck (haskellLib.doJailbreak (self.callCabal2nix "hnix" (hackGet ../dep/hnix) {}));
13− hnix-store-core = self.callHackage "hnix-store-core" "0.1.0.0" {};
12+ regex-base = self.callHackage "regex-base" "0.94.0.0" {};
13+ regex-posix = self.callHackage "regex-posix" "0.96.0.0" {};
14+ regex-tdfa = self.callHackage "regex-tdfa" "1.3.1.0" {};
15+ test-framework = haskellLib.dontCheck (self.callHackage "test-framework" "0.8.2.0" {});
16+ hnix = haskellLib.dontCheck (self.callHackage "hnix" "0.8.0" {});
17+ hnix-store-core = self.callHackage "hnix-store-core" "0.2.0.0" {};
18+
19+ aeson-gadt-th = self.callHackage "aeson-gadt-th" "0.2.4" {};
1420
1521 ghcid = self.callCabal2nix "ghcid" (hackGet ../dep/ghcid) {};
1622 # Exports more internals
lib/command/obelisk-command.cabal+1−1
@@ -1,5 +1,5 @@
11name: obelisk-command
2−version: 0.8.0.0
2+version: 0.9.0.1
33cabal-version: >= 1.8
44build-type: Simple
55
lib/command/src/Obelisk/Command.hs+3−8
@@ -84,7 +84,7 @@ initForce = switch (long "force" <> help "Allow ob init to overwrite files")
8484data ObCommand
8585 = ObCommand_Init InitSource Bool
8686 | ObCommand_Deploy DeployCommand
87− | ObCommand_Run [(FilePath, Interpret)] (Maybe FilePath)
87+ | ObCommand_Run [(FilePath, Interpret)]
8888 | ObCommand_Profile String [String]
8989 | ObCommand_Thunk ThunkOption
9090 | ObCommand_Repl [(FilePath, Interpret)]
@@ -109,7 +109,7 @@ obCommand cfg = hsubparser
109109 (mconcat
110110 [ command "init" $ info (ObCommand_Init <$> initSource <*> initForce) $ progDesc "Initialize an Obelisk project"
111111 , command "deploy" $ info (ObCommand_Deploy <$> deployCommand cfg) $ progDesc "Prepare a deployment for an Obelisk project"
112− , command "run" $ info (ObCommand_Run <$> interpretOpts <*> certDirOpts) $ progDesc "Run current project in development mode"
112+ , command "run" $ info (ObCommand_Run <$> interpretOpts) $ progDesc "Run current project in development mode"
113113 , command "profile" $ info (uncurry ObCommand_Profile <$> profileCommand) $ progDesc "Run current project with profiling enabled"
114114 , command "thunk" $ info (ObCommand_Thunk <$> thunkOption) $ progDesc "Manipulate thunk directories"
115115 , command "repl" $ info (ObCommand_Repl <$> interpretOpts) $ progDesc "Open an interactive interpreter"
@@ -281,11 +281,6 @@ interpretOpts = many
281281 where
282282 common = action "directory" <> metavar "DIR"
283283
284−certDirOpts :: Parser (Maybe FilePath)
285−certDirOpts = optional (strOption (short 'c' <> long "cert" <> metavar "DIRECTORY" <> help helpText))
286− where
287− helpText = "Specify a directory in which to find \'cert.pem\', \'chain.pem\' and \'privkey.pem\' for use with TLS."
288−
289284shellOpts :: Parser ShellOpts
290285shellOpts = ShellOpts
291286 <$> shellFlags
@@ -396,7 +391,7 @@ ob = \case
396391 Just RemoteBuilder_ObeliskVM -> (:[]) <$> VmBuilder.getNixBuildersArg
397392 DeployCommand_Update -> deployUpdate "."
398393 DeployCommand_Test (platform, extraArgs) -> deployMobile platform extraArgs
399− ObCommand_Run interpretPathsList certDir -> withInterpretPaths interpretPathsList (run certDir)
394+ ObCommand_Run interpretPathsList -> withInterpretPaths interpretPathsList run
400395 ObCommand_Profile basePath rtsFlags -> profile basePath rtsFlags
401396 ObCommand_Thunk to -> case _thunkOption_command to of
402397 ThunkCommand_Update config -> for_ thunks (updateThunkToLatest config)
lib/command/src/Obelisk/Command/Preprocessor.hs+3−2
@@ -47,7 +47,8 @@ applyPackages origPath inPath outPath packagePaths' = do
4747 Left err -> do
4848 hPutStrLn stderr $ "Error: Unable to parse cabal package " <> packagePath <> "; Skipping preprocessor on " <> origPath <> ". Error: " <> show err
4949 pure Nothing
50− Right (_, packageInfo) -> pure $ Just packageInfo
50+ Right (Just (_, packageInfo)) -> pure $ Just packageInfo
51+ Right Nothing -> pure Nothing
5152
5253 writeOutput packageInfo' inPath outPath
5354
@@ -75,7 +76,7 @@ generateHeader origPath packageInfo =
7576 ext -> (TL.fromString (show ext) :)
7677 showExt = \case
7778 EnableExtension ext -> [TL.fromString (show ext)]
78− DisableExtension _ -> []
79+ DisableExtension ext -> ["No" <> TL.fromString (show ext)]
7980 UnknownExtension ext -> [TL.fromString ext]
8081
8182 ghcOptions =
lib/command/src/Obelisk/Command/Run.hs+11−14
@@ -14,7 +14,7 @@ module Obelisk.Command.Run where
1414import Control.Arrow ((&&&))
1515import Control.Exception (Exception, bracket)
1616import Control.Lens (ifor, (.~), (&))
17−import Control.Monad (filterM, unless)
17+import Control.Monad (filterM)
1818import Control.Monad.Except (runExceptT, throwError)
1919import Control.Monad.IO.Class (liftIO)
2020import Control.Monad.Reader (MonadIO)
@@ -160,8 +160,8 @@ profile profileBasePattern rtsFlags = withProjectRoot "." $ \root -> do
160160 ] <> rtsFlags
161161 <> [ "-RTS" ]
162162
163−run :: MonadObelisk m => Maybe FilePath -> FilePath -> PathTree Interpret -> m ()
164−run certDir root interpretPaths = do
163+run :: MonadObelisk m => FilePath -> PathTree Interpret -> m ()
164+run root interpretPaths = do
165165 pkgs <- getParsedLocalPkgs root interpretPaths
166166 assets <- findProjectAssets root
167167 putLog Debug $ "Assets impurely loaded from: " <> assets
@@ -171,7 +171,6 @@ run certDir root interpretPaths = do
171171 runGhcid root True (ghciArgs <> dotGhciArgs) pkgs $ Just $ unwords
172172 [ "Obelisk.Run.run"
173173 , show freePort
174− , "(" ++ show certDir ++ ")"
175174 , "(Obelisk.Run.runServeAsset " ++ show assets ++ ")"
176175 , "Backend.backend"
177176 , "Frontend.frontend"
@@ -305,15 +304,16 @@ parseCabalPackage
305304 -> m (Maybe CabalPackageInfo)
306305parseCabalPackage dir = parseCabalPackage' dir >>= \case
307306 Left err -> Nothing <$ putLog Error err
308− Right (warnings, pkgInfo) -> do
307+ Right (Just (warnings, pkgInfo)) -> do
309308 for_ warnings $ putLog Warning . T.pack . show
310309 pure $ Just pkgInfo
310+ Right Nothing -> pure Nothing
311311
312312-- | Like 'parseCabalPackage' but returns errors and warnings directly so as to avoid 'MonadObelisk'.
313313parseCabalPackage'
314314 :: (MonadIO m)
315315 => FilePath -- ^ Package directory
316− -> m (Either T.Text ([Dist.PWarning], CabalPackageInfo))
316+ -> m (Either T.Text (Maybe ([Dist.PWarning], CabalPackageInfo)))
317317parseCabalPackage' pkg = runExceptT $ do
318318 (cabalContents, packageFile, packageName) <- guessCabalPackageFile pkg >>= \case
319319 Left GuessPackageFileError_NotFound -> throwError $ "No .cabal or package.yaml file found in " <> T.pack pkg
@@ -341,7 +341,7 @@ parseCabalPackage' pkg = runExceptT $ do
341341 case condLibrary <$> result of
342342 Right (Just condLib) -> do
343343 let (_, lib) = simplifyCondTree evalConfVar condLib
344− pure $ (warnings,) $ CabalPackageInfo
344+ pure $ Just $ (warnings,) $ CabalPackageInfo
345345 { _cabalPackageInfo_packageName = T.pack packageName
346346 , _cabalPackageInfo_packageFile = packageFile
347347 , _cabalPackageInfo_packageRoot = takeDirectory packageFile
@@ -355,17 +355,17 @@ parseCabalPackage' pkg = runExceptT $ do
355355 , _cabalPackageInfo_compilerOptions = options $ libBuildInfo lib
356356 , _cabalPackageInfo_cppOptions = cppOptions $ libBuildInfo lib
357357 }
358− Right Nothing -> throwError "Haskell package has no library component"
358+ Right Nothing -> pure Nothing
359359 Left (_, errors) ->
360360 throwError $ T.pack $ "Failed to parse " <> packageFile <> ":\n" <> unlines (map show errors)
361361
362362parsePackagesOrFail :: (MonadObelisk m, Foldable f) => f FilePath -> m (NE.NonEmpty CabalPackageInfo)
363363parsePackagesOrFail dirs' = do
364− (pkgDirErrs, packageInfos') <- fmap partitionEithers $ for dirs $ \dir -> do
364+ packageInfos' <- fmap catMaybes $ for dirs $ \dir -> do
365365 flip fmap (parseCabalPackage dir) $ \case
366366 Just packageInfo
367− | _cabalPackageInfo_buildable packageInfo -> Right packageInfo
368− _ -> Left dir
367+ | _cabalPackageInfo_buildable packageInfo -> Just packageInfo
368+ _ -> Nothing
369369
370370 -- Sort duplicate packages such that we prefer shorter paths, but fall back to alphabetical ordering.
371371 let packagesByName = Map.map (NE.sortBy $ comparing $ \p -> let n = _cabalPackageInfo_packageFile p in (length n, n))
@@ -387,9 +387,6 @@ parsePackagesOrFail dirs' = do
387387 "No valid, buildable packages found" <> (if null dirs then "" else " in " <> intercalate ", " dirs)
388388 Just xs -> pure xs
389389
390− unless (null pkgDirErrs) $
391− putLog Warning $ T.pack $ "Failed to find buildable packages in " <> intercalate ", " pkgDirErrs
392−
393390 pure packageInfos
394391 where
395392 dirs = toList dirs'
lib/executable-config/lookup/src/Obelisk/Configs.hs+2
@@ -22,6 +22,7 @@ import Control.Applicative (Alternative)
2222import Control.Monad (MonadPlus)
2323import Control.Monad.Base (MonadBase)
2424import Control.Monad.Catch (MonadThrow)
25+import Control.Monad.Fail (MonadFail)
2526import Control.Monad.Fix (MonadFix)
2627import Control.Monad.IO.Class (MonadIO)
2728import Control.Monad.Morph (MFunctor)
@@ -87,6 +88,7 @@ newtype ConfigsT m a = ConfigsT { unConfigsT :: ReaderT (Map Text ByteString) m
8788 , Monad
8889 , MonadPlus
8990 , Alternative
91+ , MonadFail
9092 , MonadFix
9193 , MonadThrow
9294 , MonadIO
lib/route/src/Obelisk/Route.hs+3−2
@@ -170,6 +170,7 @@ import Data.Text (Text)
170170import qualified Data.Text as T
171171import qualified Data.Text.Encoding as T
172172import Data.Text.Lens (IsText, packed, unpacked)
173+import Data.Type.Equality
173174import Data.Universe
174175import Data.Universe.Some
175176import Network.HTTP.Types.URI
@@ -1038,8 +1039,8 @@ someSumEncoder = Encoder $ pure $ EncoderImpl
10381039
10391040data Void1 :: * -> * where {}
10401041
1041−instance Universe (Some Void1) where
1042− universe = []
1042+instance UniverseSome Void1 where
1043+ universeSome = []
10431044
10441045void1Encoder :: (Applicative check, MonadError Text parse) => Encoder check parse (Some Void1) a
10451046void1Encoder = Encoder $ pure $ EncoderImpl
lib/run/obelisk-run.cabal−1
@@ -14,7 +14,6 @@ library
1414 , cookie
1515 , dependent-sum
1616 , dependent-sum-template
17− , filepath
1817 , ghcjs-dom
1918 , HsOpenSSL
2019 , http-client
lib/run/src/Obelisk/Run.hs+16−26
@@ -65,7 +65,6 @@ import qualified OpenSSL.X509.Request as X509Request
6565import Reflex.Dom.Core
6666import Snap.Core (Snap)
6767import System.Environment
68−import System.FilePath ((</>))
6968import System.IO
7069import System.Process
7170import Text.URI (URI)
@@ -79,13 +78,11 @@ import qualified System.Which
7978
8079run
8180 :: Int -- ^ Port to run the backend
82− -> Maybe FilePath -- ^ Optional directory in which to find "cert.pem", "chain.pem" and "privkey.pem" to be used for TLS.
83− -- If this is Nothing and TLS is enabled, we'll generate a self-signed cert.
8481 -> ([Text] -> Snap ()) -- ^ Static asset handler
8582 -> Backend backendRoute frontendRoute -- ^ Backend
8683 -> Frontend (R frontendRoute) -- ^ Frontend
8784 -> IO ()
88−run port certDir serveStaticAsset backend frontend = do
85+run port serveStaticAsset backend frontend = do
8986 prettifyOutput
9087 let handleBackendErr (e :: IOException) = hPutStrLn stderr $ "backend stopped; make a change to your code to reload - error " <> show e
9188 --TODO: Use Obelisk.Backend.runBackend; this will require separating the checking and running phases
@@ -105,7 +102,7 @@ run port certDir serveStaticAsset backend frontend = do
105102 appRouteToUrl (k :/ v) = renderObeliskRoute validFullEncoder (FullRoute_Frontend (ObeliskRoute_App k) :/ v)
106103 allJsUrl = renderAllJsPath validFullEncoder
107104
108− let conf = defRunConfig { _runConfig_redirectPort = port, _runConfig_certDir = certDir }
105+ let conf = defRunConfig { _runConfig_redirectPort = port }
109106 runWidget conf publicConfigs frontend validFullEncoder `finally` killThread backendTid
110107
111108-- Convenience wrapper to handle path segments for 'Snap.serveAsset'
@@ -138,29 +135,24 @@ runWidget conf configs frontend validFullEncoder = do
138135 -- Providing TLS here will also incidentally provide it to proxied requests to the backend.
139136 prepareRunner = case uri ^? uriScheme . _Just . unRText of
140137 Just "https" -> do
141− case _runConfig_certDir conf of
142− Nothing -> do
143− -- Generate a private key and self-signed certificate for TLS
144− privateKey <- RSA.generateRSAKey' 2048 3
138+ -- Generate a private key and self-signed certificate for TLS
139+ privateKey <- RSA.generateRSAKey' 2048 3
145140
146− certRequest <- X509Request.newX509Req
147− _ <- X509Request.setPublicKey certRequest privateKey
148− _ <- X509Request.signX509Req certRequest privateKey Nothing
141+ certRequest <- X509Request.newX509Req
142+ _ <- X509Request.setPublicKey certRequest privateKey
143+ _ <- X509Request.signX509Req certRequest privateKey Nothing
149144
150− cert <- X509.newX509 >>= X509Request.makeX509FromReq certRequest
151− _ <- X509.setPublicKey cert privateKey
152− now <- getCurrentTime
153− _ <- X509.setNotBefore cert $ addUTCTime (-1) now
154− _ <- X509.setNotAfter cert $ addUTCTime (365 * 24 * 60 * 60) now
155− _ <- X509.signX509 cert privateKey Nothing
145+ cert <- X509.newX509 >>= X509Request.makeX509FromReq certRequest
146+ _ <- X509.setPublicKey cert privateKey
147+ timenow <- getCurrentTime
148+ _ <- X509.setNotBefore cert $ addUTCTime (-1) timenow
149+ _ <- X509.setNotAfter cert $ addUTCTime (365 * 24 * 60 * 60) timenow
150+ _ <- X509.signX509 cert privateKey Nothing
156151
157− certByteString <- BSUTF8.fromString <$> PEM.writeX509 cert
158− privateKeyByteString <- BSUTF8.fromString <$> PEM.writePKCS8PrivateKey privateKey Nothing
152+ certByteString <- BSUTF8.fromString <$> PEM.writeX509 cert
153+ privateKeyByteString <- BSUTF8.fromString <$> PEM.writePKCS8PrivateKey privateKey Nothing
159154
160− return $ runTLSSocket (tlsSettingsMemory certByteString privateKeyByteString)
161− Just certDir -> do
162− putStrLn $ "Using certificate information from: " ++ certDir
163− return $ runTLSSocket (tlsSettingsChain (certDir </> "cert.pem") [certDir </> "chain.pem"] (certDir </> "privkey.pem"))
155+ return $ runTLSSocket (tlsSettingsMemory certByteString privateKeyByteString)
164156 _ -> return runSettingsSocket
165157 runner <- prepareRunner
166158 bracket
@@ -265,7 +257,6 @@ data RunConfig = RunConfig
265257 , _runConfig_redirectHost :: ByteString
266258 , _runConfig_redirectPort :: Int
267259 , _runConfig_retryTimeout :: Int -- seconds
268− , _runConfig_certDir :: Maybe FilePath
269260 }
270261
271262defRunConfig :: RunConfig
@@ -274,5 +265,4 @@ defRunConfig = RunConfig
274265 , _runConfig_redirectHost = "127.0.0.1"
275266 , _runConfig_redirectPort = 3001
276267 , _runConfig_retryTimeout = 1
277− , _runConfig_certDir = Nothing
278268 }
lib/snap-extras/src/Obelisk/Snap/Extras.hs+1−1
@@ -17,7 +17,7 @@ import System.Directory
1717-- | Set response header for "permanent" caching
1818cachePermanently :: MonadSnap m => m ()
1919cachePermanently = do
20− modifyResponse $ setHeader "Cache-Control" "public, max-age=315360000"
20+ modifyResponse $ setHeader "Cache-Control" "public, max-age=315360000, immutable"
2121 modifyResponse $ setHeader "Expires" "Tue, 01 Feb 2050 00:00:00 GMT" --TODO: This should be set to "approximately one year from the time the response is sent"
2222
2323-- | Set response header to not cache
skeleton/backend/backend.cabal+2−2
@@ -14,12 +14,12 @@ library
1414 , obelisk-route
1515 exposed-modules:
1616 Backend
17− ghc-options: -Wall -Wredundant-constraints -Wincomplete-uni-patterns -Wincomplete-record-updates -O
17+ ghc-options: -Wall -Wredundant-constraints -Wincomplete-uni-patterns -Wincomplete-record-updates -O -fno-show-valid-hole-fits
1818
1919executable backend
2020 main-is: main.hs
2121 hs-source-dirs: src-bin
22− ghc-options: -Wall -Wredundant-constraints -Wincomplete-uni-patterns -Wincomplete-record-updates -O -threaded
22+ ghc-options: -Wall -Wredundant-constraints -Wincomplete-uni-patterns -Wincomplete-record-updates -O -threaded -fno-show-valid-hole-fits
2323 if impl(ghcjs)
2424 buildable: False
2525 build-depends: base
skeleton/common/common.cabal+1−1
@@ -12,4 +12,4 @@ library
1212 exposed-modules:
1313 Common.Api
1414 Common.Route
15− ghc-options: -Wall -Wredundant-constraints -Wincomplete-uni-patterns -Wincomplete-record-updates -O
15+ ghc-options: -Wall -Wredundant-constraints -Wincomplete-uni-patterns -Wincomplete-record-updates -O -fno-show-valid-hole-fits
skeleton/default.nix+10−3
@@ -1,10 +1,17 @@
1−{ obelisk ? import ./.obelisk/impl {
2− system = builtins.currentSystem;
3− iosSdkVersion = "10.2";
1+{ system ? builtins.currentSystem
2+, obelisk ? import ./.obelisk/impl {
3+ inherit system;
4+ iosSdkVersion = "13.2";
5+
46 # You must accept the Android Software Development Kit License Agreement at
57 # https://developer.android.com/studio/terms in order to build Android apps.
68 # Uncomment and set this to `true` to indicate your acceptance:
79 # config.android_sdk.accept_license = false;
10+
11+ # In order to use Let's Encrypt for HTTPS deployments you must accept
12+ # their terms of service at https://letsencrypt.org/repository/.
13+ # Uncomment and set this to `true` to indicate your acceptance:
14+ # terms.security.acme.acceptTerms = false;
815 }
916}:
1017with obelisk;
skeleton/frontend/frontend.cabal+2−2
@@ -16,7 +16,7 @@ library
1616 , text
1717 exposed-modules:
1818 Frontend
19− ghc-options: -Wall -Wredundant-constraints -Wincomplete-uni-patterns -Wincomplete-record-updates -O
19+ ghc-options: -Wall -Wredundant-constraints -Wincomplete-uni-patterns -Wincomplete-record-updates -O -fno-show-valid-hole-fits
2020
2121executable frontend
2222 main-is: main.hs
@@ -28,7 +28,7 @@ executable frontend
2828 , reflex-dom
2929 , obelisk-generated-static
3030 , frontend
31− ghc-options: -threaded -O -Wall -Wredundant-constraints -Wincomplete-uni-patterns -Wincomplete-record-updates
31+ ghc-options: -threaded -O -Wall -Wredundant-constraints -Wincomplete-uni-patterns -Wincomplete-record-updates -fno-show-valid-hole-fits
3232 if impl(ghcjs)
3333 ghc-options: -dedupe
3434 cpp-options: -DGHCJS_BROWSER