@scalar/postman-to-openapi 0.2.12 → 0.2.14

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.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,21 @@
1
1
  # @scalar/postman-to-openapi
2
2
 
3
+ ## 0.2.14
4
+
5
+ ### Patch Changes
6
+
7
+ - 8c7bad8: chore: move build tooling to esbuild
8
+ - Updated dependencies [8c7bad8]
9
+ - @scalar/openapi-types@0.2.2
10
+ - @scalar/oas-utils@0.2.141
11
+
12
+ ## 0.2.13
13
+
14
+ ### Patch Changes
15
+
16
+ - Updated dependencies [e8457cb]
17
+ - @scalar/oas-utils@0.2.140
18
+
3
19
  ## 0.2.12
4
20
 
5
21
  ### Patch Changes
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/convert.ts"],
4
+ "sourcesContent": ["import type { OpenAPIV3_1 } from '@scalar/openapi-types'\n\nimport { processAuth } from './helpers/authHelpers'\nimport { processExternalDocs } from './helpers/externalDocsHelper'\nimport { processItem } from './helpers/itemHelpers'\nimport { processLicenseAndContact } from './helpers/licenseContactHelper'\nimport { processLogo } from './helpers/logoHelper'\nimport { parseServers } from './helpers/serverHelpers'\nimport { normalizePath } from './helpers/urlHelpers'\nimport type { PostmanCollection } from './types'\n\n/**\n * Extracts tags from Postman collection folders\n */\nfunction extractTags(items: PostmanCollection['item']): OpenAPIV3_1.TagObject[] {\n const tags: OpenAPIV3_1.TagObject[] = []\n\n function processTagItem(item: any, parentPath: string = '') {\n if (item.item) {\n const currentPath = parentPath ? `${parentPath} > ${item.name}` : item.name\n\n // Add tag for the current folder\n tags.push({\n name: currentPath,\n ...(item.description && { description: item.description }),\n })\n\n // Process nested folders\n item.item.forEach((subItem: any) => processTagItem(subItem, currentPath))\n }\n }\n\n items.forEach((item) => processTagItem(item))\n return tags\n}\n\n/**\n * Converts a Postman Collection to an OpenAPI 3.1.0 document.\n * This function processes the collection's information, servers, authentication,\n * and items to create a corresponding OpenAPI structure.\n */\nexport function convert(postmanCollection: PostmanCollection | string): OpenAPIV3_1.Document {\n // Parse string input if provided\n const collection: PostmanCollection =\n typeof postmanCollection === 'string' ? JSON.parse(postmanCollection) : postmanCollection\n\n // Extract title from collection info, fallback to 'API' if not provided\n const title = collection.info.name || 'API'\n\n // Look for version in collection variables, default to '1.0.0'\n const version = (collection.variable?.find((v) => v.key === 'version')?.value as string) || '1.0.0'\n\n // Handle different description formats in Postman\n const description =\n typeof collection.info.description === 'string'\n ? collection.info.description\n : collection.info.description?.content || ''\n\n // Process license and contact information\n const { license, contact } = processLicenseAndContact(collection)\n\n // Process logo information\n const logo = processLogo(collection)\n\n // Initialize the OpenAPI document with required fields\n const openapi: OpenAPIV3_1.Document = {\n openapi: '3.1.0',\n info: {\n title,\n version,\n ...(description && { description }),\n ...(license && { license }),\n ...(contact && { contact }),\n ...(logo && { 'x-logo': logo }),\n },\n servers: parseServers(collection),\n paths: {},\n }\n\n // Process external docs\n const externalDocs = processExternalDocs(collection)\n if (externalDocs) {\n openapi.externalDocs = externalDocs\n }\n\n // Process authentication if present in the collection\n if (collection.auth) {\n const { securitySchemes, security } = processAuth(collection.auth)\n openapi.components = openapi.components || {}\n openapi.components.securitySchemes = {\n ...openapi.components.securitySchemes,\n ...securitySchemes,\n }\n openapi.security = security\n }\n\n // Process each item in the collection and merge into OpenAPI spec\n if (collection.item) {\n // Extract tags from folders\n const tags = extractTags(collection.item)\n if (tags.length > 0) {\n openapi.tags = tags\n }\n\n collection.item.forEach((item) => {\n const { paths: itemPaths, components: itemComponents } = processItem(item)\n\n // Merge paths from the current item\n openapi.paths = openapi.paths || {}\n for (const [pathKey, pathItem] of Object.entries(itemPaths)) {\n // Convert colon-style params to curly brace style\n const normalizedPathKey = normalizePath(pathKey)\n\n if (!pathItem) {\n continue\n }\n\n if (!openapi.paths[normalizedPathKey]) {\n openapi.paths[normalizedPathKey] = pathItem\n } else {\n openapi.paths[normalizedPathKey] = {\n ...openapi.paths[normalizedPathKey],\n ...pathItem,\n }\n }\n }\n\n // Merge security schemes from the current item\n if (itemComponents?.securitySchemes) {\n openapi.components = openapi.components || {}\n openapi.components.securitySchemes = {\n ...openapi.components.securitySchemes,\n ...itemComponents.securitySchemes,\n }\n }\n })\n }\n\n // Clean up the generated paths\n if (openapi.paths) {\n Object.values(openapi.paths).forEach((path) => {\n if (path) {\n Object.values(path).forEach((method) => {\n if (method && 'parameters' in method) {\n // Remove empty parameters array to keep spec clean\n if (method.parameters?.length === 0) {\n delete method.parameters\n }\n\n // Handle request bodies\n if (method.requestBody?.content) {\n const content = method.requestBody.content\n if (Object.keys(content).length === 0) {\n // Keep an empty requestBody with text/plain content\n method.requestBody = {\n content: {\n 'text/plain': {},\n },\n }\n } else if ('text/plain' in content) {\n // Preserve schema if it exists, otherwise keep an empty object\n if (!content['text/plain'].schema || Object.keys(content['text/plain'].schema).length === 0) {\n content['text/plain'] = {}\n }\n }\n }\n\n // Ensure all methods have a description, but don't add an empty one if it doesn't exist\n if (!method.description) {\n delete method.description\n }\n }\n })\n }\n })\n }\n\n // Remove empty components object\n if (Object.keys(openapi.components || {}).length === 0) {\n delete openapi.components\n }\n\n // Remove undefined properties recursively\n const removeUndefined = (obj: any): any => {\n if (Array.isArray(obj)) {\n return obj.map(removeUndefined).filter((item) => item !== undefined)\n }\n\n if (obj && typeof obj === 'object') {\n return Object.fromEntries(\n Object.entries(obj)\n .map(([key, value]) => [key, removeUndefined(value)])\n .filter(([_, value]) => value !== undefined),\n )\n }\n\n return obj\n }\n\n return removeUndefined(openapi)\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,187 @@
1
+ import { beforeAll, describe, expect, it } from "vitest";
2
+ import { convert } from "./convert.js";
3
+ const bucketName = "scalar-test-fixtures";
4
+ const BASE_URL = `https://storage.googleapis.com/${bucketName}`;
5
+ describe("convert", () => {
6
+ const collections = {};
7
+ const expected = {};
8
+ beforeAll(async () => {
9
+ try {
10
+ const allPromises = [
11
+ // Input collections
12
+ ...[
13
+ "AuthBasic",
14
+ "AuthBearer",
15
+ "AuthMultiple",
16
+ "AuthRequest",
17
+ "DeleteOperation",
18
+ "EmptyUrl",
19
+ "ExternalDocs",
20
+ "Folders",
21
+ "FormData",
22
+ "FormUrlencoded",
23
+ "GetMethods",
24
+ "Headers",
25
+ "LicenseContact",
26
+ "MultipleServers",
27
+ "NoPath",
28
+ "NoVersion",
29
+ "OperationIds",
30
+ "ParseStatusCode",
31
+ "PathParams",
32
+ "PostmantoOpenAPI",
33
+ "RawBody",
34
+ "Responses",
35
+ "ResponsesEmpty",
36
+ "SimplePost",
37
+ "UrlWithPort",
38
+ "XLogo",
39
+ "NestedServers"
40
+ ].map(async (name) => {
41
+ const path = `oas/postman-to-openapi/fixtures/input/${name}.json`;
42
+ const response = await fetch(`${BASE_URL}/${path}`);
43
+ collections[name] = await response.text();
44
+ }),
45
+ // Expected outputs
46
+ ...[
47
+ "AuthBasic",
48
+ "AuthBearer",
49
+ "AuthMultiple",
50
+ "AuthRequest",
51
+ "Basic",
52
+ "DeleteOperation",
53
+ "EmptyUrl",
54
+ "ExternalDocs",
55
+ "Folders",
56
+ "FormData",
57
+ "FormUrlencoded",
58
+ "GetMethods",
59
+ "Headers",
60
+ "LicenseContact",
61
+ "MultipleServers",
62
+ "NoPath",
63
+ "NoVersion",
64
+ "OperationIds",
65
+ "ParseStatusCode",
66
+ "PathParams",
67
+ "RawBody",
68
+ "Responses",
69
+ "ResponsesEmpty",
70
+ "SimplePost",
71
+ "UrlWithPort",
72
+ "XLogoVar",
73
+ "NestedServers"
74
+ ].map(async (name) => {
75
+ const response = await fetch(`${BASE_URL}/oas/postman-to-openapi/fixtures/output/${name}.json`);
76
+ expected[name] = await response.text();
77
+ })
78
+ ];
79
+ await Promise.all(allPromises);
80
+ } catch (error) {
81
+ console.error("Failed to download test files:", error);
82
+ throw error;
83
+ }
84
+ }, 5e3);
85
+ it("transforms basic collection", () => {
86
+ expect(convert(JSON.parse(collections.PostmantoOpenAPI))).toEqual(JSON.parse(expected.Basic));
87
+ });
88
+ it("converts collection with servers", () => {
89
+ expect(convert(JSON.parse(collections.SimplePost))).toEqual(JSON.parse(expected.SimplePost));
90
+ });
91
+ it("uses default version when not specified", () => {
92
+ expect(convert(JSON.parse(collections.NoVersion))).toEqual(JSON.parse(expected.NoVersion));
93
+ });
94
+ it("converts folders to tags", () => {
95
+ expect(convert(JSON.parse(collections.Folders))).toEqual(JSON.parse(expected.Folders));
96
+ });
97
+ it("parses GET methods with query strings", () => {
98
+ expect(convert(JSON.parse(collections.GetMethods))).toEqual(JSON.parse(expected.GetMethods));
99
+ });
100
+ it.skip("parses header parameters", () => {
101
+ expect(convert(JSON.parse(collections.Headers))).toEqual(JSON.parse(expected.Headers));
102
+ });
103
+ it("parses path parameters", () => {
104
+ expect(convert(JSON.parse(collections.PathParams))).toEqual(JSON.parse(expected.PathParams));
105
+ });
106
+ it("parses servers from postman collection host", () => {
107
+ expect(convert(JSON.parse(collections.MultipleServers))).toEqual(
108
+ JSON.parse(expected.MultipleServers)
109
+ );
110
+ });
111
+ it("parses license and contact from variables", () => {
112
+ expect(convert(JSON.parse(collections.LicenseContact))).toEqual(
113
+ JSON.parse(expected.LicenseContact)
114
+ );
115
+ });
116
+ it("parses status codes from tests", () => {
117
+ expect(convert(JSON.parse(collections.ParseStatusCode))).toEqual(
118
+ JSON.parse(expected.ParseStatusCode)
119
+ );
120
+ });
121
+ it("parses operations with domain only (no path)", () => {
122
+ expect(convert(JSON.parse(collections.NoPath))).toEqual(JSON.parse(expected.NoPath));
123
+ });
124
+ it("converts DELETE operations", () => {
125
+ expect(convert(JSON.parse(collections.DeleteOperation))).toEqual(
126
+ JSON.parse(expected.DeleteOperation)
127
+ );
128
+ });
129
+ it("parses global Bearer authorization", () => {
130
+ expect(convert(JSON.parse(collections.AuthBearer))).toEqual(JSON.parse(expected.AuthBearer));
131
+ });
132
+ it("parses global Basic authorization", () => {
133
+ expect(convert(JSON.parse(collections.AuthBasic))).toEqual(JSON.parse(expected.AuthBasic));
134
+ });
135
+ it("parses URLs with ports", () => {
136
+ expect(convert(JSON.parse(collections.UrlWithPort))).toEqual(JSON.parse(expected.UrlWithPort));
137
+ });
138
+ it("parses external docs from variables", () => {
139
+ expect(convert(JSON.parse(collections.ExternalDocs))).toEqual(
140
+ JSON.parse(expected.ExternalDocs)
141
+ );
142
+ });
143
+ it("handles empty URL requests", () => {
144
+ expect(convert(JSON.parse(collections.EmptyUrl))).toEqual(JSON.parse(expected.EmptyUrl));
145
+ });
146
+ it("uses x-logo from variables", () => {
147
+ expect(convert(JSON.parse(collections.XLogo))).toEqual(JSON.parse(expected.XLogoVar));
148
+ });
149
+ it("supports auth at request level", () => {
150
+ expect(convert(JSON.parse(collections.AuthMultiple))).toEqual(
151
+ JSON.parse(expected.AuthMultiple)
152
+ );
153
+ });
154
+ it("handles auth defined only at request level", () => {
155
+ expect(convert(JSON.parse(collections.AuthRequest))).toEqual(JSON.parse(expected.AuthRequest));
156
+ });
157
+ it("parses POST methods with form data", () => {
158
+ expect(convert(JSON.parse(collections.FormData))).toEqual(JSON.parse(expected.FormData));
159
+ });
160
+ it("parses POST methods with urlencoded form data", () => {
161
+ expect(convert(JSON.parse(collections.FormUrlencoded))).toEqual(
162
+ JSON.parse(expected.FormUrlencoded)
163
+ );
164
+ });
165
+ it("parses raw body as JSON with text fallback", () => {
166
+ expect(convert(JSON.parse(collections.RawBody))).toEqual(JSON.parse(expected.RawBody));
167
+ });
168
+ it.skip("handles empty JSON response bodies", () => {
169
+ expect(convert(JSON.parse(collections.ResponsesEmpty))).toEqual(
170
+ JSON.parse(expected.ResponsesEmpty)
171
+ );
172
+ });
173
+ it("includes operationId when brackets selected", () => {
174
+ expect(convert(JSON.parse(collections.OperationIds))).toEqual(
175
+ JSON.parse(expected.OperationIds)
176
+ );
177
+ });
178
+ it.skip("adds responses from postman examples", () => {
179
+ expect(convert(JSON.parse(collections.Responses))).toEqual(JSON.parse(expected.Responses));
180
+ });
181
+ it("parses nested servers", () => {
182
+ expect(convert(JSON.parse(collections.NestedServers))).toEqual(
183
+ JSON.parse(expected.NestedServers)
184
+ );
185
+ });
186
+ });
187
+ //# sourceMappingURL=convert.test.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/convert.test.ts"],
4
+ "sourcesContent": ["import { beforeAll, describe, expect, it } from 'vitest'\n\nimport { convert } from './convert'\nimport type { PostmanCollection } from './types'\n\nconst bucketName = 'scalar-test-fixtures'\nconst BASE_URL = `https://storage.googleapis.com/${bucketName}`\n\ndescribe('convert', () => {\n // Define all file content variables\n const collections: Record<string, string> = {}\n const expected: Record<string, string> = {}\n\n beforeAll(async () => {\n try {\n // Download all files in parallel\n const allPromises = [\n // Input collections\n ...[\n 'AuthBasic',\n 'AuthBearer',\n 'AuthMultiple',\n 'AuthRequest',\n 'DeleteOperation',\n 'EmptyUrl',\n 'ExternalDocs',\n 'Folders',\n 'FormData',\n 'FormUrlencoded',\n 'GetMethods',\n 'Headers',\n 'LicenseContact',\n 'MultipleServers',\n 'NoPath',\n 'NoVersion',\n 'OperationIds',\n 'ParseStatusCode',\n 'PathParams',\n 'PostmantoOpenAPI',\n 'RawBody',\n 'Responses',\n 'ResponsesEmpty',\n 'SimplePost',\n 'UrlWithPort',\n 'XLogo',\n 'NestedServers',\n ].map(async (name) => {\n const path = `oas/postman-to-openapi/fixtures/input/${name}.json`\n const response = await fetch(`${BASE_URL}/${path}`)\n collections[name] = await response.text()\n }),\n // Expected outputs\n ...[\n 'AuthBasic',\n 'AuthBearer',\n 'AuthMultiple',\n 'AuthRequest',\n 'Basic',\n 'DeleteOperation',\n 'EmptyUrl',\n 'ExternalDocs',\n 'Folders',\n 'FormData',\n 'FormUrlencoded',\n 'GetMethods',\n 'Headers',\n 'LicenseContact',\n 'MultipleServers',\n 'NoPath',\n 'NoVersion',\n 'OperationIds',\n 'ParseStatusCode',\n 'PathParams',\n 'RawBody',\n 'Responses',\n 'ResponsesEmpty',\n 'SimplePost',\n 'UrlWithPort',\n 'XLogoVar',\n 'NestedServers',\n ].map(async (name) => {\n const response = await fetch(`${BASE_URL}/oas/postman-to-openapi/fixtures/output/${name}.json`)\n expected[name] = await response.text()\n }),\n ]\n\n await Promise.all(allPromises)\n } catch (error) {\n console.error('Failed to download test files:', error)\n throw error\n }\n }, 5000)\n\n it('transforms basic collection', () => {\n expect(convert(JSON.parse(collections.PostmantoOpenAPI) as PostmanCollection)).toEqual(JSON.parse(expected.Basic))\n })\n\n it('converts collection with servers', () => {\n expect(convert(JSON.parse(collections.SimplePost) as PostmanCollection)).toEqual(JSON.parse(expected.SimplePost))\n })\n\n it('uses default version when not specified', () => {\n expect(convert(JSON.parse(collections.NoVersion) as PostmanCollection)).toEqual(JSON.parse(expected.NoVersion))\n })\n\n it('converts folders to tags', () => {\n expect(convert(JSON.parse(collections.Folders) as PostmanCollection)).toEqual(JSON.parse(expected.Folders))\n })\n\n it('parses GET methods with query strings', () => {\n expect(convert(JSON.parse(collections.GetMethods) as PostmanCollection)).toEqual(JSON.parse(expected.GetMethods))\n })\n\n it.skip('parses header parameters', () => {\n expect(convert(JSON.parse(collections.Headers) as PostmanCollection)).toEqual(JSON.parse(expected.Headers))\n })\n\n it('parses path parameters', () => {\n expect(convert(JSON.parse(collections.PathParams) as PostmanCollection)).toEqual(JSON.parse(expected.PathParams))\n })\n\n it('parses servers from postman collection host', () => {\n expect(convert(JSON.parse(collections.MultipleServers) as PostmanCollection)).toEqual(\n JSON.parse(expected.MultipleServers),\n )\n })\n\n it('parses license and contact from variables', () => {\n expect(convert(JSON.parse(collections.LicenseContact) as PostmanCollection)).toEqual(\n JSON.parse(expected.LicenseContact),\n )\n })\n\n it('parses status codes from tests', () => {\n expect(convert(JSON.parse(collections.ParseStatusCode) as PostmanCollection)).toEqual(\n JSON.parse(expected.ParseStatusCode),\n )\n })\n\n it('parses operations with domain only (no path)', () => {\n expect(convert(JSON.parse(collections.NoPath) as PostmanCollection)).toEqual(JSON.parse(expected.NoPath))\n })\n\n it('converts DELETE operations', () => {\n expect(convert(JSON.parse(collections.DeleteOperation) as PostmanCollection)).toEqual(\n JSON.parse(expected.DeleteOperation),\n )\n })\n\n it('parses global Bearer authorization', () => {\n expect(convert(JSON.parse(collections.AuthBearer) as PostmanCollection)).toEqual(JSON.parse(expected.AuthBearer))\n })\n\n it('parses global Basic authorization', () => {\n expect(convert(JSON.parse(collections.AuthBasic) as PostmanCollection)).toEqual(JSON.parse(expected.AuthBasic))\n })\n\n it('parses URLs with ports', () => {\n expect(convert(JSON.parse(collections.UrlWithPort) as PostmanCollection)).toEqual(JSON.parse(expected.UrlWithPort))\n })\n\n it('parses external docs from variables', () => {\n expect(convert(JSON.parse(collections.ExternalDocs) as PostmanCollection)).toEqual(\n JSON.parse(expected.ExternalDocs),\n )\n })\n\n it('handles empty URL requests', () => {\n expect(convert(JSON.parse(collections.EmptyUrl) as PostmanCollection)).toEqual(JSON.parse(expected.EmptyUrl))\n })\n\n it('uses x-logo from variables', () => {\n expect(convert(JSON.parse(collections.XLogo) as PostmanCollection)).toEqual(JSON.parse(expected.XLogoVar))\n })\n\n it('supports auth at request level', () => {\n expect(convert(JSON.parse(collections.AuthMultiple) as PostmanCollection)).toEqual(\n JSON.parse(expected.AuthMultiple),\n )\n })\n\n it('handles auth defined only at request level', () => {\n expect(convert(JSON.parse(collections.AuthRequest) as PostmanCollection)).toEqual(JSON.parse(expected.AuthRequest))\n })\n\n it('parses POST methods with form data', () => {\n expect(convert(JSON.parse(collections.FormData) as PostmanCollection)).toEqual(JSON.parse(expected.FormData))\n })\n\n it('parses POST methods with urlencoded form data', () => {\n expect(convert(JSON.parse(collections.FormUrlencoded) as PostmanCollection)).toEqual(\n JSON.parse(expected.FormUrlencoded),\n )\n })\n\n it('parses raw body as JSON with text fallback', () => {\n expect(convert(JSON.parse(collections.RawBody) as PostmanCollection)).toEqual(JSON.parse(expected.RawBody))\n })\n\n it.skip('handles empty JSON response bodies', () => {\n expect(convert(JSON.parse(collections.ResponsesEmpty) as PostmanCollection)).toEqual(\n JSON.parse(expected.ResponsesEmpty),\n )\n })\n\n it('includes operationId when brackets selected', () => {\n expect(convert(JSON.parse(collections.OperationIds) as PostmanCollection)).toEqual(\n JSON.parse(expected.OperationIds),\n )\n })\n\n it.skip('adds responses from postman examples', () => {\n expect(convert(JSON.parse(collections.Responses) as PostmanCollection)).toEqual(JSON.parse(expected.Responses))\n })\n\n it('parses nested servers', () => {\n expect(convert(JSON.parse(collections.NestedServers) as PostmanCollection)).toEqual(\n JSON.parse(expected.NestedServers),\n )\n })\n})\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/helpers/authHelpers.ts"],
4
+ "sourcesContent": ["import type { OpenAPIV3_1 } from '@scalar/openapi-types'\n\nimport type { Auth } from '../types'\n\n// Constants for security scheme names and URLs\nconst AUTH_SCHEMES = {\n API_KEY: 'apikeyAuth',\n BASIC: 'basicAuth',\n BEARER: 'bearerAuth',\n OAUTH2: 'oauth2Auth',\n} as const\n\nconst OAUTH2_DEFAULTS = {\n AUTHORIZE_URL: 'https://example.com/oauth/authorize',\n TOKEN_URL: 'https://example.com/oauth/token',\n} as const\n\ntype SecurityConfig = {\n scheme: OpenAPIV3_1.SecuritySchemeObject\n requirement: OpenAPIV3_1.SecurityRequirementObject\n}\n\n/**\n * Creates security configuration for API key authentication\n */\nfunction createApiKeyConfig(): SecurityConfig {\n return {\n scheme: {\n type: 'apiKey',\n name: 'api_key',\n in: 'header',\n },\n requirement: { [AUTH_SCHEMES.API_KEY]: [] },\n }\n}\n\n/**\n * Creates security configuration for Basic authentication\n */\nfunction createBasicConfig(): SecurityConfig {\n return {\n scheme: {\n type: 'http',\n scheme: 'basic',\n },\n requirement: { [AUTH_SCHEMES.BASIC]: [] },\n }\n}\n\n/**\n * Creates security configuration for Bearer token authentication\n */\nfunction createBearerConfig(): SecurityConfig {\n return {\n scheme: {\n type: 'http',\n scheme: 'bearer',\n },\n requirement: { [AUTH_SCHEMES.BEARER]: [] },\n }\n}\n\n/**\n * Creates security configuration for OAuth2 authentication\n */\nfunction createOAuth2Config(): SecurityConfig {\n return {\n scheme: {\n type: 'oauth2',\n flows: {\n authorizationCode: {\n authorizationUrl: OAUTH2_DEFAULTS.AUTHORIZE_URL,\n tokenUrl: OAUTH2_DEFAULTS.TOKEN_URL,\n scopes: {},\n },\n },\n },\n requirement: { [AUTH_SCHEMES.OAUTH2]: [] },\n }\n}\n\n/**\n * Creates security configuration for no authentication\n */\nfunction createNoAuthConfig(): SecurityConfig {\n return {\n scheme: {},\n requirement: {},\n }\n}\n\n/**\n * Maps authentication types to their configuration creators\n */\nconst AUTH_TYPE_HANDLERS: Record<string, () => SecurityConfig> = {\n apikey: createApiKeyConfig,\n basic: createBasicConfig,\n bearer: createBearerConfig,\n oauth2: createOAuth2Config,\n noauth: createNoAuthConfig,\n}\n\n/**\n * Processes authentication information from a Postman collection and updates\n * the OpenAPI document with the corresponding security schemes and requirements.\n * Supports API key, basic auth, bearer token, OAuth2, and no authentication types.\n */\nexport function processAuth(auth: Auth): {\n securitySchemes: Record<string, OpenAPIV3_1.SecuritySchemeObject>\n security: OpenAPIV3_1.SecurityRequirementObject[]\n} {\n const securitySchemes: Record<string, OpenAPIV3_1.SecuritySchemeObject> = {}\n const security: OpenAPIV3_1.SecurityRequirementObject[] = []\n\n try {\n const handler = AUTH_TYPE_HANDLERS[auth.type]\n if (!handler) {\n throw new Error(`Unsupported authentication type: ${auth.type}`)\n }\n\n const { scheme, requirement } = handler()\n\n // Only add security schemes and requirements if they're not empty\n if (Object.keys(scheme).length > 0) {\n const schemeKey = `${auth.type}Auth`\n securitySchemes[schemeKey] = scheme\n security.push(requirement)\n }\n } catch (error) {\n console.error('Error processing authentication:', error)\n throw error\n }\n\n return { securitySchemes, security }\n}\n"],
5
+ "mappings": "AAKA,MAAM,eAAe;AAAA,EACnB,SAAS;AAAA,EACT,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,QAAQ;AACV;AAEA,MAAM,kBAAkB;AAAA,EACtB,eAAe;AAAA,EACf,WAAW;AACb;AAUA,SAAS,qBAAqC;AAC5C,SAAO;AAAA,IACL,QAAQ;AAAA,MACN,MAAM;AAAA,MACN,MAAM;AAAA,MACN,IAAI;AAAA,IACN;AAAA,IACA,aAAa,EAAE,CAAC,aAAa,OAAO,GAAG,CAAC,EAAE;AAAA,EAC5C;AACF;AAKA,SAAS,oBAAoC;AAC3C,SAAO;AAAA,IACL,QAAQ;AAAA,MACN,MAAM;AAAA,MACN,QAAQ;AAAA,IACV;AAAA,IACA,aAAa,EAAE,CAAC,aAAa,KAAK,GAAG,CAAC,EAAE;AAAA,EAC1C;AACF;AAKA,SAAS,qBAAqC;AAC5C,SAAO;AAAA,IACL,QAAQ;AAAA,MACN,MAAM;AAAA,MACN,QAAQ;AAAA,IACV;AAAA,IACA,aAAa,EAAE,CAAC,aAAa,MAAM,GAAG,CAAC,EAAE;AAAA,EAC3C;AACF;AAKA,SAAS,qBAAqC;AAC5C,SAAO;AAAA,IACL,QAAQ;AAAA,MACN,MAAM;AAAA,MACN,OAAO;AAAA,QACL,mBAAmB;AAAA,UACjB,kBAAkB,gBAAgB;AAAA,UAClC,UAAU,gBAAgB;AAAA,UAC1B,QAAQ,CAAC;AAAA,QACX;AAAA,MACF;AAAA,IACF;AAAA,IACA,aAAa,EAAE,CAAC,aAAa,MAAM,GAAG,CAAC,EAAE;AAAA,EAC3C;AACF;AAKA,SAAS,qBAAqC;AAC5C,SAAO;AAAA,IACL,QAAQ,CAAC;AAAA,IACT,aAAa,CAAC;AAAA,EAChB;AACF;AAKA,MAAM,qBAA2D;AAAA,EAC/D,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AACV;AAOO,SAAS,YAAY,MAG1B;AACA,QAAM,kBAAoE,CAAC;AAC3E,QAAM,WAAoD,CAAC;AAE3D,MAAI;AACF,UAAM,UAAU,mBAAmB,KAAK,IAAI;AAC5C,QAAI,CAAC,SAAS;AACZ,YAAM,IAAI,MAAM,oCAAoC,KAAK,IAAI,EAAE;AAAA,IACjE;AAEA,UAAM,EAAE,QAAQ,YAAY,IAAI,QAAQ;AAGxC,QAAI,OAAO,KAAK,MAAM,EAAE,SAAS,GAAG;AAClC,YAAM,YAAY,GAAG,KAAK,IAAI;AAC9B,sBAAgB,SAAS,IAAI;AAC7B,eAAS,KAAK,WAAW;AAAA,IAC3B;AAAA,EACF,SAAS,OAAO;AACd,YAAQ,MAAM,oCAAoC,KAAK;AACvD,UAAM;AAAA,EACR;AAEA,SAAO,EAAE,iBAAiB,SAAS;AACrC;",
6
+ "names": []
7
+ }
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/helpers/externalDocsHelper.ts"],
4
+ "sourcesContent": ["import type { OpenAPIV3_1 } from '@scalar/openapi-types'\n\nimport type { PostmanCollection, Variable } from '../types'\n\n// Constants for variable keys\nconst VARIABLE_KEYS = {\n URL: 'externalDocs.url',\n DESCRIPTION: 'externalDocs.description',\n} as const\n\n/**\n * Finds a specific variable in the collection by its key\n */\nfunction findVariable(collection: PostmanCollection, key: string): Variable | undefined {\n return collection.variable?.find((v) => v.key === key)\n}\n\n/**\n * Processes the external documentation information from a Postman Collection.\n * This function checks for 'externalDocs.url' and 'externalDocs.description'\n * in the collection variables and creates an OpenAPI External Documentation Object\n * if the URL is present.\n */\nexport function processExternalDocs(\n collection: PostmanCollection,\n): OpenAPIV3_1.ExternalDocumentationObject | undefined {\n try {\n const urlVariable = findVariable(collection, VARIABLE_KEYS.URL)\n const descriptionVariable = findVariable(collection, VARIABLE_KEYS.DESCRIPTION)\n\n if (!urlVariable?.value) {\n return undefined\n }\n\n if (typeof urlVariable.value !== 'string') {\n throw new Error('External docs URL must be a string')\n }\n\n return {\n url: urlVariable.value,\n ...(descriptionVariable?.value &&\n typeof descriptionVariable.value === 'string' && {\n description: descriptionVariable.value,\n }),\n }\n } catch (error) {\n console.error('Error processing external docs:', error)\n throw error\n }\n}\n"],
5
+ "mappings": "AAKA,MAAM,gBAAgB;AAAA,EACpB,KAAK;AAAA,EACL,aAAa;AACf;AAKA,SAAS,aAAa,YAA+B,KAAmC;AACtF,SAAO,WAAW,UAAU,KAAK,CAAC,MAAM,EAAE,QAAQ,GAAG;AACvD;AAQO,SAAS,oBACd,YACqD;AACrD,MAAI;AACF,UAAM,cAAc,aAAa,YAAY,cAAc,GAAG;AAC9D,UAAM,sBAAsB,aAAa,YAAY,cAAc,WAAW;AAE9E,QAAI,CAAC,aAAa,OAAO;AACvB,aAAO;AAAA,IACT;AAEA,QAAI,OAAO,YAAY,UAAU,UAAU;AACzC,YAAM,IAAI,MAAM,oCAAoC;AAAA,IACtD;AAEA,WAAO;AAAA,MACL,KAAK,YAAY;AAAA,MACjB,GAAI,qBAAqB,SACvB,OAAO,oBAAoB,UAAU,YAAY;AAAA,QAC/C,aAAa,oBAAoB;AAAA,MACnC;AAAA,IACJ;AAAA,EACF,SAAS,OAAO;AACd,YAAQ,MAAM,mCAAmC,KAAK;AACtD,UAAM;AAAA,EACR;AACF;",
6
+ "names": []
7
+ }
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/helpers/formDataHelpers.ts"],
4
+ "sourcesContent": ["import type { OpenAPIV3_1 } from '@scalar/openapi-types'\n\nimport type { FormParameter } from '../types'\n\n/**\n * Processes form data parameters from a Postman request and converts them into an OpenAPI schema.\n * Handles file uploads, required fields, and descriptions.\n */\nexport function processFormDataSchema(formdata: FormParameter[]): OpenAPIV3_1.SchemaObject {\n const schema: OpenAPIV3_1.SchemaObject = {\n type: 'object',\n properties: {},\n required: [],\n }\n\n formdata.forEach((item: FormParameter) => {\n if (!schema.properties) {\n return\n }\n\n const property: OpenAPIV3_1.SchemaObject = {\n type: 'string',\n }\n\n // Add description if present, handling both string and object descriptions\n if (item.description) {\n const descriptionText = typeof item.description === 'string' ? item.description : item.description.content || ''\n\n property.description = descriptionText.replace(' [required]', '')\n\n // If [required] was present, add to required array\n if (descriptionText.includes('[required]')) {\n schema.required?.push(item.key)\n }\n }\n\n // Handle file type fields\n if (item.type === 'file') {\n property.format = 'binary'\n } else {\n property.example = item.value\n }\n\n schema.properties[item.key] = property\n })\n\n // Only keep required array if it has items\n if (schema.required?.length === 0) {\n delete schema.required\n }\n\n return schema\n}\n"],
5
+ "mappings": "AAQO,SAAS,sBAAsB,UAAqD;AACzF,QAAM,SAAmC;AAAA,IACvC,MAAM;AAAA,IACN,YAAY,CAAC;AAAA,IACb,UAAU,CAAC;AAAA,EACb;AAEA,WAAS,QAAQ,CAAC,SAAwB;AACxC,QAAI,CAAC,OAAO,YAAY;AACtB;AAAA,IACF;AAEA,UAAM,WAAqC;AAAA,MACzC,MAAM;AAAA,IACR;AAGA,QAAI,KAAK,aAAa;AACpB,YAAM,kBAAkB,OAAO,KAAK,gBAAgB,WAAW,KAAK,cAAc,KAAK,YAAY,WAAW;AAE9G,eAAS,cAAc,gBAAgB,QAAQ,eAAe,EAAE;AAGhE,UAAI,gBAAgB,SAAS,YAAY,GAAG;AAC1C,eAAO,UAAU,KAAK,KAAK,GAAG;AAAA,MAChC;AAAA,IACF;AAGA,QAAI,KAAK,SAAS,QAAQ;AACxB,eAAS,SAAS;AAAA,IACpB,OAAO;AACL,eAAS,UAAU,KAAK;AAAA,IAC1B;AAEA,WAAO,WAAW,KAAK,GAAG,IAAI;AAAA,EAChC,CAAC;AAGD,MAAI,OAAO,UAAU,WAAW,GAAG;AACjC,WAAO,OAAO;AAAA,EAChB;AAEA,SAAO;AACT;",
6
+ "names": []
7
+ }
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/helpers/itemHelpers.ts"],
4
+ "sourcesContent": ["import type { OpenAPIV3_1 } from '@scalar/openapi-types'\n\nimport type { Item, ItemGroup } from '../types'\nimport { processAuth } from './authHelpers'\nimport { parseMdTable } from './md-utils'\nimport { extractParameters } from './parameterHelpers'\nimport { processPostResponseScripts } from './postResponseScripts'\nimport { extractRequestBody } from './requestBodyHelpers'\nimport { extractResponses } from './responseHelpers'\nimport { extractPathFromUrl, extractPathParameterNames, normalizePath } from './urlHelpers'\n\ntype HttpMethods = 'get' | 'put' | 'post' | 'delete' | 'options' | 'head' | 'patch' | 'trace'\n\n/**\n * Processes a Postman collection item or item group and returns\n * the corresponding OpenAPI paths and components.\n * Handles nested item groups, extracts request details, and generates corresponding\n * OpenAPI path items and operations.\n */\nexport function processItem(\n item: Item | ItemGroup,\n parentTags: string[] = [],\n parentPath: string = '',\n): {\n paths: OpenAPIV3_1.PathsObject\n components: OpenAPIV3_1.ComponentsObject\n} {\n const paths: OpenAPIV3_1.PathsObject = {}\n const components: OpenAPIV3_1.ComponentsObject = {}\n\n if ('item' in item && Array.isArray(item.item)) {\n const newParentTags = item.name ? [...parentTags, item.name] : parentTags\n item.item.forEach((childItem) => {\n const childResult = processItem(childItem, newParentTags, `${parentPath}/${item.name || ''}`)\n // Merge child paths and components\n for (const [pathKey, pathItem] of Object.entries(childResult.paths)) {\n if (!paths[pathKey]) {\n paths[pathKey] = pathItem\n } else {\n paths[pathKey] = {\n ...paths[pathKey],\n ...pathItem,\n }\n }\n }\n\n // Merge components.securitySchemes\n if (childResult.components.securitySchemes) {\n components.securitySchemes = {\n ...components.securitySchemes,\n ...childResult.components.securitySchemes,\n }\n }\n })\n return { paths, components }\n }\n\n if (!('request' in item)) {\n return { paths, components }\n }\n\n const { request, name, response } = item\n const method = (typeof request === 'string' ? 'get' : request.method || 'get').toLowerCase() as HttpMethods\n\n const path = extractPathFromUrl(\n typeof request === 'string' ? request : typeof request.url === 'string' ? request.url : (request.url?.raw ?? ''),\n )\n\n // Normalize path parameters from ':param' to '{param}'\n const normalizedPath = normalizePath(path)\n\n // Extract path parameter names\n const pathParameterNames = extractPathParameterNames(normalizedPath)\n\n // Extract operation ID if present\n const { operationId, summary } = extractOperationInfo(name)\n\n const description =\n typeof request === 'string'\n ? ''\n : typeof request.description === 'string'\n ? request.description\n : (request.description?.content ?? '')\n\n const operationObject: OpenAPIV3_1.OperationObject = {\n tags: parentTags.length > 0 ? [parentTags.join(' > ')] : undefined,\n summary,\n description,\n responses: extractResponses(response || [], item),\n parameters: [],\n }\n\n // Add post-response scripts if present\n const postResponseScript = processPostResponseScripts(item.event)\n if (postResponseScript) {\n operationObject['x-post-response'] = postResponseScript\n }\n\n // Only add operationId if it was explicitly provided\n if (operationId) {\n operationObject.operationId = operationId\n }\n\n // Parse parameters from the description's Markdown table\n if (operationObject.description) {\n const { descriptionWithoutTable, parametersFromTable } = parseParametersFromDescription(operationObject.description)\n operationObject.description = descriptionWithoutTable.trim()\n\n // Extract parameters from the request (query, path, header)\n const extractedParameters = extractParameters(request)\n\n // Merge parameters, giving priority to those from the Markdown table\n const mergedParameters = new Map<string, OpenAPIV3_1.ParameterObject>()\n\n // Add extracted parameters, filtering out path parameters not in the path\n extractedParameters.forEach((param) => {\n if (param.name) {\n if (param.in === 'path' && !pathParameterNames.includes(param.name)) {\n return\n }\n mergedParameters.set(param.name, param)\n }\n })\n\n // Add parameters from table, filtering out path parameters not in the path\n parametersFromTable.forEach((param) => {\n if (param.name) {\n if (param.in === 'path' && !pathParameterNames.includes(param.name)) {\n return\n }\n mergedParameters.set(param.name, param)\n }\n })\n\n operationObject.parameters = Array.from(mergedParameters.values())\n }\n\n if (typeof request !== 'string' && request.auth) {\n if (!operationObject.security) {\n operationObject.security = []\n }\n const { securitySchemes, security } = processAuth(request.auth)\n\n if (!components.securitySchemes) {\n components.securitySchemes = {}\n }\n components.securitySchemes = {\n ...components.securitySchemes,\n ...securitySchemes,\n }\n\n operationObject.security.push(...security)\n }\n\n if (['post', 'put', 'patch'].includes(method) && typeof request !== 'string' && request.body) {\n operationObject.requestBody = extractRequestBody(request.body)\n }\n\n if (!paths[path]) {\n paths[path] = {}\n }\n const pathItem = paths[path] as OpenAPIV3_1.PathItemObject\n pathItem[method] = operationObject\n\n return { paths, components }\n}\n\n// Helper function to parse parameters from the description if it is markdown\nfunction parseParametersFromDescription(description: string): {\n descriptionWithoutTable: string\n parametersFromTable: OpenAPIV3_1.ParameterObject[]\n} {\n const lines = description.split('\\n')\n let inTable = false\n const tableLines: string[] = []\n const descriptionLines: string[] = []\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i]\n\n // Detect the start of the table\n if (line.trim().startsWith('|')) {\n // Remove any preceding headers or empty lines before the table\n while (\n descriptionLines.length > 0 &&\n (descriptionLines[descriptionLines.length - 1].trim() === '' ||\n descriptionLines[descriptionLines.length - 1].trim().startsWith('#'))\n ) {\n descriptionLines.pop()\n }\n\n // Start collecting table lines\n inTable = true\n }\n\n if (inTable) {\n tableLines.push(line)\n // Detect the end of the table (any line that doesn't start with '|', excluding the alignment line)\n if (!line.trim().startsWith('|') && !line.trim().match(/^-+$/)) {\n inTable = false\n }\n } else {\n descriptionLines.push(line)\n }\n }\n\n const tableMarkdown = tableLines.join('\\n')\n const parsedTable = parseMdTable(tableMarkdown)\n const parametersFromTable = Object.values(parsedTable).map((paramData: any) => {\n const paramIn = paramData.object as 'query' | 'header' | 'path'\n\n const param: OpenAPIV3_1.ParameterObject = {\n name: paramData.name,\n in: paramIn,\n description: paramData.description,\n required: paramData.required === 'true',\n schema: {\n type: paramData.type,\n },\n }\n\n if (paramData.example) {\n param.example = paramData.example\n }\n\n return param\n })\n\n const descriptionWithoutTable = descriptionLines.join('\\n')\n return { descriptionWithoutTable, parametersFromTable }\n}\n\n// Instead of using regex with \\s*, let's split this into two steps\nfunction extractOperationInfo(name: string | undefined) {\n if (!name) {\n return { operationId: undefined, summary: undefined }\n }\n\n // First check if the string ends with something in brackets\n const match = name.match(/\\[([^[\\]]{0,1000})\\]$/)\n if (!match) {\n return { operationId: undefined, summary: name }\n }\n\n // Get the operation ID from inside brackets\n const operationId = match[1]\n\n // Trim the brackets part from the end using string operations instead of regex\n const lastBracketIndex = name.lastIndexOf('[')\n const summary = name.substring(0, lastBracketIndex).trim()\n\n return { operationId, summary }\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["pathItem"]
7
+ }
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/helpers/licenseContactHelper.ts"],
4
+ "sourcesContent": ["import type { OpenAPIV3_1 } from '@scalar/openapi-types'\n\nimport type { PostmanCollection, Variable } from '../types'\n\n// Constants for variable keys\nconst VARIABLE_KEYS = {\n LICENSE: {\n NAME: 'license.name',\n URL: 'license.url',\n },\n CONTACT: {\n NAME: 'contact.name',\n URL: 'contact.url',\n EMAIL: 'contact.email',\n },\n} as const\n\ntype InfoResult = {\n license?: OpenAPIV3_1.LicenseObject\n contact?: OpenAPIV3_1.ContactObject\n}\n\n/**\n * Finds a specific variable in the collection by its key\n */\nfunction findVariable(collection: PostmanCollection, key: string): Variable | undefined {\n return collection.variable?.find((v) => v.key === key)\n}\n\n/**\n * Processes license information from collection variables\n */\nfunction processLicense(collection: PostmanCollection): OpenAPIV3_1.LicenseObject | undefined {\n const nameVar = findVariable(collection, VARIABLE_KEYS.LICENSE.NAME)\n if (!nameVar?.value || typeof nameVar.value !== 'string') {\n return undefined\n }\n\n const urlVar = findVariable(collection, VARIABLE_KEYS.LICENSE.URL)\n return {\n name: nameVar.value,\n ...(urlVar?.value && typeof urlVar.value === 'string' && { url: urlVar.value }),\n }\n}\n\n/**\n * Processes contact information from collection variables\n */\nfunction processContact(collection: PostmanCollection): OpenAPIV3_1.ContactObject | undefined {\n const nameVar = findVariable(collection, VARIABLE_KEYS.CONTACT.NAME)\n const urlVar = findVariable(collection, VARIABLE_KEYS.CONTACT.URL)\n const emailVar = findVariable(collection, VARIABLE_KEYS.CONTACT.EMAIL)\n\n if (!nameVar?.value && !urlVar?.value && !emailVar?.value) {\n return undefined\n }\n\n return {\n ...(nameVar?.value && typeof nameVar.value === 'string' && { name: nameVar.value }),\n ...(urlVar?.value && typeof urlVar.value === 'string' && { url: urlVar.value }),\n ...(emailVar?.value && typeof emailVar.value === 'string' && { email: emailVar.value }),\n }\n}\n\n/**\n * Processes the license and contact information from a Postman Collection.\n * This function checks for license and contact related variables in the collection\n * and creates corresponding OpenAPI License and Contact Objects if the information is present.\n */\nexport function processLicenseAndContact(collection: PostmanCollection): InfoResult {\n try {\n const result: InfoResult = {}\n\n const license = processLicense(collection)\n if (license) {\n result.license = license\n }\n\n const contact = processContact(collection)\n if (contact) {\n result.contact = contact\n }\n\n return result\n } catch (error) {\n console.error('Error processing license and contact information:', error)\n throw error\n }\n}\n"],
5
+ "mappings": "AAKA,MAAM,gBAAgB;AAAA,EACpB,SAAS;AAAA,IACP,MAAM;AAAA,IACN,KAAK;AAAA,EACP;AAAA,EACA,SAAS;AAAA,IACP,MAAM;AAAA,IACN,KAAK;AAAA,IACL,OAAO;AAAA,EACT;AACF;AAUA,SAAS,aAAa,YAA+B,KAAmC;AACtF,SAAO,WAAW,UAAU,KAAK,CAAC,MAAM,EAAE,QAAQ,GAAG;AACvD;AAKA,SAAS,eAAe,YAAsE;AAC5F,QAAM,UAAU,aAAa,YAAY,cAAc,QAAQ,IAAI;AACnE,MAAI,CAAC,SAAS,SAAS,OAAO,QAAQ,UAAU,UAAU;AACxD,WAAO;AAAA,EACT;AAEA,QAAM,SAAS,aAAa,YAAY,cAAc,QAAQ,GAAG;AACjE,SAAO;AAAA,IACL,MAAM,QAAQ;AAAA,IACd,GAAI,QAAQ,SAAS,OAAO,OAAO,UAAU,YAAY,EAAE,KAAK,OAAO,MAAM;AAAA,EAC/E;AACF;AAKA,SAAS,eAAe,YAAsE;AAC5F,QAAM,UAAU,aAAa,YAAY,cAAc,QAAQ,IAAI;AACnE,QAAM,SAAS,aAAa,YAAY,cAAc,QAAQ,GAAG;AACjE,QAAM,WAAW,aAAa,YAAY,cAAc,QAAQ,KAAK;AAErE,MAAI,CAAC,SAAS,SAAS,CAAC,QAAQ,SAAS,CAAC,UAAU,OAAO;AACzD,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL,GAAI,SAAS,SAAS,OAAO,QAAQ,UAAU,YAAY,EAAE,MAAM,QAAQ,MAAM;AAAA,IACjF,GAAI,QAAQ,SAAS,OAAO,OAAO,UAAU,YAAY,EAAE,KAAK,OAAO,MAAM;AAAA,IAC7E,GAAI,UAAU,SAAS,OAAO,SAAS,UAAU,YAAY,EAAE,OAAO,SAAS,MAAM;AAAA,EACvF;AACF;AAOO,SAAS,yBAAyB,YAA2C;AAClF,MAAI;AACF,UAAM,SAAqB,CAAC;AAE5B,UAAM,UAAU,eAAe,UAAU;AACzC,QAAI,SAAS;AACX,aAAO,UAAU;AAAA,IACnB;AAEA,UAAM,UAAU,eAAe,UAAU;AACzC,QAAI,SAAS;AACX,aAAO,UAAU;AAAA,IACnB;AAEA,WAAO;AAAA,EACT,SAAS,OAAO;AACd,YAAQ,MAAM,qDAAqD,KAAK;AACxE,UAAM;AAAA,EACR;AACF;",
6
+ "names": []
7
+ }
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/helpers/logoHelper.ts"],
4
+ "sourcesContent": ["import type { PostmanCollection } from '../types'\n\n/**\n * Processes logo information from a Postman Collection.\n * This function extracts logo-related variables from the collection\n * and constructs an object with logo properties.\n */\nexport function processLogo(postmanCollection: PostmanCollection) {\n const logoVariables = postmanCollection.variable?.filter((v) => v.key?.startsWith('x-logo.')) || []\n if (logoVariables.length === 0) {\n return null\n }\n\n const logo: Record<string, string> = {}\n logoVariables.forEach((v) => {\n if (v.key) {\n const key = v.key.replace('x-logo.', '').replace('Var', '')\n logo[key] = v.value as string\n }\n })\n\n return {\n url: logo.url,\n backgroundColor: logo.backgroundColor,\n altText: logo.altText,\n href: logo.href,\n }\n}\n"],
5
+ "mappings": "AAOO,SAAS,YAAY,mBAAsC;AAChE,QAAM,gBAAgB,kBAAkB,UAAU,OAAO,CAAC,MAAM,EAAE,KAAK,WAAW,SAAS,CAAC,KAAK,CAAC;AAClG,MAAI,cAAc,WAAW,GAAG;AAC9B,WAAO;AAAA,EACT;AAEA,QAAM,OAA+B,CAAC;AACtC,gBAAc,QAAQ,CAAC,MAAM;AAC3B,QAAI,EAAE,KAAK;AACT,YAAM,MAAM,EAAE,IAAI,QAAQ,WAAW,EAAE,EAAE,QAAQ,OAAO,EAAE;AAC1D,WAAK,GAAG,IAAI,EAAE;AAAA,IAChB;AAAA,EACF,CAAC;AAED,SAAO;AAAA,IACL,KAAK,KAAK;AAAA,IACV,iBAAiB,KAAK;AAAA,IACtB,SAAS,KAAK;AAAA,IACd,MAAM,KAAK;AAAA,EACb;AACF;",
6
+ "names": []
7
+ }
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/helpers/md-utils.ts"],
4
+ "sourcesContent": ["import type { TableCell, TableObject } from '../types'\n\nconst supHeaders = ['object', 'name', 'description', 'example', 'type', 'required']\n\n/**\n * Parses a Markdown table and returns an object representation.\n */\nexport function parseMdTable(md: string): TableObject {\n const lines = md.split('\\n').filter((line) => line.trim() !== '')\n if (lines.length < 3) {\n return {}\n }\n\n const header = lines[0]\n .split('|')\n .map((cell) => cell.trim())\n .filter(Boolean)\n if (!header.includes('object') || !header.includes('name')) {\n return {}\n }\n\n const headers = header.map((h) => (supHeaders.includes(h) ? h : false))\n\n const rows = lines.slice(2).map((line) =>\n line\n .split('|')\n .map((cell) => cell.trim())\n .filter(Boolean),\n )\n\n const tableObj: TableObject = rows.reduce((accTable: TableObject, cell) => {\n const cellObj: TableCell = cell.reduce((accCell: TableCell, field, index) => {\n if (headers[index] && typeof headers[index] === 'string') {\n accCell[headers[index] as string] = field\n }\n return accCell\n }, {})\n if (cellObj.name) {\n accTable[cellObj.name] = cellObj\n }\n return accTable\n }, {})\n\n return tableObj\n}\n"],
5
+ "mappings": "AAEA,MAAM,aAAa,CAAC,UAAU,QAAQ,eAAe,WAAW,QAAQ,UAAU;AAK3E,SAAS,aAAa,IAAyB;AACpD,QAAM,QAAQ,GAAG,MAAM,IAAI,EAAE,OAAO,CAAC,SAAS,KAAK,KAAK,MAAM,EAAE;AAChE,MAAI,MAAM,SAAS,GAAG;AACpB,WAAO,CAAC;AAAA,EACV;AAEA,QAAM,SAAS,MAAM,CAAC,EACnB,MAAM,GAAG,EACT,IAAI,CAAC,SAAS,KAAK,KAAK,CAAC,EACzB,OAAO,OAAO;AACjB,MAAI,CAAC,OAAO,SAAS,QAAQ,KAAK,CAAC,OAAO,SAAS,MAAM,GAAG;AAC1D,WAAO,CAAC;AAAA,EACV;AAEA,QAAM,UAAU,OAAO,IAAI,CAAC,MAAO,WAAW,SAAS,CAAC,IAAI,IAAI,KAAM;AAEtE,QAAM,OAAO,MAAM,MAAM,CAAC,EAAE;AAAA,IAAI,CAAC,SAC/B,KACG,MAAM,GAAG,EACT,IAAI,CAAC,SAAS,KAAK,KAAK,CAAC,EACzB,OAAO,OAAO;AAAA,EACnB;AAEA,QAAM,WAAwB,KAAK,OAAO,CAAC,UAAuB,SAAS;AACzE,UAAM,UAAqB,KAAK,OAAO,CAAC,SAAoB,OAAO,UAAU;AAC3E,UAAI,QAAQ,KAAK,KAAK,OAAO,QAAQ,KAAK,MAAM,UAAU;AACxD,gBAAQ,QAAQ,KAAK,CAAW,IAAI;AAAA,MACtC;AACA,aAAO;AAAA,IACT,GAAG,CAAC,CAAC;AACL,QAAI,QAAQ,MAAM;AAChB,eAAS,QAAQ,IAAI,IAAI;AAAA,IAC3B;AACA,WAAO;AAAA,EACT,GAAG,CAAC,CAAC;AAEL,SAAO;AACT;",
6
+ "names": []
7
+ }
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/helpers/parameterHelpers.ts"],
4
+ "sourcesContent": ["import type { OpenAPIV3_1 } from '@scalar/openapi-types'\n\nimport type { Header, Request } from '../types'\nimport { inferSchemaType } from './schemaHelpers'\n\n/**\n * Extracts parameters from a Postman request and converts them to OpenAPI parameter objects.\n * Processes query, path, and header parameters from the request URL and headers.\n */\nexport function extractParameters(request: Request): OpenAPIV3_1.ParameterObject[] {\n const parameters: OpenAPIV3_1.ParameterObject[] = []\n const parameterMap: Map<string, OpenAPIV3_1.ParameterObject> = new Map()\n\n if (typeof request === 'string' || !request.url) {\n return parameters\n }\n\n const url = typeof request.url === 'string' ? { raw: request.url } : request.url\n\n // Process query parameters\n if (url.query) {\n url.query.forEach((param) => {\n const paramObj = createParameterObject(param, 'query')\n if (paramObj.name) {\n parameterMap.set(paramObj.name, paramObj)\n }\n })\n }\n\n // Process path parameters\n if (url.variable) {\n url.variable.forEach((param) => {\n const paramObj = createParameterObject(param, 'path')\n if (paramObj.name) {\n parameterMap.set(paramObj.name, paramObj)\n }\n })\n }\n\n // Include variables extracted from url.path array\n if (url.path) {\n const pathArray = Array.isArray(url.path) ? url.path : [url.path]\n const extractedVariables = extractPathVariablesFromPathArray(pathArray)\n extractedVariables.forEach((varName) => {\n if (!parameterMap.has(varName)) {\n parameterMap.set(varName, {\n name: varName,\n in: 'path',\n required: true,\n schema: {\n type: 'string',\n },\n })\n }\n })\n }\n\n // Process header parameters\n if (request.header && Array.isArray(request.header)) {\n request.header.forEach((header: Header) => {\n const paramObj = createParameterObject(header, 'header')\n if (paramObj.name) {\n parameterMap.set(paramObj.name, paramObj)\n }\n })\n }\n\n return Array.from(parameterMap.values())\n}\n\n/**\n * Helper function to extract variables from the url.path array.\n */\nfunction extractPathVariablesFromPathArray(pathArray: (string | { type: string; value: string })[]): string[] {\n const variables: string[] = []\n const variableRegex = /{{\\s*([\\w.-]+)\\s*}}/\n\n pathArray.forEach((segment) => {\n const segmentString = typeof segment === 'string' ? segment : segment.value\n const match = segmentString.match(variableRegex)\n if (match?.[1]) {\n variables.push(match[1])\n }\n })\n\n return variables\n}\n\n/**\n * Creates an OpenAPI parameter object from a Postman parameter.\n */\nexport function createParameterObject(param: any, paramIn: 'query' | 'path' | 'header'): OpenAPIV3_1.ParameterObject {\n const parameter: OpenAPIV3_1.ParameterObject = {\n name: param.key || '',\n in: paramIn,\n description: param.description,\n }\n\n // Path parameters are always required in OpenAPI\n if (paramIn === 'path') {\n parameter.required = true\n } else if (paramIn === 'query') {\n // Check if the parameter is required based on description or name\n const isRequired =\n param.description?.toLowerCase().includes('[required]') || (param.key && param.key.toLowerCase() === 'required')\n\n if (isRequired) {\n parameter.required = true\n // Remove '[required]' from the description\n if (parameter.description) {\n parameter.description = parameter.description.replace(/\\[required\\]/gi, '').trim()\n }\n }\n }\n\n if (param.value !== undefined) {\n parameter.example = param.value\n parameter.schema = inferSchemaType(param.value)\n } else {\n parameter.schema = { type: 'string' } // Default to string if no value is provided\n }\n\n return parameter\n}\n"],
5
+ "mappings": "AAGA,SAAS,uBAAuB;AAMzB,SAAS,kBAAkB,SAAiD;AACjF,QAAM,aAA4C,CAAC;AACnD,QAAM,eAAyD,oBAAI,IAAI;AAEvE,MAAI,OAAO,YAAY,YAAY,CAAC,QAAQ,KAAK;AAC/C,WAAO;AAAA,EACT;AAEA,QAAM,MAAM,OAAO,QAAQ,QAAQ,WAAW,EAAE,KAAK,QAAQ,IAAI,IAAI,QAAQ;AAG7E,MAAI,IAAI,OAAO;AACb,QAAI,MAAM,QAAQ,CAAC,UAAU;AAC3B,YAAM,WAAW,sBAAsB,OAAO,OAAO;AACrD,UAAI,SAAS,MAAM;AACjB,qBAAa,IAAI,SAAS,MAAM,QAAQ;AAAA,MAC1C;AAAA,IACF,CAAC;AAAA,EACH;AAGA,MAAI,IAAI,UAAU;AAChB,QAAI,SAAS,QAAQ,CAAC,UAAU;AAC9B,YAAM,WAAW,sBAAsB,OAAO,MAAM;AACpD,UAAI,SAAS,MAAM;AACjB,qBAAa,IAAI,SAAS,MAAM,QAAQ;AAAA,MAC1C;AAAA,IACF,CAAC;AAAA,EACH;AAGA,MAAI,IAAI,MAAM;AACZ,UAAM,YAAY,MAAM,QAAQ,IAAI,IAAI,IAAI,IAAI,OAAO,CAAC,IAAI,IAAI;AAChE,UAAM,qBAAqB,kCAAkC,SAAS;AACtE,uBAAmB,QAAQ,CAAC,YAAY;AACtC,UAAI,CAAC,aAAa,IAAI,OAAO,GAAG;AAC9B,qBAAa,IAAI,SAAS;AAAA,UACxB,MAAM;AAAA,UACN,IAAI;AAAA,UACJ,UAAU;AAAA,UACV,QAAQ;AAAA,YACN,MAAM;AAAA,UACR;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF,CAAC;AAAA,EACH;AAGA,MAAI,QAAQ,UAAU,MAAM,QAAQ,QAAQ,MAAM,GAAG;AACnD,YAAQ,OAAO,QAAQ,CAAC,WAAmB;AACzC,YAAM,WAAW,sBAAsB,QAAQ,QAAQ;AACvD,UAAI,SAAS,MAAM;AACjB,qBAAa,IAAI,SAAS,MAAM,QAAQ;AAAA,MAC1C;AAAA,IACF,CAAC;AAAA,EACH;AAEA,SAAO,MAAM,KAAK,aAAa,OAAO,CAAC;AACzC;AAKA,SAAS,kCAAkC,WAAmE;AAC5G,QAAM,YAAsB,CAAC;AAC7B,QAAM,gBAAgB;AAEtB,YAAU,QAAQ,CAAC,YAAY;AAC7B,UAAM,gBAAgB,OAAO,YAAY,WAAW,UAAU,QAAQ;AACtE,UAAM,QAAQ,cAAc,MAAM,aAAa;AAC/C,QAAI,QAAQ,CAAC,GAAG;AACd,gBAAU,KAAK,MAAM,CAAC,CAAC;AAAA,IACzB;AAAA,EACF,CAAC;AAED,SAAO;AACT;AAKO,SAAS,sBAAsB,OAAY,SAAmE;AACnH,QAAM,YAAyC;AAAA,IAC7C,MAAM,MAAM,OAAO;AAAA,IACnB,IAAI;AAAA,IACJ,aAAa,MAAM;AAAA,EACrB;AAGA,MAAI,YAAY,QAAQ;AACtB,cAAU,WAAW;AAAA,EACvB,WAAW,YAAY,SAAS;AAE9B,UAAM,aACJ,MAAM,aAAa,YAAY,EAAE,SAAS,YAAY,KAAM,MAAM,OAAO,MAAM,IAAI,YAAY,MAAM;AAEvG,QAAI,YAAY;AACd,gBAAU,WAAW;AAErB,UAAI,UAAU,aAAa;AACzB,kBAAU,cAAc,UAAU,YAAY,QAAQ,kBAAkB,EAAE,EAAE,KAAK;AAAA,MACnF;AAAA,IACF;AAAA,EACF;AAEA,MAAI,MAAM,UAAU,QAAW;AAC7B,cAAU,UAAU,MAAM;AAC1B,cAAU,SAAS,gBAAgB,MAAM,KAAK;AAAA,EAChD,OAAO;AACL,cAAU,SAAS,EAAE,MAAM,SAAS;AAAA,EACtC;AAEA,SAAO;AACT;",
6
+ "names": []
7
+ }
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/helpers/postResponseScripts.ts"],
4
+ "sourcesContent": ["/**\n * Processes Postman test scripts and converts them to OpenAPI x-post-response extension\n */\nexport function processPostResponseScripts(events: any[] = []): string | undefined {\n // Find test event\n const testEvent = events.find((event) => event.listen === 'test')\n if (!testEvent?.script?.exec) {\n return undefined\n }\n\n // Join script lines into a single string\n return testEvent.script.exec.join('\\n').trim()\n}\n"],
5
+ "mappings": "AAGO,SAAS,2BAA2B,SAAgB,CAAC,GAAuB;AAEjF,QAAM,YAAY,OAAO,KAAK,CAAC,UAAU,MAAM,WAAW,MAAM;AAChE,MAAI,CAAC,WAAW,QAAQ,MAAM;AAC5B,WAAO;AAAA,EACT;AAGA,SAAO,UAAU,OAAO,KAAK,KAAK,IAAI,EAAE,KAAK;AAC/C;",
6
+ "names": []
7
+ }
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/helpers/requestBodyHelpers.ts"],
4
+ "sourcesContent": ["import type { OpenAPIV3_1 } from '@scalar/openapi-types'\n\nimport type { FormParameter, RequestBody, UrlEncodedParameter } from '../types'\nimport { processFormDataSchema } from './formDataHelpers'\nimport { createParameterObject } from './parameterHelpers'\n\n/**\n * Extracts and converts the request body from a Postman request to an OpenAPI RequestBodyObject.\n * Handles raw JSON, form-data, and URL-encoded body types, creating appropriate schemas and content types.\n */\nexport function extractRequestBody(body: RequestBody): OpenAPIV3_1.RequestBodyObject {\n const requestBody: OpenAPIV3_1.RequestBodyObject = {\n content: {},\n }\n\n if (body.mode === 'raw') {\n handleRawBody(body, requestBody)\n return requestBody\n }\n\n if (body.mode === 'formdata' && body.formdata) {\n handleFormDataBody(body.formdata, requestBody)\n return requestBody\n }\n\n if (body.mode === 'urlencoded' && body.urlencoded) {\n handleUrlEncodedBody(body.urlencoded, requestBody)\n return requestBody\n }\n\n return requestBody\n}\n\nfunction handleRawBody(body: RequestBody, requestBody: OpenAPIV3_1.RequestBodyObject) {\n try {\n const jsonBody = JSON.parse(body.raw || '')\n requestBody.content = {\n 'application/json': {\n schema: {\n type: 'object',\n example: jsonBody,\n },\n },\n }\n } catch (_error) {\n requestBody.content = {\n 'text/plain': {\n schema: {\n type: 'string',\n examples: [body.raw],\n },\n },\n }\n }\n}\n\nfunction handleFormDataBody(formdata: FormParameter[], requestBody: OpenAPIV3_1.RequestBodyObject) {\n requestBody.content = {\n 'multipart/form-data': {\n schema: processFormDataSchema(formdata),\n },\n }\n}\n\nfunction handleUrlEncodedBody(urlencoded: UrlEncodedParameter[], requestBody: OpenAPIV3_1.RequestBodyObject) {\n const schema: OpenAPIV3_1.SchemaObject = {\n type: 'object',\n properties: {},\n required: [],\n }\n urlencoded.forEach((item: UrlEncodedParameter) => {\n if (schema.properties) {\n const paramObject = createParameterObject(item, 'query')\n schema.properties[item.key] = {\n type: 'string',\n examples: [item.value],\n description: paramObject.description,\n }\n if (paramObject.required) {\n schema.required?.push(item.key)\n }\n }\n })\n requestBody.content = {\n 'application/x-www-form-urlencoded': {\n schema,\n },\n }\n}\n"],
5
+ "mappings": "AAGA,SAAS,6BAA6B;AACtC,SAAS,6BAA6B;AAM/B,SAAS,mBAAmB,MAAkD;AACnF,QAAM,cAA6C;AAAA,IACjD,SAAS,CAAC;AAAA,EACZ;AAEA,MAAI,KAAK,SAAS,OAAO;AACvB,kBAAc,MAAM,WAAW;AAC/B,WAAO;AAAA,EACT;AAEA,MAAI,KAAK,SAAS,cAAc,KAAK,UAAU;AAC7C,uBAAmB,KAAK,UAAU,WAAW;AAC7C,WAAO;AAAA,EACT;AAEA,MAAI,KAAK,SAAS,gBAAgB,KAAK,YAAY;AACjD,yBAAqB,KAAK,YAAY,WAAW;AACjD,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEA,SAAS,cAAc,MAAmB,aAA4C;AACpF,MAAI;AACF,UAAM,WAAW,KAAK,MAAM,KAAK,OAAO,EAAE;AAC1C,gBAAY,UAAU;AAAA,MACpB,oBAAoB;AAAA,QAClB,QAAQ;AAAA,UACN,MAAM;AAAA,UACN,SAAS;AAAA,QACX;AAAA,MACF;AAAA,IACF;AAAA,EACF,SAAS,QAAQ;AACf,gBAAY,UAAU;AAAA,MACpB,cAAc;AAAA,QACZ,QAAQ;AAAA,UACN,MAAM;AAAA,UACN,UAAU,CAAC,KAAK,GAAG;AAAA,QACrB;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,mBAAmB,UAA2B,aAA4C;AACjG,cAAY,UAAU;AAAA,IACpB,uBAAuB;AAAA,MACrB,QAAQ,sBAAsB,QAAQ;AAAA,IACxC;AAAA,EACF;AACF;AAEA,SAAS,qBAAqB,YAAmC,aAA4C;AAC3G,QAAM,SAAmC;AAAA,IACvC,MAAM;AAAA,IACN,YAAY,CAAC;AAAA,IACb,UAAU,CAAC;AAAA,EACb;AACA,aAAW,QAAQ,CAAC,SAA8B;AAChD,QAAI,OAAO,YAAY;AACrB,YAAM,cAAc,sBAAsB,MAAM,OAAO;AACvD,aAAO,WAAW,KAAK,GAAG,IAAI;AAAA,QAC5B,MAAM;AAAA,QACN,UAAU,CAAC,KAAK,KAAK;AAAA,QACrB,aAAa,YAAY;AAAA,MAC3B;AACA,UAAI,YAAY,UAAU;AACxB,eAAO,UAAU,KAAK,KAAK,GAAG;AAAA,MAChC;AAAA,IACF;AAAA,EACF,CAAC;AACD,cAAY,UAAU;AAAA,IACpB,qCAAqC;AAAA,MACnC;AAAA,IACF;AAAA,EACF;AACF;",
6
+ "names": []
7
+ }
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/helpers/responseHelpers.ts"],
4
+ "sourcesContent": ["import type { OpenAPIV3_1 } from '@scalar/openapi-types'\n\nimport type { HeaderList, Item, Response } from '../types'\nimport { inferSchemaFromExample } from './schemaHelpers'\nimport { extractStatusCodesFromTests } from './statusCodeHelpers'\n\n/**\n * Extracts and converts Postman response objects to OpenAPI response objects.\n * Processes response status codes, descriptions, headers, and body content,\n * inferring schemas from example responses when possible.\n */\nexport function extractResponses(responses: Response[], item?: Item): OpenAPIV3_1.ResponsesObject | undefined {\n // Extract status codes from tests\n const statusCodes = item ? extractStatusCodesFromTests(item) : []\n\n // Create a map of status codes to descriptions from responses\n const responseMap = responses.reduce((acc, response) => {\n const statusCode = response.code?.toString() || 'default'\n acc[statusCode] = {\n description: response.status || 'Successful response',\n headers: extractHeaders(response.header),\n content: {\n 'application/json': {\n schema: inferSchemaFromExample(response.body || ''),\n examples: {\n default: tryParseJson(response.body || ''),\n },\n },\n },\n }\n return acc\n }, {} as OpenAPIV3_1.ResponsesObject)\n\n // Add status codes from tests if not already present\n statusCodes.forEach((code) => {\n const codeStr = code.toString()\n if (!responseMap[codeStr]) {\n responseMap[codeStr] = {\n description: 'Successful response',\n content: {\n 'application/json': {},\n },\n }\n }\n })\n\n if (Object.keys(responseMap).length === 0) {\n return undefined\n }\n\n return responseMap\n}\n\nfunction extractHeaders(\n headers: HeaderList | string | null | undefined,\n): { [key: string]: OpenAPIV3_1.HeaderObject } | undefined {\n if (!headers || typeof headers === 'string') {\n return undefined\n }\n const openapiHeaders: { [key: string]: OpenAPIV3_1.HeaderObject } = {}\n if (Array.isArray(headers)) {\n headers.forEach((header) => {\n openapiHeaders[header.key] = {\n schema: {\n type: 'string',\n examples: [header.value],\n },\n }\n })\n }\n return openapiHeaders\n}\n\nfunction tryParseJson(jsonString: string): Record<string, unknown> {\n try {\n return JSON.parse(jsonString) as Record<string, unknown>\n } catch (_e) {\n return { rawContent: jsonString }\n }\n}\n"],
5
+ "mappings": "AAGA,SAAS,8BAA8B;AACvC,SAAS,mCAAmC;AAOrC,SAAS,iBAAiB,WAAuB,MAAsD;AAE5G,QAAM,cAAc,OAAO,4BAA4B,IAAI,IAAI,CAAC;AAGhE,QAAM,cAAc,UAAU,OAAO,CAAC,KAAK,aAAa;AACtD,UAAM,aAAa,SAAS,MAAM,SAAS,KAAK;AAChD,QAAI,UAAU,IAAI;AAAA,MAChB,aAAa,SAAS,UAAU;AAAA,MAChC,SAAS,eAAe,SAAS,MAAM;AAAA,MACvC,SAAS;AAAA,QACP,oBAAoB;AAAA,UAClB,QAAQ,uBAAuB,SAAS,QAAQ,EAAE;AAAA,UAClD,UAAU;AAAA,YACR,SAAS,aAAa,SAAS,QAAQ,EAAE;AAAA,UAC3C;AAAA,QACF;AAAA,MACF;AAAA,IACF;AACA,WAAO;AAAA,EACT,GAAG,CAAC,CAAgC;AAGpC,cAAY,QAAQ,CAAC,SAAS;AAC5B,UAAM,UAAU,KAAK,SAAS;AAC9B,QAAI,CAAC,YAAY,OAAO,GAAG;AACzB,kBAAY,OAAO,IAAI;AAAA,QACrB,aAAa;AAAA,QACb,SAAS;AAAA,UACP,oBAAoB,CAAC;AAAA,QACvB;AAAA,MACF;AAAA,IACF;AAAA,EACF,CAAC;AAED,MAAI,OAAO,KAAK,WAAW,EAAE,WAAW,GAAG;AACzC,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEA,SAAS,eACP,SACyD;AACzD,MAAI,CAAC,WAAW,OAAO,YAAY,UAAU;AAC3C,WAAO;AAAA,EACT;AACA,QAAM,iBAA8D,CAAC;AACrE,MAAI,MAAM,QAAQ,OAAO,GAAG;AAC1B,YAAQ,QAAQ,CAAC,WAAW;AAC1B,qBAAe,OAAO,GAAG,IAAI;AAAA,QAC3B,QAAQ;AAAA,UACN,MAAM;AAAA,UACN,UAAU,CAAC,OAAO,KAAK;AAAA,QACzB;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH;AACA,SAAO;AACT;AAEA,SAAS,aAAa,YAA6C;AACjE,MAAI;AACF,WAAO,KAAK,MAAM,UAAU;AAAA,EAC9B,SAAS,IAAI;AACX,WAAO,EAAE,YAAY,WAAW;AAAA,EAClC;AACF;",
6
+ "names": []
7
+ }
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/helpers/schemaHelpers.ts"],
4
+ "sourcesContent": ["import type { OpenAPIV3_1 } from '@scalar/openapi-types'\n\n/**\n * Infers the schema of an OpenAPI object based on an example value.\n * This function recursively analyzes the structure of the example value\n * and returns a corresponding OpenAPI schema object.\n */\nexport function inferSchemaFromExample(example: any): OpenAPIV3_1.SchemaObject {\n if (Array.isArray(example)) {\n return {\n type: 'array',\n items: example.length > 0 ? inferSchemaFromExample(example[0]) : {},\n }\n }\n if (typeof example === 'object' && example !== null) {\n const properties: { [key: string]: OpenAPIV3_1.SchemaObject } = {}\n for (const [key, value] of Object.entries(example)) {\n properties[key] = inferSchemaFromExample(value)\n }\n return {\n type: 'object',\n properties,\n }\n }\n return {\n type: typeof example as OpenAPIV3_1.NonArraySchemaObjectType,\n }\n}\n\n/**\n * Infers the schema type of a value based on its type.\n * This function determines the OpenAPI schema type of a value\n * by checking its JavaScript type and attempting to parse it\n * as a number or boolean if it's a string.\n */\nexport function inferSchemaType(value: any): OpenAPIV3_1.SchemaObject {\n if (typeof value === 'number') {\n return { type: Number.isInteger(value) ? 'integer' : 'number' }\n }\n if (typeof value === 'boolean') {\n return { type: 'boolean' }\n }\n if (typeof value === 'string') {\n const num = Number(value)\n if (!isNaN(num)) {\n return { type: Number.isInteger(num) ? 'integer' : 'number' }\n }\n if (value.toLowerCase() === 'true' || value.toLowerCase() === 'false') {\n return { type: 'boolean' }\n }\n }\n return { type: 'string' }\n}\n"],
5
+ "mappings": "AAOO,SAAS,uBAAuB,SAAwC;AAC7E,MAAI,MAAM,QAAQ,OAAO,GAAG;AAC1B,WAAO;AAAA,MACL,MAAM;AAAA,MACN,OAAO,QAAQ,SAAS,IAAI,uBAAuB,QAAQ,CAAC,CAAC,IAAI,CAAC;AAAA,IACpE;AAAA,EACF;AACA,MAAI,OAAO,YAAY,YAAY,YAAY,MAAM;AACnD,UAAM,aAA0D,CAAC;AACjE,eAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,OAAO,GAAG;AAClD,iBAAW,GAAG,IAAI,uBAAuB,KAAK;AAAA,IAChD;AACA,WAAO;AAAA,MACL,MAAM;AAAA,MACN;AAAA,IACF;AAAA,EACF;AACA,SAAO;AAAA,IACL,MAAM,OAAO;AAAA,EACf;AACF;AAQO,SAAS,gBAAgB,OAAsC;AACpE,MAAI,OAAO,UAAU,UAAU;AAC7B,WAAO,EAAE,MAAM,OAAO,UAAU,KAAK,IAAI,YAAY,SAAS;AAAA,EAChE;AACA,MAAI,OAAO,UAAU,WAAW;AAC9B,WAAO,EAAE,MAAM,UAAU;AAAA,EAC3B;AACA,MAAI,OAAO,UAAU,UAAU;AAC7B,UAAM,MAAM,OAAO,KAAK;AACxB,QAAI,CAAC,MAAM,GAAG,GAAG;AACf,aAAO,EAAE,MAAM,OAAO,UAAU,GAAG,IAAI,YAAY,SAAS;AAAA,IAC9D;AACA,QAAI,MAAM,YAAY,MAAM,UAAU,MAAM,YAAY,MAAM,SAAS;AACrE,aAAO,EAAE,MAAM,UAAU;AAAA,IAC3B;AAAA,EACF;AACA,SAAO,EAAE,MAAM,SAAS;AAC1B;",
6
+ "names": []
7
+ }
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/helpers/serverHelpers.ts"],
4
+ "sourcesContent": ["import type { OpenAPIV3_1 } from '@scalar/openapi-types'\n\nimport type { Item, ItemGroup, PostmanCollection } from '../types'\n\n/**\n * Recursively processes collection items to extract server URLs\n */\nfunction processItems(items: (Item | ItemGroup)[], domains: Set<string>) {\n items.forEach((item) => {\n if ('item' in item && Array.isArray(item.item)) {\n processItems(item.item, domains)\n } else if ('request' in item) {\n const request = item.request\n if (typeof request !== 'string') {\n const url = typeof request.url === 'string' ? request.url : request.url?.raw\n\n if (url) {\n try {\n // Extract domain from URL\n const urlMatch = url.match(/^(?:https?:\\/\\/)?([^/?#]+)/i)\n if (urlMatch?.[1]) {\n // Ensure we have the protocol\n const serverUrl = urlMatch[1].startsWith('http')\n ? urlMatch[1].replace(/\\/$/, '')\n : `https://${urlMatch[1]}`.replace(/\\/$/, '')\n domains.add(serverUrl)\n }\n } catch (error) {\n console.error(`Error extracting domain from URL \"${url}\":`, error)\n }\n }\n }\n }\n })\n}\n\n/**\n * Parses a Postman collection to extract unique server URLs.\n */\nexport function parseServers(postmanCollection: PostmanCollection): OpenAPIV3_1.ServerObject[] {\n const domains = new Set<string>()\n\n if (postmanCollection.item && Array.isArray(postmanCollection.item)) {\n processItems(postmanCollection.item, domains)\n }\n\n return Array.from(domains).map((domain) => ({\n url: domain,\n }))\n}\n"],
5
+ "mappings": "AAOA,SAAS,aAAa,OAA6B,SAAsB;AACvE,QAAM,QAAQ,CAAC,SAAS;AACtB,QAAI,UAAU,QAAQ,MAAM,QAAQ,KAAK,IAAI,GAAG;AAC9C,mBAAa,KAAK,MAAM,OAAO;AAAA,IACjC,WAAW,aAAa,MAAM;AAC5B,YAAM,UAAU,KAAK;AACrB,UAAI,OAAO,YAAY,UAAU;AAC/B,cAAM,MAAM,OAAO,QAAQ,QAAQ,WAAW,QAAQ,MAAM,QAAQ,KAAK;AAEzE,YAAI,KAAK;AACP,cAAI;AAEF,kBAAM,WAAW,IAAI,MAAM,6BAA6B;AACxD,gBAAI,WAAW,CAAC,GAAG;AAEjB,oBAAM,YAAY,SAAS,CAAC,EAAE,WAAW,MAAM,IAC3C,SAAS,CAAC,EAAE,QAAQ,OAAO,EAAE,IAC7B,WAAW,SAAS,CAAC,CAAC,GAAG,QAAQ,OAAO,EAAE;AAC9C,sBAAQ,IAAI,SAAS;AAAA,YACvB;AAAA,UACF,SAAS,OAAO;AACd,oBAAQ,MAAM,qCAAqC,GAAG,MAAM,KAAK;AAAA,UACnE;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF,CAAC;AACH;AAKO,SAAS,aAAa,mBAAkE;AAC7F,QAAM,UAAU,oBAAI,IAAY;AAEhC,MAAI,kBAAkB,QAAQ,MAAM,QAAQ,kBAAkB,IAAI,GAAG;AACnE,iBAAa,kBAAkB,MAAM,OAAO;AAAA,EAC9C;AAEA,SAAO,MAAM,KAAK,OAAO,EAAE,IAAI,CAAC,YAAY;AAAA,IAC1C,KAAK;AAAA,EACP,EAAE;AACJ;",
6
+ "names": []
7
+ }
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/helpers/statusCodeHelpers.ts"],
4
+ "sourcesContent": ["import type { Item } from '../types'\n\n/**\n * Extracts expected status codes from the test scripts of a Postman item.\n * Looks for patterns like:\n * - pm.response.to.have.status(201)\n * - pm.expect(pm.response.code).to.eql(202)\n * - pm.expect(pm.response.status).to.equal(201)\n */\nexport function extractStatusCodesFromTests(item: Item): number[] {\n const statusCodes: number[] = []\n\n if (item.event?.length) {\n item.event.forEach((event) => {\n if (event.listen === 'test' && event.script?.exec) {\n const scriptLines = Array.isArray(event.script.exec) ? event.script.exec : [event.script.exec]\n\n scriptLines.forEach((line: string) => {\n const statusCode = parseStatusCodeFromLine(line)\n if (statusCode) {\n statusCodes.push(statusCode)\n }\n })\n }\n })\n }\n\n return statusCodes\n}\n\n/**\n * Parses a line of script to extract a status code.\n * Supports patterns like:\n * - pm.response.to.have.status(201)\n * - pm.expect(pm.response.code).to.eql(202)\n * - pm.expect(pm.response.status).to.equal(201)\n */\nfunction parseStatusCodeFromLine(line: string): number | null {\n const patterns = [\n /pm\\.response\\.to\\.have\\.status\\((\\d{3})\\)/,\n /pm\\.expect\\(pm\\.response\\.code\\)\\.to\\.(?:eql|equal)\\((\\d{3})\\)/,\n /pm\\.expect\\(pm\\.response\\.status\\)\\.to\\.(?:eql|equal)\\(['\"](\\d{3})['\"]\\)/,\n ]\n\n for (const pattern of patterns) {\n const match = pattern.exec(line)?.at(1)\n if (match) {\n return Number.parseInt(match, 10)\n }\n }\n\n return null\n}\n"],
5
+ "mappings": "AASO,SAAS,4BAA4B,MAAsB;AAChE,QAAM,cAAwB,CAAC;AAE/B,MAAI,KAAK,OAAO,QAAQ;AACtB,SAAK,MAAM,QAAQ,CAAC,UAAU;AAC5B,UAAI,MAAM,WAAW,UAAU,MAAM,QAAQ,MAAM;AACjD,cAAM,cAAc,MAAM,QAAQ,MAAM,OAAO,IAAI,IAAI,MAAM,OAAO,OAAO,CAAC,MAAM,OAAO,IAAI;AAE7F,oBAAY,QAAQ,CAAC,SAAiB;AACpC,gBAAM,aAAa,wBAAwB,IAAI;AAC/C,cAAI,YAAY;AACd,wBAAY,KAAK,UAAU;AAAA,UAC7B;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF,CAAC;AAAA,EACH;AAEA,SAAO;AACT;AASA,SAAS,wBAAwB,MAA6B;AAC5D,QAAM,WAAW;AAAA,IACf;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,aAAW,WAAW,UAAU;AAC9B,UAAM,QAAQ,QAAQ,KAAK,IAAI,GAAG,GAAG,CAAC;AACtC,QAAI,OAAO;AACT,aAAO,OAAO,SAAS,OAAO,EAAE;AAAA,IAClC;AAAA,EACF;AAEA,SAAO;AACT;",
6
+ "names": []
7
+ }
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/helpers/urlHelpers.ts"],
4
+ "sourcesContent": ["import { REGEX } from '@scalar/oas-utils/helpers'\n\nimport type { ParsedUrl } from '../types'\n\n/**\n * Parses a URL string into its component parts.\n */\nfunction parseUrl(urlString: string): ParsedUrl {\n const url = new URL(urlString)\n return {\n protocol: url.protocol,\n hostname: url.hostname,\n port: url.port,\n }\n}\n\n/**\n * Extracts the domain (including protocol and port if present) from a given URL.\n */\nexport function getDomainFromUrl(url: string): string {\n const { protocol, hostname, port } = parseUrl(url)\n return `${protocol}//${hostname}${port ? `:${port}` : ''}`\n}\n\n/**\n * Extracts the path from a given URL, removing any Postman variables.\n */\nexport function extractPathFromUrl(url: string | undefined): string {\n if (!url) {\n return '/'\n }\n\n // Remove scheme, domain, query parameters, and hash fragments\n const path = url.replace(/^(?:https?:\\/\\/)?[^/]+(\\/|$)/, '/').split(/[?#]/)[0]\n\n // Replace Postman variables and ensure single leading slash\n const finalPath = ('/' + path.replace(/\\{\\{([^{}]{0,1000})\\}\\}/g, '{$1}').replace(/^\\/+/, '')).replace(/\\/\\/+/g, '/')\n\n return finalPath\n}\n\n/**\n * Normalizes a path by converting colon-style parameters to curly brace style\n * e.g., '/users/:id' becomes '/users/{id}'\n */\nexport const normalizePath = (path: string): string => path.replace(/:(\\w+)/g, '{$1}')\n\n/**\n * Extracts parameter names from a path string.\n * Handles double curly braces {{param}}, single curly braces {param}, and colon format :param.\n */\nexport function extractPathParameterNames(path: string): string[] {\n const params = new Set<string>()\n let match\n\n while ((match = REGEX.TEMPLATE_VARIABLE.exec(path)) !== null) {\n // match[1] contains the parameter name from {{param}}\n // match[2] contains the parameter name from {param}\n // match[0].slice(1) gets the parameter name from :param\n const param = match[1] || match[2] || match[0].slice(1)\n params.add(param.trim())\n }\n\n return Array.from(params)\n}\n"],
5
+ "mappings": "AAAA,SAAS,aAAa;AAOtB,SAAS,SAAS,WAA8B;AAC9C,QAAM,MAAM,IAAI,IAAI,SAAS;AAC7B,SAAO;AAAA,IACL,UAAU,IAAI;AAAA,IACd,UAAU,IAAI;AAAA,IACd,MAAM,IAAI;AAAA,EACZ;AACF;AAKO,SAAS,iBAAiB,KAAqB;AACpD,QAAM,EAAE,UAAU,UAAU,KAAK,IAAI,SAAS,GAAG;AACjD,SAAO,GAAG,QAAQ,KAAK,QAAQ,GAAG,OAAO,IAAI,IAAI,KAAK,EAAE;AAC1D;AAKO,SAAS,mBAAmB,KAAiC;AAClE,MAAI,CAAC,KAAK;AACR,WAAO;AAAA,EACT;AAGA,QAAM,OAAO,IAAI,QAAQ,gCAAgC,GAAG,EAAE,MAAM,MAAM,EAAE,CAAC;AAG7E,QAAM,aAAa,MAAM,KAAK,QAAQ,4BAA4B,MAAM,EAAE,QAAQ,QAAQ,EAAE,GAAG,QAAQ,UAAU,GAAG;AAEpH,SAAO;AACT;AAMO,MAAM,gBAAgB,CAAC,SAAyB,KAAK,QAAQ,WAAW,MAAM;AAM9E,SAAS,0BAA0B,MAAwB;AAChE,QAAM,SAAS,oBAAI,IAAY;AAC/B,MAAI;AAEJ,UAAQ,QAAQ,MAAM,kBAAkB,KAAK,IAAI,OAAO,MAAM;AAI5D,UAAM,QAAQ,MAAM,CAAC,KAAK,MAAM,CAAC,KAAK,MAAM,CAAC,EAAE,MAAM,CAAC;AACtD,WAAO,IAAI,MAAM,KAAK,CAAC;AAAA,EACzB;AAEA,SAAO,MAAM,KAAK,MAAM;AAC1B;",
6
+ "names": []
7
+ }
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/index.ts"],
4
+ "sourcesContent": ["import { convert } from './convert'\n\nexport { convert }\n"],
5
+ "mappings": "AAAA,SAAS,eAAe;",
6
+ "names": []
7
+ }
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": [],
4
+ "sourcesContent": [],
5
+ "mappings": "",
6
+ "names": []
7
+ }
@@ -0,0 +1,17 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { extractPathParameterNames } from "./helpers/urlHelpers.js";
3
+ describe("extractPathParameterNames", () => {
4
+ it("should extract double curly brace parameters", () => {
5
+ expect(extractPathParameterNames("/users/{{userId}}/posts/{{postId}}")).toEqual(["userId", "postId"]);
6
+ });
7
+ it("should extract single curly brace parameters", () => {
8
+ expect(extractPathParameterNames("/users/{userId}/posts/{postId}}")).toEqual(["userId", "postId"]);
9
+ });
10
+ it("should extract colon parameters", () => {
11
+ expect(extractPathParameterNames("/users/:userId/posts/:postId")).toEqual(["userId", "postId"]);
12
+ });
13
+ it("should deduplicate repeated parameters", () => {
14
+ expect(extractPathParameterNames("/users/:id/posts/:id")).toEqual(["id"]);
15
+ });
16
+ });
17
+ //# sourceMappingURL=urlHelpers.test.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/urlHelpers.test.ts"],
4
+ "sourcesContent": ["import { describe, expect, it } from 'vitest'\n\nimport { extractPathParameterNames } from './helpers/urlHelpers'\n\ndescribe('extractPathParameterNames', () => {\n it('should extract double curly brace parameters', () => {\n expect(extractPathParameterNames('/users/{{userId}}/posts/{{postId}}')).toEqual(['userId', 'postId'])\n })\n\n it('should extract single curly brace parameters', () => {\n expect(extractPathParameterNames('/users/{userId}/posts/{postId}}')).toEqual(['userId', 'postId'])\n })\n\n it('should extract colon parameters', () => {\n expect(extractPathParameterNames('/users/:userId/posts/:postId')).toEqual(['userId', 'postId'])\n })\n\n it('should deduplicate repeated parameters', () => {\n expect(extractPathParameterNames('/users/:id/posts/:id')).toEqual(['id'])\n })\n})\n"],
5
+ "mappings": "AAAA,SAAS,UAAU,QAAQ,UAAU;AAErC,SAAS,iCAAiC;AAE1C,SAAS,6BAA6B,MAAM;AAC1C,KAAG,gDAAgD,MAAM;AACvD,WAAO,0BAA0B,oCAAoC,CAAC,EAAE,QAAQ,CAAC,UAAU,QAAQ,CAAC;AAAA,EACtG,CAAC;AAED,KAAG,gDAAgD,MAAM;AACvD,WAAO,0BAA0B,iCAAiC,CAAC,EAAE,QAAQ,CAAC,UAAU,QAAQ,CAAC;AAAA,EACnG,CAAC;AAED,KAAG,mCAAmC,MAAM;AAC1C,WAAO,0BAA0B,8BAA8B,CAAC,EAAE,QAAQ,CAAC,UAAU,QAAQ,CAAC;AAAA,EAChG,CAAC;AAED,KAAG,0CAA0C,MAAM;AACjD,WAAO,0BAA0B,sBAAsB,CAAC,EAAE,QAAQ,CAAC,IAAI,CAAC;AAAA,EAC1E,CAAC;AACH,CAAC;",
6
+ "names": []
7
+ }
package/package.json CHANGED
@@ -19,7 +19,7 @@
19
19
  "export",
20
20
  "scalar"
21
21
  ],
22
- "version": "0.2.12",
22
+ "version": "0.2.14",
23
23
  "engines": {
24
24
  "node": ">=18"
25
25
  },
@@ -38,15 +38,14 @@
38
38
  ],
39
39
  "module": "dist/index.js",
40
40
  "dependencies": {
41
- "@scalar/oas-utils": "0.2.139",
42
- "@scalar/openapi-types": "0.2.1"
41
+ "@scalar/oas-utils": "0.2.141",
42
+ "@scalar/openapi-types": "0.2.2"
43
43
  },
44
44
  "devDependencies": {
45
- "vite": "^5.4.10",
46
- "@scalar/build-tooling": "0.1.18"
45
+ "@scalar/build-tooling": "0.1.19"
47
46
  },
48
47
  "scripts": {
49
- "build": "scalar-build-rollup",
48
+ "build": "scalar-build-esbuild",
50
49
  "format": "scalar-format",
51
50
  "lint:check": "eslint .",
52
51
  "lint:fix": "eslint . --fix",