From 803005b4db0c43dfab5be08085c8396f86041d5f Mon Sep 17 00:00:00 2001 From: shmck Date: Sat, 16 Nov 2019 13:43:32 -0800 Subject: [PATCH 1/6] restructure order of setup --- src/actions/setupActions.ts | 125 +++++++++++++++--------------------- 1 file changed, 53 insertions(+), 72 deletions(-) diff --git a/src/actions/setupActions.ts b/src/actions/setupActions.ts index 760d6d7c..a3865cb8 100644 --- a/src/actions/setupActions.ts +++ b/src/actions/setupActions.ts @@ -4,33 +4,11 @@ import * as vscode from 'vscode' import * as git from '../services/git' import node from '../services/node' -// interface ErrorMessageFilter { -// [lang: string]: { -// [key: string]: string -// } -// } - -// TODO: should be loaded on startup based on language -// const commandErrorMessageFilter: ErrorMessageFilter = { -// JAVASCRIPT: { -// 'node-gyp': 'Error running npm setup command' -// } -// } - -// TODO: pass command and command name down for filtering. Eg. JAVASCRIPT, 'npm install' const runCommands = async (commands: string[]) => { for (const command of commands) { const { stdout, stderr } = await node.exec(command) if (stderr) { console.error(stderr) - // language specific error messages from running commands - // const filteredMessages = Object.keys(commandErrorMessageFilter[language]) - // for (const message of filteredMessages) { - // if (stderr.match(message)) { - // // ignored error - // throw new Error('Error running setup command') - // } - // } } console.log(`run command: ${command}`, stdout) } @@ -44,64 +22,52 @@ const disposeWatcher = (listener: string) => { delete watchers[listener] } -const setupActions = async (workspaceRoot: vscode.WorkspaceFolder, actions: G.StepActions): Promise => { - const { commands, commits, files, listeners } = actions - // run commits - if (commits) { - for (const commit of commits) { - await git.loadCommit(commit) - } - } - - // run file watchers (listeners) - if (listeners) { - console.log('listeners') - for (const listener of listeners) { - if (!watchers[listener]) { - const rootUri = vscode.workspace.getWorkspaceFolder(workspaceRoot.uri) - const pattern = new vscode.RelativePattern(rootUri!, listener) // eslint-disable-line - console.log(pattern) - const listen = vscode.workspace.createFileSystemWatcher(pattern) - watchers[listener] = listen - watchers[listener].onDidChange(() => { - console.log('onDidChange') - // trigger save - vscode.commands.executeCommand('coderoad.run_test', null, () => { - // cleanup watcher on success - disposeWatcher(listener) - }) +const loadListeners = (listeners: string[], workspaceUri: vscode.Uri) => { + for (const listener of listeners) { + if (!watchers[listener]) { + const rootUri = vscode.workspace.getWorkspaceFolder(workspaceUri) + const pattern = new vscode.RelativePattern(rootUri!, listener) // eslint-disable-line + console.log(pattern) + const listen = vscode.workspace.createFileSystemWatcher(pattern) + watchers[listener] = listen + watchers[listener].onDidChange(() => { + console.log('onDidChange') + // trigger save + vscode.commands.executeCommand('coderoad.run_test', null, () => { + // cleanup watcher on success + disposeWatcher(listener) }) - watchers[listener].onDidCreate(() => { - console.log('onDidCreate') - // trigger save - vscode.commands.executeCommand('coderoad.run_test', null, () => { - // cleanup watcher on success - disposeWatcher(listener) - }) + }) + watchers[listener].onDidCreate(() => { + console.log('onDidCreate') + // trigger save + vscode.commands.executeCommand('coderoad.run_test', null, () => { + // cleanup watcher on success + disposeWatcher(listener) }) - watchers[listener].onDidDelete(() => { - console.log('onDidDelete') - // trigger save - vscode.commands.executeCommand('coderoad.run_test', null, () => { - // cleanup watcher on success - disposeWatcher(listener) - }) + }) + watchers[listener].onDidDelete(() => { + console.log('onDidDelete') + // trigger save + vscode.commands.executeCommand('coderoad.run_test', null, () => { + // cleanup watcher on success + disposeWatcher(listener) }) - } - } - } else { - // remove all watchers - for (const listener of Object.keys(watchers)) { - disposeWatcher(listener) + }) } } +} - // run command - if (commands) { - await runCommands(commands) +const setupActions = async (workspaceRoot: vscode.WorkspaceFolder, actions: G.StepActions): Promise => { + const { commands, commits, files, listeners } = actions + // 1. run commits + if (commits) { + for (const commit of commits) { + await git.loadCommit(commit) + } } - // open files + // 2. open files if (files) { for (const filePath of files) { try { @@ -131,6 +97,21 @@ const setupActions = async (workspaceRoot: vscode.WorkspaceFolder, actions: G.St } } } + + // 3. start file watchers (listeners) + if (listeners) { + loadListeners(listeners, workspaceRoot.uri) + } else { + // remove all watchers + for (const listener of Object.keys(watchers)) { + disposeWatcher(listener) + } + } + + // 4. run command + if (commands) { + await runCommands(commands) + } } export default setupActions From 832aa8b3635db279edda888b6ecdf361811a3791 Mon Sep 17 00:00:00 2001 From: shmck Date: Sat, 16 Nov 2019 14:35:32 -0800 Subject: [PATCH 2/6] refactor commands and actions --- src/actions/setupActions.ts | 95 ++++-------------------------- src/actions/tutorialConfig.ts | 2 +- src/actions/utils/loadListeners.ts | 54 +++++++++++++++++ src/actions/utils/openFiles.ts | 38 ++++++++++++ src/channel/index.ts | 5 +- 5 files changed, 106 insertions(+), 88 deletions(-) create mode 100644 src/actions/utils/loadListeners.ts create mode 100644 src/actions/utils/openFiles.ts diff --git a/src/actions/setupActions.ts b/src/actions/setupActions.ts index a3865cb8..74de14da 100644 --- a/src/actions/setupActions.ts +++ b/src/actions/setupActions.ts @@ -1,10 +1,15 @@ import * as G from 'typings/graphql' -import { join } from 'path' import * as vscode from 'vscode' import * as git from '../services/git' import node from '../services/node' +import openFiles from './utils/openFiles' +import loadListeners from './utils/loadListeners' + const runCommands = async (commands: string[]) => { + if (!commands.length) { + return + } for (const command of commands) { const { stdout, stderr } = await node.exec(command) if (stderr) { @@ -14,52 +19,9 @@ const runCommands = async (commands: string[]) => { } } -// collect active file watchers (listeners) -const watchers: { [key: string]: vscode.FileSystemWatcher } = {} - -const disposeWatcher = (listener: string) => { - watchers[listener].dispose() - delete watchers[listener] -} - -const loadListeners = (listeners: string[], workspaceUri: vscode.Uri) => { - for (const listener of listeners) { - if (!watchers[listener]) { - const rootUri = vscode.workspace.getWorkspaceFolder(workspaceUri) - const pattern = new vscode.RelativePattern(rootUri!, listener) // eslint-disable-line - console.log(pattern) - const listen = vscode.workspace.createFileSystemWatcher(pattern) - watchers[listener] = listen - watchers[listener].onDidChange(() => { - console.log('onDidChange') - // trigger save - vscode.commands.executeCommand('coderoad.run_test', null, () => { - // cleanup watcher on success - disposeWatcher(listener) - }) - }) - watchers[listener].onDidCreate(() => { - console.log('onDidCreate') - // trigger save - vscode.commands.executeCommand('coderoad.run_test', null, () => { - // cleanup watcher on success - disposeWatcher(listener) - }) - }) - watchers[listener].onDidDelete(() => { - console.log('onDidDelete') - // trigger save - vscode.commands.executeCommand('coderoad.run_test', null, () => { - // cleanup watcher on success - disposeWatcher(listener) - }) - }) - } - } -} - const setupActions = async (workspaceRoot: vscode.WorkspaceFolder, actions: G.StepActions): Promise => { const { commands, commits, files, listeners } = actions + // 1. run commits if (commits) { for (const commit of commits) { @@ -68,50 +30,13 @@ const setupActions = async (workspaceRoot: vscode.WorkspaceFolder, actions: G.St } // 2. open files - if (files) { - for (const filePath of files) { - try { - // TODO: figure out why this does not work - // try { - // const absoluteFilePath = join(workspaceRoot.uri.path, filePath) - // const doc = await vscode.workspace.openTextDocument(absoluteFilePath) - // await vscode.window.showTextDocument(doc, vscode.ViewColumn.One) - // // there are times when initialization leave the panel behind any files opened - // // ensure the panel is redrawn on the right side first - // // webview.createOrShow() - // } catch (error) { - // console.log(`Failed to open file ${filePath}`, error) - // } - const wr = vscode.workspace.rootPath - if (!wr) { - throw new Error('No workspace root path') - } - const absoluteFilePath = join(wr, filePath) - const doc = await vscode.workspace.openTextDocument(absoluteFilePath) - await vscode.window.showTextDocument(doc, vscode.ViewColumn.One) - // there are times when initialization leave the panel behind any files opened - // ensure the panel is redrawn on the right side first - vscode.commands.executeCommand('coderoad.open_webview') - } catch (error) { - console.log(`Failed to open file ${filePath}`, error) - } - } - } + openFiles(files || []) // 3. start file watchers (listeners) - if (listeners) { - loadListeners(listeners, workspaceRoot.uri) - } else { - // remove all watchers - for (const listener of Object.keys(watchers)) { - disposeWatcher(listener) - } - } + loadListeners(listeners || [], workspaceRoot.uri) // 4. run command - if (commands) { - await runCommands(commands) - } + await runCommands(commands || []) } export default setupActions diff --git a/src/actions/tutorialConfig.ts b/src/actions/tutorialConfig.ts index c0040d70..8ffc0827 100644 --- a/src/actions/tutorialConfig.ts +++ b/src/actions/tutorialConfig.ts @@ -42,7 +42,7 @@ const tutorialConfig = async ({ config, alreadyConfigured }: TutorialConfigParam // setup onSave hook vscode.workspace.onDidSaveTextDocument((document: vscode.TextDocument) => { if (shouldRunTest(document)) { - vscode.commands.executeCommand('coderoad.run_test') + vscode.commands.executeCommand(COMMANDS.RUN_TEST) } }) } diff --git a/src/actions/utils/loadListeners.ts b/src/actions/utils/loadListeners.ts new file mode 100644 index 00000000..ae074835 --- /dev/null +++ b/src/actions/utils/loadListeners.ts @@ -0,0 +1,54 @@ +import * as vscode from 'vscode' +import { COMMANDS } from '../../editor/commands' + +// collect active file watchers (listeners) +const watchers: { [key: string]: vscode.FileSystemWatcher } = {} + +const disposeWatcher = (listener: string) => { + watchers[listener].dispose() + delete watchers[listener] +} + +const loadListeners = (listeners: string[], workspaceUri: vscode.Uri) => { + if (!listeners.length) { + // remove all watchers + for (const listener of Object.keys(watchers)) { + disposeWatcher(listener) + } + } + for (const listener of listeners) { + if (!watchers[listener]) { + // const rootUri = vscode.workspace.getWorkspaceFolder(workspaceUri) + // const pattern = listener // eslin + // console.log(pattern) + const listen = vscode.workspace.createFileSystemWatcher('**/*.js') + listen.onDidChange(() => { + console.log('onDidChange') + // trigger save + vscode.commands.executeCommand(COMMANDS.RUN_TEST, null, () => { + // cleanup watcher on success + disposeWatcher(listener) + }) + }) + listen.onDidCreate(() => { + console.log('onDidCreate') + // trigger save + vscode.commands.executeCommand(COMMANDS.RUN_TEST, null, () => { + // cleanup watcher on success + disposeWatcher(listener) + }) + }) + listen.onDidDelete(() => { + console.log('onDidDelete') + // trigger save + vscode.commands.executeCommand(COMMANDS.RUN_TEST, null, () => { + // cleanup watcher on success + disposeWatcher(listener) + }) + }) + watchers[listener] = listen + } + } +} + +export default loadListeners diff --git a/src/actions/utils/openFiles.ts b/src/actions/utils/openFiles.ts new file mode 100644 index 00000000..011aa596 --- /dev/null +++ b/src/actions/utils/openFiles.ts @@ -0,0 +1,38 @@ +import { join } from 'path' +import * as vscode from 'vscode' +import { COMMANDS } from '../../editor/commands' + +const openFiles = async (files: string[]) => { + if (!files.length) { + return + } + for (const filePath of files) { + try { + // TODO: figure out why this does not work + // try { + // const absoluteFilePath = join(workspaceRoot.uri.path, filePath) + // const doc = await vscode.workspace.openTextDocument(absoluteFilePath) + // await vscode.window.showTextDocument(doc, vscode.ViewColumn.One) + // // there are times when initialization leave the panel behind any files opened + // // ensure the panel is redrawn on the right side first + // // webview.createOrShow() + // } catch (error) { + // console.log(`Failed to open file ${filePath}`, error) + // } + const wr = vscode.workspace.rootPath + if (!wr) { + throw new Error('No workspace root path') + } + const absoluteFilePath = join(wr, filePath) + const doc = await vscode.workspace.openTextDocument(absoluteFilePath) + await vscode.window.showTextDocument(doc, vscode.ViewColumn.One) + // there are times when initialization leave the panel behind any files opened + // ensure the panel is redrawn on the right side first + vscode.commands.executeCommand(COMMANDS.OPEN_WEBVIEW) + } catch (error) { + console.log(`Failed to open file ${filePath}`, error) + } + } +} + +export default openFiles diff --git a/src/channel/index.ts b/src/channel/index.ts index c4addb03..7864cf71 100644 --- a/src/channel/index.ts +++ b/src/channel/index.ts @@ -7,6 +7,7 @@ import tutorialConfig from '../actions/tutorialConfig' import setupActions from '../actions/setupActions' import solutionActions from '../actions/solutionActions' import saveCommit from '../actions/saveCommit' +import { COMMANDS } from '../editor/commands' interface Channel { receive(action: CR.Action): Promise @@ -117,14 +118,14 @@ class Channel implements Channel { return // load step actions (git commits, commands, open files) case 'SETUP_ACTIONS': - vscode.commands.executeCommand('coderoad.set_current_step', action.payload) + vscode.commands.executeCommand(COMMANDS.SET_CURRENT_STEP, action.payload) setupActions(this.workspaceRoot, action.payload) return // load solution step actions (git commits, commands, open files) case 'SOLUTION_ACTIONS': await solutionActions(this.workspaceRoot, action.payload) // run test following solution to update position - vscode.commands.executeCommand('coderoad.run_test', action.payload) + vscode.commands.executeCommand(COMMANDS.RUN_TEST, action.payload) return default: From 2024b7d54e6c849f9b7d7b79c27a3201a1cc7448 Mon Sep 17 00:00:00 2001 From: shmck Date: Sat, 16 Nov 2019 15:55:52 -0800 Subject: [PATCH 3/6] hide unused --- .vscode/settings.json | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index 7992cb51..b80cab66 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -15,5 +15,9 @@ "titleBar.activeBackground": "#000000", "titleBar.activeForeground": "#FFFFFF" }, - "cSpell.ignoreWords": ["camelcase"] + "cSpell.ignoreWords": ["camelcase"], + "files.exclude": { + ".vscode-test/**": true, + "*.vsix": true + } } From b0774fcbf408adbad6a07cb556a2413d26e9fbdc Mon Sep 17 00:00:00 2001 From: shmck Date: Sat, 16 Nov 2019 15:56:10 -0800 Subject: [PATCH 4/6] working file watchers --- package-lock.json | 141 ++- package.json | 4 +- src/actions/setupActions.ts | 8 +- src/actions/utils/loadListeners.ts | 54 -- src/actions/utils/loadWatchers.ts | 49 + typings/graphql.d.ts | 881 +++++++++--------- web-app/package-lock.json | 12 +- web-app/package.json | 148 +-- .../src/services/apollo/queries/tutorial.ts | 2 +- 9 files changed, 706 insertions(+), 593 deletions(-) delete mode 100644 src/actions/utils/loadListeners.ts create mode 100644 src/actions/utils/loadWatchers.ts diff --git a/package-lock.json b/package-lock.json index 5bfc2f91..57a6dd67 100644 --- a/package-lock.json +++ b/package-lock.json @@ -28,6 +28,7 @@ "version": "24.9.0", "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", + "dev": true, "requires": { "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^1.1.1", @@ -40,6 +41,14 @@ "integrity": "sha512-491hfOvNr0+BGOHT2m36xJ+LK68IuOshvxV0VIrKOnzBDL11WlDa3PwO+drTYkwCdfzJRN9REcDPZVVcrx1ucw==", "dev": true }, + "@types/chokidar": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@types/chokidar/-/chokidar-2.1.3.tgz", + "integrity": "sha512-6qK3xoLLAhQVTucQGHTySwOVA1crHRXnJeLwqK6KIFkkKa2aoMFXh+WEi8PotxDtvN6MQJLyYN9ag9P6NLV81w==", + "requires": { + "chokidar": "*" + } + }, "@types/dotenv": { "version": "8.2.0", "resolved": "https://registry.npmjs.org/@types/dotenv/-/dotenv-8.2.0.tgz", @@ -75,12 +84,14 @@ "@types/istanbul-lib-coverage": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.1.tgz", - "integrity": "sha512-hRJD2ahnnpLgsj6KWMYSrmXkM3rm2Dl1qkx6IOFD5FnuNPXJIG5L0dhgKXCYTRMGzU4n0wImQ/xfmRc4POUFlg==" + "integrity": "sha512-hRJD2ahnnpLgsj6KWMYSrmXkM3rm2Dl1qkx6IOFD5FnuNPXJIG5L0dhgKXCYTRMGzU4n0wImQ/xfmRc4POUFlg==", + "dev": true }, "@types/istanbul-lib-report": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-1.1.1.tgz", "integrity": "sha512-3BUTyMzbZa2DtDI2BkERNC6jJw2Mr2Y0oGI7mRxYNBPxppbtEK1F66u3bKwU2g+wxwWI7PAoRpJnOY1grJqzHg==", + "dev": true, "requires": { "@types/istanbul-lib-coverage": "*" } @@ -89,6 +100,7 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-1.1.1.tgz", "integrity": "sha512-UpYjBi8xefVChsCoBpKShdxTllC9pwISirfoZsUa2AAdQg/Jd2KQGtSbw+ya7GPo7x/wAPlH6JBhKhAsXUEZNA==", + "dev": true, "requires": { "@types/istanbul-lib-coverage": "*", "@types/istanbul-lib-report": "*" @@ -98,6 +110,7 @@ "version": "24.0.23", "resolved": "https://registry.npmjs.org/@types/jest/-/jest-24.0.23.tgz", "integrity": "sha512-L7MBvwfNpe7yVPTXLn32df/EK+AMBFAFvZrRuArGs7npEWnlziUXK+5GMIUTI4NIuwok3XibsjXCs5HxviYXjg==", + "dev": true, "requires": { "jest-diff": "^24.3.0" } @@ -149,6 +162,7 @@ "version": "13.0.3", "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.3.tgz", "integrity": "sha512-K8/LfZq2duW33XW/tFwEAfnZlqIfVsoyRB3kfXdPXYhl0nfM8mmh7GS0jg7WrX2Dgq/0Ha/pR1PaR+BvmWwjiQ==", + "dev": true, "requires": { "@types/yargs-parser": "*" } @@ -156,7 +170,8 @@ "@types/yargs-parser": { "version": "13.1.0", "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-13.1.0.tgz", - "integrity": "sha512-gCubfBUZ6KxzoibJ+SCUc/57Ms1jz5NjHe4+dI2krNmU5zCPAphyLJYyTOg06ueIyfj+SaCUqmzun7ImlxDcKg==" + "integrity": "sha512-gCubfBUZ6KxzoibJ+SCUc/57Ms1jz5NjHe4+dI2krNmU5zCPAphyLJYyTOg06ueIyfj+SaCUqmzun7ImlxDcKg==", + "dev": true }, "@typescript-eslint/eslint-plugin": { "version": "2.7.0", @@ -333,10 +348,20 @@ "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, "requires": { "color-convert": "^1.9.0" } }, + "anymatch": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", + "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, "argparse": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", @@ -416,6 +441,11 @@ "tweetnacl": "^0.14.3" } }, + "binary-extensions": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.0.0.tgz", + "integrity": "sha512-Phlt0plgpIIBOGTT/ehfFnbNlfsDEiqmzE2KRXoX1bLIlir4X/MR+zSyBEkL05ffWgnRSf/DXv+WrUAVr93/ow==" + }, "brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -426,6 +456,14 @@ "concat-map": "0.0.1" } }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "requires": { + "fill-range": "^7.0.1" + } + }, "browser-process-hrtime": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-0.1.3.tgz", @@ -473,6 +511,7 @@ "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, "requires": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -485,6 +524,21 @@ "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", "dev": true }, + "chokidar": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.3.0.tgz", + "integrity": "sha512-dGmKLDdT3Gdl7fBUe8XK+gAtGmzy5Fn0XkkWQuYxGIgWVPPse2CxFA5mtrlD0TOHaHjEUqkWNyP1XdHoJES/4A==", + "requires": { + "anymatch": "~3.1.1", + "braces": "~3.0.2", + "fsevents": "~2.1.1", + "glob-parent": "~5.1.0", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.2.0" + } + }, "cli-cursor": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", @@ -521,6 +575,7 @@ "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, "requires": { "color-name": "1.1.3" } @@ -528,7 +583,8 @@ "color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true }, "combined-stream": { "version": "1.0.8", @@ -689,7 +745,8 @@ "diff-sequences": { "version": "24.9.0", "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-24.9.0.tgz", - "integrity": "sha512-Dj6Wk3tWyTE+Fo1rW8v0Xhwk80um6yFYKbuAxc9c3EZxIHFDYwbi34Uk42u1CdnIiVorvt4RmlSDjIPyzGC2ew==" + "integrity": "sha512-Dj6Wk3tWyTE+Fo1rW8v0Xhwk80um6yFYKbuAxc9c3EZxIHFDYwbi34Uk42u1CdnIiVorvt4RmlSDjIPyzGC2ew==", + "dev": true }, "doctrine": { "version": "3.0.0", @@ -800,7 +857,8 @@ "escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true }, "escodegen": { "version": "1.12.0", @@ -1065,6 +1123,14 @@ "flat-cache": "^2.0.1" } }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "requires": { + "to-regex-range": "^5.0.1" + } + }, "find-up": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", @@ -1132,6 +1198,12 @@ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", "dev": true }, + "fsevents": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.2.tgz", + "integrity": "sha512-R4wDiBwZ0KzpgOWetKDug1FZcYhqYnUYKtfZYt4mD5SBz76q0KR4Q9o7GIPamsVPGmW3EYPPJ0dOOjvx32ldZA==", + "optional": true + }, "function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", @@ -1191,7 +1263,6 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.0.tgz", "integrity": "sha512-qjtRgnIVmOfnKUE3NJAQEdk+lKrxfw8t5ke7SXtfMTHcjsBfOfWXCQfdb30zfDoZQ2IRSIiidmjtbHZPZ++Ihw==", - "dev": true, "requires": { "is-glob": "^4.0.1" } @@ -1243,7 +1314,8 @@ "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true }, "has-symbols": { "version": "1.0.0", @@ -1450,6 +1522,14 @@ "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", "dev": true }, + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "requires": { + "binary-extensions": "^2.0.0" + } + }, "is-buffer": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.4.tgz", @@ -1471,8 +1551,7 @@ "is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" }, "is-fullwidth-code-point": { "version": "2.0.0", @@ -1490,7 +1569,6 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", - "dev": true, "requires": { "is-extglob": "^2.1.1" } @@ -1504,6 +1582,11 @@ "define-properties": "^1.1.1" } }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" + }, "is-promise": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", @@ -1560,6 +1643,7 @@ "version": "24.9.0", "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-24.9.0.tgz", "integrity": "sha512-qMfrTs8AdJE2iqrTp0hzh7kTd2PQWrsFyj9tORoKmu32xjPjeE4NyjVRDz8ybYwqS2ik8N4hsIpiVTyFeo2lBQ==", + "dev": true, "requires": { "chalk": "^2.0.1", "diff-sequences": "^24.9.0", @@ -1570,7 +1654,8 @@ "jest-get-type": { "version": "24.9.0", "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-24.9.0.tgz", - "integrity": "sha512-lUseMzAley4LhIcpSP9Jf+fTrQ4a1yHQwLNeeVa2cEmbCGeoZAtYPOIv8JaxLD/sUpKxetKGP+gsHl8f8TSj8Q==" + "integrity": "sha512-lUseMzAley4LhIcpSP9Jf+fTrQ4a1yHQwLNeeVa2cEmbCGeoZAtYPOIv8JaxLD/sUpKxetKGP+gsHl8f8TSj8Q==", + "dev": true }, "js-tokens": { "version": "4.0.0", @@ -2028,6 +2113,11 @@ "validate-npm-package-license": "^3.0.1" } }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" + }, "npm-run-path": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", @@ -2248,6 +2338,11 @@ "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" }, + "picomatch": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.1.1.tgz", + "integrity": "sha512-OYMyqkKzK7blWO/+XZYP6w8hH0LDvkBvdvKukti+7kqYFCiEAk+gI3DWnryapc0Dau05ugGTy0foQ6mqn4AHYA==" + }, "pify": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", @@ -2283,6 +2378,7 @@ "version": "24.9.0", "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-24.9.0.tgz", "integrity": "sha512-00ZMZUiHaJrNfk33guavqgvfJS30sLYf0f8+Srklv0AMPodGGHcoHgksZ3OThYnIvOd+8yMCn0YiEOogjlgsnA==", + "dev": true, "requires": { "@jest/types": "^24.9.0", "ansi-regex": "^4.0.0", @@ -2293,7 +2389,8 @@ "ansi-regex": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true } } }, @@ -2337,7 +2434,8 @@ "react-is": { "version": "16.12.0", "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.12.0.tgz", - "integrity": "sha512-rPCkf/mWBtKc97aLL9/txD8DZdemK0vkA3JMLShjlJB3Pj3s+lpf1KaBzMfQrAmhMQB0n1cU/SUGgKKBCe837Q==" + "integrity": "sha512-rPCkf/mWBtKc97aLL9/txD8DZdemK0vkA3JMLShjlJB3Pj3s+lpf1KaBzMfQrAmhMQB0n1cU/SUGgKKBCe837Q==", + "dev": true }, "read-pkg": { "version": "4.0.1", @@ -2350,6 +2448,14 @@ "pify": "^3.0.0" } }, + "readdirp": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.2.0.tgz", + "integrity": "sha512-crk4Qu3pmXwgxdSgGhgA/eXiJAPQiX4GMOZZMXnqKxHX7TaoL+3gQVo/WeuAiogr07DpnfjIMpXXa+PAIvwPGQ==", + "requires": { + "picomatch": "^2.0.4" + } + }, "regexpp": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", @@ -2695,6 +2801,7 @@ "version": "5.4.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", + "dev": true, "requires": { "has-flag": "^3.0.0" } @@ -2765,6 +2872,14 @@ "os-tmpdir": "~1.0.2" } }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "requires": { + "is-number": "^7.0.0" + } + }, "tough-cookie": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-3.0.1.tgz", diff --git a/package.json b/package.json index bcefaa67..15c9eea5 100644 --- a/package.json +++ b/package.json @@ -31,13 +31,15 @@ "watch": "tsc -watch -p ./" }, "dependencies": { - "@types/jest": "^24.0.23", + "@types/chokidar": "^2.1.3", + "chokidar": "^3.3.0", "jsdom": "^15.2.1" }, "devDependencies": { "@types/assert": "^1.4.3", "@types/dotenv": "^8.2.0", "@types/glob": "^7.1.1", + "@types/jest": "^24.0.23", "@types/jsdom": "^12.2.4", "@types/node": "^12.12.8", "@typescript-eslint/eslint-plugin": "^2.7.0", diff --git a/src/actions/setupActions.ts b/src/actions/setupActions.ts index 74de14da..d918168a 100644 --- a/src/actions/setupActions.ts +++ b/src/actions/setupActions.ts @@ -4,7 +4,7 @@ import * as git from '../services/git' import node from '../services/node' import openFiles from './utils/openFiles' -import loadListeners from './utils/loadListeners' +import loadWatchers from './utils/loadWatchers' const runCommands = async (commands: string[]) => { if (!commands.length) { @@ -20,7 +20,7 @@ const runCommands = async (commands: string[]) => { } const setupActions = async (workspaceRoot: vscode.WorkspaceFolder, actions: G.StepActions): Promise => { - const { commands, commits, files, listeners } = actions + const { commands, commits, files, watchers } = actions // 1. run commits if (commits) { @@ -32,8 +32,8 @@ const setupActions = async (workspaceRoot: vscode.WorkspaceFolder, actions: G.St // 2. open files openFiles(files || []) - // 3. start file watchers (listeners) - loadListeners(listeners || [], workspaceRoot.uri) + // 3. start file watchers + loadWatchers(watchers || [], workspaceRoot.uri) // 4. run command await runCommands(commands || []) diff --git a/src/actions/utils/loadListeners.ts b/src/actions/utils/loadListeners.ts deleted file mode 100644 index ae074835..00000000 --- a/src/actions/utils/loadListeners.ts +++ /dev/null @@ -1,54 +0,0 @@ -import * as vscode from 'vscode' -import { COMMANDS } from '../../editor/commands' - -// collect active file watchers (listeners) -const watchers: { [key: string]: vscode.FileSystemWatcher } = {} - -const disposeWatcher = (listener: string) => { - watchers[listener].dispose() - delete watchers[listener] -} - -const loadListeners = (listeners: string[], workspaceUri: vscode.Uri) => { - if (!listeners.length) { - // remove all watchers - for (const listener of Object.keys(watchers)) { - disposeWatcher(listener) - } - } - for (const listener of listeners) { - if (!watchers[listener]) { - // const rootUri = vscode.workspace.getWorkspaceFolder(workspaceUri) - // const pattern = listener // eslin - // console.log(pattern) - const listen = vscode.workspace.createFileSystemWatcher('**/*.js') - listen.onDidChange(() => { - console.log('onDidChange') - // trigger save - vscode.commands.executeCommand(COMMANDS.RUN_TEST, null, () => { - // cleanup watcher on success - disposeWatcher(listener) - }) - }) - listen.onDidCreate(() => { - console.log('onDidCreate') - // trigger save - vscode.commands.executeCommand(COMMANDS.RUN_TEST, null, () => { - // cleanup watcher on success - disposeWatcher(listener) - }) - }) - listen.onDidDelete(() => { - console.log('onDidDelete') - // trigger save - vscode.commands.executeCommand(COMMANDS.RUN_TEST, null, () => { - // cleanup watcher on success - disposeWatcher(listener) - }) - }) - watchers[listener] = listen - } - } -} - -export default loadListeners diff --git a/src/actions/utils/loadWatchers.ts b/src/actions/utils/loadWatchers.ts new file mode 100644 index 00000000..59589253 --- /dev/null +++ b/src/actions/utils/loadWatchers.ts @@ -0,0 +1,49 @@ +import * as vscode from 'vscode' +import * as chokidar from 'chokidar' +import { COMMANDS } from '../../editor/commands' + +// NOTE: vscode createFileWatcher doesn't seem to detect changes outside of vscode +// such as `npm install` of a package. Went with chokidar instead + +// collect active file watchers as an object keyed on pattern +const watcherObject: { [key: string]: chokidar.FSWatcher } = {} + +const disposeWatcher = (watcher: string) => { + watcherObject[watcher].close() + delete watcherObject[watcher] +} + +const loadWatchers = (watchers: string[], workspaceUri: vscode.Uri) => { + if (!watchers.length) { + // remove all watchers + for (const watcher of Object.keys(watcherObject)) { + disposeWatcher(watcher) + } + } + for (const watcher of watchers) { + if (!watcherObject[watcher]) { + // see how glob patterns are used in VSCode (not like a regex) + // https://code.visualstudio.com/api/references/vscode-api#GlobPattern + const rootUri = vscode.workspace.getWorkspaceFolder(workspaceUri) + if (!rootUri) { + return + } + + const listener: chokidar.FSWatcher = chokidar.watch(watcher, { + cwd: rootUri.uri.path, + interval: 1000, + }) + + listener.on('change', (path, event) => { + vscode.commands.executeCommand(COMMANDS.RUN_TEST, null, () => { + // cleanup watcher on success + disposeWatcher(watcher) + }) + }) + + watcherObject[watcher] = listener + } + } +} + +export default loadWatchers diff --git a/typings/graphql.d.ts b/typings/graphql.d.ts index 5aaa51ae..58fc3976 100644 --- a/typings/graphql.d.ts +++ b/typings/graphql.d.ts @@ -1,234 +1,234 @@ -import { GraphQLResolveInfo, GraphQLScalarType, GraphQLScalarTypeConfig } from 'graphql' +import {GraphQLResolveInfo, GraphQLScalarType, GraphQLScalarTypeConfig g} from 'graphql' export type Maybe = T | null -export type RequireFields = { [X in Exclude]?: T[X] } & - { [P in K]-?: NonNullable } +export type RequireFields = {[X in Exclude]?: T[X] ] } & + {[P in K]-?: NonNullable ]> } /** All built-in and custom scalars, mapped to their actual values */ export type Scalars = { - ID: string - String: string - Boolean: boolean - Int: number - Float: number - DateTime: any - Sha1: any - JSON: any - JSONObject: any + ID: string + String: string + Boolean: boolean + Int: number + Float: number + DateTime: any + Sha1: any + JSON: any + JSONObject: any } /** Commits from a Git Repo */ export type Commit = { - __typename?: 'Commit' - id: Scalars['Sha1'] - message?: Maybe - username?: Maybe + __typename?: 'Commit' + id: Scalars['Sha1'] + message?: Maybe + username?: Maybe } export type CreateTokenInput = { - accessToken: Scalars['String'] + accessToken: Scalars['String'] } export type CreateTutorialSummaryInput = { - title: Scalars['String'] - description: Scalars['String'] + title: Scalars['String'] + description: Scalars['String'] } export type CreateTutorialVersionInput = { - data: Scalars['JSON'] + data: Scalars['JSON'] } export type CreateTutorialVersionOutput = { - __typename?: 'createTutorialVersionOutput' - success?: Maybe + __typename?: 'createTutorialVersionOutput' + success?: Maybe } export type Editor = 'VSCODE' export type EditorLoginInput = { - editor: Editor - machineId: Scalars['String'] - sessionId: Scalars['String'] + editor: Editor + machineId: Scalars['String'] + sessionId: Scalars['String'] } export type EditorLoginOutput = { - __typename?: 'editorLoginOutput' - user: User - token: Scalars['String'] + __typename?: 'editorLoginOutput' + user: User + token: Scalars['String'] } export type FileFormat = - | 'GO' - | 'JS' - | 'JSON' - | 'JSX' - | 'LESS' - | 'LUA' - | 'PHP' - | 'PY' - | 'RB' - | 'SASS' - | 'SCSS' - | 'SQL' - | 'TS' - | 'TSX' - | 'YAML' + | 'GO' + | 'JS' + | 'JSON' + | 'JSX' + | 'LESS' + | 'LUA' + | 'PHP' + | 'PY' + | 'RB' + | 'SASS' + | 'SCSS' + | 'SQL' + | 'TS' + | 'TSX' + | 'YAML' /** Information linked from a GitHub account */ export type GithubUser = { - __typename?: 'GithubUser' - id: Scalars['ID'] - name?: Maybe - email?: Maybe - location?: Maybe - avatarUrl?: Maybe + __typename?: 'GithubUser' + id: Scalars['ID'] + name?: Maybe + email?: Maybe + location?: Maybe + avatarUrl?: Maybe } /** Logical groupings of tasks */ export type Level = { - __typename?: 'Level' - id: Scalars['ID'] - title: Scalars['String'] - /** A summary of the level */ - description: Scalars['String'] - /** The lesson content of the level, parsed as markdown */ - content: Scalars['String'] - /** A set of tasks for users linked to unit tests */ - steps: Array - /** Actions run on level start up for configuring setup */ - setup?: Maybe + __typename?: 'Level' + id: Scalars['ID'] + title: Scalars['String'] + /** A summary of the level */ + description: Scalars['String'] + /** The lesson content of the level, parsed as markdown */ + content: Scalars['String'] + /** A set of tasks for users linked to unit tests */ + steps: Array + /** Actions run on level start up for configuring setup */ + setup?: Maybe } export type Mutation = { - __typename?: 'Mutation' - /** Login used from a coding editor */ - editorLogin?: Maybe - /** Create a new tutorial */ - createTutorialVersion?: Maybe + __typename?: 'Mutation' + /** Login used from a coding editor */ + editorLogin?: Maybe + /** Create a new tutorial */ + createTutorialVersion?: Maybe } export type MutationEditorLoginArgs = { - input: EditorLoginInput + input: EditorLoginInput } export type MutationCreateTutorialVersionArgs = { - input: CreateTutorialVersionInput + input: CreateTutorialVersionInput } export type Query = { - __typename?: 'Query' - tutorial?: Maybe - tutorials?: Maybe>> - viewer?: Maybe - /** TOOD: move inside of viewer */ - commits: Array> + __typename?: 'Query' + tutorial?: Maybe + tutorials?: Maybe>> + viewer?: Maybe + /** TOOD: move inside of viewer */ + commits: Array> } export type QueryTutorialArgs = { - id: Scalars['ID'] + id: Scalars['ID'] } export type QueryCommitsArgs = { - input: TutorialRepoInput + input: TutorialRepoInput } export type Role = 'ADMIN' | 'EDITOR_USER' /** A level task */ export type Step = { - __typename?: 'Step' - id: Scalars['ID'] - content: Scalars['String'] - setup: StepActions - solution: StepActions + __typename?: 'Step' + id: Scalars['ID'] + content: Scalars['String'] + setup: StepActions + solution: StepActions } /** Load commits, open files or run commands */ export type StepActions = { - __typename?: 'StepActions' - id: Scalars['ID'] - commits: Array - files?: Maybe> - commands?: Maybe> - listeners?: Maybe> + __typename?: 'StepActions' + id: Scalars['ID'] + commits: Array + files?: Maybe> + commands?: Maybe> + watchers?: Maybe> } /** A tutorial for use in VSCode CodeRoad */ export type Tutorial = { - __typename?: 'Tutorial' - id: Scalars['ID'] - createdBy: User - createdAt: Scalars['DateTime'] - version: TutorialVersion - versions: Array - completed?: Maybe + __typename?: 'Tutorial' + id: Scalars['ID'] + createdBy: User + createdAt: Scalars['DateTime'] + version: TutorialVersion + versions: Array + completed?: Maybe } /** A tutorial for use in VSCode CodeRoad */ export type TutorialVersionArgs = { - version?: Maybe + version?: Maybe } /** Configure environment in editor for git, testing & parsing files */ export type TutorialConfig = { - __typename?: 'TutorialConfig' - testRunner: TutorialTestRunner - repo: TutorialRepo + __typename?: 'TutorialConfig' + testRunner: TutorialTestRunner + repo: TutorialRepo } /** Data for tutorial */ export type TutorialData = { - __typename?: 'TutorialData' - config: TutorialConfig - init?: Maybe - levels: Array + __typename?: 'TutorialData' + config: TutorialConfig + init?: Maybe + levels: Array } /** Data that loads on startup */ export type TutorialInit = { - __typename?: 'TutorialInit' - setup?: Maybe + __typename?: 'TutorialInit' + setup?: Maybe } /** Repo referenced by commmits in the tutorial */ export type TutorialRepo = { - __typename?: 'TutorialRepo' - uri: Scalars['String'] - branch: Scalars['String'] - name?: Maybe - owner?: Maybe + __typename?: 'TutorialRepo' + uri: Scalars['String'] + branch: Scalars['String'] + name?: Maybe + owner?: Maybe } export type TutorialRepoInput = { - uri: Scalars['String'] - branch: Scalars['String'] + uri: Scalars['String'] + branch: Scalars['String'] } /** Summary of tutorial used when selecting tutorial */ export type TutorialSummary = { - __typename?: 'TutorialSummary' - title: Scalars['String'] - description: Scalars['String'] + __typename?: 'TutorialSummary' + title: Scalars['String'] + description: Scalars['String'] } export type TutorialTestRunner = { - __typename?: 'TutorialTestRunner' - command: Scalars['String'] - fileFormats?: Maybe> + __typename?: 'TutorialTestRunner' + command: Scalars['String'] + fileFormats?: Maybe> } /** A version of a tutorial */ export type TutorialVersion = { - __typename?: 'TutorialVersion' - tutorialId: Scalars['ID'] - version: Scalars['String'] - createdAt: Scalars['DateTime'] - createdBy: User - updatedBy: User - updatedAt: Scalars['DateTime'] - publishedAt?: Maybe - publishedBy?: Maybe - summary: TutorialSummary - data: TutorialData - completed?: Maybe + __typename?: 'TutorialVersion' + tutorialId: Scalars['ID'] + version: Scalars['String'] + createdAt: Scalars['DateTime'] + createdBy: User + updatedBy: User + updatedAt: Scalars['DateTime'] + publishedAt?: Maybe + publishedBy?: Maybe + summary: TutorialSummary + data: TutorialData + completed?: Maybe } /** @@ -236,403 +236,404 @@ export type TutorialVersion = { * & credit for tutorial creation/contributions **/ export type User = { - __typename?: 'User' - id: Scalars['ID'] - name?: Maybe - email?: Maybe - location?: Maybe - avatarUrl?: Maybe - createdAt: Scalars['DateTime'] - updatedAt: Scalars['DateTime'] - githubUser?: Maybe + __typename?: 'User' + id: Scalars['ID'] + name?: Maybe + email?: Maybe + location?: Maybe + avatarUrl?: Maybe + createdAt: Scalars['DateTime'] + updatedAt: Scalars['DateTime'] + githubUser?: Maybe } export type ResolverTypeWrapper = Promise | T export type ResolverFn = ( - parent: TParent, - args: TArgs, - context: TContext, - info: GraphQLResolveInfo, + parent: TParent, + args: TArgs, + context: TContext, + info: GraphQLResolveInfo, ) => Promise | TResult export type StitchingResolver = { - fragment: string - resolve: ResolverFn + fragment: string + resolve: ResolverFn } export type Resolver = - | ResolverFn - | StitchingResolver + | ResolverFn + | StitchingResolver export type SubscriptionSubscribeFn = ( - parent: TParent, - args: TArgs, - context: TContext, - info: GraphQLResolveInfo, + parent: TParent, + args: TArgs, + context: TContext, + info: GraphQLResolveInfo, ) => AsyncIterator | Promise> export type SubscriptionResolveFn = ( - parent: TParent, - args: TArgs, - context: TContext, - info: GraphQLResolveInfo, + parent: TParent, + args: TArgs, + context: TContext, + info: GraphQLResolveInfo, ) => TResult | Promise export interface SubscriptionSubscriberObject { - subscribe: SubscriptionSubscribeFn<{ [key in TKey]: TResult }, TParent, TContext, TArgs> - resolve?: SubscriptionResolveFn + subscribe: SubscriptionSubscribeFn<{[key in TKey]: TResult lt +}, TParent, TContext, TArgs > + resolve ?: SubscriptionResolveFn < TResult, {[key in TKey]: TResult lt}, TContext, TArgs > } export interface SubscriptionResolverObject { - subscribe: SubscriptionSubscribeFn - resolve: SubscriptionResolveFn + subscribe: SubscriptionSubscribeFn + resolve: SubscriptionResolveFn } export type SubscriptionObject = - | SubscriptionSubscriberObject - | SubscriptionResolverObject + | SubscriptionSubscriberObject + | SubscriptionResolverObject export type SubscriptionResolver = - | ((...args: any[]) => SubscriptionObject) - | SubscriptionObject + | ((...args: any[]) => SubscriptionObject) + | SubscriptionObject export type TypeResolveFn = ( - parent: TParent, - context: TContext, - info: GraphQLResolveInfo, + parent: TParent, + context: TContext, + info: GraphQLResolveInfo, ) => Maybe export type NextResolverFn = () => Promise export type DirectiveResolverFn = ( - next: NextResolverFn, - parent: TParent, - args: TArgs, - context: TContext, - info: GraphQLResolveInfo, + next: NextResolverFn, + parent: TParent, + args: TArgs, + context: TContext, + info: GraphQLResolveInfo, ) => TResult | Promise /** Mapping between all available schema types and the resolvers types */ export type ResolversTypes = { - Query: ResolverTypeWrapper<{}> - ID: ResolverTypeWrapper - Tutorial: ResolverTypeWrapper - User: ResolverTypeWrapper - String: ResolverTypeWrapper - DateTime: ResolverTypeWrapper - GithubUser: ResolverTypeWrapper - TutorialVersion: ResolverTypeWrapper - TutorialSummary: ResolverTypeWrapper - TutorialData: ResolverTypeWrapper - TutorialConfig: ResolverTypeWrapper - TutorialTestRunner: ResolverTypeWrapper - FileFormat: FileFormat - TutorialRepo: ResolverTypeWrapper - TutorialInit: ResolverTypeWrapper - StepActions: ResolverTypeWrapper - Sha1: ResolverTypeWrapper - Level: ResolverTypeWrapper - Step: ResolverTypeWrapper - Boolean: ResolverTypeWrapper - tutorialRepoInput: TutorialRepoInput - Commit: ResolverTypeWrapper - Mutation: ResolverTypeWrapper<{}> - editorLoginInput: EditorLoginInput - Editor: Editor - editorLoginOutput: ResolverTypeWrapper - createTutorialVersionInput: CreateTutorialVersionInput - JSON: ResolverTypeWrapper - createTutorialVersionOutput: ResolverTypeWrapper - JSONObject: ResolverTypeWrapper - Role: Role - createTokenInput: CreateTokenInput - createTutorialSummaryInput: CreateTutorialSummaryInput + Query: ResolverTypeWrapper<{}> + ID: ResolverTypeWrapper + Tutorial: ResolverTypeWrapper + User: ResolverTypeWrapper + String: ResolverTypeWrapper + DateTime: ResolverTypeWrapper + GithubUser: ResolverTypeWrapper + TutorialVersion: ResolverTypeWrapper + TutorialSummary: ResolverTypeWrapper + TutorialData: ResolverTypeWrapper + TutorialConfig: ResolverTypeWrapper + TutorialTestRunner: ResolverTypeWrapper + FileFormat: FileFormat + TutorialRepo: ResolverTypeWrapper + TutorialInit: ResolverTypeWrapper + StepActions: ResolverTypeWrapper + Sha1: ResolverTypeWrapper + Level: ResolverTypeWrapper + Step: ResolverTypeWrapper + Boolean: ResolverTypeWrapper + tutorialRepoInput: TutorialRepoInput + Commit: ResolverTypeWrapper + Mutation: ResolverTypeWrapper<{}> + editorLoginInput: EditorLoginInput + Editor: Editor + editorLoginOutput: ResolverTypeWrapper + createTutorialVersionInput: CreateTutorialVersionInput + JSON: ResolverTypeWrapper + createTutorialVersionOutput: ResolverTypeWrapper + JSONObject: ResolverTypeWrapper + Role: Role + createTokenInput: CreateTokenInput + createTutorialSummaryInput: CreateTutorialSummaryInput } /** Mapping between all available schema types and the resolvers parents */ export type ResolversParentTypes = { - Query: {} - ID: Scalars['ID'] - Tutorial: Tutorial - User: User - String: Scalars['String'] - DateTime: Scalars['DateTime'] - GithubUser: GithubUser - TutorialVersion: TutorialVersion - TutorialSummary: TutorialSummary - TutorialData: TutorialData - TutorialConfig: TutorialConfig - TutorialTestRunner: TutorialTestRunner - FileFormat: FileFormat - TutorialRepo: TutorialRepo - TutorialInit: TutorialInit - StepActions: StepActions - Sha1: Scalars['Sha1'] - Level: Level - Step: Step - Boolean: Scalars['Boolean'] - tutorialRepoInput: TutorialRepoInput - Commit: Commit - Mutation: {} - editorLoginInput: EditorLoginInput - Editor: Editor - editorLoginOutput: EditorLoginOutput - createTutorialVersionInput: CreateTutorialVersionInput - JSON: Scalars['JSON'] - createTutorialVersionOutput: CreateTutorialVersionOutput - JSONObject: Scalars['JSONObject'] - Role: Role - createTokenInput: CreateTokenInput - createTutorialSummaryInput: CreateTutorialSummaryInput + Query: {} + ID: Scalars['ID'] + Tutorial: Tutorial + User: User + String: Scalars['String'] + DateTime: Scalars['DateTime'] + GithubUser: GithubUser + TutorialVersion: TutorialVersion + TutorialSummary: TutorialSummary + TutorialData: TutorialData + TutorialConfig: TutorialConfig + TutorialTestRunner: TutorialTestRunner + FileFormat: FileFormat + TutorialRepo: TutorialRepo + TutorialInit: TutorialInit + StepActions: StepActions + Sha1: Scalars['Sha1'] + Level: Level + Step: Step + Boolean: Scalars['Boolean'] + tutorialRepoInput: TutorialRepoInput + Commit: Commit + Mutation: {} + editorLoginInput: EditorLoginInput + Editor: Editor + editorLoginOutput: EditorLoginOutput + createTutorialVersionInput: CreateTutorialVersionInput + JSON: Scalars['JSON'] + createTutorialVersionOutput: CreateTutorialVersionOutput + JSONObject: Scalars['JSONObject'] + Role: Role + createTokenInput: CreateTokenInput + createTutorialSummaryInput: CreateTutorialSummaryInput } export type AuthDirectiveResolver< - Result, - Parent, - ContextType = any, - Args = { requires?: Maybe> } -> = DirectiveResolverFn + Result, + Parent, + ContextType = any, + Args = {requires?: Maybe> >> } + = DirectiveResolverFn < Result, Parent, ContextType, Args > export type CommitResolvers< - ContextType = any, - ParentType extends ResolversParentTypes['Commit'] = ResolversParentTypes['Commit'] -> = { - id?: Resolver - message?: Resolver, ParentType, ContextType> - username?: Resolver, ParentType, ContextType> -} + ContextType = any, + ParentType extends ResolversParentTypes['Commit'] = ResolversParentTypes['Commit'] + = { + id?: Resolver + message?: Resolver, ParentType, ContextType> + username?: Resolver, ParentType, ContextType> + export type CreateTutorialVersionOutputResolvers< - ContextType = any, - ParentType extends ResolversParentTypes['createTutorialVersionOutput'] = ResolversParentTypes['createTutorialVersionOutput'] -> = { - success?: Resolver, ParentType, ContextType> -} + ContextType = any, + ParentType extends ResolversParentTypes['createTutorialVersionOutput'] = ResolversParentTypes['createTutorialVersionOutput'] + = { + success?: Resolver, ParentType, ContextType> + export interface DateTimeScalarConfig extends GraphQLScalarTypeConfig { - name: 'DateTime' + name: 'DateTime' } export type EditorLoginOutputResolvers< - ContextType = any, - ParentType extends ResolversParentTypes['editorLoginOutput'] = ResolversParentTypes['editorLoginOutput'] -> = { - user?: Resolver - token?: Resolver -} + ContextType = any, + ParentType extends ResolversParentTypes['editorLoginOutput'] = ResolversParentTypes['editorLoginOutput'] + = { + user?: Resolver + token?: Resolver + export type GithubUserResolvers< - ContextType = any, - ParentType extends ResolversParentTypes['GithubUser'] = ResolversParentTypes['GithubUser'] -> = { - id?: Resolver - name?: Resolver, ParentType, ContextType> - email?: Resolver, ParentType, ContextType> - location?: Resolver, ParentType, ContextType> - avatarUrl?: Resolver, ParentType, ContextType> -} + ContextType = any, + ParentType extends ResolversParentTypes['GithubUser'] = ResolversParentTypes['GithubUser'] + = { + id?: Resolver + name?: Resolver, ParentType, ContextType> + email?: Resolver, ParentType, ContextType> + location?: Resolver, ParentType, ContextType> + avatarUrl?: Resolver, ParentType, ContextType> + export interface JsonScalarConfig extends GraphQLScalarTypeConfig { - name: 'JSON' + name: 'JSON' } export interface JsonObjectScalarConfig extends GraphQLScalarTypeConfig { - name: 'JSONObject' + name: 'JSONObject' } export type LevelResolvers< - ContextType = any, - ParentType extends ResolversParentTypes['Level'] = ResolversParentTypes['Level'] -> = { - id?: Resolver - title?: Resolver - description?: Resolver - content?: Resolver - steps?: Resolver, ParentType, ContextType> - setup?: Resolver, ParentType, ContextType> -} + ContextType = any, + ParentType extends ResolversParentTypes['Level'] = ResolversParentTypes['Level'] + = { + id?: Resolver + title?: Resolver + description?: Resolver + content?: Resolver + steps?: Resolver, ParentType, ContextType> + setup?: Resolver, ParentType, ContextType> + export type MutationResolvers< - ContextType = any, - ParentType extends ResolversParentTypes['Mutation'] = ResolversParentTypes['Mutation'] -> = { - editorLogin?: Resolver< - Maybe, - ParentType, - ContextType, - RequireFields - > - createTutorialVersion?: Resolver< - Maybe, - ParentType, - ContextType, - RequireFields - > -} + ContextType = any, + ParentType extends ResolversParentTypes['Mutation'] = ResolversParentTypes['Mutation'] + = { + editorLogin?: Resolver< + Maybe, + ParentType, + ContextType, + RequireFields + > + createTutorialVersion?: Resolver< + Maybe, + ParentType, + ContextType, + RequireFields + > + export type QueryResolvers< - ContextType = any, - ParentType extends ResolversParentTypes['Query'] = ResolversParentTypes['Query'] -> = { - tutorial?: Resolver< - Maybe, - ParentType, - ContextType, - RequireFields - > - tutorials?: Resolver>>, ParentType, ContextType> - viewer?: Resolver, ParentType, ContextType> - commits?: Resolver< - Array>, - ParentType, - ContextType, - RequireFields - > -} + ContextType = any, + ParentType extends ResolversParentTypes['Query'] = ResolversParentTypes['Query'] + = { + tutorial?: Resolver< + Maybe, + ParentType, + ContextType, + RequireFields + > + tutorials?: Resolver>>, ParentType, ContextType> + viewer?: Resolver, ParentType, ContextType> + commits?: Resolver< + Array>, + ParentType, + ContextType, + RequireFields + > + export interface Sha1ScalarConfig extends GraphQLScalarTypeConfig { - name: 'Sha1' + name: 'Sha1' } export type StepResolvers< - ContextType = any, - ParentType extends ResolversParentTypes['Step'] = ResolversParentTypes['Step'] -> = { - id?: Resolver - content?: Resolver - setup?: Resolver - solution?: Resolver -} + ContextType = any, + ParentType extends ResolversParentTypes['Step'] = ResolversParentTypes['Step'] + = { + id?: Resolver + content?: Resolver + setup?: Resolver + solution?: Resolver + export type StepActionsResolvers< - ContextType = any, - ParentType extends ResolversParentTypes['StepActions'] = ResolversParentTypes['StepActions'] -> = { - id?: Resolver - commits?: Resolver, ParentType, ContextType> - files?: Resolver>, ParentType, ContextType> - commands?: Resolver>, ParentType, ContextType> - listeners?: Resolver>, ParentType, ContextType> -} + ContextType = any, + ParentType extends ResolversParentTypes['StepActions'] = ResolversParentTypes['StepActions'] + = { + id?: Resolver + commits?: Resolver, ParentType, ContextType> + files?: Resolver>, ParentType, ContextType> + commands?: Resolver>, ParentType, ContextType> + watchers?: Resolver>, ParentType, ContextType> + export type TutorialResolvers< - ContextType = any, - ParentType extends ResolversParentTypes['Tutorial'] = ResolversParentTypes['Tutorial'] -> = { - id?: Resolver - createdBy?: Resolver - createdAt?: Resolver - version?: Resolver - versions?: Resolver, ParentType, ContextType> - completed?: Resolver, ParentType, ContextType> -} + ContextType = any, + ParentType extends ResolversParentTypes['Tutorial'] = ResolversParentTypes['Tutorial'] + = { + id?: Resolver + createdBy?: Resolver + createdAt?: Resolver + version?: Resolver + versions?: Resolver, ParentType, ContextType> + completed?: Resolver, ParentType, ContextType> + export type TutorialConfigResolvers< - ContextType = any, - ParentType extends ResolversParentTypes['TutorialConfig'] = ResolversParentTypes['TutorialConfig'] -> = { - testRunner?: Resolver - repo?: Resolver -} + ContextType = any, + ParentType extends ResolversParentTypes['TutorialConfig'] = ResolversParentTypes['TutorialConfig'] + = { + testRunner?: Resolver + repo?: Resolver + export type TutorialDataResolvers< - ContextType = any, - ParentType extends ResolversParentTypes['TutorialData'] = ResolversParentTypes['TutorialData'] -> = { - config?: Resolver - init?: Resolver, ParentType, ContextType> - levels?: Resolver, ParentType, ContextType> -} + ContextType = any, + ParentType extends ResolversParentTypes['TutorialData'] = ResolversParentTypes['TutorialData'] + = { + config?: Resolver + init?: Resolver, ParentType, ContextType> + levels?: Resolver, ParentType, ContextType> + export type TutorialInitResolvers< - ContextType = any, - ParentType extends ResolversParentTypes['TutorialInit'] = ResolversParentTypes['TutorialInit'] -> = { - setup?: Resolver, ParentType, ContextType> -} + ContextType = any, + ParentType extends ResolversParentTypes['TutorialInit'] = ResolversParentTypes['TutorialInit'] + = { + setup?: Resolver, ParentType, ContextType> + export type TutorialRepoResolvers< - ContextType = any, - ParentType extends ResolversParentTypes['TutorialRepo'] = ResolversParentTypes['TutorialRepo'] -> = { - uri?: Resolver - branch?: Resolver - name?: Resolver, ParentType, ContextType> - owner?: Resolver, ParentType, ContextType> -} + ContextType = any, + ParentType extends ResolversParentTypes['TutorialRepo'] = ResolversParentTypes['TutorialRepo'] + = { + uri?: Resolver + branch?: Resolver + name?: Resolver, ParentType, ContextType> + owner?: Resolver, ParentType, ContextType> + export type TutorialSummaryResolvers< - ContextType = any, - ParentType extends ResolversParentTypes['TutorialSummary'] = ResolversParentTypes['TutorialSummary'] -> = { - title?: Resolver - description?: Resolver -} + ContextType = any, + ParentType extends ResolversParentTypes['TutorialSummary'] = ResolversParentTypes['TutorialSummary'] + = { + title?: Resolver + description?: Resolver + export type TutorialTestRunnerResolvers< - ContextType = any, - ParentType extends ResolversParentTypes['TutorialTestRunner'] = ResolversParentTypes['TutorialTestRunner'] -> = { - command?: Resolver - fileFormats?: Resolver>, ParentType, ContextType> -} + ContextType = any, + ParentType extends ResolversParentTypes['TutorialTestRunner'] = ResolversParentTypes['TutorialTestRunner'] + = { + command?: Resolver + fileFormats?: Resolver>, ParentType, ContextType> + export type TutorialVersionResolvers< - ContextType = any, - ParentType extends ResolversParentTypes['TutorialVersion'] = ResolversParentTypes['TutorialVersion'] -> = { - tutorialId?: Resolver - version?: Resolver - createdAt?: Resolver - createdBy?: Resolver - updatedBy?: Resolver - updatedAt?: Resolver - publishedAt?: Resolver, ParentType, ContextType> - publishedBy?: Resolver, ParentType, ContextType> - summary?: Resolver - data?: Resolver - completed?: Resolver, ParentType, ContextType> -} + ContextType = any, + ParentType extends ResolversParentTypes['TutorialVersion'] = ResolversParentTypes['TutorialVersion'] + = { + tutorialId?: Resolver + version?: Resolver + createdAt?: Resolver + createdBy?: Resolver + updatedBy?: Resolver + updatedAt?: Resolver + publishedAt?: Resolver, ParentType, ContextType> + publishedBy?: Resolver, ParentType, ContextType> + summary?: Resolver + data?: Resolver + completed?: Resolver, ParentType, ContextType> + export type UserResolvers< - ContextType = any, - ParentType extends ResolversParentTypes['User'] = ResolversParentTypes['User'] -> = { - id?: Resolver - name?: Resolver, ParentType, ContextType> - email?: Resolver, ParentType, ContextType> - location?: Resolver, ParentType, ContextType> - avatarUrl?: Resolver, ParentType, ContextType> - createdAt?: Resolver - updatedAt?: Resolver - githubUser?: Resolver, ParentType, ContextType> -} + ContextType = any, + ParentType extends ResolversParentTypes['User'] = ResolversParentTypes['User'] + = { + id?: Resolver + name?: Resolver, ParentType, ContextType> + email?: Resolver, ParentType, ContextType> + location?: Resolver, ParentType, ContextType> + avatarUrl?: Resolver, ParentType, ContextType> + createdAt?: Resolver + updatedAt?: Resolver + githubUser?: Resolver, ParentType, ContextType> + export type Resolvers = { - Commit?: CommitResolvers - createTutorialVersionOutput?: CreateTutorialVersionOutputResolvers - DateTime?: GraphQLScalarType - editorLoginOutput?: EditorLoginOutputResolvers - GithubUser?: GithubUserResolvers - JSON?: GraphQLScalarType - JSONObject?: GraphQLScalarType - Level?: LevelResolvers - Mutation?: MutationResolvers - Query?: QueryResolvers - Sha1?: GraphQLScalarType - Step?: StepResolvers - StepActions?: StepActionsResolvers - Tutorial?: TutorialResolvers - TutorialConfig?: TutorialConfigResolvers - TutorialData?: TutorialDataResolvers - TutorialInit?: TutorialInitResolvers - TutorialRepo?: TutorialRepoResolvers - TutorialSummary?: TutorialSummaryResolvers - TutorialTestRunner?: TutorialTestRunnerResolvers - TutorialVersion?: TutorialVersionResolvers - User?: UserResolvers -} + Commit?: CommitResolvers + createTutorialVersionOutput?: CreateTutorialVersionOutputResolvers + DateTime?: GraphQLScalarType + editorLoginOutput?: EditorLoginOutputResolvers + GithubUser?: GithubUserResolvers + JSON?: GraphQLScalarType + JSONObject?: GraphQLScalarType + Level?: LevelResolvers + Mutation?: MutationResolvers + Query?: QueryResolvers + Sha1?: GraphQLScalarType + Step?: StepResolvers + StepActions?: StepActionsResolvers + Tutorial?: TutorialResolvers + TutorialConfig?: TutorialConfigResolvers + TutorialData?: TutorialDataResolvers + TutorialInit?: TutorialInitResolvers + TutorialRepo?: TutorialRepoResolvers + TutorialSummary?: TutorialSummaryResolvers + TutorialTestRunner?: TutorialTestRunnerResolvers + TutorialVersion?: TutorialVersionResolvers + User?: UserResolvers + } /** * @deprecated @@ -640,7 +641,7 @@ export type Resolvers = { */ export type IResolvers = Resolvers export type DirectiveResolvers = { - auth?: AuthDirectiveResolver + auth?: AuthDirectiveResolver } /** @@ -650,13 +651,13 @@ export type DirectiveResolvers = { export type IDirectiveResolvers = DirectiveResolvers export interface IntrospectionResultData { - __schema: { - types: { - kind: string - name: string - possibleTypes: { - name: string - }[] - }[] - } + __schema: { + types: { + kind: string + name: string + possibleTypes: { + name: string + }[] + }[] + } } diff --git a/web-app/package-lock.json b/web-app/package-lock.json index f7ede962..1535cbc5 100644 --- a/web-app/package-lock.json +++ b/web-app/package-lock.json @@ -14,9 +14,9 @@ } }, "@alifd/next": { - "version": "1.18.15", - "resolved": "https://registry.npmjs.org/@alifd/next/-/next-1.18.15.tgz", - "integrity": "sha512-J0Qx11f4ixOGntNSlS1wXgQea5xkCrwCYYxR27C5GpoNC61VMkfklvnL8G8+mEhWoocYF2lzr9Ex7/DBoeM0YA==", + "version": "1.18.16", + "resolved": "https://registry.npmjs.org/@alifd/next/-/next-1.18.16.tgz", + "integrity": "sha512-19NoEQNpN/eMJ4G158r30Hq4Z/8UWSbSBeWA1NV4tvVeKM70qQwl0gs4vPAUFjkltNnLz+m6o2Ok7NVD5hOYpA==", "requires": { "@alifd/field": "~1.3.3", "@alifd/validate": "~1.1.4", @@ -2342,9 +2342,9 @@ } }, "@types/node": { - "version": "12.12.7", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.12.7.tgz", - "integrity": "sha512-E6Zn0rffhgd130zbCbAr/JdXfXkoOUFAKNs/rF8qnafSJ8KYaA/j3oz7dcwal+lYjLA7xvdd5J4wdYpCTlP8+w==" + "version": "12.12.8", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.12.8.tgz", + "integrity": "sha512-XLla8N+iyfjvsa0KKV+BP/iGSoTmwxsu5Ci5sM33z9TjohF72DEz95iNvD6pPmemvbQgxAv/909G73gUn8QR7w==" }, "@types/prismjs": { "version": "1.16.0", diff --git a/web-app/package.json b/web-app/package.json index dc8ffd90..a2fe8e39 100644 --- a/web-app/package.json +++ b/web-app/package.json @@ -1,76 +1,76 @@ { - "name": "coderoad-app", - "version": "0.1.0", - "private": true, - "scripts": { - "build": "react-scripts build", - "postbuild": "cp -R ./build/ ../build/", - "build-storybook": "build-storybook", - "start": "react-scripts start", - "storybook": "start-storybook -p 6006", - "test": "react-scripts test" - }, - "browserslist": { - "production": [ - ">0.2%", - "not dead", - "not op_mini all" - ], - "development": [ - "last 1 chrome version", - "last 1 firefox version", - "last 1 safari version" - ] - }, - "eslintConfig": { - "extends": "react-app" - }, - "dependencies": { - "@alifd/next": "^1.18.15", - "@alifd/theme-4": "^0.2.0", - "@apollo/react-hooks": "^3.1.3", - "apollo-boost": "^0.4.4", - "graphql": "^14.5.8", - "markdown-it": "^10.0.0", - "markdown-it-emoji": "^1.4.0", - "markdown-it-prism": "^2.0.3", - "moment": "^2.24.0", - "prismjs": "^1.17.1", - "ramda": "^0.26.1", - "react": "^16.12.0", - "react-dom": "^16.12.0", - "reselect": "^4.0.0", - "typescript": "^3.7.2", - "xstate": "^4.6.7" - }, - "devDependencies": { - "@babel/core": "^7.5.4", - "@storybook/addon-actions": "^5.2.6", - "@storybook/addon-knobs": "^5.2.6", - "@storybook/addon-links": "^5.2.6", - "@storybook/addons": "^5.2.6", - "@storybook/react": "^5.2.6", - "@types/graphql": "^14.5.0", - "@types/highlight.js": "^9.12.3", - "@types/jest": "^24.0.23", - "@types/markdown-it": "0.0.9", - "@types/node": "^12.12.7", - "@types/prismjs": "^1.16.0", - "@types/ramda": "^0.26.34", - "@types/react": "^16.9.11", - "@types/react-dom": "^16.9.4", - "@types/storybook__react": "^4.0.2", - "@typescript-eslint/eslint-plugin": "^2.7.0", - "@typescript-eslint/parser": "^2.7.0", - "babel-loader": "8.0.5", - "babel-plugin-import": "^1.12.1", - "eslint": "^6.6.0", - "eslint-config-prettier": "^6.5.0", - "eslint-plugin-prettier": "^3.1.1", - "node-sass": "^4.13.0", - "prettier": "^1.19.1", - "react-scripts": "^3.2.0", - "sass-loader": "^8.0.0", - "typescript-eslint-parser": "^22.0.0" - } + "name": "coderoad-app", + "version": "0.1.0", + "private": true, + "scripts": { + "build": "react-scripts build", + "postbuild": "cp -R ./build/ ../build/", + "build-storybook": "build-storybook", + "start": "react-scripts start", + "storybook": "start-storybook -p 6006", + "test": "react-scripts test" + }, + "browserslist": { + "production": [ + ">0.2%", + "not dead", + "not op_mini all" + ], + "development": [ + "last 1 chrome version", + "last 1 firefox version", + "last 1 safari version" + ] + }, + "eslintConfig": { + "extends": "react-app" + }, + "dependencies": { + "@alifd/next": "^1.18.16", + "@alifd/theme-4": "^0.2.0", + "@apollo/react-hooks": "^3.1.3", + "apollo-boost": "^0.4.4", + "graphql": "^14.5.8", + "markdown-it": "^10.0.0", + "markdown-it-emoji": "^1.4.0", + "markdown-it-prism": "^2.0.3", + "moment": "^2.24.0", + "prismjs": "^1.17.1", + "ramda": "^0.26.1", + "react": "^16.12.0", + "react-dom": "^16.12.0", + "reselect": "^4.0.0", + "typescript": "^3.7.2", + "xstate": "^4.6.7" + }, + "devDependencies": { + "@babel/core": "^7.5.4", + "@storybook/addon-actions": "^5.2.6", + "@storybook/addon-knobs": "^5.2.6", + "@storybook/addon-links": "^5.2.6", + "@storybook/addons": "^5.2.6", + "@storybook/react": "^5.2.6", + "@types/graphql": "^14.5.0", + "@types/highlight.js": "^9.12.3", + "@types/jest": "^24.0.23", + "@types/markdown-it": "0.0.9", + "@types/node": "^12.12.8", + "@types/prismjs": "^1.16.0", + "@types/ramda": "^0.26.34", + "@types/react": "^16.9.11", + "@types/react-dom": "^16.9.4", + "@types/storybook__react": "^4.0.2", + "@typescript-eslint/eslint-plugin": "^2.7.0", + "@typescript-eslint/parser": "^2.7.0", + "babel-loader": "8.0.5", + "babel-plugin-import": "^1.12.1", + "eslint": "^6.6.0", + "eslint-config-prettier": "^6.5.0", + "eslint-plugin-prettier": "^3.1.1", + "node-sass": "^4.13.0", + "prettier": "^1.19.1", + "react-scripts": "^3.2.0", + "sass-loader": "^8.0.0", + "typescript-eslint-parser": "^22.0.0" + } } diff --git a/web-app/src/services/apollo/queries/tutorial.ts b/web-app/src/services/apollo/queries/tutorial.ts index 64d43efa..9abb2735 100644 --- a/web-app/src/services/apollo/queries/tutorial.ts +++ b/web-app/src/services/apollo/queries/tutorial.ts @@ -44,7 +44,7 @@ export default gql` commits commands files - listeners + watchers } solution { commits From b8dc5b001b8220d5915de055598284ad464399a9 Mon Sep 17 00:00:00 2001 From: shmck Date: Sat, 16 Nov 2019 15:58:13 -0800 Subject: [PATCH 5/6] resolve typings formatting issue --- typings/graphql.d.ts | 881 +++++++++++++++++++++---------------------- 1 file changed, 440 insertions(+), 441 deletions(-) diff --git a/typings/graphql.d.ts b/typings/graphql.d.ts index 58fc3976..9ae6adbf 100644 --- a/typings/graphql.d.ts +++ b/typings/graphql.d.ts @@ -1,234 +1,234 @@ -import {GraphQLResolveInfo, GraphQLScalarType, GraphQLScalarTypeConfig g} from 'graphql' +import { GraphQLResolveInfo, GraphQLScalarType, GraphQLScalarTypeConfig } from 'graphql' export type Maybe = T | null -export type RequireFields = {[X in Exclude]?: T[X] ] } & - {[P in K]-?: NonNullable ]> } +export type RequireFields = { [X in Exclude]?: T[X] } & + { [P in K]-?: NonNullable } /** All built-in and custom scalars, mapped to their actual values */ export type Scalars = { - ID: string - String: string - Boolean: boolean - Int: number - Float: number - DateTime: any - Sha1: any - JSON: any - JSONObject: any + ID: string + String: string + Boolean: boolean + Int: number + Float: number + DateTime: any + Sha1: any + JSON: any + JSONObject: any } /** Commits from a Git Repo */ export type Commit = { - __typename?: 'Commit' - id: Scalars['Sha1'] - message?: Maybe - username?: Maybe + __typename?: 'Commit' + id: Scalars['Sha1'] + message?: Maybe + username?: Maybe } export type CreateTokenInput = { - accessToken: Scalars['String'] + accessToken: Scalars['String'] } export type CreateTutorialSummaryInput = { - title: Scalars['String'] - description: Scalars['String'] + title: Scalars['String'] + description: Scalars['String'] } export type CreateTutorialVersionInput = { - data: Scalars['JSON'] + data: Scalars['JSON'] } export type CreateTutorialVersionOutput = { - __typename?: 'createTutorialVersionOutput' - success?: Maybe + __typename?: 'createTutorialVersionOutput' + success?: Maybe } export type Editor = 'VSCODE' export type EditorLoginInput = { - editor: Editor - machineId: Scalars['String'] - sessionId: Scalars['String'] + editor: Editor + machineId: Scalars['String'] + sessionId: Scalars['String'] } export type EditorLoginOutput = { - __typename?: 'editorLoginOutput' - user: User - token: Scalars['String'] + __typename?: 'editorLoginOutput' + user: User + token: Scalars['String'] } export type FileFormat = - | 'GO' - | 'JS' - | 'JSON' - | 'JSX' - | 'LESS' - | 'LUA' - | 'PHP' - | 'PY' - | 'RB' - | 'SASS' - | 'SCSS' - | 'SQL' - | 'TS' - | 'TSX' - | 'YAML' + | 'GO' + | 'JS' + | 'JSON' + | 'JSX' + | 'LESS' + | 'LUA' + | 'PHP' + | 'PY' + | 'RB' + | 'SASS' + | 'SCSS' + | 'SQL' + | 'TS' + | 'TSX' + | 'YAML' /** Information linked from a GitHub account */ export type GithubUser = { - __typename?: 'GithubUser' - id: Scalars['ID'] - name?: Maybe - email?: Maybe - location?: Maybe - avatarUrl?: Maybe + __typename?: 'GithubUser' + id: Scalars['ID'] + name?: Maybe + email?: Maybe + location?: Maybe + avatarUrl?: Maybe } /** Logical groupings of tasks */ export type Level = { - __typename?: 'Level' - id: Scalars['ID'] - title: Scalars['String'] - /** A summary of the level */ - description: Scalars['String'] - /** The lesson content of the level, parsed as markdown */ - content: Scalars['String'] - /** A set of tasks for users linked to unit tests */ - steps: Array - /** Actions run on level start up for configuring setup */ - setup?: Maybe + __typename?: 'Level' + id: Scalars['ID'] + title: Scalars['String'] + /** A summary of the level */ + description: Scalars['String'] + /** The lesson content of the level, parsed as markdown */ + content: Scalars['String'] + /** A set of tasks for users linked to unit tests */ + steps: Array + /** Actions run on level start up for configuring setup */ + setup?: Maybe } export type Mutation = { - __typename?: 'Mutation' - /** Login used from a coding editor */ - editorLogin?: Maybe - /** Create a new tutorial */ - createTutorialVersion?: Maybe + __typename?: 'Mutation' + /** Login used from a coding editor */ + editorLogin?: Maybe + /** Create a new tutorial */ + createTutorialVersion?: Maybe } export type MutationEditorLoginArgs = { - input: EditorLoginInput + input: EditorLoginInput } export type MutationCreateTutorialVersionArgs = { - input: CreateTutorialVersionInput + input: CreateTutorialVersionInput } export type Query = { - __typename?: 'Query' - tutorial?: Maybe - tutorials?: Maybe>> - viewer?: Maybe - /** TOOD: move inside of viewer */ - commits: Array> + __typename?: 'Query' + tutorial?: Maybe + tutorials?: Maybe>> + viewer?: Maybe + /** TOOD: move inside of viewer */ + commits: Array> } export type QueryTutorialArgs = { - id: Scalars['ID'] + id: Scalars['ID'] } export type QueryCommitsArgs = { - input: TutorialRepoInput + input: TutorialRepoInput } export type Role = 'ADMIN' | 'EDITOR_USER' /** A level task */ export type Step = { - __typename?: 'Step' - id: Scalars['ID'] - content: Scalars['String'] - setup: StepActions - solution: StepActions + __typename?: 'Step' + id: Scalars['ID'] + content: Scalars['String'] + setup: StepActions + solution: StepActions } /** Load commits, open files or run commands */ export type StepActions = { - __typename?: 'StepActions' - id: Scalars['ID'] - commits: Array - files?: Maybe> - commands?: Maybe> - watchers?: Maybe> + __typename?: 'StepActions' + id: Scalars['ID'] + commits: Array + files?: Maybe> + commands?: Maybe> + watchers?: Maybe> } /** A tutorial for use in VSCode CodeRoad */ export type Tutorial = { - __typename?: 'Tutorial' - id: Scalars['ID'] - createdBy: User - createdAt: Scalars['DateTime'] - version: TutorialVersion - versions: Array - completed?: Maybe + __typename?: 'Tutorial' + id: Scalars['ID'] + createdBy: User + createdAt: Scalars['DateTime'] + version: TutorialVersion + versions: Array + completed?: Maybe } /** A tutorial for use in VSCode CodeRoad */ export type TutorialVersionArgs = { - version?: Maybe + version?: Maybe } /** Configure environment in editor for git, testing & parsing files */ export type TutorialConfig = { - __typename?: 'TutorialConfig' - testRunner: TutorialTestRunner - repo: TutorialRepo + __typename?: 'TutorialConfig' + testRunner: TutorialTestRunner + repo: TutorialRepo } /** Data for tutorial */ export type TutorialData = { - __typename?: 'TutorialData' - config: TutorialConfig - init?: Maybe - levels: Array + __typename?: 'TutorialData' + config: TutorialConfig + init?: Maybe + levels: Array } /** Data that loads on startup */ export type TutorialInit = { - __typename?: 'TutorialInit' - setup?: Maybe + __typename?: 'TutorialInit' + setup?: Maybe } /** Repo referenced by commmits in the tutorial */ export type TutorialRepo = { - __typename?: 'TutorialRepo' - uri: Scalars['String'] - branch: Scalars['String'] - name?: Maybe - owner?: Maybe + __typename?: 'TutorialRepo' + uri: Scalars['String'] + branch: Scalars['String'] + name?: Maybe + owner?: Maybe } export type TutorialRepoInput = { - uri: Scalars['String'] - branch: Scalars['String'] + uri: Scalars['String'] + branch: Scalars['String'] } /** Summary of tutorial used when selecting tutorial */ export type TutorialSummary = { - __typename?: 'TutorialSummary' - title: Scalars['String'] - description: Scalars['String'] + __typename?: 'TutorialSummary' + title: Scalars['String'] + description: Scalars['String'] } export type TutorialTestRunner = { - __typename?: 'TutorialTestRunner' - command: Scalars['String'] - fileFormats?: Maybe> + __typename?: 'TutorialTestRunner' + command: Scalars['String'] + fileFormats?: Maybe> } /** A version of a tutorial */ export type TutorialVersion = { - __typename?: 'TutorialVersion' - tutorialId: Scalars['ID'] - version: Scalars['String'] - createdAt: Scalars['DateTime'] - createdBy: User - updatedBy: User - updatedAt: Scalars['DateTime'] - publishedAt?: Maybe - publishedBy?: Maybe - summary: TutorialSummary - data: TutorialData - completed?: Maybe + __typename?: 'TutorialVersion' + tutorialId: Scalars['ID'] + version: Scalars['String'] + createdAt: Scalars['DateTime'] + createdBy: User + updatedBy: User + updatedAt: Scalars['DateTime'] + publishedAt?: Maybe + publishedBy?: Maybe + summary: TutorialSummary + data: TutorialData + completed?: Maybe } /** @@ -236,404 +236,403 @@ export type TutorialVersion = { * & credit for tutorial creation/contributions **/ export type User = { - __typename?: 'User' - id: Scalars['ID'] - name?: Maybe - email?: Maybe - location?: Maybe - avatarUrl?: Maybe - createdAt: Scalars['DateTime'] - updatedAt: Scalars['DateTime'] - githubUser?: Maybe + __typename?: 'User' + id: Scalars['ID'] + name?: Maybe + email?: Maybe + location?: Maybe + avatarUrl?: Maybe + createdAt: Scalars['DateTime'] + updatedAt: Scalars['DateTime'] + githubUser?: Maybe } export type ResolverTypeWrapper = Promise | T export type ResolverFn = ( - parent: TParent, - args: TArgs, - context: TContext, - info: GraphQLResolveInfo, + parent: TParent, + args: TArgs, + context: TContext, + info: GraphQLResolveInfo, ) => Promise | TResult export type StitchingResolver = { - fragment: string - resolve: ResolverFn + fragment: string + resolve: ResolverFn } export type Resolver = - | ResolverFn - | StitchingResolver + | ResolverFn + | StitchingResolver export type SubscriptionSubscribeFn = ( - parent: TParent, - args: TArgs, - context: TContext, - info: GraphQLResolveInfo, + parent: TParent, + args: TArgs, + context: TContext, + info: GraphQLResolveInfo, ) => AsyncIterator | Promise> export type SubscriptionResolveFn = ( - parent: TParent, - args: TArgs, - context: TContext, - info: GraphQLResolveInfo, + parent: TParent, + args: TArgs, + context: TContext, + info: GraphQLResolveInfo, ) => TResult | Promise export interface SubscriptionSubscriberObject { - subscribe: SubscriptionSubscribeFn<{[key in TKey]: TResult lt -}, TParent, TContext, TArgs > - resolve ?: SubscriptionResolveFn < TResult, {[key in TKey]: TResult lt}, TContext, TArgs > + subscribe: SubscriptionSubscribeFn<{ [key in TKey]: TResult }, TParent, TContext, TArgs> + resolve?: SubscriptionResolveFn } export interface SubscriptionResolverObject { - subscribe: SubscriptionSubscribeFn - resolve: SubscriptionResolveFn + subscribe: SubscriptionSubscribeFn + resolve: SubscriptionResolveFn } export type SubscriptionObject = - | SubscriptionSubscriberObject - | SubscriptionResolverObject + | SubscriptionSubscriberObject + | SubscriptionResolverObject export type SubscriptionResolver = - | ((...args: any[]) => SubscriptionObject) - | SubscriptionObject + | ((...args: any[]) => SubscriptionObject) + | SubscriptionObject export type TypeResolveFn = ( - parent: TParent, - context: TContext, - info: GraphQLResolveInfo, + parent: TParent, + context: TContext, + info: GraphQLResolveInfo, ) => Maybe export type NextResolverFn = () => Promise export type DirectiveResolverFn = ( - next: NextResolverFn, - parent: TParent, - args: TArgs, - context: TContext, - info: GraphQLResolveInfo, + next: NextResolverFn, + parent: TParent, + args: TArgs, + context: TContext, + info: GraphQLResolveInfo, ) => TResult | Promise /** Mapping between all available schema types and the resolvers types */ export type ResolversTypes = { - Query: ResolverTypeWrapper<{}> - ID: ResolverTypeWrapper - Tutorial: ResolverTypeWrapper - User: ResolverTypeWrapper - String: ResolverTypeWrapper - DateTime: ResolverTypeWrapper - GithubUser: ResolverTypeWrapper - TutorialVersion: ResolverTypeWrapper - TutorialSummary: ResolverTypeWrapper - TutorialData: ResolverTypeWrapper - TutorialConfig: ResolverTypeWrapper - TutorialTestRunner: ResolverTypeWrapper - FileFormat: FileFormat - TutorialRepo: ResolverTypeWrapper - TutorialInit: ResolverTypeWrapper - StepActions: ResolverTypeWrapper - Sha1: ResolverTypeWrapper - Level: ResolverTypeWrapper - Step: ResolverTypeWrapper - Boolean: ResolverTypeWrapper - tutorialRepoInput: TutorialRepoInput - Commit: ResolverTypeWrapper - Mutation: ResolverTypeWrapper<{}> - editorLoginInput: EditorLoginInput - Editor: Editor - editorLoginOutput: ResolverTypeWrapper - createTutorialVersionInput: CreateTutorialVersionInput - JSON: ResolverTypeWrapper - createTutorialVersionOutput: ResolverTypeWrapper - JSONObject: ResolverTypeWrapper - Role: Role - createTokenInput: CreateTokenInput - createTutorialSummaryInput: CreateTutorialSummaryInput + Query: ResolverTypeWrapper<{}> + ID: ResolverTypeWrapper + Tutorial: ResolverTypeWrapper + User: ResolverTypeWrapper + String: ResolverTypeWrapper + DateTime: ResolverTypeWrapper + GithubUser: ResolverTypeWrapper + TutorialVersion: ResolverTypeWrapper + TutorialSummary: ResolverTypeWrapper + TutorialData: ResolverTypeWrapper + TutorialConfig: ResolverTypeWrapper + TutorialTestRunner: ResolverTypeWrapper + FileFormat: FileFormat + TutorialRepo: ResolverTypeWrapper + TutorialInit: ResolverTypeWrapper + StepActions: ResolverTypeWrapper + Sha1: ResolverTypeWrapper + Level: ResolverTypeWrapper + Step: ResolverTypeWrapper + Boolean: ResolverTypeWrapper + tutorialRepoInput: TutorialRepoInput + Commit: ResolverTypeWrapper + Mutation: ResolverTypeWrapper<{}> + editorLoginInput: EditorLoginInput + Editor: Editor + editorLoginOutput: ResolverTypeWrapper + createTutorialVersionInput: CreateTutorialVersionInput + JSON: ResolverTypeWrapper + createTutorialVersionOutput: ResolverTypeWrapper + JSONObject: ResolverTypeWrapper + Role: Role + createTokenInput: CreateTokenInput + createTutorialSummaryInput: CreateTutorialSummaryInput } /** Mapping between all available schema types and the resolvers parents */ export type ResolversParentTypes = { - Query: {} - ID: Scalars['ID'] - Tutorial: Tutorial - User: User - String: Scalars['String'] - DateTime: Scalars['DateTime'] - GithubUser: GithubUser - TutorialVersion: TutorialVersion - TutorialSummary: TutorialSummary - TutorialData: TutorialData - TutorialConfig: TutorialConfig - TutorialTestRunner: TutorialTestRunner - FileFormat: FileFormat - TutorialRepo: TutorialRepo - TutorialInit: TutorialInit - StepActions: StepActions - Sha1: Scalars['Sha1'] - Level: Level - Step: Step - Boolean: Scalars['Boolean'] - tutorialRepoInput: TutorialRepoInput - Commit: Commit - Mutation: {} - editorLoginInput: EditorLoginInput - Editor: Editor - editorLoginOutput: EditorLoginOutput - createTutorialVersionInput: CreateTutorialVersionInput - JSON: Scalars['JSON'] - createTutorialVersionOutput: CreateTutorialVersionOutput - JSONObject: Scalars['JSONObject'] - Role: Role - createTokenInput: CreateTokenInput - createTutorialSummaryInput: CreateTutorialSummaryInput + Query: {} + ID: Scalars['ID'] + Tutorial: Tutorial + User: User + String: Scalars['String'] + DateTime: Scalars['DateTime'] + GithubUser: GithubUser + TutorialVersion: TutorialVersion + TutorialSummary: TutorialSummary + TutorialData: TutorialData + TutorialConfig: TutorialConfig + TutorialTestRunner: TutorialTestRunner + FileFormat: FileFormat + TutorialRepo: TutorialRepo + TutorialInit: TutorialInit + StepActions: StepActions + Sha1: Scalars['Sha1'] + Level: Level + Step: Step + Boolean: Scalars['Boolean'] + tutorialRepoInput: TutorialRepoInput + Commit: Commit + Mutation: {} + editorLoginInput: EditorLoginInput + Editor: Editor + editorLoginOutput: EditorLoginOutput + createTutorialVersionInput: CreateTutorialVersionInput + JSON: Scalars['JSON'] + createTutorialVersionOutput: CreateTutorialVersionOutput + JSONObject: Scalars['JSONObject'] + Role: Role + createTokenInput: CreateTokenInput + createTutorialSummaryInput: CreateTutorialSummaryInput } export type AuthDirectiveResolver< - Result, - Parent, - ContextType = any, - Args = {requires?: Maybe> >> } - = DirectiveResolverFn < Result, Parent, ContextType, Args > + Result, + Parent, + ContextType = any, + Args = { requires?: Maybe> } +> = DirectiveResolverFn export type CommitResolvers< - ContextType = any, - ParentType extends ResolversParentTypes['Commit'] = ResolversParentTypes['Commit'] - = { - id?: Resolver - message?: Resolver, ParentType, ContextType> - username?: Resolver, ParentType, ContextType> - + ContextType = any, + ParentType extends ResolversParentTypes['Commit'] = ResolversParentTypes['Commit'] +> = { + id?: Resolver + message?: Resolver, ParentType, ContextType> + username?: Resolver, ParentType, ContextType> +} export type CreateTutorialVersionOutputResolvers< - ContextType = any, - ParentType extends ResolversParentTypes['createTutorialVersionOutput'] = ResolversParentTypes['createTutorialVersionOutput'] - = { - success?: Resolver, ParentType, ContextType> - + ContextType = any, + ParentType extends ResolversParentTypes['createTutorialVersionOutput'] = ResolversParentTypes['createTutorialVersionOutput'] +> = { + success?: Resolver, ParentType, ContextType> +} export interface DateTimeScalarConfig extends GraphQLScalarTypeConfig { - name: 'DateTime' + name: 'DateTime' } export type EditorLoginOutputResolvers< - ContextType = any, - ParentType extends ResolversParentTypes['editorLoginOutput'] = ResolversParentTypes['editorLoginOutput'] - = { - user?: Resolver - token?: Resolver - + ContextType = any, + ParentType extends ResolversParentTypes['editorLoginOutput'] = ResolversParentTypes['editorLoginOutput'] +> = { + user?: Resolver + token?: Resolver +} export type GithubUserResolvers< - ContextType = any, - ParentType extends ResolversParentTypes['GithubUser'] = ResolversParentTypes['GithubUser'] - = { - id?: Resolver - name?: Resolver, ParentType, ContextType> - email?: Resolver, ParentType, ContextType> - location?: Resolver, ParentType, ContextType> - avatarUrl?: Resolver, ParentType, ContextType> - + ContextType = any, + ParentType extends ResolversParentTypes['GithubUser'] = ResolversParentTypes['GithubUser'] +> = { + id?: Resolver + name?: Resolver, ParentType, ContextType> + email?: Resolver, ParentType, ContextType> + location?: Resolver, ParentType, ContextType> + avatarUrl?: Resolver, ParentType, ContextType> +} export interface JsonScalarConfig extends GraphQLScalarTypeConfig { - name: 'JSON' + name: 'JSON' } export interface JsonObjectScalarConfig extends GraphQLScalarTypeConfig { - name: 'JSONObject' + name: 'JSONObject' } export type LevelResolvers< - ContextType = any, - ParentType extends ResolversParentTypes['Level'] = ResolversParentTypes['Level'] - = { - id?: Resolver - title?: Resolver - description?: Resolver - content?: Resolver - steps?: Resolver, ParentType, ContextType> - setup?: Resolver, ParentType, ContextType> - + ContextType = any, + ParentType extends ResolversParentTypes['Level'] = ResolversParentTypes['Level'] +> = { + id?: Resolver + title?: Resolver + description?: Resolver + content?: Resolver + steps?: Resolver, ParentType, ContextType> + setup?: Resolver, ParentType, ContextType> +} export type MutationResolvers< - ContextType = any, - ParentType extends ResolversParentTypes['Mutation'] = ResolversParentTypes['Mutation'] - = { - editorLogin?: Resolver< - Maybe, - ParentType, - ContextType, - RequireFields - > - createTutorialVersion?: Resolver< - Maybe, - ParentType, - ContextType, - RequireFields - > - + ContextType = any, + ParentType extends ResolversParentTypes['Mutation'] = ResolversParentTypes['Mutation'] +> = { + editorLogin?: Resolver< + Maybe, + ParentType, + ContextType, + RequireFields + > + createTutorialVersion?: Resolver< + Maybe, + ParentType, + ContextType, + RequireFields + > +} export type QueryResolvers< - ContextType = any, - ParentType extends ResolversParentTypes['Query'] = ResolversParentTypes['Query'] - = { - tutorial?: Resolver< - Maybe, - ParentType, - ContextType, - RequireFields - > - tutorials?: Resolver>>, ParentType, ContextType> - viewer?: Resolver, ParentType, ContextType> - commits?: Resolver< - Array>, - ParentType, - ContextType, - RequireFields - > - + ContextType = any, + ParentType extends ResolversParentTypes['Query'] = ResolversParentTypes['Query'] +> = { + tutorial?: Resolver< + Maybe, + ParentType, + ContextType, + RequireFields + > + tutorials?: Resolver>>, ParentType, ContextType> + viewer?: Resolver, ParentType, ContextType> + commits?: Resolver< + Array>, + ParentType, + ContextType, + RequireFields + > +} export interface Sha1ScalarConfig extends GraphQLScalarTypeConfig { - name: 'Sha1' + name: 'Sha1' } export type StepResolvers< - ContextType = any, - ParentType extends ResolversParentTypes['Step'] = ResolversParentTypes['Step'] - = { - id?: Resolver - content?: Resolver - setup?: Resolver - solution?: Resolver - + ContextType = any, + ParentType extends ResolversParentTypes['Step'] = ResolversParentTypes['Step'] +> = { + id?: Resolver + content?: Resolver + setup?: Resolver + solution?: Resolver +} export type StepActionsResolvers< - ContextType = any, - ParentType extends ResolversParentTypes['StepActions'] = ResolversParentTypes['StepActions'] - = { - id?: Resolver - commits?: Resolver, ParentType, ContextType> - files?: Resolver>, ParentType, ContextType> - commands?: Resolver>, ParentType, ContextType> - watchers?: Resolver>, ParentType, ContextType> - + ContextType = any, + ParentType extends ResolversParentTypes['StepActions'] = ResolversParentTypes['StepActions'] +> = { + id?: Resolver + commits?: Resolver, ParentType, ContextType> + files?: Resolver>, ParentType, ContextType> + commands?: Resolver>, ParentType, ContextType> + watchers?: Resolver>, ParentType, ContextType> +} export type TutorialResolvers< - ContextType = any, - ParentType extends ResolversParentTypes['Tutorial'] = ResolversParentTypes['Tutorial'] - = { - id?: Resolver - createdBy?: Resolver - createdAt?: Resolver - version?: Resolver - versions?: Resolver, ParentType, ContextType> - completed?: Resolver, ParentType, ContextType> - + ContextType = any, + ParentType extends ResolversParentTypes['Tutorial'] = ResolversParentTypes['Tutorial'] +> = { + id?: Resolver + createdBy?: Resolver + createdAt?: Resolver + version?: Resolver + versions?: Resolver, ParentType, ContextType> + completed?: Resolver, ParentType, ContextType> +} export type TutorialConfigResolvers< - ContextType = any, - ParentType extends ResolversParentTypes['TutorialConfig'] = ResolversParentTypes['TutorialConfig'] - = { - testRunner?: Resolver - repo?: Resolver - + ContextType = any, + ParentType extends ResolversParentTypes['TutorialConfig'] = ResolversParentTypes['TutorialConfig'] +> = { + testRunner?: Resolver + repo?: Resolver +} export type TutorialDataResolvers< - ContextType = any, - ParentType extends ResolversParentTypes['TutorialData'] = ResolversParentTypes['TutorialData'] - = { - config?: Resolver - init?: Resolver, ParentType, ContextType> - levels?: Resolver, ParentType, ContextType> - + ContextType = any, + ParentType extends ResolversParentTypes['TutorialData'] = ResolversParentTypes['TutorialData'] +> = { + config?: Resolver + init?: Resolver, ParentType, ContextType> + levels?: Resolver, ParentType, ContextType> +} export type TutorialInitResolvers< - ContextType = any, - ParentType extends ResolversParentTypes['TutorialInit'] = ResolversParentTypes['TutorialInit'] - = { - setup?: Resolver, ParentType, ContextType> - + ContextType = any, + ParentType extends ResolversParentTypes['TutorialInit'] = ResolversParentTypes['TutorialInit'] +> = { + setup?: Resolver, ParentType, ContextType> +} export type TutorialRepoResolvers< - ContextType = any, - ParentType extends ResolversParentTypes['TutorialRepo'] = ResolversParentTypes['TutorialRepo'] - = { - uri?: Resolver - branch?: Resolver - name?: Resolver, ParentType, ContextType> - owner?: Resolver, ParentType, ContextType> - + ContextType = any, + ParentType extends ResolversParentTypes['TutorialRepo'] = ResolversParentTypes['TutorialRepo'] +> = { + uri?: Resolver + branch?: Resolver + name?: Resolver, ParentType, ContextType> + owner?: Resolver, ParentType, ContextType> +} export type TutorialSummaryResolvers< - ContextType = any, - ParentType extends ResolversParentTypes['TutorialSummary'] = ResolversParentTypes['TutorialSummary'] - = { - title?: Resolver - description?: Resolver - + ContextType = any, + ParentType extends ResolversParentTypes['TutorialSummary'] = ResolversParentTypes['TutorialSummary'] +> = { + title?: Resolver + description?: Resolver +} export type TutorialTestRunnerResolvers< - ContextType = any, - ParentType extends ResolversParentTypes['TutorialTestRunner'] = ResolversParentTypes['TutorialTestRunner'] - = { - command?: Resolver - fileFormats?: Resolver>, ParentType, ContextType> - + ContextType = any, + ParentType extends ResolversParentTypes['TutorialTestRunner'] = ResolversParentTypes['TutorialTestRunner'] +> = { + command?: Resolver + fileFormats?: Resolver>, ParentType, ContextType> +} export type TutorialVersionResolvers< - ContextType = any, - ParentType extends ResolversParentTypes['TutorialVersion'] = ResolversParentTypes['TutorialVersion'] - = { - tutorialId?: Resolver - version?: Resolver - createdAt?: Resolver - createdBy?: Resolver - updatedBy?: Resolver - updatedAt?: Resolver - publishedAt?: Resolver, ParentType, ContextType> - publishedBy?: Resolver, ParentType, ContextType> - summary?: Resolver - data?: Resolver - completed?: Resolver, ParentType, ContextType> - + ContextType = any, + ParentType extends ResolversParentTypes['TutorialVersion'] = ResolversParentTypes['TutorialVersion'] +> = { + tutorialId?: Resolver + version?: Resolver + createdAt?: Resolver + createdBy?: Resolver + updatedBy?: Resolver + updatedAt?: Resolver + publishedAt?: Resolver, ParentType, ContextType> + publishedBy?: Resolver, ParentType, ContextType> + summary?: Resolver + data?: Resolver + completed?: Resolver, ParentType, ContextType> +} export type UserResolvers< - ContextType = any, - ParentType extends ResolversParentTypes['User'] = ResolversParentTypes['User'] - = { - id?: Resolver - name?: Resolver, ParentType, ContextType> - email?: Resolver, ParentType, ContextType> - location?: Resolver, ParentType, ContextType> - avatarUrl?: Resolver, ParentType, ContextType> - createdAt?: Resolver - updatedAt?: Resolver - githubUser?: Resolver, ParentType, ContextType> - + ContextType = any, + ParentType extends ResolversParentTypes['User'] = ResolversParentTypes['User'] +> = { + id?: Resolver + name?: Resolver, ParentType, ContextType> + email?: Resolver, ParentType, ContextType> + location?: Resolver, ParentType, ContextType> + avatarUrl?: Resolver, ParentType, ContextType> + createdAt?: Resolver + updatedAt?: Resolver + githubUser?: Resolver, ParentType, ContextType> +} export type Resolvers = { - Commit?: CommitResolvers - createTutorialVersionOutput?: CreateTutorialVersionOutputResolvers - DateTime?: GraphQLScalarType - editorLoginOutput?: EditorLoginOutputResolvers - GithubUser?: GithubUserResolvers - JSON?: GraphQLScalarType - JSONObject?: GraphQLScalarType - Level?: LevelResolvers - Mutation?: MutationResolvers - Query?: QueryResolvers - Sha1?: GraphQLScalarType - Step?: StepResolvers - StepActions?: StepActionsResolvers - Tutorial?: TutorialResolvers - TutorialConfig?: TutorialConfigResolvers - TutorialData?: TutorialDataResolvers - TutorialInit?: TutorialInitResolvers - TutorialRepo?: TutorialRepoResolvers - TutorialSummary?: TutorialSummaryResolvers - TutorialTestRunner?: TutorialTestRunnerResolvers - TutorialVersion?: TutorialVersionResolvers - User?: UserResolvers - } + Commit?: CommitResolvers + createTutorialVersionOutput?: CreateTutorialVersionOutputResolvers + DateTime?: GraphQLScalarType + editorLoginOutput?: EditorLoginOutputResolvers + GithubUser?: GithubUserResolvers + JSON?: GraphQLScalarType + JSONObject?: GraphQLScalarType + Level?: LevelResolvers + Mutation?: MutationResolvers + Query?: QueryResolvers + Sha1?: GraphQLScalarType + Step?: StepResolvers + StepActions?: StepActionsResolvers + Tutorial?: TutorialResolvers + TutorialConfig?: TutorialConfigResolvers + TutorialData?: TutorialDataResolvers + TutorialInit?: TutorialInitResolvers + TutorialRepo?: TutorialRepoResolvers + TutorialSummary?: TutorialSummaryResolvers + TutorialTestRunner?: TutorialTestRunnerResolvers + TutorialVersion?: TutorialVersionResolvers + User?: UserResolvers +} /** * @deprecated @@ -641,7 +640,7 @@ export type Resolvers = { */ export type IResolvers = Resolvers export type DirectiveResolvers = { - auth?: AuthDirectiveResolver + auth?: AuthDirectiveResolver } /** @@ -651,13 +650,13 @@ export type DirectiveResolvers = { export type IDirectiveResolvers = DirectiveResolvers export interface IntrospectionResultData { - __schema: { - types: { - kind: string - name: string - possibleTypes: { - name: string - }[] - }[] - } + __schema: { + types: { + kind: string + name: string + possibleTypes: { + name: string + }[] + }[] + } } From 52e0d9959fa9927cd02da546a66d4a603cab9308 Mon Sep 17 00:00:00 2001 From: shmck Date: Sat, 16 Nov 2019 16:08:17 -0800 Subject: [PATCH 6/6] clenaup loadWatcher code --- src/actions/utils/loadWatchers.ts | 8 +++++--- src/channel/index.ts | 2 +- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/actions/utils/loadWatchers.ts b/src/actions/utils/loadWatchers.ts index 59589253..7504d5ef 100644 --- a/src/actions/utils/loadWatchers.ts +++ b/src/actions/utils/loadWatchers.ts @@ -29,19 +29,21 @@ const loadWatchers = (watchers: string[], workspaceUri: vscode.Uri) => { return } - const listener: chokidar.FSWatcher = chokidar.watch(watcher, { + const fsWatcher: chokidar.FSWatcher = chokidar.watch(watcher, { cwd: rootUri.uri.path, interval: 1000, }) - listener.on('change', (path, event) => { + fsWatcher.on('change', (path, event) => { vscode.commands.executeCommand(COMMANDS.RUN_TEST, null, () => { // cleanup watcher on success disposeWatcher(watcher) }) }) - watcherObject[watcher] = listener + // key fs watcher on name + // to easily add/remove multiple watchers + watcherObject[watcher] = fsWatcher } } } diff --git a/src/channel/index.ts b/src/channel/index.ts index 7864cf71..72dde390 100644 --- a/src/channel/index.ts +++ b/src/channel/index.ts @@ -82,7 +82,7 @@ class Channel implements Channel { // configure test runner, language, git case 'EDITOR_TUTORIAL_CONFIG': const tutorialData: G.Tutorial = action.payload.tutorial - // setup tutorial config (save listener, test runner, etc) + // setup tutorial config (save watcher, test runner, etc) this.context.setTutorial(this.workspaceState, tutorialData) const data: G.TutorialData = tutorialData.version.data