ponder-client
Version:
Type-safe, lightweight Ponder client
122 lines • 3.65 kB
JavaScript
function many(table) {
// eslint-disable-next-line @typescript-eslint/explicit-function-return-type
return function (filter, columns, pagination) {
return {
type: 'many',
table,
filter,
columns,
pagination,
};
};
}
function one(table) {
// eslint-disable-next-line @typescript-eslint/explicit-function-return-type
return function (filter, columns) {
return {
type: 'one',
table,
filter,
columns,
pagination: {},
};
};
}
function serializeTableName(tableName) {
const tableNameString = String(tableName);
return tableNameString.charAt(0).toLowerCase() + tableNameString.slice(1);
}
function serializeWhereFilterValue(value) {
switch (typeof value) {
case 'string':
return `"${value}"`;
case 'number':
return `${value}`;
case 'bigint':
return `"${value.toString()}"`;
case 'boolean':
return `${value}`;
default:
throw new Error(`Unsupported type: ${typeof value}`);
}
}
// eslint-disable-next-line @typescript-eslint/explicit-function-return-type
function serializeWhereFilter(where) {
const filterString = Object.entries(where)
.filter(([, v]) => v !== undefined)
.map(([k, v]) => `${k}: ${serializeWhereFilterValue(v)}`)
.join(', ');
return `{ ${filterString} }`;
}
function serializePart(name, part) {
switch (part.type) {
case 'many':
return `
${String(name)}: ${serializeTableName(part.table)}s(
${part.filter.limit ? `limit: ${part.filter.limit}` : ''}
${part.filter.orderBy
? `orderBy: "${String(part.filter.orderBy)}"`
: ''}
${part.filter.orderDirection
? `orderDirection: "${part.filter.orderDirection}"`
: ''}
${part.filter.before ? `before: "${part.filter.before}"` : ''}
${part.filter.after ? `after: "${part.filter.after}"` : ''}
${part.filter.where
? `where: ${serializeWhereFilter(part.filter.where)}`
: ''}
) {
items {
${Object.entries(part.columns)
.filter(([, v]) => v)
.map(([k]) => `${k}`)
.join('\n')}
}
pageInfo {
${Object.entries(part.pagination)
.filter(([, v]) => v)
.map(([k]) => `${k}`)
.join('\n')}
}
}
`;
case 'one':
return `
${String(name)}: ${serializeTableName(part.table)}(
id: "${part.filter.id}"
) {
${Object.entries(part.columns)
.filter(([, v]) => v)
.map(([k]) => `${k}`)
.join('\n')}
}
`;
}
}
function serialize(q) {
const qString = `{
${Object.entries(q)
.map(([name, part]) => {
const partName = name;
return serializePart(partName, part);
})
.join('\n')}
}`;
return qString;
}
// eslint-disable-next-line @typescript-eslint/explicit-function-return-type
async function query(endpoint, q) {
const res = await fetch(endpoint, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
query: serialize(q),
}),
});
const json = (await res.json());
return json.data;
}
export { one, many, query };
//# sourceMappingURL=index.js.map