diff --git a/packages/@vue/cli-ui/src/App.vue b/packages/@vue/cli-ui/src/App.vue index 853451498..7de07d67a 100644 --- a/packages/@vue/cli-ui/src/App.vue +++ b/packages/@vue/cli-ui/src/App.vue @@ -1,32 +1,5 @@ - - diff --git a/packages/@vue/cli-ui/src/graphql-api/channels.js b/packages/@vue/cli-ui/src/graphql-api/channels.js new file mode 100644 index 000000000..2921ae135 --- /dev/null +++ b/packages/@vue/cli-ui/src/graphql-api/channels.js @@ -0,0 +1,3 @@ +module.exports = { + CWD_CHANGED: 'cwd_changed' +} diff --git a/packages/@vue/cli-ui/src/graphql-api/connectors/cwd.js b/packages/@vue/cli-ui/src/graphql-api/connectors/cwd.js new file mode 100644 index 000000000..bb3c2a963 --- /dev/null +++ b/packages/@vue/cli-ui/src/graphql-api/connectors/cwd.js @@ -0,0 +1,11 @@ +const channels = require('../channels') + +let cwd = process.cwd() + +module.exports = { + get: () => cwd, + set: (value, context) => { + cwd = value + context.pubsub.publish(channels.CWD_CHANGED, { cwdChanged: value }) + } +} diff --git a/packages/@vue/cli-ui/src/graphql-api/connectors/folders.js b/packages/@vue/cli-ui/src/graphql-api/connectors/folders.js new file mode 100644 index 000000000..0cb37dbae --- /dev/null +++ b/packages/@vue/cli-ui/src/graphql-api/connectors/folders.js @@ -0,0 +1,53 @@ +const path = require('path') +const fs = require('fs') + +const cwd = require('./cwd') + +function list (base, context) { + return new Promise((resolve, reject) => { + fs.readdir(base, 'utf8', (err, files) => { + if (err) { + reject(err) + } else { + resolve(files.map( + file => ({ + path: path.join(base, file), + name: file + }) + ).filter( + file => fs.statSync(file.path).isDirectory() + )) + } + }) + }) +} + +function generateFolder (file) { + return { + name: path.basename(file), + path: file + } +} + +function getCurrent (args, context) { + const base = cwd.get() + return generateFolder(base) +} + +function open (file, context) { + cwd.set(file, context) + return generateFolder(file) +} + +function openParent (file, context) { + const newFile = path.dirname(file) + cwd.set(newFile, context) + return generateFolder(newFile) +} + +module.exports = { + getCurrent, + list, + open, + openParent +} diff --git a/packages/@vue/cli-ui/src/graphql-api/context.js b/packages/@vue/cli-ui/src/graphql-api/context.js index 5c3cf13ef..b586ab691 100644 --- a/packages/@vue/cli-ui/src/graphql-api/context.js +++ b/packages/@vue/cli-ui/src/graphql-api/context.js @@ -1,11 +1,9 @@ const { db } = require('./utils/db') -const { processUpload } = require('./utils/upload') // Context passed to all resolvers (third argument) // eslint-disable-next-line no-unused-vars module.exports = req => { return { - db, - processUpload + db } } diff --git a/packages/@vue/cli-ui/src/graphql-api/resolvers.js b/packages/@vue/cli-ui/src/graphql-api/resolvers.js index ca157ea4b..b32d937d1 100644 --- a/packages/@vue/cli-ui/src/graphql-api/resolvers.js +++ b/packages/@vue/cli-ui/src/graphql-api/resolvers.js @@ -1,56 +1,25 @@ -const shortid = require('shortid') +const channels = require('./channels') +const cwd = require('./connectors/cwd') +const folders = require('./connectors/folders') module.exports = { - Counter: { - countStr: counter => `Current count: ${counter.count}` + Folder: { + children: (folder, args, context) => folders.list(folder.path, context) }, Query: { - hello: (root, { name }) => `Hello ${name || 'World'}!`, - messages: (root, args, { db }) => db.get('messages').value(), - uploads: (root, args, { db }) => db.get('uploads').value() + cwd: () => cwd.get(), + folderCurrent: (root, args, context) => folders.getCurrent(args, context) }, Mutation: { - messageAdd: (root, { input }, { pubsub, db }) => { - const message = { - id: shortid.generate(), - text: input.text - } - - db - .get('messages') - .push(message) - .last() - .write() - - pubsub.publish('messages', { messageAdded: message }) - - return message - }, - - singleUpload: (root, { file }, { processUpload }) => processUpload(file), - multipleUpload: (root, { files }, { processUpload }) => Promise.all(files.map(processUpload)) + folderOpen: (root, { path }, context) => folders.open(path, context), + folderOpenParent: (root, args, context) => folders.openParent(cwd.get(), context) }, Subscription: { - counter: { - subscribe: (parent, args, { pubsub }) => { - const channel = Math.random().toString(36).substring(2, 15) // random channel name - let count = 0 - setInterval(() => pubsub.publish( - channel, - { - // eslint-disable-next-line no-plusplus - counter: { count: count++ } - } - ), 2000) - return pubsub.asyncIterator(channel) - } - }, - - messageAdded: { - subscribe: (parent, args, { pubsub }) => pubsub.asyncIterator('messages') + cwdChanged: { + subscribe: (parent, args, { pubsub }) => pubsub.asyncIterator(channels.CWD_CHANGED) } } } 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 a5f3021b1..9adc53e8f 100644 --- a/packages/@vue/cli-ui/src/graphql-api/type-defs.js +++ b/packages/@vue/cli-ui/src/graphql-api/type-defs.js @@ -1,54 +1,134 @@ module.exports = ` -# It will increment! -type Counter { - # Number of increments - count: Int! - # Full message for testing - countStr: String -} -# A text message send by users -type Message { +type ConsoleLog { id: ID! - # Message content - text: String! + message: String! + label: String + tag: String + type: ConsoleLogType! } -# Input from user to create a message -input MessageInput { - # Message content - text: String! +enum ConsoleLogType { + log + warn + error + info + done } -scalar Upload - -type File { - id: ID! +type Folder { + name: String! path: String! - filename: String! - mimetype: String! - encoding: String! + children: [Folder] +} + +type Project { + id: ID! + name: String! + path: String! + favorite: Int + features: [Feature] + plugins: [Plugin] +} + +input ProjectCreateInput { + path: String! +} + +input ProjectImportInput { + path: String! +} + +type Version { + current: String! + latest: String +} + +type GitHubStats { + stars: Int +} + +type Plugin { + id: ID! + version: Version! + official: Boolean + installed: Boolean + website: String + description: String + githubStats: GitHubStats + prompts: [Prompt] +} + +input PluginSearchInput { + terms: String! +} + +type Feature { + id: ID! + label: String! + description: String! + link: String! + enabled: Boolean! +} + +enum PromptType { + input + confirm + list + rawlist + expand + checkbox + password + editor +} + +type PromptChoice { + value: String! +} + +type PromptError { + message: String! + link: String +} + +type Prompt { + id: ID! + enabled: Boolean! + type: PromptType! + name: String + message: String + description: String + link: String + choices: [PromptChoice] + currentValue: String + error: PromptError +} + +input PromptInput { + id: ID! + value: String! } type Query { - # Test query with a parameter - hello(name: String): String! - # List of messages sent by users - messages: [Message] - uploads: [File] + cwd: String! + folderCurrent: Folder + projects: [Project] + projectCurrent: Project + pluginSearch (input: PluginSearchInput!): [Plugin] } type Mutation { - # Add a message and publish it on 'messages' subscription channel - messageAdd (input: MessageInput!): Message! - singleUpload (file: Upload!): File! - multipleUpload (files: [Upload!]!): [File!]! + folderOpen (path: String!): Folder + folderOpenParent: Folder + projectCreate (input: ProjectCreateInput!): Project! + projectImport (input: ProjectImportInput!): Project! + projectSetFavorite (id: ID!, favorite: Int!): Project! + pluginAdd (id: ID!): Plugin + promptAnswer (input: PromptInput!): Prompt } type Subscription { - # This will update every 2 seconds - counter: Counter! - # When a new message is added - messageAdded: Message! + consoleLogAdded: ConsoleLog! + cwdChanged: String! } ` diff --git a/packages/@vue/cli-ui/src/graphql-api/utils/db.js b/packages/@vue/cli-ui/src/graphql-api/utils/db.js index f73db6bc9..565aa236b 100644 --- a/packages/@vue/cli-ui/src/graphql-api/utils/db.js +++ b/packages/@vue/cli-ui/src/graphql-api/utils/db.js @@ -9,8 +9,7 @@ const db = new Lowdb(new FileSync(resolve(__dirname, '../../../live/db.json'))) // Seed an empty DB db.defaults({ - messages: [], - uploads: [] + projects: [] }).write() module.exports = { diff --git a/packages/@vue/cli-ui/src/graphql-api/utils/upload.js b/packages/@vue/cli-ui/src/graphql-api/utils/upload.js deleted file mode 100644 index d50b39535..000000000 --- a/packages/@vue/cli-ui/src/graphql-api/utils/upload.js +++ /dev/null @@ -1,38 +0,0 @@ -const { createWriteStream } = require('fs') -const mkdirp = require('mkdirp') -const shortid = require('shortid') -const { db } = require('./db') - -const uploadDir = require('path').resolve(__dirname, '../../../live/uploads') - -// Ensure upload directory exists -mkdirp.sync(uploadDir) - -const storeUpload = async ({ stream, filename }) => { - const id = shortid.generate() - const path = `${uploadDir}/${id}-${filename}` - - return new Promise((resolve, reject) => - stream - .pipe(createWriteStream(path)) - .on('finish', () => resolve({ id, path })) - .on('error', reject) - ) -} - -const recordFile = file => - db - .get('uploads') - .push(file) - .last() - .write() - -const processUpload = async upload => { - const { stream, filename, mimetype, encoding } = await upload - const { id, path } = await storeUpload({ stream, filename }) - return recordFile({ id, filename, mimetype, encoding, path }) -} - -module.exports = { - processUpload -} diff --git a/packages/@vue/cli-ui/src/graphql/HelloWorld.gql b/packages/@vue/cli-ui/src/graphql/HelloWorld.gql deleted file mode 100644 index 99710ba61..000000000 --- a/packages/@vue/cli-ui/src/graphql/HelloWorld.gql +++ /dev/null @@ -1,3 +0,0 @@ -query HelloWorld ($name: String) { - hello (name: $name) -} diff --git a/packages/@vue/cli-ui/src/graphql/MessageAdd.gql b/packages/@vue/cli-ui/src/graphql/MessageAdd.gql deleted file mode 100644 index abc8bcfc0..000000000 --- a/packages/@vue/cli-ui/src/graphql/MessageAdd.gql +++ /dev/null @@ -1,7 +0,0 @@ -#import "./MessageFragment.gql" - -mutation messageAdd ($input: MessageInput!) { - messageAdd (input: $input) { - ...Message - } -} diff --git a/packages/@vue/cli-ui/src/graphql/MessageAdded.gql b/packages/@vue/cli-ui/src/graphql/MessageAdded.gql deleted file mode 100644 index 138e45ef6..000000000 --- a/packages/@vue/cli-ui/src/graphql/MessageAdded.gql +++ /dev/null @@ -1,7 +0,0 @@ -#import "./MessageFragment.gql" - -subscription messageAdded { - messageAdded { - ...Message - } -} diff --git a/packages/@vue/cli-ui/src/graphql/MessageFragment.gql b/packages/@vue/cli-ui/src/graphql/MessageFragment.gql deleted file mode 100644 index 4a937ed71..000000000 --- a/packages/@vue/cli-ui/src/graphql/MessageFragment.gql +++ /dev/null @@ -1,4 +0,0 @@ -fragment Message on Message { - id - text -} diff --git a/packages/@vue/cli-ui/src/graphql/Messages.gql b/packages/@vue/cli-ui/src/graphql/Messages.gql deleted file mode 100644 index e2b31c806..000000000 --- a/packages/@vue/cli-ui/src/graphql/Messages.gql +++ /dev/null @@ -1,7 +0,0 @@ -#import "./MessageFragment.gql" - -query messages { - messages { - ...Message - } -} diff --git a/packages/@vue/cli-ui/src/views/About.vue b/packages/@vue/cli-ui/src/views/About.vue index 3fa28070d..40e27c7ab 100644 --- a/packages/@vue/cli-ui/src/views/About.vue +++ b/packages/@vue/cli-ui/src/views/About.vue @@ -1,5 +1,5 @@ diff --git a/packages/@vue/cli-ui/src/views/Home.vue b/packages/@vue/cli-ui/src/views/Home.vue index b2265ec8e..c49bdc894 100644 --- a/packages/@vue/cli-ui/src/views/Home.vue +++ b/packages/@vue/cli-ui/src/views/Home.vue @@ -1,18 +1,11 @@