Vue SSR Koa2 Scaffold
This commit is contained in:
79
config/lib/env.js
Normal file
79
config/lib/env.js
Normal file
@ -0,0 +1,79 @@
|
||||
// From: https://github.com/vuejs/vue-cli/blob/dev/packages/%40vue/cli-shared-utils/lib/env.js
|
||||
const { execSync } = require('child_process')
|
||||
const fs = require('fs')
|
||||
const path = require('path')
|
||||
const LRU = require('lru-cache')
|
||||
|
||||
let _hasYarn
|
||||
const _yarnProjects = new LRU({
|
||||
max: 10,
|
||||
maxAge: 1000
|
||||
})
|
||||
let _hasGit
|
||||
const _gitProjects = new LRU({
|
||||
max: 10,
|
||||
maxAge: 1000
|
||||
})
|
||||
|
||||
// env detection
|
||||
exports.hasYarn = () => {
|
||||
if (process.env.VUE_CLI_TEST) {
|
||||
return true
|
||||
}
|
||||
if (_hasYarn != null) {
|
||||
return _hasYarn
|
||||
}
|
||||
try {
|
||||
execSync('yarnpkg --version', { stdio: 'ignore' })
|
||||
return (_hasYarn = true)
|
||||
} catch (e) {
|
||||
return (_hasYarn = false)
|
||||
}
|
||||
}
|
||||
|
||||
exports.hasProjectYarn = (cwd) => {
|
||||
if (_yarnProjects.has(cwd)) {
|
||||
return checkYarn(_yarnProjects.get(cwd))
|
||||
}
|
||||
|
||||
const lockFile = path.join(cwd, 'yarn.lock')
|
||||
const result = fs.existsSync(lockFile)
|
||||
_yarnProjects.set(cwd, result)
|
||||
return checkYarn(result)
|
||||
}
|
||||
|
||||
function checkYarn (result) {
|
||||
if (result && !exports.hasYarn()) throw new Error(`The project seems to require yarn but it's not installed.`)
|
||||
return result
|
||||
}
|
||||
|
||||
exports.hasGit = () => {
|
||||
if (process.env.VUE_CLI_TEST) {
|
||||
return true
|
||||
}
|
||||
if (_hasGit != null) {
|
||||
return _hasGit
|
||||
}
|
||||
try {
|
||||
execSync('git --version', { stdio: 'ignore' })
|
||||
return (_hasGit = true)
|
||||
} catch (e) {
|
||||
return (_hasGit = false)
|
||||
}
|
||||
}
|
||||
|
||||
exports.hasProjectGit = (cwd) => {
|
||||
if (_gitProjects.has(cwd)) {
|
||||
return _gitProjects.get(cwd)
|
||||
}
|
||||
|
||||
let result
|
||||
try {
|
||||
execSync('git status', { stdio: 'ignore', cwd })
|
||||
result = true
|
||||
} catch (e) {
|
||||
result = false
|
||||
}
|
||||
_gitProjects.set(cwd, result)
|
||||
return result
|
||||
}
|
6
config/lib/index.js
Normal file
6
config/lib/index.js
Normal file
@ -0,0 +1,6 @@
|
||||
[
|
||||
'env',
|
||||
'openBrowser'
|
||||
].forEach(m => {
|
||||
Object.assign(exports, require(`./${m}`))
|
||||
})
|
124
config/lib/openBrowser.js
Normal file
124
config/lib/openBrowser.js
Normal file
@ -0,0 +1,124 @@
|
||||
/**
|
||||
* From: https://github.com/vuejs/vue-cli/blob/dev/packages/%40vue/cli-shared-utils/lib/openBrowser.js
|
||||
*
|
||||
* Copyright (c) 2015-present, Facebook, Inc.
|
||||
*
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE file at
|
||||
* https://github.com/facebookincubator/create-react-app/blob/master/LICENSE
|
||||
*/
|
||||
|
||||
const opn = require('opn')
|
||||
const execa = require('execa')
|
||||
const chalk = require('chalk')
|
||||
const execSync = require('child_process').execSync
|
||||
|
||||
// https://github.com/sindresorhus/opn#app
|
||||
const OSX_CHROME = 'google chrome'
|
||||
|
||||
const Actions = Object.freeze({
|
||||
NONE: 0,
|
||||
BROWSER: 1,
|
||||
SCRIPT: 2
|
||||
})
|
||||
|
||||
function getBrowserEnv () {
|
||||
// Attempt to honor this environment variable.
|
||||
// It is specific to the operating system.
|
||||
// See https://github.com/sindresorhus/opn#app for documentation.
|
||||
const value = process.env.BROWSER
|
||||
let action
|
||||
if (!value) {
|
||||
// Default.
|
||||
action = Actions.BROWSER
|
||||
} else if (value.toLowerCase().endsWith('.js')) {
|
||||
action = Actions.SCRIPT
|
||||
} else if (value.toLowerCase() === 'none') {
|
||||
action = Actions.NONE
|
||||
} else {
|
||||
action = Actions.BROWSER
|
||||
}
|
||||
return { action, value }
|
||||
}
|
||||
|
||||
function executeNodeScript (scriptPath, url) {
|
||||
const extraArgs = process.argv.slice(2)
|
||||
const child = execa('node', [scriptPath, ...extraArgs, url], {
|
||||
stdio: 'inherit'
|
||||
})
|
||||
child.on('close', code => {
|
||||
if (code !== 0) {
|
||||
console.log()
|
||||
console.log(
|
||||
chalk.red(
|
||||
'The script specified as BROWSER environment variable failed.'
|
||||
)
|
||||
)
|
||||
console.log(chalk.cyan(scriptPath) + ' exited with code ' + code + '.')
|
||||
console.log()
|
||||
}
|
||||
})
|
||||
return true
|
||||
}
|
||||
|
||||
function startBrowserProcess (browser, url) {
|
||||
// If we're on OS X, the user hasn't specifically
|
||||
// requested a different browser, we can try opening
|
||||
// Chrome with AppleScript. This lets us reuse an
|
||||
// existing tab when possible instead of creating a new one.
|
||||
const shouldTryOpenChromeWithAppleScript =
|
||||
process.platform === 'darwin' &&
|
||||
(typeof browser !== 'string' || browser === OSX_CHROME)
|
||||
|
||||
if (shouldTryOpenChromeWithAppleScript) {
|
||||
try {
|
||||
// Try our best to reuse existing tab
|
||||
// on OS X Google Chrome with AppleScript
|
||||
execSync('ps cax | grep "Google Chrome"')
|
||||
execSync('osascript openChrome.applescript "' + encodeURI(url) + '"', {
|
||||
cwd: __dirname,
|
||||
stdio: 'ignore'
|
||||
})
|
||||
return true
|
||||
} catch (err) {
|
||||
// Ignore errors.
|
||||
}
|
||||
}
|
||||
|
||||
// Another special case: on OS X, check if BROWSER has been set to "open".
|
||||
// In this case, instead of passing `open` to `opn` (which won't work),
|
||||
// just ignore it (thus ensuring the intended behavior, i.e. opening the system browser):
|
||||
// https://github.com/facebookincubator/create-react-app/pull/1690#issuecomment-283518768
|
||||
if (process.platform === 'darwin' && browser === 'open') {
|
||||
browser = undefined
|
||||
}
|
||||
|
||||
// Fallback to opn
|
||||
// (It will always open new tab)
|
||||
try {
|
||||
var options = { app: browser }
|
||||
opn(url, options).catch(() => {}) // Prevent `unhandledRejection` error.
|
||||
return true
|
||||
} catch (err) {
|
||||
return false
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Reads the BROWSER evironment variable and decides what to do with it. Returns
|
||||
* true if it opened a browser or ran a node.js script, otherwise false.
|
||||
*/
|
||||
exports.openBrowser = function (url) {
|
||||
const { action, value } = getBrowserEnv()
|
||||
switch (action) {
|
||||
case Actions.NONE:
|
||||
// Special case: BROWSER="none" will prevent opening completely.
|
||||
return false
|
||||
case Actions.SCRIPT:
|
||||
return executeNodeScript(value, url)
|
||||
case Actions.BROWSER:
|
||||
return startBrowserProcess(value, url)
|
||||
default:
|
||||
throw new Error('Not implemented.')
|
||||
}
|
||||
}
|
83
config/lib/openChrome.applescript
Normal file
83
config/lib/openChrome.applescript
Normal file
@ -0,0 +1,83 @@
|
||||
(*
|
||||
Copyright (c) 2015-present, Facebook, Inc.
|
||||
This source code is licensed under the MIT license found in the
|
||||
LICENSE file at
|
||||
https://github.com/facebookincubator/create-react-app/blob/master/LICENSE
|
||||
*)
|
||||
|
||||
property targetTab: null
|
||||
property targetTabIndex: -1
|
||||
property targetWindow: null
|
||||
|
||||
on run argv
|
||||
set theURL to item 1 of argv
|
||||
|
||||
tell application "Chrome"
|
||||
|
||||
if (count every window) = 0 then
|
||||
make new window
|
||||
end if
|
||||
|
||||
-- 1: Looking for tab running debugger
|
||||
-- then, Reload debugging tab if found
|
||||
-- then return
|
||||
set found to my lookupTabWithUrl(theURL)
|
||||
if found then
|
||||
set targetWindow's active tab index to targetTabIndex
|
||||
tell targetTab to reload
|
||||
tell targetWindow to activate
|
||||
set index of targetWindow to 1
|
||||
return
|
||||
end if
|
||||
|
||||
-- 2: Looking for Empty tab
|
||||
-- In case debugging tab was not found
|
||||
-- We try to find an empty tab instead
|
||||
set found to my lookupTabWithUrl("chrome://newtab/")
|
||||
if found then
|
||||
set targetWindow's active tab index to targetTabIndex
|
||||
set URL of targetTab to theURL
|
||||
tell targetWindow to activate
|
||||
return
|
||||
end if
|
||||
|
||||
-- 3: Create new tab
|
||||
-- both debugging and empty tab were not found
|
||||
-- make a new tab with url
|
||||
tell window 1
|
||||
activate
|
||||
make new tab with properties {URL:theURL}
|
||||
end tell
|
||||
end tell
|
||||
end run
|
||||
|
||||
-- Function:
|
||||
-- Lookup tab with given url
|
||||
-- if found, store tab, index, and window in properties
|
||||
-- (properties were declared on top of file)
|
||||
on lookupTabWithUrl(lookupUrl)
|
||||
tell application "Chrome"
|
||||
-- Find a tab with the given url
|
||||
set found to false
|
||||
set theTabIndex to -1
|
||||
repeat with theWindow in every window
|
||||
set theTabIndex to 0
|
||||
repeat with theTab in every tab of theWindow
|
||||
set theTabIndex to theTabIndex + 1
|
||||
if (theTab's URL as string) contains lookupUrl then
|
||||
-- assign tab, tab index, and window to properties
|
||||
set targetTab to theTab
|
||||
set targetTabIndex to theTabIndex
|
||||
set targetWindow to theWindow
|
||||
set found to true
|
||||
exit repeat
|
||||
end if
|
||||
end repeat
|
||||
|
||||
if found then
|
||||
exit repeat
|
||||
end if
|
||||
end repeat
|
||||
end tell
|
||||
return found
|
||||
end lookupTabWithUrl
|
Reference in New Issue
Block a user