@usebruno/converters
Version:
The converters package is responsible for converting collections from one format to a Bruno collection. It can be used as a standalone package or as a part of the Bruno framework.
228 lines (194 loc) • 6 kB
text/typescript
import { uuid } from '../../common/index.js';
import type {
HttpRequestBody,
RawBody,
FormUrlEncodedBody,
FormUrlEncodedEntry,
MultipartFormBody,
MultipartFormEntry,
FileBody,
FileBodyVariant,
GraphQLBody,
BrunoHttpRequestBody,
BrunoKeyValue,
BrunoMultipartFormEntry,
BrunoFileEntry,
BrunoGraphqlBody
} from '../types';
export const fromOpenCollectionBody = (body: HttpRequestBody | GraphQLBody | undefined, requestType: string = 'http'): BrunoHttpRequestBody => {
const defaultBody: BrunoHttpRequestBody = {
mode: 'none',
json: null,
text: null,
xml: null,
sparql: null,
formUrlEncoded: [],
multipartForm: [],
graphql: null,
file: []
};
if (!body) {
return defaultBody;
}
if (requestType === 'graphql') {
const gqlBody = body as GraphQLBody;
return {
...defaultBody,
mode: 'graphql',
graphql: {
query: gqlBody.query || '',
variables: gqlBody.variables || ''
}
};
}
const httpBody = body as HttpRequestBody;
if ('type' in httpBody) {
switch (httpBody.type) {
case 'json': {
const rawBody = httpBody as RawBody;
return {
...defaultBody,
mode: 'json',
json: rawBody.data || ''
};
}
case 'text': {
const rawBody = httpBody as RawBody;
return {
...defaultBody,
mode: 'text',
text: rawBody.data || ''
};
}
case 'xml': {
const rawBody = httpBody as RawBody;
return {
...defaultBody,
mode: 'xml',
xml: rawBody.data || ''
};
}
case 'sparql': {
const rawBody = httpBody as RawBody;
return {
...defaultBody,
mode: 'sparql',
sparql: rawBody.data || ''
};
}
case 'form-urlencoded': {
const formBody = httpBody as FormUrlEncodedBody;
return {
...defaultBody,
mode: 'formUrlEncoded',
formUrlEncoded: (formBody.data || []).map((field): BrunoKeyValue => ({
uid: uuid(),
name: field.name || '',
value: field.value || '',
description: typeof field.description === 'string' ? field.description : field.description?.content || null,
enabled: field.disabled !== true
}))
};
}
case 'multipart-form': {
const multipartBody = httpBody as MultipartFormBody;
return {
...defaultBody,
mode: 'multipartForm',
multipartForm: (multipartBody.data || []).map((field): BrunoMultipartFormEntry => ({
uid: uuid(),
type: field.type || 'text',
name: field.name || '',
value: Array.isArray(field.value) ? field.value : (field.value || ''),
description: typeof field.description === 'string' ? field.description : field.description?.content || null,
contentType: null,
enabled: field.disabled !== true
}))
};
}
case 'file': {
const fileBody = httpBody as FileBody;
return {
...defaultBody,
mode: 'file',
file: (fileBody.data || []).map((file): BrunoFileEntry => ({
uid: uuid(),
filePath: file.filePath || '',
contentType: file.contentType || '',
selected: file.selected !== false
}))
};
}
}
}
return defaultBody;
};
export const toOpenCollectionBody = (body: BrunoHttpRequestBody | null | undefined): HttpRequestBody | undefined => {
if (!body || body.mode === 'none') {
return undefined;
}
switch (body.mode) {
case 'json':
return { type: 'json', data: body.json || '' };
case 'text':
return { type: 'text', data: body.text || '' };
case 'xml':
return { type: 'xml', data: body.xml || '' };
case 'sparql':
return { type: 'sparql', data: body.sparql || '' };
case 'formUrlEncoded': {
const formData: FormUrlEncodedEntry[] = (body.formUrlEncoded || []).map((field): FormUrlEncodedEntry => {
const entry: FormUrlEncodedEntry = {
name: field.name || '',
value: field.value || ''
};
if (field.description && typeof field.description === 'string' && field.description.trim().length) {
entry.description = field.description;
}
if (field.enabled === false) {
entry.disabled = true;
}
return entry;
});
return { type: 'form-urlencoded', data: formData };
}
case 'multipartForm': {
const multipartData: MultipartFormEntry[] = (body.multipartForm || []).map((field): MultipartFormEntry => {
const entry: MultipartFormEntry = {
name: field.name || '',
type: field.type || 'text',
value: field.value || ''
};
if (field.description && typeof field.description === 'string' && field.description.trim().length) {
entry.description = field.description;
}
if (field.enabled === false) {
entry.disabled = true;
}
return entry;
});
return { type: 'multipart-form', data: multipartData };
}
case 'file': {
const fileData: FileBodyVariant[] = (body.file || []).map((file): FileBodyVariant => ({
filePath: file.filePath || '',
contentType: file.contentType || '',
selected: file.selected !== false
}));
return { type: 'file', data: fileData };
}
case 'graphql':
return undefined;
default:
return undefined;
}
};
export const toOpenCollectionGraphqlBody = (body: BrunoHttpRequestBody | null | undefined): GraphQLBody | undefined => {
if (!body || body.mode !== 'graphql' || !body.graphql) {
return undefined;
}
return {
query: body.graphql.query || '',
variables: body.graphql.variables || ''
};
};