Skip to content
This repository has been archived by the owner on Jan 8, 2022. It is now read-only.

Commit

Permalink
show error for missing hmtl
Browse files Browse the repository at this point in the history
  • Loading branch information
farism committed Sep 3, 2017
1 parent 4e48d31 commit 1a19afb
Show file tree
Hide file tree
Showing 8 changed files with 164 additions and 167 deletions.
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@
"find-elm-dependencies": "^1.0.1",
"find-up": "^2.1.0",
"fkill": "^5.0.0",
"fs-extra": "^4.0.1",
"gulp": "^3.9.1",
"gulp-any-template": "^0.3.1",
"gulp-elm-basic": "^0.3.0",
Expand Down Expand Up @@ -70,7 +71,6 @@
"husky": "^0.14.3",
"lint-staged": "^4.0.4",
"mocha": "^3.5.0",
"mute": "^2.0.6",
"nyc": "^11.1.0",
"portscanner": "^2.1.1",
"request-promise-native": "^1.0.4",
Expand Down
6 changes: 3 additions & 3 deletions src/tasks/build.js
Original file line number Diff line number Diff line change
Expand Up @@ -129,6 +129,7 @@ const build = options => {
const opts = Object.assign({}, defaults, options)

// CLI spinner
spinner.space()
spinner.next('old builds are being cleaned')

return del(opts.outputPath)
Expand Down Expand Up @@ -169,12 +170,11 @@ const build = options => {
.then(() => {
spinner.space()
spinner.succeed('main application has been compiled')
spinner.space()
})
.catch(e => {
spinner.space()
spinner.fail(e)
spinner.space()
spinner.fail(e, false)
throw e
})
}

Expand Down
232 changes: 110 additions & 122 deletions src/tasks/dev.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ const elmCss = require('elm-css')
const execa = require('execa')
const findAllDependencies = require('find-elm-dependencies').findAllDependencies
const fkill = require('fkill')
const fs = require('fs')
const fs = require('fs-extra')
const nocache = require('nocache')
const path = require('path')
const proxy = require('http-proxy-middleware')
Expand Down Expand Up @@ -62,27 +62,61 @@ const loadHtmlCompiler = file => {
validateParam('string', 'file', file)

return new Promise((resolve, reject) => {
fs.readFile(file, (err, contents) => {
if (err) {
reject(err)
}
fs
.pathExists(file)
.then(() => fs.readFile(file))
.then((contents) => {
const compiler = anyTemplate.compiler({ path: file, contents })

if (compiler) {
resolve(compiler)
} else {
reject(new Error('html template format unsupported'))
}
})
.catch(reject)
})
}

const compiler = anyTemplate.compiler({ path: file, contents })
const createWatcher = (onChange, onDeps, filter, bs, entry) => {
validateParam('function', 'onChange', onChange)
validateParam('function', 'onDeps', onDeps)
validateParam('function', 'filter', filter)
validateParam('object', 'bs', bs)
validateParam('string', 'entry', entry)

if (compiler) {
resolve(compiler)
} else {
reject(new Error('html template format unsupported'))
}
})
})
return new Promise((resolve, reject) =>
getDepTree(entry)
.then(deps => {
onDeps(deps)

const watcher = bs.watch(['!elm-stuff', ...deps])

watcher.on('change', file => {
if (filter(file)) {
// stop watching temporarily
watcher && watcher.close()

// trigger on change
onChange(file)

// start watching again
createWatcher(onChange, onDeps, filter, bs, entry)
}
})

resolve(watcher)
})
.catch(reject)
)
}

const htmlCompiler = (bs, html) => (request, response, next) => {
if (path.extname(request.url) === '.elm') {
return loadHtmlCompiler(html)
.catch(e => {
spinner(e)
spinner.fail(e, false)
throw e
})
.then(compiler =>
compiler({
Expand All @@ -94,11 +128,6 @@ const htmlCompiler = (bs, html) => (request, response, next) => {
response.write(compiledHtml)
response.end()
})
.catch(e => {
response.write(e)
response.end()
throw e
})
.then(() =>
createWatcher(
() => bs.reload(),
Expand All @@ -108,6 +137,9 @@ const htmlCompiler = (bs, html) => (request, response, next) => {
path.join(process.cwd(), request.url)
)
)
.catch(e => {
next()
})
} else {
next()
}
Expand Down Expand Up @@ -226,140 +258,96 @@ const startBrowserSync = (
})
}

const createWatcher = (onChange, onDeps, filter, bs, entry) => {
validateParam('function', 'onChange', onChange)
validateParam('function', 'onDeps', onDeps)
validateParam('function', 'filter', filter)
validateParam('object', 'bs', bs)
validateParam('string', 'entry', entry)

return new Promise((resolve, reject) =>
getDepTree(entry)
.then(deps => {
onDeps(deps)

const watcher = bs.watch(['!elm-stuff', ...deps])

watcher.on('change', file => {
if (filter(file)) {
// stop watching temporarily
watcher && watcher.close()

// trigger on change
onChange(file)

// start watching again
createWatcher(onChange, onDeps, filter, bs, entry)
}
})

resolve(watcher)
})
.catch(reject)
)
}

const compileCss = (stylesheets, dir) =>
elmCss(process.cwd(), stylesheets, dir)
.then(() => {
setTimeout(() => {
spinner.space()
spinner.succeed('css has been compiled')
spinner.space()
})
})
.catch(e => {
setTimeout(() => {
spinner.space()
spinner.fail(`elm-css ${e.message}`, false)
spinner.space()
})
})

const dev = options => {
const opts = Object.assign({}, defaults, options)
const tmpDir = tmp.dirSync({ unsafeCleanup: true })

spinner.space()
spinner.next('elm-package install is starting')

return (
// first install packages using elm-package
installPackages()
.catch(e => {
spinner.fail(e)
})
// then start elm-reactor
.then(output => {
spinner.succeed('elm-package install has completed')
spinner.next('elm-reactor is starting')
return installPackages()
.catch(e => {
spinner.fail(e)
})
.then(output => {
spinner.succeed('elm-package install has completed')
spinner.next('elm-reactor is starting')

return startReactor(opts.reactorHost, opts.reactorPort)
})
// then start browser-sync
.then(() => {
spinner.succeed('elm-reactor is now started')
spinner.next('browser-sync is starting')

return startBrowserSync(
opts.host,
opts.port,
`http://${opts.reactorHost}:${opts.reactorPort}`,
opts.html,
tmpDir.name,
opts.proxy,
opts.proxyRewrite
).catch(e => {
spinner.fail(e)
})
})
.then(({ bs, port }) => {
spinner.succeed('browser-sync is now started')

return Promise.all([
Promise.resolve(port),
// check if our stylesheet exists
exists(opts.stylesheets)
.then(() => {
// compile stylesheet
spinner.next('css is now compiling')

return compileCss(opts.stylesheets, tmpDir.name)
})
.then(() => {
// create stylesheet watcher
return createWatcher(
file => compileCss(opts.stylesheets, tmpDir.name),
deps => (stylesheetsDeps = deps),
() => true,
bs,
opts.stylesheets
)
})
.catch(e => {
spinner.space()
spinner.fail(e, false)
}),
])
})
.then(port => {
spinner.succeed(`ready! http://${opts.host}:${opts.port}`)
spinner.space()
})
.catch(e => {
spinner.fail(e, false)
spinner.space()
throw e
return startReactor(opts.reactorHost, opts.reactorPort)
})
.then(() => {
spinner.succeed('elm-reactor is now started')
spinner.next('browser-sync is starting')

return startBrowserSync(
opts.host,
opts.port,
`http://${opts.reactorHost}:${opts.reactorPort}`,
opts.html,
tmpDir.name,
opts.proxy,
opts.proxyRewrite
).catch(e => {
spinner.fail(e)
})
)
})
.then(({ bs, port }) => {
spinner.succeed('browser-sync is now started')

return Promise.all([
Promise.resolve(port),
fs
.readFile(opts.stylesheets)
.then(() => {
spinner.next('css is now compiling')

return compileCss(opts.stylesheets, tmpDir.name)
})
.then(() => {
return createWatcher(
file => compileCss(opts.stylesheets, tmpDir.name),
deps => (stylesheetsDeps = deps),
() => true,
bs,
opts.stylesheets
)
})
.catch(e => {
spinner.fail(e, false)
}),
])
})
.then(port => {
spinner.succeed(`ready! http://${opts.host}:${opts.port}`)
})
.catch(e => {
spinner.fail(e, false)
throw e
})
}

module.exports = {
parseProxies,
createProxies,
getDepTree,
loadHtmlCompiler,
createWatcher,
startReactor,
startBrowserSync,
createWatcher,
dev,
}
16 changes: 9 additions & 7 deletions src/tasks/init.js
Original file line number Diff line number Diff line change
@@ -1,11 +1,12 @@
const anyTemplate = require('gulp-any-template')
const filter = require('gulp-filter')
const fs = require('fs')
const fs = require('fs-extra')
const gulp = require('gulp')
const path = require('path')
const pumpify = require('pumpify')
const rename = require('gulp-rename')

const defaults = require('../defaults').init
const { initializeSpinner, validateParam } = require('./utils')

// global reference to CLI spinner
Expand All @@ -15,9 +16,12 @@ const isEmpty = dir => {
validateParam('string', 'dir', dir)

return new Promise((resolve, reject) => {
fs.readdir(dir, function(err, files) {
resolve(files ? files.length === 0 : true)
})
fs
.readdir(dir)
.then(files => {
resolve(files ? files.length === 0 : true)
})
.catch(() => resolve(true))
})
}

Expand Down Expand Up @@ -48,6 +52,7 @@ const copy = dir => {
const init = (options = {}) => {
validateParam('object', 'options', options)

spinner.space()
spinner.next('initializing your project')

return isEmpty(options.dir)
Expand All @@ -60,13 +65,10 @@ const init = (options = {}) => {
})
.then(() => {
spinner.succeed('project created!')
spinner.space()
spinner.stopAndPersist({ symbol: '$ ', text: `cd ${options.dir}` })
spinner.space()
})
.catch(e => {
spinner.fail(e, false)
spinner.space()
})
}

Expand Down
Loading

0 comments on commit 1a19afb

Please sign in to comment.