openapi-explorer 2.2.678 → 2.2.681

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -150,7 +150,11 @@ export default class ApiRequest extends LitElement {
150
150
  selectedRequestBodyExample: {
151
151
  type: String,
152
152
  attribute: 'selected-request-body-example'
153
- } // internal tracking of selected request-body example
153
+ },
154
+ // internal tracking of selected request-body example
155
+ curlSyntax: {
156
+ type: String
157
+ }
154
158
  };
155
159
  }
156
160
  render() {
@@ -314,6 +318,7 @@ export default class ApiRequest extends LitElement {
314
318
  }, 0, mimeDropdownEl);
315
319
  }
316
320
  requestBodyTemplate() {
321
+ var _this$cachedBodyData;
317
322
  if (!this.request_body) {
318
323
  return '';
319
324
  }
@@ -381,6 +386,18 @@ export default class ApiRequest extends LitElement {
381
386
  reqBodySchemaHtml = html` ${reqBodySchemaHtml} <schema-tree class="${reqBody.mimeType.substring(reqBody.mimeType.indexOf('/') + 1)} pad-top-8" style="display:${this.selectedRequestBodyType === reqBody.mimeType ? 'block' : 'none'}" .data="${schemaAsObj}" schema-expand-level="${this.schemaExpandLevel}" schema-hide-read-only="${this.schemaHideReadOnly.includes(this.method)}" schema-hide-write-only="false" exportparts="schema-key, schema-type, schema-description"> </schema-tree> `;
382
387
  }
383
388
  }
389
+
390
+ // When the content type and the element stay the same, then don't change the updated body.
391
+ if (((_this$cachedBodyData = this.cachedBodyData) === null || _this$cachedBodyData === void 0 ? void 0 : _this$cachedBodyData.contentType) === this.selectedRequestBodyType && this.elementId === this.cachedBodyData.elementId) {
392
+ reqBodyDefaultHtml = this.cachedBodyData.body;
393
+ } else {
394
+ // Otherwise use the recalculated body and cache that
395
+ this.cachedBodyData = {
396
+ body: reqBodyDefaultHtml,
397
+ contentType: this.selectedRequestBodyType,
398
+ elementId: this.elementId
399
+ };
400
+ }
384
401
  return html` <div class="request-body-container" data-selected-request-body-type="${this.selectedRequestBodyType}"> <div class="table-title top-gap row"> ${getI18nText('operations.request-body')} ${this.request_body.required ? html`<span class="mono-font" style="color:var(--red)">*</span>` : ''} <span style="font-weight:400;margin-left:5px"> ${this.selectedRequestBodyType}</span> <span style="flex:1"></span> ${reqBodyTypeSelectorHtml} </div> ${this.request_body.description ? html`<div class="m-markdown" style="margin-bottom:12px">${unsafeHTML(marked(this.request_body.description))}</div>` : ''} ${reqBodySchemaHtml || reqBodyDefaultHtml ? html` <div class="tab-panel col" style="border-width:0 0 1px 0"> <div class="tab-buttons row" @click="${e => {
385
402
  if (e.target.tagName.toLowerCase() === 'button') {
386
403
  this.activeSchemaTab = e.target.dataset.tab;
@@ -410,7 +427,7 @@ export default class ApiRequest extends LitElement {
410
427
  return;
411
428
  }
412
429
  this.activeResponseTab = e.target.dataset.tab;
413
- }}"> <br> <div style="width:100%"> ${!hasResponse ? '' : html` <button class="tab-btn ${this.activeResponseTab === 'response' ? 'active' : ''}" data-tab="response">${getI18nText('operations.response')}</button> <button class="tab-btn ${this.activeResponseTab === 'headers' ? 'active' : ''}" data-tab="headers">${getI18nText('operations.response-headers')}</button>`} <button class="tab-btn ${!hasResponse || this.activeResponseTab === 'curl' ? 'active' : ''}" data-tab="curl">FULL REQUEST</button> </div> </div> ${this.responseIsBlob ? html` <div class="tab-content col" style="flex:1;display:${this.activeResponseTab === 'response' ? 'flex' : 'none'}"> ${this.responseBlobType === 'image' ? html`<img style="max-height:var(--resp-area-height,300px);object-fit:contain" class="mar-top-8" src="${this.responseBlobUrl}">` : ''} <div style="display:flex;justify-content:center"> <div> <button class="m-btn thin-border mar-top-8" style="width:135px" @click="${this.downloadResponseBlob}" part="btn btn-outline">DOWNLOAD</button> ${this.responseBlobType === 'view' || this.responseBlobType === 'image' ? html`<button class="m-btn thin-border mar-top-8" style="width:135px" @click="${this.viewResponseBlob}" part="btn btn-outline">VIEW (NEW TAB)</button>` : ''} </div> </div> </div>` : html` <div class="tab-content col m-markdown" style="flex:1;display:${this.activeResponseTab === 'response' ? 'flex' : 'none'}"> <syntax-highlighter style="min-height:60px" mime-type="${this.responseContentType}" .content="${this.responseText}"> </div>`} <div class="tab-content col m-markdown" style="flex:1;display:${this.activeResponseTab === 'headers' ? 'flex' : 'none'}"> <syntax-highlighter language="http" .content="${this.responseHeaders}"> </div> <div class="tab-content m-markdown col" style="flex:1;display:${this.activeResponseTab === 'curl' ? 'flex' : 'none'}"> <syntax-highlighter class="fs-exclude" data-hj-suppress data-sl="mask" language="shell" .content="${curlSyntax.trim()}"> </div> </div>`;
430
+ }}"> <br> <div style="width:100%"> <button class="tab-btn ${!hasResponse || this.activeResponseTab === 'curl' ? 'active' : ''}" data-tab="curl">FULL REQUEST</button> ${!hasResponse ? '' : html` <button class="tab-btn ${this.activeResponseTab === 'response' ? 'active' : ''}" data-tab="response">${getI18nText('operations.response')}</button> <button class="tab-btn ${this.activeResponseTab === 'headers' ? 'active' : ''}" data-tab="headers">${getI18nText('operations.response-headers')}</button>`} </div> </div> ${this.responseIsBlob ? html` <div class="tab-content col" style="flex:1;display:${this.activeResponseTab === 'response' ? 'flex' : 'none'}"> ${this.responseBlobType === 'image' ? html`<img style="max-height:var(--resp-area-height,300px);object-fit:contain" class="mar-top-8" src="${this.responseBlobUrl}">` : ''} <div style="display:flex;justify-content:center"> <div> <button class="m-btn thin-border mar-top-8" style="width:135px" @click="${this.downloadResponseBlob}" part="btn btn-outline">DOWNLOAD</button> ${this.responseBlobType === 'view' || this.responseBlobType === 'image' ? html`<button class="m-btn thin-border mar-top-8" style="width:135px" @click="${this.viewResponseBlob}" part="btn btn-outline">VIEW (NEW TAB)</button>` : ''} </div> </div> </div>` : html` <div class="tab-content col m-markdown" style="flex:1;display:${this.activeResponseTab === 'response' ? 'flex' : 'none'}"> <syntax-highlighter style="min-height:60px" mime-type="${this.responseContentType}" .content="${this.responseText}"> </div>`} <div class="tab-content col m-markdown" style="flex:1;display:${this.activeResponseTab === 'headers' ? 'flex' : 'none'}"> <syntax-highlighter language="http" .content="${this.responseHeaders}"> </div> <div class="tab-content m-markdown col" style="flex:1;display:${this.activeResponseTab === 'curl' ? 'flex' : 'none'}"> <syntax-highlighter class="fs-exclude" data-hj-suppress data-sl="mask" language="shell" .content="${curlSyntax.trim()}"> </div> </div>`;
414
431
  }
415
432
  apiCallTemplate() {
416
433
  return html` <div style="display:flex;align-items:flex-end;margin:16px 0;font-size:var(--font-size-small)"> ${this.parameters.length > 0 || this.request_body ? html` <button class="m-btn thin-border" part="btn btn-outline" style="margin-right:5px" @click="${this.onClearRequestData}"> ${getI18nText('operations.clear')} </button>` : ''} <button class="m-btn primary btn-execute thin-border" part="btn btn-fill btn-try" @click="${this.onTryClick}">${getI18nText('operations.execute')}</button> </div> ${this.apiResponseTabTemplate()} `;
@@ -637,10 +654,12 @@ export default class ApiRequest extends LitElement {
637
654
  if (exampleTextAreaEl && exampleTextAreaEl.value) {
638
655
  fetchOptions.body = exampleTextAreaEl.value;
639
656
  if (requestBodyType.includes('json')) {
640
- fetchOptions.body = JSON.stringify(json5.parse(exampleTextAreaEl.value));
641
657
  try {
658
+ fetchOptions.body = JSON.stringify(json5.parse(exampleTextAreaEl.value), null, 4);
642
659
  curlData = ` \\\n -d '${fetchOptions.body}'`;
643
- } catch (err) {/* Ignore unparseable JSON */}
660
+ } catch (err) {
661
+ /* Ignore unparseable JSON, falls back automatically to the original value, which is better than nothing */
662
+ }
644
663
  }
645
664
  if (!curlData) {
646
665
  // Save single quotes wrapped => 'text' => `"'"text"'"`
@@ -678,7 +697,8 @@ export default class ApiRequest extends LitElement {
678
697
  const headers = headerOverride !== null && headerOverride !== void 0 ? headerOverride : fetchOptions.headers;
679
698
  const curlHeaders = [...headers.entries()].reduce((acc, [key, value]) => `${acc} \\\n -H "${key}: ${value}"`, '');
680
699
  this.curlSyntax = `${curl}${curlHeaders}${curlParts.data}${curlParts.form}`;
681
- this.requestUpdate();
700
+ // We don't need to request and update because we are watch the curlSyntax property in this lit element
701
+ // this.requestUpdate();
682
702
  }
683
703
 
684
704
  // onExecuteButtonClicked
@@ -155,7 +155,11 @@ class ApiRequest extends _lit.LitElement {
155
155
  selectedRequestBodyExample: {
156
156
  type: String,
157
157
  attribute: 'selected-request-body-example'
158
- } // internal tracking of selected request-body example
158
+ },
159
+ // internal tracking of selected request-body example
160
+ curlSyntax: {
161
+ type: String
162
+ }
159
163
  };
160
164
  }
161
165
  render() {
@@ -319,6 +323,7 @@ class ApiRequest extends _lit.LitElement {
319
323
  }, 0, mimeDropdownEl);
320
324
  }
321
325
  requestBodyTemplate() {
326
+ var _this$cachedBodyData;
322
327
  if (!this.request_body) {
323
328
  return '';
324
329
  }
@@ -386,6 +391,18 @@ class ApiRequest extends _lit.LitElement {
386
391
  reqBodySchemaHtml = (0, _lit.html)` ${reqBodySchemaHtml} <schema-tree class="${reqBody.mimeType.substring(reqBody.mimeType.indexOf('/') + 1)} pad-top-8" style="display:${this.selectedRequestBodyType === reqBody.mimeType ? 'block' : 'none'}" .data="${schemaAsObj}" schema-expand-level="${this.schemaExpandLevel}" schema-hide-read-only="${this.schemaHideReadOnly.includes(this.method)}" schema-hide-write-only="false" exportparts="schema-key, schema-type, schema-description"> </schema-tree> `;
387
392
  }
388
393
  }
394
+
395
+ // When the content type and the element stay the same, then don't change the updated body.
396
+ if (((_this$cachedBodyData = this.cachedBodyData) === null || _this$cachedBodyData === void 0 ? void 0 : _this$cachedBodyData.contentType) === this.selectedRequestBodyType && this.elementId === this.cachedBodyData.elementId) {
397
+ reqBodyDefaultHtml = this.cachedBodyData.body;
398
+ } else {
399
+ // Otherwise use the recalculated body and cache that
400
+ this.cachedBodyData = {
401
+ body: reqBodyDefaultHtml,
402
+ contentType: this.selectedRequestBodyType,
403
+ elementId: this.elementId
404
+ };
405
+ }
389
406
  return (0, _lit.html)` <div class="request-body-container" data-selected-request-body-type="${this.selectedRequestBodyType}"> <div class="table-title top-gap row"> ${(0, _index.getI18nText)('operations.request-body')} ${this.request_body.required ? (0, _lit.html)`<span class="mono-font" style="color:var(--red)">*</span>` : ''} <span style="font-weight:400;margin-left:5px"> ${this.selectedRequestBodyType}</span> <span style="flex:1"></span> ${reqBodyTypeSelectorHtml} </div> ${this.request_body.description ? (0, _lit.html)`<div class="m-markdown" style="margin-bottom:12px">${(0, _unsafeHtml.unsafeHTML)((0, _marked.marked)(this.request_body.description))}</div>` : ''} ${reqBodySchemaHtml || reqBodyDefaultHtml ? (0, _lit.html)` <div class="tab-panel col" style="border-width:0 0 1px 0"> <div class="tab-buttons row" @click="${e => {
390
407
  if (e.target.tagName.toLowerCase() === 'button') {
391
408
  this.activeSchemaTab = e.target.dataset.tab;
@@ -415,7 +432,7 @@ class ApiRequest extends _lit.LitElement {
415
432
  return;
416
433
  }
417
434
  this.activeResponseTab = e.target.dataset.tab;
418
- }}"> <br> <div style="width:100%"> ${!hasResponse ? '' : (0, _lit.html)` <button class="tab-btn ${this.activeResponseTab === 'response' ? 'active' : ''}" data-tab="response">${(0, _index.getI18nText)('operations.response')}</button> <button class="tab-btn ${this.activeResponseTab === 'headers' ? 'active' : ''}" data-tab="headers">${(0, _index.getI18nText)('operations.response-headers')}</button>`} <button class="tab-btn ${!hasResponse || this.activeResponseTab === 'curl' ? 'active' : ''}" data-tab="curl">FULL REQUEST</button> </div> </div> ${this.responseIsBlob ? (0, _lit.html)` <div class="tab-content col" style="flex:1;display:${this.activeResponseTab === 'response' ? 'flex' : 'none'}"> ${this.responseBlobType === 'image' ? (0, _lit.html)`<img style="max-height:var(--resp-area-height,300px);object-fit:contain" class="mar-top-8" src="${this.responseBlobUrl}">` : ''} <div style="display:flex;justify-content:center"> <div> <button class="m-btn thin-border mar-top-8" style="width:135px" @click="${this.downloadResponseBlob}" part="btn btn-outline">DOWNLOAD</button> ${this.responseBlobType === 'view' || this.responseBlobType === 'image' ? (0, _lit.html)`<button class="m-btn thin-border mar-top-8" style="width:135px" @click="${this.viewResponseBlob}" part="btn btn-outline">VIEW (NEW TAB)</button>` : ''} </div> </div> </div>` : (0, _lit.html)` <div class="tab-content col m-markdown" style="flex:1;display:${this.activeResponseTab === 'response' ? 'flex' : 'none'}"> <syntax-highlighter style="min-height:60px" mime-type="${this.responseContentType}" .content="${this.responseText}"> </div>`} <div class="tab-content col m-markdown" style="flex:1;display:${this.activeResponseTab === 'headers' ? 'flex' : 'none'}"> <syntax-highlighter language="http" .content="${this.responseHeaders}"> </div> <div class="tab-content m-markdown col" style="flex:1;display:${this.activeResponseTab === 'curl' ? 'flex' : 'none'}"> <syntax-highlighter class="fs-exclude" data-hj-suppress data-sl="mask" language="shell" .content="${curlSyntax.trim()}"> </div> </div>`;
435
+ }}"> <br> <div style="width:100%"> <button class="tab-btn ${!hasResponse || this.activeResponseTab === 'curl' ? 'active' : ''}" data-tab="curl">FULL REQUEST</button> ${!hasResponse ? '' : (0, _lit.html)` <button class="tab-btn ${this.activeResponseTab === 'response' ? 'active' : ''}" data-tab="response">${(0, _index.getI18nText)('operations.response')}</button> <button class="tab-btn ${this.activeResponseTab === 'headers' ? 'active' : ''}" data-tab="headers">${(0, _index.getI18nText)('operations.response-headers')}</button>`} </div> </div> ${this.responseIsBlob ? (0, _lit.html)` <div class="tab-content col" style="flex:1;display:${this.activeResponseTab === 'response' ? 'flex' : 'none'}"> ${this.responseBlobType === 'image' ? (0, _lit.html)`<img style="max-height:var(--resp-area-height,300px);object-fit:contain" class="mar-top-8" src="${this.responseBlobUrl}">` : ''} <div style="display:flex;justify-content:center"> <div> <button class="m-btn thin-border mar-top-8" style="width:135px" @click="${this.downloadResponseBlob}" part="btn btn-outline">DOWNLOAD</button> ${this.responseBlobType === 'view' || this.responseBlobType === 'image' ? (0, _lit.html)`<button class="m-btn thin-border mar-top-8" style="width:135px" @click="${this.viewResponseBlob}" part="btn btn-outline">VIEW (NEW TAB)</button>` : ''} </div> </div> </div>` : (0, _lit.html)` <div class="tab-content col m-markdown" style="flex:1;display:${this.activeResponseTab === 'response' ? 'flex' : 'none'}"> <syntax-highlighter style="min-height:60px" mime-type="${this.responseContentType}" .content="${this.responseText}"> </div>`} <div class="tab-content col m-markdown" style="flex:1;display:${this.activeResponseTab === 'headers' ? 'flex' : 'none'}"> <syntax-highlighter language="http" .content="${this.responseHeaders}"> </div> <div class="tab-content m-markdown col" style="flex:1;display:${this.activeResponseTab === 'curl' ? 'flex' : 'none'}"> <syntax-highlighter class="fs-exclude" data-hj-suppress data-sl="mask" language="shell" .content="${curlSyntax.trim()}"> </div> </div>`;
419
436
  }
420
437
  apiCallTemplate() {
421
438
  return (0, _lit.html)` <div style="display:flex;align-items:flex-end;margin:16px 0;font-size:var(--font-size-small)"> ${this.parameters.length > 0 || this.request_body ? (0, _lit.html)` <button class="m-btn thin-border" part="btn btn-outline" style="margin-right:5px" @click="${this.onClearRequestData}"> ${(0, _index.getI18nText)('operations.clear')} </button>` : ''} <button class="m-btn primary btn-execute thin-border" part="btn btn-fill btn-try" @click="${this.onTryClick}">${(0, _index.getI18nText)('operations.execute')}</button> </div> ${this.apiResponseTabTemplate()} `;
@@ -642,10 +659,12 @@ class ApiRequest extends _lit.LitElement {
642
659
  if (exampleTextAreaEl && exampleTextAreaEl.value) {
643
660
  fetchOptions.body = exampleTextAreaEl.value;
644
661
  if (requestBodyType.includes('json')) {
645
- fetchOptions.body = JSON.stringify(_json.default.parse(exampleTextAreaEl.value));
646
662
  try {
663
+ fetchOptions.body = JSON.stringify(_json.default.parse(exampleTextAreaEl.value), null, 4);
647
664
  curlData = ` \\\n -d '${fetchOptions.body}'`;
648
- } catch (err) {/* Ignore unparseable JSON */}
665
+ } catch (err) {
666
+ /* Ignore unparseable JSON, falls back automatically to the original value, which is better than nothing */
667
+ }
649
668
  }
650
669
  if (!curlData) {
651
670
  // Save single quotes wrapped => 'text' => `"'"text"'"`
@@ -683,7 +702,8 @@ class ApiRequest extends _lit.LitElement {
683
702
  const headers = headerOverride !== null && headerOverride !== void 0 ? headerOverride : fetchOptions.headers;
684
703
  const curlHeaders = [...headers.entries()].reduce((acc, [key, value]) => `${acc} \\\n -H "${key}: ${value}"`, '');
685
704
  this.curlSyntax = `${curl}${curlHeaders}${curlParts.data}${curlParts.form}`;
686
- this.requestUpdate();
705
+ // We don't need to request and update because we are watch the curlSyntax property in this lit element
706
+ // this.requestUpdate();
687
707
  }
688
708
 
689
709
  // onExecuteButtonClicked
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "openapi-explorer",
3
- "version": "2.2.678",
3
+ "version": "2.2.681",
4
4
  "description": "OpenAPI Explorer - API viewer with dynamically generated components, documentation, and interaction console",
5
5
  "author": "Authress Developers <developers@authress.io>",
6
6
  "type": "module",