openapi-explorer 2.2.771 → 2.2.773
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.
@@ -30,7 +30,7 @@ export default class ApiRequest extends LitElement {
|
|
30
30
|
this.curlSyntax = '';
|
31
31
|
this.activeResponseTab = 'curl'; // allowed values: response, headers, curl
|
32
32
|
this.selectedRequestBodyType = '';
|
33
|
-
this.
|
33
|
+
this.selectedRequestBodyExampleId = '';
|
34
34
|
}
|
35
35
|
static get properties() {
|
36
36
|
return {
|
@@ -143,13 +143,11 @@ export default class ApiRequest extends LitElement {
|
|
143
143
|
},
|
144
144
|
// internal tracking of response-tab not exposed as a attribute
|
145
145
|
selectedRequestBodyType: {
|
146
|
-
type: String
|
147
|
-
attribute: 'selected-request-body-type'
|
146
|
+
type: String
|
148
147
|
},
|
149
148
|
// internal tracking of selected request-body type
|
150
|
-
|
151
|
-
type: String
|
152
|
-
attribute: 'selected-request-body-example'
|
149
|
+
selectedRequestBodyExampleId: {
|
150
|
+
type: String
|
153
151
|
},
|
154
152
|
// internal tracking of selected request-body example
|
155
153
|
curlSyntax: {
|
@@ -317,17 +315,17 @@ export default class ApiRequest extends LitElement {
|
|
317
315
|
}
|
318
316
|
resetRequestBodySelection() {
|
319
317
|
this.selectedRequestBodyType = '';
|
320
|
-
this.
|
318
|
+
this.selectedRequestBodyExampleId = '';
|
321
319
|
this.computeCurlSyntax();
|
322
320
|
this.clearResponseData();
|
323
321
|
}
|
324
322
|
|
325
323
|
// Request-Body Event Handlers
|
326
324
|
onSelectExample(e) {
|
327
|
-
this.
|
325
|
+
this.selectedRequestBodyExampleId = e.target.value;
|
328
326
|
const exampleDropdownEl = e.target;
|
329
327
|
window.setTimeout(selectEl => {
|
330
|
-
const exampleTextareaEl = selectEl.closest('.example-panel').querySelector(`.request-body-param[data-example="${this.
|
328
|
+
const exampleTextareaEl = selectEl.closest('.example-panel').querySelector(`.request-body-param[data-example="${this.selectedRequestBodyExampleId}"`);
|
331
329
|
const userInputExampleTextareaEl = selectEl.closest('.example-panel').querySelector('.request-body-param-user-input');
|
332
330
|
userInputExampleTextareaEl.value = exampleTextareaEl.value;
|
333
331
|
this.computeCurlSyntax();
|
@@ -336,7 +334,7 @@ export default class ApiRequest extends LitElement {
|
|
336
334
|
onMimeTypeChange(e) {
|
337
335
|
this.selectedRequestBodyType = e.target.value;
|
338
336
|
const mimeDropdownEl = e.target;
|
339
|
-
this.
|
337
|
+
this.selectedRequestBodyExampleId = '';
|
340
338
|
window.setTimeout(selectEl => {
|
341
339
|
const exampleTextareaEl = selectEl.closest('.request-body-container').querySelector('.request-body-param');
|
342
340
|
if (exampleTextareaEl) {
|
@@ -387,11 +385,11 @@ export default class ApiRequest extends LitElement {
|
|
387
385
|
// Generate Example
|
388
386
|
if (this.selectedRequestBodyType.includes('json') || this.selectedRequestBodyType.includes('xml') || this.selectedRequestBodyType.includes('text')) {
|
389
387
|
const reqBodyExamples = generateExample(reqBody.examples ? reqBody.examples : '', reqBody.example ? reqBody.example : '', reqBody.schema, reqBody.mimeType, false, true, 'text', true);
|
390
|
-
if (!this.
|
391
|
-
this.
|
388
|
+
if (!this.selectedRequestBodyExampleId) {
|
389
|
+
this.selectedRequestBodyExampleId = reqBodyExamples.length > 0 ? reqBodyExamples[0].exampleId : '';
|
392
390
|
}
|
393
|
-
const displayedBodyExample = reqBodyExamples.find(v => v.exampleId === this.
|
394
|
-
reqBodyDefaultHtml = html` <div class="example-panel pad-top-8"> ${reqBodyExamples.length === 1 ? '' : html` <select aria-label="request body example" style="min-width:100px;max-width:100%;margin-bottom:-1px" @change="${e => this.onSelectExample(e)}"> ${reqBodyExamples.map(v => html`<option value="${v.exampleId}" ?selected="${v.exampleId === this.
|
391
|
+
const displayedBodyExample = reqBodyExamples.find(v => v.exampleId === this.selectedRequestBodyExampleId) || reqBodyExamples[0];
|
392
|
+
reqBodyDefaultHtml = html` <div class="example-panel pad-top-8"> ${reqBodyExamples.length === 1 ? '' : html` <select aria-label="request body example" style="min-width:100px;max-width:100%;margin-bottom:-1px" @change="${e => this.onSelectExample(e)}"> ${reqBodyExamples.map(v => html`<option value="${v.exampleId}" ?selected="${v.exampleId === this.selectedRequestBodyExampleId}"> ${v.exampleSummary.length > 80 ? v.exampleId : v.exampleSummary ? v.exampleSummary : v.exampleId} </option>`)} </select>`} ${displayedBodyExample ? html` <div class="example"> ${displayedBodyExample.exampleSummary && displayedBodyExample.exampleSummary.length > 80 ? html`<div style="padding:4px 0"> ${displayedBodyExample.exampleSummary} </div>` : ''} ${displayedBodyExample.exampleDescription ? html`<div class="m-markdown-small" style="padding:4px 0"> ${unsafeHTML(toMarkdown(displayedBodyExample.exampleDescription || ''))} </div>` : ''} <slot name="${this.elementId}--request-body"> <textarea @input="${() => {
|
395
393
|
this.computeCurlSyntax();
|
396
394
|
}}" class="textarea request-body-param-user-input" part="textarea textarea-param" aria-label="${getI18nText('operations.request-body')}" spellcheck="false" data-ptype="${reqBody.mimeType}" style="width:100%;resize:vertical" .value="${this.fillRequestWithDefault === 'true' ? displayedBodyExample.exampleFormat === 'text' ? displayedBodyExample.exampleValue : JSON.stringify(displayedBodyExample.exampleValue, null, 8) : ''}"></textarea> </slot> </div>` : ''} ${reqBodyExamples.map(bodyExample => html` <textarea class="textarea is-hidden request-body-param ${reqBody.mimeType.substring(reqBody.mimeType.indexOf('/') + 1)}" spellcheck="false" data-ptype="${reqBody.mimeType}" data-example="${bodyExample.exampleId}" style="width:100%;resize:vertical;display:none" .value="${bodyExample.exampleFormat === 'text' ? bodyExample.exampleValue : JSON.stringify(bodyExample.exampleValue, null, 8)}"></textarea> `)} </div> `;
|
397
395
|
} else if (this.selectedRequestBodyType.includes('form-urlencoded') || this.selectedRequestBodyType.includes('form-data')) {
|
@@ -417,14 +415,15 @@ export default class ApiRequest extends LitElement {
|
|
417
415
|
}
|
418
416
|
|
419
417
|
// When the content type and the element stay the same, then don't change the updated body.
|
420
|
-
if (((_this$cachedBodyData = this.cachedBodyData) === null || _this$cachedBodyData === void 0 ? void 0 : _this$cachedBodyData.contentType) === this.selectedRequestBodyType && this.elementId === this.cachedBodyData.elementId) {
|
418
|
+
if (((_this$cachedBodyData = this.cachedBodyData) === null || _this$cachedBodyData === void 0 ? void 0 : _this$cachedBodyData.contentType) === this.selectedRequestBodyType && this.elementId === this.cachedBodyData.elementId && this.selectedRequestBodyExampleId === this.cachedBodyData.exampleId) {
|
421
419
|
reqBodyDefaultHtml = this.cachedBodyData.body;
|
422
420
|
} else {
|
423
421
|
// Otherwise use the recalculated body and cache that
|
424
422
|
this.cachedBodyData = {
|
425
423
|
body: reqBodyDefaultHtml,
|
426
424
|
contentType: this.selectedRequestBodyType,
|
427
|
-
elementId: this.elementId
|
425
|
+
elementId: this.elementId,
|
426
|
+
exampleId: this.selectedRequestBodyExampleId
|
428
427
|
};
|
429
428
|
}
|
430
429
|
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(toMarkdown(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" role="group" @click="${e => {
|
@@ -449,7 +448,7 @@ export default class ApiRequest extends LitElement {
|
|
449
448
|
// }
|
450
449
|
|
451
450
|
apiResponseTabTemplate() {
|
452
|
-
const curlSyntax = this.curlSyntax ||
|
451
|
+
const curlSyntax = this.curlSyntax || '';
|
453
452
|
const hasResponse = this.responseMessage !== '';
|
454
453
|
return html` <div class="row" style="font-size:var(--font-size-small);margin:5px 0"> ${this.responseMessage ? html`<div class="response-message ${this.responseStatus}">Response Status: ${this.responseMessage} ${this.responseElapsedMs ? html`<span><br>Execution Time: ${this.responseElapsedMs}ms</span>` : ''} </div>` : ''} <div style="flex:1"></div> ${!hasResponse ? '' : html`<button class="m-btn" part="btn btn-outline" @click="${this.clearResponseData}">${getI18nText('operations.clear-response')}</button>`} </div> <div class="tab-panel col" style="border-width:0 0 1px 0"> <div id="tab_buttons" class="tab-buttons row" @click="${e => {
|
455
454
|
if (e.target.classList.contains('tab-btn') === false) {
|
@@ -630,10 +630,11 @@ export default class OpenApiExplorer extends LitElement {
|
|
630
630
|
|
631
631
|
// explorerLocation will get validated in the focused-endpoint-template
|
632
632
|
this.explorerLocation = elementId;
|
633
|
-
const
|
634
|
-
if (
|
635
|
-
|
633
|
+
const tagFoundByPath = this.resolvedSpec.tags.find(t => t.paths.some(p => p.elementId === elementId));
|
634
|
+
if (tagFoundByPath) {
|
635
|
+
tagFoundByPath.expanded = true;
|
636
636
|
}
|
637
|
+
|
637
638
|
// Convert to Async and to the background, so that we can be sure that the operation has been expanded and put into view before trying to directly scroll to it (or it won't be found in the next line and even if it is, it might not be able to be scrolled into view)
|
638
639
|
await sleep(0);
|
639
640
|
|
@@ -684,7 +685,7 @@ export default class OpenApiExplorer extends LitElement {
|
|
684
685
|
// Update Location Hash
|
685
686
|
replaceState(elementId);
|
686
687
|
newNavEl = this.shadowRoot.getElementById(`link-${elementId}`);
|
687
|
-
} else if (!elementId.match('cmp--') && !elementId.match('tag--')) {
|
688
|
+
} else if (!elementId.match('cmp--') && !elementId.match('tag--') && !elementId.match(/--h[12]$/)) {
|
688
689
|
this.shadowRoot.getElementById('operations-root').scrollIntoView({
|
689
690
|
behavior: 'auto',
|
690
691
|
block: 'start'
|
@@ -35,7 +35,7 @@ class ApiRequest extends _lit.LitElement {
|
|
35
35
|
this.curlSyntax = '';
|
36
36
|
this.activeResponseTab = 'curl'; // allowed values: response, headers, curl
|
37
37
|
this.selectedRequestBodyType = '';
|
38
|
-
this.
|
38
|
+
this.selectedRequestBodyExampleId = '';
|
39
39
|
}
|
40
40
|
static get properties() {
|
41
41
|
return {
|
@@ -148,13 +148,11 @@ class ApiRequest extends _lit.LitElement {
|
|
148
148
|
},
|
149
149
|
// internal tracking of response-tab not exposed as a attribute
|
150
150
|
selectedRequestBodyType: {
|
151
|
-
type: String
|
152
|
-
attribute: 'selected-request-body-type'
|
151
|
+
type: String
|
153
152
|
},
|
154
153
|
// internal tracking of selected request-body type
|
155
|
-
|
156
|
-
type: String
|
157
|
-
attribute: 'selected-request-body-example'
|
154
|
+
selectedRequestBodyExampleId: {
|
155
|
+
type: String
|
158
156
|
},
|
159
157
|
// internal tracking of selected request-body example
|
160
158
|
curlSyntax: {
|
@@ -322,17 +320,17 @@ class ApiRequest extends _lit.LitElement {
|
|
322
320
|
}
|
323
321
|
resetRequestBodySelection() {
|
324
322
|
this.selectedRequestBodyType = '';
|
325
|
-
this.
|
323
|
+
this.selectedRequestBodyExampleId = '';
|
326
324
|
this.computeCurlSyntax();
|
327
325
|
this.clearResponseData();
|
328
326
|
}
|
329
327
|
|
330
328
|
// Request-Body Event Handlers
|
331
329
|
onSelectExample(e) {
|
332
|
-
this.
|
330
|
+
this.selectedRequestBodyExampleId = e.target.value;
|
333
331
|
const exampleDropdownEl = e.target;
|
334
332
|
window.setTimeout(selectEl => {
|
335
|
-
const exampleTextareaEl = selectEl.closest('.example-panel').querySelector(`.request-body-param[data-example="${this.
|
333
|
+
const exampleTextareaEl = selectEl.closest('.example-panel').querySelector(`.request-body-param[data-example="${this.selectedRequestBodyExampleId}"`);
|
336
334
|
const userInputExampleTextareaEl = selectEl.closest('.example-panel').querySelector('.request-body-param-user-input');
|
337
335
|
userInputExampleTextareaEl.value = exampleTextareaEl.value;
|
338
336
|
this.computeCurlSyntax();
|
@@ -341,7 +339,7 @@ class ApiRequest extends _lit.LitElement {
|
|
341
339
|
onMimeTypeChange(e) {
|
342
340
|
this.selectedRequestBodyType = e.target.value;
|
343
341
|
const mimeDropdownEl = e.target;
|
344
|
-
this.
|
342
|
+
this.selectedRequestBodyExampleId = '';
|
345
343
|
window.setTimeout(selectEl => {
|
346
344
|
const exampleTextareaEl = selectEl.closest('.request-body-container').querySelector('.request-body-param');
|
347
345
|
if (exampleTextareaEl) {
|
@@ -392,11 +390,11 @@ class ApiRequest extends _lit.LitElement {
|
|
392
390
|
// Generate Example
|
393
391
|
if (this.selectedRequestBodyType.includes('json') || this.selectedRequestBodyType.includes('xml') || this.selectedRequestBodyType.includes('text')) {
|
394
392
|
const reqBodyExamples = (0, _schemaUtils.generateExample)(reqBody.examples ? reqBody.examples : '', reqBody.example ? reqBody.example : '', reqBody.schema, reqBody.mimeType, false, true, 'text', true);
|
395
|
-
if (!this.
|
396
|
-
this.
|
393
|
+
if (!this.selectedRequestBodyExampleId) {
|
394
|
+
this.selectedRequestBodyExampleId = reqBodyExamples.length > 0 ? reqBodyExamples[0].exampleId : '';
|
397
395
|
}
|
398
|
-
const displayedBodyExample = reqBodyExamples.find(v => v.exampleId === this.
|
399
|
-
reqBodyDefaultHtml = (0, _lit.html)` <div class="example-panel pad-top-8"> ${reqBodyExamples.length === 1 ? '' : (0, _lit.html)` <select aria-label="request body example" style="min-width:100px;max-width:100%;margin-bottom:-1px" @change="${e => this.onSelectExample(e)}"> ${reqBodyExamples.map(v => (0, _lit.html)`<option value="${v.exampleId}" ?selected="${v.exampleId === this.
|
396
|
+
const displayedBodyExample = reqBodyExamples.find(v => v.exampleId === this.selectedRequestBodyExampleId) || reqBodyExamples[0];
|
397
|
+
reqBodyDefaultHtml = (0, _lit.html)` <div class="example-panel pad-top-8"> ${reqBodyExamples.length === 1 ? '' : (0, _lit.html)` <select aria-label="request body example" style="min-width:100px;max-width:100%;margin-bottom:-1px" @change="${e => this.onSelectExample(e)}"> ${reqBodyExamples.map(v => (0, _lit.html)`<option value="${v.exampleId}" ?selected="${v.exampleId === this.selectedRequestBodyExampleId}"> ${v.exampleSummary.length > 80 ? v.exampleId : v.exampleSummary ? v.exampleSummary : v.exampleId} </option>`)} </select>`} ${displayedBodyExample ? (0, _lit.html)` <div class="example"> ${displayedBodyExample.exampleSummary && displayedBodyExample.exampleSummary.length > 80 ? (0, _lit.html)`<div style="padding:4px 0"> ${displayedBodyExample.exampleSummary} </div>` : ''} ${displayedBodyExample.exampleDescription ? (0, _lit.html)`<div class="m-markdown-small" style="padding:4px 0"> ${(0, _unsafeHtml.unsafeHTML)((0, _commonUtils.toMarkdown)(displayedBodyExample.exampleDescription || ''))} </div>` : ''} <slot name="${this.elementId}--request-body"> <textarea @input="${() => {
|
400
398
|
this.computeCurlSyntax();
|
401
399
|
}}" class="textarea request-body-param-user-input" part="textarea textarea-param" aria-label="${(0, _index.getI18nText)('operations.request-body')}" spellcheck="false" data-ptype="${reqBody.mimeType}" style="width:100%;resize:vertical" .value="${this.fillRequestWithDefault === 'true' ? displayedBodyExample.exampleFormat === 'text' ? displayedBodyExample.exampleValue : JSON.stringify(displayedBodyExample.exampleValue, null, 8) : ''}"></textarea> </slot> </div>` : ''} ${reqBodyExamples.map(bodyExample => (0, _lit.html)` <textarea class="textarea is-hidden request-body-param ${reqBody.mimeType.substring(reqBody.mimeType.indexOf('/') + 1)}" spellcheck="false" data-ptype="${reqBody.mimeType}" data-example="${bodyExample.exampleId}" style="width:100%;resize:vertical;display:none" .value="${bodyExample.exampleFormat === 'text' ? bodyExample.exampleValue : JSON.stringify(bodyExample.exampleValue, null, 8)}"></textarea> `)} </div> `;
|
402
400
|
} else if (this.selectedRequestBodyType.includes('form-urlencoded') || this.selectedRequestBodyType.includes('form-data')) {
|
@@ -422,14 +420,15 @@ class ApiRequest extends _lit.LitElement {
|
|
422
420
|
}
|
423
421
|
|
424
422
|
// When the content type and the element stay the same, then don't change the updated body.
|
425
|
-
if (((_this$cachedBodyData = this.cachedBodyData) === null || _this$cachedBodyData === void 0 ? void 0 : _this$cachedBodyData.contentType) === this.selectedRequestBodyType && this.elementId === this.cachedBodyData.elementId) {
|
423
|
+
if (((_this$cachedBodyData = this.cachedBodyData) === null || _this$cachedBodyData === void 0 ? void 0 : _this$cachedBodyData.contentType) === this.selectedRequestBodyType && this.elementId === this.cachedBodyData.elementId && this.selectedRequestBodyExampleId === this.cachedBodyData.exampleId) {
|
426
424
|
reqBodyDefaultHtml = this.cachedBodyData.body;
|
427
425
|
} else {
|
428
426
|
// Otherwise use the recalculated body and cache that
|
429
427
|
this.cachedBodyData = {
|
430
428
|
body: reqBodyDefaultHtml,
|
431
429
|
contentType: this.selectedRequestBodyType,
|
432
|
-
elementId: this.elementId
|
430
|
+
elementId: this.elementId,
|
431
|
+
exampleId: this.selectedRequestBodyExampleId
|
433
432
|
};
|
434
433
|
}
|
435
434
|
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, _commonUtils.toMarkdown)(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" role="group" @click="${e => {
|
@@ -454,7 +453,7 @@ class ApiRequest extends _lit.LitElement {
|
|
454
453
|
// }
|
455
454
|
|
456
455
|
apiResponseTabTemplate() {
|
457
|
-
const curlSyntax = this.curlSyntax ||
|
456
|
+
const curlSyntax = this.curlSyntax || '';
|
458
457
|
const hasResponse = this.responseMessage !== '';
|
459
458
|
return (0, _lit.html)` <div class="row" style="font-size:var(--font-size-small);margin:5px 0"> ${this.responseMessage ? (0, _lit.html)`<div class="response-message ${this.responseStatus}">Response Status: ${this.responseMessage} ${this.responseElapsedMs ? (0, _lit.html)`<span><br>Execution Time: ${this.responseElapsedMs}ms</span>` : ''} </div>` : ''} <div style="flex:1"></div> ${!hasResponse ? '' : (0, _lit.html)`<button class="m-btn" part="btn btn-outline" @click="${this.clearResponseData}">${(0, _index.getI18nText)('operations.clear-response')}</button>`} </div> <div class="tab-panel col" style="border-width:0 0 1px 0"> <div id="tab_buttons" class="tab-buttons row" @click="${e => {
|
460
459
|
if (e.target.classList.contains('tab-btn') === false) {
|
@@ -636,10 +636,11 @@ class OpenApiExplorer extends _lit.LitElement {
|
|
636
636
|
|
637
637
|
// explorerLocation will get validated in the focused-endpoint-template
|
638
638
|
this.explorerLocation = elementId;
|
639
|
-
const
|
640
|
-
if (
|
641
|
-
|
639
|
+
const tagFoundByPath = this.resolvedSpec.tags.find(t => t.paths.some(p => p.elementId === elementId));
|
640
|
+
if (tagFoundByPath) {
|
641
|
+
tagFoundByPath.expanded = true;
|
642
642
|
}
|
643
|
+
|
643
644
|
// Convert to Async and to the background, so that we can be sure that the operation has been expanded and put into view before trying to directly scroll to it (or it won't be found in the next line and even if it is, it might not be able to be scrolled into view)
|
644
645
|
await (0, _commonUtils.sleep)(0);
|
645
646
|
|
@@ -690,7 +691,7 @@ class OpenApiExplorer extends _lit.LitElement {
|
|
690
691
|
// Update Location Hash
|
691
692
|
(0, _commonUtils.replaceState)(elementId);
|
692
693
|
newNavEl = this.shadowRoot.getElementById(`link-${elementId}`);
|
693
|
-
} else if (!elementId.match('cmp--') && !elementId.match('tag--')) {
|
694
|
+
} else if (!elementId.match('cmp--') && !elementId.match('tag--') && !elementId.match(/--h[12]$/)) {
|
694
695
|
this.shadowRoot.getElementById('operations-root').scrollIntoView({
|
695
696
|
behavior: 'auto',
|
696
697
|
block: 'start'
|
package/package.json
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
{
|
2
2
|
"name": "openapi-explorer",
|
3
|
-
"version": "2.2.
|
3
|
+
"version": "2.2.773",
|
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",
|