feat: support newer Postman export format with collection envelope (#8038)

- Updated the Postman collection importer to handle collections wrapped in a { collection: { ... } } format.
- Enhanced the parsing logic to extract collection info correctly from both legacy and newer formats.
- Added a new test case for importing a Postman v2.1 collection with the wrapped format to ensure compatibility.
This commit is contained in:
sanish chirayath
2026-05-19 19:57:44 +05:30
committed by GitHub
parent 8cc3a670c6
commit 454b43942c
5 changed files with 99 additions and 3 deletions

View File

@@ -23,7 +23,8 @@ const postmanToBruno = (collection) => {
};
const isPostmanCollection = (data) => {
const info = data.info;
// Newer Postman exports wrap the collection in a { collection: { ... } } envelope
const info = data.info || data?.collection?.info;
if (!info || typeof info !== 'object') {
return false;
}

View File

@@ -950,7 +950,10 @@ const importPostmanV2Collection = async (collection, { useWorkers = false }) =>
const parsePostmanCollection = async (collection, { useWorkers = false }) => {
try {
let schema = get(collection, 'info.schema');
// Newer Postman exports wrap the collection in a { collection: { ... } } envelope
const parsedCollection = collection.collection?.info ? collection.collection : collection;
let schema = get(parsedCollection, 'info.schema');
let v2Schemas = [
'https://schema.getpostman.com/json/collection/v2.0.0/collection.json',
@@ -960,7 +963,7 @@ const parsePostmanCollection = async (collection, { useWorkers = false }) => {
];
if (v2Schemas.includes(schema)) {
return await importPostmanV2Collection(collection, { useWorkers });
return await importPostmanV2Collection(parsedCollection, { useWorkers });
}
throw new Error('Unsupported Postman schema version. Only Postman Collection v2.0 and v2.1 are supported.');

View File

@@ -1120,6 +1120,15 @@ describe('postman-collection', () => {
expect(headers[1].value).toBe('example.com');
});
it('should unwrap and import a Postman collection with { collection: { ... } } envelope', async () => {
const wrappedCollection = {
collection: { ...postmanCollection }
};
const brunoCollection = await postmanToBruno(wrappedCollection);
expect(brunoCollection).toMatchObject(expectedOutput);
});
it('should handle string headers with no value', async () => {
const collectionWithNoValueHeader = {
info: {

View File

@@ -0,0 +1,66 @@
{
"collection": {
"info": {
"name": "Postman v2.1 Wrapped Collection",
"description": "Test collection using newer Postman export format with collection envelope",
"schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json",
"_postman_id": "beaf4d12-a72a-47cb-902d-2942a68a59c4"
},
"item": [
{
"name": "Get Users",
"request": {
"method": "GET",
"header": [
{
"key": "Authorization",
"value": "Bearer {{token}}",
"type": "text"
}
],
"url": {
"raw": "{{baseUrl}}/users",
"host": ["{{baseUrl}}"],
"path": ["users"],
"query": [
{
"key": "page",
"value": "1"
}
]
}
},
"response": []
},
{
"name": "Create User",
"request": {
"method": "POST",
"header": [
{
"key": "Content-Type",
"value": "application/json",
"type": "text"
}
],
"body": {
"mode": "raw",
"raw": "{\n \"name\": \"John Doe\",\n \"email\": \"john@example.com\"\n}"
},
"url": {
"raw": "{{baseUrl}}/users",
"host": ["{{baseUrl}}"],
"path": ["users"]
}
},
"response": []
}
],
"variable": [
{
"key": "baseUrl",
"value": "https://api.example.com"
}
]
}
}

View File

@@ -0,0 +1,17 @@
import { test } from '../../../playwright';
import * as path from 'path';
import { closeAllCollections, importCollection } from '../../utils/page';
test.describe('Import Postman Collection v2.1 (wrapped format)', () => {
test.afterEach(async ({ page }) => {
await closeAllCollections(page);
});
test('Import Postman Collection v2.1 with collection envelope successfully', async ({ page, createTmpDir }) => {
const postmanFile = path.resolve(__dirname, 'fixtures', 'postman-v21-wrapped.json');
await importCollection(page, postmanFile, await createTmpDir('postman-v21-wrapped-test'), {
expectedCollectionName: 'Postman v2.1 Wrapped Collection'
});
});
});