feathersjs/feathers-reactive

View on GitHub
src/utils.ts

Summary

Maintainability
A
0 mins
Test Coverage
import { _ } from '@feathersjs/commons';
import { sorter as createSorter } from '@feathersjs/adapter-commons';
import type { Query } from '@feathersjs/feathers';
import { Observable, defer } from 'rxjs';
import sift from 'sift';

import { Options } from './interfaces';

export function getSource(originalMethod: Function, args: IArguments) {
  return defer(() => originalMethod(...args));
}

export function makeSorter(query: Query, options: Options) {
  // The sort function (if $sort is set)
  const sorter = query.$sort
    ? createSorter(query.$sort)
    : createSorter({
        [options.idField]: 1
      });

  return function (result: any) {
    const isPaginated = !!result[options.dataField];
    let data = isPaginated ? result[options.dataField] : result;

    if (sorter) {
      data = data.sort(sorter);
    }

    const limit =
      typeof result.limit === 'number'
        ? result.limit
        : parseInt(query.$limit, 10);

    if (limit && !isNaN(limit) && limit !== -1) {
      data = data.slice(0, limit);
    }

    if (isPaginated) {
      result[options.dataField] = data;
    } else {
      result = data;
    }

    return result;
  };
}

export function getOptions(base: any, ...others: any[]) {
  const options = Object.assign({}, base, ...others);

  if (typeof options.listStrategy === 'string') {
    options.listStrategy = options.listStrategies[options.listStrategy];
  }

  return options;
}

export function getPipeStream<T = any>(
  stream: Observable<T>,
  options: Options
) {
  if (!options.pipe) {
    return stream;
  } else if (Array.isArray(options.pipe)) {
    // TODO: Not sure why this type fails
    // @ts-ignore
    return stream.pipe(...options.pipe);
  } else {
    return stream.pipe(options.pipe);
  }
}

export function getParamsPosition(method: string) {
  // The position of the params parameters for a service method so that we can extend them
  // default is 1

  const paramsPositions: any = {
    find: 0,
    update: 2,
    patch: 2
  };

  return method in paramsPositions ? paramsPositions[method] : 1;
}

export function siftMatcher(originalQuery: Query) {
  const keysToOmit = Object.keys(originalQuery).filter(
    (key) => key.charCodeAt(0) === 36
  );
  const query = _.omit(originalQuery, ...keysToOmit);

  return sift(query);
}