Coder Social home page Coder Social logo

Comments (2)

sibelius avatar sibelius commented on May 18, 2024 1

create a simpler Param builder

export const getSchemaParam = (objParam: QueryParamConfig<any>): QueryParamConfig<any> => {
  return {
    encode(input: object) {
      const objEncoded = Object.keys(input).reduce((acc, key) => {
        const value = input[key];
        const param = objParam[key];

        // is it a QueryParam?
        if (param && param.encode && param.decode) {
          return {
            ...acc,
            [key]: param.encode(value),
          };
        }

        return {
          ...acc,
          [key]: value,
        };
      }, {});

      return encodeObject(objEncoded);
    },
    decode(input: string | string[] | undefined): object | undefined {
      if (input == null || !input.length) {
        return undefined;
      }

      const obj = decodeObject(input);

      return Object.keys(obj).reduce((acc, key) => {
        const value = obj[key];
        const param = objParam[key];

        // is it a QueryParam?
        if (param && param.encode && param.decode) {
          return {
            ...acc,
            [key]: param.decode(value),
          };
        }

        return {
          ...acc,
          [key]: value,
        };
      }, {});
    },
  };
};
const filterDefinition = {
  begin: MomentParam,
  end: MomentParam,
};
const FilterParam = getSchemaParam(filterDefinition);

FilterParam.encode
FilterParam.decode

it also needs to be recursive

from serialize-query-params.

sibelius avatar sibelius commented on May 18, 2024 1

nesting solution

import { QueryParamConfig, encodeObject, decodeObject } from 'use-query-params';

const encodeObj = (objParam: QueryParamConfig<any>) => (input: object) => {
  if (objParam && objParam.encode && objParam.decode) {
    return objParam.encode(input);
  }

  const objEncoded = Object.keys(input).reduce((acc, key) => {
    const value = input[key];
    const param = objParam[key];

    // is it a QueryParam?
    if (param && param.encode && param.decode) {
      return {
        ...acc,
        [key]: param.encode(value),
      };
    }

    // nested object param
    if (typeof value === 'object') {
      const encoded = encodeObj({
        [key]: param,
      })(value);

      return {
        ...acc,
        [key]: encoded,
      };
    }

    return {
      ...acc,
      [key]: value,
    };
  }, {});

  return encodeObject(objEncoded);
};

const decodeObj = (objParam: QueryParamConfig<any>) => (input: string | string[] | undefined): object | undefined => {
  if (input == null || !input.length) {
    return undefined;
  }

  if (objParam && objParam.encode && objParam.decode) {
    return objParam.decode(input);
  }

  const obj = decodeObject(input);

  return Object.keys(obj).reduce((acc, key) => {
    const value = obj[key];
    const param = objParam[key];

    // is it a QueryParam?
    if (param && param.encode && param.decode) {
      return {
        ...acc,
        [key]: param.decode(value),
      };
    }

    // nested object param
    if (typeof param === 'object') {
      const decoded = decodeObj(param)(value);

      return {
        ...acc,
        [key]: decoded,
      };
    }

    return {
      ...acc,
      [key]: value,
    };
  }, {});
};

// TODO - improve type
export const getSchemaParam = (objParam: QueryParamConfig<any>): QueryParamConfig<any> => {
  const encode = encodeObj(objParam);
  const decode = decodeObj(objParam);

  return {
    encode,
    decode,
  };
};

tests

import { StringParam, BooleanParam } from 'use-query-params';

import { getSchemaParam } from '../getSchemaParam';

const result = 'quadrant-atende_user-manager-managerId_oneOnOne-hasMadeOne-true';

// TODO - fix nesting
it.skip('should encode complex filter properly using schemaParam', () => {
  const userFilterDefinition = {
    quadrant: StringParam,
    user: {
      manager: StringParam,
      oneOnOne: {
        hasMadeOne: BooleanParam,
      },
    },
  };

  const UserFilterParam = getSchemaParam(userFilterDefinition);

  const filters = {
    quadrant: 'atende',
    user: {
      manager: 'managerId',
      oneOnOne: {
        hasMadeOne: true,
      },
    },
  };

  const encoded = UserFilterParam.encode(filters);

  expect(encoded).toEqual(result);
});

// TODO - fix nesting
it.skip('should decode complex filter properly using schemaParam', () => {
  const userFilterDefinition = {
    quadrant: StringParam,
    user: {
      manager: StringParam,
      oneOnOne: {
        hasMadeOne: BooleanParam,
      },
    },
  };

  const UserFilterParam = getSchemaParam(userFilterDefinition);

  const filters = {
    quadrant: 'atende',
    user: {
      manager: 'managerId',
      oneOnOne: {
        hasMadeOne: true,
      },
    },
  };

  const encoded = UserFilterParam.decode(result);

  expect(encoded).toEqual(filters);
});

tests are still failing

from serialize-query-params.

Related Issues (18)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.