@lokalise/api-contracts
Version:
Key idea behind API contracts: backend owns entire definition for the route, including its path, HTTP method used and response structure expectations, and exposes it as a part of its API schemas. Then frontend consumes that definition instead of forming f
76 lines • 3.27 kB
JavaScript
const EMPTY_PARAMS = {};
export function buildPayloadRoute(params) {
return {
isEmptyResponseExpected: params.isEmptyResponseExpected ?? false,
isNonJSONResponseExpected: params.isNonJSONResponseExpected ?? false,
method: params.method,
pathResolver: params.pathResolver,
requestBodySchema: params.requestBodySchema,
requestHeaderSchema: params.requestHeaderSchema,
responseHeaderSchema: params.responseHeaderSchema,
requestPathParamsSchema: params.requestPathParamsSchema,
requestQuerySchema: params.requestQuerySchema,
successResponseBodySchema: params.successResponseBodySchema,
description: params.description,
summary: params.summary,
responseSchemasByStatusCode: params.responseSchemasByStatusCode,
metadata: params.metadata,
tags: params.tags,
};
}
export function buildGetRoute(params) {
return {
isEmptyResponseExpected: params.isEmptyResponseExpected ?? false,
isNonJSONResponseExpected: params.isNonJSONResponseExpected ?? false,
method: 'get',
pathResolver: params.pathResolver,
requestHeaderSchema: params.requestHeaderSchema,
responseHeaderSchema: params.responseHeaderSchema,
requestPathParamsSchema: params.requestPathParamsSchema,
requestQuerySchema: params.requestQuerySchema,
successResponseBodySchema: params.successResponseBodySchema,
description: params.description,
summary: params.summary,
responseSchemasByStatusCode: params.responseSchemasByStatusCode,
metadata: params.metadata,
tags: params.tags,
};
}
export function buildDeleteRoute(params) {
return {
isEmptyResponseExpected: params.isEmptyResponseExpected ?? true,
isNonJSONResponseExpected: params.isNonJSONResponseExpected ?? false,
method: 'delete',
pathResolver: params.pathResolver,
requestHeaderSchema: params.requestHeaderSchema,
responseHeaderSchema: params.responseHeaderSchema,
requestPathParamsSchema: params.requestPathParamsSchema,
requestQuerySchema: params.requestQuerySchema,
successResponseBodySchema: params.successResponseBodySchema,
description: params.description,
summary: params.summary,
responseSchemasByStatusCode: params.responseSchemasByStatusCode,
metadata: params.metadata,
tags: params.tags,
};
}
/**
* This method maps given route definition to a string of the format '/static-path-part/:path-param-value'
*/
export function mapRouteToPath(
// biome-ignore lint/suspicious/noExplicitAny: We don't care about types here, we just need Zod schema
routeDefinition) {
if (!routeDefinition.requestPathParamsSchema) {
return routeDefinition.pathResolver(EMPTY_PARAMS);
}
const shape = routeDefinition.requestPathParamsSchema.shape;
const resolverParams = {};
for (const key of Object.keys(shape)) {
resolverParams[key] = `:${key}`;
}
return routeDefinition.pathResolver(resolverParams);
}
export function describeContract(contract) {
return `${contract.method.toUpperCase()} ${mapRouteToPath(contract)}`;
}
//# sourceMappingURL=apiContracts.js.map