Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -1079,11 +1079,12 @@ export const collectionsSlice = createSlice({
item.draft = cloneDeep(item);
}
const existingOtherParams = item.draft.request.params?.filter((p) => p.type !== 'query') || [];
const newQueryParams = map(params, ({ uid, name = '', value = '', description = '', type = 'query', enabled = true }) => ({
const newQueryParams = map(params, ({ uid, name = '', value = '', description = '', annotations = null, type = 'query', enabled = true }) => ({
uid: uid || uuid(),
name,
value,
description,
annotations,
type,
enabled
}));
Expand Down Expand Up @@ -1325,11 +1326,12 @@ export const collectionsSlice = createSlice({
if (!item.draft) {
item.draft = cloneDeep(item);
}
item.draft.request.headers = map(action.payload.headers, ({ uid, name = '', value = '', description = '', enabled = true }) => ({
item.draft.request.headers = map(action.payload.headers, ({ uid, name = '', value = '', description = '', annotations = null, enabled = true }) => ({
uid: uid || uuid(),
name,
value,
description,
annotations,
enabled
}));
},
Expand All @@ -1353,11 +1355,12 @@ export const collectionsSlice = createSlice({
collection.draft.root.request = {};
}

collection.draft.root.request.headers = map(headers, ({ uid, name = '', value = '', description = '', enabled = true }) => ({
collection.draft.root.request.headers = map(headers, ({ uid, name = '', value = '', description = '', annotations = null, enabled = true }) => ({
uid: uid || uuid(),
name,
value,
description,
annotations,
enabled
}));
},
Expand All @@ -1380,11 +1383,12 @@ export const collectionsSlice = createSlice({
if (!folder.draft.request) {
folder.draft.request = {};
}
folder.draft.request.headers = map(headers, ({ uid, name = '', value = '', description = '', enabled = true }) => ({
folder.draft.request.headers = map(headers, ({ uid, name = '', value = '', description = '', annotations = null, enabled = true }) => ({
uid: uid || uuid(),
name,
value,
description,
annotations,
enabled
}));
},
Expand Down
6 changes: 6 additions & 0 deletions packages/bruno-app/src/utils/collections/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -181,6 +181,7 @@ export const transformCollectionToSaveToExportAsFile = (collection, options = {}
name: header.name,
value: header.value,
description: header.description,
annotations: header.annotations,
enabled: header.enabled
};
});
Expand All @@ -193,6 +194,7 @@ export const transformCollectionToSaveToExportAsFile = (collection, options = {}
name: param.name,
value: param.value,
description: param.description,
annotations: param.annotations,
type: param.type,
enabled: param.enabled
};
Expand Down Expand Up @@ -745,6 +747,7 @@ export const transformRequestToSaveToFilesystem = (item) => {
name: param.name,
value: param.value,
description: param.description,
annotations: param.annotations,
type: param.type,
enabled: param.enabled
});
Expand All @@ -757,6 +760,7 @@ export const transformRequestToSaveToFilesystem = (item) => {
name: header.name,
value: header.value,
description: header.description,
annotations: header.annotations,
enabled: header.enabled
});
});
Expand Down Expand Up @@ -813,6 +817,7 @@ export const transformCollectionRootToSave = (collection) => {
name: header.name,
value: header.value,
description: header.description,
annotations: header.annotations,
enabled: header.enabled
});
});
Expand Down Expand Up @@ -843,6 +848,7 @@ export const transformFolderRootToSave = (folder) => {
name: header.name,
value: header.value,
description: header.description,
annotations: header.annotations,
enabled: header.enabled
});
});
Expand Down
53 changes: 52 additions & 1 deletion packages/bruno-app/src/utils/collections/index.spec.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
const { describe, it, expect } = require('@jest/globals');
import { mergeHeaders } from './index';
import { mergeHeaders, transformRequestToSaveToFilesystem } from './index';

describe('mergeHeaders', () => {
it('should include headers from collection, folder and request (with correct precedence)', () => {
Expand Down Expand Up @@ -35,3 +35,54 @@ describe('mergeHeaders', () => {
expect(names).toEqual(expect.arrayContaining(['X-Collection', 'X-Folder', 'X-Request']));
});
});

describe('transformRequestToSaveToFilesystem', () => {
it('preserves header and param annotations', () => {
const item = {
uid: 'requestuid123456789012',
type: 'http-request',
name: 'Annotated Request',
seq: 1,
settings: {},
tags: [],
examples: [],
request: {
method: 'GET',
url: 'https://example.com',
params: [
{
uid: 'paramuid1234567890123',
name: 'q',
value: '1',
description: '',
annotations: [{ name: 'param-note', value: 'keep me' }],
type: 'query',
enabled: true
}
],
headers: [
{
uid: 'headeruid123456789012',
name: 'X-Test',
value: '1',
description: '',
annotations: [{ name: 'header-note', value: 'keep me' }],
enabled: true
}
],
auth: { mode: 'none' },
body: { mode: 'none' },
script: { req: '', res: '' },
vars: { req: [], res: [] },
assertions: [],
tests: '',
docs: ''
}
};

const transformed = transformRequestToSaveToFilesystem(item);

expect(transformed.request.params[0].annotations).toEqual([{ name: 'param-note', value: 'keep me' }]);
expect(transformed.request.headers[0].annotations).toEqual([{ name: 'header-note', value: 'keep me' }]);
});
});
2 changes: 2 additions & 0 deletions packages/bruno-electron/src/utils/collection.js
Original file line number Diff line number Diff line change
Expand Up @@ -645,6 +645,7 @@ const transformRequestToSaveToFilesystem = (item) => {
name: param.name,
value: param.value,
description: param.description,
annotations: param.annotations,
type: param.type,
enabled: param.enabled
});
Expand All @@ -657,6 +658,7 @@ const transformRequestToSaveToFilesystem = (item) => {
name: header.name,
value: header.value,
description: header.description,
annotations: header.annotations,
enabled: header.enabled
});
});
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ describe('transformRequestToSaveToFilesystem', () => {
name: 'param1',
value: 'value1',
description: 'Test parameter',
annotations: [{ name: 'note', value: 'param annotation' }],
type: 'text',
enabled: true
}
Expand All @@ -30,6 +31,7 @@ describe('transformRequestToSaveToFilesystem', () => {
name: 'Content-Type',
value: 'application/json',
description: 'Request content type',
annotations: [{ name: 'note', value: 'header annotation' }],
enabled: true
}
],
Expand Down Expand Up @@ -101,6 +103,7 @@ describe('transformRequestToSaveToFilesystem', () => {
name: 'param1',
value: 'value1',
description: 'Test parameter',
annotations: [{ name: 'note', value: 'param annotation' }],
type: 'text',
enabled: true
});
Expand All @@ -112,6 +115,7 @@ describe('transformRequestToSaveToFilesystem', () => {
name: 'Content-Type',
value: 'application/json',
description: 'Request content type',
annotations: [{ name: 'note', value: 'header annotation' }],
enabled: true
});
});
Expand Down
3 changes: 2 additions & 1 deletion packages/bruno-schema-types/src/collection/environment.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import type { UID } from '../common';
import type { UID, Annotation } from '../common';

export interface EnvironmentVariable {
uid: UID;
Expand All @@ -7,6 +7,7 @@ export interface EnvironmentVariable {
type: 'text';
enabled?: boolean;
secret?: boolean;
annotations?: Annotation[] | null;
}

export interface Environment {
Expand Down
7 changes: 7 additions & 0 deletions packages/bruno-schema-types/src/common/annotation.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
/**
* Annotation applied to pairs (headers, vars, params, etc.)
*/
export interface Annotation {
name: string;
value?: string | null;
}
1 change: 1 addition & 0 deletions packages/bruno-schema-types/src/common/index.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
export type { UID } from './uid';
export type { KeyValue } from './key-value';
export type { Variable, Variables } from './variables';
export type { Annotation } from './annotation';
export type { MultipartFormEntry, MultipartForm } from './multipart-form';
export type { FileEntry, FileList } from './file';
Comment on lines 1 to 6
export type { GraphqlBody } from './graphql';
Expand Down
2 changes: 2 additions & 0 deletions packages/bruno-schema-types/src/common/key-value.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import { Annotation } from './annotation';
import type { UID } from './uid';

/**
Expand All @@ -9,4 +10,5 @@ export interface KeyValue {
value?: string | null;
description?: string | null;
enabled?: boolean;
annotations?: Annotation[] | null;
}
2 changes: 2 additions & 0 deletions packages/bruno-schema-types/src/common/variables.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import { Annotation } from './annotation';
import type { UID } from './uid';

/**
Expand All @@ -10,6 +11,7 @@ export interface Variable {
description?: string | null;
enabled?: boolean;
local?: boolean;
annotations?: Annotation[] | null;
}

export type Variables = Variable[] | null;
53 changes: 53 additions & 0 deletions packages/bruno-schema/src/collections/annotationsSchema.spec.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
const { itemSchema, environmentSchema, collectionSchema } = require('./index');

describe('annotation acceptance', () => {
test('itemSchema accepts annotations on headers and params', async () => {
Comment on lines +1 to +4
const item = {
uid: 'aaaaaaaaaaaaaaaaaaaaa',
type: 'http-request',
name: 'Req',
request: {
url: 'https://example.com',
method: 'GET',
headers: [
{ uid: 'bbbbbbbbbbbbbbbbbbbbb', name: 'X-Test', value: '1', annotations: [{ name: 'note', value: 'header note' }] }
],
params: [
{ uid: 'ccccccccccccccccccccc', name: 'q', value: '1', type: 'query', annotations: [{ name: 'hint' }] }
],
},
};

await expect(itemSchema.validate(item)).resolves.toBeTruthy();
});

test('environmentSchema accepts annotations on variables', async () => {
const env = {
uid: 'ddddddddddddddddddddd',
name: 'Env',
variables: [
{ uid: 'eeeeeeeeeeeeeeeeeeeee', name: 'API_KEY', value: 'abc', annotations: [{ name: 'secret', value: null }], type: 'text', enabled: true, secret: false }
]
};

await expect(environmentSchema.validate(env)).resolves.toBeTruthy();
});

test('collectionSchema accepts annotations in item vars and items', async () => {
const coll = {
version: '1',
uid: 'fffffffffffffffffffff',
name: 'Coll',
items: [
{
uid: 'ggggggggggggggggggggg',
type: 'http-request',
name: 'Req2',
request: { url: '/path', method: 'POST', headers: [], params: [], vars: { req: [{ uid: 'hhhhhhhhhhhhhhhhhhhhh', name: 'base', value: 'https://example.com', annotations: [{ name: 'base-note' }] }] } }
}
]
};

await expect(collectionSchema.validate(coll)).resolves.toBeTruthy();
});
});
Loading
Loading