From f31c207f42fdf08c9b4c4380524384891ac28e76 Mon Sep 17 00:00:00 2001 From: Delmer Reed Date: Mon, 18 Jun 2018 15:22:55 -0400 Subject: [PATCH 1/6] Check for yields before filter and range funcs in expression Co-authored-by: Iris Scholten --- ui/src/flux/components/ExpressionNode.tsx | 40 ++++++++++++++++++++--- 1 file changed, 36 insertions(+), 4 deletions(-) diff --git a/ui/src/flux/components/ExpressionNode.tsx b/ui/src/flux/components/ExpressionNode.tsx index 8275fd6cf7..fab99cf98a 100644 --- a/ui/src/flux/components/ExpressionNode.tsx +++ b/ui/src/flux/components/ExpressionNode.tsx @@ -18,10 +18,12 @@ interface Props { onDeleteBody: (bodyID: string) => void } +interface YieldToggles { + [x: number]: boolean +} + interface State { - nonYieldableIndexesToggled: { - [x: number]: boolean - } + nonYieldableIndexesToggled: YieldToggles isImplicitYieldToggled: boolean } @@ -31,7 +33,7 @@ class ExpressionNode extends PureComponent { super(props) this.state = { - nonYieldableIndexesToggled: {}, + nonYieldableIndexesToggled: this.nonYieldableNodesFromScript, isImplicitYieldToggled: this.isImplicitYieldToggled, } } @@ -210,6 +212,36 @@ class ExpressionNode extends PureComponent { return false } + private get nonYieldableNodesFromScript(): YieldToggles { + const {funcs} = this.props + let isBeforeFilter = true + let isBeforeRange = true + + return _.reduce( + funcs, + (acc: YieldToggles, f, index) => { + if (f.name === 'range') { + isBeforeRange = false + } + + if (f.name === 'filter') { + isBeforeFilter = false + } + + if (isBeforeFilter || isBeforeRange) { + const nextNode = _.get(funcs, `${index + 1}`, null) + + if (nextNode && nextNode.name === 'yield') { + return {...acc, [index]: true} + } + } + + return acc + }, + {} + ) + } + private get isImplicitYieldToggled(): boolean { const {isLastBody} = this.props From 463e2a98a14a6a7ed0e6ca7c516db608d02785aa Mon Sep 17 00:00:00 2001 From: Delmer Reed Date: Mon, 18 Jun 2018 19:14:07 -0400 Subject: [PATCH 2/6] Add response error handling in builder Co-authored-by: Iris Scholten --- ui/src/flux/apis/index.ts | 28 +++++++++++++++++++---- ui/src/flux/components/ExpressionNode.tsx | 15 ++++++++++++ ui/src/flux/components/FuncNode.tsx | 7 +++++- ui/src/shared/parsing/flux/response.ts | 13 +++++++++++ 4 files changed, 57 insertions(+), 6 deletions(-) diff --git a/ui/src/flux/apis/index.ts b/ui/src/flux/apis/index.ts index 65d5d5661f..e2232d360c 100644 --- a/ui/src/flux/apis/index.ts +++ b/ui/src/flux/apis/index.ts @@ -3,7 +3,10 @@ import _ from 'lodash' import AJAX from 'src/utils/ajax' import {Service, FluxTable} from 'src/types' import {updateService} from 'src/shared/apis' -import {parseResponse} from 'src/shared/parsing/flux/response' +import { + parseResponse, + parseResponseError, +} from 'src/shared/parsing/flux/response' import {MAX_RESPONSE_BYTES} from 'src/flux/constants' export const getSuggestions = async (url: string) => { @@ -56,6 +59,9 @@ export const getTimeSeries = async ( service.links.proxy }?path=/v1/query${mark}orgName=defaulorgname${and}q=${garbage}` + let responseBody: string + let responseByteLength: number + try { // We are using the `fetch` API here since the `AJAX` utility lacks support // for limiting response size. The `AJAX` utility depends on @@ -66,16 +72,28 @@ export const getTimeSeries = async ( const resp = await fetch(url, {method: 'POST'}) const {body, byteLength} = await decodeFluxRespWithLimit(resp) - return { - tables: parseResponse(body), - didTruncate: byteLength >= MAX_RESPONSE_BYTES, - } + responseBody = body + responseByteLength = byteLength } catch (error) { console.error('Problem fetching data', error) throw _.get(error, 'headers.x-influx-error', false) || _.get(error, 'data.message', 'unknown error 🤷') } + + try { + return { + tables: parseResponse(responseBody), + didTruncate: responseByteLength >= MAX_RESPONSE_BYTES, + } + } catch (error) { + console.error('Could not parse response body', error) + + return { + tables: parseResponseError(responseBody), + didTruncate: false, + } + } } export const updateScript = async (service: Service, script: string) => { diff --git a/ui/src/flux/components/ExpressionNode.tsx b/ui/src/flux/components/ExpressionNode.tsx index fab99cf98a..6bb1dda1ed 100644 --- a/ui/src/flux/components/ExpressionNode.tsx +++ b/ui/src/flux/components/ExpressionNode.tsx @@ -38,6 +38,17 @@ class ExpressionNode extends PureComponent { } } + public componentDidUpdate(prevProps) { + const {funcs: prevFuncs} = prevProps + const {funcs} = this.props + + if (!_.isEqual(prevFuncs, funcs)) { + this.setState({ + nonYieldableIndexesToggled: this.nonYieldableNodesFromScript, + }) + } + } + public render() { const { declarationID, @@ -122,6 +133,10 @@ class ExpressionNode extends PureComponent { false ) + if (this.isBeforeFuncYield(i)) { + return funcNode + } + return ( {funcNode} diff --git a/ui/src/flux/components/FuncNode.tsx b/ui/src/flux/components/FuncNode.tsx index 0eeefd0762..56c3f2458d 100644 --- a/ui/src/flux/components/FuncNode.tsx +++ b/ui/src/flux/components/FuncNode.tsx @@ -184,12 +184,17 @@ export default class FuncNode extends PureComponent { declarationID, isYieldable, onToggleYieldWithLast, + isYielding, } = this.props if (isYieldable) { onToggleYield(bodyID, declarationID, index) } else { - onToggleYieldWithLast(index) + if (isYielding) { + onToggleYield(bodyID, declarationID, index) + } else { + onToggleYieldWithLast(index) + } } } diff --git a/ui/src/shared/parsing/flux/response.ts b/ui/src/shared/parsing/flux/response.ts index 5f9f369a67..b56f964ac2 100644 --- a/ui/src/shared/parsing/flux/response.ts +++ b/ui/src/shared/parsing/flux/response.ts @@ -4,6 +4,19 @@ import uuid from 'uuid' import {FluxTable} from 'src/types' +export const parseResponseError = (response: string): FluxTable[] => { + const {data} = Papa.parse(response.trim()) + + return [ + { + id: uuid.v4(), + name: 'Error', + partitionKey: {}, + data, + }, + ] +} + export const parseResponse = (response: string): FluxTable[] => { const trimmedReponse = response.trim() From e50801634b6726e50bce7e009c7b060de4d4a3cd Mon Sep 17 00:00:00 2001 From: Delmer Reed Date: Tue, 19 Jun 2018 12:53:01 -0400 Subject: [PATCH 3/6] Update FuncNode toggle to check when script yields Updating FuncNode toggle to use a prop to determine when toggling the script yield or yield with last in the ExpressionNode. The is Yielding prop is not ineffective for determining how to toggle a FuncNode. This also fixes an issue where toggling was not updating FuncMenu styles. --- ui/src/flux/components/ExpressionNode.tsx | 33 +++++++++++++++-------- ui/src/flux/components/FuncNode.tsx | 12 +++------ 2 files changed, 26 insertions(+), 19 deletions(-) diff --git a/ui/src/flux/components/ExpressionNode.tsx b/ui/src/flux/components/ExpressionNode.tsx index 6bb1dda1ed..5fe996ea35 100644 --- a/ui/src/flux/components/ExpressionNode.tsx +++ b/ui/src/flux/components/ExpressionNode.tsx @@ -116,7 +116,8 @@ class ExpressionNode extends PureComponent { onDelete={onDeleteFuncNode} onToggleYield={onToggleYield} isYieldable={isAfterFilter && isAfterRange} - isYielding={this.isBeforeFuncYield(i)} + isYielding={this.isBeforeYielding(i)} + isYieldedInScript={this.isYieldNodeIndex(i + 1)} declarationID={declarationID} onGenerateScript={onGenerateScript} declarationsFromBody={declarationsFromBody} @@ -125,7 +126,10 @@ class ExpressionNode extends PureComponent { /> ) - if (nonYieldableIndexesToggled[i]) { + if ( + nonYieldableIndexesToggled[i] && + !this.isYieldNodeIndex(i + 1) + ) { const script = scriptUpToYield( bodyID, declarationID, @@ -133,10 +137,6 @@ class ExpressionNode extends PureComponent { false ) - if (this.isBeforeFuncYield(i)) { - return funcNode - } - return ( {funcNode} @@ -167,7 +167,8 @@ class ExpressionNode extends PureComponent { onDelete={onDeleteFuncNode} onToggleYield={this.handleHideImplicitYield} isYieldable={isAfterFilter && isAfterRange} - isYielding={this.isBeforeFuncYield(i)} + isYielding={this.isBeforeYielding(i)} + isYieldedInScript={this.isYieldNodeIndex(i + 1)} declarationID={declarationID} onGenerateScript={onGenerateScript} declarationsFromBody={declarationsFromBody} @@ -202,9 +203,14 @@ class ExpressionNode extends PureComponent { ) } - private isBeforeFuncYield(funcIndex: number): boolean { + private isBeforeYielding(funcIndex: number): boolean { const {funcs, isLastBody} = this.props - const {isImplicitYieldToggled} = this.state + const {isImplicitYieldToggled, nonYieldableIndexesToggled} = this.state + const beforeToggledLastYield = !!nonYieldableIndexesToggled[funcIndex] + + if (beforeToggledLastYield) { + return true + } if ( funcIndex === funcs.length - 1 && @@ -218,9 +224,14 @@ class ExpressionNode extends PureComponent { return false } - const nextFunc = funcs[funcIndex + 1] + return this.isYieldNodeIndex(funcIndex + 1) + } - if (nextFunc.name === 'yield') { + private isYieldNodeIndex(funcIndex) { + const {funcs} = this.props + const nextFunc = _.get(funcs, `${funcIndex}`, null) + + if (nextFunc && nextFunc.name === 'yield') { return true } diff --git a/ui/src/flux/components/FuncNode.tsx b/ui/src/flux/components/FuncNode.tsx index 56c3f2458d..e116dd249e 100644 --- a/ui/src/flux/components/FuncNode.tsx +++ b/ui/src/flux/components/FuncNode.tsx @@ -30,6 +30,7 @@ interface Props { isYielding: boolean isYieldable: boolean onDeleteBody: (bodyID: string) => void + isYieldedInScript: boolean } interface State { @@ -182,19 +183,14 @@ export default class FuncNode extends PureComponent { index, bodyID, declarationID, - isYieldable, onToggleYieldWithLast, - isYielding, + isYieldedInScript, } = this.props - if (isYieldable) { + if (isYieldedInScript) { onToggleYield(bodyID, declarationID, index) } else { - if (isYielding) { - onToggleYield(bodyID, declarationID, index) - } else { - onToggleYieldWithLast(index) - } + onToggleYieldWithLast(index) } } From 2f216fd00107a13d1eb5be0ed87eed2110c714e8 Mon Sep 17 00:00:00 2001 From: Iris Scholten Date: Tue, 19 Jun 2018 11:44:42 -0700 Subject: [PATCH 4/6] Remove implicit yield functionality Co-authored-by: Delmer Reed --- ui/src/flux/components/ExpressionNode.tsx | 85 +---------------------- 1 file changed, 3 insertions(+), 82 deletions(-) diff --git a/ui/src/flux/components/ExpressionNode.tsx b/ui/src/flux/components/ExpressionNode.tsx index 5fe996ea35..b02fe494a0 100644 --- a/ui/src/flux/components/ExpressionNode.tsx +++ b/ui/src/flux/components/ExpressionNode.tsx @@ -24,7 +24,6 @@ interface YieldToggles { interface State { nonYieldableIndexesToggled: YieldToggles - isImplicitYieldToggled: boolean } // an Expression is a group of one or more functions @@ -34,7 +33,6 @@ class ExpressionNode extends PureComponent { this.state = { nonYieldableIndexesToggled: this.nonYieldableNodesFromScript, - isImplicitYieldToggled: this.isImplicitYieldToggled, } } @@ -151,44 +149,8 @@ class ExpressionNode extends PureComponent { /> ) - } else if (this.isEndOfScript(i)) { - const script = scriptUpToYield(bodyID, declarationID, i, true) - - return ( - - - - - ) - } else { - return funcNode } + return funcNode })} { } private isBeforeYielding(funcIndex: number): boolean { - const {funcs, isLastBody} = this.props - const {isImplicitYieldToggled, nonYieldableIndexesToggled} = this.state + const {nonYieldableIndexesToggled} = this.state const beforeToggledLastYield = !!nonYieldableIndexesToggled[funcIndex] if (beforeToggledLastYield) { return true } - if ( - funcIndex === funcs.length - 1 && - isLastBody && - isImplicitYieldToggled - ) { - return true - } - - if (funcIndex === funcs.length - 1) { - return false - } - return this.isYieldNodeIndex(funcIndex + 1) } @@ -255,9 +204,7 @@ class ExpressionNode extends PureComponent { } if (isBeforeFilter || isBeforeRange) { - const nextNode = _.get(funcs, `${index + 1}`, null) - - if (nextNode && nextNode.name === 'yield') { + if (this.isYieldNodeIndex(index + 1)) { return {...acc, [index]: true} } } @@ -268,18 +215,6 @@ class ExpressionNode extends PureComponent { ) } - private get isImplicitYieldToggled(): boolean { - const {isLastBody} = this.props - - return isLastBody && this.isLastFuncYield - } - - private get isLastFuncYield(): boolean { - const {funcs} = this.props - - return _.get(funcs, `${funcs.length - 1}.name`) !== 'yield' - } - // if funcNode is not yieldable, add last before yield() private handleToggleYieldWithLast = (funcNodeIndex: number) => { this.setState(({nonYieldableIndexesToggled}) => { @@ -293,20 +228,6 @@ class ExpressionNode extends PureComponent { } }) } - - private handleHideImplicitYield = () => { - this.setState(() => ({ - isImplicitYieldToggled: false, - })) - } - - private isEndOfScript(index: number): boolean { - const {isLastBody, funcs} = this.props - const {isImplicitYieldToggled} = this.state - const isLastScriptFunc = isLastBody && index === funcs.length - 1 - - return isLastScriptFunc && isImplicitYieldToggled - } } export default ExpressionNode From 4e42fdcc35462346150fa443a4c9648cd409deea Mon Sep 17 00:00:00 2001 From: Delmer Reed Date: Wed, 20 Jun 2018 12:57:55 -0400 Subject: [PATCH 5/6] Remove duplicate before/after filter and range checks Removes component update checks for filter and range. ExpressionNode now renders with a check for filter and range and looks at the next func node index to determine how much script to pass to YieldFuncNode. FuncNodes also utilize a isYielding and isYieldingInScript to determine how to toggle yields. --- ui/src/flux/components/ExpressionNode.tsx | 99 +++++------------------ ui/src/flux/components/FuncArg.tsx | 4 +- ui/src/flux/components/FuncArgInput.tsx | 4 +- ui/src/flux/components/FuncArgs.tsx | 4 +- ui/src/flux/components/FuncNode.tsx | 6 +- ui/src/flux/containers/FluxPage.tsx | 2 +- ui/src/types/flux.ts | 2 +- 7 files changed, 34 insertions(+), 87 deletions(-) diff --git a/ui/src/flux/components/ExpressionNode.tsx b/ui/src/flux/components/ExpressionNode.tsx index b02fe494a0..b58232698b 100644 --- a/ui/src/flux/components/ExpressionNode.tsx +++ b/ui/src/flux/components/ExpressionNode.tsx @@ -1,12 +1,12 @@ import React, {PureComponent, Fragment} from 'react' -import _ from 'lodash' import {FluxContext} from 'src/flux/containers/FluxPage' import FuncSelector from 'src/flux/components/FuncSelector' import FuncNode from 'src/flux/components/FuncNode' import YieldFuncNode from 'src/flux/components/YieldFuncNode' +import {getDeep} from 'src/utils/wrappers' -import {Func} from 'src/types/flux' +import {Func, Context} from 'src/types/flux' interface Props { funcNames: any[] @@ -18,12 +18,10 @@ interface Props { onDeleteBody: (bodyID: string) => void } -interface YieldToggles { - [x: number]: boolean -} - interface State { - nonYieldableIndexesToggled: YieldToggles + nonYieldableIndexesToggled: { + [x: number]: boolean + } } // an Expression is a group of one or more functions @@ -32,18 +30,7 @@ class ExpressionNode extends PureComponent { super(props) this.state = { - nonYieldableIndexesToggled: this.nonYieldableNodesFromScript, - } - } - - public componentDidUpdate(prevProps) { - const {funcs: prevFuncs} = prevProps - const {funcs} = this.props - - if (!_.isEqual(prevFuncs, funcs)) { - this.setState({ - nonYieldableIndexesToggled: this.nonYieldableNodesFromScript, - }) + nonYieldableIndexesToggled: {}, } } @@ -70,13 +57,17 @@ class ExpressionNode extends PureComponent { service, data, scriptUpToYield, - }) => { + }: Context) => { let isAfterRange = false let isAfterFilter = false return ( <> {funcs.map((func, i) => { + if (func.name === 'yield') { + return null + } + if (func.name === 'range') { isAfterRange = true } @@ -85,22 +76,7 @@ class ExpressionNode extends PureComponent { isAfterFilter = true } - if (func.name === 'yield') { - const script = scriptUpToYield(bodyID, declarationID, i, true) - - return ( - - ) - } + const isYieldable = isAfterFilter && isAfterRange const funcNode = ( { onChangeArg={onChangeArg} onDelete={onDeleteFuncNode} onToggleYield={onToggleYield} - isYieldable={isAfterFilter && isAfterRange} + isYieldable={isYieldable} isYielding={this.isBeforeYielding(i)} isYieldedInScript={this.isYieldNodeIndex(i + 1)} declarationID={declarationID} @@ -125,14 +101,14 @@ class ExpressionNode extends PureComponent { ) if ( - nonYieldableIndexesToggled[i] && - !this.isYieldNodeIndex(i + 1) + nonYieldableIndexesToggled[i] || + this.isYieldNodeIndex(i + 1) ) { - const script = scriptUpToYield( + const script: string = scriptUpToYield( bodyID, declarationID, i, - false + isYieldable ) return ( @@ -150,6 +126,7 @@ class ExpressionNode extends PureComponent { ) } + return funcNode })} { return this.isYieldNodeIndex(funcIndex + 1) } - private isYieldNodeIndex(funcIndex) { + private isYieldNodeIndex(funcIndex: number): boolean { const {funcs} = this.props - const nextFunc = _.get(funcs, `${funcIndex}`, null) + const funcName = getDeep(funcs, `${funcIndex}.name`, '') - if (nextFunc && nextFunc.name === 'yield') { - return true - } - - return false - } - - private get nonYieldableNodesFromScript(): YieldToggles { - const {funcs} = this.props - let isBeforeFilter = true - let isBeforeRange = true - - return _.reduce( - funcs, - (acc: YieldToggles, f, index) => { - if (f.name === 'range') { - isBeforeRange = false - } - - if (f.name === 'filter') { - isBeforeFilter = false - } - - if (isBeforeFilter || isBeforeRange) { - if (this.isYieldNodeIndex(index + 1)) { - return {...acc, [index]: true} - } - } - - return acc - }, - {} - ) + return funcName === 'yield' } // if funcNode is not yieldable, add last before yield() - private handleToggleYieldWithLast = (funcNodeIndex: number) => { + private handleToggleYieldWithLast = (funcNodeIndex: number): void => { this.setState(({nonYieldableIndexesToggled}) => { const isFuncYieldToggled = !!nonYieldableIndexesToggled[funcNodeIndex] diff --git a/ui/src/flux/components/FuncArg.tsx b/ui/src/flux/components/FuncArg.tsx index 06eb8f2fec..b02c9e4f1e 100644 --- a/ui/src/flux/components/FuncArg.tsx +++ b/ui/src/flux/components/FuncArg.tsx @@ -8,7 +8,7 @@ import {ErrorHandling} from 'src/shared/decorators/errors' import FromDatabaseDropdown from 'src/flux/components/FromDatabaseDropdown' import {funcNames, argTypes} from 'src/flux/constants' -import {OnChangeArg, Arg} from 'src/types/flux' +import {OnChangeArg, Arg, OnGenerateScript} from 'src/types/flux' import {Service} from 'src/types' interface Props { @@ -22,7 +22,7 @@ interface Props { bodyID: string declarationID: string onChangeArg: OnChangeArg - onGenerateScript: () => void + onGenerateScript: OnGenerateScript } @ErrorHandling diff --git a/ui/src/flux/components/FuncArgInput.tsx b/ui/src/flux/components/FuncArgInput.tsx index eb6ce7622b..e649e7c2e0 100644 --- a/ui/src/flux/components/FuncArgInput.tsx +++ b/ui/src/flux/components/FuncArgInput.tsx @@ -1,6 +1,6 @@ import React, {PureComponent, ChangeEvent, KeyboardEvent} from 'react' import {ErrorHandling} from 'src/shared/decorators/errors' -import {OnChangeArg} from 'src/types/flux' +import {OnChangeArg, OnGenerateScript} from 'src/types/flux' interface Props { funcID: string @@ -10,7 +10,7 @@ interface Props { bodyID: string declarationID: string onChangeArg: OnChangeArg - onGenerateScript: () => void + onGenerateScript: OnGenerateScript autoFocus?: boolean } diff --git a/ui/src/flux/components/FuncArgs.tsx b/ui/src/flux/components/FuncArgs.tsx index e01aca54aa..bcc72c9be9 100644 --- a/ui/src/flux/components/FuncArgs.tsx +++ b/ui/src/flux/components/FuncArgs.tsx @@ -2,7 +2,7 @@ import React, {PureComponent, ReactElement, MouseEvent} from 'react' import FuncArg from 'src/flux/components/FuncArg' import {OnChangeArg} from 'src/types/flux' import {ErrorHandling} from 'src/shared/decorators/errors' -import {Func} from 'src/types/flux' +import {Func, OnGenerateScript} from 'src/types/flux' import {funcNames} from 'src/flux/constants' import JoinArgs from 'src/flux/components/JoinArgs' import FilterArgs from 'src/flux/components/FilterArgs' @@ -15,7 +15,7 @@ interface Props { bodyID: string onChangeArg: OnChangeArg declarationID: string - onGenerateScript: () => void + onGenerateScript: OnGenerateScript declarationsFromBody: string[] onStopPropagation: (e: MouseEvent) => void } diff --git a/ui/src/flux/components/FuncNode.tsx b/ui/src/flux/components/FuncNode.tsx index e116dd249e..fc2607577e 100644 --- a/ui/src/flux/components/FuncNode.tsx +++ b/ui/src/flux/components/FuncNode.tsx @@ -6,6 +6,7 @@ import BodyDelete from 'src/flux/components/BodyDelete' import FuncArgs from 'src/flux/components/FuncArgs' import FuncArgsPreview from 'src/flux/components/FuncArgsPreview' import { + OnGenerateScript, OnDeleteFuncNode, OnChangeArg, OnToggleYield, @@ -24,7 +25,7 @@ interface Props { onDelete: OnDeleteFuncNode onToggleYield: OnToggleYield onChangeArg: OnChangeArg - onGenerateScript: () => void + onGenerateScript: OnGenerateScript onToggleYieldWithLast: (funcNodeIndex: number) => void declarationsFromBody: string[] isYielding: boolean @@ -184,10 +185,11 @@ export default class FuncNode extends PureComponent { bodyID, declarationID, onToggleYieldWithLast, + isYieldable, isYieldedInScript, } = this.props - if (isYieldedInScript) { + if (isYieldedInScript || isYieldable) { onToggleYield(bodyID, declarationID, index) } else { onToggleYieldWithLast(index) diff --git a/ui/src/flux/containers/FluxPage.tsx b/ui/src/flux/containers/FluxPage.tsx index 24be296328..59b57431a7 100644 --- a/ui/src/flux/containers/FluxPage.tsx +++ b/ui/src/flux/containers/FluxPage.tsx @@ -344,7 +344,7 @@ export class FluxPage extends PureComponent { declarationID: string, funcNodeIndex: number, isYieldable: boolean - ) => { + ): string => { const {body: bodies} = this.state const bodyIndex = bodies.findIndex(b => b.id === bodyID) diff --git a/ui/src/types/flux.ts b/ui/src/types/flux.ts index ccfae353f1..73250b3f34 100644 --- a/ui/src/types/flux.ts +++ b/ui/src/types/flux.ts @@ -12,7 +12,7 @@ export type OnToggleYield = ( declarationID: string, funcNodeIndex: number ) => void -export type OnGenerateScript = (script: string) => void +export type OnGenerateScript = () => void export type OnChangeScript = (script: string) => void export type OnSubmitScript = () => void export type ScriptUpToYield = ( From f591d72db2ff6a27817e7346b4b0b544a3bc3144 Mon Sep 17 00:00:00 2001 From: Delmer Reed Date: Wed, 20 Jun 2018 15:18:07 -0400 Subject: [PATCH 6/6] Add type asserition to Papa.parse data Parsed data from Papa.parse does not utilize a generic type and returns any[]. Adding an asserition will at least error if there are changes to the type of FluxTable.data. --- ui/src/shared/parsing/flux/response.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ui/src/shared/parsing/flux/response.ts b/ui/src/shared/parsing/flux/response.ts index b56f964ac2..634ebb5e9a 100644 --- a/ui/src/shared/parsing/flux/response.ts +++ b/ui/src/shared/parsing/flux/response.ts @@ -5,7 +5,7 @@ import uuid from 'uuid' import {FluxTable} from 'src/types' export const parseResponseError = (response: string): FluxTable[] => { - const {data} = Papa.parse(response.trim()) + const data = Papa.parse(response.trim()).data as string[][] return [ {