diff --git a/CHANGELOG.md b/CHANGELOG.md index b5e6e4a..8599cf6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,11 @@ # @proofgeist/fmdapi +## 4.1.4 + +### Patch Changes + +- Fix sorting query in base fetch adapter + ## 4.1.3 ### Patch Changes diff --git a/package.json b/package.json index 4e1f667..2ef5bc6 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@proofgeist/fmdapi", - "version": "4.1.3", + "version": "4.1.4", "description": "FileMaker Data API client", "main": "dist/index.js", "repository": "git@github.com:proofgeist/fm-dapi.git", @@ -40,6 +40,7 @@ "dayjs": "^1.11.13", "dotenv": "^16.4.5", "fs-extra": "^11.1.1", + "infinite-table": "link:/Users/ericluce/Documents/Code/work/test-alpaca-projects/infinite-table", "ts-morph": "^24.0.0", "ts-toolbelt": "^9.6.0" }, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index bb6fa02..ce2c13b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -26,6 +26,9 @@ importers: fs-extra: specifier: ^11.1.1 version: 11.2.0 + infinite-table: + specifier: link:/Users/ericluce/Documents/Code/work/test-alpaca-projects/infinite-table + version: link:../test-alpaca-projects/infinite-table ts-morph: specifier: ^24.0.0 version: 24.0.0 diff --git a/src/adapters/fetch-base.ts b/src/adapters/fetch-base.ts index ee90b18..61718e3 100644 --- a/src/adapters/fetch-base.ts +++ b/src/adapters/fetch-base.ts @@ -75,7 +75,8 @@ export class BaseFetchAdapter implements Adapter { const url = new URL(`${this.baseUrl}${params.url}`); if (query) { - const searchParams = new URLSearchParams(query); + const { _sort, ...rest } = query; + const searchParams = new URLSearchParams(rest); if (query.portalRanges && typeof query.portalRanges === "object") { for (const [portalName, value] of Object.entries( query.portalRanges as PortalRanges, @@ -92,6 +93,9 @@ export class BaseFetchAdapter implements Adapter { } } } + if (_sort) { + searchParams.set("_sort", JSON.stringify(_sort)); + } searchParams.delete("portalRanges"); url.search = searchParams.toString(); } @@ -171,6 +175,7 @@ export class BaseFetchAdapter implements Adapter { public list = async (opts: ListOptions): Promise => { const { data, layout } = opts; + const resp = await this.request({ url: `/layouts/${layout}/records`, query: data as Record, diff --git a/src/client-types.ts b/src/client-types.ts index 03803bc..4916af4 100644 --- a/src/client-types.ts +++ b/src/client-types.ts @@ -140,7 +140,8 @@ export type GetParams = export type Sort = { fieldName: keyof T; - sortOrder: "ascend" | "descend" | string; + // eslint-disable-next-line @typescript-eslint/ban-types + sortOrder?: "ascend" | "descend" | (string & {}); }; export type ListParams< diff --git a/test/client-methods.test.ts b/test/client-methods.test.ts index a140203..9172773 100644 --- a/test/client-methods.test.ts +++ b/test/client-methods.test.ts @@ -8,6 +8,27 @@ import { import { config, layoutClient, weirdPortalClient } from "./setup"; import { describe, test, expect, it } from "vitest"; +describe("sort methods", () => { + test("should sort descending", async () => { + const resp = await layoutClient.list({ + sort: { fieldName: "recordId", sortOrder: "descend" }, + }); + expect(resp.data.length).toBe(3); + const firstRecord = parseInt(resp.data[0].fieldData.recordId as string); + const secondRecord = parseInt(resp.data[1].fieldData.recordId as string); + expect(firstRecord).toBeGreaterThan(secondRecord); + }); + test("should sort ascending by default", async () => { + const resp = await layoutClient.list({ + sort: { fieldName: "recordId" }, + }); + + const firstRecord = parseInt(resp.data[0].fieldData.recordId as string); + const secondRecord = parseInt(resp.data[1].fieldData.recordId as string); + expect(secondRecord).toBeGreaterThan(firstRecord); + }); +}); + describe("find methods", () => { const client = DataApi({ adapter: new OttoAdapter({