You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
42 lines
1.1 KiB
42 lines
1.1 KiB
const path = require('path')
|
|
const launch = require('launch-editor')
|
|
|
|
module.exports = (specifiedEditor, srcRoot, onErrorCallback) => {
|
|
if (typeof specifiedEditor === 'function') {
|
|
onErrorCallback = specifiedEditor
|
|
specifiedEditor = undefined
|
|
}
|
|
|
|
if (typeof srcRoot === 'function') {
|
|
onErrorCallback = srcRoot
|
|
srcRoot = undefined
|
|
}
|
|
|
|
srcRoot = srcRoot || process.cwd()
|
|
|
|
return function launchEditorMiddleware(req, res) {
|
|
let url
|
|
|
|
try {
|
|
const fullUrl = req.url.startsWith('http') ? req.url : `http://localhost${req.url}`
|
|
url = new URL(fullUrl)
|
|
// eslint-disable-next-line no-unused-vars
|
|
} catch (_err) {
|
|
res.statusCode = 500
|
|
res.end(`launch-editor-middleware: invalid URL.`)
|
|
return
|
|
}
|
|
|
|
const file = url.searchParams.get('file')
|
|
if (!file) {
|
|
res.statusCode = 500
|
|
res.end(
|
|
`launch-editor-middleware: required query param "file" is missing.`
|
|
)
|
|
} else {
|
|
const resolved = file.startsWith('file://') ? file : path.resolve(srcRoot, file)
|
|
launch(resolved, specifiedEditor, onErrorCallback)
|
|
res.end()
|
|
}
|
|
}
|
|
}
|
|
|