This 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.
- #1047: Update default ios sdk to 15
- #1048: Expose ghcIosAarch64 to projects
- #1046: Add support for aarch64-darwin and aarch64-linux (see supported platforms).
- #1025: Add
-c/--config
option toob repl
- #1035: During deployment, chown configs after copying them to the server
- #1040: Batch hashing of static assets
- Update reflex-platform to 1.1.2.0
- Update reflex-platform to 1.1.0.0
- Update reflex-platform to version 1.0.1.0 with GHC 8.10 and updated nixpkgs
- Make GHC 8.10 the default. To continue using GHC 8.6.5, set the
__useNewerCompiler
flag in default.nix tofalse
.
- Make GHC 8.10 the default. To continue using GHC 8.6.5, set the
- Documentation
- building
- #1004: Fix closure compiler sometimes crashing. Similar to #956, but for when it tries to report errors. (see: closure-compiler#3720)
- #956: Squelch closure-compiler warnings. They are not very helpful and can cause issues (see: closure-compiler#3720)
- nix
- CLI
- #784: Hint for users to take advantage of
ob shell --no-interpret
option for thunks - #870: Host redirection added to
ob deploy
. Readme updated with tutorial for new functionality. - #916: Add
check-known-hosts
option inob deploy init
. - #931: Fix bug in
ob deploy init
wheressh-keygen
was not found in nix store. - #934, #936: obelisk now always uses absolute paths when generating
.ghci
files for REPL and IDE support. This is a BREAKING change for some old tools that could not handle absolute paths properly. However, due to the behavior of cross-volume relative paths on certain platforms, such as modern MacOS, we cannot guarantee proper operation of obelisk with relative paths. - #948: Obelisk now always invokes
bash
instead of the system-wide shell when it can. Some sub-programs, likeghcid
, will still use the system-wide shell, which can cause subtle problems due to impurities. - #949: Obelisk now configures its output and error streams to transliterate unsupported characters to a known-good replacement character.
- #951: Add
ob run --port
which allows the user to override the port on which the app is served, rather than always using the port configured in the route. This is compatible with the use of reverse proxies that do their own TLS termination, e.g.ngrok
. - #974: Fail
ob run
when invalid fields are present indefault-extensions
/default-language
, or when Cabal files are otherwise invalid.
- #784: Hint for users to take advantage of
- obelisk-route
- #915: Add
routeLinkAttr
toObelisk.Route.Frontend
. This allows the creation of route links with additional, user-specified DOM attributes. - #918: Add GHC 8.10.7 support for
obelisk-route
. - #952: Add a
Semigroupoid
instance for theEncoder
type, compatible with its existingCategory
instance. - #957:
ob deploy
will now detect when the target machine needs to be rebooted after deployment, and automatically do so. This is necessary, for example, when the kernel has been updated.
- #915: Add
- Javascript FFI
- #844: Jsaddle FFI example extended in skeleton (example project which is installed by
ob init
). Note the remark on minifier renaming inskeleton/static/lib.js
- #903: Added support for
externs.js
, a file which allows users to specify JavaScript identifiers which should be avoided by Closure Compiler during its minification step. See the FAQ.
- #844: Jsaddle FFI example extended in skeleton (example project which is installed by
- Static Assets
- #922: Serve
.wasm
files with the correct MIME type. - #930: Add an error to
ob run
whenstatic
is called with a path to a file that doesn't exist - #940: Automatically restart the server when configuration is updated via
ob deploy push
. - #959: Add an error to
ob run
whenstaticFilePath
is called with a path to a file that doesn't exist - #1011: Update default iOS SDK to 15.0
- #835: Rebuild static assets in fewer circumstances:
- Watch
frontend
,backend
,common
, andstatic
instead of the project root to avoid spurious rebuilds when other files change - Don't call
nix show-derivation
to decide whether to rebuild since it seems to do about as much work as a no-op nix-build - Add a debug message indicating which file changes triggered the static file rebuild
- Watch
- #922: Serve
- Update reflex-platform to v0.9.2.0
- This updated reflex-dom-core to 0.7, which removes the
js
type parameter fromPrerender
(i.e.,Prerender js t m
becomesPrerender t m
) and removesHasJS
andHasJSContext
. This resulted in changes to the following Obelisk modules:Obelisk.Configs
:HasJSContext
andHasJS
are no longer derived.Obelisk.Frontend
:ObeliskWidget js t route m
no longer has thejs
type parameter. It is nowObeliskWidget t route m
.Obelisk.Route.Frontend
: There are no longerHasJSContext
orHasJS
instances forRoutedT
,SetRouteT
,RouteToUrlT
.- Various functions that were constrained to
Prerender js t m
have been updated to with the constraintPrerender t m
.
- This updated reflex-dom-core to 0.7, which removes the
- Update reflex-platform to v0.9.0.0
- Update reflex-platform to v0.8.0.3
- Update reflex-platform to v0.7.2.0
- Update reflex-platform to v0.7.1.0
- Fix bug #790 which prevented CSS file loading on ios
- Use TemplateHaskell to determine asset file paths
- Migration: All uses of
static @"some/path"
become$(static "some/path")
. Instead of requiringTypeApplications
andDataKinds
, modules callingstatic
must now enableTemplateHaskell
. - Deprecation: Deprecate static asset modules generated via 'obelisk-asset-manifest-generate' in favor of modules generated via 'obelisk-asset-th-generate'. The new executable takes the same arguments as the old and should be a drop-in replacement. To preserve the old behavior, set
__deprecated.useObeliskAssetManifestGenerate = true;
in your obelisk project configuration. - Feature: Files added to the static directory while
ob run
is active no longer requireob run
to be restarted
- Migration: All uses of
- Feature: When
staticFiles
is a derivation, as opposed to a regular directory, produce a symlink to the result of that derivation atstatic.out
and haveob run
serve static assets from that symlink. This makes it possible for the static asset derivation to be rebuilt and the new results served without restartingob run
. - Feature: Rebuild static asset derivations while
ob run
is active as long as the change to the derivation is within the project folder.ob run
now displays a message ("Static assets rebuilt and symlinked to static.out") whenever static assets have been rebuilt and the new static assets are being served. - Feature: Add
staticFilePath
toObelisk.Generated.Static
. Likestatic
, this uses TH to generate a reference to a file. Unlikestatic
, thisstaticFilePath
generates a path on the filesystem instead of URL path. - Docs: Added documentation for obelisk-routes.
- #801: Remove errors and warning for local packages without a library component
- #812: Add support for
NoImplicitPrelude
and other extensions disabled viaNo
- Pinned version bumps:
- reflex-platform 0.7.0.0
- hnix 0.8.0
- #787: Set
immutable
cache control directive when serving content-addressed static assets - Use iOS SDK 13.2
- (#810) Fix loading of
all.js
in fully compiled web apps.
- (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 certificates, upgrade to this version.
- IMPORTANT: In order to use Let's Encrypt you must now accept their terms of service. To do that, add
terms.security.acme.acceptTerms = true;
to theimport ./.obelisk/impl {
section in yourdefault.nix
. The new skeleton application may serve as an example.
- IMPORTANT: In order to use Let's Encrypt you must now accept their terms of service. To do that, add
- Update reflex-platform dependency to v0.6.0.0
- (#715) In
Obelisk.Route
deprecateisoEncoder
andprismEncoder
in favor of more precisely namedviewEncoder
andreviewEncoder
(respectively) and improve documentation regarding contravariance ofreviewEncoder
. - (#739) Improve
ob shell
by allowing commands to be passed verbatim after a--
argument. For example,ob shell 'run command'
can now be writtenob shell -- run command
. - (#735) Fix regression causing custom
Prelude
s to breakob run
/ob watch
/ob repl
. - (#737) Fix bug causing custom
Prelude
s to breakob profile
. - (#752) Fix the
ob
command-line tool to return non-zero exit code when underlying processes fail. - (#742, #57, #406) Enable
-dedupe
and-DGHCJS_BROWSER
in GHCJS builds to make JavaScript output considerably smaller leading to faster load/parse times and faster build times.- Migration: New Obelisk projects will automatically benefit from this change, but existing projects need to apply a change similar to this one.
- (#742) Update
reflex-platform
which includes:- A new version of GHCJS where
-dedupe
is fixed.
- A new version of GHCJS where
-
(#674, #711) Introduce a new thunk format to support accessing the thunk's source directly when packed. When packed, thunks have an additional file called
thunk.nix
anddefault.nix
is now a thin wrapper around that. -
(#665) Add
--interpret
and--no-interpret
options toob run
/ob watch
/ob repl
/ob shell
. These options allow you to pick which paths will be pre-compiled bynix
when entering the shell/session and which won't. For exampleob run --no-interpret dep
will ensure that any dependencies found in./dep
will be built bynix
before loading the rest of the project into theghci
session. The same configuration forob shell
will ensure that those packages are built and available in theghc
package database inside the shell.NOTE:
ob shell
's default behavior is now different. By default it now behaves likeob run
/ob watch
/ob repl
in that it does not pre-build any packages whose.cabal
orpackage.yaml
files are found in the project. To regain the previous behavior, useob shell --no-interpret . --interpret backend --interpret common --interpret frontend
from the project root. -
(#695)
ob deploy init
now requires that your obelisk project be a cleangit
checkout with pushed changes. It has always required that your obelisk project be agit
repository, but it did not require that your local changes be committed and pushed. This new requirement is added to ensure users don't accidentally create a deployment pointing to an old version of the project. -
(#705) Add
Obelisk.Route.packTextEncoder
and generalizeObelisk.Route.unpackTextEncoder
over anyData.Text.Lens.IsText
. -
(#712) Update
reflex-platform
to version 0.5.3.0. -
(#700) Ensure
ob init
uses the thunk format of the target obelisk rather than the one currently running the init command. If a user had installed a version of obelisk with a new thunk format, a newly initialized skeleton of an older version would not be able to unpack its own.obelisk/impl
. -
(#693) Fix a bug where some packages in
.attr-cache
directories would be incorrectly picked up and used instead of the correct ones when usingob run
/ob watch
/ob repl
. -
(#709) Fix a bug in obelisk's preprocessor causing it to incorrectly skip files in some circumstances.
-
(#663) Add experimental support for
ghcide
. See the README for more information. -
(#714) Miscellaneous improvements to CLI help and logging.
- Fix the version number for
ob
the command-line tool. (#679)
- Fully support HTTP Range requests on static assets to support Safari. (#664)
- Support non-EC2 deployments. (#658)
- Fix
ob deploy test android
to work. (#645) - Fix vulnerability where Android deployments would leave signing keys in the nix store which is world readable. (#645) (Thanks to kmicklas for the report.)
- Add
Obelisk.Backend.runBackendWith
to allow several customizations. (#668, #644) - Add
ob profile
command to run Obelisk projects with profiling.ob profile
works likeob run
, but instead of usingghci
, it builds an executable that is built with profiling enabled. (#654) - Obelisk's
default.nix
now exposesmkAssets
function which is used to construct the assets served by an Obelisk application. (#651) - Bump reflex-platform to v0.5.2.0. (#671)
-
Fix a bug in
Obelisk.Route.Frontend
whererouteLink
,routeLinkDynAttr
, anddynRouteLink
would not behave exactly like<a href="...">
when run by JavaScript. These functions now scroll to the top of the page when the link is clicked. (#540) -
Fix a bug in
ob run
/ob watch
/ob repl
where nested Obelisk projects would also be loaded into the session. These are now ignored. (#652) -
Improve behavior of
ob run
/ob watch
/ob repl
when multiple packages with the same name are encountered. Obelisk now issues a warning and tells you which one it will use. (#653) -
Removed
Obelisk.Backend.mkRouteToUrl
since it is easily written in terms ofObelisk.Route.renderObeliskRoute
:mkRouteToUrl validFullEncoder (k :/ v) = renderObeliskRoute validFullEncoder (FullRoute_Frontend (ObeliskRoute_App k) :/ v)
-
Add
Obelisk.Backend.renderAllJsPath
to expose URL path toghcjs/all.js
. (#545) -
Add argument to
serveDefaultObeliskApp
,serveObeliskApp
, andserveGhcjsApp
to take the path toall.js
instead of hard-coding it. (#545)
- Add
Obelisk.Route.(?/)
, a convenience function for constructing routes nested inMaybe
. (#457) - Add local unpacked packages to the
ob run
,ob watch
, andob repl
sessions. Any.cabal
or hpack package inside the current obelisk project will be loaded into the session. Forob run
/ob watch
this means the session will automatically reload when you save a source file in any of those packages. Forob repl
it means that:r
will reload changes to any of those packages. There are some edge cases where this integration is still rough. Report any issues you encounter. (#489) - Add
ob hoogle
command to start a local Hoogle server for the project. (#628) ob thunk pack
will now attempt to automatically detect if the thunk is a private or public repo. To avoid this detection, specify--private
or--public
manually. (#607)- Fix a bug in the plain git thunk loader for thunks marked as 'private' when the revision is not in the default branch. (#648)
- Improve handling of runtime nix dependencies. This may fix some issues encountered particularly by users on systems other than NixOS.
- Bump reflex-platform which, notably, bumps nixpkgs to 19.09. (#585)
- Add new thunk loader for Git repositories that supports
file://
Git remotes and supports private repositories viabuiltins.fetchGit
for private repositories (when thegit.json
file specifies"private": true
). (#594) - Add a new thunk loader for GitHub repositories that uses
builtins.fetchTarball
for public repositories to increase loader performance and usesfetchFromGitHub
for private repositories (when thegithub.json
file specifies"private": true
). Note thatfetchFromGitHub
requires some Nix configuration for the Nix builder to access the repository. Ifob thunk pack
fails in this case, use-v
to see Nix's helpful message. (#594) - Add
--public
/--private
options toob thunk pack
to specify if a repository should be treated as a public or private. (#594) - Improve error messaging when a dependency doesn't have the expected
.cabal
orpackage.yaml
file. (#597) - Improve the skeleton in small ways. (#593, #589)
- Fix
ob
commands to again support running from any subdirectory of an obelisk project (#591) - Add
reflex-platform-func
argument to Obelisk'sdefault.nix
. It defaults to its prior behavior of using the reflex-platform in indep
. (#612)
- Change the structure of Obelisk routes to use a designated
FullRoute
type. This combines frontend and backend routes into one structure. This is a breaking change which requires Obelisk apps to take specific migrations. They are:- Rewrite the implementation of
_backend_routeEncoder
inBackend
to usemkFullRouteEncoder
instead ofhandleEncoder
. Specifically, the backend and frontend cases of the top-levelpathComponentEncoder
become the second and third arguments ofmkFullRouteEncoder
respectively, while the missing route becomes the first argument. An example of how to do this is available in a reflex-examples commit. - Replace type constructions of
InL
withFullRoute_Backend
andInR
withFullRoute_Frontend
.
- Rewrite the implementation of
- Generalised
pathSegmentEncoder
, addedpathFieldEncoder
. - Added some
Prism
s to the encoder library for manipulatingDSum
s. - Add
ob doc
command, which lists paths to haddock documentation for specified packages. - Bump reflex-platform so that obelisk now uses GHC 8.6.5 and the nixos-19.03 nixpkgs set.
- Add support in
obelisk-route
for single parameters in URL paths. - Bump reflex-platform so that obelisk now uses reflex-dom 0.5.2.0.
- Use a
--pure
nix shell inob run
for parity withob repl
and more resilience against "works on my machine". - Pin usages of
<nixpkgs>
in obelisk thunks, etc. to the nixpkgs used by the project's obelisk impl. - Backport ACMEv2 support in obelisk server to regain LetsEncrypt account creation.
- Enable HTTPS in
ob run
. ob run
now handlesghci
errors better, and includes a customghcid
version. As a result, you no longer need to have ghcid installed to useob run
, as we provide one for you.ob
commands now complain less on systems with umasks other than0022
.- Ignore package environment files in
ob run
andob repl
. - Add
Obelisk.Route.Frontend.routeLinkDynAttr
.
- Configs become ByteStrings.
- FrontendConfigsT has been changed into ConfigsT and configs are made available via getConfig/getConfigs
- The frontend will still only have access to configs that are placed in config/frontend and config/common, while the backend has access to the entire contents of the config directory via
Obelisk.ExecutableConfig.Lookup.getConfigs
.
- The frontend will still only have access to configs that are placed in config/frontend and config/common, while the backend has access to the entire contents of the config directory via
- The backend no longer runs in BackendConfigsT.
- Add tabulation package. See Data.Tabulation for details.
- Add encoders for
DMap
,HasFields
(cf. Data.Tabulation), and JSON. - Use IP address for nginx proxy pass instead of localhost
- Fix crashes of Android apps on 32-bit ARM devices.
- Provide a way to indicate acceptance of the Android SDK license by passing
config.android_sdk.accept_license = true;
in the arguments to the import of.obelisk/impl
in the project'sdefault.nix
. - Add
COMPLETE
pragma to(:/)
. Using this pattern synonym should no longer generate spurious warnings about non-exhaustive pattern matching. - Make asset path hashing strict (see
Obelisk.Asset.Gather
) - Add the
ob shell
command to enter a nix shell for an obelisk project - Allow skeleton's obelisk to be overridden. This changes the skeleton's default.nix interface: the arguments that it used to take are now part of the new "obelisk" argument.
- Removed
MonadIO
fromObeliskWidget
to prevent accidental IO during prerendering. If you need to do IO in a widget it should be on the right hand side of aprerender
. - Significantly changed the interface to the "executable config" packages.
obelisk-executable-config-lookup
is a new internal package which looks up all configs in a platform-specific way.obelisk-executable-frontend
andobelisk-executable-backend
provide MTL-style monad classes (HasFrontendConfigs
andHasBackendConfigs
) which the frontend and backend, respectively, can use to look up configs. This replaces the oldget
function which ran inIO
. - Add a flag to force thunk packing even if there are unpushed changes in the unpacked thunk.
- Use reflex-dom's
HydrationDomBuilder
to "hydrate" statically rendered DOM served by the Obelisk backend (rather than re-creating DOM and replacing it all). - Add
HasCookies
andCookiesT
to allowObeliskWidget
s to access cookies during static and "hydrated" DOM rendering.