More technically accurate test case.
[string-lerp.git] / javascript.mk
1 # This is free and unencumbered software released into the public
2 # domain. To the extent possible under law, the author of this file
3 # waives all copyright and related or neighboring rights to it.
4
5 .DELETE_ON_ERROR:
6
7 javascript>fallback = $(firstword $(shell command -v $1) $2 $1)
8
9 NPM ?= npm
10 NPMROOT ?= .
11
12 npmbindir = $(NPMROOT)/node_modules/.bin
13 .PRECIOUS: $(npmbindir)/%
14
15 from-npm = $(call javascript>fallback,$1,$(npmbindir)/$1)
16
17 JSTEST ?= $(npmbindir)/jstest
18 JSHINT ?= $(call from-npm,jshint)
19
20 uglifyjs_npm_package := uglify-js
21
22 UGLIFY ?= $(call from-npm,uglifyjs)
23 UGLIFYFLAGS ?= --comments \
24 --compress $(UGLIFYCOMPRESSFLAGS) \
25 --mangle $(UGLIFYMANGLEFLAGS)
26
27 JSSTAMPDIR ?= build/stamp
28 JSHINTDIR ?= $(JSSTAMPDIR)
29 JSTESTDIR ?= $(JSSTAMPDIR)
30 JSUGLYDIR ?= .
31
32 JSHINTFLAGS += $(if $(JSHINTCONFIG),--config $(JSHINTCONFIG))
33 JSTESTFLAGS += $(if $(JSTESTFORMAT),--format $(JSTESTFORMAT))
34 JSTESTFORMAT ?= spec
35
36 jshint-stampify = $(patsubst %.js,$(JSHINTDIR)/%.js.lint,$1)
37 uglify-stampify = $(patsubst %.js,$(JSUGLYDIR)/%.min.js,$1)
38
39 javascript>capture-to-target = @echo "$1" && $1 > $@ || (cat $@ && exit 1)
40
41 UGLIFY.js = $(UGLIFY) $(UGLIFYFLAGS)
42 LINT.js = $(JSHINT) $(JSHINTFLAGS)
43 TEST.js = $(JSTEST) $(JSTESTFLAGS)
44
45 $(JSUGLYDIR)/%.min.js: %.js | $(UGLIFY)
46 @mkdir -p $(@D)
47 $(UGLIFY.js) < $< > $@
48
49 $(JSHINTDIR)/%.js.lint: %.js | $(JSHINT)
50 @mkdir -p $(@D)
51 $(LINT.js) $<
52 @touch $@
53
54 $(JSTESTDIR)/%.js.test: %.js | $(JSTEST)
55 @mkdir -p $(@D)
56 $(call javascript>capture-to-target,$(TEST.js) $<)
57
58 $(npmbindir)/%:
59 $(NPM) install $(firstword $(value $(@F)_npm_package) $(@F))