From 323b04d27415f7ff6ca030919434bf3c3d83aa98 Mon Sep 17 00:00:00 2001 From: Stanislav Lvovsky Date: Wed, 17 Jun 2020 10:54:38 +0300 Subject: [PATCH] pass data object to generator + restore project creation from template panel bug fix (#303) * pass data to generator * logic * save state * save state * update coverage * Update package.json * update logic * add unit tests * Update extension.ts --- backend/package.json | 2 +- backend/src/extension.ts | 7 ++++--- backend/src/yeomanui.ts | 3 ++- frontend/jest.config.js | 8 ++++---- frontend/src/App.vue | 27 +++++++++++++++++++-------- frontend/tests/App.spec.js | 34 ++++++++++++++++++++++++++++++++++ 6 files changed, 64 insertions(+), 17 deletions(-) diff --git a/backend/package.json b/backend/package.json index 5664dc49..593628e8 100644 --- a/backend/package.json +++ b/backend/package.json @@ -1,6 +1,6 @@ { "name": "yeoman-ui", - "version": "1.0.15", + "version": "1.0.16", "displayName": "Application Wizard", "publisher": "SAPOS", "author": { diff --git a/backend/src/extension.ts b/backend/src/extension.ts index 429c4b43..29834dc9 100644 --- a/backend/src/extension.ts +++ b/backend/src/extension.ts @@ -35,7 +35,8 @@ export function activate(context: vscode.ExtensionContext) { context.subscriptions.push(vscode.commands.registerCommand("yeomanUI.toggleOutput", YeomanUIPanel.toggleOutput)); vscode.window.registerWebviewPanelSerializer(YeomanUIPanel.viewType, { - async deserializeWebviewPanel(webviewPanel: vscode.WebviewPanel, state: any) { + async deserializeWebviewPanel(webviewPanel: vscode.WebviewPanel, state?: any) { + _.set(state, "filter", _.get(state, "genFilter")); YeomanUIPanel.setCurrentPanel(webviewPanel, state); } }); @@ -72,7 +73,7 @@ export class YeomanUIPanel { if (displayedPanel) { displayedPanel.dispose(); } - + YeomanUIPanel.create(uiOptions); } @@ -129,7 +130,7 @@ export class YeomanUIPanel { vscodeYouiEvents, outputChannel, this.logger, - {genFilter: this.genFilter, messages: this.messages, defaultNpmPaths}, + {genFilter: this.genFilter, messages: this.messages, data: _.get(uiOptions, "data"), defaultNpmPaths}, _.get(vscode, "workspace.workspaceFolders[0].uri.fsPath")); this.yeomanui.registerCustomQuestionEventHandler("file-browser", "getFilePath", this.showOpenFileDialog.bind(this)); this.yeomanui.registerCustomQuestionEventHandler("folder-browser", "getPath", this.showOpenFolderDialog.bind(this)); diff --git a/backend/src/yeomanui.ts b/backend/src/yeomanui.ts index 4657d13d..e187b011 100644 --- a/backend/src/yeomanui.ts +++ b/backend/src/yeomanui.ts @@ -171,7 +171,8 @@ export class YeomanUI { const genNamespace = this.getGenNamespace(generatorName); const options = { logger: this.logger.getChildLogger({label: generatorName}), - vscode: this.getVscode() // TODO: remove this temporary workaround once a better solution is found + vscode: this.getVscode(), // TODO: remove this temporary workaround once a better solution is found, + data: this.uiOptions.data }; const gen: any = env.create(genNamespace, {options}); // check if generator defined a helper function called setPromptsCallback() diff --git a/frontend/jest.config.js b/frontend/jest.config.js index 102505ed..c943a7d8 100644 --- a/frontend/jest.config.js +++ b/frontend/jest.config.js @@ -36,10 +36,10 @@ module.exports = { ], coverageThreshold: { "global": { - "branches": 97.9, - "functions": 97.6, - "lines": 96.9, - "statements": 96.9 + "branches": 93, + "functions": 100, + "lines": 96, + "statements": 96 } } } diff --git a/frontend/src/App.vue b/frontend/src/App.vue index 93efb31a..6fc421c4 100644 --- a/frontend/src/App.vue +++ b/frontend/src/App.vue @@ -345,12 +345,20 @@ export default { isInVsCode() { return typeof acquireVsCodeApi !== "undefined"; }, + getVsCodeApi() { + if (this.isInVsCode()) { + if (!window.vscode) { + // eslint-disable-next-line + window.vscode = acquireVsCodeApi(); + } + + return window.vscode; + } + }, setupRpc() { /* istanbul ignore if */ if (this.isInVsCode()) { - // eslint-disable-next-line - window.vscode = acquireVsCodeApi(); - this.rpc = new RpcBrowser(window, window.vscode); + this.rpc = new RpcBrowser(window, this.getVsCodeApi()); this.initRpc(); } else { const ws = new WebSocket("ws://127.0.0.1:8081"); @@ -379,9 +387,16 @@ export default { this.displayGeneratorsPrompt(); }, - async displayGeneratorsPrompt() { + async setMessagesAndSaveState() { const uiOptions = await this.rpc.invoke("getState"); this.messages = uiOptions.messages; + const vscodeApi = this.getVsCodeApi(); + if (vscodeApi) { + vscodeApi.setState(uiOptions); + } + }, + async displayGeneratorsPrompt() { + await this.setMessagesAndSaveState(); await this.rpc.invoke("receiveIsWebviewReady", []); }, toggleConsole() { @@ -424,10 +439,6 @@ export default { this.init(); this.displayGeneratorsPrompt(); - }, - async setMessages() { - const state = await this.rpc.invoke("getState"); - this.messages = state.messages; } }, created() { diff --git a/frontend/tests/App.spec.js b/frontend/tests/App.spec.js index 01f9476a..df885e85 100644 --- a/frontend/tests/App.spec.js +++ b/frontend/tests/App.spec.js @@ -31,6 +31,40 @@ describe('App.vue', () => { }) }) + describe('getVsCodeApi - method', () => { + it('not in vscode', () => { + wrapper = initComponent(App, {}, true) + wrapper.vm.isInVsCode = () => false; + const vscodeApi = wrapper.vm.getVsCodeApi(); + expect(vscodeApi).toBeUndefined(); + }) + }) + + describe('setMessagesAndSaveState - method', () => { + it('vscode api exists', async () => { + wrapper = initComponent(App, {}, true) + wrapper.vm.rpc = { + invoke: jest.fn().mockImplementation(async () => { return {data: {}};}) + } + wrapper.vm.getVsCodeApi = () => { + return {setState: () => true}; + }; + wrapper.vm.setMessagesAndSaveState(); + }) + + it('vscode api no exists', async () => { + wrapper = initComponent(App, {}, true) + wrapper.vm.rpc = { + invoke: () => new Promise({data: {}}) + } + wrapper.vm.rpc = { + invoke: jest.fn().mockImplementation(async () => { return {data: {}};}) + } + wrapper.vm.getVsCodeApi = () => undefined; + wrapper.vm.setMessagesAndSaveState(); + }) + }) + describe('setQuestionProps - method', () => { it('set props', async () => { wrapper = initComponent(App, {}, true)