Files
directus/packages/utils/shared/defaults.ts
Rijk van Zanten b56fc107a5 Add Pressure-based rate limiter (#17873)
* Start setting up @directus/pressure

* Build pressure middleware

* Add basic readme

* Install @directus/pressure

* Fix this binding

* Experiment

* Add defaults util

* Cleanup

* Fix export

* Use directus defaults

* Start tests

* Add random-utils package

* Finish testing for monitor

* Add prod deployment

* Stop building test files in prod

* My favorite

* Integrate pressure handler

* Add decent defaults

* Add retry header + custom error support

* Clean-up merge conflict & sort imports

* Fix build

* Remove default value for retry after

* Verify sampleInterval value

* ran eslint

* updated package lock

* updated vitest

* Create slimy-zebras-jam.md

* Added basic docs for config options

* updated pnpm lock and changeset

* Update & align new packages

* Update .changeset/slimy-zebras-jam.md

---------

Co-authored-by: Pascal Jufer <pascal-jufer@bluewin.ch>
Co-authored-by: Brainslug <br41nslug@users.noreply.github.com>
Co-authored-by: Brainslug <tim@brainslug.nl>
2023-05-10 14:17:53 +00:00

34 lines
726 B
TypeScript

/**
* Returns the input source object with the defaults applied
*
* @example
* ```js
* type Example = {
* optional?: boolean;
* required: boolean;
* }
* const input: Example = { required: true };
* const output = defaults(input, { optional: false });
* // => { required: true, optional: false }
* ```
*/
export const defaults = <T extends object>(
obj: T,
def: Required<
Pick<
T,
Exclude<
keyof T,
Exclude<{ [K in keyof T]: T[K] extends Exclude<T[keyof T], undefined> ? K : never }[keyof T], undefined>
>
>
>
): Required<T> => {
const input = Object.fromEntries(Object.entries(obj).filter(([_key, value]) => value !== undefined));
return {
...def,
...input,
} as Required<T>;
};