Skip to content

Commit 61fee34

Browse files
Merge pull request #77 from conveyal/dev
v2.1.0
2 parents 24fb97b + d61c60e commit 61fee34

File tree

6 files changed

+138
-37
lines changed

6 files changed

+138
-37
lines changed

__tests__/bin/mastarm.js

+20
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,26 @@ describe('mastarm cli', () => {
5050
})
5151
})
5252

53+
describe('prepublish', function () {
54+
const buildDir = util.buildDir
55+
const mockDir = util.mockDir
56+
57+
beforeEach((done) => mkdirp(buildDir, done))
58+
afterEach((done) => rimraf(buildDir, done))
59+
60+
it('should prepublish a project', (done) => {
61+
exec(`node ${mastarm} prepublish ${mockDir}:${buildDir}`,
62+
(err, stdout, stderr) => {
63+
expect(err).toBeNull()
64+
expect(stdout).toBe('')
65+
expect(stderr).toBe('')
66+
expect(fs.existsSync(`${buildDir}/index.js`)).toBeTruthy()
67+
done()
68+
}
69+
)
70+
})
71+
})
72+
5373
it('should run lint on a project', (done) => {
5474
exec(`node ${mastarm} lint`, (err, stdout, stderr) => {
5575
expect(err).toBeNull()

__tests__/lib/prepublish.js

+51
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
/* globals afterEach, beforeEach, describe, it, expect */
2+
3+
const mkdirp = require('mkdirp')
4+
const rimraf = require('rimraf')
5+
6+
const prepublish = require('../../lib/prepublish')
7+
const util = require('../../lib/util')
8+
const {buildDir, mockDir} = require('../test-utils/util.js')
9+
10+
describe('prepublish', () => {
11+
beforeEach((done) => mkdirp(buildDir, done))
12+
afterEach((done) => rimraf(buildDir, done))
13+
14+
it('should transpile a directory of files', () => {
15+
const results = prepublish({
16+
entries: util.parseEntries([`${mockDir}:${buildDir}`]),
17+
env: 'development'
18+
})
19+
20+
expect(results.length).toBe(1)
21+
})
22+
23+
it('should transpile a directory of files to a specific outdir', () => {
24+
const results = prepublish({
25+
entries: util.parseEntries([mockDir]),
26+
env: 'development',
27+
outdir: buildDir
28+
})
29+
30+
expect(results.length).toBe(1)
31+
})
32+
33+
it('should transpile entries', () => {
34+
const results = prepublish({
35+
entries: util.parseEntries([`${mockDir}/index.js:${buildDir}/index.js`]),
36+
env: 'development'
37+
})
38+
39+
expect(results.length).toBe(1)
40+
})
41+
42+
it('should transpile entries to a specific outdir', () => {
43+
const results = prepublish({
44+
entries: util.parseEntries([`${mockDir}/index.js`]),
45+
env: 'development',
46+
outdir: buildDir
47+
})
48+
49+
expect(results.length).toBe(1)
50+
})
51+
})

bin/mastarm

+10-31
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ commander
1111
.option('-c, --config <path>', 'Path to configuration files.', path.join(process.cwd(), '/configurations/default'))
1212
.option('-e, --env <environment>', 'Environment to use.')
1313
.option('-m, --minify', 'Minify built files.')
14+
.option('-O, --outdir <dir>', 'Publish directory', '')
1415
.option('-S, --skip-check-dependencies', '**DEPRECATED**')
1516

1617
commander
@@ -23,7 +24,7 @@ commander
2324
.action(function (entries, options) {
2425
const config = loadConfig(process.cwd(), commander.config, commander.env)
2526
const get = util.makeGetFn([options, commander, config.settings])
26-
const files = util.parseEntries(entries, get)
27+
const files = util.parseEntries([...entries, ...(get('entries') || [])], get('outdir'))
2728
util.assertEntriesExist(files)
2829
const opts = {
2930
config,
@@ -67,7 +68,7 @@ commander
6768
const pushToS3 = require('../lib/push-to-s3')
6869
const config = loadConfig(process.cwd(), commander.config, commander.env)
6970
const get = util.makeGetFn([options, commander, config.settings])
70-
const files = util.parseEntries(entries, get)
71+
const files = util.parseEntries([...entries, ...(get('entries') || [])])
7172
util.assertEntriesExist(files)
7273
Promise.all(files.map(pushToS3({
7374
cloudfront: get('cloudfront'),
@@ -104,43 +105,21 @@ commander
104105
.command('prepublish [entries...]')
105106
.description('Transpile JavaScript down to ES5 with Babel')
106107
.action(function (entries, options) {
107-
const babel = require('babel-core')
108-
const fs = require('fs')
109-
const glob = require('glob')
110-
const mkdirp = require('mkdirp')
111-
const babelConfig = require('../lib/babel-config')
108+
const prepublish = require('../lib/prepublish')
112109
const config = loadConfig(process.cwd(), commander.config, commander.env)
113110
const get = util.makeGetFn([options, commander, config.settings])
114-
const outdir = path.join(process.cwd(), 'build')
115-
entries.forEach((entry) => {
116-
if (fs.statSync(entry).isDirectory()) {
117-
transformDir(entry)
118-
} else {
119-
transformFile(entry)
120-
}
111+
112+
prepublish({
113+
entries: util.parseEntries([...entries, ...(get('entries') || [])], get('outdir')),
114+
env: get('env'),
115+
outdir: get('outdir')
121116
})
122-
function transformFile (filename) {
123-
const filepath = path.join(outdir, filename)
124-
const results = babel.transform(
125-
fs.readFileSync(filename, 'utf8'),
126-
Object.assign({}, babelConfig(get('env')), {filename, sourceMaps: true})
127-
)
128-
mkdirp.sync(path.dirname(filepath))
129-
fs.writeFileSync(filepath, results.code + '\n//# sourceMappingURL=' + path.basename(filepath))
130-
fs.writeFileSync(`${filepath}.map`, JSON.stringify(results.map))
131-
}
132-
function transformDir (dir) {
133-
glob(`${dir}/**/*.js`, (err, files) => {
134-
if (err) console.error(err)
135-
files.forEach(transformFile)
136-
})
137-
}
138117
})
139118

140119
commander
141120
.command('test [patterns...]')
142121
.description('Run tests using Jest')
143-
.option('-u, --update-snapshots', 'Force update of snapshots. USE WITH CAUTION.')
122+
.option('-u, --update-snapshots', 'Force update of snapshots. USE WITH CAUTION.')
144123
.option('--coverage', 'Run Jest with coverage reporting')
145124
.option('--no-cache', 'Run Jest without cache (defaults to using cache)')
146125
.option('--coverage-paths <paths>', 'Extra paths to collect code coverage from')

lib/prepublish.js

+47
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
const babel = require('babel-core')
2+
const fs = require('fs')
3+
const glob = require('glob')
4+
const mkdirp = require('mkdirp')
5+
const path = require('path')
6+
7+
const babelConfig = require('./babel-config')
8+
9+
module.exports = function ({
10+
entries,
11+
env,
12+
outdir
13+
}) {
14+
return entries.reduce((results, entry) =>
15+
fs.statSync(entry[0]).isDirectory()
16+
? [...results, ...transformDir({config: babelConfig(env), entry, outdir})]
17+
: [...results, transformFile({config: babelConfig(env), entry, outdir})], [])
18+
}
19+
20+
function transformDir ({
21+
config,
22+
entry,
23+
outdir
24+
}) {
25+
return glob
26+
.sync(`${entry[0]}/**/*.js`)
27+
.map((filename) =>
28+
transformFile({
29+
config,
30+
entry: [filename, filename.replace(entry[0], entry[1] || outdir)]
31+
}))
32+
}
33+
34+
function transformFile ({
35+
config,
36+
entry,
37+
outdir
38+
}) {
39+
const filename = entry[0]
40+
const filepath = entry[1] || `${outdir}/${filename}`
41+
const results = babel.transform(fs.readFileSync(filename, 'utf8'), Object.assign({}, config, {filename, sourceMaps: true}))
42+
mkdirp.sync(path.dirname(filepath))
43+
fs.writeFileSync(filepath, results.code + '\n\n//# sourceMappingURL=' + path.basename(filepath))
44+
fs.writeFileSync(`${filepath}.map`, JSON.stringify(results.map))
45+
46+
return results
47+
}

lib/util.js

+9-5
Original file line numberDiff line numberDiff line change
@@ -13,15 +13,19 @@ exports.configureEnvironment = ({config, env}) => {
1313

1414
exports.makeGetFn = (targets) => {
1515
return (item) => {
16-
const ts = targets.filter((t) => t[item] !== undefined)
17-
if (ts.length > 0) return ts[0][item]
16+
const target = targets.find((t) => t[item] !== undefined)
17+
if (target) return target[item]
1818
}
1919
}
2020

21-
exports.parseEntries = function (entries, get) {
22-
return unique([...entries, ...(get('entries') || [])])
21+
/**
22+
* Parse entry pairs in the format of `input:output` passed either through the CLI or settings file. If it is not a pair then it uses the `outdir` setting to determine the pairing.
23+
*
24+
* @return {Array[String, String]} entries
25+
*/
26+
exports.parseEntries = function (entries, outdir) {
27+
return unique(entries)
2328
.map((entry) => entry.split(':'))
24-
.map((entry) => entry.length === 1 ? [entry[0], `${get('outdir') || 'assets'}/${entry[0]}`] : entry)
2529
}
2630

2731
exports.assertEntriesExist = function (entries) {

package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@
3737
"babel-jest": "^16.0.0",
3838
"babel-plugin-add-module-exports": "^0.2.1",
3939
"babel-plugin-transform-runtime": "^6.9.0",
40-
"babel-preset-env": "^0.0.6",
40+
"babel-preset-env": "^0.0.7",
4141
"babel-preset-react": "^6.5.0",
4242
"babel-preset-stage-2": "^6.17.0",
4343
"babelify": "^7.3.0",

0 commit comments

Comments
 (0)