rapidoc 11.0.0 → 12.0.0

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.
Files changed (80) hide show
  1. package/README.md +46 -31
  2. package/dist/rapidoc-min.js +1424 -213
  3. package/dist/rapidoc-static-min.js +13542 -0
  4. package/package.json +48 -34
  5. package/src/components/api-request.ts +869 -0
  6. package/src/components/api-response.ts +509 -0
  7. package/src/components/json-tree.ts +171 -0
  8. package/src/components/schema-base-element.ts +315 -0
  9. package/src/components/schema-table.ts +430 -0
  10. package/src/components/schema-tree.ts +386 -0
  11. package/src/components/tag-input.ts +184 -0
  12. package/src/index.js +6 -0
  13. package/src/oauth-receiver.ts +29 -0
  14. package/src/rapidoc-mini.ts +582 -0
  15. package/src/rapidoc.ts +1808 -0
  16. package/src/static/index.d.ts +149 -0
  17. package/src/static/index.js +62 -0
  18. package/src/static/navigation.js +497 -0
  19. package/src/static/render.js +490 -0
  20. package/src/static/serializer.js +216 -0
  21. package/src/styles/auth-styles.js +318 -0
  22. package/src/styles/border-styles.js +24 -0
  23. package/src/styles/css-bundle.js +129 -0
  24. package/src/styles/custom-styles.js +8 -0
  25. package/src/styles/dialog-box-styles.js +102 -0
  26. package/src/styles/endpoint-styles.js +559 -0
  27. package/src/styles/flex-styles.js +16 -0
  28. package/src/styles/font-styles.js +432 -0
  29. package/src/styles/info-styles.js +36 -0
  30. package/src/styles/input-styles.js +555 -0
  31. package/src/styles/layout-styles.js +396 -0
  32. package/src/styles/microlighter-styles.js +99 -0
  33. package/src/styles/nav-styles.js +609 -0
  34. package/src/styles/param-list-styles.js +261 -0
  35. package/src/styles/schema-styles.js +288 -0
  36. package/src/styles/tab-styles.js +106 -0
  37. package/src/styles/theme-tokens.js +582 -0
  38. package/src/templates/advanced-search-dialog-template.js +94 -0
  39. package/src/templates/api-response-template.js +219 -0
  40. package/src/templates/callback-template.js +86 -0
  41. package/src/templates/code-samples-template.js +52 -0
  42. package/src/templates/components-template.js +86 -0
  43. package/src/templates/downloads-template.js +85 -0
  44. package/src/templates/endpoint-template.js +386 -0
  45. package/src/templates/expanded-endpoint-template.js +266 -0
  46. package/src/templates/focused-endpoint-template.js +145 -0
  47. package/src/templates/header-template.js +92 -0
  48. package/src/templates/logo-template.js +21 -0
  49. package/src/templates/main-body-template.js +102 -0
  50. package/src/templates/navbar-template.js +489 -0
  51. package/src/templates/overview-template.js +104 -0
  52. package/src/templates/request-body-template.js +651 -0
  53. package/src/templates/request-params-template.js +474 -0
  54. package/src/templates/security-scheme-template.js +1263 -0
  55. package/src/templates/server-template.js +152 -0
  56. package/src/utils/auto-color-scheme.js +99 -0
  57. package/src/utils/bind-navbar.js +175 -0
  58. package/src/utils/color-utils.js +59 -0
  59. package/src/utils/common-utils.js +191 -0
  60. package/src/utils/curl-utils.js +123 -0
  61. package/src/utils/highlighter.js +416 -0
  62. package/src/utils/markdown-utils.js +110 -0
  63. package/src/utils/mcp/common.js +467 -0
  64. package/src/utils/mcp/generators/csharp.js +242 -0
  65. package/src/utils/mcp/generators/go.js +298 -0
  66. package/src/utils/mcp/generators/java.js +330 -0
  67. package/src/utils/mcp/generators/python.js +248 -0
  68. package/src/utils/mcp/generators/rust.js +281 -0
  69. package/src/utils/mcp/generators/typescript.js +290 -0
  70. package/src/utils/mcp-generator.js +143 -0
  71. package/src/utils/mock-interceptor.js +508 -0
  72. package/src/utils/oauth-utils.js +87 -0
  73. package/src/utils/request-utils.js +203 -0
  74. package/src/utils/response-utils.js +203 -0
  75. package/src/utils/sanitize.js +57 -0
  76. package/src/utils/schema-utils.js +1927 -0
  77. package/src/utils/slugger.js +189 -0
  78. package/src/utils/spec-parser.js +915 -0
  79. package/src/utils/url-utils.js +211 -0
  80. package/src/utils/xml-utils.js +61 -0
@@ -0,0 +1,430 @@
1
+ import { html, css, nothing } from "lit";
2
+ import { customElement } from "lit/decorators.js";
3
+ import FontStyles from "../styles/font-styles.js";
4
+ import SchemaStyles from "../styles/schema-styles.js";
5
+ import CustomStyles from "../styles/custom-styles.js";
6
+ import SchemaBaseElement from "./schema-base-element";
7
+
8
+ @customElement("schema-table")
9
+ export default class SchemaTable extends SchemaBaseElement {
10
+ static get styles() {
11
+ return [
12
+ FontStyles,
13
+ SchemaStyles,
14
+ css`
15
+ .table {
16
+ font-size: var(--font-size-small);
17
+ text-align: left;
18
+ line-height: calc(var(--font-size-small) + 6px);
19
+
20
+ & .table-container {
21
+ border: 1px solid var(--border);
22
+ /* Card surface, same as .param-list */
23
+ background: color-mix(in srgb, var(--card) 80%, transparent);
24
+ overflow-x: auto;
25
+ max-width: 100%;
26
+ }
27
+ & .table-header {
28
+ display: flex;
29
+ background: var(--card);
30
+ padding: 8px 4px;
31
+ border-bottom: 1px solid var(--border);
32
+
33
+ & .td {
34
+ font-family: var(--font-sans);
35
+ font-weight: bold;
36
+ color: var(--foreground);
37
+ }
38
+ }
39
+ & .tr {
40
+ width: calc(100% - 5px);
41
+ padding: 0 0 0 5px;
42
+ border-bottom: 1px dotted var(--border);
43
+
44
+ &.expanded {
45
+ & .obj-toggle::after {
46
+ content: '-';
47
+ }
48
+ & + .object-body {
49
+ display: block;
50
+ }
51
+ }
52
+ &.collapsed {
53
+ & .obj-toggle::after {
54
+ content: '+';
55
+ }
56
+ & + .object-body {
57
+ display: none;
58
+ }
59
+ }
60
+ }
61
+ & .td {
62
+ padding: 4px 0;
63
+ }
64
+ & .key {
65
+ width: var(--table-schema-key-width);
66
+ text-overflow: var(--table-schema-key-text-overflow);
67
+ white-space: var(--table-schema-key-whitespace);
68
+ overflow: hidden;
69
+
70
+ & .key-label {
71
+ font-size: var(--font-size-mono);
72
+ }
73
+ &.deprecated .key-label {
74
+ color: var(--destructive);
75
+ }
76
+ }
77
+ & .key-type {
78
+ white-space: normal;
79
+ width: 150px;
80
+ }
81
+ &.collapsed-all-descr .tr:not(.expanded-descr) {
82
+ overflow: hidden;
83
+ max-height: calc(var(--font-size-small) + 16px);
84
+ }
85
+ }
86
+
87
+ .obj-toggle {
88
+ background: transparent;
89
+ border: 1px solid transparent;
90
+ padding: 0;
91
+ border-radius: 2px;
92
+ display: inline-flex;
93
+ align-items: center;
94
+ justify-content: center;
95
+ margin-left: -16px;
96
+ margin-top: -2px;
97
+ color: var(--primary);
98
+ cursor: pointer;
99
+ font-size: 14px;
100
+ font-family: var(--font-mono);
101
+ line-height: 12px;
102
+ width: 14px;
103
+ height: 14px;
104
+ min-width: 14px;
105
+ text-align: center;
106
+ user-select: none;
107
+ box-sizing: border-box;
108
+ vertical-align: middle;
109
+
110
+ &:hover {
111
+ border-color: var(--primary);
112
+ }
113
+ &:focus-visible {
114
+ outline: 2px solid var(--primary);
115
+ border-color: var(--primary);
116
+ }
117
+ }
118
+
119
+ @supports (grid-template-columns: subgrid) {
120
+ .table {
121
+ & .table-container {
122
+ display: grid;
123
+ grid-template-columns: minmax(var(--table-schema-key-width), auto) minmax(150px, auto) 1fr;
124
+ }
125
+ & .table-header,
126
+ & .tr {
127
+ display: grid;
128
+ grid-column: 1 / -1;
129
+ grid-template-columns: subgrid;
130
+ width: 100%;
131
+ padding: 0 4px;
132
+ box-sizing: border-box;
133
+
134
+ & .key,
135
+ & .key-type {
136
+ width: auto;
137
+ }
138
+ & .key-descr {
139
+ min-width: 0;
140
+ }
141
+ }
142
+ & .object-body {
143
+ display: contents;
144
+ }
145
+ & .tr.collapsed + .object-body {
146
+ display: none;
147
+ }
148
+ & .tr.expanded + .object-body {
149
+ display: contents;
150
+ }
151
+ }
152
+ }
153
+ `,
154
+ CustomStyles,
155
+ ];
156
+ }
157
+
158
+ render() {
159
+ if (!this.data) {
160
+ return "";
161
+ }
162
+
163
+ const rootType = this.data.kind === "primitive" ? this.data.type : this.data.kind || "";
164
+ const rootDescription = this.data.description || "";
165
+
166
+ return html`
167
+ <div
168
+ class="table ${this.schemaDescriptionExpanded === "true" ? "expanded-all-descr" : "collapsed-all-descr"}"
169
+ @click="${(e) => this.handleAllEvents(e)}"
170
+ @keydown="${(e) => this.handleKeyDown(e)}"
171
+ >
172
+ ${this.renderToolbar(rootType)}
173
+ <span part="schema-description" class="m-markdown"> ${this.renderDescriptionHtml(rootDescription)} </span>
174
+ <div class="table-container">
175
+ <div class="tr table-header">
176
+ <div class="td key">Field</div>
177
+ <div class="td key-type">Type</div>
178
+ <div class="td key-descr">Description</div>
179
+ </div>
180
+ ${this.renderAST(this.data)}
181
+ </div>
182
+ </div>
183
+ `;
184
+ }
185
+
186
+ renderAST(node, parentType = "", schemaLevel = 0, indentLevel = 0) {
187
+ if (this.isFieldHidden(node)) {
188
+ return "";
189
+ }
190
+
191
+ const leftPadding = 16 * (indentLevel + 1);
192
+ const isExpanded = schemaLevel < this.schemaExpandLevel;
193
+ const nullClass = node.nullable ? "nullable" : "";
194
+ const deprecatedIcon = this.renderDeprecatedIcon(node);
195
+ const readWriteBadge = this.getReadWriteBadge(node);
196
+ const readWriteTip = this.getReadWriteTip(node);
197
+
198
+ // 1. Array kind
199
+ if (node.kind === "array") {
200
+ const items = node.items;
201
+ if (!items) {
202
+ const typeLabel = node.dataTypeLabel || (node.nullable ? "array ┃ null" : "array");
203
+ return html`
204
+ <div class="tr array ${nullClass}" data-obj="${node.name || ""}">
205
+ <div class="td key" style="padding-left:${leftPadding}px">
206
+ <span class="key-label" title="${node.name || nothing}">${deprecatedIcon}${node.name || ""}</span>
207
+ ${node.required ? html`<span style="color:var(--destructive);">*</span>` : ""}
208
+ </div>
209
+ <div class="td key-type" title="${readWriteTip || nothing}">${typeLabel}${readWriteBadge}</div>
210
+ ${this.renderDescrCell(node.description)}
211
+ </div>
212
+ `;
213
+ }
214
+
215
+ if (items.kind === "primitive") {
216
+ const itemType = items.format || items.contentMediaType || items.type || "string";
217
+ const dataTypeCss = this.getDataTypeCss(itemType);
218
+
219
+ return html`
220
+ <div class="tr primitive ${nullClass}" title="${node.deprecated || items.deprecated ? "Deprecated" : nothing}">
221
+ <div class="td key ${node.deprecated || items.deprecated ? "deprecated" : ""}" style="padding-left:${leftPadding}px">
222
+ ${deprecatedIcon}${node.name ? html`<span class="key-label" title="${node.name}">${node.name}</span>` : ""}
223
+ ${node.required ? html`<span style="color:var(--destructive);">*</span>` : ""}
224
+ </div>
225
+ <div class="td key-type ${dataTypeCss}" title="${readWriteTip || nothing}">
226
+ [${itemType}]${node.nullable ? " ┃ null" : ""}${readWriteBadge}
227
+ </div>
228
+ ${this.renderDescrCell(node.description || items.description, items)}
229
+ </div>
230
+ `;
231
+ }
232
+
233
+ let arrLabel = "array";
234
+ if (items.kind === "object") {
235
+ arrLabel = "array of object";
236
+ } else if (items.kind === "array") {
237
+ arrLabel = `array of array ${node.arrayType ? `of ${node.arrayType}` : ""}`.trim();
238
+ } else if (items.kind === "union") {
239
+ arrLabel = "array of union";
240
+ }
241
+ if (node.nullable) {
242
+ arrLabel += " ┃ null";
243
+ }
244
+
245
+ const hasChildren =
246
+ items.kind === "object"
247
+ ? !!(
248
+ (items.properties && items.properties.length > 0) ||
249
+ (items.patternProperties && items.patternProperties.length > 0) ||
250
+ items.additionalProperties ||
251
+ (items.unions && items.unions.length > 0)
252
+ )
253
+ : true;
254
+
255
+ return html`
256
+ <div
257
+ class="tr ${isExpanded ? "expanded" : "collapsed"} array ${nullClass}"
258
+ data-obj="${node.name || ""}"
259
+ title="${node.deprecated ? `Deprecated ${node.name}` : node.name || nothing}"
260
+ >
261
+ <div class="td key ${node.deprecated ? "deprecated" : ""}" style="padding-left:${leftPadding}px">
262
+ ${
263
+ node.name && hasChildren
264
+ ? html`<button
265
+ type="button"
266
+ class="obj-toggle"
267
+ data-obj="${node.name}"
268
+ aria-label="Toggle ${node.name}"
269
+ aria-expanded="${isExpanded ? "true" : "false"}"
270
+ ></button>`
271
+ : ""
272
+ }
273
+ <span class="key-label" title="${node.name || nothing}" style="display:inline-block; ${hasChildren ? "margin-left:-6px;" : ""}">
274
+ ${deprecatedIcon}${node.name || ""}
275
+ </span>
276
+ ${node.required ? html`<span style="color:var(--destructive);">*</span>` : ""}
277
+ </div>
278
+ <div class="td key-type" title="${readWriteTip || nothing}">${arrLabel}${readWriteBadge}</div>
279
+ ${this.renderDescrCell(node.description || items.description)}
280
+ </div>
281
+ ${
282
+ hasChildren
283
+ ? html`
284
+ <div class="object-body">
285
+ ${
286
+ items.kind === "object"
287
+ ? html`
288
+ ${items.properties?.map((p) => this.renderAST(p, "object", schemaLevel + 1, indentLevel + 1))}
289
+ ${items.patternProperties?.map((p) => this.renderAST(p, "object", schemaLevel + 1, indentLevel + 1))}
290
+ ${items.additionalProperties ? this.renderAST(items.additionalProperties, "object", schemaLevel + 1, indentLevel + 1) : ""}
291
+ ${items.unions?.map((u) => this.renderAST(u, "object", schemaLevel + 1, indentLevel + 1))}
292
+ `
293
+ : this.renderAST(items, "array", schemaLevel + 1, indentLevel + 1)
294
+ }
295
+ </div>
296
+ `
297
+ : ""
298
+ }
299
+ `;
300
+ }
301
+
302
+ // 2. Object kind
303
+ if (node.kind === "object") {
304
+ const typeLabel = node.dataTypeLabel || (node.nullable ? "object ┃ null" : "object");
305
+
306
+ const hasChildren = !!(
307
+ (node.properties && node.properties.length > 0) ||
308
+ (node.patternProperties && node.patternProperties.length > 0) ||
309
+ node.additionalProperties ||
310
+ (node.unions && node.unions.length > 0)
311
+ );
312
+
313
+ return html`
314
+ ${
315
+ node.name
316
+ ? html`
317
+ <div
318
+ class="tr ${isExpanded ? "expanded" : "collapsed"} object ${nullClass}"
319
+ data-obj="${node.name}"
320
+ title="${node.deprecated ? `Deprecated ${node.name}` : node.name}"
321
+ >
322
+ <div class="td key ${node.deprecated ? "deprecated" : ""}" style="padding-left:${leftPadding}px">
323
+ ${
324
+ hasChildren
325
+ ? html`<button
326
+ type="button"
327
+ class="obj-toggle"
328
+ data-obj="${node.name}"
329
+ aria-label="Toggle ${node.name}"
330
+ aria-expanded="${isExpanded ? "true" : "false"}"
331
+ ></button>`
332
+ : ""
333
+ }
334
+ <span
335
+ class="key-label"
336
+ title="${node.name || nothing}"
337
+ style="display:inline-block; ${hasChildren ? "margin-left:-6px;" : ""}"
338
+ >
339
+ ${deprecatedIcon}${node.name}
340
+ </span>
341
+ ${node.required ? html`<span style="color:var(--destructive);">*</span>` : ""}
342
+ </div>
343
+ <div class="td key-type" title="${readWriteTip || nothing}">${typeLabel}${readWriteBadge}</div>
344
+ ${this.renderDescrCell(node.description)}
345
+ </div>
346
+ `
347
+ : ""
348
+ }
349
+ ${
350
+ hasChildren
351
+ ? html`
352
+ <div class="object-body">
353
+ ${node.properties?.map((p) => this.renderAST(p, "object", schemaLevel + 1, indentLevel + (node.name ? 1 : 0)))}
354
+ ${node.patternProperties?.map((p) => this.renderAST(p, "object", schemaLevel + 1, indentLevel + (node.name ? 1 : 0)))}
355
+ ${node.additionalProperties ? this.renderAST(node.additionalProperties, "object", schemaLevel + 1, indentLevel + (node.name ? 1 : 0)) : ""}
356
+ ${node.unions?.map((u) => this.renderAST(u, "object", schemaLevel + 1, indentLevel + (node.name ? 1 : 0)))}
357
+ </div>
358
+ `
359
+ : ""
360
+ }
361
+ `;
362
+ }
363
+
364
+ // 3. Union kind (oneOf / anyOf)
365
+ if (node.kind === "union") {
366
+ const opLabel =
367
+ (node.operator === "anyOf" ? "ANY OF" : "ONE OF") + (node.suffix ? ` ${node.suffix}` : "");
368
+ // Options are already labelled by their OPT row, so only property names are shown
369
+ const showName = node.name && parentType !== "xxx-of-option";
370
+
371
+ return html`
372
+ ${node.properties?.map((p) => this.renderAST(p, "object", schemaLevel, indentLevel))}
373
+ <div class="tr expanded xxx-of" data-obj="${showName ? node.name : opLabel}">
374
+ ${
375
+ showName
376
+ ? html`
377
+ <div class="td key" style="padding-left:${leftPadding}px">
378
+ <span class="key-label" title="${node.name}">${node.name}</span>
379
+ ${node.required ? html`<span style="color:var(--destructive);">*</span>` : ""}
380
+ </div>
381
+ <div class="td key-type"><span class="xxx-of-key">${opLabel}</span></div>
382
+ `
383
+ : html`
384
+ <div class="td key" style="padding-left:${leftPadding}px">
385
+ <span class="xxx-of-key" style="margin-left:-6px">${opLabel}</span>
386
+ </div>
387
+ <div class="td key-type"></div>
388
+ `
389
+ }
390
+ ${this.renderDescrCell(node.description)}
391
+ </div>
392
+ <div class="object-body">
393
+ ${node.options?.map(
394
+ (opt, i) => html`
395
+ <div class="tr expanded xxx-of-option" data-obj="OPTION ${opt.optionIndex || i + 1}">
396
+ <div class="td key" style="padding-left:${leftPadding + 16}px">
397
+ <span class="xxx-of-key">OPT ${opt.optionIndex || i + 1}</span>
398
+ ${opt.optionTitle ? html`<span class="xxx-of-descr">${opt.optionTitle}</span>` : ""}
399
+ </div>
400
+ <div class="td key-type"></div>
401
+ <div class="td key-descr"></div>
402
+ </div>
403
+ <div class="object-body">${this.renderAST(opt, "xxx-of-option", schemaLevel + 1, indentLevel + 1)}</div>
404
+ `,
405
+ )}
406
+ </div>
407
+ `;
408
+ }
409
+
410
+ // 4. Primitive kind
411
+ if (node.kind === "primitive") {
412
+ const dataTypeCss = this.getDataTypeCss(node.type);
413
+
414
+ return html`
415
+ <div class="tr primitive ${nullClass}" title="${node.deprecated ? "Deprecated" : nothing}">
416
+ <div class="td key ${node.deprecated ? "deprecated" : ""}" style="padding-left:${leftPadding}px">
417
+ ${deprecatedIcon}${node.name ? html`<span class="key-label" title="${node.name}">${node.name}</span>` : ""}
418
+ ${node.required ? html`<span style="color:var(--destructive);">*</span>` : ""}
419
+ </div>
420
+ <div class="td key-type ${dataTypeCss}" title="${readWriteTip || nothing}">
421
+ ${parentType === "array" ? `[${node.type}]` : node.type}${readWriteBadge}
422
+ </div>
423
+ ${this.renderDescrCell(node.description, node, node.title)}
424
+ </div>
425
+ `;
426
+ }
427
+
428
+ return "";
429
+ }
430
+ }