zephyr: Zephyr, tree-shaking for the PureScript language

[ development, library, mpl, program ] [ Propose Tags ]

Tree shaking tool and partial evaluator for PureScript CoreFn AST.


[Skip to Readme]
Versions [faq] 0.1.1.0, 0.1.4, 0.2.0, 0.2.1, 0.3.1, 0.3.2
Change log ChangeLog.md
Dependencies aeson (>=1.0 && <1.5), ansi-terminal (>=0.7.1 && <0.11), ansi-wl-pprint, async, base (>=4.8 && <5), base-compat (>=0.6.0), boxes (>=0.1.4 && <0.2), bytestring, containers, directory (>=1.2.3), filepath, formatting, Glob (>=0.9 && <0.11), language-javascript (>=0.7.1 && <0.8), mtl (>=2.1.0 && <2.3.0), optparse-applicative (>=0.13.0), purescript (>=0.13.8 && <0.14), safe (>=0.3.9 && <0.4), text, transformers (>=0.3.0 && <0.6), utf8-string (==1.*), zephyr [details]
License MPL-2.0
Copyright (c) 2017-2018 Marcin Szamotulski
Author Marcin Szamotulski <profunctor@pm.me>
Maintainer Marcin Szamotulski <profunctor@pm.me>
Category Development
Home page https://github.com/coot/zephyr#readme
Source repo head: git clone https://github.com/coot/zephyr
Uploaded by coot at 2020-06-28T19:15:31Z
Distributions NixOS:0.3.2
Executables zephyr
Downloads 1851 total (12 in the last 30 days)
Rating (no votes yet) [estimated by Bayesian average]
Your Rating
  • λ
  • λ
  • λ
Status Hackage Matrix CI
Docs uploaded by user
Build status unknown [no reports yet]

Modules

[Index] [Quick Jump]

Flags

NameDescriptionDefaultType
test-with-stack

use `stack exec zephyr` in tests

DisabledAutomatic
test-core-libs

test core libs

DisabledAutomatic

Use -f <flag> to enable a flag, or -f -<flag> to disable that flag. More info

Downloads

Maintainer's Corner

For package maintainers and hackage trustees


Readme for zephyr-0.3.2

[back to package description]

zephyr

Maintainer: coot zephyr

A tree-shaking tool for PureScript. zephyr takes root terms, finds all terms which are required to evaluate them, and generates code just for them. This is done across all dependencies, and can substantially reduce the size of PureScript bundles. zephyr can also evaluate some expressions (an experimental feature).

Usage

# compile your project
purs compile -g corefn bower_components/purescript-*/src/**/*.purs src/**/*.purs

# run `zephyr`
zephyr -f Main.main

then you can bundle with purs bundle command:

purs bundle -o app.js -m Main dce-output/**/*.js

You can integrate it with other build tools, see below.

You can specify modules as entry points, which is the same as specifying all exported identifiers.

# include all identifiers from Data.Eq module
zephyr Data.Eq

# as above
zephyr module:Data.Eq

# include Data.Eq.Eq identifier of Data.Eq module
zephyr ident:Data.Eq.Eq

# include 'Data.Eq.eq' identifier
zephyr Data.Eq.eq

zephyr reads corefn json representation from the output directory, removes non transitive dependencies of entry points and generates common js modules (or corefn representation) to dce-output directory.

Evaluation of literal expressions

Zephyr can evaluate some literal expressions.

import Config (isProduction)

a = if isProduction
  then "api/prod/"
  else "api/dev/"

will be transformed to

a = "api/prod/"

whenever isProduction is true. This allows to have different development and production environments while still ship a minified code which only contains production code. You may define isProduction in a module under a src-prod directory and include it when compiling production code with pulp build -I src-prod and to have another copy for your development environment under src-dev where isProduction is set to false.

Integration with build tools

zephyr can be integrated with

  • pulp: use pulp build -- -g corefn to compile, and pulp browserify --skip-compile -o dce-output to bundle zephyr's output.
  • parcel
  • spago. See this example. Use spago build --purs-args '--codegen corefn' to compile, using spago bundle is currently affected by issue.

Build & Test

cabal build exe:zephyr

To run tests

cabal run zephyr-test

Comments

The -f switch is not 100% safe. Upon running, zephyr will remove exports from foreign modules that seems to be not used: are not used in PureScript code and seem not to be used in the foreign module. If you simply assign to exports using JavaScript dot notation then you will be fine, but if you use square notation exports[var] in a dynamic way (i.e. var is a true variable rather than a string literal), then zephyr might remove code that shouldn't be removed.