@looker/run-it 0.9.64 → 0.9.66
Sign up to get free protection for your applications and to get access to all the features.
- package/CHANGELOG.md +38 -0
- package/lib/RunIt.js.map +1 -1
- package/lib/components/ConfigForm/ConfigForm.js.map +1 -1
- package/lib/components/DataGrid/DataGrid.js.map +1 -1
- package/lib/components/DataGrid/gridUtils.d.ts +0 -1
- package/lib/components/DocSdkCalls/callUtils.js.map +1 -1
- package/lib/components/PerfTracker/perfUtils.js.map +1 -1
- package/lib/components/RequestForm/RequestForm.js.map +1 -1
- package/lib/components/RequestForm/formUtils.js.map +1 -1
- package/lib/components/ResponseExplorer/ResponseExplorer.js.map +1 -1
- package/lib/components/ShowResponse/responseUtils.js.map +1 -1
- package/lib/esm/RunIt.js.map +1 -1
- package/lib/esm/components/ConfigForm/ConfigForm.js.map +1 -1
- package/lib/esm/components/DataGrid/DataGrid.js.map +1 -1
- package/lib/esm/components/DocSdkCalls/callUtils.js.map +1 -1
- package/lib/esm/components/PerfTracker/perfUtils.js.map +1 -1
- package/lib/esm/components/RequestForm/RequestForm.js.map +1 -1
- package/lib/esm/components/RequestForm/formUtils.js.map +1 -1
- package/lib/esm/components/ResponseExplorer/ResponseExplorer.js.map +1 -1
- package/lib/esm/components/ShowResponse/responseUtils.js.map +1 -1
- package/lib/esm/utils/requestUtils.js.map +1 -1
- package/lib/utils/requestUtils.js.map +1 -1
- package/package.json +8 -9
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"perfUtils.js","names":["perfRound","num","Math","round","Number","EPSILON","diff","end","start","LoadTimes","constructor","entry","_defineProperty","resource","redirect","redirectEnd","redirectStart","domainLookup","domainLookupEnd","domainLookupStart","connect","connectEnd","connectStart","secureConnectionStart","secureConnection","responseTime","responseEnd","responseStart","fetchStart","fetchUntilResponseEnd","requestStart","requestUntilResponseEnd","startTime","startUntilResponseEnd","calcProcessTime","duration","performance","getEntriesByName","undefined","entries","concat","name","length","measure","processStart","processEnd","processDuration","PerfTimings","supported","_supported","_unused","value","onresourcetimingbufferfull","_ev","_full","clear","clearResourceTimings","clearMarks","clearMeasures","pattern","arguments","type","ex","RegExp","getEntriesByType","filter","p","test","map","bufferSize","_bufferSize","setResourceTimingBufferSize","isFull"],"sources":["../../../../src/components/PerfTracker/perfUtils.ts"],"sourcesContent":["/*\n\n MIT License\n\n Copyright (c) 2021 Looker Data Sciences, Inc.\n\n Permission is hereby granted, free of charge, to any person obtaining a copy\n of this software and associated documentation files (the \"Software\"), to deal\n in the Software without restriction, including without limitation the rights\n to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n copies of the Software, and to permit persons to whom the Software is\n furnished to do so, subject to the following conditions:\n\n The above copyright notice and this permission notice shall be included in all\n copies or substantial portions of the Software.\n\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n SOFTWARE.\n\n */\n\n/**\n * Calculation of Load times for a resource performance entry\n */\nexport interface IResourceLoadTimes {\n entry: PerformanceEntry;\n name: string;\n duration: number;\n redirect: number;\n domainLookup: number;\n connect: number;\n secureConnection: number;\n responseTime: number;\n fetchUntilResponseEnd: number;\n requestUntilResponseEnd: number;\n startUntilResponseEnd: number;\n processStart: number;\n processEnd: number;\n processDuration: number;\n}\n\n/**\n * Rounds a number to 3 decimal places\n */\nexport const perfRound = (num: number) =>\n Math.round((num + Number.EPSILON) * 10000) / 10000;\n\n/**\n * Round and scale (if needed) the difference in performance metrics\n * @param end of high precision timer metric\n * @param start of high precision timer metric\n * @returns rounded difference of end - start\n */\nconst diff = (end: number, start: number) => perfRound(end - start);\n\nexport class LoadTimes implements IResourceLoadTimes {\n duration = 0;\n redirect = 0;\n domainLookup = 0;\n connect = 0;\n secureConnection = 0;\n responseTime = 0;\n fetchUntilResponseEnd = 0;\n requestUntilResponseEnd = 0;\n startUntilResponseEnd = 0;\n processStart = 0;\n processEnd = 0;\n processDuration = 0;\n\n constructor(public entry: PerformanceEntry) {\n if ('redirectStart' in entry) {\n // https://developer.mozilla.org/en-US/docs/Web/API/PerformanceResourceTiming\n // Either a `PerformanceResourceTiming` or `PerformanceTiming` instance\n const resource = entry as PerformanceResourceTiming;\n this.redirect = diff(resource.redirectEnd, resource.redirectStart);\n this.domainLookup = diff(\n resource.domainLookupEnd,\n resource.domainLookupStart\n );\n this.connect = diff(resource.connectEnd, resource.connectStart);\n if (resource.secureConnectionStart > 0)\n this.secureConnection = diff(\n resource.connectEnd,\n resource.secureConnectionStart\n );\n this.responseTime = diff(resource.responseEnd, resource.responseStart);\n if (resource.fetchStart > 0)\n this.fetchUntilResponseEnd = diff(\n resource.responseEnd,\n resource.fetchStart\n );\n if (resource.requestStart > 0)\n this.requestUntilResponseEnd = diff(\n resource.responseEnd,\n resource.requestStart\n );\n if (resource.startTime > 0)\n this.startUntilResponseEnd = diff(\n resource.responseEnd,\n resource.startTime\n );\n this.calcProcessTime();\n }\n }\n\n private calcProcessTime() {\n this.duration = this.entry.duration;\n if (performance.getEntriesByName !== undefined) {\n const entries = performance.getEntriesByName(\n `${this.name}-${this.entry.startTime}`,\n 'measure'\n );\n if (entries.length > 0) {\n const measure = entries[entries.length - 1] as PerformanceMeasure;\n const resource = this.entry as PerformanceResourceTiming;\n this.processStart = resource.responseEnd;\n this.processEnd = resource.responseEnd + measure.duration;\n this.processDuration = measure.duration;\n this.duration += measure.duration;\n }\n }\n }\n\n get name() {\n return this.entry.name;\n }\n}\n\n/**\n * Performance API utility class\n *\n * Defaults to \"resource\" types\n * */\nexport class PerfTimings {\n private _full = false;\n private _bufferSize = 0;\n private static _supported: boolean | undefined = undefined;\n\n /** Are performance timings supported in this runtime? */\n public static get supported() {\n if (PerfTimings._supported === undefined) {\n // This gyration is necessary to avoid IDEA-based exceptions about performance being undefined,\n // which it may be, but this now throws up in IDEA\n try {\n PerfTimings._supported = performance !== undefined;\n } catch {\n PerfTimings._supported = false;\n }\n }\n return PerfTimings._supported;\n }\n\n public static set supported(value: boolean) {\n PerfTimings._supported = value;\n }\n\n constructor() {\n if (PerfTimings.supported) {\n performance.onresourcetimingbufferfull = (_ev) => (this._full = true);\n // https://developer.mozilla.org/en-US/docs/Web/API/Performance/setResourceTimingBufferSize\n // says the buffer size should be at least 150, but I don't know if we need to set it\n // this.bufferSize = 50 // TODO what's the default bufferSize? Does it vary by browser?\n }\n }\n\n clear() {\n if (!PerfTimings.supported) return false;\n if (performance.clearResourceTimings !== undefined)\n performance.clearResourceTimings();\n if (performance.clearMarks !== undefined) performance.clearMarks();\n if (performance.clearMeasures !== undefined) performance.clearMeasures();\n this._full = this.entries().length === 0;\n return this._full;\n }\n\n entries(pattern = '.*', type = 'resource') {\n // https://developer.mozilla.org/en-US/docs/Web/API/PerformanceEntry\n if (PerfTimings.supported) {\n const ex = new RegExp(pattern, 'i');\n return performance\n .getEntriesByType(type)\n .filter((p) => ex.test(p.name))\n .map((p) => new LoadTimes(p));\n }\n return [];\n }\n\n get bufferSize() {\n return this._bufferSize;\n }\n\n set bufferSize(value) {\n if (\n PerfTimings.supported &&\n typeof performance.setResourceTimingBufferSize !== undefined\n ) {\n this._bufferSize = value;\n performance.setResourceTimingBufferSize(value);\n }\n }\n\n get isFull() {\n return this._full;\n }\n}\n"],"mappings":"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"}
|
1
|
+
{"version":3,"file":"perfUtils.js","names":["perfRound","num","Math","round","Number","EPSILON","diff","end","start","LoadTimes","constructor","entry","_defineProperty","resource","redirect","redirectEnd","redirectStart","domainLookup","domainLookupEnd","domainLookupStart","connect","connectEnd","connectStart","secureConnectionStart","secureConnection","responseTime","responseEnd","responseStart","fetchStart","fetchUntilResponseEnd","requestStart","requestUntilResponseEnd","startTime","startUntilResponseEnd","calcProcessTime","duration","performance","getEntriesByName","undefined","entries","concat","name","length","measure","processStart","processEnd","processDuration","PerfTimings","supported","_supported","_unused","value","onresourcetimingbufferfull","_ev","_full","clear","clearResourceTimings","clearMarks","clearMeasures","pattern","arguments","type","ex","RegExp","getEntriesByType","filter","p","test","map","bufferSize","_bufferSize","setResourceTimingBufferSize","isFull"],"sources":["../../../../src/components/PerfTracker/perfUtils.ts"],"sourcesContent":["/*\n\n MIT License\n\n Copyright (c) 2021 Looker Data Sciences, Inc.\n\n Permission is hereby granted, free of charge, to any person obtaining a copy\n of this software and associated documentation files (the \"Software\"), to deal\n in the Software without restriction, including without limitation the rights\n to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n copies of the Software, and to permit persons to whom the Software is\n furnished to do so, subject to the following conditions:\n\n The above copyright notice and this permission notice shall be included in all\n copies or substantial portions of the Software.\n\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n SOFTWARE.\n\n */\n\n/**\n * Calculation of Load times for a resource performance entry\n */\nexport interface IResourceLoadTimes {\n entry: PerformanceEntry;\n name: string;\n duration: number;\n redirect: number;\n domainLookup: number;\n connect: number;\n secureConnection: number;\n responseTime: number;\n fetchUntilResponseEnd: number;\n requestUntilResponseEnd: number;\n startUntilResponseEnd: number;\n processStart: number;\n processEnd: number;\n processDuration: number;\n}\n\n/**\n * Rounds a number to 3 decimal places\n */\nexport const perfRound = (num: number) =>\n Math.round((num + Number.EPSILON) * 10000) / 10000;\n\n/**\n * Round and scale (if needed) the difference in performance metrics\n * @param end of high precision timer metric\n * @param start of high precision timer metric\n * @returns rounded difference of end - start\n */\nconst diff = (end: number, start: number) => perfRound(end - start);\n\nexport class LoadTimes implements IResourceLoadTimes {\n duration = 0;\n redirect = 0;\n domainLookup = 0;\n connect = 0;\n secureConnection = 0;\n responseTime = 0;\n fetchUntilResponseEnd = 0;\n requestUntilResponseEnd = 0;\n startUntilResponseEnd = 0;\n processStart = 0;\n processEnd = 0;\n processDuration = 0;\n\n constructor(public entry: PerformanceEntry) {\n if ('redirectStart' in entry) {\n // https://developer.mozilla.org/en-US/docs/Web/API/PerformanceResourceTiming\n // Either a `PerformanceResourceTiming` or `PerformanceTiming` instance\n const resource = entry as PerformanceResourceTiming;\n this.redirect = diff(resource.redirectEnd, resource.redirectStart);\n this.domainLookup = diff(\n resource.domainLookupEnd,\n resource.domainLookupStart\n );\n this.connect = diff(resource.connectEnd, resource.connectStart);\n if (resource.secureConnectionStart > 0)\n this.secureConnection = diff(\n resource.connectEnd,\n resource.secureConnectionStart\n );\n this.responseTime = diff(resource.responseEnd, resource.responseStart);\n if (resource.fetchStart > 0)\n this.fetchUntilResponseEnd = diff(\n resource.responseEnd,\n resource.fetchStart\n );\n if (resource.requestStart > 0)\n this.requestUntilResponseEnd = diff(\n resource.responseEnd,\n resource.requestStart\n );\n if (resource.startTime > 0)\n this.startUntilResponseEnd = diff(\n resource.responseEnd,\n resource.startTime\n );\n this.calcProcessTime();\n }\n }\n\n private calcProcessTime() {\n this.duration = this.entry.duration;\n if (performance.getEntriesByName !== undefined) {\n const entries = performance.getEntriesByName(\n `${this.name}-${this.entry.startTime}`,\n 'measure'\n );\n if (entries.length > 0) {\n const measure = entries[entries.length - 1] as PerformanceMeasure;\n const resource = this.entry as PerformanceResourceTiming;\n this.processStart = resource.responseEnd;\n this.processEnd = resource.responseEnd + measure.duration;\n this.processDuration = measure.duration;\n this.duration += measure.duration;\n }\n }\n }\n\n get name() {\n return this.entry.name;\n }\n}\n\n/**\n * Performance API utility class\n *\n * Defaults to \"resource\" types\n * */\nexport class PerfTimings {\n private _full = false;\n private _bufferSize = 0;\n private static _supported: boolean | undefined = undefined;\n\n /** Are performance timings supported in this runtime? */\n public static get supported() {\n if (PerfTimings._supported === undefined) {\n // This gyration is necessary to avoid IDEA-based exceptions about performance being undefined,\n // which it may be, but this now throws up in IDEA\n try {\n PerfTimings._supported = performance !== undefined;\n } catch {\n PerfTimings._supported = false;\n }\n }\n return PerfTimings._supported;\n }\n\n public static set supported(value: boolean) {\n PerfTimings._supported = value;\n }\n\n constructor() {\n if (PerfTimings.supported) {\n performance.onresourcetimingbufferfull = _ev => (this._full = true);\n // https://developer.mozilla.org/en-US/docs/Web/API/Performance/setResourceTimingBufferSize\n // says the buffer size should be at least 150, but I don't know if we need to set it\n // this.bufferSize = 50 // TODO what's the default bufferSize? Does it vary by browser?\n }\n }\n\n clear() {\n if (!PerfTimings.supported) return false;\n if (performance.clearResourceTimings !== undefined)\n performance.clearResourceTimings();\n if (performance.clearMarks !== undefined) performance.clearMarks();\n if (performance.clearMeasures !== undefined) performance.clearMeasures();\n this._full = this.entries().length === 0;\n return this._full;\n }\n\n entries(pattern = '.*', type = 'resource') {\n // https://developer.mozilla.org/en-US/docs/Web/API/PerformanceEntry\n if (PerfTimings.supported) {\n const ex = new RegExp(pattern, 'i');\n return performance\n .getEntriesByType(type)\n .filter(p => ex.test(p.name))\n .map(p => new LoadTimes(p));\n }\n return [];\n }\n\n get bufferSize() {\n return this._bufferSize;\n }\n\n set bufferSize(value) {\n if (\n PerfTimings.supported &&\n typeof performance.setResourceTimingBufferSize !== undefined\n ) {\n this._bufferSize = value;\n performance.setResourceTimingBufferSize(value);\n }\n }\n\n get isFull() {\n return this._full;\n }\n}\n"],"mappings":"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"}
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"RequestForm.js","names":["React","Button","ButtonTransparent","Fieldset","Form","Label","MessageBar","ToggleSwitch","Tooltip","LoginForm","BODY_HINT","createComplexItem","createSimpleItem","showDataChangeWarning","updateNullableProp","FormItem","DarkSpan","RequestForm","_ref","inputs","httpMethod","handleSubmit","requestContent","setRequestContent","needsAuth","hasConfig","handleConfig","setHasConfig","validationMessage","setValidationMessage","keepBody","toggleKeepBody","isExtension","hasBody","some","i","location","handleBoolChange","e","_objectSpread","target","name","checked","handleNumberChange","value","parseFloat","undefined","newState","handleDateChange","date","handleChange","handleComplexChange","safeSetMessage","handleClear","preventDefault","createElement","onSubmit","intent","onPrimaryClick","visible","map","input","type","Fragment","key","id","label","onChange","on","fontSize","content","onClick"],"sources":["../../../../src/components/RequestForm/RequestForm.tsx"],"sourcesContent":["/*\n\n MIT License\n\n Copyright (c) 2021 Looker Data Sciences, Inc.\n\n Permission is hereby granted, free of charge, to any person obtaining a copy\n of this software and associated documentation files (the \"Software\"), to deal\n in the Software without restriction, including without limitation the rights\n to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n copies of the Software, and to permit persons to whom the Software is\n furnished to do so, subject to the following conditions:\n\n The above copyright notice and this permission notice shall be included in all\n copies or substantial portions of the Software.\n\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n SOFTWARE.\n\n */\n\nimport type { BaseSyntheticEvent, Dispatch, FC, FormEventHandler } from 'react';\nimport React from 'react';\nimport {\n Button,\n ButtonTransparent,\n Fieldset,\n Form,\n Label,\n MessageBar,\n ToggleSwitch,\n Tooltip,\n} from '@looker/components';\nimport type { RunItHttpMethod, RunItInput, RunItValues } from '../../RunIt';\nimport { LoginForm } from '../LoginForm';\nimport {\n BODY_HINT,\n createComplexItem,\n createSimpleItem,\n showDataChangeWarning,\n updateNullableProp,\n} from './formUtils';\nimport { FormItem } from './FormItem';\nimport { DarkSpan } from './../common';\n\n/** Properties required by RequestForm */\ninterface RequestFormProps {\n /** Request inputs to the endpoint */\n inputs: RunItInput[];\n /** A callback for submitting the form */\n handleSubmit: (e: BaseSyntheticEvent) => void;\n /** HTTP method used for this REST request */\n httpMethod: RunItHttpMethod;\n /** A collection type react state to store path, query and body parameters as entered by the user */\n requestContent: RunItValues;\n /** A set state callback fn for populating requestContent on interaction with the request form */\n setRequestContent: Dispatch<RunItValues>;\n /** Is authentication required? */\n needsAuth: boolean;\n /** Does RunIt have the configuration values it needs? */\n hasConfig: boolean;\n /** Handle config button click */\n handleConfig: (e: BaseSyntheticEvent) => void;\n /** A set state callback which, if present, allows for editing, setting or clearing OAuth configuration parameters */\n setHasConfig?: Dispatch<boolean>;\n /** Validation message to display */\n validationMessage?: string;\n /** Validation message setter */\n setValidationMessage?: Dispatch<string>;\n /** Toggle for processing body inputs */\n keepBody?: boolean;\n /** Toggle to keep all body inputs */\n toggleKeepBody?: (_event: FormEventHandler<HTMLInputElement>) => void;\n /** Is RunIt being used in a Looker extension? */\n isExtension?: boolean;\n}\n\n/**\n * Dynamically generates a REST request form and its form elements corresponding to parameters from an array of RunIt\n * inputs\n */\nexport const RequestForm: FC<RequestFormProps> = ({\n inputs,\n httpMethod,\n handleSubmit,\n requestContent,\n setRequestContent,\n needsAuth,\n hasConfig,\n handleConfig,\n setHasConfig,\n validationMessage,\n setValidationMessage,\n keepBody,\n toggleKeepBody,\n isExtension = false,\n}) => {\n const hasBody = inputs.some((i) => i.location === 'body');\n\n const handleBoolChange = (e: BaseSyntheticEvent) => {\n setRequestContent({ ...requestContent, [e.target.name]: e.target.checked });\n };\n\n const handleNumberChange = (e: BaseSyntheticEvent) => {\n const value = e.target.value ? parseFloat(e.target.value) : undefined;\n const newState = updateNullableProp(requestContent, e.target.name, value);\n setRequestContent(newState);\n };\n\n const handleDateChange = (name: string, date?: Date) => {\n const newState = updateNullableProp(requestContent, name, date);\n setRequestContent(newState);\n };\n\n const handleChange = (e: BaseSyntheticEvent) => {\n const newState = updateNullableProp(\n requestContent,\n e.target.name,\n e.target.value\n );\n setRequestContent(newState);\n };\n\n const handleComplexChange = (name: string, value: string) => {\n setRequestContent({ ...requestContent, [name]: value });\n };\n\n const safeSetMessage = (value: string) =>\n setValidationMessage && setValidationMessage(value);\n\n const handleClear = (e: BaseSyntheticEvent) => {\n e.preventDefault();\n setRequestContent({});\n safeSetMessage('');\n };\n\n return (\n <Form onSubmit={handleSubmit}>\n {validationMessage && (\n <MessageBar\n intent={'critical'}\n onPrimaryClick={() => safeSetMessage('')}\n visible={validationMessage !== ''}\n >\n {validationMessage}\n </MessageBar>\n )}\n <Fieldset>\n {inputs.map((input) =>\n typeof input.type === 'string'\n ? createSimpleItem(\n input,\n handleChange,\n handleNumberChange,\n handleBoolChange,\n handleDateChange,\n requestContent\n )\n : createComplexItem(input, handleComplexChange, requestContent)\n )}\n {httpMethod !== 'GET' && showDataChangeWarning()}\n {hasBody && !!toggleKeepBody && (\n <>\n <FormItem key=\"keepbody_fib\" id=\"keepBody\" label=\"Send body as-is\">\n <>\n <ToggleSwitch\n key=\"keepBody\"\n id=\"keepBody\"\n name=\"keepBody\"\n onChange={toggleKeepBody as unknown as FormEventHandler}\n on={keepBody}\n />\n <Label>Send the body parameter as entered</Label>\n </>\n </FormItem>\n <FormItem key=\"body_hint\" id=\"bodyHint\">\n <DarkSpan fontSize=\"small\">{BODY_HINT}</DarkSpan>\n </FormItem>\n </>\n )}\n <FormItem id=\"buttonbar\">\n <>\n {hasConfig ? (\n needsAuth ? (\n <LoginForm requestContent={requestContent} />\n ) : (\n <Tooltip content=\"Run the API request\">\n <Button type=\"submit\">Run</Button>\n </Tooltip>\n )\n ) : (\n !isExtension &&\n setHasConfig && (\n <Tooltip content=\"Configure your OAuth server to Run requests\">\n <Button onClick={handleConfig}>Configure</Button>\n </Tooltip>\n )\n )}\n <Tooltip content=\"Clear entered values\">\n <ButtonTransparent type=\"button\" onClick={handleClear}>\n Clear\n </ButtonTransparent>\n </Tooltip>\n </>\n </FormItem>\n </Fieldset>\n </Form>\n );\n};\n"],"mappings":";;;;;AA2BA,OAAOA,KAAK,MAAM,OAAO;AACzB,SACEC,MAAM,EACNC,iBAAiB,EACjBC,QAAQ,EACRC,IAAI,EACJC,KAAK,EACLC,UAAU,EACVC,YAAY,EACZC,OAAO,QACF,oBAAoB;AAE3B,SAASC,SAAS,QAAQ,cAAc;AACxC,SACEC,SAAS,EACTC,iBAAiB,EACjBC,gBAAgB,EAChBC,qBAAqB,EACrBC,kBAAkB,QACb,aAAa;AACpB,SAASC,QAAQ,QAAQ,YAAY;AACrC,SAASC,QAAQ,QAAQ,aAAa;AAsCtC,OAAO,IAAMC,WAAiC,GAAGC,IAAA,IAe3C;EAAA,IAf4C;IAChDC,MAAM;IACNC,UAAU;IACVC,YAAY;IACZC,cAAc;IACdC,iBAAiB;IACjBC,SAAS;IACTC,SAAS;IACTC,YAAY;IACZC,YAAY;IACZC,iBAAiB;IACjBC,oBAAoB;IACpBC,QAAQ;IACRC,cAAc;IACdC,WAAW,GAAG;EAChB,CAAC,GAAAd,IAAA;EACC,IAAMe,OAAO,GAAGd,MAAM,CAACe,IAAI,CAAEC,CAAC,IAAKA,CAAC,CAACC,QAAQ,KAAK,MAAM,CAAC;EAEzD,IAAMC,gBAAgB,GAAIC,CAAqB,IAAK;IAClDf,iBAAiB,CAAAgB,aAAA,CAAAA,aAAA,KAAMjB,cAAc;MAAE,CAACgB,CAAC,CAACE,MAAM,CAACC,IAAI,GAAGH,CAAC,CAACE,MAAM,CAACE;IAAO,EAAE,CAAC;EAC7E,CAAC;EAED,IAAMC,kBAAkB,GAAIL,CAAqB,IAAK;IACpD,IAAMM,KAAK,GAAGN,CAAC,CAACE,MAAM,CAACI,KAAK,GAAGC,UAAU,CAACP,CAAC,CAACE,MAAM,CAACI,KAAK,CAAC,GAAGE,SAAS;IACrE,IAAMC,QAAQ,GAAGjC,kBAAkB,CAACQ,cAAc,EAAEgB,CAAC,CAACE,MAAM,CAACC,IAAI,EAAEG,KAAK,CAAC;IACzErB,iBAAiB,CAACwB,QAAQ,CAAC;EAC7B,CAAC;EAED,IAAMC,gBAAgB,GAAGA,CAACP,IAAY,EAAEQ,IAAW,KAAK;IACtD,IAAMF,QAAQ,GAAGjC,kBAAkB,CAACQ,cAAc,EAAEmB,IAAI,EAAEQ,IAAI,CAAC;IAC/D1B,iBAAiB,CAACwB,QAAQ,CAAC;EAC7B,CAAC;EAED,IAAMG,YAAY,GAAIZ,CAAqB,IAAK;IAC9C,IAAMS,QAAQ,GAAGjC,kBAAkB,CACjCQ,cAAc,EACdgB,CAAC,CAACE,MAAM,CAACC,IAAI,EACbH,CAAC,CAACE,MAAM,CAACI,KACX,CAAC;IACDrB,iBAAiB,CAACwB,QAAQ,CAAC;EAC7B,CAAC;EAED,IAAMI,mBAAmB,GAAGA,CAACV,IAAY,EAAEG,KAAa,KAAK;IAC3DrB,iBAAiB,CAAAgB,aAAA,CAAAA,aAAA,KAAMjB,cAAc;MAAE,CAACmB,IAAI,GAAGG;IAAK,EAAE,CAAC;EACzD,CAAC;EAED,IAAMQ,cAAc,GAAIR,KAAa,IACnCf,oBAAoB,IAAIA,oBAAoB,CAACe,KAAK,CAAC;EAErD,IAAMS,WAAW,GAAIf,CAAqB,IAAK;IAC7CA,CAAC,CAACgB,cAAc,CAAC,CAAC;IAClB/B,iBAAiB,CAAC,CAAC,CAAC,CAAC;IACrB6B,cAAc,CAAC,EAAE,CAAC;EACpB,CAAC;EAED,OACEpD,KAAA,CAAAuD,aAAA,CAACnD,IAAI;IAACoD,QAAQ,EAAEnC;EAAa,GAC1BO,iBAAiB,IAChB5B,KAAA,CAAAuD,aAAA,CAACjD,UAAU;IACTmD,MAAM,EAAE,UAAW;IACnBC,cAAc,EAAEA,CAAA,KAAMN,cAAc,CAAC,EAAE,CAAE;IACzCO,OAAO,EAAE/B,iBAAiB,KAAK;EAAG,GAEjCA,iBACS,CACb,EACD5B,KAAA,CAAAuD,aAAA,CAACpD,QAAQ,QACNgB,MAAM,CAACyC,GAAG,CAAEC,KAAK,IAChB,OAAOA,KAAK,CAACC,IAAI,KAAK,QAAQ,GAC1BlD,gBAAgB,CACdiD,KAAK,EACLX,YAAY,EACZP,kBAAkB,EAClBN,gBAAgB,EAChBW,gBAAgB,EAChB1B,cACF,CAAC,GACDX,iBAAiB,CAACkD,KAAK,EAAEV,mBAAmB,EAAE7B,cAAc,CAClE,CAAC,EACAF,UAAU,KAAK,KAAK,IAAIP,qBAAqB,CAAC,CAAC,EAC/CoB,OAAO,IAAI,CAAC,CAACF,cAAc,IAC1B/B,KAAA,CAAAuD,aAAA,CAAAvD,KAAA,CAAA+D,QAAA,QACE/D,KAAA,CAAAuD,aAAA,CAACxC,QAAQ;IAACiD,GAAG,EAAC,cAAc;IAACC,EAAE,EAAC,UAAU;IAACC,KAAK,EAAC;EAAiB,GAChElE,KAAA,CAAAuD,aAAA,CAAAvD,KAAA,CAAA+D,QAAA,QACE/D,KAAA,CAAAuD,aAAA,CAAChD,YAAY;IACXyD,GAAG,EAAC,UAAU;IACdC,EAAE,EAAC,UAAU;IACbxB,IAAI,EAAC,UAAU;IACf0B,QAAQ,EAAEpC,cAA8C;IACxDqC,EAAE,EAAEtC;EAAS,CACd,CAAC,EACF9B,KAAA,CAAAuD,aAAA,CAAClD,KAAK,QAAC,oCAAyC,CAChD,CACM,CAAC,EACXL,KAAA,CAAAuD,aAAA,CAACxC,QAAQ;IAACiD,GAAG,EAAC,WAAW;IAACC,EAAE,EAAC;EAAU,GACrCjE,KAAA,CAAAuD,aAAA,CAACvC,QAAQ;IAACqD,QAAQ,EAAC;EAAO,GAAE3D,SAAoB,CACxC,CACV,CACH,EACDV,KAAA,CAAAuD,aAAA,CAACxC,QAAQ;IAACkD,EAAE,EAAC;EAAW,GACtBjE,KAAA,CAAAuD,aAAA,CAAAvD,KAAA,CAAA+D,QAAA,QACGtC,SAAS,GACRD,SAAS,GACPxB,KAAA,CAAAuD,aAAA,CAAC9C,SAAS;IAACa,cAAc,EAAEA;EAAe,CAAE,CAAC,GAE7CtB,KAAA,CAAAuD,aAAA,CAAC/C,OAAO;IAAC8D,OAAO,EAAC;EAAqB,GACpCtE,KAAA,CAAAuD,aAAA,CAACtD,MAAM;IAAC6D,IAAI,EAAC;EAAQ,GAAC,KAAW,CAC1B,CACV,GAED,CAAC9B,WAAW,IACZL,YAAY,IACV3B,KAAA,CAAAuD,aAAA,CAAC/C,OAAO;IAAC8D,OAAO,EAAC;EAA6C,GAC5DtE,KAAA,CAAAuD,aAAA,CAACtD,MAAM;IAACsE,OAAO,EAAE7C;EAAa,GAAC,WAAiB,CACzC,CAEZ,EACD1B,KAAA,CAAAuD,aAAA,CAAC/C,OAAO;IAAC8D,OAAO,EAAC;EAAsB,GACrCtE,KAAA,CAAAuD,aAAA,CAACrD,iBAAiB;IAAC4D,IAAI,EAAC,QAAQ;IAACS,OAAO,EAAElB;EAAY,GAAC,OAEpC,CACZ,CACT,CACM,CACF,CACN,CAAC;AAEX,CAAC"}
|
1
|
+
{"version":3,"file":"RequestForm.js","names":["React","Button","ButtonTransparent","Fieldset","Form","Label","MessageBar","ToggleSwitch","Tooltip","LoginForm","BODY_HINT","createComplexItem","createSimpleItem","showDataChangeWarning","updateNullableProp","FormItem","DarkSpan","RequestForm","_ref","inputs","httpMethod","handleSubmit","requestContent","setRequestContent","needsAuth","hasConfig","handleConfig","setHasConfig","validationMessage","setValidationMessage","keepBody","toggleKeepBody","isExtension","hasBody","some","i","location","handleBoolChange","e","_objectSpread","target","name","checked","handleNumberChange","value","parseFloat","undefined","newState","handleDateChange","date","handleChange","handleComplexChange","safeSetMessage","handleClear","preventDefault","createElement","onSubmit","intent","onPrimaryClick","visible","map","input","type","Fragment","key","id","label","onChange","on","fontSize","content","onClick"],"sources":["../../../../src/components/RequestForm/RequestForm.tsx"],"sourcesContent":["/*\n\n MIT License\n\n Copyright (c) 2021 Looker Data Sciences, Inc.\n\n Permission is hereby granted, free of charge, to any person obtaining a copy\n of this software and associated documentation files (the \"Software\"), to deal\n in the Software without restriction, including without limitation the rights\n to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n copies of the Software, and to permit persons to whom the Software is\n furnished to do so, subject to the following conditions:\n\n The above copyright notice and this permission notice shall be included in all\n copies or substantial portions of the Software.\n\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n SOFTWARE.\n\n */\n\nimport type { BaseSyntheticEvent, Dispatch, FC, FormEventHandler } from 'react';\nimport React from 'react';\nimport {\n Button,\n ButtonTransparent,\n Fieldset,\n Form,\n Label,\n MessageBar,\n ToggleSwitch,\n Tooltip,\n} from '@looker/components';\nimport type { RunItHttpMethod, RunItInput, RunItValues } from '../../RunIt';\nimport { LoginForm } from '../LoginForm';\nimport {\n BODY_HINT,\n createComplexItem,\n createSimpleItem,\n showDataChangeWarning,\n updateNullableProp,\n} from './formUtils';\nimport { FormItem } from './FormItem';\nimport { DarkSpan } from './../common';\n\n/** Properties required by RequestForm */\ninterface RequestFormProps {\n /** Request inputs to the endpoint */\n inputs: RunItInput[];\n /** A callback for submitting the form */\n handleSubmit: (e: BaseSyntheticEvent) => void;\n /** HTTP method used for this REST request */\n httpMethod: RunItHttpMethod;\n /** A collection type react state to store path, query and body parameters as entered by the user */\n requestContent: RunItValues;\n /** A set state callback fn for populating requestContent on interaction with the request form */\n setRequestContent: Dispatch<RunItValues>;\n /** Is authentication required? */\n needsAuth: boolean;\n /** Does RunIt have the configuration values it needs? */\n hasConfig: boolean;\n /** Handle config button click */\n handleConfig: (e: BaseSyntheticEvent) => void;\n /** A set state callback which, if present, allows for editing, setting or clearing OAuth configuration parameters */\n setHasConfig?: Dispatch<boolean>;\n /** Validation message to display */\n validationMessage?: string;\n /** Validation message setter */\n setValidationMessage?: Dispatch<string>;\n /** Toggle for processing body inputs */\n keepBody?: boolean;\n /** Toggle to keep all body inputs */\n toggleKeepBody?: (_event: FormEventHandler<HTMLInputElement>) => void;\n /** Is RunIt being used in a Looker extension? */\n isExtension?: boolean;\n}\n\n/**\n * Dynamically generates a REST request form and its form elements corresponding to parameters from an array of RunIt\n * inputs\n */\nexport const RequestForm: FC<RequestFormProps> = ({\n inputs,\n httpMethod,\n handleSubmit,\n requestContent,\n setRequestContent,\n needsAuth,\n hasConfig,\n handleConfig,\n setHasConfig,\n validationMessage,\n setValidationMessage,\n keepBody,\n toggleKeepBody,\n isExtension = false,\n}) => {\n const hasBody = inputs.some(i => i.location === 'body');\n\n const handleBoolChange = (e: BaseSyntheticEvent) => {\n setRequestContent({ ...requestContent, [e.target.name]: e.target.checked });\n };\n\n const handleNumberChange = (e: BaseSyntheticEvent) => {\n const value = e.target.value ? parseFloat(e.target.value) : undefined;\n const newState = updateNullableProp(requestContent, e.target.name, value);\n setRequestContent(newState);\n };\n\n const handleDateChange = (name: string, date?: Date) => {\n const newState = updateNullableProp(requestContent, name, date);\n setRequestContent(newState);\n };\n\n const handleChange = (e: BaseSyntheticEvent) => {\n const newState = updateNullableProp(\n requestContent,\n e.target.name,\n e.target.value\n );\n setRequestContent(newState);\n };\n\n const handleComplexChange = (name: string, value: string) => {\n setRequestContent({ ...requestContent, [name]: value });\n };\n\n const safeSetMessage = (value: string) =>\n setValidationMessage && setValidationMessage(value);\n\n const handleClear = (e: BaseSyntheticEvent) => {\n e.preventDefault();\n setRequestContent({});\n safeSetMessage('');\n };\n\n return (\n <Form onSubmit={handleSubmit}>\n {validationMessage && (\n <MessageBar\n intent={'critical'}\n onPrimaryClick={() => safeSetMessage('')}\n visible={validationMessage !== ''}\n >\n {validationMessage}\n </MessageBar>\n )}\n <Fieldset>\n {inputs.map(input =>\n typeof input.type === 'string'\n ? createSimpleItem(\n input,\n handleChange,\n handleNumberChange,\n handleBoolChange,\n handleDateChange,\n requestContent\n )\n : createComplexItem(input, handleComplexChange, requestContent)\n )}\n {httpMethod !== 'GET' && showDataChangeWarning()}\n {hasBody && !!toggleKeepBody && (\n <>\n <FormItem key=\"keepbody_fib\" id=\"keepBody\" label=\"Send body as-is\">\n <>\n <ToggleSwitch\n key=\"keepBody\"\n id=\"keepBody\"\n name=\"keepBody\"\n onChange={toggleKeepBody as unknown as FormEventHandler}\n on={keepBody}\n />\n <Label>Send the body parameter as entered</Label>\n </>\n </FormItem>\n <FormItem key=\"body_hint\" id=\"bodyHint\">\n <DarkSpan fontSize=\"small\">{BODY_HINT}</DarkSpan>\n </FormItem>\n </>\n )}\n <FormItem id=\"buttonbar\">\n <>\n {hasConfig ? (\n needsAuth ? (\n <LoginForm requestContent={requestContent} />\n ) : (\n <Tooltip content=\"Run the API request\">\n <Button type=\"submit\">Run</Button>\n </Tooltip>\n )\n ) : (\n !isExtension &&\n setHasConfig && (\n <Tooltip content=\"Configure your OAuth server to Run requests\">\n <Button onClick={handleConfig}>Configure</Button>\n </Tooltip>\n )\n )}\n <Tooltip content=\"Clear entered values\">\n <ButtonTransparent type=\"button\" onClick={handleClear}>\n Clear\n </ButtonTransparent>\n </Tooltip>\n </>\n </FormItem>\n </Fieldset>\n </Form>\n );\n};\n"],"mappings":"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"}
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"formUtils.js","names":["React","Fragment","FieldCheckbox","Icon","InputDate","InputText","Label","Space","ToggleSwitch","Tooltip","Info","CodeEditor","FormItem","BODY_HINT","createDateItem","name","handleChange","requestContent","createElement","key","concat","id","label","defaultValue","undefined","onChange","bind","createBoolItem","description","on","inputTextType","type","createItem","required","placeholder","value","createSimpleItem","input","handleNumberChange","handleBoolChange","handleDateChange","createComplexItem","handleComplexChange","content","code","JSON","stringify","icon","size","ml","language","lineNumbers","transparent","showDataChangeWarning","updateNullableProp","state","newValue","updatedState","_objectSpread","validateEncodedValues","body","result","args","split","forEach","arg","formArg","test","trim","validateBody","requiredKeys","parsed","parse","e","message","length","Set","keys","Object","missing","filter","k","has","Array","from","join"],"sources":["../../../../src/components/RequestForm/formUtils.tsx"],"sourcesContent":["/*\n\n MIT License\n\n Copyright (c) 2021 Looker Data Sciences, Inc.\n\n Permission is hereby granted, free of charge, to any person obtaining a copy\n of this software and associated documentation files (the \"Software\"), to deal\n in the Software without restriction, including without limitation the rights\n to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n copies of the Software, and to permit persons to whom the Software is\n furnished to do so, subject to the following conditions:\n\n The above copyright notice and this permission notice shall be included in all\n copies or substantial portions of the Software.\n\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n SOFTWARE.\n\n */\n\nimport type { BaseSyntheticEvent } from 'react';\nimport React, { Fragment } from 'react';\nimport {\n FieldCheckbox,\n Icon,\n InputDate,\n InputText,\n Label,\n Space,\n ToggleSwitch,\n Tooltip,\n} from '@looker/components';\n// eslint-disable-next-line no-restricted-imports\nimport { Info } from '@styled-icons/material';\nimport { CodeEditor } from '@looker/code-editor';\nimport type { RunItInput, RunItValues } from '../../RunIt';\nimport { FormItem } from './FormItem';\n\nexport const BODY_HINT =\n 'By default, empty values are automatically removed from the request inputs, except for properties with `false` boolean values, which must be completely removed from the JSON body if they should not be passed.';\n/**\n * Creates a datetime form item\n * @param name Form item's name\n * @param handleChange A callback function for updating the parent\n * component's requestContent state with date item changes\n * @param requestContent A state object containing the values of all form items\n * @returns A datetime form item\n */\nconst createDateItem = (\n name: string,\n handleChange: (name: string, date?: Date) => void,\n requestContent: RunItValues\n) => (\n <FormItem key={`${name}_fid`} id={name} label={name}>\n <InputDate\n key={`datepick_${name}`}\n data-testid={`datepick_${name}`}\n defaultValue={name in requestContent ? requestContent[name] : undefined}\n onChange={handleChange.bind(null, name)}\n />\n </FormItem>\n);\n\n/**\n * Creates a boolean form item\n * @param name Form item's name\n * @param description Form item's description\n * @param handleChange A callback function that updates parent's component state when boolean item is clicked\n * @param requestContent A state object containing the values of all form items\n * @returns A boolean form item (a FieldToggleSwitch)\n */\nconst createBoolItem = (\n name: string,\n description: string,\n handleChange: (e: BaseSyntheticEvent) => void,\n requestContent: RunItValues\n) => (\n <FormItem key={`${name}_fib`} id={name} label={name}>\n <>\n <ToggleSwitch\n key={name}\n id={name}\n name={name}\n onChange={handleChange}\n on={name in requestContent ? requestContent[name] : false}\n />\n {description && <Label>{description}</Label>}\n </>\n </FormItem>\n);\n\nconst inputTextType = (type: string) => {\n switch (type) {\n case 'number':\n return 'number';\n case 'email':\n return 'email';\n case 'password':\n return 'password';\n default:\n return 'text';\n }\n};\n\n/**\n * Create a field text input item based on definitions\n * @param name Form item's name\n * @param description Form item's description\n * @param required Form item's required flag\n * @param type Form item's type\n * @param placeholder Form item's placeholder\n * @param handleChange A callback function that updates parent's component state when form item value changes\n * @param requestContent A state object containing the values of all form items\n * @returns A form item\n */\nconst createItem = (\n name: string,\n description: string,\n required: boolean,\n type: string,\n placeholder: string,\n handleChange: (e: BaseSyntheticEvent) => void,\n requestContent: RunItValues\n) => (\n <FormItem key={`${name}_fi`} id={name} label={name}>\n <InputText\n key={name}\n id={name}\n name={name}\n required={required}\n placeholder={`${placeholder} ${description || name}`}\n type={inputTextType(type)}\n value={name in requestContent ? requestContent[name] : ''}\n onChange={handleChange}\n />\n </FormItem>\n);\n\n/**\n * Creates a simple form item\n * @param input An object describing the form item\n * @param handleChange A callback function for updating the parent component's requestContent state with\n * text/email/password item changes\n * @param handleNumberChange A callback function for updating the parent component's requestContent state with number\n * item changes\n * @param handleBoolChange A callback function for updating the parent\n * component's requestContent state with bool item changes\n * @param handleDateChange A callback function for updating the parent\n * component's requestContent state with date item changes\n * @param requestContent A state object containing the values of all form items\n * @returns A simple form item\n */\nexport const createSimpleItem = (\n input: RunItInput,\n handleChange: (e: BaseSyntheticEvent) => void,\n handleNumberChange: (e: BaseSyntheticEvent) => void,\n handleBoolChange: (e: BaseSyntheticEvent) => void,\n handleDateChange: (name: string, date?: Date) => void,\n requestContent: RunItValues\n) => {\n switch (input.type) {\n case 'boolean':\n return createBoolItem(\n input.name,\n input.description,\n handleBoolChange,\n requestContent\n );\n case 'int64':\n case 'integer':\n case 'float':\n case 'double':\n return createItem(\n input.name,\n input.description,\n input.required,\n 'number',\n '(number)',\n handleNumberChange,\n requestContent\n );\n case 'string':\n case 'hostname':\n case 'uuid':\n case 'uri':\n case 'ipv4':\n case 'ipv6':\n return createItem(\n input.name,\n input.description,\n input.required,\n 'string',\n '(string)',\n handleChange,\n requestContent\n );\n case 'email':\n case 'password':\n return createItem(\n input.name,\n input.description,\n input.required,\n input.type,\n '(string)',\n handleChange,\n requestContent\n );\n case 'datetime':\n return createDateItem(input.name, handleDateChange, requestContent);\n default:\n return <Fragment key={input.name}></Fragment>;\n }\n};\n\n/**\n * Creates a complex item\n * @param input An object describing the form item\n * @param handleComplexChange A callback function for updating the parent\n * component's requestContent state\n * @param requestContent A state object containing the values of all form items\n * @returns A complex form item\n */\nexport const createComplexItem = (\n input: RunItInput,\n handleComplexChange: (value: string, name: string) => void,\n requestContent: RunItValues\n) => {\n const content = requestContent[input.name];\n const code =\n typeof content === 'string' ? content : JSON.stringify(content, null, 2);\n\n return (\n <FormItem\n key={`${input.name}_fic`}\n id={input.name}\n label={\n <Space>\n {input.name}\n <Tooltip content={BODY_HINT}>\n <Icon\n data-testid=\"body-param-tooltip\"\n icon={<Info />}\n size=\"xsmall\"\n ml=\"xsmall\"\n />\n </Tooltip>\n </Space>\n }\n >\n <CodeEditor\n key={`code_${input.name}`}\n language=\"json\"\n code={code}\n lineNumbers={false}\n onChange={handleComplexChange.bind(null, input.name)}\n transparent={true}\n />\n </FormItem>\n );\n};\n\n/**\n * Creates a required checkbox form item\n */\nexport const showDataChangeWarning = () => (\n <FormItem key=\"warningfi\" id=\"change_warning\">\n <FieldCheckbox\n name=\"warning\"\n key=\"warning\"\n required\n label=\"I understand that this API endpoint will change data.\"\n />\n </FormItem>\n);\n\n/**\n * Updates a given state with a key/value pair, taking into consideration\n * indeterminate values.\n * @param state A collection to update\n * @param key Property to update\n * @param newValue? New value corresponding to given key\n */\nexport const updateNullableProp = (\n state: RunItValues,\n key: string,\n newValue?: any\n) => {\n const updatedState = { ...state };\n if (key in state && !newValue) {\n delete updatedState[key];\n } else {\n updatedState[key] = newValue;\n }\n return updatedState;\n};\n\n/**\n * If the body isn't empty, it must be valid form encoded syntax\n *\n * This may not be perfect validation but it should be good enough to tolerate variances\n *\n * @param body to validate\n */\nexport const validateEncodedValues = (body: string) => {\n let result = '';\n if (!body) return result;\n const args = body.split('&');\n args.forEach((arg) => {\n const formArg = /[\\w-_.]+(\\[])?=.*/i;\n if (!formArg.test(arg)) {\n result += ` ${arg}`;\n }\n });\n return result.trim();\n};\n\n/**\n * Returns an error message if the body is not JSON or valid form url encoding\n *\n * @param body string to validate\n * @param requiredKeys keys that are required in the body parameter\n */\nexport const validateBody = (\n body: string | Record<string, any>,\n requiredKeys: string[]\n) => {\n let parsed;\n\n let result = '';\n if (body) {\n if (typeof body === 'string') {\n if (/^[[{}\"]/.test(body)) {\n // most likely JSON\n try {\n parsed = JSON.parse(body);\n } catch (e: any) {\n result = e.message;\n }\n } else {\n result = validateEncodedValues(body);\n }\n if (result) {\n result = `Syntax error in the body: ${result}`;\n }\n } else {\n parsed = body;\n }\n }\n\n if (parsed && requiredKeys && requiredKeys.length > 0) {\n const required = new Set<string>(requiredKeys);\n const keys = new Set<string>(Object.keys(parsed));\n const missing = new Set<string>([...required].filter((k) => !keys.has(k)));\n if (missing.size > 0) {\n result = `Error: Required properties \"${Array.from(missing).join(\n ', '\n )}\" must be provided in the body`;\n }\n }\n return result;\n};\n"],"mappings":"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"}
|
1
|
+
{"version":3,"file":"formUtils.js","names":["React","Fragment","FieldCheckbox","Icon","InputDate","InputText","Label","Space","ToggleSwitch","Tooltip","Info","CodeEditor","FormItem","BODY_HINT","createDateItem","name","handleChange","requestContent","createElement","key","concat","id","label","defaultValue","undefined","onChange","bind","createBoolItem","description","on","inputTextType","type","createItem","required","placeholder","value","createSimpleItem","input","handleNumberChange","handleBoolChange","handleDateChange","createComplexItem","handleComplexChange","content","code","JSON","stringify","icon","size","ml","language","lineNumbers","transparent","showDataChangeWarning","updateNullableProp","state","newValue","updatedState","_objectSpread","validateEncodedValues","body","result","args","split","forEach","arg","formArg","test","trim","validateBody","requiredKeys","parsed","parse","e","message","length","Set","keys","Object","missing","filter","k","has","Array","from","join"],"sources":["../../../../src/components/RequestForm/formUtils.tsx"],"sourcesContent":["/*\n\n MIT License\n\n Copyright (c) 2021 Looker Data Sciences, Inc.\n\n Permission is hereby granted, free of charge, to any person obtaining a copy\n of this software and associated documentation files (the \"Software\"), to deal\n in the Software without restriction, including without limitation the rights\n to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n copies of the Software, and to permit persons to whom the Software is\n furnished to do so, subject to the following conditions:\n\n The above copyright notice and this permission notice shall be included in all\n copies or substantial portions of the Software.\n\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n SOFTWARE.\n\n */\n\nimport type { BaseSyntheticEvent } from 'react';\nimport React, { Fragment } from 'react';\nimport {\n FieldCheckbox,\n Icon,\n InputDate,\n InputText,\n Label,\n Space,\n ToggleSwitch,\n Tooltip,\n} from '@looker/components';\n// eslint-disable-next-line no-restricted-imports\nimport { Info } from '@styled-icons/material';\nimport { CodeEditor } from '@looker/code-editor';\nimport type { RunItInput, RunItValues } from '../../RunIt';\nimport { FormItem } from './FormItem';\n\nexport const BODY_HINT =\n 'By default, empty values are automatically removed from the request inputs, except for properties with `false` boolean values, which must be completely removed from the JSON body if they should not be passed.';\n/**\n * Creates a datetime form item\n * @param name Form item's name\n * @param handleChange A callback function for updating the parent\n * component's requestContent state with date item changes\n * @param requestContent A state object containing the values of all form items\n * @returns A datetime form item\n */\nconst createDateItem = (\n name: string,\n handleChange: (name: string, date?: Date) => void,\n requestContent: RunItValues\n) => (\n <FormItem key={`${name}_fid`} id={name} label={name}>\n <InputDate\n key={`datepick_${name}`}\n data-testid={`datepick_${name}`}\n defaultValue={name in requestContent ? requestContent[name] : undefined}\n onChange={handleChange.bind(null, name)}\n />\n </FormItem>\n);\n\n/**\n * Creates a boolean form item\n * @param name Form item's name\n * @param description Form item's description\n * @param handleChange A callback function that updates parent's component state when boolean item is clicked\n * @param requestContent A state object containing the values of all form items\n * @returns A boolean form item (a FieldToggleSwitch)\n */\nconst createBoolItem = (\n name: string,\n description: string,\n handleChange: (e: BaseSyntheticEvent) => void,\n requestContent: RunItValues\n) => (\n <FormItem key={`${name}_fib`} id={name} label={name}>\n <>\n <ToggleSwitch\n key={name}\n id={name}\n name={name}\n onChange={handleChange}\n on={name in requestContent ? requestContent[name] : false}\n />\n {description && <Label>{description}</Label>}\n </>\n </FormItem>\n);\n\nconst inputTextType = (type: string) => {\n switch (type) {\n case 'number':\n return 'number';\n case 'email':\n return 'email';\n case 'password':\n return 'password';\n default:\n return 'text';\n }\n};\n\n/**\n * Create a field text input item based on definitions\n * @param name Form item's name\n * @param description Form item's description\n * @param required Form item's required flag\n * @param type Form item's type\n * @param placeholder Form item's placeholder\n * @param handleChange A callback function that updates parent's component state when form item value changes\n * @param requestContent A state object containing the values of all form items\n * @returns A form item\n */\nconst createItem = (\n name: string,\n description: string,\n required: boolean,\n type: string,\n placeholder: string,\n handleChange: (e: BaseSyntheticEvent) => void,\n requestContent: RunItValues\n) => (\n <FormItem key={`${name}_fi`} id={name} label={name}>\n <InputText\n key={name}\n id={name}\n name={name}\n required={required}\n placeholder={`${placeholder} ${description || name}`}\n type={inputTextType(type)}\n value={name in requestContent ? requestContent[name] : ''}\n onChange={handleChange}\n />\n </FormItem>\n);\n\n/**\n * Creates a simple form item\n * @param input An object describing the form item\n * @param handleChange A callback function for updating the parent component's requestContent state with\n * text/email/password item changes\n * @param handleNumberChange A callback function for updating the parent component's requestContent state with number\n * item changes\n * @param handleBoolChange A callback function for updating the parent\n * component's requestContent state with bool item changes\n * @param handleDateChange A callback function for updating the parent\n * component's requestContent state with date item changes\n * @param requestContent A state object containing the values of all form items\n * @returns A simple form item\n */\nexport const createSimpleItem = (\n input: RunItInput,\n handleChange: (e: BaseSyntheticEvent) => void,\n handleNumberChange: (e: BaseSyntheticEvent) => void,\n handleBoolChange: (e: BaseSyntheticEvent) => void,\n handleDateChange: (name: string, date?: Date) => void,\n requestContent: RunItValues\n) => {\n switch (input.type) {\n case 'boolean':\n return createBoolItem(\n input.name,\n input.description,\n handleBoolChange,\n requestContent\n );\n case 'int64':\n case 'integer':\n case 'float':\n case 'double':\n return createItem(\n input.name,\n input.description,\n input.required,\n 'number',\n '(number)',\n handleNumberChange,\n requestContent\n );\n case 'string':\n case 'hostname':\n case 'uuid':\n case 'uri':\n case 'ipv4':\n case 'ipv6':\n return createItem(\n input.name,\n input.description,\n input.required,\n 'string',\n '(string)',\n handleChange,\n requestContent\n );\n case 'email':\n case 'password':\n return createItem(\n input.name,\n input.description,\n input.required,\n input.type,\n '(string)',\n handleChange,\n requestContent\n );\n case 'datetime':\n return createDateItem(input.name, handleDateChange, requestContent);\n default:\n return <Fragment key={input.name}></Fragment>;\n }\n};\n\n/**\n * Creates a complex item\n * @param input An object describing the form item\n * @param handleComplexChange A callback function for updating the parent\n * component's requestContent state\n * @param requestContent A state object containing the values of all form items\n * @returns A complex form item\n */\nexport const createComplexItem = (\n input: RunItInput,\n handleComplexChange: (value: string, name: string) => void,\n requestContent: RunItValues\n) => {\n const content = requestContent[input.name];\n const code =\n typeof content === 'string' ? content : JSON.stringify(content, null, 2);\n\n return (\n <FormItem\n key={`${input.name}_fic`}\n id={input.name}\n label={\n <Space>\n {input.name}\n <Tooltip content={BODY_HINT}>\n <Icon\n data-testid=\"body-param-tooltip\"\n icon={<Info />}\n size=\"xsmall\"\n ml=\"xsmall\"\n />\n </Tooltip>\n </Space>\n }\n >\n <CodeEditor\n key={`code_${input.name}`}\n language=\"json\"\n code={code}\n lineNumbers={false}\n onChange={handleComplexChange.bind(null, input.name)}\n transparent={true}\n />\n </FormItem>\n );\n};\n\n/**\n * Creates a required checkbox form item\n */\nexport const showDataChangeWarning = () => (\n <FormItem key=\"warningfi\" id=\"change_warning\">\n <FieldCheckbox\n name=\"warning\"\n key=\"warning\"\n required\n label=\"I understand that this API endpoint will change data.\"\n />\n </FormItem>\n);\n\n/**\n * Updates a given state with a key/value pair, taking into consideration\n * indeterminate values.\n * @param state A collection to update\n * @param key Property to update\n * @param newValue? New value corresponding to given key\n */\nexport const updateNullableProp = (\n state: RunItValues,\n key: string,\n newValue?: any\n) => {\n const updatedState = { ...state };\n if (key in state && !newValue) {\n delete updatedState[key];\n } else {\n updatedState[key] = newValue;\n }\n return updatedState;\n};\n\n/**\n * If the body isn't empty, it must be valid form encoded syntax\n *\n * This may not be perfect validation but it should be good enough to tolerate variances\n *\n * @param body to validate\n */\nexport const validateEncodedValues = (body: string) => {\n let result = '';\n if (!body) return result;\n const args = body.split('&');\n args.forEach(arg => {\n const formArg = /[\\w-_.]+(\\[])?=.*/i;\n if (!formArg.test(arg)) {\n result += ` ${arg}`;\n }\n });\n return result.trim();\n};\n\n/**\n * Returns an error message if the body is not JSON or valid form url encoding\n *\n * @param body string to validate\n * @param requiredKeys keys that are required in the body parameter\n */\nexport const validateBody = (\n body: string | Record<string, any>,\n requiredKeys: string[]\n) => {\n let parsed;\n\n let result = '';\n if (body) {\n if (typeof body === 'string') {\n if (/^[[{}\"]/.test(body)) {\n // most likely JSON\n try {\n parsed = JSON.parse(body);\n } catch (e: any) {\n result = e.message;\n }\n } else {\n result = validateEncodedValues(body);\n }\n if (result) {\n result = `Syntax error in the body: ${result}`;\n }\n } else {\n parsed = body;\n }\n }\n\n if (parsed && requiredKeys && requiredKeys.length > 0) {\n const required = new Set<string>(requiredKeys);\n const keys = new Set<string>(Object.keys(parsed));\n const missing = new Set<string>([...required].filter(k => !keys.has(k)));\n if (missing.size > 0) {\n result = `Error: Required properties \"${Array.from(missing).join(\n ', '\n )}\" must be provided in the body`;\n }\n }\n return result;\n};\n"],"mappings":"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"}
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"ResponseExplorer.js","names":["React","useState","IconButton","Span","Table","TableBody","TableDataCell","TableHead","TableHeaderCell","TableRow","styled","Warning","APIErrorDialog","APIErrorDisplay","ShowResponse","CollapserCard","DarkSpan","RunItHeading","getHeaders","response","headers","result","Object","entries","forEach","_ref","key","val","push","getBodySize","size","body","Blob","toString","length","concat","NoWrap","withConfig","displayName","componentId","ResponseHeaders","_ref2","rows","createElement","Fragment","heading","id","defaultOpen","divider","p","map","_ref3","value","ResponseExplorer","_ref4","verb","path","isOpen","setIsOpen","error","statusCode","contentType","JSON","parse","undefined","timed","responseCompleted","requestStarted","diff","toFixed","as","setOpen","onClick","icon","label","statusMessage","showDoc"],"sources":["../../../../src/components/ResponseExplorer/ResponseExplorer.tsx"],"sourcesContent":["/*\n\n MIT License\n\n Copyright (c) 2021 Looker Data Sciences, Inc.\n\n Permission is hereby granted, free of charge, to any person obtaining a copy\n of this software and associated documentation files (the \"Software\"), to deal\n in the Software without restriction, including without limitation the rights\n to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n copies of the Software, and to permit persons to whom the Software is\n furnished to do so, subject to the following conditions:\n\n The above copyright notice and this permission notice shall be included in all\n copies or substantial portions of the Software.\n\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n SOFTWARE.\n\n */\n\nimport type { FC } from 'react';\nimport React, { useState } from 'react';\nimport {\n IconButton,\n Span,\n Table,\n TableBody,\n TableDataCell,\n TableHead,\n TableHeaderCell,\n TableRow,\n} from '@looker/components';\nimport styled from 'styled-components';\nimport type { IRawResponse, LookerSDKError } from '@looker/sdk-rtl';\nimport { Warning } from '@styled-icons/material/Warning';\nimport { APIErrorDialog, APIErrorDisplay } from '@looker/extension-utils';\nimport { ShowResponse } from '../ShowResponse';\nimport { CollapserCard } from '../Collapser';\nimport { DarkSpan, RunItHeading } from '../common';\n\ntype HeaderTable = string[][];\nexport type ResponseContent = IRawResponse | undefined;\n\nconst getHeaders = (response: ResponseContent): HeaderTable => {\n if (!response?.headers) return [];\n const result: HeaderTable = [];\n Object.entries(response.headers).forEach(([key, val]) =>\n result.push([key, val])\n );\n return result;\n};\n\nconst getBodySize = (response: ResponseContent): string => {\n const size =\n !response || !response.body\n ? 0\n : response?.body instanceof Blob\n ? response?.body.size\n : response?.body.toString().length;\n\n return `${size} bytes`;\n};\n\nconst NoWrap = styled(Span)`\n display: inline-block;\n direction: rtl;\n white-space: nowrap;\n overflow: hidden;\n`;\n\ninterface ShowHeadersProps {\n response: ResponseContent;\n}\n\n/**\n * Display response headers in a table\n * @param response to display\n * @constructor\n */\nexport const ResponseHeaders: FC<ShowHeadersProps> = ({ response }) => {\n const rows = getHeaders(response);\n if (rows.length === 0) return <></>;\n return (\n <CollapserCard\n key=\"headers\"\n heading={`Headers (${rows.length})`}\n id=\"headers\"\n defaultOpen={false}\n divider={false}\n >\n <>\n <Table>\n <TableHead>\n <TableRow>\n <TableHeaderCell p=\"xsmall\">Name</TableHeaderCell>\n <TableHeaderCell p=\"xsmall\">Value</TableHeaderCell>\n </TableRow>\n </TableHead>\n <TableBody>\n {rows.map(([key, value]) => (\n <TableRow key={key}>\n <TableDataCell p=\"xsmall\">\n <NoWrap>\n <strong>{key}</strong>\n </NoWrap>\n </TableDataCell>\n <TableDataCell p=\"xsmall\">\n <Span>{value}</Span>\n </TableDataCell>\n </TableRow>\n ))}\n </TableBody>\n </Table>\n </>\n </CollapserCard>\n );\n};\n\ninterface ResponseExplorerProps {\n response: ResponseContent;\n verb: string;\n path: string;\n}\n\n/**\n * Explore the raw response from an HTTP request\n * @param response IRawResponse values\n * @param verb HTTP method\n * @param path Path of request\n * @constructor\n */\nexport const ResponseExplorer: FC<ResponseExplorerProps> = ({\n response,\n verb,\n path,\n}) => {\n const [isOpen, setIsOpen] = useState(false);\n const error: LookerSDKError =\n response &&\n response.statusCode >= 400 &&\n response.contentType === 'application/json'\n ? JSON.parse(response.body)\n : undefined;\n\n const timed = (response: IRawResponse) => {\n if (!(response.responseCompleted || response.requestStarted)) return '';\n const diff = (response.responseCompleted - response.requestStarted) / 1000;\n return `Seconds: ${diff.toFixed(3)}`;\n };\n\n return (\n <>\n {!response && <DarkSpan>No response was received</DarkSpan>}\n {response && (\n <>\n <RunItHeading as=\"h4\">\n {error && (\n <>\n <APIErrorDialog\n error={error}\n isOpen={isOpen}\n setOpen={setIsOpen}\n />\n <IconButton\n size=\"small\"\n onClick={() => setIsOpen(true)}\n icon={<Warning />}\n aria-label=\"API error\"\n label=\"API Error\"\n />\n </>\n )}\n {`${verb || ''} ${path || ''} (${response.statusCode}: ${\n response.statusMessage\n }) ${timed(response)}`}\n </RunItHeading>\n <CollapserCard\n divider={false}\n heading={`Body (${getBodySize(response)})`}\n id=\"body\"\n >\n <ShowResponse response={response} />\n </CollapserCard>\n {error && (\n <CollapserCard divider={false} heading={'Error information'}>\n <APIErrorDisplay error={error} showDoc={true} />\n </CollapserCard>\n )}\n <ResponseHeaders response={response} />\n </>\n )}\n </>\n );\n};\n"],"mappings":"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"}
|
1
|
+
{"version":3,"file":"ResponseExplorer.js","names":["React","useState","IconButton","Span","Table","TableBody","TableDataCell","TableHead","TableHeaderCell","TableRow","styled","Warning","APIErrorDialog","APIErrorDisplay","ShowResponse","CollapserCard","DarkSpan","RunItHeading","getHeaders","response","headers","result","Object","entries","forEach","_ref","key","val","push","getBodySize","size","body","Blob","toString","length","concat","NoWrap","withConfig","displayName","componentId","ResponseHeaders","_ref2","rows","createElement","Fragment","heading","id","defaultOpen","divider","p","map","_ref3","value","ResponseExplorer","_ref4","verb","path","isOpen","setIsOpen","error","statusCode","contentType","JSON","parse","undefined","timed","responseCompleted","requestStarted","diff","toFixed","as","setOpen","onClick","icon","label","statusMessage","showDoc"],"sources":["../../../../src/components/ResponseExplorer/ResponseExplorer.tsx"],"sourcesContent":["/*\n\n MIT License\n\n Copyright (c) 2021 Looker Data Sciences, Inc.\n\n Permission is hereby granted, free of charge, to any person obtaining a copy\n of this software and associated documentation files (the \"Software\"), to deal\n in the Software without restriction, including without limitation the rights\n to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n copies of the Software, and to permit persons to whom the Software is\n furnished to do so, subject to the following conditions:\n\n The above copyright notice and this permission notice shall be included in all\n copies or substantial portions of the Software.\n\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n SOFTWARE.\n\n */\n\nimport type { FC } from 'react';\nimport React, { useState } from 'react';\nimport {\n IconButton,\n Span,\n Table,\n TableBody,\n TableDataCell,\n TableHead,\n TableHeaderCell,\n TableRow,\n} from '@looker/components';\nimport styled from 'styled-components';\nimport type { IRawResponse, LookerSDKError } from '@looker/sdk-rtl';\nimport { Warning } from '@styled-icons/material/Warning';\nimport { APIErrorDialog, APIErrorDisplay } from '@looker/extension-utils';\nimport { ShowResponse } from '../ShowResponse';\nimport { CollapserCard } from '../Collapser';\nimport { DarkSpan, RunItHeading } from '../common';\n\ntype HeaderTable = string[][];\nexport type ResponseContent = IRawResponse | undefined;\n\nconst getHeaders = (response: ResponseContent): HeaderTable => {\n if (!response?.headers) return [];\n const result: HeaderTable = [];\n Object.entries(response.headers).forEach(([key, val]) =>\n result.push([key, val])\n );\n return result;\n};\n\nconst getBodySize = (response: ResponseContent): string => {\n const size =\n !response || !response.body\n ? 0\n : response?.body instanceof Blob\n ? response?.body.size\n : response?.body.toString().length;\n\n return `${size} bytes`;\n};\n\nconst NoWrap = styled(Span)`\n display: inline-block;\n direction: rtl;\n white-space: nowrap;\n overflow: hidden;\n`;\n\ninterface ShowHeadersProps {\n response: ResponseContent;\n}\n\n/**\n * Display response headers in a table\n * @param response to display\n * @constructor\n */\nexport const ResponseHeaders: FC<ShowHeadersProps> = ({ response }) => {\n const rows = getHeaders(response);\n if (rows.length === 0) return <></>;\n return (\n <CollapserCard\n key=\"headers\"\n heading={`Headers (${rows.length})`}\n id=\"headers\"\n defaultOpen={false}\n divider={false}\n >\n <>\n <Table>\n <TableHead>\n <TableRow>\n <TableHeaderCell p=\"xsmall\">Name</TableHeaderCell>\n <TableHeaderCell p=\"xsmall\">Value</TableHeaderCell>\n </TableRow>\n </TableHead>\n <TableBody>\n {rows.map(([key, value]) => (\n <TableRow key={key}>\n <TableDataCell p=\"xsmall\">\n <NoWrap>\n <strong>{key}</strong>\n </NoWrap>\n </TableDataCell>\n <TableDataCell p=\"xsmall\">\n <Span>{value}</Span>\n </TableDataCell>\n </TableRow>\n ))}\n </TableBody>\n </Table>\n </>\n </CollapserCard>\n );\n};\n\ninterface ResponseExplorerProps {\n response: ResponseContent;\n verb: string;\n path: string;\n}\n\n/**\n * Explore the raw response from an HTTP request\n * @param response IRawResponse values\n * @param verb HTTP method\n * @param path Path of request\n * @constructor\n */\nexport const ResponseExplorer: FC<ResponseExplorerProps> = ({\n response,\n verb,\n path,\n}) => {\n const [isOpen, setIsOpen] = useState(false);\n const error: LookerSDKError =\n response &&\n response.statusCode >= 400 &&\n response.contentType === 'application/json'\n ? JSON.parse(response.body)\n : undefined;\n\n const timed = (response: IRawResponse) => {\n if (!(response.responseCompleted || response.requestStarted)) return '';\n const diff = (response.responseCompleted - response.requestStarted) / 1000;\n return `Seconds: ${diff.toFixed(3)}`;\n };\n\n return (\n <>\n {!response && <DarkSpan>No response was received</DarkSpan>}\n {response && (\n <>\n <RunItHeading as=\"h4\">\n {error && (\n <>\n <APIErrorDialog\n error={error}\n isOpen={isOpen}\n setOpen={setIsOpen}\n />\n <IconButton\n size=\"small\"\n onClick={() => setIsOpen(true)}\n icon={<Warning />}\n aria-label=\"API error\"\n label=\"API Error\"\n />\n </>\n )}\n {`${verb || ''} ${path || ''} (${response.statusCode}: ${\n response.statusMessage\n }) ${timed(response)}`}\n </RunItHeading>\n <CollapserCard\n divider={false}\n heading={`Body (${getBodySize(response)})`}\n id=\"body\"\n >\n <ShowResponse response={response} />\n </CollapserCard>\n {error && (\n <CollapserCard divider={false} heading={'Error information'}>\n <APIErrorDisplay error={error} showDoc={true} />\n </CollapserCard>\n )}\n <ResponseHeaders response={response} />\n </>\n )}\n </>\n );\n};\n"],"mappings":"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"}
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"responseUtils.js","names":["React","ResponseMode","responseMode","MessageBar","Paragraph","Tab","TabList","TabPanel","TabPanels","useTabs","CodeCopy","Markdown","DataGrid","json2Csv","parseCsv","allSimple","data","Array","isArray","i","length","col","test","Object","Date","copyRaw","code","language","arguments","undefined","createElement","lineNumbers","transparent","isColumnar","complex","values","find","row","ItemType","itemType","value","Undefined","Simple","getTypes","json","types","Set","add","_loop","key","type","keys","forEach","k","v","canTabulate","size","has","ShowJSON","response","content","body","toString","parsed","JSON","parse","showGrid","stringify","raw","ShowText","Fragment","statusMessage","ShowCSV","ShowMD","tabs","_extends","pt","source","ShowImage","Blob","URL","createObjectURL","concat","contentType","btoa","src","alt","url","ShowHTML","ShowSQL","ShowUnknown","message","ShowPDF","ShowRaw","_response$body","intent","noActions","responseHandlers","label","isRecognized","component","string","pickResponseHandler","result","handler","fallbackResponseHandler"],"sources":["../../../../src/components/ShowResponse/responseUtils.tsx"],"sourcesContent":["/*\n\n MIT License\n\n Copyright (c) 2021 Looker Data Sciences, Inc.\n\n Permission is hereby granted, free of charge, to any person obtaining a copy\n of this software and associated documentation files (the \"Software\"), to deal\n in the Software without restriction, including without limitation the rights\n to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n copies of the Software, and to permit persons to whom the Software is\n furnished to do so, subject to the following conditions:\n\n The above copyright notice and this permission notice shall be included in all\n copies or substantial portions of the Software.\n\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n SOFTWARE.\n\n */\nimport type { ReactElement } from 'react';\nimport React from 'react';\nimport type { IRawResponse } from '@looker/sdk-rtl';\nimport { ResponseMode, responseMode } from '@looker/sdk-rtl';\nimport {\n MessageBar,\n Paragraph,\n Tab,\n TabList,\n TabPanel,\n TabPanels,\n useTabs,\n} from '@looker/components';\nimport { CodeCopy, Markdown } from '@looker/code-editor';\nimport { DataGrid, json2Csv, parseCsv } from '../DataGrid';\n\n/**\n * Are all items this array \"simple\"\n * @param data to check for simplicity\n */\nexport const allSimple = (data: any[]) => {\n if (!Array.isArray(data)) return false;\n for (let i = 0; i < data.length; i++) {\n const col = data[i];\n if (col) {\n if (/\\[object Object]/gi.test(col)) return false;\n if (Array.isArray(col)) return false;\n if (col instanceof Object && !(col instanceof Date)) return false;\n }\n }\n return true;\n};\n\nconst copyRaw = (code: string, language = 'unknown') => {\n return (\n <CodeCopy language={language} code={code} lineNumbers={false} transparent />\n );\n};\n\n/**\n * Is every array in this array a \"simple\" data row?\n * @param data to check for columnarity\n */\nexport const isColumnar = (data: any[]) => {\n if (data.length === 0) return false;\n if (data.length === 1 && data[0].length === 0) return false;\n const complex = Object.values(data).find((row: any[]) => !allSimple(row));\n return !complex;\n};\n\nenum ItemType {\n Array = 'a',\n Object = 'o',\n Simple = 's',\n Undefined = 'u',\n}\n\n/**\n * Is this an array, an object, a value, or undefined\n * @param value to check\n */\nconst itemType = (value: any): ItemType => {\n if (!value) return ItemType.Undefined;\n if (Array.isArray(value)) return ItemType.Array;\n if (value instanceof Object) return ItemType.Object;\n return ItemType.Simple;\n};\n\n/**\n * Get the 2D type mapping for the object\n * @param json to analyze\n */\nconst getTypes = (json: any) => {\n const types = [new Set<ItemType>(), new Set<ItemType>()];\n if (!json) {\n types[0].add(ItemType.Undefined);\n return types;\n }\n for (const key of Object.keys(json)) {\n const value = json[key];\n const type = itemType(value);\n types[0].add(type);\n switch (type) {\n case ItemType.Array:\n case ItemType.Object:\n Object.keys(value).forEach((k) => {\n const v = value[k];\n types[1].add(itemType(v));\n });\n break;\n }\n }\n return types;\n};\n\n/**\n * Is this a uniform object that can be converted into a table?\n * @param json to analyze\n */\nexport const canTabulate = (json: any) => {\n const types = getTypes(json);\n return (\n types[0].size === 1 &&\n (types[0].has(ItemType.Array) || types[0].has(ItemType.Object)) &&\n types[1].size <= 1\n );\n};\n\n/**\n * Show JSON responses\n *\n * Shows the JSON in a syntax-highlighted fashion\n * If the JSON is parseable as 2D row/column data it will also be shown in grid\n * If JSON cannot be parsed it will be shown as is\n * @param response\n */\nconst ShowJSON = (response: IRawResponse) => {\n const content = response.body.toString();\n const parsed = JSON.parse(response.body);\n const data = canTabulate(parsed) ? json2Csv(content) : undefined;\n const showGrid = data && isColumnar(data.data);\n const json = JSON.stringify(parsed, null, 2);\n const raw = copyRaw(json, 'json');\n if (showGrid) return <DataGrid data={data.data} raw={raw} />;\n return raw;\n};\n\n/** A handler for text type responses */\nconst ShowText = (response: IRawResponse) => (\n <>\n {response.statusMessage !== 'OK' && response.statusMessage}\n {copyRaw(response.body.toString())}\n </>\n);\n\n/**\n * Show CSV grid and raw data\n * @param response HTTP response to parse and display\n */\nconst ShowCSV = (response: IRawResponse) => {\n const raw = copyRaw(response.body.toString());\n const data = parseCsv(response.body.toString());\n return <DataGrid data={data.data} raw={raw} />;\n};\n\nconst ShowMD = (response: IRawResponse) => {\n const tabs = useTabs();\n const raw = copyRaw(response.body.toString(), 'markup');\n const data = response.body.toString();\n return (\n <>\n <TabList {...tabs}>\n <Tab key=\"md\">Markdown</Tab>\n <Tab key=\"raw\">Raw</Tab>\n </TabList>\n <TabPanels {...tabs} pt=\"0\">\n <TabPanel key=\"doc\">\n <Markdown source={data} />\n </TabPanel>\n <TabPanel key=\"text\">{raw}</TabPanel>\n </TabPanels>\n </>\n );\n};\n\n/** A handler for image type responses */\nconst ShowImage = (response: IRawResponse) => {\n let content: string;\n if (response.body instanceof Blob) {\n content = URL.createObjectURL(response.body).toString();\n } else {\n content = `data:${response.contentType};base64,${btoa(response.body)}`;\n }\n return (\n <img\n src={content}\n alt={`${response.url} returned ${response.contentType}`}\n />\n );\n};\n\n/** A handler for HTTP type responses */\nconst ShowHTML = (response: IRawResponse) =>\n copyRaw(response.body.toString(), 'html');\n\nconst ShowSQL = (response: IRawResponse) =>\n copyRaw(response.body.toString(), 'sql');\n\n/**\n * A handler for unknown response types. It renders the size of the unknown response and its type.\n */\nconst ShowUnknown = (response: IRawResponse) => {\n const body = response.body || '';\n const message = `Received ${\n body instanceof Blob ? body.size : body.toString().length\n } bytes of ${response.contentType} data.`;\n return <Paragraph>{message}</Paragraph>;\n};\n\n/** Displays a PDF inside the page */\nconst ShowPDF = (response: IRawResponse) => {\n // TODO display a PDF, maybe similar to https://github.com/wojtekmaj/react-pdf/blob/master/sample/webpack/Sample.jsx\n return ShowUnknown(response);\n};\n\n/** A handler for responses that cannot be parsed */\nconst ShowRaw = (response: IRawResponse) => (\n <>\n {ShowUnknown(response)}\n <MessageBar intent=\"warn\" noActions>\n The response body could not be parsed. Displaying raw data.\n </MessageBar>\n {copyRaw(response?.body?.toString() || '')}\n </>\n);\n\ninterface Responder {\n /** A label indicating the supported MIME type(s) */\n label: string;\n /** A lambda for determining whether a given MIME type is supported */\n isRecognized: (contentType: string) => boolean;\n /** A component that renders recognized MIME types */\n component: (response: IRawResponse) => ReactElement;\n}\n\n/**\n * An array of response handlers, describing currently supported MIME types\n */\nexport const responseHandlers: Responder[] = [\n // TODO: Add support for content type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet and pdf\n {\n label: 'json',\n isRecognized: (contentType) => /application\\/json/g.test(contentType),\n component: (response) => ShowJSON(response),\n },\n {\n label: 'html',\n isRecognized: (contentType) => /text\\/html/g.test(contentType),\n component: (response) => ShowHTML(response),\n },\n {\n label: 'csv',\n isRecognized: (contentType) => /text\\/csv/g.test(contentType),\n component: (response) => ShowCSV(response),\n },\n {\n label: 'md',\n isRecognized: (contentType) => /text\\/markdown/g.test(contentType),\n component: (response) => ShowMD(response),\n },\n // SVG would normally be considered a \"string\" because of the xml tag, so it must be checked before text\n {\n label: 'img',\n isRecognized: (contentType) =>\n /image\\/(png|jpg|jpeg|svg\\+xml)/.test(contentType),\n component: (response) => ShowImage(response),\n },\n {\n // render task: 9d52f842b2c3f474970123302b2fa7e0\n label: 'pdf',\n isRecognized: (contentType) => /application\\/pdf/g.test(contentType),\n component: (response) => ShowPDF(response),\n },\n {\n label: 'sql',\n isRecognized: (contentType) => /application\\/sql/g.test(contentType),\n component: (response) => ShowSQL(response),\n },\n {\n label: 'text',\n isRecognized: (contentType) =>\n responseMode(contentType) === ResponseMode.string ||\n contentType === 'text',\n component: (response) => ShowText(response),\n },\n {\n label: 'unknown',\n isRecognized: (contentType: string) => !!contentType,\n component: (response) => ShowUnknown(response),\n },\n];\n\n/** find the response handler or return the default */\nexport const pickResponseHandler = (response: IRawResponse) => {\n let result = responseHandlers[responseHandlers.length - 1];\n for (const handler of responseHandlers) {\n if (handler.isRecognized(response.contentType)) {\n result = handler;\n break;\n }\n }\n return result;\n};\n\nexport const fallbackResponseHandler = (): Responder => ({\n label: 'unknown',\n isRecognized: (contentType: string) => !!contentType,\n component: (response) => ShowRaw(response),\n});\n"],"mappings":"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"}
|
1
|
+
{"version":3,"file":"responseUtils.js","names":["React","ResponseMode","responseMode","MessageBar","Paragraph","Tab","TabList","TabPanel","TabPanels","useTabs","CodeCopy","Markdown","DataGrid","json2Csv","parseCsv","allSimple","data","Array","isArray","i","length","col","test","Object","Date","copyRaw","code","language","arguments","undefined","createElement","lineNumbers","transparent","isColumnar","complex","values","find","row","ItemType","itemType","value","Undefined","Simple","getTypes","json","types","Set","add","_loop","key","type","keys","forEach","k","v","canTabulate","size","has","ShowJSON","response","content","body","toString","parsed","JSON","parse","showGrid","stringify","raw","ShowText","Fragment","statusMessage","ShowCSV","ShowMD","tabs","_extends","pt","source","ShowImage","Blob","URL","createObjectURL","concat","contentType","btoa","src","alt","url","ShowHTML","ShowSQL","ShowUnknown","message","ShowPDF","ShowRaw","_response$body","intent","noActions","responseHandlers","label","isRecognized","component","string","pickResponseHandler","result","handler","fallbackResponseHandler"],"sources":["../../../../src/components/ShowResponse/responseUtils.tsx"],"sourcesContent":["/*\n\n MIT License\n\n Copyright (c) 2021 Looker Data Sciences, Inc.\n\n Permission is hereby granted, free of charge, to any person obtaining a copy\n of this software and associated documentation files (the \"Software\"), to deal\n in the Software without restriction, including without limitation the rights\n to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n copies of the Software, and to permit persons to whom the Software is\n furnished to do so, subject to the following conditions:\n\n The above copyright notice and this permission notice shall be included in all\n copies or substantial portions of the Software.\n\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n SOFTWARE.\n\n */\nimport type { ReactElement } from 'react';\nimport React from 'react';\nimport type { IRawResponse } from '@looker/sdk-rtl';\nimport { ResponseMode, responseMode } from '@looker/sdk-rtl';\nimport {\n MessageBar,\n Paragraph,\n Tab,\n TabList,\n TabPanel,\n TabPanels,\n useTabs,\n} from '@looker/components';\nimport { CodeCopy, Markdown } from '@looker/code-editor';\nimport { DataGrid, json2Csv, parseCsv } from '../DataGrid';\n\n/**\n * Are all items this array \"simple\"\n * @param data to check for simplicity\n */\nexport const allSimple = (data: any[]) => {\n if (!Array.isArray(data)) return false;\n for (let i = 0; i < data.length; i++) {\n const col = data[i];\n if (col) {\n if (/\\[object Object]/gi.test(col)) return false;\n if (Array.isArray(col)) return false;\n if (col instanceof Object && !(col instanceof Date)) return false;\n }\n }\n return true;\n};\n\nconst copyRaw = (code: string, language = 'unknown') => {\n return (\n <CodeCopy language={language} code={code} lineNumbers={false} transparent />\n );\n};\n\n/**\n * Is every array in this array a \"simple\" data row?\n * @param data to check for columnarity\n */\nexport const isColumnar = (data: any[]) => {\n if (data.length === 0) return false;\n if (data.length === 1 && data[0].length === 0) return false;\n const complex = Object.values(data).find((row: any[]) => !allSimple(row));\n return !complex;\n};\n\nenum ItemType {\n Array = 'a',\n Object = 'o',\n Simple = 's',\n Undefined = 'u',\n}\n\n/**\n * Is this an array, an object, a value, or undefined\n * @param value to check\n */\nconst itemType = (value: any): ItemType => {\n if (!value) return ItemType.Undefined;\n if (Array.isArray(value)) return ItemType.Array;\n if (value instanceof Object) return ItemType.Object;\n return ItemType.Simple;\n};\n\n/**\n * Get the 2D type mapping for the object\n * @param json to analyze\n */\nconst getTypes = (json: any) => {\n const types = [new Set<ItemType>(), new Set<ItemType>()];\n if (!json) {\n types[0].add(ItemType.Undefined);\n return types;\n }\n for (const key of Object.keys(json)) {\n const value = json[key];\n const type = itemType(value);\n types[0].add(type);\n switch (type) {\n case ItemType.Array:\n case ItemType.Object:\n Object.keys(value).forEach(k => {\n const v = value[k];\n types[1].add(itemType(v));\n });\n break;\n }\n }\n return types;\n};\n\n/**\n * Is this a uniform object that can be converted into a table?\n * @param json to analyze\n */\nexport const canTabulate = (json: any) => {\n const types = getTypes(json);\n return (\n types[0].size === 1 &&\n (types[0].has(ItemType.Array) || types[0].has(ItemType.Object)) &&\n types[1].size <= 1\n );\n};\n\n/**\n * Show JSON responses\n *\n * Shows the JSON in a syntax-highlighted fashion\n * If the JSON is parseable as 2D row/column data it will also be shown in grid\n * If JSON cannot be parsed it will be shown as is\n * @param response\n */\nconst ShowJSON = (response: IRawResponse) => {\n const content = response.body.toString();\n const parsed = JSON.parse(response.body);\n const data = canTabulate(parsed) ? json2Csv(content) : undefined;\n const showGrid = data && isColumnar(data.data);\n const json = JSON.stringify(parsed, null, 2);\n const raw = copyRaw(json, 'json');\n if (showGrid) return <DataGrid data={data.data} raw={raw} />;\n return raw;\n};\n\n/** A handler for text type responses */\nconst ShowText = (response: IRawResponse) => (\n <>\n {response.statusMessage !== 'OK' && response.statusMessage}\n {copyRaw(response.body.toString())}\n </>\n);\n\n/**\n * Show CSV grid and raw data\n * @param response HTTP response to parse and display\n */\nconst ShowCSV = (response: IRawResponse) => {\n const raw = copyRaw(response.body.toString());\n const data = parseCsv(response.body.toString());\n return <DataGrid data={data.data} raw={raw} />;\n};\n\nconst ShowMD = (response: IRawResponse) => {\n const tabs = useTabs();\n const raw = copyRaw(response.body.toString(), 'markup');\n const data = response.body.toString();\n return (\n <>\n <TabList {...tabs}>\n <Tab key=\"md\">Markdown</Tab>\n <Tab key=\"raw\">Raw</Tab>\n </TabList>\n <TabPanels {...tabs} pt=\"0\">\n <TabPanel key=\"doc\">\n <Markdown source={data} />\n </TabPanel>\n <TabPanel key=\"text\">{raw}</TabPanel>\n </TabPanels>\n </>\n );\n};\n\n/** A handler for image type responses */\nconst ShowImage = (response: IRawResponse) => {\n let content: string;\n if (response.body instanceof Blob) {\n content = URL.createObjectURL(response.body).toString();\n } else {\n content = `data:${response.contentType};base64,${btoa(response.body)}`;\n }\n return (\n <img\n src={content}\n alt={`${response.url} returned ${response.contentType}`}\n />\n );\n};\n\n/** A handler for HTTP type responses */\nconst ShowHTML = (response: IRawResponse) =>\n copyRaw(response.body.toString(), 'html');\n\nconst ShowSQL = (response: IRawResponse) =>\n copyRaw(response.body.toString(), 'sql');\n\n/**\n * A handler for unknown response types. It renders the size of the unknown response and its type.\n */\nconst ShowUnknown = (response: IRawResponse) => {\n const body = response.body || '';\n const message = `Received ${\n body instanceof Blob ? body.size : body.toString().length\n } bytes of ${response.contentType} data.`;\n return <Paragraph>{message}</Paragraph>;\n};\n\n/** Displays a PDF inside the page */\nconst ShowPDF = (response: IRawResponse) => {\n // TODO display a PDF, maybe similar to https://github.com/wojtekmaj/react-pdf/blob/master/sample/webpack/Sample.jsx\n return ShowUnknown(response);\n};\n\n/** A handler for responses that cannot be parsed */\nconst ShowRaw = (response: IRawResponse) => (\n <>\n {ShowUnknown(response)}\n <MessageBar intent=\"warn\" noActions>\n The response body could not be parsed. Displaying raw data.\n </MessageBar>\n {copyRaw(response?.body?.toString() || '')}\n </>\n);\n\ninterface Responder {\n /** A label indicating the supported MIME type(s) */\n label: string;\n /** A lambda for determining whether a given MIME type is supported */\n isRecognized: (contentType: string) => boolean;\n /** A component that renders recognized MIME types */\n component: (response: IRawResponse) => ReactElement;\n}\n\n/**\n * An array of response handlers, describing currently supported MIME types\n */\nexport const responseHandlers: Responder[] = [\n // TODO: Add support for content type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet and pdf\n {\n label: 'json',\n isRecognized: contentType => /application\\/json/g.test(contentType),\n component: response => ShowJSON(response),\n },\n {\n label: 'html',\n isRecognized: contentType => /text\\/html/g.test(contentType),\n component: response => ShowHTML(response),\n },\n {\n label: 'csv',\n isRecognized: contentType => /text\\/csv/g.test(contentType),\n component: response => ShowCSV(response),\n },\n {\n label: 'md',\n isRecognized: contentType => /text\\/markdown/g.test(contentType),\n component: response => ShowMD(response),\n },\n // SVG would normally be considered a \"string\" because of the xml tag, so it must be checked before text\n {\n label: 'img',\n isRecognized: contentType =>\n /image\\/(png|jpg|jpeg|svg\\+xml)/.test(contentType),\n component: response => ShowImage(response),\n },\n {\n // render task: 9d52f842b2c3f474970123302b2fa7e0\n label: 'pdf',\n isRecognized: contentType => /application\\/pdf/g.test(contentType),\n component: response => ShowPDF(response),\n },\n {\n label: 'sql',\n isRecognized: contentType => /application\\/sql/g.test(contentType),\n component: response => ShowSQL(response),\n },\n {\n label: 'text',\n isRecognized: contentType =>\n responseMode(contentType) === ResponseMode.string ||\n contentType === 'text',\n component: response => ShowText(response),\n },\n {\n label: 'unknown',\n isRecognized: (contentType: string) => !!contentType,\n component: response => ShowUnknown(response),\n },\n];\n\n/** find the response handler or return the default */\nexport const pickResponseHandler = (response: IRawResponse) => {\n let result = responseHandlers[responseHandlers.length - 1];\n for (const handler of responseHandlers) {\n if (handler.isRecognized(response.contentType)) {\n result = handler;\n break;\n }\n }\n return result;\n};\n\nexport const fallbackResponseHandler = (): Responder => ({\n label: 'unknown',\n isRecognized: (contentType: string) => !!contentType,\n component: response => ShowRaw(response),\n});\n"],"mappings":"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"}
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"requestUtils.js","names":["cloneDeep","isEmpty","ArrayType","DelimArrayType","EnumType","HashType","IntrinsicType","trimInputs","getEnvAdaptor","RunItFormKey","runItNoSet","value","macro","path","vars","replace","_","b","pathify","pathParams","result","includes","prepareInputs","inputs","requestContent","input","name","location","parsed","JSON","parse","type","e","formValues","_ref","_asyncToGenerator","adaptor","formValue","localStorageGetItem","localStorageRemoveItem","apply","arguments","initRequestContent","length","undefined","content","createRequestParams","keepBody","queryParams","prepped","trimmed","body","Error","concat","runRequest","_ref2","sdk","basePath","httpMethod","endpoint","authSession","isAuthenticated","ok","login","url","requestStarted","Date","now","raw","transport","rawRequest","props","authenticate","responseCompleted","_x","_x2","_x3","_x4","_x5","_x6","_x7","getTypeDefault","createSampleBody","spec","getSampleValue","elementType","customType","recurse","types","sampleBody","prop","writeable","sampleValue","editType","createInputs","method","allParams","map","param","required","description"],"sources":["../../../src/utils/requestUtils.ts"],"sourcesContent":["/*\n\n MIT License\n\n Copyright (c) 2021 Looker Data Sciences, Inc.\n\n Permission is hereby granted, free of charge, to any person obtaining a copy\n of this software and associated documentation files (the \"Software\"), to deal\n in the Software without restriction, including without limitation the rights\n to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n copies of the Software, and to permit persons to whom the Software is\n furnished to do so, subject to the following conditions:\n\n The above copyright notice and this permission notice shall be included in all\n copies or substantial portions of the Software.\n\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n SOFTWARE.\n\n */\n\nimport type { IAPIMethods, IRawResponse } from '@looker/sdk-rtl';\nimport cloneDeep from 'lodash/cloneDeep';\nimport isEmpty from 'lodash/isEmpty';\nimport type { IApiModel, IMethod, IType } from '@looker/sdk-codegen';\nimport {\n ArrayType,\n DelimArrayType,\n EnumType,\n HashType,\n IntrinsicType,\n trimInputs,\n} from '@looker/sdk-codegen';\nimport { getEnvAdaptor } from '@looker/extension-utils';\n\nimport type { RunItHttpMethod, RunItInput, RunItValues } from '../RunIt';\nimport { RunItFormKey } from '../components';\n\n/** Hook to set a URL somewhere else in APIX */\nexport type RunItSetter = (value: any) => any;\n\n/**\n * A \"no-op\" function\n * @param value passed through\n */\nexport const runItNoSet: RunItSetter = (value: any) => value;\n\n/**\n * Replaces {foo} with vars[foo] in provided path\n * @param path with templatized param names\n * @param vars Collection of path params\n * @returns Path with param names replaced with values\n */\nconst macro = (path: string, vars: RunItValues) =>\n path.replace(/{(\\w+)}/g, (_, b) => vars[b]);\n\n/**\n * Construct a full request path including path params\n * @param path A request path with path params in curly braces e.g. /queries/{query_id}/run/{result_format}\n * @param pathParams Collection of path params\n * @returns a full request path\n */\nexport const pathify = (path: string, pathParams?: RunItValues): string => {\n let result = path;\n if (pathParams && path.includes('{')) {\n result = macro(path, pathParams);\n }\n return result;\n};\n\n/**\n * Prepares the inputs for use with the SDK and other RunIt components\n * @param inputs An array describing RunIt form inputs\n * @param requestContent Current request parameters\n */\nexport const prepareInputs = (\n inputs: RunItInput[],\n requestContent: RunItValues\n) => {\n const result = cloneDeep(requestContent);\n for (const input of inputs) {\n const name = input.name;\n if (input.location === 'body') {\n try {\n let parsed;\n if (name in requestContent) {\n const value = requestContent[name];\n /** The value is not a string when the user has not interacted with this param and prepareInputs has been\n * called (e.g. if user navigates to the Code tab).\n */\n parsed = typeof value === 'string' ? JSON.parse(value) : value;\n } else {\n /** This scenario occurs when RunIt is about to be mounted for a new method */\n parsed = input.type;\n }\n result[name] = parsed;\n } catch (e) {\n /** Treat as x-www-form-urlencoded */\n result[name] = requestContent[name];\n }\n }\n }\n return result;\n};\n\n/**\n * Load and clear any saved form values from the session\n * @param configurator storage service\n */\nexport const formValues = async () => {\n const adaptor = getEnvAdaptor();\n const formValue = await adaptor.localStorageGetItem(RunItFormKey);\n const result = formValue ? JSON.parse(formValue) : {};\n adaptor.localStorageRemoveItem(RunItFormKey);\n return result;\n};\n\n/**\n * Initializes the request content object from local storage or input definitions, in that order\n * @param configurator storage service\n * @param inputs\n * @param requestContent the current request content\n */\nexport const initRequestContent = (\n inputs: RunItInput[],\n requestContent = {}\n) => {\n // TODO: Temporarily disabling request form state persistence until RunIt is using redux\n // let content = await formValues()\n let content = {};\n if (isEmpty(content)) {\n content = prepareInputs(inputs, requestContent);\n }\n return content;\n};\n\n/**\n * Takes all form input values and categorizes them based on their request location\n * @param inputs RunIt form inputs\n * @param requestContent Form input values\n * @param keepBody true to keep body as is. false trims body values (default)\n * @returns path, query and body param objects\n */\nexport const createRequestParams = (\n inputs: RunItInput[],\n requestContent: RunItValues,\n keepBody = false\n) => {\n const pathParams: any = {};\n const queryParams: any = {};\n const prepped = prepareInputs(inputs, requestContent);\n const trimmed = trimInputs(prepped, keepBody);\n let body;\n for (const input of inputs) {\n const name = input.name;\n switch (input.location) {\n case 'path':\n pathParams[name] = trimmed[name];\n break;\n case 'query':\n queryParams[name] = trimmed[name];\n break;\n case 'body':\n body = trimmed[name];\n break;\n default:\n throw new Error(`Invalid input location: '${input.location}'`);\n }\n }\n return [pathParams, queryParams, body];\n};\n\n/**\n * Makes an http request using the SDK browser transport rawRequest method\n * @param sdk functional SDK that supports rawRequest via its transport\n * @param basePath base path for the URL. For standalone this includes the specKey. Empty for extension.\n * @param httpMethod Request operation\n * @param endpoint Request path with path params in curly braces e.g. /queries/{query_id}/run/{result_format}\n * @param pathParams Collection of path params\n * @param queryParams Collection of query params\n * @param body Collection of body params\n */\nexport const runRequest = async (\n sdk: IAPIMethods,\n basePath: string,\n httpMethod: RunItHttpMethod,\n endpoint: string,\n pathParams: RunItValues,\n queryParams: RunItValues,\n body: any\n): Promise<IRawResponse> => {\n if (!sdk.authSession.isAuthenticated()) {\n await sdk.ok(sdk.authSession.login());\n }\n const url = `${basePath}${pathify(endpoint, pathParams)}`;\n const requestStarted = Date.now();\n const raw = await sdk.authSession.transport.rawRequest(\n httpMethod,\n url,\n queryParams,\n body,\n (props) => sdk.authSession.authenticate(props)\n );\n const responseCompleted = Date.now();\n // populate timing info if it's not already provided by the transport\n if (!raw.requestStarted) raw.requestStarted = requestStarted;\n if (!raw.responseCompleted) raw.responseCompleted = responseCompleted;\n return raw;\n};\n\n/**\n * Return a default value for a given type name\n * @param type A type name\n */\nconst getTypeDefault = (type: string) => {\n // TODO: use potential equivalent from sdk-codegen, confirm formats\n switch (type) {\n case 'boolean':\n return false;\n case 'int64':\n case 'integer':\n return 0;\n case 'float':\n case 'double':\n return 0.0;\n case 'hostname':\n case 'ipv4':\n case 'ipv6':\n case 'uuid':\n case 'uri':\n case 'string':\n case 'email':\n return '';\n case 'string[]':\n return [];\n case 'object':\n return {};\n case 'datetime':\n return '';\n default:\n return '';\n }\n};\n\n/**\n * Given a type object reduce it to its writeable intrinsic and/or custom type properties and their default values\n * @param spec Api spec\n * @param type A type object\n */\nconst createSampleBody = (spec: IApiModel, type: IType) => {\n /* eslint-disable @typescript-eslint/no-use-before-define */\n const getSampleValue = (type: IType) => {\n if (type instanceof IntrinsicType) return getTypeDefault(type.name);\n if (type instanceof DelimArrayType)\n return getTypeDefault(type.elementType.name);\n if (type instanceof EnumType) return '';\n if (type instanceof ArrayType)\n return type.customType\n ? [recurse(spec.types[type.customType])]\n : getTypeDefault(type.name);\n if (type instanceof HashType)\n return type.customType ? recurse(spec.types[type.customType]) : {};\n\n return recurse(type);\n };\n /* eslint-enable @typescript-eslint/no-use-before-define */\n\n const recurse = (type: IType) => {\n const sampleBody: RunItValues = {};\n for (const prop of type.writeable) {\n const sampleValue = getSampleValue(prop.type);\n if (sampleValue !== undefined) {\n sampleBody[prop.name] = sampleValue;\n }\n }\n return sampleBody;\n };\n return recurse(type);\n};\n\n/**\n * Convert model type to an editable type\n * @param spec API model for building input editor\n * @param type to convert\n */\nconst editType = (spec: IApiModel, type: IType) => {\n if (type instanceof IntrinsicType) return type.name;\n // TODO create a DelimArray editing component as part of the complex type editor\n if (type instanceof DelimArrayType) return 'string';\n return createSampleBody(spec, type);\n};\n\n/**\n * Given an SDK method create and return an array of inputs for the run-it form\n * @param spec Api spec\n * @param method A method object\n */\nexport const createInputs = (spec: IApiModel, method: IMethod): RunItInput[] =>\n method.allParams.map((param) => ({\n name: param.name,\n location: param.location,\n type: editType(spec, param.type),\n required: param.required,\n description: param.description,\n }));\n"],"mappings":"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"}
|
1
|
+
{"version":3,"file":"requestUtils.js","names":["cloneDeep","isEmpty","ArrayType","DelimArrayType","EnumType","HashType","IntrinsicType","trimInputs","getEnvAdaptor","RunItFormKey","runItNoSet","value","macro","path","vars","replace","_","b","pathify","pathParams","result","includes","prepareInputs","inputs","requestContent","input","name","location","parsed","JSON","parse","type","e","formValues","_ref","_asyncToGenerator","adaptor","formValue","localStorageGetItem","localStorageRemoveItem","apply","arguments","initRequestContent","length","undefined","content","createRequestParams","keepBody","queryParams","prepped","trimmed","body","Error","concat","runRequest","_ref2","sdk","basePath","httpMethod","endpoint","authSession","isAuthenticated","ok","login","url","requestStarted","Date","now","raw","transport","rawRequest","props","authenticate","responseCompleted","_x","_x2","_x3","_x4","_x5","_x6","_x7","getTypeDefault","createSampleBody","spec","getSampleValue","elementType","customType","recurse","types","sampleBody","prop","writeable","sampleValue","editType","createInputs","method","allParams","map","param","required","description"],"sources":["../../../src/utils/requestUtils.ts"],"sourcesContent":["/*\n\n MIT License\n\n Copyright (c) 2021 Looker Data Sciences, Inc.\n\n Permission is hereby granted, free of charge, to any person obtaining a copy\n of this software and associated documentation files (the \"Software\"), to deal\n in the Software without restriction, including without limitation the rights\n to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n copies of the Software, and to permit persons to whom the Software is\n furnished to do so, subject to the following conditions:\n\n The above copyright notice and this permission notice shall be included in all\n copies or substantial portions of the Software.\n\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n SOFTWARE.\n\n */\n\nimport type { IAPIMethods, IRawResponse } from '@looker/sdk-rtl';\nimport cloneDeep from 'lodash/cloneDeep';\nimport isEmpty from 'lodash/isEmpty';\nimport type { IApiModel, IMethod, IType } from '@looker/sdk-codegen';\nimport {\n ArrayType,\n DelimArrayType,\n EnumType,\n HashType,\n IntrinsicType,\n trimInputs,\n} from '@looker/sdk-codegen';\nimport { getEnvAdaptor } from '@looker/extension-utils';\n\nimport type { RunItHttpMethod, RunItInput, RunItValues } from '../RunIt';\nimport { RunItFormKey } from '../components';\n\n/** Hook to set a URL somewhere else in APIX */\nexport type RunItSetter = (value: any) => any;\n\n/**\n * A \"no-op\" function\n * @param value passed through\n */\nexport const runItNoSet: RunItSetter = (value: any) => value;\n\n/**\n * Replaces {foo} with vars[foo] in provided path\n * @param path with templatized param names\n * @param vars Collection of path params\n * @returns Path with param names replaced with values\n */\nconst macro = (path: string, vars: RunItValues) =>\n path.replace(/{(\\w+)}/g, (_, b) => vars[b]);\n\n/**\n * Construct a full request path including path params\n * @param path A request path with path params in curly braces e.g. /queries/{query_id}/run/{result_format}\n * @param pathParams Collection of path params\n * @returns a full request path\n */\nexport const pathify = (path: string, pathParams?: RunItValues): string => {\n let result = path;\n if (pathParams && path.includes('{')) {\n result = macro(path, pathParams);\n }\n return result;\n};\n\n/**\n * Prepares the inputs for use with the SDK and other RunIt components\n * @param inputs An array describing RunIt form inputs\n * @param requestContent Current request parameters\n */\nexport const prepareInputs = (\n inputs: RunItInput[],\n requestContent: RunItValues\n) => {\n const result = cloneDeep(requestContent);\n for (const input of inputs) {\n const name = input.name;\n if (input.location === 'body') {\n try {\n let parsed;\n if (name in requestContent) {\n const value = requestContent[name];\n /** The value is not a string when the user has not interacted with this param and prepareInputs has been\n * called (e.g. if user navigates to the Code tab).\n */\n parsed = typeof value === 'string' ? JSON.parse(value) : value;\n } else {\n /** This scenario occurs when RunIt is about to be mounted for a new method */\n parsed = input.type;\n }\n result[name] = parsed;\n } catch (e) {\n /** Treat as x-www-form-urlencoded */\n result[name] = requestContent[name];\n }\n }\n }\n return result;\n};\n\n/**\n * Load and clear any saved form values from the session\n * @param configurator storage service\n */\nexport const formValues = async () => {\n const adaptor = getEnvAdaptor();\n const formValue = await adaptor.localStorageGetItem(RunItFormKey);\n const result = formValue ? JSON.parse(formValue) : {};\n adaptor.localStorageRemoveItem(RunItFormKey);\n return result;\n};\n\n/**\n * Initializes the request content object from local storage or input definitions, in that order\n * @param configurator storage service\n * @param inputs\n * @param requestContent the current request content\n */\nexport const initRequestContent = (\n inputs: RunItInput[],\n requestContent = {}\n) => {\n // TODO: Temporarily disabling request form state persistence until RunIt is using redux\n // let content = await formValues()\n let content = {};\n if (isEmpty(content)) {\n content = prepareInputs(inputs, requestContent);\n }\n return content;\n};\n\n/**\n * Takes all form input values and categorizes them based on their request location\n * @param inputs RunIt form inputs\n * @param requestContent Form input values\n * @param keepBody true to keep body as is. false trims body values (default)\n * @returns path, query and body param objects\n */\nexport const createRequestParams = (\n inputs: RunItInput[],\n requestContent: RunItValues,\n keepBody = false\n) => {\n const pathParams: any = {};\n const queryParams: any = {};\n const prepped = prepareInputs(inputs, requestContent);\n const trimmed = trimInputs(prepped, keepBody);\n let body;\n for (const input of inputs) {\n const name = input.name;\n switch (input.location) {\n case 'path':\n pathParams[name] = trimmed[name];\n break;\n case 'query':\n queryParams[name] = trimmed[name];\n break;\n case 'body':\n body = trimmed[name];\n break;\n default:\n throw new Error(`Invalid input location: '${input.location}'`);\n }\n }\n return [pathParams, queryParams, body];\n};\n\n/**\n * Makes an http request using the SDK browser transport rawRequest method\n * @param sdk functional SDK that supports rawRequest via its transport\n * @param basePath base path for the URL. For standalone this includes the specKey. Empty for extension.\n * @param httpMethod Request operation\n * @param endpoint Request path with path params in curly braces e.g. /queries/{query_id}/run/{result_format}\n * @param pathParams Collection of path params\n * @param queryParams Collection of query params\n * @param body Collection of body params\n */\nexport const runRequest = async (\n sdk: IAPIMethods,\n basePath: string,\n httpMethod: RunItHttpMethod,\n endpoint: string,\n pathParams: RunItValues,\n queryParams: RunItValues,\n body: any\n): Promise<IRawResponse> => {\n if (!sdk.authSession.isAuthenticated()) {\n await sdk.ok(sdk.authSession.login());\n }\n const url = `${basePath}${pathify(endpoint, pathParams)}`;\n const requestStarted = Date.now();\n const raw = await sdk.authSession.transport.rawRequest(\n httpMethod,\n url,\n queryParams,\n body,\n props => sdk.authSession.authenticate(props)\n );\n const responseCompleted = Date.now();\n // populate timing info if it's not already provided by the transport\n if (!raw.requestStarted) raw.requestStarted = requestStarted;\n if (!raw.responseCompleted) raw.responseCompleted = responseCompleted;\n return raw;\n};\n\n/**\n * Return a default value for a given type name\n * @param type A type name\n */\nconst getTypeDefault = (type: string) => {\n // TODO: use potential equivalent from sdk-codegen, confirm formats\n switch (type) {\n case 'boolean':\n return false;\n case 'int64':\n case 'integer':\n return 0;\n case 'float':\n case 'double':\n return 0.0;\n case 'hostname':\n case 'ipv4':\n case 'ipv6':\n case 'uuid':\n case 'uri':\n case 'string':\n case 'email':\n return '';\n case 'string[]':\n return [];\n case 'object':\n return {};\n case 'datetime':\n return '';\n default:\n return '';\n }\n};\n\n/**\n * Given a type object reduce it to its writeable intrinsic and/or custom type properties and their default values\n * @param spec Api spec\n * @param type A type object\n */\nconst createSampleBody = (spec: IApiModel, type: IType) => {\n /* eslint-disable @typescript-eslint/no-use-before-define */\n const getSampleValue = (type: IType) => {\n if (type instanceof IntrinsicType) return getTypeDefault(type.name);\n if (type instanceof DelimArrayType)\n return getTypeDefault(type.elementType.name);\n if (type instanceof EnumType) return '';\n if (type instanceof ArrayType)\n return type.customType\n ? [recurse(spec.types[type.customType])]\n : getTypeDefault(type.name);\n if (type instanceof HashType)\n return type.customType ? recurse(spec.types[type.customType]) : {};\n\n return recurse(type);\n };\n /* eslint-enable @typescript-eslint/no-use-before-define */\n\n const recurse = (type: IType) => {\n const sampleBody: RunItValues = {};\n for (const prop of type.writeable) {\n const sampleValue = getSampleValue(prop.type);\n if (sampleValue !== undefined) {\n sampleBody[prop.name] = sampleValue;\n }\n }\n return sampleBody;\n };\n return recurse(type);\n};\n\n/**\n * Convert model type to an editable type\n * @param spec API model for building input editor\n * @param type to convert\n */\nconst editType = (spec: IApiModel, type: IType) => {\n if (type instanceof IntrinsicType) return type.name;\n // TODO create a DelimArray editing component as part of the complex type editor\n if (type instanceof DelimArrayType) return 'string';\n return createSampleBody(spec, type);\n};\n\n/**\n * Given an SDK method create and return an array of inputs for the run-it form\n * @param spec Api spec\n * @param method A method object\n */\nexport const createInputs = (spec: IApiModel, method: IMethod): RunItInput[] =>\n method.allParams.map(param => ({\n name: param.name,\n location: param.location,\n type: editType(spec, param.type),\n required: param.required,\n description: param.description,\n }));\n"],"mappings":"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"}
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"requestUtils.js","names":["_cloneDeep","_interopRequireDefault","require","_isEmpty","_sdkCodegen","_extensionUtils","_components","obj","__esModule","default","asyncGeneratorStep","gen","resolve","reject","_next","_throw","key","arg","info","value","error","done","Promise","then","_asyncToGenerator","fn","self","args","arguments","apply","err","undefined","runItNoSet","exports","macro","path","vars","replace","_","b","pathify","pathParams","result","includes","prepareInputs","inputs","requestContent","cloneDeep","input","name","location","parsed","JSON","parse","type","e","formValues","_ref","adaptor","getEnvAdaptor","formValue","localStorageGetItem","RunItFormKey","localStorageRemoveItem","initRequestContent","length","content","isEmpty","createRequestParams","keepBody","queryParams","prepped","trimmed","trimInputs","body","Error","concat","runRequest","_ref2","sdk","basePath","httpMethod","endpoint","authSession","isAuthenticated","ok","login","url","requestStarted","Date","now","raw","transport","rawRequest","props","authenticate","responseCompleted","_x","_x2","_x3","_x4","_x5","_x6","_x7","getTypeDefault","createSampleBody","spec","getSampleValue","IntrinsicType","DelimArrayType","elementType","EnumType","ArrayType","customType","recurse","types","HashType","sampleBody","prop","writeable","sampleValue","editType","createInputs","method","allParams","map","param","required","description"],"sources":["../../src/utils/requestUtils.ts"],"sourcesContent":["/*\n\n MIT License\n\n Copyright (c) 2021 Looker Data Sciences, Inc.\n\n Permission is hereby granted, free of charge, to any person obtaining a copy\n of this software and associated documentation files (the \"Software\"), to deal\n in the Software without restriction, including without limitation the rights\n to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n copies of the Software, and to permit persons to whom the Software is\n furnished to do so, subject to the following conditions:\n\n The above copyright notice and this permission notice shall be included in all\n copies or substantial portions of the Software.\n\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n SOFTWARE.\n\n */\n\nimport type { IAPIMethods, IRawResponse } from '@looker/sdk-rtl';\nimport cloneDeep from 'lodash/cloneDeep';\nimport isEmpty from 'lodash/isEmpty';\nimport type { IApiModel, IMethod, IType } from '@looker/sdk-codegen';\nimport {\n ArrayType,\n DelimArrayType,\n EnumType,\n HashType,\n IntrinsicType,\n trimInputs,\n} from '@looker/sdk-codegen';\nimport { getEnvAdaptor } from '@looker/extension-utils';\n\nimport type { RunItHttpMethod, RunItInput, RunItValues } from '../RunIt';\nimport { RunItFormKey } from '../components';\n\n/** Hook to set a URL somewhere else in APIX */\nexport type RunItSetter = (value: any) => any;\n\n/**\n * A \"no-op\" function\n * @param value passed through\n */\nexport const runItNoSet: RunItSetter = (value: any) => value;\n\n/**\n * Replaces {foo} with vars[foo] in provided path\n * @param path with templatized param names\n * @param vars Collection of path params\n * @returns Path with param names replaced with values\n */\nconst macro = (path: string, vars: RunItValues) =>\n path.replace(/{(\\w+)}/g, (_, b) => vars[b]);\n\n/**\n * Construct a full request path including path params\n * @param path A request path with path params in curly braces e.g. /queries/{query_id}/run/{result_format}\n * @param pathParams Collection of path params\n * @returns a full request path\n */\nexport const pathify = (path: string, pathParams?: RunItValues): string => {\n let result = path;\n if (pathParams && path.includes('{')) {\n result = macro(path, pathParams);\n }\n return result;\n};\n\n/**\n * Prepares the inputs for use with the SDK and other RunIt components\n * @param inputs An array describing RunIt form inputs\n * @param requestContent Current request parameters\n */\nexport const prepareInputs = (\n inputs: RunItInput[],\n requestContent: RunItValues\n) => {\n const result = cloneDeep(requestContent);\n for (const input of inputs) {\n const name = input.name;\n if (input.location === 'body') {\n try {\n let parsed;\n if (name in requestContent) {\n const value = requestContent[name];\n /** The value is not a string when the user has not interacted with this param and prepareInputs has been\n * called (e.g. if user navigates to the Code tab).\n */\n parsed = typeof value === 'string' ? JSON.parse(value) : value;\n } else {\n /** This scenario occurs when RunIt is about to be mounted for a new method */\n parsed = input.type;\n }\n result[name] = parsed;\n } catch (e) {\n /** Treat as x-www-form-urlencoded */\n result[name] = requestContent[name];\n }\n }\n }\n return result;\n};\n\n/**\n * Load and clear any saved form values from the session\n * @param configurator storage service\n */\nexport const formValues = async () => {\n const adaptor = getEnvAdaptor();\n const formValue = await adaptor.localStorageGetItem(RunItFormKey);\n const result = formValue ? JSON.parse(formValue) : {};\n adaptor.localStorageRemoveItem(RunItFormKey);\n return result;\n};\n\n/**\n * Initializes the request content object from local storage or input definitions, in that order\n * @param configurator storage service\n * @param inputs\n * @param requestContent the current request content\n */\nexport const initRequestContent = (\n inputs: RunItInput[],\n requestContent = {}\n) => {\n // TODO: Temporarily disabling request form state persistence until RunIt is using redux\n // let content = await formValues()\n let content = {};\n if (isEmpty(content)) {\n content = prepareInputs(inputs, requestContent);\n }\n return content;\n};\n\n/**\n * Takes all form input values and categorizes them based on their request location\n * @param inputs RunIt form inputs\n * @param requestContent Form input values\n * @param keepBody true to keep body as is. false trims body values (default)\n * @returns path, query and body param objects\n */\nexport const createRequestParams = (\n inputs: RunItInput[],\n requestContent: RunItValues,\n keepBody = false\n) => {\n const pathParams: any = {};\n const queryParams: any = {};\n const prepped = prepareInputs(inputs, requestContent);\n const trimmed = trimInputs(prepped, keepBody);\n let body;\n for (const input of inputs) {\n const name = input.name;\n switch (input.location) {\n case 'path':\n pathParams[name] = trimmed[name];\n break;\n case 'query':\n queryParams[name] = trimmed[name];\n break;\n case 'body':\n body = trimmed[name];\n break;\n default:\n throw new Error(`Invalid input location: '${input.location}'`);\n }\n }\n return [pathParams, queryParams, body];\n};\n\n/**\n * Makes an http request using the SDK browser transport rawRequest method\n * @param sdk functional SDK that supports rawRequest via its transport\n * @param basePath base path for the URL. For standalone this includes the specKey. Empty for extension.\n * @param httpMethod Request operation\n * @param endpoint Request path with path params in curly braces e.g. /queries/{query_id}/run/{result_format}\n * @param pathParams Collection of path params\n * @param queryParams Collection of query params\n * @param body Collection of body params\n */\nexport const runRequest = async (\n sdk: IAPIMethods,\n basePath: string,\n httpMethod: RunItHttpMethod,\n endpoint: string,\n pathParams: RunItValues,\n queryParams: RunItValues,\n body: any\n): Promise<IRawResponse> => {\n if (!sdk.authSession.isAuthenticated()) {\n await sdk.ok(sdk.authSession.login());\n }\n const url = `${basePath}${pathify(endpoint, pathParams)}`;\n const requestStarted = Date.now();\n const raw = await sdk.authSession.transport.rawRequest(\n httpMethod,\n url,\n queryParams,\n body,\n (props) => sdk.authSession.authenticate(props)\n );\n const responseCompleted = Date.now();\n // populate timing info if it's not already provided by the transport\n if (!raw.requestStarted) raw.requestStarted = requestStarted;\n if (!raw.responseCompleted) raw.responseCompleted = responseCompleted;\n return raw;\n};\n\n/**\n * Return a default value for a given type name\n * @param type A type name\n */\nconst getTypeDefault = (type: string) => {\n // TODO: use potential equivalent from sdk-codegen, confirm formats\n switch (type) {\n case 'boolean':\n return false;\n case 'int64':\n case 'integer':\n return 0;\n case 'float':\n case 'double':\n return 0.0;\n case 'hostname':\n case 'ipv4':\n case 'ipv6':\n case 'uuid':\n case 'uri':\n case 'string':\n case 'email':\n return '';\n case 'string[]':\n return [];\n case 'object':\n return {};\n case 'datetime':\n return '';\n default:\n return '';\n }\n};\n\n/**\n * Given a type object reduce it to its writeable intrinsic and/or custom type properties and their default values\n * @param spec Api spec\n * @param type A type object\n */\nconst createSampleBody = (spec: IApiModel, type: IType) => {\n /* eslint-disable @typescript-eslint/no-use-before-define */\n const getSampleValue = (type: IType) => {\n if (type instanceof IntrinsicType) return getTypeDefault(type.name);\n if (type instanceof DelimArrayType)\n return getTypeDefault(type.elementType.name);\n if (type instanceof EnumType) return '';\n if (type instanceof ArrayType)\n return type.customType\n ? [recurse(spec.types[type.customType])]\n : getTypeDefault(type.name);\n if (type instanceof HashType)\n return type.customType ? recurse(spec.types[type.customType]) : {};\n\n return recurse(type);\n };\n /* eslint-enable @typescript-eslint/no-use-before-define */\n\n const recurse = (type: IType) => {\n const sampleBody: RunItValues = {};\n for (const prop of type.writeable) {\n const sampleValue = getSampleValue(prop.type);\n if (sampleValue !== undefined) {\n sampleBody[prop.name] = sampleValue;\n }\n }\n return sampleBody;\n };\n return recurse(type);\n};\n\n/**\n * Convert model type to an editable type\n * @param spec API model for building input editor\n * @param type to convert\n */\nconst editType = (spec: IApiModel, type: IType) => {\n if (type instanceof IntrinsicType) return type.name;\n // TODO create a DelimArray editing component as part of the complex type editor\n if (type instanceof DelimArrayType) return 'string';\n return createSampleBody(spec, type);\n};\n\n/**\n * Given an SDK method create and return an array of inputs for the run-it form\n * @param spec Api spec\n * @param method A method object\n */\nexport const createInputs = (spec: IApiModel, method: IMethod): RunItInput[] =>\n method.allParams.map((param) => ({\n name: param.name,\n location: param.location,\n type: editType(spec, param.type),\n required: param.required,\n description: param.description,\n }));\n"],"mappings":"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"}
|
1
|
+
{"version":3,"file":"requestUtils.js","names":["_cloneDeep","_interopRequireDefault","require","_isEmpty","_sdkCodegen","_extensionUtils","_components","obj","__esModule","default","asyncGeneratorStep","gen","resolve","reject","_next","_throw","key","arg","info","value","error","done","Promise","then","_asyncToGenerator","fn","self","args","arguments","apply","err","undefined","runItNoSet","exports","macro","path","vars","replace","_","b","pathify","pathParams","result","includes","prepareInputs","inputs","requestContent","cloneDeep","input","name","location","parsed","JSON","parse","type","e","formValues","_ref","adaptor","getEnvAdaptor","formValue","localStorageGetItem","RunItFormKey","localStorageRemoveItem","initRequestContent","length","content","isEmpty","createRequestParams","keepBody","queryParams","prepped","trimmed","trimInputs","body","Error","concat","runRequest","_ref2","sdk","basePath","httpMethod","endpoint","authSession","isAuthenticated","ok","login","url","requestStarted","Date","now","raw","transport","rawRequest","props","authenticate","responseCompleted","_x","_x2","_x3","_x4","_x5","_x6","_x7","getTypeDefault","createSampleBody","spec","getSampleValue","IntrinsicType","DelimArrayType","elementType","EnumType","ArrayType","customType","recurse","types","HashType","sampleBody","prop","writeable","sampleValue","editType","createInputs","method","allParams","map","param","required","description"],"sources":["../../src/utils/requestUtils.ts"],"sourcesContent":["/*\n\n MIT License\n\n Copyright (c) 2021 Looker Data Sciences, Inc.\n\n Permission is hereby granted, free of charge, to any person obtaining a copy\n of this software and associated documentation files (the \"Software\"), to deal\n in the Software without restriction, including without limitation the rights\n to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n copies of the Software, and to permit persons to whom the Software is\n furnished to do so, subject to the following conditions:\n\n The above copyright notice and this permission notice shall be included in all\n copies or substantial portions of the Software.\n\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n SOFTWARE.\n\n */\n\nimport type { IAPIMethods, IRawResponse } from '@looker/sdk-rtl';\nimport cloneDeep from 'lodash/cloneDeep';\nimport isEmpty from 'lodash/isEmpty';\nimport type { IApiModel, IMethod, IType } from '@looker/sdk-codegen';\nimport {\n ArrayType,\n DelimArrayType,\n EnumType,\n HashType,\n IntrinsicType,\n trimInputs,\n} from '@looker/sdk-codegen';\nimport { getEnvAdaptor } from '@looker/extension-utils';\n\nimport type { RunItHttpMethod, RunItInput, RunItValues } from '../RunIt';\nimport { RunItFormKey } from '../components';\n\n/** Hook to set a URL somewhere else in APIX */\nexport type RunItSetter = (value: any) => any;\n\n/**\n * A \"no-op\" function\n * @param value passed through\n */\nexport const runItNoSet: RunItSetter = (value: any) => value;\n\n/**\n * Replaces {foo} with vars[foo] in provided path\n * @param path with templatized param names\n * @param vars Collection of path params\n * @returns Path with param names replaced with values\n */\nconst macro = (path: string, vars: RunItValues) =>\n path.replace(/{(\\w+)}/g, (_, b) => vars[b]);\n\n/**\n * Construct a full request path including path params\n * @param path A request path with path params in curly braces e.g. /queries/{query_id}/run/{result_format}\n * @param pathParams Collection of path params\n * @returns a full request path\n */\nexport const pathify = (path: string, pathParams?: RunItValues): string => {\n let result = path;\n if (pathParams && path.includes('{')) {\n result = macro(path, pathParams);\n }\n return result;\n};\n\n/**\n * Prepares the inputs for use with the SDK and other RunIt components\n * @param inputs An array describing RunIt form inputs\n * @param requestContent Current request parameters\n */\nexport const prepareInputs = (\n inputs: RunItInput[],\n requestContent: RunItValues\n) => {\n const result = cloneDeep(requestContent);\n for (const input of inputs) {\n const name = input.name;\n if (input.location === 'body') {\n try {\n let parsed;\n if (name in requestContent) {\n const value = requestContent[name];\n /** The value is not a string when the user has not interacted with this param and prepareInputs has been\n * called (e.g. if user navigates to the Code tab).\n */\n parsed = typeof value === 'string' ? JSON.parse(value) : value;\n } else {\n /** This scenario occurs when RunIt is about to be mounted for a new method */\n parsed = input.type;\n }\n result[name] = parsed;\n } catch (e) {\n /** Treat as x-www-form-urlencoded */\n result[name] = requestContent[name];\n }\n }\n }\n return result;\n};\n\n/**\n * Load and clear any saved form values from the session\n * @param configurator storage service\n */\nexport const formValues = async () => {\n const adaptor = getEnvAdaptor();\n const formValue = await adaptor.localStorageGetItem(RunItFormKey);\n const result = formValue ? JSON.parse(formValue) : {};\n adaptor.localStorageRemoveItem(RunItFormKey);\n return result;\n};\n\n/**\n * Initializes the request content object from local storage or input definitions, in that order\n * @param configurator storage service\n * @param inputs\n * @param requestContent the current request content\n */\nexport const initRequestContent = (\n inputs: RunItInput[],\n requestContent = {}\n) => {\n // TODO: Temporarily disabling request form state persistence until RunIt is using redux\n // let content = await formValues()\n let content = {};\n if (isEmpty(content)) {\n content = prepareInputs(inputs, requestContent);\n }\n return content;\n};\n\n/**\n * Takes all form input values and categorizes them based on their request location\n * @param inputs RunIt form inputs\n * @param requestContent Form input values\n * @param keepBody true to keep body as is. false trims body values (default)\n * @returns path, query and body param objects\n */\nexport const createRequestParams = (\n inputs: RunItInput[],\n requestContent: RunItValues,\n keepBody = false\n) => {\n const pathParams: any = {};\n const queryParams: any = {};\n const prepped = prepareInputs(inputs, requestContent);\n const trimmed = trimInputs(prepped, keepBody);\n let body;\n for (const input of inputs) {\n const name = input.name;\n switch (input.location) {\n case 'path':\n pathParams[name] = trimmed[name];\n break;\n case 'query':\n queryParams[name] = trimmed[name];\n break;\n case 'body':\n body = trimmed[name];\n break;\n default:\n throw new Error(`Invalid input location: '${input.location}'`);\n }\n }\n return [pathParams, queryParams, body];\n};\n\n/**\n * Makes an http request using the SDK browser transport rawRequest method\n * @param sdk functional SDK that supports rawRequest via its transport\n * @param basePath base path for the URL. For standalone this includes the specKey. Empty for extension.\n * @param httpMethod Request operation\n * @param endpoint Request path with path params in curly braces e.g. /queries/{query_id}/run/{result_format}\n * @param pathParams Collection of path params\n * @param queryParams Collection of query params\n * @param body Collection of body params\n */\nexport const runRequest = async (\n sdk: IAPIMethods,\n basePath: string,\n httpMethod: RunItHttpMethod,\n endpoint: string,\n pathParams: RunItValues,\n queryParams: RunItValues,\n body: any\n): Promise<IRawResponse> => {\n if (!sdk.authSession.isAuthenticated()) {\n await sdk.ok(sdk.authSession.login());\n }\n const url = `${basePath}${pathify(endpoint, pathParams)}`;\n const requestStarted = Date.now();\n const raw = await sdk.authSession.transport.rawRequest(\n httpMethod,\n url,\n queryParams,\n body,\n props => sdk.authSession.authenticate(props)\n );\n const responseCompleted = Date.now();\n // populate timing info if it's not already provided by the transport\n if (!raw.requestStarted) raw.requestStarted = requestStarted;\n if (!raw.responseCompleted) raw.responseCompleted = responseCompleted;\n return raw;\n};\n\n/**\n * Return a default value for a given type name\n * @param type A type name\n */\nconst getTypeDefault = (type: string) => {\n // TODO: use potential equivalent from sdk-codegen, confirm formats\n switch (type) {\n case 'boolean':\n return false;\n case 'int64':\n case 'integer':\n return 0;\n case 'float':\n case 'double':\n return 0.0;\n case 'hostname':\n case 'ipv4':\n case 'ipv6':\n case 'uuid':\n case 'uri':\n case 'string':\n case 'email':\n return '';\n case 'string[]':\n return [];\n case 'object':\n return {};\n case 'datetime':\n return '';\n default:\n return '';\n }\n};\n\n/**\n * Given a type object reduce it to its writeable intrinsic and/or custom type properties and their default values\n * @param spec Api spec\n * @param type A type object\n */\nconst createSampleBody = (spec: IApiModel, type: IType) => {\n /* eslint-disable @typescript-eslint/no-use-before-define */\n const getSampleValue = (type: IType) => {\n if (type instanceof IntrinsicType) return getTypeDefault(type.name);\n if (type instanceof DelimArrayType)\n return getTypeDefault(type.elementType.name);\n if (type instanceof EnumType) return '';\n if (type instanceof ArrayType)\n return type.customType\n ? [recurse(spec.types[type.customType])]\n : getTypeDefault(type.name);\n if (type instanceof HashType)\n return type.customType ? recurse(spec.types[type.customType]) : {};\n\n return recurse(type);\n };\n /* eslint-enable @typescript-eslint/no-use-before-define */\n\n const recurse = (type: IType) => {\n const sampleBody: RunItValues = {};\n for (const prop of type.writeable) {\n const sampleValue = getSampleValue(prop.type);\n if (sampleValue !== undefined) {\n sampleBody[prop.name] = sampleValue;\n }\n }\n return sampleBody;\n };\n return recurse(type);\n};\n\n/**\n * Convert model type to an editable type\n * @param spec API model for building input editor\n * @param type to convert\n */\nconst editType = (spec: IApiModel, type: IType) => {\n if (type instanceof IntrinsicType) return type.name;\n // TODO create a DelimArray editing component as part of the complex type editor\n if (type instanceof DelimArrayType) return 'string';\n return createSampleBody(spec, type);\n};\n\n/**\n * Given an SDK method create and return an array of inputs for the run-it form\n * @param spec Api spec\n * @param method A method object\n */\nexport const createInputs = (spec: IApiModel, method: IMethod): RunItInput[] =>\n method.allParams.map(param => ({\n name: param.name,\n location: param.location,\n type: editType(spec, param.type),\n required: param.required,\n description: param.description,\n }));\n"],"mappings":"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"}
|