UNPKG

envio

Version:

A latency and sync speed optimized, developer friendly blockchain data indexer.

425 lines (402 loc) • 13.9 kB
// Generated by ReScript, PLEASE EDIT WITH CARE import * as Table from "./Table.res.mjs"; import * as Stdlib_Array from "@rescript/runtime/lib/es6/Stdlib_Array.js"; import * as Stdlib_JsError from "@rescript/runtime/lib/es6/Stdlib_JsError.js"; import * as Primitive_object from "@rescript/runtime/lib/es6/Primitive_object.js"; function toString(tNonOptional) { if (Array.isArray(tNonOptional)) { return `[` + tNonOptional.map(toString).join(",") + `]`; } switch (typeof tNonOptional) { case "string" : return tNonOptional; case "bigint" : case "number" : return tNonOptional.toString(); case "object" : return tNonOptional.toString(); case "boolean" : if (tNonOptional) { return "true"; } else { return "false"; } } } function toString$1(value) { if (value !== undefined) { return toString(value); } else { return "undefined"; } } function eq(a, b) { if (typeof a === "object" && !Array.isArray(a) && typeof b === "object" && !Array.isArray(b)) { return a.isEqualTo(b); } else { return Primitive_object.equal(a, b); } } function gt(a, b) { if (typeof a === "object" && !Array.isArray(a) && typeof b === "object" && !Array.isArray(b)) { return a.isGreaterThan(b); } else { return Primitive_object.greaterthan(a, b); } } function lt(a, b) { if (typeof a === "object" && !Array.isArray(a) && typeof b === "object" && !Array.isArray(b)) { return a.isLessThan(b); } else { return Primitive_object.lessthan(a, b); } } let FieldValue = { toString: toString$1, eq: eq, gt: gt, lt: lt }; function toString$2(filter) { switch (filter.operator) { case "=" : return filter.fieldName + `:Eq:` + toString$1(filter.fieldValue); case ">" : return filter.fieldName + `:Gt:` + toString$1(filter.fieldValue); case "<" : return filter.fieldName + `:Lt:` + toString$1(filter.fieldValue); case "in" : return filter.fieldName + `:In:[` + filter.fieldValue.map(toString$1).join(",") + `]`; case "and" : return `And(` + filter.filters.map(toString$2).join(",") + `)`; } } function valuesCount(filter) { switch (filter.operator) { case "in" : return filter.fieldValue.length; case "and" : return Stdlib_Array.reduce(filter.filters, 0, (acc, filter) => acc + valuesCount(filter) | 0); default: return 1; } } let codegenHelpMessage = `Rerun 'pnpm dev' to update generated code after schema.graphql changes.`; function getUndefinedOrNullName(value) { if (value === undefined) { return "undefined"; } else if (value === null) { return "null"; } else { return; } } function throwUnsupportedGetWhereValue(valueName, entityName, filterDisplay, hintOpt) { let hint = hintOpt !== undefined ? hintOpt : ""; return Stdlib_JsError.throwWithMessage(`Invalid ` + valueName + ` value passed to context.` + entityName + `.getWhere(` + filterDisplay + `). Filtering by null or undefined values is not supported in getWhere.` + hint); } function parseGetWhereOrThrow(filter, entityName, table) { let filterKeys = Object.keys(filter); if (filterKeys.length === 0) { Stdlib_JsError.throwWithMessage(`Empty filter passed to context.` + entityName + `.getWhere(). Please provide a filter like { fieldName: { _eq: value } }.`); } let filterGroups = filterKeys.flatMap(apiFieldName => { let operatorObj = filter[apiFieldName]; let valueName = getUndefinedOrNullName(operatorObj); if (valueName !== undefined) { throwUnsupportedGetWhereValue(valueName, entityName, `{ ` + apiFieldName + `: ` + valueName + ` }`, ` Please provide an operator like { _eq: value }.`); } if (typeof operatorObj !== "object" || Array.isArray(operatorObj)) { Stdlib_JsError.throwWithMessage(`Invalid value passed to context.` + entityName + `.getWhere({ ` + apiFieldName + `: ... }). Please provide an operator like { _eq: value }.`); } let operatorKeys = Object.keys(operatorObj); if (operatorKeys.length === 0) { Stdlib_JsError.throwWithMessage(`Empty operator passed to context.` + entityName + `.getWhere({ ` + apiFieldName + `: {} }). Please provide an operator like { _eq: value }, { _gt: value }, { _lt: value }, { _gte: value }, { _lte: value }, or { _in: [values] }.`); } let throwInvalidOperator = operatorKey => Stdlib_JsError.throwWithMessage(`Invalid operator "` + operatorKey + `" in context.` + entityName + `.getWhere({ ` + apiFieldName + `: { ` + operatorKey + `: ... } }). Valid operators are _eq, _gt, _lt, _gte, _lte, _in.`); operatorKeys.forEach(operatorKey => { switch (operatorKey) { case "_eq" : case "_gt" : case "_gte" : case "_in" : case "_lt" : case "_lte" : return; default: return throwInvalidOperator(operatorKey); } }); let match = Table.getFieldByApiName(table, apiFieldName); if (match !== undefined) { if (match.TAG === "Field") { let match$1 = match._0; if (match$1.isPrimaryKey || match$1.isIndex || match$1.linkedEntity !== undefined) { } else { Stdlib_JsError.throwWithMessage(`The field "` + apiFieldName + `" on entity "` + entityName + `" does not have an index. To use it in getWhere(), add the @index directive in your schema.graphql:\n\n ` + apiFieldName + `: ... @index\n\nThen run 'pnpm envio codegen' to regenerate.`); } } else { Stdlib_JsError.throwWithMessage(`The field "` + apiFieldName + `" on entity "` + entityName + `" is a derived field and cannot be used in getWhere(). Use the source entity's indexed field instead.`); } } else { Stdlib_JsError.throwWithMessage(`Invalid field "` + apiFieldName + `" in context.` + entityName + `.getWhere(). The field doesn't exist. ` + codegenHelpMessage); } return operatorKeys.map(operatorKey => { let fieldValue = operatorObj[operatorKey]; let valueName = getUndefinedOrNullName(fieldValue); if (valueName !== undefined) { throwUnsupportedGetWhereValue(valueName, entityName, `{ ` + apiFieldName + `: { ` + operatorKey + `: ` + valueName + ` } }`, undefined); } switch (operatorKey) { case "_eq" : return [{ operator: "=", fieldName: apiFieldName, fieldValue: fieldValue }]; case "_gt" : return [{ operator: ">", fieldName: apiFieldName, fieldValue: fieldValue }]; case "_gte" : return [ { operator: "=", fieldName: apiFieldName, fieldValue: fieldValue }, { operator: ">", fieldName: apiFieldName, fieldValue: fieldValue } ]; case "_in" : if (!Array.isArray(fieldValue)) { Stdlib_JsError.throwWithMessage(`Invalid value passed to context.` + entityName + `.getWhere({ ` + apiFieldName + `: { _in: ... } }). The _in operator expects an array of values.`); } return fieldValue.map((fieldValue, index) => { let valueName = getUndefinedOrNullName(fieldValue); if (valueName !== undefined) { throwUnsupportedGetWhereValue(valueName, entityName, `{ ` + apiFieldName + `: { _in: [...] } }`, ` The ` + valueName + ` value is at index ` + index.toString() + ` of the _in array.`); } return { operator: "=", fieldName: apiFieldName, fieldValue: fieldValue }; }); case "_lt" : return [{ operator: "<", fieldName: apiFieldName, fieldValue: fieldValue }]; case "_lte" : return [ { operator: "=", fieldName: apiFieldName, fieldValue: fieldValue }, { operator: "<", fieldName: apiFieldName, fieldValue: fieldValue } ]; default: return throwInvalidOperator(operatorKey); } }); }); return Stdlib_Array.reduce(filterGroups, [[]], (combinations, group) => combinations.flatMap(combination => group.map(filter => combination.concat([filter])))).map(filters => { if (filters.length !== 1) { return { operator: "and", filters: filters }; } else { return filters[0]; } }); } function printOperationFilter(filter, paramsCount) { switch (filter.operator) { case "=" : paramsCount.contents = paramsCount.contents + 1 | 0; return filter.fieldName + `: $` + paramsCount.contents.toString(); case ">" : paramsCount.contents = paramsCount.contents + 1 | 0; return filter.fieldName + `: {_gt: $` + paramsCount.contents.toString() + `}`; case "<" : paramsCount.contents = paramsCount.contents + 1 | 0; return filter.fieldName + `: {_lt: $` + paramsCount.contents.toString() + `}`; case "in" : paramsCount.contents = paramsCount.contents + 1 | 0; return filter.fieldName + `: {_in: $` + paramsCount.contents.toString() + `}`; case "and" : let filters = filter.filters; let acc = ""; for (let idx = 0, idx_finish = filters.length; idx < idx_finish; ++idx) { let part = printOperationFilter(filters[idx], paramsCount); acc = acc === "" ? part : acc + `, ` + part; } return acc; } } function toOperationKey(filter, entityName) { switch (filter.operator) { case "=" : return entityName + `.getWhere({` + filter.fieldName + `: $1})`; case ">" : return entityName + `.getWhere({` + filter.fieldName + `: {_gt: $1}})`; case "<" : return entityName + `.getWhere({` + filter.fieldName + `: {_lt: $1}})`; case "in" : return entityName + `.getWhere({` + filter.fieldName + `: {_in: $1}})`; case "and" : return entityName + `.getWhere({` + printOperationFilter(filter, { contents: 0 }) + `})`; } } function getParams(filter) { switch (filter.operator) { case "in" : return filter.fieldValue; case "and" : let acc = []; let collect = filter => { switch (filter.operator) { case "and" : filter.filters.forEach(collect); return; default: acc.push(filter.fieldValue); return; } }; collect(filter); return acc; default: return [filter.fieldValue]; } } function throwUnmergeable(filter) { return Stdlib_JsError.throwWithMessage(`Unexpected filter ` + toString$2(filter) + ` in a merged batch. Filters batched into a single query must use the same operator and field.`); } function merge(filters) { let len = filters.length; if (len === 1) { return filters; } if (len === 0) { return filters; } let match = filters[0]; switch (match.operator) { case "=" : return [{ operator: "in", fieldName: match.fieldName, fieldValue: filters.map(filter => { if (filter.operator === "=") { return filter.fieldValue; } else { return throwUnmergeable(filter); } }) }]; case "in" : return [{ operator: "in", fieldName: match.fieldName, fieldValue: filters.map(filter => { if (filter.operator === "in") { return filter.fieldValue; } else { return throwUnmergeable(filter); } }).flat() }]; default: return filters; } } function matches(filter, entity) { switch (filter.operator) { case "=" : return eq(entity[filter.fieldName], filter.fieldValue); case ">" : return gt(entity[filter.fieldName], filter.fieldValue); case "<" : return lt(entity[filter.fieldName], filter.fieldValue); case "in" : let entityFieldValue = entity[filter.fieldName]; return filter.fieldValue.some(fieldValue => eq(entityFieldValue, fieldValue)); case "and" : let filters = filter.filters; if (filters.length !== 0) { return filters.every(filter => matches(filter, entity)); } else { return Stdlib_JsError.throwWithMessage(`The "and" filter must contain at least one nested filter.`); } } } function mapValues(filter, mapValue) { switch (filter.operator) { case "=" : let fieldName = filter.fieldName; return { operator: "=", fieldName: fieldName, fieldValue: mapValue(fieldName, filter.fieldValue, false) }; case ">" : let fieldName$1 = filter.fieldName; return { operator: ">", fieldName: fieldName$1, fieldValue: mapValue(fieldName$1, filter.fieldValue, false) }; case "<" : let fieldName$2 = filter.fieldName; return { operator: "<", fieldName: fieldName$2, fieldValue: mapValue(fieldName$2, filter.fieldValue, false) }; case "in" : let fieldName$3 = filter.fieldName; return { operator: "in", fieldName: fieldName$3, fieldValue: mapValue(fieldName$3, filter.fieldValue, true) }; case "and" : return { operator: "and", filters: filter.filters.map(filter => mapValues(filter, mapValue)) }; } } export { FieldValue, toString$2 as toString, valuesCount, codegenHelpMessage, getUndefinedOrNullName, throwUnsupportedGetWhereValue, parseGetWhereOrThrow, printOperationFilter, toOperationKey, getParams, throwUnmergeable, merge, matches, mapValues, } /* Table Not a pure module */