diff --git a/package.json b/package.json index 3150bd9..1e08f3c 100644 --- a/package.json +++ b/package.json @@ -45,6 +45,7 @@ }, "devDependencies": { "@fastify/pre-commit": "^2.0.2", + "@mateonunez/lyra-schema-resolver": "^0.0.2", "@types/node": "^18.7.3", "@types/tap": "^15.0.7", "@typescript-eslint/eslint-plugin": "^5.32.0", diff --git a/src/errors.ts b/src/errors.ts index 7006131..2639129 100644 --- a/src/errors.ts +++ b/src/errors.ts @@ -8,4 +8,3 @@ export const RESPONSE_INVALID = (url: string, statusCode: number) => { const statusText = HTTP_STATUS[statusCode] return `Error fetching data from ${url}: ${statusCode} ${statusText}` } -export const UNSUPPORTED_TYPE_SCHEMA = (type: string) => `Unsupported type schema: ${type}` diff --git a/src/schema/resolver.ts b/src/schema/resolver.ts deleted file mode 100644 index 9743544..0000000 --- a/src/schema/resolver.ts +++ /dev/null @@ -1,40 +0,0 @@ -import {UNSUPPORTED_TYPE_SCHEMA} from "../errors" -import {getMaxOfArray} from "../utils" - -// eslint-disable-next-line @typescript-eslint/no-explicit-any -export function resolveSchema(schema: any, data: any): any { - if (Array.isArray(data)) { - // finds the biggest element in the data so we can build our schema from that - const sizes = data.map(entry => Object.values(entry).length) - const max = getMaxOfArray(sizes) - const idx = sizes.indexOf(max) - - return resolveSchema(schema, {...data[idx]}) - } else { - for (const key in data) { - const type = typeof data[key] - - if (Array.isArray(data[key])) { - if (!schema[key]) { - schema[key] = resolveSchema([], data[key]) - } - } else if (type === "object") { - if (!schema[key]) { - schema[key] = resolveSchema({}, data[key]) - } - } else if (type === "string") { - schema[key] = "string" - } else if (type === "number") { - schema[key] = "number" - } else if (type === "boolean") { - schema[key] = "boolean" - } else { - throw new Error(UNSUPPORTED_TYPE_SCHEMA(type)) - } - } - } - - if (schema.id) delete schema.id - - return schema -} diff --git a/src/tests/errors.test.ts b/src/tests/errors.test.ts index 0aa8be9..9ce9824 100644 --- a/src/tests/errors.test.ts +++ b/src/tests/errors.test.ts @@ -1,14 +1,13 @@ /* eslint-disable @typescript-eslint/no-explicit-any */ import {test} from "tap" -import {FILE_NOT_FOUND, MISSING_GRAPHQL_QUERY, RESPONSE_INVALID, UNSUPPORTED_CONTENT_TYPE, UNSUPPORTED_FETCHER, UNSUPPORTED_TYPE_SCHEMA} from "../errors" +import {FILE_NOT_FOUND, MISSING_GRAPHQL_QUERY, RESPONSE_INVALID, UNSUPPORTED_CONTENT_TYPE, UNSUPPORTED_FETCHER} from "../errors" import {impact} from "../runtimes/server" -import {resolveSchema} from "../schema/resolver" const rickAndMorty = "https://rickandmortyapi.com/api/character" const xml = "https://www.w3schools.com/xml/simple.xml" test("errors - runtime server", ({test, plan}) => { - plan(2) + plan(1) test("fetchers", ({test, plan}) => { plan(4) @@ -56,20 +55,4 @@ test("errors - runtime server", ({test, plan}) => { }) }) }) - - test("schema", ({test, plan}) => { - plan(1) - - test("invalid schema should throw an error", ({same, end}) => { - const data = {username: "mateonunez", description: () => ({})} - - try { - resolveSchema({}, data) - // eslint-disable-next-line @typescript-eslint/no-explicit-any - } catch (err: any) { - same(err.message, UNSUPPORTED_TYPE_SCHEMA("function")) - end() - } - }) - }) }) diff --git a/src/tests/utils.test.ts b/src/tests/utils.test.ts index d14d7b5..ab01055 100644 --- a/src/tests/utils.test.ts +++ b/src/tests/utils.test.ts @@ -1,10 +1,8 @@ -import { create, insert, search } from "@lyrasearch/lyra" import {test} from "tap" -import {resolveSchema} from "../schema/resolver" import {parseData} from "../utils" test("utils - runtime server", ({test, plan}) => { - plan(2) + plan(1) test("parsing data", ({test, plan}) => { plan(2) @@ -117,34 +115,4 @@ test("utils - runtime server", ({test, plan}) => { }) }) }) - - test("schema", ({test, plan}) => { - plan(2) - - test("the schema should be resolved", ({same, end}) => { - const data = {name: "mateonunez", age: 27, is_admin: false} - const expected = {name: "string", age: "number", is_admin: "boolean"} - const schema = resolveSchema({}, data) - - same(schema, expected) - end() - }) - - test("the schema with nested object should be resolved and searchable", ({same, end}) => { - const data = {name: "mateonunez", age: 27, is_admin: false, address: {street: "street", number: 123}} - const expected = {name: "string", age: "number", is_admin: "boolean", address: {street: "string", number: "number"}} - const schema = resolveSchema({}, data) - - const lyra = create({schema}) - insert(lyra, data) - const {hits} = search(lyra, { - term: "street" - }) - - same(schema, expected) - // eslint-disable-next-line @typescript-eslint/no-unused-vars - same(hits.map(({id, ...rest}) => ({...rest})), [data]) - end() - }) - }) }) diff --git a/src/utils.ts b/src/utils.ts index 9ea1d39..a208b29 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -3,7 +3,7 @@ import {Configuration as LyraConfiguration, create, insert, Lyra, PropertiesSche import {UNSUPPORTED_CONTENT_TYPE} from "./errors" import parseCsv from "./runtimes/common/parsers/csv" import parseJson from "./runtimes/common/parsers/json" -import {resolveSchema} from "./schema/resolver" +import resolveSchema from '@mateonunez/lyra-schema-resolver' export type ParseDataOptions = { contentType?: string @@ -39,12 +39,8 @@ export function sanitizeString(str: string): string { return str.trim() } -export function getMaxOfArray(array: any[]): number { - return array.reduce((max, v) => (max >= v ? max : v), -Infinity) -} - export function createLyra(data: any, options?: Omit, "schema">): Lyra { - const schema = resolveSchema({}, data) + const schema = resolveSchema(data) const lyra = create({ schema, ...options