specra 0.1.13 → 0.2.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 (276) hide show
  1. package/LICENSE.MD +25 -4
  2. package/README.md +67 -58
  3. package/config/specra.config.schema.json +16 -0
  4. package/config/svelte-config.js +63 -0
  5. package/dist/api-parser.types.d.ts +59 -0
  6. package/dist/api-parser.types.js +5 -0
  7. package/dist/api.types.d.ts +137 -0
  8. package/dist/api.types.js +5 -0
  9. package/dist/category.d.ts +21 -0
  10. package/dist/category.js +48 -0
  11. package/dist/components/ConfigProvider.svelte +13 -0
  12. package/dist/components/ConfigProvider.svelte.d.ts +31 -0
  13. package/dist/components/docs/Accordion.svelte +18 -0
  14. package/dist/components/docs/Accordion.svelte.d.ts +10 -0
  15. package/dist/components/docs/AccordionItem.svelte +41 -0
  16. package/dist/components/docs/AccordionItem.svelte.d.ts +10 -0
  17. package/dist/components/docs/Badge.svelte +28 -0
  18. package/dist/components/docs/Badge.svelte.d.ts +9 -0
  19. package/dist/components/docs/Breadcrumb.svelte +80 -0
  20. package/dist/components/docs/Breadcrumb.svelte.d.ts +8 -0
  21. package/dist/components/docs/Callout.svelte +96 -0
  22. package/dist/components/docs/Callout.svelte.d.ts +10 -0
  23. package/dist/components/docs/Card.svelte +63 -0
  24. package/dist/components/docs/Card.svelte.d.ts +12 -0
  25. package/dist/components/docs/CardGrid.svelte +24 -0
  26. package/dist/components/docs/CardGrid.svelte.d.ts +8 -0
  27. package/dist/components/docs/CategoryIndex.svelte +110 -0
  28. package/dist/components/docs/CategoryIndex.svelte.d.ts +29 -0
  29. package/dist/components/docs/CodeBlock.svelte +172 -0
  30. package/dist/components/docs/CodeBlock.svelte.d.ts +8 -0
  31. package/dist/components/docs/Column.svelte +25 -0
  32. package/dist/components/docs/Column.svelte.d.ts +8 -0
  33. package/dist/components/docs/Columns.svelte +38 -0
  34. package/dist/components/docs/Columns.svelte.d.ts +13 -0
  35. package/dist/components/docs/DevModeBadge.svelte +15 -0
  36. package/dist/components/docs/DevModeBadge.svelte.d.ts +18 -0
  37. package/dist/components/docs/DocBadge.svelte +28 -0
  38. package/dist/components/docs/DocBadge.svelte.d.ts +9 -0
  39. package/dist/components/docs/DocLayout.svelte +107 -0
  40. package/dist/components/docs/DocLayout.svelte.d.ts +32 -0
  41. package/dist/components/docs/DocLoading.svelte +53 -0
  42. package/dist/components/docs/DocLoading.svelte.d.ts +18 -0
  43. package/dist/components/docs/DocMetadata.svelte +106 -0
  44. package/dist/components/docs/DocMetadata.svelte.d.ts +18 -0
  45. package/dist/components/docs/DocNavigation.svelte +56 -0
  46. package/dist/components/docs/DocNavigation.svelte.d.ts +12 -0
  47. package/dist/components/docs/DocTags.svelte +22 -0
  48. package/dist/components/docs/DocTags.svelte.d.ts +6 -0
  49. package/dist/components/docs/DraftBadge.svelte +10 -0
  50. package/dist/components/docs/DraftBadge.svelte.d.ts +18 -0
  51. package/dist/components/docs/Footer.svelte +72 -0
  52. package/dist/components/docs/Footer.svelte.d.ts +7 -0
  53. package/dist/components/docs/Frame.svelte +27 -0
  54. package/dist/components/docs/Frame.svelte.d.ts +9 -0
  55. package/dist/components/docs/Header.svelte +123 -0
  56. package/dist/components/docs/Header.svelte.d.ts +9 -0
  57. package/dist/components/docs/HeaderWithMenu.svelte +34 -0
  58. package/dist/components/docs/HeaderWithMenu.svelte.d.ts +17 -0
  59. package/dist/components/docs/HotReloadIndicator.svelte +44 -0
  60. package/dist/components/docs/HotReloadIndicator.svelte.d.ts +3 -0
  61. package/dist/components/docs/Icon.svelte +103 -0
  62. package/dist/components/docs/Icon.svelte.d.ts +11 -0
  63. package/dist/components/docs/Image.svelte +88 -0
  64. package/dist/components/docs/Image.svelte.d.ts +11 -0
  65. package/dist/components/docs/ImageCard.svelte +91 -0
  66. package/dist/components/docs/ImageCard.svelte.d.ts +12 -0
  67. package/dist/components/docs/ImageCardGrid.svelte +25 -0
  68. package/dist/components/docs/ImageCardGrid.svelte.d.ts +8 -0
  69. package/dist/components/docs/LayoutProviders.svelte +57 -0
  70. package/dist/components/docs/LayoutProviders.svelte.d.ts +9 -0
  71. package/dist/components/docs/Logo.svelte +25 -0
  72. package/dist/components/docs/Logo.svelte.d.ts +11 -0
  73. package/dist/components/docs/Math.svelte +54 -0
  74. package/dist/components/docs/Math.svelte.d.ts +7 -0
  75. package/dist/components/docs/MdxContent.svelte +41 -0
  76. package/dist/components/docs/MdxHotReload.svelte +78 -0
  77. package/dist/components/docs/MdxHotReload.svelte.d.ts +9 -0
  78. package/dist/components/docs/MdxLayout.svelte +16 -0
  79. package/dist/components/docs/MdxLayout.svelte.d.ts +6 -0
  80. package/dist/components/docs/Mermaid.svelte +88 -0
  81. package/dist/components/docs/Mermaid.svelte.d.ts +7 -0
  82. package/dist/components/docs/MobileDocLayout.svelte +211 -0
  83. package/dist/components/docs/MobileDocLayout.svelte.d.ts +35 -0
  84. package/dist/components/docs/MobileSidebar.svelte +122 -0
  85. package/dist/components/docs/MobileSidebar.svelte.d.ts +31 -0
  86. package/dist/components/docs/MobileSidebarWrapper.svelte +122 -0
  87. package/dist/components/docs/MobileSidebarWrapper.svelte.d.ts +32 -0
  88. package/dist/components/docs/NotFoundContent.svelte +40 -0
  89. package/dist/components/docs/NotFoundContent.svelte.d.ts +6 -0
  90. package/dist/components/docs/SearchHighlight.svelte +116 -0
  91. package/dist/components/docs/SearchHighlight.svelte.d.ts +3 -0
  92. package/dist/components/docs/SearchModal.svelte +239 -0
  93. package/dist/components/docs/SearchModal.svelte.d.ts +9 -0
  94. package/dist/components/docs/Sidebar.svelte +69 -0
  95. package/dist/components/docs/Sidebar.svelte.d.ts +31 -0
  96. package/dist/components/docs/SidebarMenuItems.svelte +344 -0
  97. package/dist/components/docs/SidebarMenuItems.svelte.d.ts +33 -0
  98. package/dist/components/docs/SidebarSkeleton.svelte +50 -0
  99. package/dist/components/docs/SidebarSkeleton.svelte.d.ts +18 -0
  100. package/dist/components/docs/SiteBanner.svelte +92 -0
  101. package/dist/components/docs/SiteBanner.svelte.d.ts +7 -0
  102. package/dist/components/docs/Step.svelte +44 -0
  103. package/dist/components/docs/Step.svelte.d.ts +8 -0
  104. package/dist/components/docs/Steps.svelte +15 -0
  105. package/dist/components/docs/Steps.svelte.d.ts +7 -0
  106. package/dist/components/docs/Tab.svelte +40 -0
  107. package/dist/components/docs/Tab.svelte.d.ts +8 -0
  108. package/dist/components/docs/TabGroups.svelte +183 -0
  109. package/dist/components/docs/TabGroups.svelte.d.ts +25 -0
  110. package/dist/components/docs/TableOfContents.svelte +100 -0
  111. package/dist/components/docs/TableOfContents.svelte.d.ts +9 -0
  112. package/dist/components/docs/Tabs.svelte +69 -0
  113. package/dist/components/docs/Tabs.svelte.d.ts +8 -0
  114. package/dist/components/docs/ThemeToggle.svelte +16 -0
  115. package/dist/components/docs/ThemeToggle.svelte.d.ts +18 -0
  116. package/dist/components/docs/Tooltip.svelte +44 -0
  117. package/dist/components/docs/Tooltip.svelte.d.ts +10 -0
  118. package/dist/components/docs/VersionSwitcher.svelte +95 -0
  119. package/dist/components/docs/VersionSwitcher.svelte.d.ts +7 -0
  120. package/dist/components/docs/Video.svelte +84 -0
  121. package/dist/components/docs/Video.svelte.d.ts +12 -0
  122. package/dist/components/docs/api/ApiEndpoint.svelte +61 -0
  123. package/dist/components/docs/api/ApiEndpoint.svelte.d.ts +11 -0
  124. package/dist/components/docs/api/ApiParams.svelte +80 -0
  125. package/dist/components/docs/api/ApiParams.svelte.d.ts +14 -0
  126. package/dist/components/docs/api/ApiPlayground.svelte +259 -0
  127. package/dist/components/docs/api/ApiPlayground.svelte.d.ts +16 -0
  128. package/dist/components/docs/api/ApiReference.svelte +278 -0
  129. package/dist/components/docs/api/ApiReference.svelte.d.ts +23 -0
  130. package/dist/components/docs/api/ApiResponse.svelte +66 -0
  131. package/dist/components/docs/api/ApiResponse.svelte.d.ts +9 -0
  132. package/dist/components/docs/api/index.d.ts +5 -0
  133. package/dist/components/docs/api/index.js +5 -0
  134. package/dist/components/docs/componentTextProps.d.ts +3 -0
  135. package/dist/components/docs/componentTextProps.js +61 -0
  136. package/dist/components/docs/index.d.ts +54 -0
  137. package/dist/components/docs/index.js +56 -0
  138. package/dist/components/global/VersionNotFound.svelte +48 -0
  139. package/dist/components/global/VersionNotFound.svelte.d.ts +7 -0
  140. package/dist/components/global/index.d.ts +1 -0
  141. package/dist/components/global/index.js +1 -0
  142. package/dist/components/index.d.ts +6 -822
  143. package/dist/components/index.js +11 -3854
  144. package/dist/components/ui/Badge.svelte +48 -0
  145. package/dist/components/ui/Badge.svelte.d.ts +15 -0
  146. package/dist/components/ui/Button.svelte +58 -0
  147. package/dist/components/ui/Button.svelte.d.ts +17 -0
  148. package/dist/components/ui/Dialog.svelte +16 -0
  149. package/dist/components/ui/Dialog.svelte.d.ts +9 -0
  150. package/dist/components/ui/DialogClose.svelte +16 -0
  151. package/dist/components/ui/DialogClose.svelte.d.ts +9 -0
  152. package/dist/components/ui/DialogContent.svelte +43 -0
  153. package/dist/components/ui/DialogContent.svelte.d.ts +10 -0
  154. package/dist/components/ui/DialogDescription.svelte +21 -0
  155. package/dist/components/ui/DialogDescription.svelte.d.ts +9 -0
  156. package/dist/components/ui/DialogFooter.svelte +20 -0
  157. package/dist/components/ui/DialogFooter.svelte.d.ts +9 -0
  158. package/dist/components/ui/DialogHeader.svelte +20 -0
  159. package/dist/components/ui/DialogHeader.svelte.d.ts +9 -0
  160. package/dist/components/ui/DialogTitle.svelte +21 -0
  161. package/dist/components/ui/DialogTitle.svelte.d.ts +9 -0
  162. package/dist/components/ui/Input.svelte +23 -0
  163. package/dist/components/ui/Input.svelte.d.ts +8 -0
  164. package/dist/components/ui/Textarea.svelte +19 -0
  165. package/dist/components/ui/Textarea.svelte.d.ts +7 -0
  166. package/dist/components/ui/index.d.ts +11 -0
  167. package/dist/components/ui/index.js +11 -0
  168. package/dist/config.d.ts +8 -0
  169. package/dist/config.js +9 -0
  170. package/dist/config.schema.json +471 -0
  171. package/dist/config.server.d.ts +46 -0
  172. package/dist/config.server.js +149 -0
  173. package/dist/{mdx-ColN3Cyg.d.mts → config.types.d.ts} +22 -75
  174. package/dist/config.types.js +39 -0
  175. package/dist/dev-utils.d.ts +29 -0
  176. package/dist/dev-utils.js +63 -0
  177. package/dist/index.d.ts +19 -4
  178. package/dist/index.js +25 -4861
  179. package/dist/mdx-cache.d.ts +41 -0
  180. package/dist/mdx-cache.js +160 -0
  181. package/dist/mdx-components.js +50 -1931
  182. package/dist/mdx-security.d.ts +76 -0
  183. package/dist/mdx-security.js +217 -0
  184. package/dist/mdx.d.ts +73 -0
  185. package/dist/mdx.js +1099 -0
  186. package/dist/middleware/index.d.ts +1 -0
  187. package/dist/middleware/index.js +2 -0
  188. package/dist/middleware/security.d.ts +22 -47
  189. package/dist/middleware/security.js +111 -137
  190. package/dist/parsers/base-parser.d.ts +14 -0
  191. package/dist/parsers/base-parser.js +1 -0
  192. package/dist/parsers/index.d.ts +16 -0
  193. package/dist/parsers/index.js +51 -0
  194. package/dist/parsers/openapi-parser.d.ts +18 -0
  195. package/dist/parsers/openapi-parser.js +209 -0
  196. package/dist/parsers/postman-parser.d.ts +20 -0
  197. package/dist/parsers/postman-parser.js +260 -0
  198. package/dist/parsers/specra-parser.d.ts +10 -0
  199. package/dist/parsers/specra-parser.js +18 -0
  200. package/dist/redirects.d.ts +12 -0
  201. package/dist/redirects.js +30 -0
  202. package/dist/remark-code-meta.d.ts +6 -0
  203. package/dist/remark-code-meta.js +21 -0
  204. package/dist/sidebar-utils.d.ts +59 -0
  205. package/dist/sidebar-utils.js +144 -0
  206. package/dist/stores/config.d.ts +20 -0
  207. package/dist/stores/config.js +45 -0
  208. package/dist/stores/index.d.ts +4 -0
  209. package/dist/stores/index.js +4 -0
  210. package/dist/stores/sidebar.d.ts +7 -0
  211. package/dist/stores/sidebar.js +12 -0
  212. package/dist/stores/tabs.d.ts +6 -0
  213. package/dist/stores/tabs.js +41 -0
  214. package/dist/stores/theme.d.ts +7 -0
  215. package/dist/stores/theme.js +75 -0
  216. package/dist/{styles.css → styles/globals.css} +136 -6
  217. package/dist/toc.d.ts +9 -0
  218. package/dist/toc.js +15 -0
  219. package/dist/utils.d.ts +13 -0
  220. package/dist/utils.js +30 -0
  221. package/package.json +47 -90
  222. package/dist/app/api/mdx-watch/route.d.mts +0 -10
  223. package/dist/app/api/mdx-watch/route.d.ts +0 -10
  224. package/dist/app/api/mdx-watch/route.js +0 -118
  225. package/dist/app/api/mdx-watch/route.js.map +0 -1
  226. package/dist/app/api/mdx-watch/route.mjs +0 -91
  227. package/dist/app/api/mdx-watch/route.mjs.map +0 -1
  228. package/dist/chunk-6S3EJVEO.mjs +0 -259
  229. package/dist/chunk-6S3EJVEO.mjs.map +0 -1
  230. package/dist/chunk-BE7EROIW.mjs +0 -212
  231. package/dist/chunk-BE7EROIW.mjs.map +0 -1
  232. package/dist/chunk-CWHRZHZO.mjs +0 -168
  233. package/dist/chunk-CWHRZHZO.mjs.map +0 -1
  234. package/dist/chunk-D5VDVYFY.mjs +0 -1325
  235. package/dist/chunk-D5VDVYFY.mjs.map +0 -1
  236. package/dist/chunk-WMCO2UX5.mjs +0 -585
  237. package/dist/chunk-WMCO2UX5.mjs.map +0 -1
  238. package/dist/chunk-XEMGCPZZ.mjs +0 -475
  239. package/dist/chunk-XEMGCPZZ.mjs.map +0 -1
  240. package/dist/components/index.d.mts +0 -822
  241. package/dist/components/index.js.map +0 -1
  242. package/dist/components/index.mjs +0 -3741
  243. package/dist/components/index.mjs.map +0 -1
  244. package/dist/index.d.mts +0 -4
  245. package/dist/index.js.map +0 -1
  246. package/dist/index.mjs +0 -1897
  247. package/dist/index.mjs.map +0 -1
  248. package/dist/layouts/index.d.mts +0 -34
  249. package/dist/layouts/index.d.ts +0 -34
  250. package/dist/layouts/index.js +0 -453
  251. package/dist/layouts/index.js.map +0 -1
  252. package/dist/layouts/index.mjs +0 -173
  253. package/dist/layouts/index.mjs.map +0 -1
  254. package/dist/lib/index.d.mts +0 -583
  255. package/dist/lib/index.d.ts +0 -583
  256. package/dist/lib/index.js +0 -1595
  257. package/dist/lib/index.js.map +0 -1
  258. package/dist/lib/index.mjs +0 -111
  259. package/dist/lib/index.mjs.map +0 -1
  260. package/dist/mdx-ColN3Cyg.d.ts +0 -352
  261. package/dist/mdx-components.d.mts +0 -86
  262. package/dist/mdx-components.d.ts +0 -86
  263. package/dist/mdx-components.js.map +0 -1
  264. package/dist/mdx-components.mjs +0 -206
  265. package/dist/mdx-components.mjs.map +0 -1
  266. package/dist/middleware/security.d.mts +0 -82
  267. package/dist/middleware/security.js.map +0 -1
  268. package/dist/middleware/security.mjs +0 -84
  269. package/dist/middleware/security.mjs.map +0 -1
  270. package/dist/styles.css.map +0 -1
  271. package/dist/styles.d.mts +0 -2
  272. package/dist/styles.d.ts +0 -2
  273. package/dist/styles.js +0 -2
  274. package/dist/styles.js.map +0 -1
  275. package/dist/styles.mjs +0 -1
  276. package/dist/styles.mjs.map +0 -1
@@ -1,475 +0,0 @@
1
- // src/lib/parsers/specra-parser.ts
2
- var SpecraParser = class {
3
- validate(input) {
4
- return typeof input === "object" && input !== null && "endpoints" in input && Array.isArray(input.endpoints);
5
- }
6
- parse(input) {
7
- if (!this.validate(input)) {
8
- throw new Error("Invalid Specra API spec format");
9
- }
10
- return input;
11
- }
12
- };
13
-
14
- // src/lib/parsers/openapi-parser.ts
15
- var OpenApiParser = class {
16
- validate(input) {
17
- return typeof input === "object" && input !== null && ("openapi" in input || "swagger" in input) && "paths" in input;
18
- }
19
- parse(input) {
20
- if (!this.validate(input)) {
21
- throw new Error("Invalid OpenAPI spec format");
22
- }
23
- const baseUrl = this.extractBaseUrl(input);
24
- const endpoints = [];
25
- for (const [path, pathItem] of Object.entries(input.paths || {})) {
26
- const methods = ["get", "post", "put", "patch", "delete"];
27
- for (const method of methods) {
28
- const operation = pathItem[method];
29
- if (!operation) continue;
30
- const endpoint = this.parseOperation(path, method.toUpperCase(), operation, input);
31
- endpoints.push(endpoint);
32
- }
33
- }
34
- return {
35
- version: input.info?.version,
36
- title: input.info?.title,
37
- description: input.info?.description,
38
- baseUrl,
39
- auth: this.extractAuth(input),
40
- endpoints
41
- };
42
- }
43
- extractBaseUrl(spec) {
44
- if (spec.servers && spec.servers.length > 0) {
45
- return spec.servers[0].url;
46
- }
47
- if (spec.host) {
48
- const scheme = spec.schemes?.[0] || "https";
49
- const basePath = spec.basePath || "";
50
- return `${scheme}://${spec.host}${basePath}`;
51
- }
52
- return "";
53
- }
54
- extractAuth(spec) {
55
- const securitySchemes = spec.components?.securitySchemes || spec.securityDefinitions;
56
- if (!securitySchemes) return void 0;
57
- const firstScheme = Object.values(securitySchemes)[0];
58
- if (!firstScheme) return void 0;
59
- if (firstScheme.type === "http" && firstScheme.scheme === "bearer") {
60
- return {
61
- type: "bearer",
62
- description: firstScheme.description,
63
- tokenPrefix: "Bearer"
64
- };
65
- }
66
- if (firstScheme.type === "apiKey") {
67
- return {
68
- type: "apiKey",
69
- description: firstScheme.description,
70
- headerName: firstScheme.name || "X-API-Key"
71
- };
72
- }
73
- if (firstScheme.type === "http" && firstScheme.scheme === "basic") {
74
- return {
75
- type: "basic",
76
- description: firstScheme.description
77
- };
78
- }
79
- return void 0;
80
- }
81
- parseOperation(path, method, operation, spec) {
82
- const endpoint = {
83
- title: operation.summary || operation.operationId || `${method} ${path}`,
84
- method,
85
- path: this.convertPathParams(path),
86
- description: operation.description
87
- };
88
- const params = this.parseParameters(operation.parameters || [], spec);
89
- if (params.path.length > 0) endpoint.pathParams = params.path;
90
- if (params.query.length > 0) endpoint.queryParams = params.query;
91
- if (params.header.length > 0) {
92
- endpoint.headers = params.header.map((p) => ({
93
- name: p.name,
94
- value: p.example || "",
95
- description: p.description
96
- }));
97
- }
98
- if (operation.requestBody) {
99
- endpoint.body = this.parseRequestBody(operation.requestBody, spec);
100
- }
101
- const responses = this.parseResponses(operation.responses || {}, spec);
102
- if (responses.success) endpoint.successResponse = responses.success;
103
- if (responses.errors.length > 0) endpoint.errorResponses = responses.errors;
104
- return endpoint;
105
- }
106
- convertPathParams(path) {
107
- return path.replace(/\{([^}]+)\}/g, ":$1");
108
- }
109
- parseParameters(parameters, spec) {
110
- const result = { path: [], query: [], header: [] };
111
- for (const param of parameters) {
112
- const resolved = param.$ref ? this.resolveRef(param.$ref, spec) : param;
113
- const apiParam = {
114
- name: resolved.name,
115
- type: resolved.schema?.type || resolved.type || "string",
116
- required: resolved.required,
117
- description: resolved.description,
118
- example: resolved.example || resolved.schema?.example
119
- };
120
- if (resolved.in === "path") result.path.push(apiParam);
121
- else if (resolved.in === "query") result.query.push(apiParam);
122
- else if (resolved.in === "header") result.header.push(apiParam);
123
- }
124
- return result;
125
- }
126
- parseRequestBody(requestBody, spec) {
127
- const content = requestBody.content?.["application/json"];
128
- if (!content) return void 0;
129
- return {
130
- description: requestBody.description,
131
- example: content.example || this.generateExample(content.schema, spec),
132
- schema: content.schema
133
- };
134
- }
135
- parseResponses(responses, spec) {
136
- const result = { errors: [] };
137
- for (const [statusCode, response] of Object.entries(responses)) {
138
- const status = parseInt(statusCode);
139
- if (isNaN(status)) continue;
140
- const resolved = response.$ref ? this.resolveRef(response.$ref, spec) : response;
141
- const content = resolved.content?.["application/json"];
142
- const apiResponse = {
143
- status,
144
- description: resolved.description,
145
- example: content?.example || this.generateExample(content?.schema, spec),
146
- schema: content?.schema
147
- };
148
- if (status >= 200 && status < 300) {
149
- result.success = apiResponse;
150
- } else {
151
- result.errors.push(apiResponse);
152
- }
153
- }
154
- return result;
155
- }
156
- generateExample(schema, spec) {
157
- if (!schema) return void 0;
158
- if (schema.$ref) schema = this.resolveRef(schema.$ref, spec);
159
- if (schema.example) return schema.example;
160
- if (schema.type === "object" && schema.properties) {
161
- const example = {};
162
- for (const [key, prop] of Object.entries(schema.properties)) {
163
- example[key] = this.generateExample(prop, spec);
164
- }
165
- return example;
166
- }
167
- if (schema.type === "array" && schema.items) {
168
- return [this.generateExample(schema.items, spec)];
169
- }
170
- const defaults = {
171
- string: "string",
172
- number: 0,
173
- integer: 0,
174
- boolean: false,
175
- object: {},
176
- array: []
177
- };
178
- return defaults[schema.type] || null;
179
- }
180
- resolveRef(ref, spec) {
181
- const path = ref.replace(/^#\//, "").split("/");
182
- let current = spec;
183
- for (const segment of path) {
184
- current = current[segment];
185
- if (!current) return {};
186
- }
187
- return current;
188
- }
189
- };
190
-
191
- // src/lib/parsers/postman-parser.ts
192
- var PostmanParser = class {
193
- validate(input) {
194
- return typeof input === "object" && input !== null && "info" in input && input.info?.schema?.includes("v2");
195
- }
196
- parse(input) {
197
- if (!this.validate(input)) {
198
- throw new Error("Invalid Postman Collection format (requires v2.0 or v2.1)");
199
- }
200
- const baseUrl = this.extractBaseUrl(input);
201
- const endpoints = [];
202
- this.parseItems(input.item || [], endpoints, baseUrl, input);
203
- return {
204
- version: input.info?.version,
205
- title: input.info?.name,
206
- description: input.info?.description,
207
- baseUrl,
208
- auth: this.extractAuth(input.auth),
209
- globalHeaders: this.extractGlobalHeaders(input),
210
- endpoints
211
- };
212
- }
213
- extractBaseUrl(collection) {
214
- const baseUrlVar = collection.variable?.find(
215
- (v) => v.key === "baseUrl" || v.key === "base_url" || v.key === "url"
216
- );
217
- if (baseUrlVar) return baseUrlVar.value;
218
- if (collection.item && collection.item.length > 0) {
219
- const firstRequest = this.findFirstRequest(collection.item);
220
- if (firstRequest?.request?.url) {
221
- const url = this.parseUrl(firstRequest.request.url);
222
- if (url.host) {
223
- return `${url.protocol}://${url.host.join(".")}`;
224
- }
225
- }
226
- }
227
- return "";
228
- }
229
- findFirstRequest(items) {
230
- for (const item of items) {
231
- if (item.request) return item;
232
- if (item.item) {
233
- const found = this.findFirstRequest(item.item);
234
- if (found) return found;
235
- }
236
- }
237
- return null;
238
- }
239
- extractAuth(auth) {
240
- if (!auth) return void 0;
241
- if (auth.type === "bearer") {
242
- return {
243
- type: "bearer",
244
- tokenPrefix: "Bearer"
245
- };
246
- }
247
- if (auth.type === "apikey") {
248
- const keyData = auth.apikey?.find((a) => a.key === "key");
249
- const keyName = keyData?.value || "X-API-Key";
250
- return {
251
- type: "apiKey",
252
- headerName: keyName
253
- };
254
- }
255
- if (auth.type === "basic") {
256
- return {
257
- type: "basic"
258
- };
259
- }
260
- return void 0;
261
- }
262
- extractGlobalHeaders(collection) {
263
- return [];
264
- }
265
- parseItems(items, endpoints, baseUrl, collection) {
266
- for (const item of items) {
267
- if (item.item && Array.isArray(item.item)) {
268
- this.parseItems(item.item, endpoints, baseUrl, collection);
269
- } else if (item.request) {
270
- const endpoint = this.parseRequest(item, baseUrl, collection);
271
- endpoints.push(endpoint);
272
- }
273
- }
274
- }
275
- parseRequest(item, baseUrl, collection) {
276
- const request = item.request;
277
- const url = this.parseUrl(request.url);
278
- const endpoint = {
279
- title: item.name,
280
- method: request.method.toUpperCase(),
281
- path: this.buildPath(url, baseUrl),
282
- description: item.request.description || item.description
283
- };
284
- const params = this.parseUrlParams(url);
285
- if (params.path.length > 0) endpoint.pathParams = params.path;
286
- if (params.query.length > 0) endpoint.queryParams = params.query;
287
- if (request.header && request.header.length > 0) {
288
- endpoint.headers = request.header.filter((h) => !h.disabled).map((h) => ({
289
- name: h.key,
290
- value: h.value || "",
291
- description: h.description
292
- }));
293
- }
294
- if (request.body) {
295
- endpoint.body = this.parseBody(request.body);
296
- }
297
- const responses = this.parseResponses(item.response || []);
298
- if (responses.success) endpoint.successResponse = responses.success;
299
- if (responses.errors.length > 0) endpoint.errorResponses = responses.errors;
300
- return endpoint;
301
- }
302
- parseUrl(url) {
303
- if (typeof url === "string") {
304
- const urlObj = new URL(url);
305
- return {
306
- protocol: urlObj.protocol.replace(":", ""),
307
- host: urlObj.hostname.split("."),
308
- path: urlObj.pathname.split("/").filter(Boolean),
309
- query: [],
310
- variable: []
311
- };
312
- }
313
- return {
314
- protocol: url.protocol || "https",
315
- host: url.host || [],
316
- path: url.path || [],
317
- query: url.query || [],
318
- variable: url.variable || []
319
- };
320
- }
321
- buildPath(url, baseUrl) {
322
- let path = "/";
323
- if (url.path && url.path.length > 0) {
324
- path += url.path.join("/");
325
- }
326
- path = path.replace(/\{\{([^}]+)\}\}/g, ":$1");
327
- return path;
328
- }
329
- parseUrlParams(url) {
330
- const result = { path: [], query: [] };
331
- if (url.variable && url.variable.length > 0) {
332
- for (const v of url.variable) {
333
- result.path.push({
334
- name: v.key,
335
- type: v.type || "string",
336
- description: v.description,
337
- example: v.value
338
- });
339
- }
340
- }
341
- if (url.path && url.path.length > 0) {
342
- for (const segment of url.path) {
343
- if (segment.startsWith(":")) {
344
- const paramName = segment.slice(1);
345
- if (!result.path.find((p) => p.name === paramName)) {
346
- result.path.push({
347
- name: paramName,
348
- type: "string"
349
- });
350
- }
351
- }
352
- }
353
- }
354
- if (url.query && url.query.length > 0) {
355
- for (const q of url.query) {
356
- if (q.disabled) continue;
357
- result.query.push({
358
- name: q.key,
359
- type: "string",
360
- description: q.description,
361
- example: q.value
362
- });
363
- }
364
- }
365
- return result;
366
- }
367
- parseBody(body) {
368
- if (!body) return void 0;
369
- let example;
370
- let description = body.description;
371
- if (body.mode === "raw") {
372
- try {
373
- example = JSON.parse(body.raw);
374
- } catch {
375
- example = body.raw;
376
- }
377
- } else if (body.mode === "formdata" || body.mode === "urlencoded") {
378
- example = {};
379
- for (const item of body[body.mode] || []) {
380
- if (!item.disabled) {
381
- example[item.key] = item.value;
382
- }
383
- }
384
- }
385
- return {
386
- description,
387
- example
388
- };
389
- }
390
- parseResponses(responses) {
391
- const result = { errors: [] };
392
- for (const response of responses) {
393
- let example;
394
- try {
395
- example = JSON.parse(response.body);
396
- } catch {
397
- example = response.body;
398
- }
399
- const apiResponse = {
400
- status: response.code || 200,
401
- description: response.name,
402
- example
403
- };
404
- if (apiResponse.status >= 200 && apiResponse.status < 300) {
405
- if (!result.success) result.success = apiResponse;
406
- } else {
407
- result.errors.push(apiResponse);
408
- }
409
- }
410
- return result;
411
- }
412
- };
413
-
414
- // src/lib/parsers/index.ts
415
- var parsers = /* @__PURE__ */ new Map([
416
- ["specra", new SpecraParser()],
417
- ["openapi", new OpenApiParser()],
418
- ["postman", new PostmanParser()]
419
- ]);
420
- function detectParserType(input) {
421
- if (!input || typeof input !== "object") {
422
- throw new Error("Invalid API spec: input must be an object");
423
- }
424
- if (input.info?.schema?.includes("v2")) {
425
- return "postman";
426
- }
427
- if (input.openapi || input.swagger) {
428
- return "openapi";
429
- }
430
- if (input.endpoints && Array.isArray(input.endpoints)) {
431
- return "specra";
432
- }
433
- throw new Error(
434
- "Unable to auto-detect API spec format. Supported formats: Specra, OpenAPI 3.x, Postman Collection v2.x"
435
- );
436
- }
437
- function parseApiSpec(input, parserType = "auto") {
438
- const actualType = parserType === "auto" ? detectParserType(input) : parserType;
439
- const parser = parsers.get(actualType);
440
- if (!parser) {
441
- throw new Error(`Unknown parser type: ${actualType}`);
442
- }
443
- if (!parser.validate(input)) {
444
- throw new Error(`Input does not match ${actualType} format`);
445
- }
446
- return parser.parse(input);
447
- }
448
-
449
- // src/lib/utils.ts
450
- import { clsx } from "clsx";
451
- import { twMerge } from "tailwind-merge";
452
- function cn(...inputs) {
453
- return twMerge(clsx(inputs));
454
- }
455
- function getAssetPath(path) {
456
- const basePath = process.env.NEXT_PUBLIC_BASE_PATH || process.env.__NEXT_ROUTER_BASEPATH || "";
457
- const normalizedPath = path.startsWith("/") ? path : `/${path}`;
458
- if (basePath) {
459
- const normalizedBase = basePath.startsWith("/") ? basePath : `/${basePath}`;
460
- const cleanBase = normalizedBase.replace(/\/$/, "");
461
- return `${cleanBase}${normalizedPath}`;
462
- }
463
- return normalizedPath;
464
- }
465
-
466
- export {
467
- SpecraParser,
468
- OpenApiParser,
469
- PostmanParser,
470
- detectParserType,
471
- parseApiSpec,
472
- cn,
473
- getAssetPath
474
- };
475
- //# sourceMappingURL=chunk-XEMGCPZZ.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/lib/parsers/specra-parser.ts","../src/lib/parsers/openapi-parser.ts","../src/lib/parsers/postman-parser.ts","../src/lib/parsers/index.ts","../src/lib/utils.ts"],"sourcesContent":["import type { SpecraApiSpec } from \"../api-parser.types\"\nimport type { ApiSpecParser } from \"./base-parser\"\n\n/**\n * Parser for native Specra API format\n * This is a pass-through parser since the input is already in the correct format\n */\nexport class SpecraParser implements ApiSpecParser {\n validate(input: any): boolean {\n return (\n typeof input === \"object\" &&\n input !== null &&\n \"endpoints\" in input &&\n Array.isArray(input.endpoints)\n )\n }\n\n parse(input: any): SpecraApiSpec {\n if (!this.validate(input)) {\n throw new Error(\"Invalid Specra API spec format\")\n }\n return input as SpecraApiSpec\n }\n}\n","import type { SpecraApiSpec, ApiEndpointSpec, ApiParam, ApiResponse } from \"../api-parser.types\"\nimport type { ApiSpecParser } from \"./base-parser\"\n\n/**\n * Parser for OpenAPI 3.0/3.1 specifications\n */\nexport class OpenApiParser implements ApiSpecParser {\n validate(input: any): boolean {\n return (\n typeof input === \"object\" &&\n input !== null &&\n (\"openapi\" in input || \"swagger\" in input) &&\n \"paths\" in input\n )\n }\n\n parse(input: any): SpecraApiSpec {\n if (!this.validate(input)) {\n throw new Error(\"Invalid OpenAPI spec format\")\n }\n\n const baseUrl = this.extractBaseUrl(input)\n const endpoints: ApiEndpointSpec[] = []\n\n // Parse paths\n for (const [path, pathItem] of Object.entries(input.paths || {})) {\n const methods = [\"get\", \"post\", \"put\", \"patch\", \"delete\"] as const\n\n for (const method of methods) {\n const operation = (pathItem as any)[method]\n if (!operation) continue\n\n const endpoint = this.parseOperation(path, method.toUpperCase() as any, operation, input)\n endpoints.push(endpoint)\n }\n }\n\n return {\n version: input.info?.version,\n title: input.info?.title,\n description: input.info?.description,\n baseUrl,\n auth: this.extractAuth(input),\n endpoints,\n }\n }\n\n private extractBaseUrl(spec: any): string {\n // OpenAPI 3.x servers\n if (spec.servers && spec.servers.length > 0) {\n return spec.servers[0].url\n }\n\n // Swagger 2.0\n if (spec.host) {\n const scheme = spec.schemes?.[0] || \"https\"\n const basePath = spec.basePath || \"\"\n return `${scheme}://${spec.host}${basePath}`\n }\n\n return \"\"\n }\n\n private extractAuth(spec: any): SpecraApiSpec[\"auth\"] {\n const securitySchemes = spec.components?.securitySchemes || spec.securityDefinitions\n\n if (!securitySchemes) return undefined\n\n // Get the first security scheme\n const firstScheme = Object.values(securitySchemes)[0] as any\n if (!firstScheme) return undefined\n\n if (firstScheme.type === \"http\" && firstScheme.scheme === \"bearer\") {\n return {\n type: \"bearer\",\n description: firstScheme.description,\n tokenPrefix: \"Bearer\",\n }\n }\n\n if (firstScheme.type === \"apiKey\") {\n return {\n type: \"apiKey\",\n description: firstScheme.description,\n headerName: firstScheme.name || \"X-API-Key\",\n }\n }\n\n if (firstScheme.type === \"http\" && firstScheme.scheme === \"basic\") {\n return {\n type: \"basic\",\n description: firstScheme.description,\n }\n }\n\n return undefined\n }\n\n private parseOperation(\n path: string,\n method: \"GET\" | \"POST\" | \"PUT\" | \"PATCH\" | \"DELETE\",\n operation: any,\n spec: any\n ): ApiEndpointSpec {\n const endpoint: ApiEndpointSpec = {\n title: operation.summary || operation.operationId || `${method} ${path}`,\n method,\n path: this.convertPathParams(path),\n description: operation.description,\n }\n\n // Parse parameters\n const params = this.parseParameters(operation.parameters || [], spec)\n if (params.path.length > 0) endpoint.pathParams = params.path\n if (params.query.length > 0) endpoint.queryParams = params.query\n if (params.header.length > 0) {\n endpoint.headers = params.header.map((p) => ({\n name: p.name,\n value: p.example || \"\",\n description: p.description,\n }))\n }\n\n // Parse request body\n if (operation.requestBody) {\n endpoint.body = this.parseRequestBody(operation.requestBody, spec)\n }\n\n // Parse responses\n const responses = this.parseResponses(operation.responses || {}, spec)\n if (responses.success) endpoint.successResponse = responses.success\n if (responses.errors.length > 0) endpoint.errorResponses = responses.errors\n\n return endpoint\n }\n\n private convertPathParams(path: string): string {\n // Convert OpenAPI {param} to :param\n return path.replace(/\\{([^}]+)\\}/g, \":$1\")\n }\n\n private parseParameters(\n parameters: any[],\n spec: any\n ): { path: ApiParam[]; query: ApiParam[]; header: ApiParam[] } {\n const result = { path: [] as ApiParam[], query: [] as ApiParam[], header: [] as ApiParam[] }\n\n for (const param of parameters) {\n // Resolve $ref if present\n const resolved = param.$ref ? this.resolveRef(param.$ref, spec) : param\n\n const apiParam: ApiParam = {\n name: resolved.name,\n type: resolved.schema?.type || resolved.type || \"string\",\n required: resolved.required,\n description: resolved.description,\n example: resolved.example || resolved.schema?.example,\n }\n\n if (resolved.in === \"path\") result.path.push(apiParam)\n else if (resolved.in === \"query\") result.query.push(apiParam)\n else if (resolved.in === \"header\") result.header.push(apiParam)\n }\n\n return result\n }\n\n private parseRequestBody(requestBody: any, spec: any): ApiEndpointSpec[\"body\"] {\n const content = requestBody.content?.[\"application/json\"]\n if (!content) return undefined\n\n return {\n description: requestBody.description,\n example: content.example || this.generateExample(content.schema, spec),\n schema: content.schema,\n }\n }\n\n private parseResponses(\n responses: any,\n spec: any\n ): { success?: ApiResponse; errors: ApiResponse[] } {\n const result: { success?: ApiResponse; errors: ApiResponse[] } = { errors: [] }\n\n for (const [statusCode, response] of Object.entries(responses)) {\n const status = parseInt(statusCode)\n if (isNaN(status)) continue\n\n const resolved = (response as any).$ref ? this.resolveRef((response as any).$ref, spec) : response\n const content = (resolved as any).content?.[\"application/json\"]\n\n const apiResponse: ApiResponse = {\n status,\n description: (resolved as any).description,\n example: content?.example || this.generateExample(content?.schema, spec),\n schema: content?.schema,\n }\n\n if (status >= 200 && status < 300) {\n result.success = apiResponse\n } else {\n result.errors.push(apiResponse)\n }\n }\n\n return result\n }\n\n private generateExample(schema: any, spec: any): any {\n if (!schema) return undefined\n if (schema.$ref) schema = this.resolveRef(schema.$ref, spec)\n if (schema.example) return schema.example\n\n // Simple example generation based on schema type\n if (schema.type === \"object\" && schema.properties) {\n const example: any = {}\n for (const [key, prop] of Object.entries(schema.properties)) {\n example[key] = this.generateExample(prop, spec)\n }\n return example\n }\n\n if (schema.type === \"array\" && schema.items) {\n return [this.generateExample(schema.items, spec)]\n }\n\n // Default values by type\n const defaults: any = {\n string: \"string\",\n number: 0,\n integer: 0,\n boolean: false,\n object: {},\n array: [],\n }\n\n return defaults[schema.type] || null\n }\n\n private resolveRef(ref: string, spec: any): any {\n const path = ref.replace(/^#\\//, \"\").split(\"/\")\n let current = spec\n\n for (const segment of path) {\n current = current[segment]\n if (!current) return {}\n }\n\n return current\n }\n}\n","import type { SpecraApiSpec, ApiEndpointSpec, ApiParam, ApiHeader } from \"../api-parser.types\"\nimport type { ApiSpecParser } from \"./base-parser\"\n\n/**\n * Parser for Postman Collection v2.0/v2.1\n */\nexport class PostmanParser implements ApiSpecParser {\n validate(input: any): boolean {\n return (\n typeof input === \"object\" &&\n input !== null &&\n \"info\" in input &&\n input.info?.schema?.includes(\"v2\")\n )\n }\n\n parse(input: any): SpecraApiSpec {\n if (!this.validate(input)) {\n throw new Error(\"Invalid Postman Collection format (requires v2.0 or v2.1)\")\n }\n\n const baseUrl = this.extractBaseUrl(input)\n const endpoints: ApiEndpointSpec[] = []\n\n // Parse items (can be nested in folders)\n this.parseItems(input.item || [], endpoints, baseUrl, input)\n\n return {\n version: input.info?.version,\n title: input.info?.name,\n description: input.info?.description,\n baseUrl,\n auth: this.extractAuth(input.auth),\n globalHeaders: this.extractGlobalHeaders(input),\n endpoints,\n }\n }\n\n private extractBaseUrl(collection: any): string {\n // Try to get from variables\n const baseUrlVar = collection.variable?.find(\n (v: any) => v.key === \"baseUrl\" || v.key === \"base_url\" || v.key === \"url\"\n )\n if (baseUrlVar) return baseUrlVar.value\n\n // Try to extract from first request\n if (collection.item && collection.item.length > 0) {\n const firstRequest = this.findFirstRequest(collection.item)\n if (firstRequest?.request?.url) {\n const url = this.parseUrl(firstRequest.request.url)\n if (url.host) {\n return `${url.protocol}://${url.host.join(\".\")}`\n }\n }\n }\n\n return \"\"\n }\n\n private findFirstRequest(items: any[]): any {\n for (const item of items) {\n if (item.request) return item\n if (item.item) {\n const found = this.findFirstRequest(item.item)\n if (found) return found\n }\n }\n return null\n }\n\n private extractAuth(auth: any): SpecraApiSpec[\"auth\"] {\n if (!auth) return undefined\n\n if (auth.type === \"bearer\") {\n return {\n type: \"bearer\",\n tokenPrefix: \"Bearer\",\n }\n }\n\n if (auth.type === \"apikey\") {\n const keyData = auth.apikey?.find((a: any) => a.key === \"key\")\n const keyName = keyData?.value || \"X-API-Key\"\n\n return {\n type: \"apiKey\",\n headerName: keyName,\n }\n }\n\n if (auth.type === \"basic\") {\n return {\n type: \"basic\",\n }\n }\n\n return undefined\n }\n\n private extractGlobalHeaders(collection: any): ApiHeader[] {\n // Postman doesn't have global headers in the same way, but we can check for common patterns\n return []\n }\n\n private parseItems(items: any[], endpoints: ApiEndpointSpec[], baseUrl: string, collection: any) {\n for (const item of items) {\n // If it's a folder, recurse\n if (item.item && Array.isArray(item.item)) {\n this.parseItems(item.item, endpoints, baseUrl, collection)\n }\n // If it's a request\n else if (item.request) {\n const endpoint = this.parseRequest(item, baseUrl, collection)\n endpoints.push(endpoint)\n }\n }\n }\n\n private parseRequest(item: any, baseUrl: string, collection: any): ApiEndpointSpec {\n const request = item.request\n const url = this.parseUrl(request.url)\n\n const endpoint: ApiEndpointSpec = {\n title: item.name,\n method: request.method.toUpperCase(),\n path: this.buildPath(url, baseUrl),\n description: item.request.description || item.description,\n }\n\n // Parse URL parameters (path and query)\n const params = this.parseUrlParams(url)\n if (params.path.length > 0) endpoint.pathParams = params.path\n if (params.query.length > 0) endpoint.queryParams = params.query\n\n // Parse headers\n if (request.header && request.header.length > 0) {\n endpoint.headers = request.header\n .filter((h: any) => !h.disabled)\n .map((h: any) => ({\n name: h.key,\n value: h.value || \"\",\n description: h.description,\n }))\n }\n\n // Parse request body\n if (request.body) {\n endpoint.body = this.parseBody(request.body)\n }\n\n // Parse response examples\n const responses = this.parseResponses(item.response || [])\n if (responses.success) endpoint.successResponse = responses.success\n if (responses.errors.length > 0) endpoint.errorResponses = responses.errors\n\n return endpoint\n }\n\n private parseUrl(url: any): {\n protocol: string\n host: string[]\n path: string[]\n query: any[]\n variable: any[]\n } {\n if (typeof url === \"string\") {\n // Parse string URL\n const urlObj = new URL(url)\n return {\n protocol: urlObj.protocol.replace(\":\", \"\"),\n host: urlObj.hostname.split(\".\"),\n path: urlObj.pathname.split(\"/\").filter(Boolean),\n query: [],\n variable: [],\n }\n }\n\n return {\n protocol: url.protocol || \"https\",\n host: url.host || [],\n path: url.path || [],\n query: url.query || [],\n variable: url.variable || [],\n }\n }\n\n private buildPath(url: any, baseUrl: string): string {\n let path = \"/\"\n\n if (url.path && url.path.length > 0) {\n path += url.path.join(\"/\")\n }\n\n // Convert Postman :param to our :param format (they're the same!)\n // But we need to handle {{variable}} syntax\n path = path.replace(/\\{\\{([^}]+)\\}\\}/g, \":$1\")\n\n return path\n }\n\n private parseUrlParams(url: any): { path: ApiParam[]; query: ApiParam[] } {\n const result = { path: [] as ApiParam[], query: [] as ApiParam[] }\n\n // Path parameters from variables\n if (url.variable && url.variable.length > 0) {\n for (const v of url.variable) {\n result.path.push({\n name: v.key,\n type: v.type || \"string\",\n description: v.description,\n example: v.value,\n })\n }\n }\n\n // Extract path params from the path itself\n if (url.path && url.path.length > 0) {\n for (const segment of url.path) {\n if (segment.startsWith(\":\")) {\n const paramName = segment.slice(1)\n // Only add if not already added from variables\n if (!result.path.find((p) => p.name === paramName)) {\n result.path.push({\n name: paramName,\n type: \"string\",\n })\n }\n }\n }\n }\n\n // Query parameters\n if (url.query && url.query.length > 0) {\n for (const q of url.query) {\n if (q.disabled) continue\n result.query.push({\n name: q.key,\n type: \"string\",\n description: q.description,\n example: q.value,\n })\n }\n }\n\n return result\n }\n\n private parseBody(body: any): ApiEndpointSpec[\"body\"] {\n if (!body) return undefined\n\n let example: any\n let description = body.description\n\n if (body.mode === \"raw\") {\n try {\n example = JSON.parse(body.raw)\n } catch {\n example = body.raw\n }\n } else if (body.mode === \"formdata\" || body.mode === \"urlencoded\") {\n example = {}\n for (const item of body[body.mode] || []) {\n if (!item.disabled) {\n example[item.key] = item.value\n }\n }\n }\n\n return {\n description,\n example,\n }\n }\n\n private parseResponses(responses: any[]): { success?: any; errors: any[] } {\n const result: { success?: any; errors: any[] } = { errors: [] }\n\n for (const response of responses) {\n let example: any\n try {\n example = JSON.parse(response.body)\n } catch {\n example = response.body\n }\n\n const apiResponse = {\n status: response.code || 200,\n description: response.name,\n example,\n }\n\n if (apiResponse.status >= 200 && apiResponse.status < 300) {\n if (!result.success) result.success = apiResponse\n } else {\n result.errors.push(apiResponse)\n }\n }\n\n return result\n }\n}\n","import type { SpecraApiSpec } from \"../api-parser.types\"\nimport type { ApiSpecParser } from \"./base-parser\"\nimport { SpecraParser } from \"./specra-parser\"\nimport { OpenApiParser } from \"./openapi-parser\"\nimport { PostmanParser } from \"./postman-parser\"\n\nexport type ParserType = \"auto\" | \"specra\" | \"openapi\" | \"postman\"\n\n/**\n * Registry of all available parsers\n */\nconst parsers: Map<string, ApiSpecParser> = new Map([\n [\"specra\", new SpecraParser()],\n [\"openapi\", new OpenApiParser()],\n [\"postman\", new PostmanParser()],\n])\n\n/**\n * Auto-detect the parser type based on the input structure\n */\nexport function detectParserType(input: any): ParserType {\n if (!input || typeof input !== \"object\") {\n throw new Error(\"Invalid API spec: input must be an object\")\n }\n\n // Check for Postman Collection\n if (input.info?.schema?.includes(\"v2\")) {\n return \"postman\"\n }\n\n // Check for OpenAPI/Swagger\n if (input.openapi || input.swagger) {\n return \"openapi\"\n }\n\n // Check for Specra format\n if (input.endpoints && Array.isArray(input.endpoints)) {\n return \"specra\"\n }\n\n throw new Error(\n \"Unable to auto-detect API spec format. Supported formats: Specra, OpenAPI 3.x, Postman Collection v2.x\"\n )\n}\n\n/**\n * Parse an API spec using the specified or auto-detected parser\n */\nexport function parseApiSpec(input: any, parserType: ParserType = \"auto\"): SpecraApiSpec {\n // Auto-detect if needed\n const actualType = parserType === \"auto\" ? detectParserType(input) : parserType\n\n // Get the parser\n const parser = parsers.get(actualType)\n if (!parser) {\n throw new Error(`Unknown parser type: ${actualType}`)\n }\n\n // Validate and parse\n if (!parser.validate(input)) {\n throw new Error(`Input does not match ${actualType} format`)\n }\n\n return parser.parse(input)\n}\n\n// Export parsers for direct use\nexport { SpecraParser, OpenApiParser, PostmanParser }\nexport type { ApiSpecParser }\n","import { clsx, type ClassValue } from 'clsx'\nimport { twMerge } from 'tailwind-merge'\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}\n\n\n/**\n * Get the correct asset path based on deployment configuration\n * Handles different deployment scenarios:\n * - Vercel/Node.js hosting (standalone build): No basePath needed\n * - GitHub Pages without custom domain: Uses basePath from config\n * - Static hosting with custom domain: No basePath needed\n *\n * @param path - The asset path (can start with or without '/')\n * @returns The properly formatted asset path\n */\nexport function getAssetPath(path: string): string {\n // Get basePath from Next.js config (set during build for static exports)\n const basePath = process.env.NEXT_PUBLIC_BASE_PATH || process.env.__NEXT_ROUTER_BASEPATH || ''\n\n // Normalize the input path: ensure it starts with '/'\n const normalizedPath = path.startsWith('/') ? path : `/${path}`\n\n // If we have a basePath (GitHub Pages without custom domain), prepend it\n if (basePath) {\n // Normalize basePath: remove trailing slash, ensure leading slash\n const normalizedBase = basePath.startsWith('/') ? basePath : `/${basePath}`\n const cleanBase = normalizedBase.replace(/\\/$/, '')\n return `${cleanBase}${normalizedPath}`\n }\n\n // Default: return the normalized path (works for Vercel, custom domains, and dev)\n return normalizedPath\n}"],"mappings":"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","names":[]}