Serialize and deserialize data.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

31 line
1.0 KiB

  1. import { TypeOptions } from 'src/common';
  2. interface CommonApplicationJsonOptions extends TypeOptions {
  3. type: 'application/json';
  4. }
  5. interface SerializeApplicationJsonOptions extends CommonApplicationJsonOptions {
  6. indent?: number;
  7. replacer?: (key: string, value: unknown) => unknown;
  8. }
  9. export const serialize = async <T, O extends TypeOptions = SerializeApplicationJsonOptions>(
  10. data: T,
  11. options = {} as O,
  12. ): Promise<string> => {
  13. const theOptions = options as SerializeApplicationJsonOptions;
  14. return Promise.resolve(JSON.stringify(data, theOptions.replacer, theOptions.indent));
  15. };
  16. interface DeserializeApplicationJsonOptions extends CommonApplicationJsonOptions {
  17. reviver?: (key: string, value: unknown) => unknown;
  18. }
  19. export const deserialize = async <T, O extends TypeOptions = DeserializeApplicationJsonOptions>(
  20. serialized: string,
  21. options = {} as O,
  22. ): Promise<T> => {
  23. const theOptions = options as DeserializeApplicationJsonOptions;
  24. return Promise.resolve(JSON.parse(serialized, theOptions.reviver) as T);
  25. };