@scalar/postman-to-openapi 0.6.2 → 0.7.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 (38) hide show
  1. package/CHANGELOG.md +25 -0
  2. package/README.md +15 -0
  3. package/dist/convert.d.ts +14 -0
  4. package/dist/convert.d.ts.map +1 -1
  5. package/dist/convert.js +392 -44
  6. package/dist/helpers/header-utils.d.ts +21 -0
  7. package/dist/helpers/header-utils.d.ts.map +1 -0
  8. package/dist/helpers/header-utils.js +42 -0
  9. package/dist/helpers/merge-operation.d.ts.map +1 -1
  10. package/dist/helpers/merge-operation.js +120 -5
  11. package/dist/helpers/merge-path-item.d.ts.map +1 -1
  12. package/dist/helpers/merge-path-item.js +28 -4
  13. package/dist/helpers/parameters.d.ts +4 -1
  14. package/dist/helpers/parameters.d.ts.map +1 -1
  15. package/dist/helpers/parameters.js +40 -1
  16. package/dist/helpers/path-items.d.ts +11 -1
  17. package/dist/helpers/path-items.d.ts.map +1 -1
  18. package/dist/helpers/path-items.js +111 -11
  19. package/dist/helpers/request-body.d.ts +5 -1
  20. package/dist/helpers/request-body.d.ts.map +1 -1
  21. package/dist/helpers/request-body.js +21 -28
  22. package/dist/helpers/responses.d.ts +8 -1
  23. package/dist/helpers/responses.d.ts.map +1 -1
  24. package/dist/helpers/responses.js +99 -11
  25. package/dist/helpers/servers.d.ts.map +1 -1
  26. package/dist/helpers/servers.js +10 -6
  27. package/dist/helpers/urls.d.ts +20 -0
  28. package/dist/helpers/urls.d.ts.map +1 -1
  29. package/dist/helpers/urls.js +101 -3
  30. package/dist/index.d.ts +2 -1
  31. package/dist/index.d.ts.map +1 -1
  32. package/dist/index.js +1 -0
  33. package/dist/is-postman-collection.d.ts +9 -0
  34. package/dist/is-postman-collection.d.ts.map +1 -0
  35. package/dist/is-postman-collection.js +23 -0
  36. package/dist/types.d.ts +1 -0
  37. package/dist/types.d.ts.map +1 -1
  38. package/package.json +6 -5
@@ -3,13 +3,17 @@ import { createParameterObject } from './parameters.js';
3
3
  /**
4
4
  * Extracts and converts the request body from a Postman request to an OpenAPI RequestBodyObject.
5
5
  * Handles raw JSON, form-data, and URL-encoded body types, creating appropriate schemas and content types.
6
+ *
7
+ * When `contentType` is provided (already normalised via `parseMediaType`), it
8
+ * wins over the Postman `options.raw.language` hint for `raw` bodies.
9
+ * `formdata` and `urlencoded` modes keep their natural media types.
6
10
  */
7
- export function extractRequestBody(body, exampleName) {
11
+ export function extractRequestBody(body, exampleName, contentType) {
8
12
  const requestBody = {
9
13
  content: {},
10
14
  };
11
15
  if (body.mode === 'raw') {
12
- handleRawBody(body, requestBody, exampleName);
16
+ handleRawBody(body, requestBody, exampleName, contentType);
13
17
  return requestBody;
14
18
  }
15
19
  if (body.mode === 'formdata' && body.formdata) {
@@ -22,24 +26,11 @@ export function extractRequestBody(body, exampleName) {
22
26
  }
23
27
  return requestBody;
24
28
  }
25
- function handleRawBody(body, requestBody, exampleName) {
29
+ function handleRawBody(body, requestBody, exampleName, contentType) {
26
30
  const rawBody = body.raw || '';
27
31
  const isJsonLanguage = body.options?.raw?.language === 'json';
28
- // Check if body contains Postman variables (like {{bodyData}})
29
- const hasVariables = /\{\{[\w-]+\}\}/.test(rawBody);
30
- // Try parsing the raw body as JSON
31
- // We use a boolean flag because `null` is a valid JSON value
32
- let jsonBody;
33
- let isJsonBody = false;
34
- try {
35
- jsonBody = JSON.parse(rawBody);
36
- isJsonBody = true;
37
- }
38
- catch {
39
- // Parsing failed - will handle below
40
- }
41
- // If we have valid JSON, use it
42
- if (isJsonBody) {
32
+ const mediaType = contentType ?? (isJsonLanguage ? 'application/json' : 'text/plain');
33
+ if (mediaType === 'application/json') {
43
34
  requestBody.content = {
44
35
  'application/json': {
45
36
  schema: {
@@ -47,32 +38,34 @@ function handleRawBody(body, requestBody, exampleName) {
47
38
  },
48
39
  examples: {
49
40
  [exampleName]: {
50
- value: jsonBody,
41
+ value: rawBody,
51
42
  },
52
43
  },
53
44
  },
54
45
  };
55
46
  return;
56
47
  }
57
- // If we have variables and JSON language but could not parse JSON,
58
- // create a JSON schema placeholder
59
- if (hasVariables && isJsonLanguage) {
48
+ if (mediaType === 'text/plain') {
60
49
  requestBody.content = {
61
- 'application/json': {
50
+ 'text/plain': {
62
51
  schema: {
63
- type: 'object',
64
- description: 'Body data set via pre-request script',
52
+ type: 'string',
53
+ examples: rawBody ? [rawBody] : undefined,
65
54
  },
66
55
  },
67
56
  };
68
57
  return;
69
58
  }
70
- // Fallback to text/plain
59
+ // Any other caller-declared media type (application/xml, text/csv, application/octet-stream, ...)
71
60
  requestBody.content = {
72
- 'text/plain': {
61
+ [mediaType]: {
73
62
  schema: {
74
63
  type: 'string',
75
- examples: rawBody ? [rawBody] : undefined,
64
+ },
65
+ examples: {
66
+ [exampleName]: {
67
+ value: rawBody,
68
+ },
76
69
  },
77
70
  },
78
71
  };
@@ -1,9 +1,16 @@
1
1
  import type { OpenAPIV3_1 } from '@scalar/openapi-types';
2
2
  import type { Item, Response } from '../types.js';
3
+ export declare const DEFAULT_RESPONSE_DESCRIPTIONS: Record<string, string>;
3
4
  /**
4
5
  * Extracts and converts Postman response objects to OpenAPI response objects.
5
6
  * Processes response status codes, descriptions, headers, and body content,
6
7
  * inferring schemas from example responses when possible.
8
+ *
9
+ * Media-type selection precedence for each response:
10
+ * 1. The saved response's own `Content-Type` header.
11
+ * 2. The request's `Accept` header (passed as `acceptMediaType`, already
12
+ * narrowed via `pickAcceptMediaType`).
13
+ * 3. `application/json` fallback.
7
14
  */
8
- export declare function extractResponses(responses: Response[], item?: Item): OpenAPIV3_1.ResponsesObject | undefined;
15
+ export declare function extractResponses(responses: Response[], item?: Item, acceptMediaType?: string): OpenAPIV3_1.ResponsesObject | undefined;
9
16
  //# sourceMappingURL=responses.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"responses.d.ts","sourceRoot":"","sources":["../../src/helpers/responses.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAA;AAExD,OAAO,KAAK,EAAc,IAAI,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;AAKzD;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,QAAQ,EAAE,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG,WAAW,CAAC,eAAe,GAAG,SAAS,CAwC5G"}
1
+ {"version":3,"file":"responses.d.ts","sourceRoot":"","sources":["../../src/helpers/responses.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAA;AAExD,OAAO,KAAK,EAAc,IAAI,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;AAMzD,eAAO,MAAM,6BAA6B,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAchE,CAAA;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,gBAAgB,CAC9B,SAAS,EAAE,QAAQ,EAAE,EACrB,IAAI,CAAC,EAAE,IAAI,EACX,eAAe,CAAC,EAAE,MAAM,GACvB,WAAW,CAAC,eAAe,GAAG,SAAS,CA+DzC"}
@@ -1,39 +1,77 @@
1
+ import { parseMediaType, readHeader } from './header-utils.js';
1
2
  import { inferSchemaFromExample } from './schemas.js';
2
3
  import { extractStatusCodesFromTests } from './status-codes.js';
4
+ export const DEFAULT_RESPONSE_DESCRIPTIONS = {
5
+ 200: 'OK',
6
+ 201: 'Created',
7
+ 202: 'Accepted',
8
+ 204: 'No content',
9
+ 301: 'Moved permanently',
10
+ 400: 'Bad request',
11
+ 401: 'Unauthorized',
12
+ 403: 'Forbidden',
13
+ 404: 'Not found',
14
+ 409: 'Conflict',
15
+ 422: 'Unprocessable entity',
16
+ 500: 'Internal server error',
17
+ default: 'Default response',
18
+ };
3
19
  /**
4
20
  * Extracts and converts Postman response objects to OpenAPI response objects.
5
21
  * Processes response status codes, descriptions, headers, and body content,
6
22
  * inferring schemas from example responses when possible.
23
+ *
24
+ * Media-type selection precedence for each response:
25
+ * 1. The saved response's own `Content-Type` header.
26
+ * 2. The request's `Accept` header (passed as `acceptMediaType`, already
27
+ * narrowed via `pickAcceptMediaType`).
28
+ * 3. `application/json` fallback.
7
29
  */
8
- export function extractResponses(responses, item) {
30
+ export function extractResponses(responses, item, acceptMediaType) {
9
31
  // Extract status codes from tests
10
32
  const statusCodes = item ? extractStatusCodesFromTests(item) : [];
11
33
  // Create a map of status codes to descriptions from responses
12
34
  const responseMap = responses.reduce((acc, response) => {
13
35
  const statusCode = response.code?.toString() || 'default';
14
- acc[statusCode] = {
15
- description: response.status || 'Successful response',
16
- headers: extractHeaders(response.header),
17
- content: {
18
- 'application/json': {
36
+ const hasNoContentStatusCode = hasNoResponseBodyStatusCode(statusCode);
37
+ const hasExplicitBodyExample = response.body !== undefined && response.body !== null && response.body !== '';
38
+ if (hasNoContentStatusCode && hasExplicitBodyExample) {
39
+ console.warn(`[postman-to-openapi] Response ${statusCode} usually has no body, but Postman includes a body example. Keeping OpenAPI content.`);
40
+ }
41
+ const savedContentType = parseMediaType(readHeader(response.header, 'Content-Type'));
42
+ const mediaType = savedContentType ?? acceptMediaType ?? 'application/json';
43
+ const content = hasNoContentStatusCode && !hasExplicitBodyExample
44
+ ? undefined
45
+ : {
46
+ [mediaType]: {
19
47
  schema: inferSchemaFromExample(response.body || ''),
20
48
  examples: {
21
49
  default: tryParseJson(response.body || ''),
22
50
  },
23
51
  },
24
- },
52
+ };
53
+ acc[statusCode] = {
54
+ description: getResponseDescription(response, statusCode),
55
+ headers: extractHeaders(response.header),
56
+ ...(content ? { content } : {}),
25
57
  };
26
58
  return acc;
27
59
  }, {});
28
60
  // Add status codes from tests if not already present
61
+ const fallbackMediaType = acceptMediaType ?? 'application/json';
29
62
  statusCodes.forEach((code) => {
30
63
  const codeStr = code.toString();
31
64
  if (!responseMap[codeStr]) {
65
+ const hasNoContentStatusCode = hasNoResponseBodyStatusCode(codeStr);
32
66
  responseMap[codeStr] = {
33
- description: 'Successful response',
34
- content: {
35
- 'application/json': {},
36
- },
67
+ description: getDefaultResponseDescription(codeStr),
68
+ ...(!hasNoContentStatusCode
69
+ ? {
70
+ content: {
71
+ [fallbackMediaType]: {},
72
+ },
73
+ }
74
+ : {}),
37
75
  };
38
76
  }
39
77
  });
@@ -42,6 +80,56 @@ export function extractResponses(responses, item) {
42
80
  }
43
81
  return responseMap;
44
82
  }
83
+ function getResponseDescription(response, statusCode) {
84
+ const descriptionFromName = extractDescriptionFromName(response.name, statusCode);
85
+ if (descriptionFromName) {
86
+ return descriptionFromName;
87
+ }
88
+ if (response.status) {
89
+ return response.status;
90
+ }
91
+ return getDefaultResponseDescription(statusCode);
92
+ }
93
+ function extractDescriptionFromName(name, statusCode) {
94
+ if (!name) {
95
+ return undefined;
96
+ }
97
+ const trimmedName = name.trim();
98
+ const separatorIndex = trimmedName.indexOf('-');
99
+ if (separatorIndex < 0) {
100
+ return undefined;
101
+ }
102
+ const code = trimmedName.slice(0, separatorIndex).trim();
103
+ if (!isThreeDigitStatusCode(code) || code !== statusCode) {
104
+ return undefined;
105
+ }
106
+ const description = trimmedName.slice(separatorIndex + 1).trim();
107
+ if (!description) {
108
+ return undefined;
109
+ }
110
+ return description;
111
+ }
112
+ function getDefaultResponseDescription(statusCode) {
113
+ return DEFAULT_RESPONSE_DESCRIPTIONS[statusCode] ?? DEFAULT_RESPONSE_DESCRIPTIONS.default ?? 'Default response';
114
+ }
115
+ function isThreeDigitStatusCode(value) {
116
+ if (value.length !== 3) {
117
+ return false;
118
+ }
119
+ for (const character of value) {
120
+ if (character < '0' || character > '9') {
121
+ return false;
122
+ }
123
+ }
124
+ return true;
125
+ }
126
+ const hasNoResponseBodyStatusCode = (statusCode) => {
127
+ const numericCode = Number(statusCode);
128
+ if (!Number.isInteger(numericCode)) {
129
+ return false;
130
+ }
131
+ return (numericCode >= 100 && numericCode <= 199) || numericCode === 204 || numericCode === 205 || numericCode === 304;
132
+ };
45
133
  function extractHeaders(headers) {
46
134
  if (!headers || typeof headers === 'string') {
47
135
  return undefined;
@@ -1 +1 @@
1
- {"version":3,"file":"servers.d.ts","sourceRoot":"","sources":["../../src/helpers/servers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAA;AAExD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AAE/C;;GAEG;AACH,KAAK,eAAe,GAAG;IACrB,QAAQ,EAAE,WAAW,CAAC,YAAY,EAAE,CAAA;IACpC,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,YAAY,EAAE,CAAC,CAAA;IAClD,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,YAAY,EAAE,CAAC,CAAC,CAAA;CACjE,CAAA;AAsBD;;;;;;;GAOG;AACH,wBAAgB,yBAAyB,CAAC,WAAW,EAAE,WAAW,EAAE,EAAE,cAAc,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,eAAe,CAuElH"}
1
+ {"version":3,"file":"servers.d.ts","sourceRoot":"","sources":["../../src/helpers/servers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAA;AAExD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AAE/C;;GAEG;AACH,KAAK,eAAe,GAAG;IACrB,QAAQ,EAAE,WAAW,CAAC,YAAY,EAAE,CAAA;IACpC,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,YAAY,EAAE,CAAC,CAAA;IAClD,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,YAAY,EAAE,CAAC,CAAC,CAAA;CACjE,CAAA;AAsBD;;;;;;;GAOG;AACH,wBAAgB,yBAAyB,CAAC,WAAW,EAAE,WAAW,EAAE,EAAE,cAAc,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,eAAe,CA0ElH"}
@@ -33,18 +33,22 @@ export function analyzeServerDistribution(serverUsage, allUniquePaths) {
33
33
  if (serverUsage.length === 0) {
34
34
  return placement;
35
35
  }
36
- // Build a map: serverUrl -> Set<operationKey>
36
+ // Build a map: serverKey -> { server, operations }
37
37
  // Using string keys instead of objects because JavaScript Sets compare by reference
38
38
  const serverMap = new Map();
39
39
  for (const usage of serverUsage) {
40
- if (!serverMap.has(usage.serverUrl)) {
41
- serverMap.set(usage.serverUrl, new Set());
40
+ const serverObject = usage.server ?? { url: usage.serverUrl };
41
+ const serverKey = JSON.stringify(serverObject);
42
+ if (!serverMap.has(serverKey)) {
43
+ serverMap.set(serverKey, {
44
+ server: serverObject,
45
+ operations: new Set(),
46
+ });
42
47
  }
43
- serverMap.get(usage.serverUrl).add(createOperationKey(usage.path, usage.method));
48
+ serverMap.get(serverKey).operations.add(createOperationKey(usage.path, usage.method));
44
49
  }
45
50
  // For each server, determine its placement
46
- for (const [serverUrl, operationKeys] of serverMap.entries()) {
47
- const serverObject = { url: serverUrl };
51
+ for (const { server: serverObject, operations: operationKeys } of serverMap.values()) {
48
52
  // Parse operation keys back to path/method pairs
49
53
  const operations = Array.from(operationKeys).map(parseOperationKey);
50
54
  // Count unique paths this server appears in
@@ -1,3 +1,4 @@
1
+ import type { OpenAPIV3_1 } from '@scalar/openapi-types';
1
2
  /**
2
3
  * Extracts the domain (including protocol and port if present) from a given URL.
3
4
  */
@@ -11,6 +12,20 @@ export declare function extractPathFromUrl(url: string | undefined): string;
11
12
  * e.g., '/users/:id' becomes '/users/{id}'
12
13
  */
13
14
  export declare const normalizePath: (path: string) => string;
15
+ type CollectionVariableLookup = ReadonlyMap<string, string>;
16
+ /**
17
+ * Extracts Postman collection variables into a lookup table.
18
+ */
19
+ export declare function createCollectionVariableLookup(variables: ReadonlyArray<{
20
+ key?: string;
21
+ value?: string | number | boolean;
22
+ disabled?: boolean;
23
+ }> | undefined): ReadonlyMap<string, string>;
24
+ /**
25
+ * Generates a structural path signature by replacing parameter segments with `{*}`.
26
+ * Paths with the same signature are equivalent except for parameter names.
27
+ */
28
+ export declare const getPathStructuralSignature: (path: string) => string;
14
29
  /**
15
30
  * Extracts parameter names from a path string.
16
31
  * Handles double curly braces {{param}}, single curly braces {param}, and colon format :param.
@@ -22,4 +37,9 @@ export declare function extractPathParameterNames(path: string): string[];
22
37
  * Returns undefined if no valid server URL can be extracted.
23
38
  */
24
39
  export declare function extractServerFromUrl(url: string | undefined): string | undefined;
40
+ /**
41
+ * Extracts the server object from a request URL and resolves Postman templates.
42
+ */
43
+ export declare function extractServerObjectFromUrl(url: string | undefined, collectionVariableLookup?: CollectionVariableLookup): OpenAPIV3_1.ServerObject | undefined;
44
+ export {};
25
45
  //# sourceMappingURL=urls.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"urls.d.ts","sourceRoot":"","sources":["../../src/helpers/urls.ts"],"names":[],"mappings":"AAgBA;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAGpD;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAYlE;AAED;;;GAGG;AACH,eAAO,MAAM,aAAa,GAAI,MAAM,MAAM,KAAG,MAAyC,CAAA;AAEtF;;;GAGG;AACH,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAahE;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAyBhF"}
1
+ {"version":3,"file":"urls.d.ts","sourceRoot":"","sources":["../../src/helpers/urls.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAA;AAoBxD;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAGpD;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAYlE;AAED;;;GAGG;AACH,eAAO,MAAM,aAAa,GAAI,MAAM,MAAM,KAAG,MAAyC,CAAA;AAEtF,KAAK,wBAAwB,GAAG,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;AA8B3D;;GAEG;AACH,wBAAgB,8BAA8B,CAC5C,SAAS,EAAE,aAAa,CAAC;IAAE,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;IAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC,GAAG,SAAS,GAC5G,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAU7B;AAED;;;GAGG;AACH,eAAO,MAAM,0BAA0B,GAAI,MAAM,MAAM,KAAG,MAWzD,CAAA;AAED;;;GAGG;AACH,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAahE;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAEhF;AAED;;GAEG;AACH,wBAAgB,0BAA0B,CACxC,GAAG,EAAE,MAAM,GAAG,SAAS,EACvB,wBAAwB,GAAE,wBAAoC,GAC7D,WAAW,CAAC,YAAY,GAAG,SAAS,CAsEtC"}
@@ -1,4 +1,7 @@
1
1
  import { REGEX } from '@scalar/helpers/regex/regex-helpers';
2
+ const POSTMAN_TEMPLATE_REGEX = /\{\{([^{}]{0,1000})\}\}/g;
3
+ const DEFAULT_SERVER_VARIABLE_VALUE = 'example.com';
4
+ const SERVER_VARIABLE_DESCRIPTION = 'Declared in Postman collection variables.';
2
5
  /**
3
6
  * Parses a URL string into its component parts.
4
7
  */
@@ -27,7 +30,7 @@ export function extractPathFromUrl(url) {
27
30
  // Remove scheme, domain, query parameters, and hash fragments
28
31
  const path = url.replace(/^(?:https?:\/\/)?[^/]+(\/|$)/, '/').split(/[?#]/)[0] ?? '';
29
32
  // Replace Postman variables and ensure single leading slash
30
- const finalPath = ('/' + path.replace(/\{\{([^{}]{0,1000})\}\}/g, '{$1}').replace(/^\/+/, '')).replace(/\/\/+/g, '/');
33
+ const finalPath = ('/' + path.replace(POSTMAN_TEMPLATE_REGEX, '{$1}').replace(/^\/+/, '')).replace(/\/\/+/g, '/');
31
34
  return finalPath;
32
35
  }
33
36
  /**
@@ -35,6 +38,54 @@ export function extractPathFromUrl(url) {
35
38
  * e.g., '/users/:id' becomes '/users/{id}'
36
39
  */
37
40
  export const normalizePath = (path) => path.replace(/:(\w+)/g, '{$1}');
41
+ const isCompleteUrl = (value) => /^(https?:\/\/)/i.test(value);
42
+ const hasPostmanTemplateSyntax = (value) => /\{\{([^{}]{0,1000})\}\}/.test(value);
43
+ const createServerVariableDefinition = () => ({
44
+ default: DEFAULT_SERVER_VARIABLE_VALUE,
45
+ description: SERVER_VARIABLE_DESCRIPTION,
46
+ });
47
+ const extractFullHostTemplateVariableName = (rawServerUrl) => {
48
+ const protocolSeparatorIndex = rawServerUrl.indexOf('://');
49
+ if (protocolSeparatorIndex === -1) {
50
+ return undefined;
51
+ }
52
+ const hostCandidate = rawServerUrl.slice(protocolSeparatorIndex + 3);
53
+ if (!hostCandidate.startsWith('{{') || !hostCandidate.endsWith('}}')) {
54
+ return undefined;
55
+ }
56
+ const variableName = hostCandidate.slice(2, -2).trim();
57
+ if (!variableName || variableName.includes('{') || variableName.includes('}')) {
58
+ return undefined;
59
+ }
60
+ return variableName;
61
+ };
62
+ /**
63
+ * Extracts Postman collection variables into a lookup table.
64
+ */
65
+ export function createCollectionVariableLookup(variables) {
66
+ const variableLookup = new Map();
67
+ for (const variable of variables ?? []) {
68
+ const key = variable.key?.trim();
69
+ if (!key || variable.disabled || variable.value === undefined) {
70
+ continue;
71
+ }
72
+ variableLookup.set(key, String(variable.value));
73
+ }
74
+ return variableLookup;
75
+ }
76
+ /**
77
+ * Generates a structural path signature by replacing parameter segments with `{*}`.
78
+ * Paths with the same signature are equivalent except for parameter names.
79
+ */
80
+ export const getPathStructuralSignature = (path) => {
81
+ const normalizedPath = normalizePath(path);
82
+ if (normalizedPath === '') {
83
+ return '';
84
+ }
85
+ const segments = normalizedPath.split('/');
86
+ const signatureSegments = segments.map((segment) => (/^\{[^{}]+\}$/.test(segment) ? '{*}' : segment));
87
+ return signatureSegments.join('/');
88
+ };
38
89
  /**
39
90
  * Extracts parameter names from a path string.
40
91
  * Handles double curly braces {{param}}, single curly braces {param}, and colon format :param.
@@ -57,6 +108,12 @@ export function extractPathParameterNames(path) {
57
108
  * Returns undefined if no valid server URL can be extracted.
58
109
  */
59
110
  export function extractServerFromUrl(url) {
111
+ return extractServerObjectFromUrl(url)?.url;
112
+ }
113
+ /**
114
+ * Extracts the server object from a request URL and resolves Postman templates.
115
+ */
116
+ export function extractServerObjectFromUrl(url, collectionVariableLookup = new Map()) {
60
117
  if (!url) {
61
118
  return undefined;
62
119
  }
@@ -71,8 +128,49 @@ export function extractServerFromUrl(url) {
71
128
  }
72
129
  const hostPart = urlMatch[1];
73
130
  // Preserve the original protocol if present, otherwise default to https
74
- const serverUrl = protocol ? `${protocol}${hostPart}`.replace(/\/$/, '') : `https://${hostPart}`.replace(/\/$/, '');
75
- return serverUrl;
131
+ const rawServerUrl = protocol
132
+ ? `${protocol}${hostPart}`.replace(/\/$/, '')
133
+ : `https://${hostPart}`.replace(/\/$/, '');
134
+ const templateMatches = Array.from(rawServerUrl.matchAll(POSTMAN_TEMPLATE_REGEX));
135
+ if (templateMatches.length === 0) {
136
+ return { url: rawServerUrl };
137
+ }
138
+ const unresolvedVariables = new Set();
139
+ const fullHostTemplateVariableName = extractFullHostTemplateVariableName(rawServerUrl);
140
+ if (fullHostTemplateVariableName) {
141
+ const variableName = fullHostTemplateVariableName;
142
+ const variableValue = collectionVariableLookup.get(variableName);
143
+ if (!variableValue || hasPostmanTemplateSyntax(variableValue)) {
144
+ unresolvedVariables.add(variableName);
145
+ }
146
+ else if (isCompleteUrl(variableValue)) {
147
+ return { url: variableValue.replace(/\/$/, '') };
148
+ }
149
+ }
150
+ const resolvedUrl = rawServerUrl.replace(POSTMAN_TEMPLATE_REGEX, (_, rawName) => {
151
+ const variableName = rawName.trim();
152
+ const variableValue = collectionVariableLookup.get(variableName);
153
+ if (!variableValue || hasPostmanTemplateSyntax(variableValue)) {
154
+ unresolvedVariables.add(variableName);
155
+ return `{${variableName}}`;
156
+ }
157
+ if (isCompleteUrl(variableValue)) {
158
+ unresolvedVariables.add(variableName);
159
+ return `{${variableName}}`;
160
+ }
161
+ return variableValue;
162
+ });
163
+ if (unresolvedVariables.size > 0) {
164
+ const variables = {};
165
+ for (const variableName of unresolvedVariables) {
166
+ variables[variableName] = createServerVariableDefinition();
167
+ }
168
+ return {
169
+ url: resolvedUrl,
170
+ variables,
171
+ };
172
+ }
173
+ return { url: resolvedUrl.replace(/\/$/, '') };
76
174
  }
77
175
  catch (error) {
78
176
  console.error(`Error extracting server from URL "${url}":`, error);
package/dist/index.d.ts CHANGED
@@ -1,3 +1,4 @@
1
- export { type ConvertOptions, type PostmanRequestIndexPath, convert } from './convert.js';
1
+ export { type ConvertOptions, convert, type PostmanRequestIndexPath, type TagNamingStrategy } from './convert.js';
2
+ export { isPostmanCollection } from './is-postman-collection.js';
2
3
  export { extractPathFromUrl, normalizePath } from './helpers/urls.js';
3
4
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,cAAc,EAAE,KAAK,uBAAuB,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACtF,OAAO,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,cAAc,EAAE,OAAO,EAAE,KAAK,uBAAuB,EAAE,KAAK,iBAAiB,EAAE,MAAM,WAAW,CAAA;AAC9G,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAA;AAC7D,OAAO,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAA"}
package/dist/index.js CHANGED
@@ -1,2 +1,3 @@
1
1
  export { convert } from './convert.js';
2
+ export { isPostmanCollection } from './is-postman-collection.js';
2
3
  export { extractPathFromUrl, normalizePath } from './helpers/urls.js';
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Checks whether a JSON string looks like a Postman collection.
3
+ *
4
+ * Exported collections are not guaranteed to include `_postman_id`,
5
+ * so we accept either `_postman_id` or a top-level `item` array,
6
+ * as long as the schema host matches Postman.
7
+ */
8
+ export declare const isPostmanCollection: (content: string) => boolean;
9
+ //# sourceMappingURL=is-postman-collection.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"is-postman-collection.d.ts","sourceRoot":"","sources":["../src/is-postman-collection.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,eAAO,MAAM,mBAAmB,GAAI,SAAS,MAAM,KAAG,OAiBrD,CAAA"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Checks whether a JSON string looks like a Postman collection.
3
+ *
4
+ * Exported collections are not guaranteed to include `_postman_id`,
5
+ * so we accept either `_postman_id` or a top-level `item` array,
6
+ * as long as the schema host matches Postman.
7
+ */
8
+ export const isPostmanCollection = (content) => {
9
+ try {
10
+ const parsed = JSON.parse(content);
11
+ if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) {
12
+ return false;
13
+ }
14
+ const hasPostmanId = parsed.info?._postman_id !== undefined;
15
+ const hasItemTree = Array.isArray(parsed.item);
16
+ const schema = parsed.info?.schema;
17
+ const hasValidSchema = typeof schema === 'string' && new URL(schema).host === 'schema.getpostman.com';
18
+ return hasValidSchema && (hasPostmanId || hasItemTree);
19
+ }
20
+ catch {
21
+ return false;
22
+ }
23
+ };
package/dist/types.d.ts CHANGED
@@ -189,6 +189,7 @@ export type FormParameter = {
189
189
  };
190
190
  export type Response = {
191
191
  id?: string;
192
+ name?: string;
192
193
  originalRequest?: Request;
193
194
  responseTime?: string | number | null;
194
195
  timings?: object | null;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -19,7 +19,7 @@
19
19
  "export",
20
20
  "scalar"
21
21
  ],
22
- "version": "0.6.2",
22
+ "version": "0.7.0",
23
23
  "engines": {
24
24
  "node": ">=22"
25
25
  },
@@ -38,16 +38,17 @@
38
38
  "CHANGELOG.md"
39
39
  ],
40
40
  "dependencies": {
41
- "@scalar/helpers": "0.5.0",
42
- "@scalar/openapi-types": "0.7.0"
41
+ "@scalar/helpers": "0.5.1",
42
+ "@scalar/openapi-types": "0.8.0"
43
43
  },
44
44
  "devDependencies": {
45
45
  "@types/node": "^24.1.0",
46
- "vite": "8.0.0"
46
+ "vite": "8.0.0",
47
+ "@scalar/openapi-parser": "0.25.11"
47
48
  },
48
49
  "scripts": {
49
50
  "build": "tsc -p tsconfig.build.json && tsc-alias -p tsconfig.build.json",
50
- "generate:textures": "tsx ./scripts/generate-textures.ts",
51
+ "evaluate": "tsx ./scripts/evaluate/run.ts",
51
52
  "test": "vitest --run",
52
53
  "types:check": "tsc --noEmit"
53
54
  }