1.1.7 • Published 3 months ago

@skxv/query-builder v1.1.7

Weekly downloads
-
License
ISC
Repository
-
Last release
3 months ago

@skxv/query-builder

A flexible query builder for use with internal TC api, that generates URL query strings. This package helps you build complex query strings with support for sorting, filtering, pagination, populate, and nested field paths.

Installation

npm install @skxv/query-builder

Usage

import { queryBuilder } from "@skxv/query-builder/dist/src";

// Example usage
const query = queryBuilder({
  // Sorting
  sort: [
    { field: "eventStart", order: "asc" },
    { field: "title", order: "desc" }
  ],

  // Filtering
  filters: [
    // Simple filter
    {
      field: "eventStart",
      operator: "$gte",
      value: new Date().setHours(0, 0, 0, 0) / 1000
    },

    // Nested field filter
    {
      field: "center.id",
      operator: "$eq",
      value: 123
    },

    // Logical operator filter
    {
      operator: "$and",
      filters: [
        { field: "status", value: "active" },
        { field: "category", value: "event" }
      ]
    }
  ],

  // Pagination
  pagination: {
    limit: 10,
    offset: 0
  },

  // Populate related fields
  populate: ["department", "projects"]
});

const queryString = queryBuilder(settings);
// Result includes: populate=department,projects

Features

Populate Support

The query builder supports populating related fields. This is useful when you need to include related data in the response:

// Example with populate
const settings = queryBuilder({
  // You can use an array of strings
  populate: ["department", "projects"],

  // Or a comma-separated string
  populate: "department,projects,manager"
});

// Results in: populate=department,projects or populate=department,projects,manager

By default, relation fields are not fully included in the response to prevent performance issues. Using populate allows you to specify which relation fields should be included in the response, avoiding the need for multiple requests.

Nested Field Support

The query builder supports nested field paths using dot notation. This is particularly useful when filtering on nested object properties:

// Example with nested fields
const settings = queryBuilder({
  filters: [
    // Filter on nested property
    {
      field: "center.id",
      operator: "$eq",
      value: 123
    },
    // Multiple levels of nesting
    {
      field: "user.profile.email",
      operator: "$eq",
      value: "example@email.com"
    }
  ]
});

// Results in: filters[center][id][$eq]=123&filters[user][profile][email][$eq]=example@email.com

API Reference

QueryBuilderSettings

Main configuration interface for the query builder:

interface QueryBuilderSettings {
  sort?: Sort[];
  filters?: (Filter | LogicalFilter)[];
  pagination?: Pagination;
  populate?: string[] | string; // Array of fields to populate or comma-separated string
}

Sort

interface Sort {
  field: string; // Can use dot notation for nested fields
  order: "asc" | "desc";
}

Filter

interface Filter {
  field: string; // Supports dot notation for nested fields (e.g., "center.id")
  operator?: ComparisonOperator;
  value: string | number | boolean | null | Array<string | number>;
  relation?: string;
}

ComparisonOperator

Available comparison operators:

  • $eq: Equal
  • $gt: Greater than
  • $gte: Greater than or equal
  • $lt: Less than
  • $lte: Less than or equal
  • $in: In array
  • $null: Is null
  • $like: Wildcard search

LogicalFilter

interface LogicalFilter {
  operator: LogicalOperator; // "$and" | "$or" | "$not"
  filters: Filter[]; // Each filter can use nested fields
}

Pagination

interface Pagination {
  limit: number;
  offset?: number;
}

Advanced Examples

Complex Nested Filters with Logical Operators

const query = queryBuilder({
  filters: [
    {
      operator: "$and",
      filters: [
        {
          field: "center.id",
          operator: "$eq",
          value: 123
        },
        {
          field: "center.status",
          operator: "$eq",
          value: "active"
        }
      ]
    }
  ]
});

// Results in: filters[$and][0][center][id][$eq]=123&filters[$and][1][center][status][$eq]=active

Combining Multiple Features with Populate

const settings = queryBuilder({
  sort: [{ field: "center.name", order: "asc" }],
  filters: [
    {
      field: "center.id",
      operator: "$eq",
      value: 123
    },
    {
      operator: "$or",
      filters: [
        {
          field: "status",
          operator: "$eq",
          value: "active"
        },
        {
          field: "status",
          operator: "$eq",
          value: "pending"
        }
      ]
    }
  ],
  pagination: {
    limit: 20
  },
  populate: ["center", "status.category", "assignedUsers"]
});

// Results in a query string with sorting, nested filters, logical operators, pagination, and populated relations
1.1.7

3 months ago

1.1.6

3 months ago

1.1.5

4 months ago

1.1.4

6 months ago

1.1.3

6 months ago

1.1.1

6 months ago

1.1.0

6 months ago

1.0.1

6 months ago

1.0.0

6 months ago