bin        = $(shell npm bin)
sjs        = $(bin)/sjs
browserify = $(bin)/browserify
jsdoc      = $(bin)/jsdoc
uglify     = $(bin)/uglifyjs
stylus     = $(bin)/stylus
VERSION    = $(shell node -e 'console.log(require("./package.json").version)')

# -- Configuration -----------------------------------------------------
PACKAGE  = jumperskirt
EXPORTS  = JumperSkirt

LIB_DIR  = lib
SRC_DIR  = src
SRC      = $(wildcard $(SRC_DIR)/*.sjs $(SRC_DIR)/**/*.sjs)
TGT      = ${SRC:$(SRC_DIR)/%.sjs=$(LIB_DIR)/%.js}

TEST_DIR = test/specs-src
TEST_BLD = test/specs
TEST_SRC = $(wildcard $(TEST_DIR)/*.sjs)
TEST_TGT = ${TEST_SRC:$(TEST_DIR)/%.sjs=$(TEST_BLD)/%.js}

STYLUS_PATHS = -I node_modules/nib/lib
STYLUS_DIR = stylus
STYLUS_BLD = css
STYLUS_SRC = $(wildcard $(STYLUS_DIR)/*.styl $(STYLUS_DIR)/**/*.styl)
STYLUS_DST = ${STYLUS_SRC:$(STYLUS_DIR)/%.styl:$(STYLUS_BLD)/%.css}

# -- Compilation -------------------------------------------------------
dist:
	mkdir -p $@

dist/$(PACKAGE).umd.js: $(LIB_DIR)/index.js $(TGT) dist
	$(browserify) $< $(BROWSERIFY_OPTIONS) --standalone $(EXPORTS) > $@

dist/$(PACKAGE).umd.min.js: dist/$(PACKAGE).umd.js
	$(uglify) --mangle - < $< > $@

$(LIB_DIR)/%.js: $(SRC_DIR)/%.sjs
	mkdir -p $(dir $@)
	$(sjs) --readable-names \
	       --load-readtable jsx-reader \
	       --module sweet-fantasies/src/do \
	       --module lambda-chop/macros \
	       --module es6-macros/macros/destructure \
	       --module macros.operators/macros \
	       --module adt-simple/macros \
	       --module sparkler/macros \
	       --output $@ \
	       $<

$(TEST_BLD)/%.js: $(TEST_DIR)/%.sjs
	mkdir -p $(dir $@)
	$(sjs) --readable-names \
	       --module hifive/macros \
	       --module alright/macros \
	       --output $@ \
	       $<


# -- Tasks -------------------------------------------------------------
node_modules: package.json
	npm install

all: $(TGT)

bundle: dist/$(PACKAGE).umd.js

dev-bundle:
	BROWSERIFY_OPTIONS="--debug" $(MAKE) bundle

minify: dist/$(PACKAGE).umd.min.js

css: node_modules
	mkdir -p $(STYLUS_BLD)
	$(stylus) $(STYLUS_PATHS) $(STYLUS_OPTIONS) -o $(STYLUS_BLD) $(STYLUS_DIR)

watch-css:
	STYLUS_OPTIONS="--watch" $(MAKE) css

documentation:
	$(jsdoc) --configure jsdoc.conf.json
	ABSPATH=$(shell cd "$(dirname "$0")"; pwd) $(MAKE) clean-docs

clean-docs:
	perl -pi -e "s?$$ABSPATH/??g" ./docs/*.html

clean:
	rm -rf dist build $(TGT) $(TEST_BLD) $(STYLUS_BLD)

test: all $(TEST_TGT)
	node test/tap

package: documentation bundle minify
	mkdir -p dist/$(PACKAGE)-$(VERSION)
	cp -r docs dist/$(PACKAGE)-$(VERSION)
	cp -r lib dist/$(PACKAGE)-$(VERSION)
	cp dist/*.js dist/$(PACKAGE)-$(VERSION)
	cp package.json dist/$(PACKAGE)-$(VERSION)
	cp README.md dist/$(PACKAGE)-$(VERSION)
	cp LICENCE dist/$(PACKAGE)-$(VERSION)
	cd dist && tar -czf $(PACKAGE)-$(VERSION).tar.gz $(PACKAGE)-$(VERSION)

publish: clean test
	npm install
	npm publish

bump:
	node tools/bump-version.js $$VERSION_BUMP

bump-feature:
	VERSION_BUMP=FEATURE $(MAKE) bump

bump-major:
	VERSION_BUMP=MAJOR $(MAKE) bump

.PHONY: test bump bump-feature bump-major publish package clean documentation dev-bundle css watch-css
