@@ -97,6 +97,11 @@ export default {
title: {
type: String,
default: null
+ },
+
+ openLinks: {
+ type: Boolean,
+ default: false
}
},
@@ -166,6 +171,9 @@ export default {
},
handleLink (event, uri) {
+ if (this.openLinks) {
+ window.open(uri, '_blank')
+ }
this.$emit('link', uri)
},
@@ -205,19 +213,6 @@ export default {
align-items stretch
background $vue-ui-color-light-neutral
- .toolbar
- h-box()
- align-items center
- padding 6px 6px 6px $padding-item
- > :not(.separator)
- space-between-x(6px)
- > * + .separator
- margin-left 6px
- .title
- flex 100% 1 1
- width 0
- ellipsis()
-
.view
flex 100% 1 1
height 0
diff --git a/packages/@vue/cli-ui/src/graphql-api/api/PluginApi.js b/packages/@vue/cli-ui/src/graphql-api/api/PluginApi.js
index baac6b691a..716325e260 100644
--- a/packages/@vue/cli-ui/src/graphql-api/api/PluginApi.js
+++ b/packages/@vue/cli-ui/src/graphql-api/api/PluginApi.js
@@ -1,7 +1,14 @@
+const plugins = require('../connectors/plugins')
+const sharedData = require('../connectors/shared-data')
+const ipc = require('../utils/ipc')
+
class PluginApi {
- constructor () {
+ constructor (context) {
+ this.context = context
this.configurations = []
this.tasks = []
+ this.clientAddons = []
+ this.actions = new Map()
}
describeConfig (options) {
@@ -17,6 +24,54 @@ class PluginApi {
options => options.match.test(command)
)
}
+
+ addClientAddon (options) {
+ this.clientAddons.push(options)
+ }
+
+ ipcOn (cb) {
+ return ipc.on(cb)
+ }
+
+ ipcOff (cb) {
+ ipc.off(cb)
+ }
+
+ ipcSend (data) {
+ ipc.send(data)
+ }
+
+ /* Namespaced */
+
+ getSharedData (id) {
+ return sharedData.get(id, this.context)
+ }
+
+ setSharedData (id, value) {
+ sharedData.set({ id, value }, this.context)
+ }
+
+ onAction (id, cb) {
+ let list = this.actions.get(id)
+ if (!list) {
+ list = []
+ this.actions.set(id, list)
+ }
+ list.push(cb)
+ }
+
+ callAction (id, params) {
+ return plugins.callAction({ id, params }, this.context)
+ }
+
+ namespace (namespace) {
+ return {
+ getSharedData: (id) => this.getSharedData(namespace + id),
+ setSharedData: (id, value) => this.setSharedData(namespace + id, value),
+ onAction: (id, cb) => this.onAction(namespace + id, cb),
+ callAction: (id, params) => this.callAction(namespace + id, params)
+ }
+ }
}
module.exports = PluginApi
diff --git a/packages/@vue/cli-ui/src/graphql-api/channels.js b/packages/@vue/cli-ui/src/graphql-api/channels.js
index d66879014b..994cff17e4 100644
--- a/packages/@vue/cli-ui/src/graphql-api/channels.js
+++ b/packages/@vue/cli-ui/src/graphql-api/channels.js
@@ -7,5 +7,9 @@ module.exports = {
TASK_LOG_ADDED: 'task_log_added',
ROUTE_ADDED: 'route_added',
ROUTE_REMOVED: 'route_removed',
- ROUTE_CHANGED: 'route_changed'
+ ROUTE_CHANGED: 'route_changed',
+ CLIENT_ADDON_ADDED: 'client_addon_added',
+ SHARED_DATA_UPDATED: 'shared_data_updated',
+ PLUGIN_ACTION_CALLED: 'plugin_action_called',
+ PLUGIN_ACTION_RESOLVED: 'plugin_action_resolved'
}
diff --git a/packages/@vue/cli-ui/src/graphql-api/connectors/client-addons.js b/packages/@vue/cli-ui/src/graphql-api/connectors/client-addons.js
new file mode 100644
index 0000000000..8b7355b366
--- /dev/null
+++ b/packages/@vue/cli-ui/src/graphql-api/connectors/client-addons.js
@@ -0,0 +1,36 @@
+const channels = require('../channels')
+
+let addons = []
+
+function list (context) {
+ return addons
+}
+
+function add (options, context) {
+ if (findOne(options.id)) return
+
+ addons.push(options)
+ context.pubsub.publish(channels.CLIENT_ADDON_ADDED, {
+ clientAddonAdded: options
+ })
+}
+
+function findOne (id, context) {
+ return addons.find(
+ addon => addon.id === id
+ )
+}
+
+function remove (id, context) {
+ const index = addons.findIndex(
+ addon => addon.id === id
+ )
+ if (index !== -1) addons.splice(index, 1)
+}
+
+module.exports = {
+ list,
+ add,
+ remove,
+ findOne
+}
diff --git a/packages/@vue/cli-ui/src/graphql-api/connectors/plugins.js b/packages/@vue/cli-ui/src/graphql-api/connectors/plugins.js
index 2405ced7cd..85e0ed27e6 100644
--- a/packages/@vue/cli-ui/src/graphql-api/connectors/plugins.js
+++ b/packages/@vue/cli-ui/src/graphql-api/connectors/plugins.js
@@ -16,12 +16,15 @@ const {
updatePackage
} = require('@vue/cli/lib/util/installDeps')
const invoke = require('@vue/cli/lib/invoke')
+// Subs
+const channels = require('../channels')
// Connectors
const cwd = require('./cwd')
const folders = require('./folders')
const prompts = require('./prompts')
const progress = require('./progress')
const logs = require('./logs')
+const clientAddons = require('./client-addons')
// Api
const PluginApi = require('../api/PluginApi')
// Utils
@@ -73,12 +76,17 @@ function list (file, context) {
}
function resetPluginApi (context) {
- pluginApi = new PluginApi()
+ pluginApi = new PluginApi(context)
+ // Run Plugin API
+ runPluginApi('@vue/cli-service', context)
plugins.forEach(plugin => runPluginApi(plugin.id, context))
+ runPluginApi('.', context, 'vue-cli-ui')
+ // Add client addons
+ pluginApi.clientAddons.forEach(options => clientAddons.add(options, context))
}
-function runPluginApi (id, context) {
- const module = loadModule(`${id}/ui`, cwd.get(), true)
+function runPluginApi (id, context, fileName = 'ui') {
+ const module = loadModule(`${id}/${fileName}`, cwd.get(), true)
if (module) {
module(pluginApi)
}
@@ -278,6 +286,32 @@ function getApi () {
return pluginApi
}
+async function callAction ({ id, params }, context) {
+ context.pubsub.publish(channels.PLUGIN_ACTION_CALLED, {
+ pluginActionCalled: { id, params }
+ })
+ const results = []
+ const errors = []
+ const list = pluginApi.actions.get(id)
+ if (list) {
+ for (const cb of list) {
+ let result = null
+ let error = null
+ try {
+ result = await cb(params)
+ } catch (e) {
+ error = e
+ }
+ results.push(result)
+ errors.push(error)
+ }
+ }
+ context.pubsub.publish(channels.PLUGIN_ACTION_RESOLVED, {
+ pluginActionResolved: { id, params, results, errors }
+ })
+ return { id, params, results, errors }
+}
+
module.exports = {
list,
findOne,
@@ -291,5 +325,6 @@ module.exports = {
runInvoke,
resetPluginApi,
getApi,
- finishInstall
+ finishInstall,
+ callAction
}
diff --git a/packages/@vue/cli-ui/src/graphql-api/connectors/prompts.js b/packages/@vue/cli-ui/src/graphql-api/connectors/prompts.js
index 1eacc90723..497c424a06 100644
--- a/packages/@vue/cli-ui/src/graphql-api/connectors/prompts.js
+++ b/packages/@vue/cli-ui/src/graphql-api/connectors/prompts.js
@@ -85,7 +85,7 @@ function setAnswer (id, value) {
}
function getAnswer (id) {
- ObjectUtil.get(answers, id)
+ return ObjectUtil.get(answers, id)
}
function removeAnswer (id) {
diff --git a/packages/@vue/cli-ui/src/graphql-api/connectors/shared-data.js b/packages/@vue/cli-ui/src/graphql-api/connectors/shared-data.js
new file mode 100644
index 0000000000..d9b7ca3d31
--- /dev/null
+++ b/packages/@vue/cli-ui/src/graphql-api/connectors/shared-data.js
@@ -0,0 +1,28 @@
+// Subscriptions channels
+const channels = require('../channels')
+
+let sharedData = new Map()
+
+function get (id, context) {
+ const value = sharedData.get(id)
+
+ if (typeof value === 'undefined') return null
+
+ return {
+ id,
+ value
+ }
+}
+
+function set ({ id, value }, context) {
+ sharedData.set(id, value)
+ context.pubsub.publish(channels.SHARED_DATA_UPDATED, {
+ sharedDataUpdated: { id, value }
+ })
+ return { id, value }
+}
+
+module.exports = {
+ get,
+ set
+}
diff --git a/packages/@vue/cli-ui/src/graphql-api/connectors/tasks.js b/packages/@vue/cli-ui/src/graphql-api/connectors/tasks.js
index 20bd41c0f6..7804de5667 100644
--- a/packages/@vue/cli-ui/src/graphql-api/connectors/tasks.js
+++ b/packages/@vue/cli-ui/src/graphql-api/connectors/tasks.js
@@ -44,6 +44,7 @@ function list (context) {
command,
index: list.findIndex(t => t.id === id),
prompts: [],
+ views: [],
...moreData
}
}
@@ -141,9 +142,9 @@ function run (id, context) {
answers
}, context)
- // Plugin api
- if (task.onRun) {
- task.onRun({
+ // Plugin API
+ if (task.onBeforeRun) {
+ task.onBeforeRun({
answers,
args
})
@@ -151,9 +152,18 @@ function run (id, context) {
const child = execa(getCommand(), args, {
cwd: cwd.get(),
- stdio: ['inherit', 'pipe', 'pipe']
+ stdio: ['inherit', 'pipe', 'pipe', 'ipc']
})
+ // Plugin API
+ if (task.onRun) {
+ task.onRun({
+ args,
+ child,
+ cwd: cwd.get()
+ })
+ }
+
updateOne({
id: task.id,
status: 'running',
@@ -180,7 +190,18 @@ function run (id, context) {
}, context)
})
- child.on('close', (code, signal) => {
+ const onExit = (code, signal) => {
+ // Plugin API
+ if (task.onExit) {
+ task.onExit({
+ args,
+ child,
+ cwd: cwd.get(),
+ code,
+ signal
+ })
+ }
+
if (code === null) {
updateOne({
id: task.id,
@@ -212,7 +233,9 @@ function run (id, context) {
type: 'done'
}, context)
}
- })
+ }
+
+ child.on('exit', onExit)
}
return task
}
diff --git a/packages/@vue/cli-ui/src/graphql-api/resolvers.js b/packages/@vue/cli-ui/src/graphql-api/resolvers.js
index c014a205f4..b079ac6d83 100644
--- a/packages/@vue/cli-ui/src/graphql-api/resolvers.js
+++ b/packages/@vue/cli-ui/src/graphql-api/resolvers.js
@@ -1,8 +1,8 @@
const { withFilter } = require('graphql-subscriptions')
const exit = require('@vue/cli-shared-utils/lib/exit')
-
+const GraphQLJSON = require('graphql-type-json')
+// Channels for subscriptions
const channels = require('./channels')
-
// Connectors
const cwd = require('./connectors/cwd')
const folders = require('./connectors/folders')
@@ -15,6 +15,10 @@ const configurations = require('./connectors/configurations')
const git = require('./connectors/git')
const files = require('./connectors/files')
const routes = require('./connectors/routes')
+const clientAddons = require('./connectors/client-addons')
+const sharedData = require('./connectors/shared-data')
+// Start ipc server
+require('./utils/ipc')
// Prevent code from exiting server process
exit.exitProcess = false
@@ -22,6 +26,8 @@ exit.exitProcess = false
process.env.VUE_CLI_API_MODE = true
module.exports = {
+ JSON: GraphQLJSON,
+
Folder: {
children: (folder, args, context) => folders.list(folder.path, context),
isPackage: (folder, args, context) => folders.isPackage(folder.path, context),
@@ -63,7 +69,9 @@ module.exports = {
configurations: (root, args, context) => configurations.list(context),
configuration: (root, { id }, context) => configurations.findOne(id, context),
fileDiffs: (root, args, context) => git.getDiffs(context),
- routes: (root, args, context) => routes.list(context)
+ routes: (root, args, context) => routes.list(context),
+ clientAddons: (root, args, context) => clientAddons.list(context),
+ sharedData: (root, { id }, context) => sharedData.get(id, context)
},
Mutation: {
@@ -88,13 +96,15 @@ module.exports = {
pluginInvoke: (root, { id }, context) => plugins.runInvoke(id, context),
pluginFinishInstall: (root, args, context) => plugins.finishInstall(context),
pluginUpdate: (root, { id }, context) => plugins.update(id, context),
+ pluginActionCall: (root, args, context) => plugins.callAction(args, context),
taskRun: (root, { id }, context) => tasks.run(id, context),
taskStop: (root, { id }, context) => tasks.stop(id, context),
taskLogsClear: (root, { id }, context) => tasks.clearLogs(id, context),
configurationSave: (root, { id }, context) => configurations.save(id, context),
configurationCancel: (root, { id }, context) => configurations.cancel(id, context),
gitCommit: (root, { message }, context) => git.commit(message, context),
- fileOpenInEditor: (root, { input }, context) => files.openInEditor(input, context)
+ fileOpenInEditor: (root, { input }, context) => files.openInEditor(input, context),
+ sharedDataUpdate: (root, args, context) => sharedData.set(args, context)
},
Subscription: {
@@ -131,6 +141,21 @@ module.exports = {
(parent, args, { pubsub }) => pubsub.asyncIterator(channels.TASK_LOG_ADDED),
(payload, vars) => payload.taskLogAdded.taskId === vars.id
)
+ },
+ clientAddonAdded: {
+ subscribe: (parent, args, { pubsub }) => pubsub.asyncIterator(channels.CLIENT_ADDON_ADDED)
+ },
+ sharedDataUpdated: {
+ subscribe: withFilter(
+ (parent, args, { pubsub }) => pubsub.asyncIterator(channels.SHARED_DATA_UPDATED),
+ (payload, vars) => payload.sharedDataUpdated.id === vars.id
+ )
+ },
+ pluginActionCalled: {
+ subscribe: (parent, args, { pubsub }) => pubsub.asyncIterator(channels.PLUGIN_ACTION_CALLED)
+ },
+ pluginActionResolved: {
+ subscribe: (parent, args, { pubsub }) => pubsub.asyncIterator(channels.PLUGIN_ACTION_RESOLVED)
}
}
}
diff --git a/packages/@vue/cli-ui/src/graphql-api/type-defs.js b/packages/@vue/cli-ui/src/graphql-api/type-defs.js
index 75838d37e5..c6909407b4 100644
--- a/packages/@vue/cli-ui/src/graphql-api/type-defs.js
+++ b/packages/@vue/cli-ui/src/graphql-api/type-defs.js
@@ -1,4 +1,5 @@
module.exports = `
+scalar JSON
type ConsoleLog {
id: ID!
@@ -108,6 +109,18 @@ enum PluginInstallationStep {
diff
}
+type PluginActionCall {
+ id: ID!
+ params: JSON
+}
+
+type PluginActionResult {
+ id: ID!
+ params: JSON
+ results: [JSON]
+ errors: [JSON]
+}
+
type Feature implements DescribedEntity {
id: ID!
name: String
@@ -179,6 +192,8 @@ type Task implements DescribedEntity {
link: String
logs: [TaskLog]
prompts: [Prompt]
+ views: [TaskView]
+ defaultView: String
}
enum TaskStatus {
@@ -200,6 +215,13 @@ enum TaskLogType {
stderr
}
+type TaskView {
+ id: ID!
+ label: String!
+ component: String!
+ icon: String
+}
+
type Configuration implements DescribedEntity {
id: ID!
name: String
@@ -256,6 +278,16 @@ type Route {
tooltip: String
}
+type ClientAddon {
+ id: ID!
+ url: String!
+}
+
+type SharedData {
+ id: ID!
+ value: JSON
+}
+
type Query {
progress (id: ID!): Progress
cwd: String!
@@ -274,6 +306,8 @@ type Query {
configuration (id: ID!): Configuration
fileDiffs: [FileDiff]
routes: [Route]
+ clientAddons: [ClientAddon]
+ sharedData (id: ID!): SharedData
}
type Mutation {
@@ -295,6 +329,7 @@ type Mutation {
pluginInvoke (id: ID!): PluginInstallation
pluginFinishInstall: PluginInstallation
pluginUpdate (id: ID!): Plugin
+ pluginActionCall (id: ID!, params: JSON): PluginActionResult
taskRun (id: ID!): Task
taskStop (id: ID!): Task
taskLogsClear (id: ID!): Task
@@ -302,6 +337,7 @@ type Mutation {
configurationCancel (id: ID!): Configuration
gitCommit (message: String!): Boolean
fileOpenInEditor (input: OpenInEditorInput!): Boolean
+ sharedDataUpdate (id: ID!, value: JSON!): SharedData
}
type Subscription {
@@ -314,5 +350,9 @@ type Subscription {
routeAdded: Route
routeRemoved: Route
routeChanged: Route
+ clientAddonAdded: ClientAddon
+ sharedDataUpdated (id: ID!): SharedData
+ pluginActionCalled: PluginActionCall
+ pluginActionResolved: PluginActionResult
}
`
diff --git a/packages/@vue/cli-ui/src/graphql-api/utils/ipc.js b/packages/@vue/cli-ui/src/graphql-api/utils/ipc.js
new file mode 100644
index 0000000000..4aaf665ec3
--- /dev/null
+++ b/packages/@vue/cli-ui/src/graphql-api/utils/ipc.js
@@ -0,0 +1,42 @@
+const ipc = require('node-ipc')
+
+ipc.config.id = 'vue-cli'
+ipc.config.retry = 1500
+ipc.config.silent = true
+
+const listeners = []
+
+ipc.serve(() => {
+ ipc.server.on('message', (data, socket) => {
+ for (const listener of listeners) {
+ listener({
+ data,
+ emit: data => {
+ ipc.server.emit(socket, 'message', data)
+ }
+ })
+ }
+ })
+})
+
+ipc.server.start()
+
+function on (cb) {
+ listeners.push(cb)
+ return () => off(cb)
+}
+
+function off (cb) {
+ const index = listeners.indexOf(cb)
+ if (index !== -1) listeners.splice(index, 1)
+}
+
+function send (data) {
+ ipc.server.emit('message', data)
+}
+
+module.exports = {
+ on,
+ off,
+ send
+}
diff --git a/packages/@vue/cli-ui/src/graphql/clientAddonAdded.gql b/packages/@vue/cli-ui/src/graphql/clientAddonAdded.gql
new file mode 100644
index 0000000000..412a3fe594
--- /dev/null
+++ b/packages/@vue/cli-ui/src/graphql/clientAddonAdded.gql
@@ -0,0 +1,7 @@
+#import "./clientAddonFragment.gql"
+
+subscription clientAddonAdded {
+ clientAddonAdded {
+ ...clientAddon
+ }
+}
diff --git a/packages/@vue/cli-ui/src/graphql/clientAddonFragment.gql b/packages/@vue/cli-ui/src/graphql/clientAddonFragment.gql
new file mode 100644
index 0000000000..f32c069aa7
--- /dev/null
+++ b/packages/@vue/cli-ui/src/graphql/clientAddonFragment.gql
@@ -0,0 +1,4 @@
+fragment clientAddon on ClientAddon {
+ id
+ url
+}
diff --git a/packages/@vue/cli-ui/src/graphql/clientAddons.gql b/packages/@vue/cli-ui/src/graphql/clientAddons.gql
new file mode 100644
index 0000000000..e9a6e54857
--- /dev/null
+++ b/packages/@vue/cli-ui/src/graphql/clientAddons.gql
@@ -0,0 +1,7 @@
+#import "./clientAddonFragment.gql"
+
+query clientAddons {
+ clientAddons {
+ ...clientAddon
+ }
+}
diff --git a/packages/@vue/cli-ui/src/graphql/pluginActionCall.gql b/packages/@vue/cli-ui/src/graphql/pluginActionCall.gql
new file mode 100644
index 0000000000..f6c65c4e5f
--- /dev/null
+++ b/packages/@vue/cli-ui/src/graphql/pluginActionCall.gql
@@ -0,0 +1,7 @@
+#import "./pluginActionResultFragment.gql"
+
+mutation pluginActionCall ($id: ID!, $params: JSON) {
+ pluginActionCall (id: $id, params: $params) {
+ ...pluginActionResult
+ }
+}
diff --git a/packages/@vue/cli-ui/src/graphql/pluginActionCallFragment.gql b/packages/@vue/cli-ui/src/graphql/pluginActionCallFragment.gql
new file mode 100644
index 0000000000..63795c21bc
--- /dev/null
+++ b/packages/@vue/cli-ui/src/graphql/pluginActionCallFragment.gql
@@ -0,0 +1,4 @@
+fragment pluginActionCall on PluginActionCall {
+ id
+ params
+}
diff --git a/packages/@vue/cli-ui/src/graphql/pluginActionCalled.gql b/packages/@vue/cli-ui/src/graphql/pluginActionCalled.gql
new file mode 100644
index 0000000000..151e6dd50c
--- /dev/null
+++ b/packages/@vue/cli-ui/src/graphql/pluginActionCalled.gql
@@ -0,0 +1,7 @@
+#import "./pluginActionCallFragment.gql"
+
+subscription pluginActionCalled {
+ pluginActionCalled {
+ ...pluginActionCall
+ }
+}
diff --git a/packages/@vue/cli-ui/src/graphql/pluginActionResolved.gql b/packages/@vue/cli-ui/src/graphql/pluginActionResolved.gql
new file mode 100644
index 0000000000..92597b7d7e
--- /dev/null
+++ b/packages/@vue/cli-ui/src/graphql/pluginActionResolved.gql
@@ -0,0 +1,7 @@
+#import "./pluginActionResultFragment.gql"
+
+subscription pluginActionResolved {
+ pluginActionResolved {
+ ...pluginActionResult
+ }
+}
diff --git a/packages/@vue/cli-ui/src/graphql/pluginActionResultFragment.gql b/packages/@vue/cli-ui/src/graphql/pluginActionResultFragment.gql
new file mode 100644
index 0000000000..da5f4f460c
--- /dev/null
+++ b/packages/@vue/cli-ui/src/graphql/pluginActionResultFragment.gql
@@ -0,0 +1,6 @@
+fragment pluginActionResult on PluginActionResult {
+ id
+ params
+ results
+ errors
+}
diff --git a/packages/@vue/cli-ui/src/graphql/sharedData.gql b/packages/@vue/cli-ui/src/graphql/sharedData.gql
new file mode 100644
index 0000000000..afcad6e3bc
--- /dev/null
+++ b/packages/@vue/cli-ui/src/graphql/sharedData.gql
@@ -0,0 +1,7 @@
+#import "./sharedDataFragment.gql"
+
+query sharedData ($id: ID!) {
+ sharedData (id: $id) {
+ ...sharedData
+ }
+}
diff --git a/packages/@vue/cli-ui/src/graphql/sharedDataFragment.gql b/packages/@vue/cli-ui/src/graphql/sharedDataFragment.gql
new file mode 100644
index 0000000000..fd434a03a5
--- /dev/null
+++ b/packages/@vue/cli-ui/src/graphql/sharedDataFragment.gql
@@ -0,0 +1,4 @@
+fragment sharedData on SharedData {
+ id
+ value
+}
diff --git a/packages/@vue/cli-ui/src/graphql/sharedDataUpdate.gql b/packages/@vue/cli-ui/src/graphql/sharedDataUpdate.gql
new file mode 100644
index 0000000000..5bdac7f9a9
--- /dev/null
+++ b/packages/@vue/cli-ui/src/graphql/sharedDataUpdate.gql
@@ -0,0 +1,7 @@
+#import "./sharedDataFragment.gql"
+
+mutation sharedDataUpdate ($id: ID!, $value: JSON!) {
+ sharedDataUpdate (id: $id, value: $value) {
+ ...sharedData
+ }
+}
diff --git a/packages/@vue/cli-ui/src/graphql/sharedDataUpdated.gql b/packages/@vue/cli-ui/src/graphql/sharedDataUpdated.gql
new file mode 100644
index 0000000000..c6683fcc37
--- /dev/null
+++ b/packages/@vue/cli-ui/src/graphql/sharedDataUpdated.gql
@@ -0,0 +1,7 @@
+#import "./sharedDataFragment.gql"
+
+subscription sharedDataUpdated ($id: ID!) {
+ sharedDataUpdated (id: $id) {
+ ...sharedData
+ }
+}
diff --git a/packages/@vue/cli-ui/src/graphql/task.gql b/packages/@vue/cli-ui/src/graphql/task.gql
index 2a28170bfd..0b9fae37ee 100644
--- a/packages/@vue/cli-ui/src/graphql/task.gql
+++ b/packages/@vue/cli-ui/src/graphql/task.gql
@@ -4,9 +4,16 @@
query task ($id: ID!) {
task (id: $id) {
...task
+ link
prompts {
...prompt
}
- link
+ views {
+ id
+ label
+ icon
+ component
+ }
+ defaultView
}
}
diff --git a/packages/@vue/cli-ui/src/main.js b/packages/@vue/cli-ui/src/main.js
index f311cb2739..385e5242c6 100644
--- a/packages/@vue/cli-ui/src/main.js
+++ b/packages/@vue/cli-ui/src/main.js
@@ -7,9 +7,31 @@ import VueUi from '@vue/ui'
import InstantSearch from 'vue-instantsearch'
import * as Filters from './filters'
import './register-components'
+import ClientAddonApi from './util/ClientAddonApi'
+import Responsive from './util/responsive'
+import SharedData from './util/SharedData'
+import PluginAction from './util/PluginAction'
+import gql from 'graphql-tag'
+
+window.gql = gql
Vue.use(VueUi)
Vue.use(InstantSearch)
+Vue.use(Responsive, {
+ computed: {
+ mobile () {
+ return this.width <= 768
+ },
+ tablet () {
+ return this.width <= 900
+ },
+ desktop () {
+ return !this.tablet
+ }
+ }
+})
+Vue.use(SharedData)
+Vue.use(PluginAction)
for (const key in Filters) {
Vue.filter(key, Filters[key])
@@ -17,6 +39,10 @@ for (const key in Filters) {
Vue.config.productionTip = false
+// For client addons
+window.Vue = Vue
+window.ClientAddonApi = new ClientAddonApi()
+
const app = new Vue({
provide: apolloProvider.provide(),
router,
diff --git a/packages/@vue/cli-ui/src/style/main.styl b/packages/@vue/cli-ui/src/style/main.styl
index e0d8f854fd..c2b45a4157 100644
--- a/packages/@vue/cli-ui/src/style/main.styl
+++ b/packages/@vue/cli-ui/src/style/main.styl
@@ -101,3 +101,29 @@ ansi-colors('white', $vue-ui-color-light)
.fill-height
height 100%
+
+.blank-icon
+ width 24px
+ height @width
+ display block
+ margin auto
+ svg
+ fill rgba($vue-ui-color-dark, .3)
+
+.pane-toolbar
+ h-box()
+ align-items center
+ padding 6px 6px 6px $padding-item
+ > :not(.separator)
+ space-between-x(6px)
+ > * + .separator
+ margin-left 6px
+ .title
+ flex 100% 1 1
+ width 0
+ ellipsis()
+
+ > .vue-ui-switch
+ &:not(.selected)
+ .wrapper
+ background rgba($vue-ui-color-dark, .2)
diff --git a/packages/@vue/cli-ui/src/util/ClientAddonApi.js b/packages/@vue/cli-ui/src/util/ClientAddonApi.js
new file mode 100644
index 0000000000..e928213e33
--- /dev/null
+++ b/packages/@vue/cli-ui/src/util/ClientAddonApi.js
@@ -0,0 +1,49 @@
+import Vue from 'vue'
+
+export default class ClientAddonApi {
+ constructor (addonId) {
+ this.components = new Map()
+ this.componentListeners = new Map()
+ }
+
+ component (id, definition) {
+ this.components.set(id, definition)
+ const componentId = toComponentId(id)
+ Vue.component(componentId, definition)
+ console.log(`Registered ${componentId} component`)
+ // Call listeners
+ const listeners = this.componentListeners.get(id)
+ if (listeners) {
+ listeners.forEach(l => l(definition))
+ this.componentListeners.delete(id)
+ }
+ }
+
+ getComponent (id) {
+ return this.components.get(id)
+ }
+
+ listenForComponent (id, cb) {
+ let listeners = this.componentListeners.get(id)
+ if (!listeners) {
+ listeners = []
+ this.componentListeners.set(id, listeners)
+ }
+ listeners.push(cb)
+ }
+
+ awaitComponent (id) {
+ return new Promise((resolve, reject) => {
+ const result = this.getComponent(id)
+ if (result) {
+ resolve(result)
+ } else {
+ this.listenForComponent(id, resolve)
+ }
+ })
+ }
+}
+
+export function toComponentId (id) {
+ return `client-addon--${id}`
+}
diff --git a/packages/@vue/cli-ui/src/util/PluginAction.js b/packages/@vue/cli-ui/src/util/PluginAction.js
new file mode 100644
index 0000000000..ae08880783
--- /dev/null
+++ b/packages/@vue/cli-ui/src/util/PluginAction.js
@@ -0,0 +1,35 @@
+import PLUGIN_ACTION_CALL from '../graphql/pluginActionCall.gql'
+import PLUGIN_ACTION_CALLED from '../graphql/pluginActionCalled.gql'
+import PLUGIN_ACTION_RESOLVED from '../graphql/pluginActionResolved.gql'
+
+let uid = 0
+
+export default {
+ install (Vue) {
+ Vue.mixin({
+ methods: {
+ $callAction (id, params) {
+ return this.$apollo.mutate({
+ mutation: PLUGIN_ACTION_CALL,
+ variables: {
+ id,
+ params
+ }
+ })
+ },
+ $onActionCalled (cb) {
+ return this.$apollo.addSmartSubscription(`plugin-action-called-${uid++}`, {
+ query: PLUGIN_ACTION_CALLED,
+ result: cb
+ })
+ },
+ $onActionResolved (cb) {
+ return this.$apollo.addSmartSubscription(`plugin-action-resolved-${uid++}`, {
+ query: PLUGIN_ACTION_RESOLVED,
+ result: cb
+ })
+ }
+ }
+ })
+ }
+}
diff --git a/packages/@vue/cli-ui/src/util/SharedData.js b/packages/@vue/cli-ui/src/util/SharedData.js
new file mode 100644
index 0000000000..12b95699d9
--- /dev/null
+++ b/packages/@vue/cli-ui/src/util/SharedData.js
@@ -0,0 +1,111 @@
+import SHARED_DATA from '../graphql/sharedData.gql'
+import SHARED_DATA_UPDATE from '../graphql/sharedDataUpdate.gql'
+import SHARED_DATA_UPDATED from '../graphql/sharedDataUpdated.gql'
+
+function genQuery (id) {
+ return {
+ query: SHARED_DATA,
+ variables: {
+ id
+ },
+ fetchPolicy: 'cache-and-network',
+ update: ({ sharedData }) => sharedData.value,
+ subscribeToMore: {
+ document: SHARED_DATA_UPDATED,
+ variables: {
+ id
+ },
+ updateQuery: (previousResult, { subscriptionData }) => {
+ return {
+ sharedData: subscriptionData.data.sharedDataUpdated
+ }
+ }
+ }
+ }
+}
+
+export default {
+ install (Vue) {
+ Vue.mixin({
+ data () {
+ return {
+ $sharedData: {}
+ }
+ },
+
+ created () {
+ const options = this.$options.sharedData
+ if (options) {
+ if (typeof options === 'function') {
+ let smartQueries
+ this.$watch(options.bind(this), result => {
+ if (smartQueries) {
+ smartQueries.forEach(s => s.destroy())
+ }
+ smartQueries = this.$syncSharedData(result)
+ }, {
+ immediate: true
+ })
+ } else {
+ this.$syncSharedData(options)
+ }
+ }
+ },
+
+ methods: {
+ async $getSharedData (id) {
+ const result = await this.$apollo.query({
+ query: SHARED_DATA,
+ variables: {
+ id
+ }
+ })
+ return result.sharedData.value
+ },
+ $watchSharedData (id, cb) {
+ return this.$apollo.addSmartQuery(id, {
+ ...genQuery(id),
+ manual: true,
+ result: ({ data }) => {
+ data && cb(data.sharedData.value)
+ }
+ })
+ },
+ $setSharedData (id, value) {
+ return this.$apollo.mutate({
+ mutation: SHARED_DATA_UPDATE,
+ variables: {
+ id,
+ value
+ }
+ })
+ },
+ $syncSharedData (options) {
+ const smartQueries = []
+ for (const key in options) {
+ const id = options[key]
+ this.$set(this.$data.$sharedData, key, null)
+ // Proxy
+ Object.defineProperty(this, key, {
+ get: () => this.$data.$sharedData[key],
+ set: value => this.$set(this.$data.$sharedData, key, value),
+ enumerable: true,
+ configurable: true
+ })
+ const smartQuery = this.$apollo.addSmartQuery(key, genQuery(id))
+ smartQueries.push(smartQuery)
+ }
+ return smartQueries
+ }
+ }
+ })
+
+ window.mapSharedData = (namespace, options) => {
+ const result = {}
+ for (const key in options) {
+ result[key] = namespace + options[key]
+ }
+ return result
+ }
+ }
+}
diff --git a/packages/@vue/cli-ui/src/util/responsive.js b/packages/@vue/cli-ui/src/util/responsive.js
new file mode 100644
index 0000000000..67ff6b2c29
--- /dev/null
+++ b/packages/@vue/cli-ui/src/util/responsive.js
@@ -0,0 +1,28 @@
+export let responsive
+
+export default {
+ install (Vue, options) {
+ const finalOptions = Object.assign({}, {
+ computed: {}
+ }, options)
+
+ responsive = new Vue({
+ data () {
+ return {
+ width: window.innerWidth,
+ height: window.innerHeight
+ }
+ },
+ computed: finalOptions.computed
+ })
+
+ Object.defineProperty(Vue.prototype, '$responsive', {
+ get: () => responsive
+ })
+
+ window.addEventListener('resize', () => {
+ responsive.width = window.innerWidth
+ responsive.height = window.innerHeight
+ })
+ }
+}
diff --git a/packages/@vue/cli-ui/src/views/ProjectTaskDetails.vue b/packages/@vue/cli-ui/src/views/ProjectTaskDetails.vue
index 532379183a..3290a9464e 100644
--- a/packages/@vue/cli-ui/src/views/ProjectTaskDetails.vue
+++ b/packages/@vue/cli-ui/src/views/ProjectTaskDetails.vue
@@ -2,6 +2,7 @@
@@ -48,11 +49,33 @@
/>
+
+
+
+
+
+
+
+
@@ -106,6 +137,12 @@ import TASK_LOG_ADDED from '../graphql/taskLogAdded.gql'
export default {
name: 'ProjectTaskDetails',
+ provide () {
+ return {
+ TaskDetails: this
+ }
+ },
+
mixins: [
Prompts({
field: 'task',
@@ -123,7 +160,8 @@ export default {
data () {
return {
task: null,
- showParameters: false
+ showParameters: false,
+ currentView: '_output'
}
},
@@ -135,7 +173,14 @@ export default {
id: this.id
}
},
- fetchPolicy: 'cache-and-network'
+ fetchPolicy: 'cache-and-network',
+ async result ({ data, loading }) {
+ if (!this.$_init && !loading && data && data.task.defaultView) {
+ this.$_init = true
+ await this.$nextTick()
+ this.currentView = data.task.defaultView
+ }
+ }
},
taskLogs: {
@@ -147,10 +192,13 @@ export default {
},
fetchPolicy: 'network-only',
manual: true,
- result ({ data, loading }) {
+ async result ({ data, loading }) {
if (!loading) {
+ await this.$nextTick()
const terminal = this.$refs.terminal
- data.taskLogs.logs.forEach(terminal.addLog)
+ if (terminal) {
+ data.taskLogs.logs.forEach(terminal.addLog)
+ }
}
}
},
@@ -163,8 +211,9 @@ export default {
id: this.id
}
},
- result ({ data }) {
+ async result ({ data }) {
if (data.taskLogAdded.taskId === this.id) {
+ await this.$nextTick()
const terminal = this.$refs.terminal
terminal.addLog(data.taskLogAdded)
}
@@ -173,9 +222,22 @@ export default {
}
},
+ computed: {
+ currentViewComponent () {
+ if (this.currentView !== '_output') {
+ const id = this.task.views.find(
+ view => view.id === this.currentView
+ ).component
+ return id
+ }
+ },
+ },
+
watch: {
id () {
this.showParameters = false
+ this.currentView = '_output'
+ this.$_init = false
}
},
@@ -232,19 +294,40 @@ export default {
.content
flex 100% 1 1
height 0
- padding 0 $padding-item $padding-item
+ margin 0 $padding-item $padding-item
+ position relative
.terminal-view
+ position absolute
+ top 0
+ left 0
+ width 100%
height 100%
border-radius $br
+ &.ghost
+ opacity 0
+ pointer-events none
+
+ .view
+ max-height 100%
+ overflow-x hidden
+ overflow-y auto
.header
padding $padding-item $padding-item 0
h-box()
align-items center
+ .task-icon
+ margin-right 4px
+ >>> svg
+ fill $vue-ui-color-dark
+
.name
- font-size 18px
+ font-size 22px
+ color $vue-ui-color-dark
+ position relative
+ top -1px
.description
color $color-text-light
diff --git a/yarn.lock b/yarn.lock
index 654a76801a..e2092cc557 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -575,6 +575,16 @@
dependencies:
lodash.once "^4.1.1"
+"@most/multicast@^1.2.5":
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/@most/multicast/-/multicast-1.3.0.tgz#e01574840df634478ac3fabd164c6e830fb3b966"
+ dependencies:
+ "@most/prelude" "^1.4.0"
+
+"@most/prelude@^1.4.0":
+ version "1.7.0"
+ resolved "https://registry.yarnpkg.com/@most/prelude/-/prelude-1.7.0.tgz#0956ed464ad03e7fc95143eac0c6dd028498d975"
+
"@mrmlnc/readdir-enhanced@^2.2.1":
version "2.2.1"
resolved "https://registry.yarnpkg.com/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz#524af240d1a360527b730475ecfa1344aa540dde"
@@ -1486,7 +1496,7 @@ babel-traverse@^6.18.0, babel-traverse@^6.26.0:
invariant "^2.2.2"
lodash "^4.17.4"
-babel-types@^6.18.0, babel-types@^6.24.1, babel-types@^6.26.0:
+babel-types@^6.18.0, babel-types@^6.24.1, babel-types@^6.26.0, babel-types@^6.7.2:
version "6.26.0"
resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.26.0.tgz#a3b073f94ab49eb6fa55cd65227a334380632497"
dependencies:
@@ -1499,7 +1509,7 @@ babylon@7.0.0-beta.40, babylon@^7.0.0-beta.40:
version "7.0.0-beta.40"
resolved "https://registry.yarnpkg.com/babylon/-/babylon-7.0.0-beta.40.tgz#91fc8cd56d5eb98b28e6fde41045f2957779940a"
-babylon@^6.18.0:
+babylon@^6.18.0, babylon@^6.7.0:
version "6.18.0"
resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3"
@@ -1545,6 +1555,14 @@ bcrypt-pbkdf@^1.0.0:
dependencies:
tweetnacl "^0.14.3"
+better-sqlite3@^4.0.2:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/better-sqlite3/-/better-sqlite3-4.1.0.tgz#1dbb0b13b280ce1eebebad431502deb08b78941e"
+ dependencies:
+ bindings "^1.3.0"
+ integer "^1.0.3"
+ lzz-gyp "^0.4.2"
+
big.js@^3.1.3:
version "3.2.0"
resolved "https://registry.yarnpkg.com/big.js/-/big.js-3.2.0.tgz#a5fc298b81b9e0dca2e458824784b65c52ba588e"
@@ -1553,6 +1571,10 @@ binary-extensions@^1.0.0:
version "1.11.0"
resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.11.0.tgz#46aa1751fb6a2f93ee5e689bb1087d4b14c6c205"
+bindings@^1.3.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.3.0.tgz#b346f6ecf6a95f5a815c5839fc7cdb22502f1ed7"
+
bl@^1.0.0:
version "1.2.1"
resolved "https://registry.yarnpkg.com/bl/-/bl-1.2.1.tgz#cac328f7bee45730d404b692203fcb590e172d5e"
@@ -3400,6 +3422,10 @@ duplexify@^3.4.2, duplexify@^3.5.3:
readable-stream "^2.0.0"
stream-shift "^1.0.0"
+easy-stack@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/easy-stack/-/easy-stack-1.0.0.tgz#12c91b3085a37f0baa336e9486eac4bf94e3e788"
+
ecc-jsbn@~0.1.1:
version "0.1.1"
resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz#0fc73a9ed5f0d53c38193398523ef7e543777505"
@@ -3857,6 +3883,10 @@ event-emitter@~0.3.5:
d "1"
es5-ext "~0.10.14"
+event-pubsub@4.3.0:
+ version "4.3.0"
+ resolved "https://registry.yarnpkg.com/event-pubsub/-/event-pubsub-4.3.0.tgz#f68d816bc29f1ec02c539dc58c8dd40ce72cb36e"
+
event-stream@~3.3.0:
version "3.3.4"
resolved "https://registry.yarnpkg.com/event-stream/-/event-stream-3.3.4.tgz#4ab4c9a0f5a54db9338b4c34d86bfce8f4b35571"
@@ -4090,6 +4120,12 @@ extsprintf@^1.2.0:
version "1.4.0"
resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f"
+farmhash@^1.2.1:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/farmhash/-/farmhash-1.2.1.tgz#2dbf12604ef5ca1f1420fb6600fccb30d5474dfd"
+ dependencies:
+ nan "^2.4.0"
+
fast-deep-equal@^1.0.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz#c053477817c86b51daa853c81e059b733d023614"
@@ -4842,6 +4878,10 @@ graphql-tools@^2.21.0:
iterall "^1.1.3"
uuid "^3.1.0"
+graphql-type-json@^0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/graphql-type-json/-/graphql-type-json-0.2.0.tgz#34c1a5fc2b7707a367c436482b253dbeebf1130e"
+
graphql@^0.13.0, graphql@^0.13.1:
version "0.13.1"
resolved "https://registry.yarnpkg.com/graphql/-/graphql-0.13.1.tgz#9b3db3d8e40d1827e4172404bfdd2e4e17a58b55"
@@ -5331,6 +5371,27 @@ inquirer@^4.0.1:
strip-ansi "^4.0.0"
through "^2.3.6"
+inspectpack@^2.2.4:
+ version "2.2.4"
+ resolved "https://registry.yarnpkg.com/inspectpack/-/inspectpack-2.2.4.tgz#db783646d89f59133b3087c83f201d44546d0651"
+ dependencies:
+ babel-traverse "^6.26.0"
+ babel-types "^6.7.2"
+ babylon "^6.7.0"
+ lodash "^4.6.1"
+ uglify-es "^3.0.28"
+ workerpool "^2.2.1"
+ yargs "^4.3.1"
+ optionalDependencies:
+ better-sqlite3 "^4.0.2"
+ farmhash "^1.2.1"
+
+integer@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/integer/-/integer-1.0.3.tgz#6e6403896de6781c50974c5adf9eea9bb0ce6acb"
+ dependencies:
+ bindings "^1.3.0"
+
internal-ip@1.2.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/internal-ip/-/internal-ip-1.2.0.tgz#ae9fbf93b984878785d50a8de1b356956058cf5c"
@@ -6128,6 +6189,16 @@ js-beautify@^1.6.12, js-beautify@^1.6.14:
mkdirp "~0.5.0"
nopt "~3.0.1"
+js-message@1.0.5:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/js-message/-/js-message-1.0.5.tgz#2300d24b1af08e89dd095bc1a4c9c9cfcb892d15"
+
+js-queue@2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/js-queue/-/js-queue-2.0.0.tgz#362213cf860f468f0125fc6c96abc1742531f948"
+ dependencies:
+ easy-stack "^1.0.0"
+
js-tokens@^3.0.0, js-tokens@^3.0.2:
version "3.0.2"
resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b"
@@ -6712,6 +6783,10 @@ lodash.endswith@^4.2.1:
version "4.2.1"
resolved "https://registry.yarnpkg.com/lodash.endswith/-/lodash.endswith-4.2.1.tgz#fed59ac1738ed3e236edd7064ec456448b37bc09"
+lodash.flatten@^4.4.0:
+ version "4.4.0"
+ resolved "https://registry.yarnpkg.com/lodash.flatten/-/lodash.flatten-4.4.0.tgz#f31c22225a9632d2bbf8e4addbef240aa765a61f"
+
lodash.get@^3.7.0:
version "3.7.0"
resolved "https://registry.yarnpkg.com/lodash.get/-/lodash.get-3.7.0.tgz#3ce68ae2c91683b281cc5394128303cbf75e691f"
@@ -6812,7 +6887,7 @@ lodash.uniq@^4.5.0:
version "4.5.0"
resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773"
-lodash@4, lodash@4.x, lodash@^4.13.1, lodash@^4.14.0, lodash@^4.17.2, lodash@^4.17.3, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.2.0, lodash@^4.2.1, lodash@^4.3.0:
+lodash@4, lodash@4.x, lodash@^4.13.1, lodash@^4.14.0, lodash@^4.17.2, lodash@^4.17.3, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.2.0, lodash@^4.2.1, lodash@^4.3.0, lodash@^4.6.1:
version "4.17.5"
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.5.tgz#99a92d65c0272debe8c96b6057bc8fbfa3bed511"
@@ -6902,6 +6977,10 @@ lru-cache@~2.6.5:
version "2.6.5"
resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-2.6.5.tgz#e56d6354148ede8d7707b58d143220fd08df0fd5"
+lzz-gyp@^0.4.2:
+ version "0.4.2"
+ resolved "https://registry.yarnpkg.com/lzz-gyp/-/lzz-gyp-0.4.2.tgz#495c44034a1f50c48a60f0ef9c28d42763a5b297"
+
macaddress@^0.2.8:
version "0.2.8"
resolved "https://registry.yarnpkg.com/macaddress/-/macaddress-0.2.8.tgz#5904dc537c39ec6dbefeae902327135fa8511f12"
@@ -7271,6 +7350,14 @@ moment@^2.6.0:
version "2.21.0"
resolved "https://registry.yarnpkg.com/moment/-/moment-2.21.0.tgz#2a114b51d2a6ec9e6d83cf803f838a878d8a023a"
+most@^1.7.3:
+ version "1.7.3"
+ resolved "https://registry.yarnpkg.com/most/-/most-1.7.3.tgz#406c31a66d73aa16957816fdf96965e27df84f1a"
+ dependencies:
+ "@most/multicast" "^1.2.5"
+ "@most/prelude" "^1.4.0"
+ symbol-observable "^1.0.2"
+
move-concurrently@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/move-concurrently/-/move-concurrently-1.0.1.tgz#be2c005fda32e0b29af1f05d7c4b33214c701f92"
@@ -7318,6 +7405,10 @@ nan@^2.3.0:
version "2.9.2"
resolved "https://registry.yarnpkg.com/nan/-/nan-2.9.2.tgz#f564d75f5f8f36a6d9456cca7a6c4fe488ab7866"
+nan@^2.4.0:
+ version "2.10.0"
+ resolved "https://registry.yarnpkg.com/nan/-/nan-2.10.0.tgz#96d0cd610ebd58d4b4de9cc0c6828cda99c7548f"
+
nanomatch@^1.2.9:
version "1.2.9"
resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.9.tgz#879f7150cb2dab7a471259066c104eee6e0fa7c2"
@@ -7397,6 +7488,14 @@ node-int64@^0.4.0:
version "0.4.0"
resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b"
+node-ipc@^9.1.1:
+ version "9.1.1"
+ resolved "https://registry.yarnpkg.com/node-ipc/-/node-ipc-9.1.1.tgz#4e245ed6938e65100e595ebc5dc34b16e8dd5d69"
+ dependencies:
+ event-pubsub "4.3.0"
+ js-message "1.0.5"
+ js-queue "2.0.0"
+
"node-libs-browser@^1.0.0 || ^2.0.0", node-libs-browser@^2.0.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.1.0.tgz#5f94263d404f6e44767d726901fff05478d600df"
@@ -7578,7 +7677,7 @@ oauth-sign@~0.8.1, oauth-sign@~0.8.2:
version "0.8.2"
resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43"
-object-assign@^4, object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1:
+object-assign@4.1.1, object-assign@^4, object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1:
version "4.1.1"
resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863"
@@ -10233,7 +10332,7 @@ typescript@^2.7.2:
version "2.7.2"
resolved "https://registry.yarnpkg.com/typescript/-/typescript-2.7.2.tgz#2d615a1ef4aee4f574425cdff7026edf81919836"
-uglify-es@^3.3.4:
+uglify-es@^3.0.28, uglify-es@^3.3.4:
version "3.3.9"
resolved "https://registry.yarnpkg.com/uglify-es/-/uglify-es-3.3.9.tgz#0c1c4f0700bed8dbc124cdb304d2592ca203e677"
dependencies:
@@ -10688,6 +10787,10 @@ vue-parser@^1.1.5:
dependencies:
parse5 "^3.0.3"
+vue-progress-path@^0.0.2:
+ version "0.0.2"
+ resolved "https://registry.yarnpkg.com/vue-progress-path/-/vue-progress-path-0.0.2.tgz#d780fc7a96dbc7f784eb52895aeef7a5f0af6325"
+
vue-property-decorator@^6.0.0:
version "6.0.0"
resolved "https://registry.yarnpkg.com/vue-property-decorator/-/vue-property-decorator-6.0.0.tgz#bb651b293542e31db0d24f36f4b0250ef08d8515"
@@ -11052,6 +11155,12 @@ worker-farm@^1.5.2:
errno "~0.1.7"
xtend "~4.0.1"
+workerpool@^2.2.1:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-2.3.0.tgz#86c5cbe946b55e7dc9d12b1936c8801a6e2d744d"
+ dependencies:
+ object-assign "4.1.1"
+
wrap-ansi@^2.0.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85"
@@ -11246,7 +11355,7 @@ yargs@^11.0.0:
y18n "^3.2.1"
yargs-parser "^9.0.2"
-yargs@^4.8.0:
+yargs@^4.3.1, yargs@^4.8.0:
version "4.8.1"
resolved "https://registry.yarnpkg.com/yargs/-/yargs-4.8.1.tgz#c0c42924ca4aaa6b0e6da1739dfb216439f9ddc0"
dependencies: