Skip to content

Query Builder

  • import: @azure-net/kit/infra
  • Preferred location: src/app/core/query-builders

Построитель URL-параметров с поддержкой различных форматов сериализации.

Основное использование

typescript
import { QueryBuilder } from '@azure-net/kit/infra';

// Все параметры настраиваемые при создании класса можно переопределять для каждого отдельного вызова метода build
const queryBuilder = new QueryBuilder({
  arrayFormat: 'brackets', // 'repeat' | 'brackets' | 'comma' | 'json'
  objectFormat: 'default'  // 'default' | 'nested-brackets'
});

// Простые параметры
const query1 = queryBuilder.build({
  page: 1,
  limit: 10,
  search: 'john'
});
// ?page=1&limit=10&search=john

// Массивы
const query2 = queryBuilder.build({
  tags: ['javascript', 'svelte', 'typescript']
}, { arrayFormat: 'brackets' });
// ?tags[]=javascript&tags[]=svelte&tags[]=typescript

const query3 = queryBuilder.build({
  ids: [1, 2, 3]
}, { arrayFormat: 'comma' });
// ?ids=1,2,3

// Объекты
const query4 = queryBuilder.build({
  filter: {
    status: 'active',
    role: 'admin'
  }
}, { objectFormat: 'nested-brackets' });
// ?filter[status]=active&filter[role]=admin

Кастомный QueryBuilder

typescript
class ApiQueryBuilder extends QueryBuilder {
  transform(query: object): object {
    // Кастомная трансформация параметров
    const transformed = { ...query };
    
    // Преобразование null в пустую строку
    for (const [key, value] of Object.entries(transformed)) {
      if (value === null) {
        transformed[key] = '';
      }
    }
    
    return transformed;
  }
}

const customBuilder = new ApiQueryBuilder();

Опции метода build

  • delimiter - Добавлять ли знак вопроса в начале строки, по умолчанию: true;
  • arrayFormat - форматирование массивов: 'repeat' | 'brackets' | 'comma' | 'json'. По умолчанию: 'repeat', может быть глобально задан в конструкторе.
  • objectFormat - форматирование объектов: 'default' | 'nested-brackets'. По умолчанию: 'default', может быть глобально задан в конструкторе. При 'default' попытается просто превратить объект в строку. Пример с nested-brackets приведён выше.