UNPKG

@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
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