@simpleapps-com/augur-api
Version:
TypeScript client library for Augur microservices API endpoints
96 lines • 4.58 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.BaseGetParamsSchema = exports.EdgeCacheParamsSchema = exports.PaginationParamsSchema = exports.PingDataSchema = exports.HealthCheckDataSchema = exports.BaseResponseSchema = void 0;
const zod_1 = require("zod");
// Helper to log normalization warnings in development
const logNormalizationWarning = (message) => {
if (process.env.NODE_ENV !== 'production') {
console.warn(`[augur-api] Response normalization: ${message}`);
}
};
// Helper to normalize count field
const normalizeCount = (count, actualDataLength) => {
if (count === 0 && actualDataLength > 0) {
logNormalizationWarning(`'count' was 0 but data has ${actualDataLength} items`);
return actualDataLength;
}
return count;
};
// Helper to normalize total/totalResults bidirectional sync
const normalizeTotals = (total, totalResults) => {
if (total === 0 && totalResults > 0) {
logNormalizationWarning(`'total' was 0 but 'totalResults' is ${totalResults}`);
return { total: totalResults, totalResults };
}
if (totalResults === 0 && total > 0) {
logNormalizationWarning(`'totalResults' was 0 but 'total' is ${total}`);
return { total, totalResults: total };
}
return { total, totalResults };
};
const BaseResponseSchema = (dataSchema) => zod_1.z
.object({
count: zod_1.z.number(), // Required - Number of items in current response (NOTE: may be inconsistent during API refactoring)
data: dataSchema, // Required - The actual response data
message: zod_1.z.string(), // Required - Response message
// oneOf format to handle PHP JSON encoding quirk: empty arrays become objects {}
options: zod_1.z.union([
zod_1.z.array(zod_1.z.unknown()), // Preferred new format - always arrays
zod_1.z.record(zod_1.z.unknown()), // Legacy PHP format - empty arrays become objects
]), // Required - Additional options (supports both array and object formats during transition)
params: zod_1.z.union([
zod_1.z.array(zod_1.z.unknown()), // Preferred new format - always arrays
zod_1.z.record(zod_1.z.unknown()), // Legacy PHP format - empty arrays become objects
]), // Required - Parameters used in request (supports both array and object formats during transition)
status: zod_1.z.number(), // Required - HTTP status code
total: zod_1.z.number(), // Required - Synced bidirectionally with totalResults
totalResults: zod_1.z.number(), // Required - Synced bidirectionally with total
})
.transform(data => {
// During API refactoring, metadata fields may be inconsistent
// We normalize them based on the actual data and bidirectional sync
if (!Array.isArray(data.data)) {
return data;
}
const count = normalizeCount(data.count, data.data.length);
const { total, totalResults } = normalizeTotals(data.total, data.totalResults);
return { ...data, count, total, totalResults };
});
exports.BaseResponseSchema = BaseResponseSchema;
// Standard health check data schema - same across all microservices
exports.HealthCheckDataSchema = zod_1.z.object({
siteHash: zod_1.z.string(),
siteId: zod_1.z.string(),
});
// Standard ping data schema - same across all microservices
exports.PingDataSchema = zod_1.z.literal('pong');
// Common pagination parameters
// Note: HTTP query parameters are always strings, so we use coercion for numbers
exports.PaginationParamsSchema = zod_1.z.object({
limit: zod_1.z.coerce.number().optional(),
offset: zod_1.z.coerce.number().optional(),
});
// Edge cache duration parameter - supported values for Cloudflare cache rules
// Note: HTTP query parameters are always strings, but we also accept numbers for JavaScript usage
exports.EdgeCacheParamsSchema = zod_1.z.object({
edgeCache: zod_1.z
.union([
zod_1.z.literal(1),
zod_1.z.literal(2),
zod_1.z.literal(3),
zod_1.z.literal(4),
zod_1.z.literal(5),
zod_1.z.literal(8), // numbers
zod_1.z.literal('1'),
zod_1.z.literal('2'),
zod_1.z.literal('3'),
zod_1.z.literal('4'),
zod_1.z.literal('5'),
zod_1.z.literal('8'), // strings
])
.transform(val => (typeof val === 'string' ? parseInt(val) : val))
.optional(),
});
// Combined base parameters for GET requests (includes pagination and caching)
exports.BaseGetParamsSchema = exports.PaginationParamsSchema.merge(exports.EdgeCacheParamsSchema);
//# sourceMappingURL=schemas.js.map