@strapi/utils 5.51.1 → 5.51.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/errors.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import yup from 'yup';
1
+ import * as yup from 'yup';
2
2
  import { HttpError } from 'http-errors';
3
3
  declare class ApplicationError<TName extends string = 'ApplicationError', TMessage extends string = string, TDetails = unknown> extends Error {
4
4
  name: TName;
@@ -1 +1 @@
1
- {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAEA,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAIxC,cAAM,gBAAgB,CACpB,KAAK,SAAS,MAAM,GAAG,kBAAkB,EACzC,QAAQ,SAAS,MAAM,GAAG,MAAM,EAChC,QAAQ,GAAG,OAAO,CAClB,SAAQ,KAAK;IACb,IAAI,EAAE,KAAK,CAAC;IAEZ,OAAO,EAAE,QAAQ,CAAC;IAElB,OAAO,EAAE,QAAQ,CAAC;gBAGhB,OAAO,GAAsC,QAAQ,EACrD,OAAO,GAAE,QAAyB;CAOrC;AAED,cAAM,eAAe,CACnB,QAAQ,SAAS,MAAM,GAAG,MAAM,EAChC,QAAQ,GAAG,OAAO,CAClB,SAAQ,gBAAgB,CAAC,iBAAiB,EAAE,QAAQ,EAAE,QAAQ,CAAC;gBACnD,OAAO,EAAE,QAAQ,EAAE,OAAO,CAAC,EAAE,QAAQ;CAIlD;AAED,UAAU,iBAAiB;IACzB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACf;AAED,cAAM,kBAAkB,CAAC,QAAQ,SAAS,MAAM,GAAG,MAAM,CAAE,SAAQ,eAAe,CAChF,QAAQ,EACR;IAAE,MAAM,EAAE,iBAAiB,EAAE,CAAA;CAAE,CAChC;gBACa,QAAQ,EAAE,GAAG,CAAC,eAAe,EAAE,OAAO,CAAC,EAAE,QAAQ;CAM9D;AAED,cAAM,eAAe,CACnB,QAAQ,SAAS,MAAM,GAAG,MAAM,EAChC,QAAQ,GAAG,OAAO,CAClB,SAAQ,gBAAgB,CAAC,iBAAiB,EAAE,QAAQ,EAAE,QAAQ,CAAC;gBACnD,OAAO,GAA2B,QAAQ,EAAE,OAAO,CAAC,EAAE,QAAQ;CAK3E;AAED,cAAM,aAAa,CAAC,QAAQ,SAAS,MAAM,GAAG,MAAM,EAAE,QAAQ,GAAG,OAAO,CAAE,SAAQ,gBAAgB,CAChG,eAAe,EACf,QAAQ,EACR,QAAQ,CACT;gBACa,OAAO,GAAyB,QAAQ,EAAE,OAAO,CAAC,EAAE,QAAQ;CAKzE;AAED,cAAM,cAAc,CAClB,KAAK,SAAS,MAAM,GAAG,gBAAgB,EACvC,QAAQ,SAAS,MAAM,GAAG,MAAM,EAChC,QAAQ,GAAG,OAAO,CAClB,SAAQ,gBAAgB,CAAC,KAAK,EAAE,QAAQ,EAAE,QAAQ,CAAC;gBACvC,OAAO,GAAyB,QAAQ,EAAE,OAAO,CAAC,EAAE,QAAQ;CAKzE;AAED,cAAM,iBAAiB,CACrB,QAAQ,SAAS,MAAM,GAAG,MAAM,EAChC,QAAQ,GAAG,OAAO,CAClB,SAAQ,gBAAgB,CAAC,mBAAmB,EAAE,QAAQ,EAAE,QAAQ,CAAC;gBACrD,OAAO,GAAqB,QAAQ,EAAE,OAAO,CAAC,EAAE,QAAQ;CAKrE;AAED,cAAM,cAAc,CAAC,QAAQ,SAAS,MAAM,GAAG,MAAM,EAAE,QAAQ,GAAG,OAAO,CAAE,SAAQ,gBAAgB,CACjG,gBAAgB,EAChB,QAAQ,EACR,QAAQ,CACT;gBAEG,OAAO,GAAmD,QAAQ,EAClE,OAAO,CAAC,EAAE,QAAQ;CAOrB;AAED,cAAM,oBAAoB,CACxB,QAAQ,SAAS,MAAM,GAAG,MAAM,EAChC,QAAQ,GAAG,OAAO,CAClB,SAAQ,gBAAgB,CAAC,sBAAsB,EAAE,QAAQ,EAAE,QAAQ,CAAC;gBACxD,OAAO,GAAyB,QAAQ,EAAE,OAAO,CAAC,EAAE,QAAQ;CAKzE;AAED,cAAM,WAAW,CAAC,QAAQ,SAAS,MAAM,GAAG,MAAM,EAAE,QAAQ,GAAG,OAAO,CAAE,SAAQ,cAAc,CAC5F,aAAa,EACb,QAAQ,EACR,QAAQ,CACT;gBACa,OAAO,GAAsB,QAAQ,EAAE,OAAO,CAAC,EAAE,QAAQ;CAMtE;AAED,cAAM,mBAAmB,CACvB,QAAQ,SAAS,MAAM,GAAG,MAAM,EAChC,QAAQ,GAAG,OAAO,CAClB,SAAQ,gBAAgB,CAAC,qBAAqB,EAAE,QAAQ,EAAE,QAAQ,CAAC;gBACvD,OAAO,GAA4C,QAAQ,EAAE,OAAO,CAAC,EAAE,QAAQ;CAK5F;AAED,OAAO,EACL,SAAS,EACT,gBAAgB,EAChB,eAAe,EACf,kBAAkB,EAClB,eAAe,EACf,aAAa,EACb,cAAc,EACd,iBAAiB,EACjB,cAAc,EACd,oBAAoB,EACpB,WAAW,EACX,mBAAmB,GACpB,CAAC"}
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"errors.js","sources":["../src/errors.ts"],"sourcesContent":["/* eslint-disable max-classes-per-file */\n\nimport yup from 'yup';\nimport { HttpError } from 'http-errors';\nimport { formatYupErrors } from './format-yup-error';\n\n/* ApplicationError */\nclass ApplicationError<\n TName extends string = 'ApplicationError',\n TMessage extends string = string,\n TDetails = unknown,\n> extends Error {\n name: TName;\n\n details: TDetails;\n\n message: TMessage;\n\n constructor(\n message = 'An application error occurred' as TMessage,\n details: TDetails = {} as TDetails\n ) {\n super();\n this.name = 'ApplicationError' as TName;\n this.message = message;\n this.details = details;\n }\n}\n\nclass ValidationError<\n TMessage extends string = string,\n TDetails = unknown,\n> extends ApplicationError<'ValidationError', TMessage, TDetails> {\n constructor(message: TMessage, details?: TDetails) {\n super(message, details);\n this.name = 'ValidationError';\n }\n}\n\ninterface YupFormattedError {\n path: string[];\n message: string;\n name: string;\n value: string;\n}\n\nclass YupValidationError<TMessage extends string = string> extends ValidationError<\n TMessage,\n { errors: YupFormattedError[] }\n> {\n constructor(yupError: yup.ValidationError, message?: TMessage) {\n super('Validation' as TMessage);\n const { errors, message: yupMessage } = formatYupErrors(yupError);\n this.message = message || (yupMessage as TMessage);\n this.details = { errors };\n }\n}\n\nclass PaginationError<\n TMessage extends string = string,\n TDetails = unknown,\n> extends ApplicationError<'PaginationError', TMessage, TDetails> {\n constructor(message = 'Invalid pagination' as TMessage, details?: TDetails) {\n super(message, details);\n this.name = 'PaginationError';\n this.message = message;\n }\n}\n\nclass NotFoundError<TMessage extends string = string, TDetails = unknown> extends ApplicationError<\n 'NotFoundError',\n TMessage,\n TDetails\n> {\n constructor(message = 'Entity not found' as TMessage, details?: TDetails) {\n super(message, details);\n this.name = 'NotFoundError';\n this.message = message;\n }\n}\n\nclass ForbiddenError<\n TName extends string = 'ForbiddenError',\n TMessage extends string = string,\n TDetails = unknown,\n> extends ApplicationError<TName, TMessage, TDetails> {\n constructor(message = 'Forbidden access' as TMessage, details?: TDetails) {\n super(message, details);\n this.name = 'ForbiddenError' as TName;\n this.message = message;\n }\n}\n\nclass UnauthorizedError<\n TMessage extends string = string,\n TDetails = unknown,\n> extends ApplicationError<'UnauthorizedError', TMessage, TDetails> {\n constructor(message = 'Unauthorized' as TMessage, details?: TDetails) {\n super(message, details);\n this.name = 'UnauthorizedError';\n this.message = message;\n }\n}\n\nclass RateLimitError<TMessage extends string = string, TDetails = unknown> extends ApplicationError<\n 'RateLimitError',\n TMessage,\n TDetails\n> {\n constructor(\n message = 'Too many requests, please try again later.' as TMessage,\n details?: TDetails\n ) {\n super(message, details);\n this.name = 'RateLimitError';\n this.message = message;\n this.details = details || ({} as TDetails);\n }\n}\n\nclass PayloadTooLargeError<\n TMessage extends string = string,\n TDetails = unknown,\n> extends ApplicationError<'PayloadTooLargeError', TMessage, TDetails> {\n constructor(message = 'Entity too large' as TMessage, details?: TDetails) {\n super(message, details);\n this.name = 'PayloadTooLargeError';\n this.message = message;\n }\n}\n\nclass PolicyError<TMessage extends string = string, TDetails = unknown> extends ForbiddenError<\n 'PolicyError',\n TMessage,\n TDetails\n> {\n constructor(message = 'Policy Failed' as TMessage, details?: TDetails) {\n super(message, details);\n this.name = 'PolicyError';\n this.message = message;\n this.details = details || ({} as TDetails);\n }\n}\n\nclass NotImplementedError<\n TMessage extends string = string,\n TDetails = unknown,\n> extends ApplicationError<'NotImplementedError', TMessage, TDetails> {\n constructor(message = 'This feature is not implemented yet' as TMessage, details?: TDetails) {\n super(message, details);\n this.name = 'NotImplementedError';\n this.message = message;\n }\n}\n\nexport {\n HttpError,\n ApplicationError,\n ValidationError,\n YupValidationError,\n PaginationError,\n NotFoundError,\n ForbiddenError,\n UnauthorizedError,\n RateLimitError,\n PayloadTooLargeError,\n PolicyError,\n NotImplementedError,\n};\n"],"names":["ApplicationError","Error","message","details","name","ValidationError","YupValidationError","yupError","errors","yupMessage","formatYupErrors","PaginationError","NotFoundError","ForbiddenError","UnauthorizedError","RateLimitError","PayloadTooLargeError","PolicyError","NotImplementedError"],"mappings":"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"}
1
+ {"version":3,"file":"errors.js","sources":["../src/errors.ts"],"sourcesContent":["/* eslint-disable max-classes-per-file */\n\nimport * as yup from 'yup';\nimport { HttpError } from 'http-errors';\nimport { formatYupErrors } from './format-yup-error';\n\n/* ApplicationError */\nclass ApplicationError<\n TName extends string = 'ApplicationError',\n TMessage extends string = string,\n TDetails = unknown,\n> extends Error {\n name: TName;\n\n details: TDetails;\n\n message: TMessage;\n\n constructor(\n message = 'An application error occurred' as TMessage,\n details: TDetails = {} as TDetails\n ) {\n super();\n this.name = 'ApplicationError' as TName;\n this.message = message;\n this.details = details;\n }\n}\n\nclass ValidationError<\n TMessage extends string = string,\n TDetails = unknown,\n> extends ApplicationError<'ValidationError', TMessage, TDetails> {\n constructor(message: TMessage, details?: TDetails) {\n super(message, details);\n this.name = 'ValidationError';\n }\n}\n\ninterface YupFormattedError {\n path: string[];\n message: string;\n name: string;\n value: string;\n}\n\nclass YupValidationError<TMessage extends string = string> extends ValidationError<\n TMessage,\n { errors: YupFormattedError[] }\n> {\n constructor(yupError: yup.ValidationError, message?: TMessage) {\n super('Validation' as TMessage);\n const { errors, message: yupMessage } = formatYupErrors(yupError);\n this.message = message || (yupMessage as TMessage);\n this.details = { errors };\n }\n}\n\nclass PaginationError<\n TMessage extends string = string,\n TDetails = unknown,\n> extends ApplicationError<'PaginationError', TMessage, TDetails> {\n constructor(message = 'Invalid pagination' as TMessage, details?: TDetails) {\n super(message, details);\n this.name = 'PaginationError';\n this.message = message;\n }\n}\n\nclass NotFoundError<TMessage extends string = string, TDetails = unknown> extends ApplicationError<\n 'NotFoundError',\n TMessage,\n TDetails\n> {\n constructor(message = 'Entity not found' as TMessage, details?: TDetails) {\n super(message, details);\n this.name = 'NotFoundError';\n this.message = message;\n }\n}\n\nclass ForbiddenError<\n TName extends string = 'ForbiddenError',\n TMessage extends string = string,\n TDetails = unknown,\n> extends ApplicationError<TName, TMessage, TDetails> {\n constructor(message = 'Forbidden access' as TMessage, details?: TDetails) {\n super(message, details);\n this.name = 'ForbiddenError' as TName;\n this.message = message;\n }\n}\n\nclass UnauthorizedError<\n TMessage extends string = string,\n TDetails = unknown,\n> extends ApplicationError<'UnauthorizedError', TMessage, TDetails> {\n constructor(message = 'Unauthorized' as TMessage, details?: TDetails) {\n super(message, details);\n this.name = 'UnauthorizedError';\n this.message = message;\n }\n}\n\nclass RateLimitError<TMessage extends string = string, TDetails = unknown> extends ApplicationError<\n 'RateLimitError',\n TMessage,\n TDetails\n> {\n constructor(\n message = 'Too many requests, please try again later.' as TMessage,\n details?: TDetails\n ) {\n super(message, details);\n this.name = 'RateLimitError';\n this.message = message;\n this.details = details || ({} as TDetails);\n }\n}\n\nclass PayloadTooLargeError<\n TMessage extends string = string,\n TDetails = unknown,\n> extends ApplicationError<'PayloadTooLargeError', TMessage, TDetails> {\n constructor(message = 'Entity too large' as TMessage, details?: TDetails) {\n super(message, details);\n this.name = 'PayloadTooLargeError';\n this.message = message;\n }\n}\n\nclass PolicyError<TMessage extends string = string, TDetails = unknown> extends ForbiddenError<\n 'PolicyError',\n TMessage,\n TDetails\n> {\n constructor(message = 'Policy Failed' as TMessage, details?: TDetails) {\n super(message, details);\n this.name = 'PolicyError';\n this.message = message;\n this.details = details || ({} as TDetails);\n }\n}\n\nclass NotImplementedError<\n TMessage extends string = string,\n TDetails = unknown,\n> extends ApplicationError<'NotImplementedError', TMessage, TDetails> {\n constructor(message = 'This feature is not implemented yet' as TMessage, details?: TDetails) {\n super(message, details);\n this.name = 'NotImplementedError';\n this.message = message;\n }\n}\n\nexport {\n HttpError,\n ApplicationError,\n ValidationError,\n YupValidationError,\n PaginationError,\n NotFoundError,\n ForbiddenError,\n UnauthorizedError,\n RateLimitError,\n PayloadTooLargeError,\n PolicyError,\n NotImplementedError,\n};\n"],"names":["ApplicationError","Error","message","details","name","ValidationError","YupValidationError","yupError","errors","yupMessage","formatYupErrors","PaginationError","NotFoundError","ForbiddenError","UnauthorizedError","RateLimitError","PayloadTooLargeError","PolicyError","NotImplementedError"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"errors.mjs","sources":["../src/errors.ts"],"sourcesContent":["/* eslint-disable max-classes-per-file */\n\nimport yup from 'yup';\nimport { HttpError } from 'http-errors';\nimport { formatYupErrors } from './format-yup-error';\n\n/* ApplicationError */\nclass ApplicationError<\n TName extends string = 'ApplicationError',\n TMessage extends string = string,\n TDetails = unknown,\n> extends Error {\n name: TName;\n\n details: TDetails;\n\n message: TMessage;\n\n constructor(\n message = 'An application error occurred' as TMessage,\n details: TDetails = {} as TDetails\n ) {\n super();\n this.name = 'ApplicationError' as TName;\n this.message = message;\n this.details = details;\n }\n}\n\nclass ValidationError<\n TMessage extends string = string,\n TDetails = unknown,\n> extends ApplicationError<'ValidationError', TMessage, TDetails> {\n constructor(message: TMessage, details?: TDetails) {\n super(message, details);\n this.name = 'ValidationError';\n }\n}\n\ninterface YupFormattedError {\n path: string[];\n message: string;\n name: string;\n value: string;\n}\n\nclass YupValidationError<TMessage extends string = string> extends ValidationError<\n TMessage,\n { errors: YupFormattedError[] }\n> {\n constructor(yupError: yup.ValidationError, message?: TMessage) {\n super('Validation' as TMessage);\n const { errors, message: yupMessage } = formatYupErrors(yupError);\n this.message = message || (yupMessage as TMessage);\n this.details = { errors };\n }\n}\n\nclass PaginationError<\n TMessage extends string = string,\n TDetails = unknown,\n> extends ApplicationError<'PaginationError', TMessage, TDetails> {\n constructor(message = 'Invalid pagination' as TMessage, details?: TDetails) {\n super(message, details);\n this.name = 'PaginationError';\n this.message = message;\n }\n}\n\nclass NotFoundError<TMessage extends string = string, TDetails = unknown> extends ApplicationError<\n 'NotFoundError',\n TMessage,\n TDetails\n> {\n constructor(message = 'Entity not found' as TMessage, details?: TDetails) {\n super(message, details);\n this.name = 'NotFoundError';\n this.message = message;\n }\n}\n\nclass ForbiddenError<\n TName extends string = 'ForbiddenError',\n TMessage extends string = string,\n TDetails = unknown,\n> extends ApplicationError<TName, TMessage, TDetails> {\n constructor(message = 'Forbidden access' as TMessage, details?: TDetails) {\n super(message, details);\n this.name = 'ForbiddenError' as TName;\n this.message = message;\n }\n}\n\nclass UnauthorizedError<\n TMessage extends string = string,\n TDetails = unknown,\n> extends ApplicationError<'UnauthorizedError', TMessage, TDetails> {\n constructor(message = 'Unauthorized' as TMessage, details?: TDetails) {\n super(message, details);\n this.name = 'UnauthorizedError';\n this.message = message;\n }\n}\n\nclass RateLimitError<TMessage extends string = string, TDetails = unknown> extends ApplicationError<\n 'RateLimitError',\n TMessage,\n TDetails\n> {\n constructor(\n message = 'Too many requests, please try again later.' as TMessage,\n details?: TDetails\n ) {\n super(message, details);\n this.name = 'RateLimitError';\n this.message = message;\n this.details = details || ({} as TDetails);\n }\n}\n\nclass PayloadTooLargeError<\n TMessage extends string = string,\n TDetails = unknown,\n> extends ApplicationError<'PayloadTooLargeError', TMessage, TDetails> {\n constructor(message = 'Entity too large' as TMessage, details?: TDetails) {\n super(message, details);\n this.name = 'PayloadTooLargeError';\n this.message = message;\n }\n}\n\nclass PolicyError<TMessage extends string = string, TDetails = unknown> extends ForbiddenError<\n 'PolicyError',\n TMessage,\n TDetails\n> {\n constructor(message = 'Policy Failed' as TMessage, details?: TDetails) {\n super(message, details);\n this.name = 'PolicyError';\n this.message = message;\n this.details = details || ({} as TDetails);\n }\n}\n\nclass NotImplementedError<\n TMessage extends string = string,\n TDetails = unknown,\n> extends ApplicationError<'NotImplementedError', TMessage, TDetails> {\n constructor(message = 'This feature is not implemented yet' as TMessage, details?: TDetails) {\n super(message, details);\n this.name = 'NotImplementedError';\n this.message = message;\n }\n}\n\nexport {\n HttpError,\n ApplicationError,\n ValidationError,\n YupValidationError,\n PaginationError,\n NotFoundError,\n ForbiddenError,\n UnauthorizedError,\n RateLimitError,\n PayloadTooLargeError,\n PolicyError,\n NotImplementedError,\n};\n"],"names":["ApplicationError","Error","message","details","name","ValidationError","YupValidationError","yupError","errors","yupMessage","formatYupErrors","PaginationError","NotFoundError","ForbiddenError","UnauthorizedError","RateLimitError","PayloadTooLargeError","PolicyError","NotImplementedError"],"mappings":";;;AAMA,uBACA,MAAMA,gBAAAA,SAIIC,KAAAA,CAAAA;AAOR,IAAA,WAAA,CACEC,UAAU,+BAA2C,EACrDC,OAAAA,GAAoB,EAAc,CAClC;QACA,KAAK,EAAA;QACL,IAAI,CAACC,IAAI,GAAG,kBAAA;QACZ,IAAI,CAACF,OAAO,GAAGA,OAAAA;QACf,IAAI,CAACC,OAAO,GAAGA,OAAAA;AACjB,IAAA;AACF;AAEA,MAAME,eAAAA,SAGIL,gBAAAA,CAAAA;IACR,WAAA,CAAYE,OAAiB,EAAEC,OAAkB,CAAE;AACjD,QAAA,KAAK,CAACD,OAAAA,EAASC,OAAAA,CAAAA;QACf,IAAI,CAACC,IAAI,GAAG,iBAAA;AACd,IAAA;AACF;AASA,MAAME,kBAAAA,SAA6DD,eAAAA,CAAAA;IAIjE,WAAA,CAAYE,QAA6B,EAAEL,OAAkB,CAAE;AAC7D,QAAA,KAAK,CAAC,YAAA,CAAA;AACN,QAAA,MAAM,EAAEM,MAAM,EAAEN,SAASO,UAAU,EAAE,GAAGC,eAAAA,CAAgBH,QAAAA,CAAAA;QACxD,IAAI,CAACL,OAAO,GAAGA,OAAAA,IAAYO,UAAAA;QAC3B,IAAI,CAACN,OAAO,GAAG;AAAEK,YAAAA;AAAO,SAAA;AAC1B,IAAA;AACF;AAEA,MAAMG,eAAAA,SAGIX,gBAAAA,CAAAA;AACR,IAAA,WAAA,CAAYE,OAAAA,GAAU,oBAAgC,EAAEC,OAAkB,CAAE;AAC1E,QAAA,KAAK,CAACD,OAAAA,EAASC,OAAAA,CAAAA;QACf,IAAI,CAACC,IAAI,GAAG,iBAAA;QACZ,IAAI,CAACF,OAAO,GAAGA,OAAAA;AACjB,IAAA;AACF;AAEA,MAAMU,aAAAA,SAA4EZ,gBAAAA,CAAAA;AAKhF,IAAA,WAAA,CAAYE,OAAAA,GAAU,kBAA8B,EAAEC,OAAkB,CAAE;AACxE,QAAA,KAAK,CAACD,OAAAA,EAASC,OAAAA,CAAAA;QACf,IAAI,CAACC,IAAI,GAAG,eAAA;QACZ,IAAI,CAACF,OAAO,GAAGA,OAAAA;AACjB,IAAA;AACF;AAEA,MAAMW,cAAAA,SAIIb,gBAAAA,CAAAA;AACR,IAAA,WAAA,CAAYE,OAAAA,GAAU,kBAA8B,EAAEC,OAAkB,CAAE;AACxE,QAAA,KAAK,CAACD,OAAAA,EAASC,OAAAA,CAAAA;QACf,IAAI,CAACC,IAAI,GAAG,gBAAA;QACZ,IAAI,CAACF,OAAO,GAAGA,OAAAA;AACjB,IAAA;AACF;AAEA,MAAMY,iBAAAA,SAGId,gBAAAA,CAAAA;AACR,IAAA,WAAA,CAAYE,OAAAA,GAAU,cAA0B,EAAEC,OAAkB,CAAE;AACpE,QAAA,KAAK,CAACD,OAAAA,EAASC,OAAAA,CAAAA;QACf,IAAI,CAACC,IAAI,GAAG,mBAAA;QACZ,IAAI,CAACF,OAAO,GAAGA,OAAAA;AACjB,IAAA;AACF;AAEA,MAAMa,cAAAA,SAA6Ef,gBAAAA,CAAAA;AAKjF,IAAA,WAAA,CACEE,OAAAA,GAAU,4CAAwD,EAClEC,OAAkB,CAClB;AACA,QAAA,KAAK,CAACD,OAAAA,EAASC,OAAAA,CAAAA;QACf,IAAI,CAACC,IAAI,GAAG,gBAAA;QACZ,IAAI,CAACF,OAAO,GAAGA,OAAAA;AACf,QAAA,IAAI,CAACC,OAAO,GAAGA,OAAAA,IAAY,EAAC;AAC9B,IAAA;AACF;AAEA,MAAMa,oBAAAA,SAGIhB,gBAAAA,CAAAA;AACR,IAAA,WAAA,CAAYE,OAAAA,GAAU,kBAA8B,EAAEC,OAAkB,CAAE;AACxE,QAAA,KAAK,CAACD,OAAAA,EAASC,OAAAA,CAAAA;QACf,IAAI,CAACC,IAAI,GAAG,sBAAA;QACZ,IAAI,CAACF,OAAO,GAAGA,OAAAA;AACjB,IAAA;AACF;AAEA,MAAMe,WAAAA,SAA0EJ,cAAAA,CAAAA;AAK9E,IAAA,WAAA,CAAYX,OAAAA,GAAU,eAA2B,EAAEC,OAAkB,CAAE;AACrE,QAAA,KAAK,CAACD,OAAAA,EAASC,OAAAA,CAAAA;QACf,IAAI,CAACC,IAAI,GAAG,aAAA;QACZ,IAAI,CAACF,OAAO,GAAGA,OAAAA;AACf,QAAA,IAAI,CAACC,OAAO,GAAGA,OAAAA,IAAY,EAAC;AAC9B,IAAA;AACF;AAEA,MAAMe,mBAAAA,SAGIlB,gBAAAA,CAAAA;AACR,IAAA,WAAA,CAAYE,OAAAA,GAAU,qCAAiD,EAAEC,OAAkB,CAAE;AAC3F,QAAA,KAAK,CAACD,OAAAA,EAASC,OAAAA,CAAAA;QACf,IAAI,CAACC,IAAI,GAAG,qBAAA;QACZ,IAAI,CAACF,OAAO,GAAGA,OAAAA;AACjB,IAAA;AACF;;;;"}
1
+ {"version":3,"file":"errors.mjs","sources":["../src/errors.ts"],"sourcesContent":["/* eslint-disable max-classes-per-file */\n\nimport * as yup from 'yup';\nimport { HttpError } from 'http-errors';\nimport { formatYupErrors } from './format-yup-error';\n\n/* ApplicationError */\nclass ApplicationError<\n TName extends string = 'ApplicationError',\n TMessage extends string = string,\n TDetails = unknown,\n> extends Error {\n name: TName;\n\n details: TDetails;\n\n message: TMessage;\n\n constructor(\n message = 'An application error occurred' as TMessage,\n details: TDetails = {} as TDetails\n ) {\n super();\n this.name = 'ApplicationError' as TName;\n this.message = message;\n this.details = details;\n }\n}\n\nclass ValidationError<\n TMessage extends string = string,\n TDetails = unknown,\n> extends ApplicationError<'ValidationError', TMessage, TDetails> {\n constructor(message: TMessage, details?: TDetails) {\n super(message, details);\n this.name = 'ValidationError';\n }\n}\n\ninterface YupFormattedError {\n path: string[];\n message: string;\n name: string;\n value: string;\n}\n\nclass YupValidationError<TMessage extends string = string> extends ValidationError<\n TMessage,\n { errors: YupFormattedError[] }\n> {\n constructor(yupError: yup.ValidationError, message?: TMessage) {\n super('Validation' as TMessage);\n const { errors, message: yupMessage } = formatYupErrors(yupError);\n this.message = message || (yupMessage as TMessage);\n this.details = { errors };\n }\n}\n\nclass PaginationError<\n TMessage extends string = string,\n TDetails = unknown,\n> extends ApplicationError<'PaginationError', TMessage, TDetails> {\n constructor(message = 'Invalid pagination' as TMessage, details?: TDetails) {\n super(message, details);\n this.name = 'PaginationError';\n this.message = message;\n }\n}\n\nclass NotFoundError<TMessage extends string = string, TDetails = unknown> extends ApplicationError<\n 'NotFoundError',\n TMessage,\n TDetails\n> {\n constructor(message = 'Entity not found' as TMessage, details?: TDetails) {\n super(message, details);\n this.name = 'NotFoundError';\n this.message = message;\n }\n}\n\nclass ForbiddenError<\n TName extends string = 'ForbiddenError',\n TMessage extends string = string,\n TDetails = unknown,\n> extends ApplicationError<TName, TMessage, TDetails> {\n constructor(message = 'Forbidden access' as TMessage, details?: TDetails) {\n super(message, details);\n this.name = 'ForbiddenError' as TName;\n this.message = message;\n }\n}\n\nclass UnauthorizedError<\n TMessage extends string = string,\n TDetails = unknown,\n> extends ApplicationError<'UnauthorizedError', TMessage, TDetails> {\n constructor(message = 'Unauthorized' as TMessage, details?: TDetails) {\n super(message, details);\n this.name = 'UnauthorizedError';\n this.message = message;\n }\n}\n\nclass RateLimitError<TMessage extends string = string, TDetails = unknown> extends ApplicationError<\n 'RateLimitError',\n TMessage,\n TDetails\n> {\n constructor(\n message = 'Too many requests, please try again later.' as TMessage,\n details?: TDetails\n ) {\n super(message, details);\n this.name = 'RateLimitError';\n this.message = message;\n this.details = details || ({} as TDetails);\n }\n}\n\nclass PayloadTooLargeError<\n TMessage extends string = string,\n TDetails = unknown,\n> extends ApplicationError<'PayloadTooLargeError', TMessage, TDetails> {\n constructor(message = 'Entity too large' as TMessage, details?: TDetails) {\n super(message, details);\n this.name = 'PayloadTooLargeError';\n this.message = message;\n }\n}\n\nclass PolicyError<TMessage extends string = string, TDetails = unknown> extends ForbiddenError<\n 'PolicyError',\n TMessage,\n TDetails\n> {\n constructor(message = 'Policy Failed' as TMessage, details?: TDetails) {\n super(message, details);\n this.name = 'PolicyError';\n this.message = message;\n this.details = details || ({} as TDetails);\n }\n}\n\nclass NotImplementedError<\n TMessage extends string = string,\n TDetails = unknown,\n> extends ApplicationError<'NotImplementedError', TMessage, TDetails> {\n constructor(message = 'This feature is not implemented yet' as TMessage, details?: TDetails) {\n super(message, details);\n this.name = 'NotImplementedError';\n this.message = message;\n }\n}\n\nexport {\n HttpError,\n ApplicationError,\n ValidationError,\n YupValidationError,\n PaginationError,\n NotFoundError,\n ForbiddenError,\n UnauthorizedError,\n RateLimitError,\n PayloadTooLargeError,\n PolicyError,\n NotImplementedError,\n};\n"],"names":["ApplicationError","Error","message","details","name","ValidationError","YupValidationError","yupError","errors","yupMessage","formatYupErrors","PaginationError","NotFoundError","ForbiddenError","UnauthorizedError","RateLimitError","PayloadTooLargeError","PolicyError","NotImplementedError"],"mappings":"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"}
@@ -12,7 +12,7 @@ const generateInstallId = (projectId, installId)=>{
12
12
  try {
13
13
  const machineId = nodeMachineId.machineIdSync();
14
14
  return projectId ? crypto__default.default.createHash('sha256').update(`${machineId}-${projectId}`).digest('hex') : crypto__default.default.randomUUID();
15
- } catch (error) {
15
+ } catch {
16
16
  return crypto__default.default.randomUUID();
17
17
  }
18
18
  };
@@ -1 +1 @@
1
- {"version":3,"file":"install-id.js","sources":["../src/install-id.ts"],"sourcesContent":["import crypto from 'crypto';\nimport { machineIdSync } from 'node-machine-id';\n\nexport const generateInstallId = (projectId: string, installId: string) => {\n if (installId) return installId;\n try {\n const machineId = machineIdSync();\n return projectId\n ? crypto.createHash('sha256').update(`${machineId}-${projectId}`).digest('hex')\n : crypto.randomUUID();\n } catch (error) {\n return crypto.randomUUID();\n }\n};\n"],"names":["generateInstallId","projectId","installId","machineId","machineIdSync","crypto","createHash","update","digest","randomUUID","error"],"mappings":";;;;;;;;;AAGO,MAAMA,iBAAAA,GAAoB,CAACC,SAAAA,EAAmBC,SAAAA,GAAAA;AACnD,IAAA,IAAIA,WAAW,OAAOA,SAAAA;IACtB,IAAI;AACF,QAAA,MAAMC,SAAAA,GAAYC,2BAAAA,EAAAA;AAClB,QAAA,OAAOH,YACHI,uBAAAA,CAAOC,UAAU,CAAC,QAAA,CAAA,CAAUC,MAAM,CAAC,CAAA,EAAGJ,SAAAA,CAAU,CAAC,EAAEF,SAAAA,CAAAA,CAAW,CAAA,CAAEO,MAAM,CAAC,KAAA,CAAA,GACvEH,wBAAOI,UAAU,EAAA;AACvB,IAAA,CAAA,CAAE,OAAOC,KAAAA,EAAO;AACd,QAAA,OAAOL,wBAAOI,UAAU,EAAA;AAC1B,IAAA;AACF;;;;"}
1
+ {"version":3,"file":"install-id.js","sources":["../src/install-id.ts"],"sourcesContent":["import crypto from 'crypto';\nimport { machineIdSync } from 'node-machine-id';\n\nexport const generateInstallId = (projectId: string, installId: string) => {\n if (installId) return installId;\n try {\n const machineId = machineIdSync();\n return projectId\n ? crypto.createHash('sha256').update(`${machineId}-${projectId}`).digest('hex')\n : crypto.randomUUID();\n } catch {\n return crypto.randomUUID();\n }\n};\n"],"names":["generateInstallId","projectId","installId","machineId","machineIdSync","crypto","createHash","update","digest","randomUUID"],"mappings":";;;;;;;;;AAGO,MAAMA,iBAAAA,GAAoB,CAACC,SAAAA,EAAmBC,SAAAA,GAAAA;AACnD,IAAA,IAAIA,WAAW,OAAOA,SAAAA;IACtB,IAAI;AACF,QAAA,MAAMC,SAAAA,GAAYC,2BAAAA,EAAAA;AAClB,QAAA,OAAOH,YACHI,uBAAAA,CAAOC,UAAU,CAAC,QAAA,CAAA,CAAUC,MAAM,CAAC,CAAA,EAAGJ,SAAAA,CAAU,CAAC,EAAEF,SAAAA,CAAAA,CAAW,CAAA,CAAEO,MAAM,CAAC,KAAA,CAAA,GACvEH,wBAAOI,UAAU,EAAA;AACvB,IAAA,CAAA,CAAE,OAAM;AACN,QAAA,OAAOJ,wBAAOI,UAAU,EAAA;AAC1B,IAAA;AACF;;;;"}
@@ -6,7 +6,7 @@ const generateInstallId = (projectId, installId)=>{
6
6
  try {
7
7
  const machineId = machineIdSync();
8
8
  return projectId ? crypto.createHash('sha256').update(`${machineId}-${projectId}`).digest('hex') : crypto.randomUUID();
9
- } catch (error) {
9
+ } catch {
10
10
  return crypto.randomUUID();
11
11
  }
12
12
  };
@@ -1 +1 @@
1
- {"version":3,"file":"install-id.mjs","sources":["../src/install-id.ts"],"sourcesContent":["import crypto from 'crypto';\nimport { machineIdSync } from 'node-machine-id';\n\nexport const generateInstallId = (projectId: string, installId: string) => {\n if (installId) return installId;\n try {\n const machineId = machineIdSync();\n return projectId\n ? crypto.createHash('sha256').update(`${machineId}-${projectId}`).digest('hex')\n : crypto.randomUUID();\n } catch (error) {\n return crypto.randomUUID();\n }\n};\n"],"names":["generateInstallId","projectId","installId","machineId","machineIdSync","crypto","createHash","update","digest","randomUUID","error"],"mappings":";;;AAGO,MAAMA,iBAAAA,GAAoB,CAACC,SAAAA,EAAmBC,SAAAA,GAAAA;AACnD,IAAA,IAAIA,WAAW,OAAOA,SAAAA;IACtB,IAAI;AACF,QAAA,MAAMC,SAAAA,GAAYC,aAAAA,EAAAA;AAClB,QAAA,OAAOH,YACHI,MAAAA,CAAOC,UAAU,CAAC,QAAA,CAAA,CAAUC,MAAM,CAAC,CAAA,EAAGJ,SAAAA,CAAU,CAAC,EAAEF,SAAAA,CAAAA,CAAW,CAAA,CAAEO,MAAM,CAAC,KAAA,CAAA,GACvEH,OAAOI,UAAU,EAAA;AACvB,IAAA,CAAA,CAAE,OAAOC,KAAAA,EAAO;AACd,QAAA,OAAOL,OAAOI,UAAU,EAAA;AAC1B,IAAA;AACF;;;;"}
1
+ {"version":3,"file":"install-id.mjs","sources":["../src/install-id.ts"],"sourcesContent":["import crypto from 'crypto';\nimport { machineIdSync } from 'node-machine-id';\n\nexport const generateInstallId = (projectId: string, installId: string) => {\n if (installId) return installId;\n try {\n const machineId = machineIdSync();\n return projectId\n ? crypto.createHash('sha256').update(`${machineId}-${projectId}`).digest('hex')\n : crypto.randomUUID();\n } catch {\n return crypto.randomUUID();\n }\n};\n"],"names":["generateInstallId","projectId","installId","machineId","machineIdSync","crypto","createHash","update","digest","randomUUID"],"mappings":";;;AAGO,MAAMA,iBAAAA,GAAoB,CAACC,SAAAA,EAAmBC,SAAAA,GAAAA;AACnD,IAAA,IAAIA,WAAW,OAAOA,SAAAA;IACtB,IAAI;AACF,QAAA,MAAMC,SAAAA,GAAYC,aAAAA,EAAAA;AAClB,QAAA,OAAOH,YACHI,MAAAA,CAAOC,UAAU,CAAC,QAAA,CAAA,CAAUC,MAAM,CAAC,CAAA,EAAGJ,SAAAA,CAAU,CAAC,EAAEF,SAAAA,CAAAA,CAAW,CAAA,CAAEO,MAAM,CAAC,KAAA,CAAA,GACvEH,OAAOI,UAAU,EAAA;AACvB,IAAA,CAAA,CAAE,OAAM;AACN,QAAA,OAAOJ,OAAOI,UAAU,EAAA;AAC1B,IAAA;AACF;;;;"}
@@ -1,6 +1,6 @@
1
1
  interface PaginationArgs {
2
2
  page: number;
3
- pageSize: number;
3
+ pageSize: number | null;
4
4
  start: number;
5
5
  limit: number;
6
6
  }
@@ -1 +1 @@
1
- {"version":3,"file":"pagination.d.ts","sourceRoot":"","sources":["../src/pagination.ts"],"names":[],"mappings":"AAGA,UAAU,cAAc;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,yBAAyB;IACxC,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,2BAA2B;IAC1C,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf;AA0CD,QAAA,MAAM,qBAAqB,GAAI,CAAC,SAAS,OAAO,CAAC,cAAc,CAAC,EAC9D,MAAM,CAAC,EACP;;;CAAqC;;;cAuDtC,CAAC;AAEF;;;;;;;;GAQG;AACH,QAAA,MAAM,4BAA4B,GAChC,gBAAgB,OAAO,CAAC,cAAc,CAAC,EACvC,OAAO,MAAM,KACZ,yBAkCF,CAAC;AAEF;;;;;;;GAOG;AACH,QAAA,MAAM,6BAA6B,GACjC,gBAAgB,OAAO,CAAC,cAAc,CAAC,EACvC,OAAO,MAAM,KACZ,2BAuBF,CAAC;AAEF,OAAO,EAAE,qBAAqB,EAAE,4BAA4B,EAAE,6BAA6B,EAAE,CAAC"}
1
+ {"version":3,"file":"pagination.d.ts","sourceRoot":"","sources":["../src/pagination.ts"],"names":[],"mappings":"AAGA,UAAU,cAAc;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,yBAAyB;IACxC,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,2BAA2B;IAC1C,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf;AA0CD,QAAA,MAAM,qBAAqB,GAAI,CAAC,SAAS,OAAO,CAAC,cAAc,CAAC,EAC9D,MAAM,CAAC,EACP;;;CAAqC;;;cAwDtC,CAAC;AAEF;;;;;;;;GAQG;AACH,QAAA,MAAM,4BAA4B,GAChC,gBAAgB,OAAO,CAAC,cAAc,CAAC,EACvC,OAAO,MAAM,KACZ,yBAkCF,CAAC;AAEF;;;;;;;GAOG;AACH,QAAA,MAAM,6BAA6B,GACjC,gBAAgB,OAAO,CAAC,cAAc,CAAC,EACvC,OAAO,MAAM,KACZ,2BAuBF,CAAC;AAEF,OAAO,EAAE,qBAAqB,EAAE,4BAA4B,EAAE,6BAA6B,EAAE,CAAC"}
@@ -66,13 +66,20 @@ const withDefaultPagination = (args, { defaults = {}, maxLimit = -1 } = {})=>{
66
66
  }
67
67
  // Page / PageSize
68
68
  if (usePagePagination) {
69
- const { page, pageSize } = fp.merge(defaultValues.page, {
69
+ const pageArgs = fp.isNil(args.pageSize) ? fp.omit([
70
+ 'pageSize'
71
+ ], args) : {
70
72
  ...args,
71
- pageSize: Math.max(1, args.pageSize ?? 0)
72
- });
73
- Object.assign(pagination, {
74
- start: (page - 1) * pageSize,
73
+ pageSize: Math.max(1, args.pageSize)
74
+ };
75
+ const { page, pageSize } = fp.merge(defaultValues.page, pageArgs);
76
+ const pageLimit = ensureValidValues({
77
+ start: 0,
75
78
  limit: pageSize
79
+ }).limit;
80
+ Object.assign(pagination, {
81
+ start: (page - 1) * pageLimit,
82
+ limit: pageLimit
76
83
  });
77
84
  }
78
85
  // Handle -1 limit
@@ -1 +1 @@
1
- {"version":3,"file":"pagination.js","sources":["../src/pagination.ts"],"sourcesContent":["import { merge, pipe, omit, isNil } from 'lodash/fp';\nimport { PaginationError } from './errors';\n\ninterface PaginationArgs {\n page: number;\n pageSize: number;\n start: number;\n limit: number;\n}\n\nexport interface Pagination {\n start: number;\n limit: number;\n}\n\nexport interface PagePatinationInformation {\n page: number;\n pageSize: number;\n pageCount: number;\n total: number;\n}\n\nexport interface OffsetPaginationInformation {\n start: number;\n limit: number;\n total: number;\n}\n\nconst STRAPI_DEFAULTS = {\n offset: {\n start: 0,\n limit: 10,\n },\n page: {\n page: 1,\n pageSize: 10,\n },\n};\n\nconst paginationAttributes = ['start', 'limit', 'page', 'pageSize'];\n\nconst withMaxLimit = (limit: number, maxLimit = -1) => {\n if (maxLimit === -1 || limit < maxLimit) {\n return limit;\n }\n\n return maxLimit;\n};\n\n// Ensure minimum page & pageSize values (page >= 1, pageSize >= 0, start >= 0, limit >= 0)\nconst ensureMinValues = ({ start, limit }: Pagination) => ({\n start: Math.max(start, 0),\n limit: limit === -1 ? limit : Math.max(limit, 1),\n});\n\nconst ensureMaxValues =\n (maxLimit = -1) =>\n ({ start, limit }: { start: number; limit: number }) => ({\n start,\n limit: withMaxLimit(limit, maxLimit),\n });\n\n// Apply maxLimit as the limit when limit is -1\nconst withNoLimit = (pagination: Pagination, maxLimit = -1) => ({\n ...pagination,\n limit: pagination.limit === -1 ? maxLimit : pagination.limit,\n});\n\nconst withDefaultPagination = <T extends Partial<PaginationArgs>>(\n args: T,\n { defaults = {}, maxLimit = -1 } = {}\n) => {\n const defaultValues = merge(STRAPI_DEFAULTS, defaults);\n\n const usePagePagination = !isNil(args.page) || !isNil(args.pageSize);\n const useOffsetPagination = !isNil(args.start) || !isNil(args.limit);\n\n const ensureValidValues = pipe(ensureMinValues, ensureMaxValues(maxLimit));\n\n // If there is no pagination attribute, don't modify the payload\n if (!usePagePagination && !useOffsetPagination) {\n return merge(args, ensureValidValues(defaultValues.offset));\n }\n\n // If there is page & offset pagination attributes, throw an error\n if (usePagePagination && useOffsetPagination) {\n throw new PaginationError('Cannot use both page & offset pagination in the same query');\n }\n\n const pagination: Pagination = {\n start: 0,\n limit: 0,\n };\n\n // Start / Limit\n if (useOffsetPagination) {\n const { start, limit } = merge(defaultValues.offset, args);\n\n Object.assign(pagination, { start, limit });\n }\n\n // Page / PageSize\n if (usePagePagination) {\n const { page, pageSize } = merge(defaultValues.page, {\n ...args,\n pageSize: Math.max(1, args.pageSize ?? 0),\n });\n\n Object.assign(pagination, {\n start: (page - 1) * pageSize,\n limit: pageSize,\n });\n }\n\n // Handle -1 limit\n Object.assign(pagination, withNoLimit(pagination, maxLimit));\n\n const replacePaginationAttributes = pipe(\n // Remove pagination attributes\n omit(paginationAttributes),\n // Merge the object with the new pagination + ensure minimum & maximum values\n merge(ensureValidValues(pagination))\n );\n\n return replacePaginationAttributes(args);\n};\n\n/**\n * Transform pagination information into a paginated response:\n * {\n * page: number,\n * pageSize: number,\n * pageCount: number,\n * total: number\n * }\n */\nconst transformPagedPaginationInfo = (\n paginationInfo: Partial<PaginationArgs>,\n total: number\n): PagePatinationInformation => {\n if (!isNil(paginationInfo.page)) {\n const page = paginationInfo.page;\n const pageSize = paginationInfo.pageSize ?? total;\n\n return {\n page,\n pageSize,\n pageCount: pageSize > 0 ? Math.ceil(total / pageSize) : 0,\n total,\n };\n }\n\n if (!isNil(paginationInfo.start)) {\n const start = paginationInfo.start;\n const limit = paginationInfo.limit ?? total;\n\n // Start limit to page page size\n return {\n page: Math.floor(start / limit) + 1,\n pageSize: limit,\n pageCount: limit > 0 ? Math.ceil(total / limit) : 0,\n total,\n };\n }\n\n // Default pagination\n return {\n ...paginationInfo,\n page: 1,\n pageSize: 10,\n pageCount: 1,\n total,\n };\n};\n\n/**\n * Transform pagination information into a offset response:\n * {\n * start: number,\n * limit: number,\n * total: number\n * }\n */\nconst transformOffsetPaginationInfo = (\n paginationInfo: Partial<PaginationArgs>,\n total: number\n): OffsetPaginationInformation => {\n if (!isNil(paginationInfo.page)) {\n const limit = paginationInfo.pageSize ?? total;\n const start = (paginationInfo.page - 1) * limit;\n\n return { start, limit, total };\n }\n\n if (!isNil(paginationInfo.start)) {\n const start = paginationInfo.start;\n const limit = paginationInfo.limit ?? total;\n\n // Start limit to page page size\n return { start, limit, total };\n }\n\n // Default pagination\n return {\n ...paginationInfo,\n start: 0,\n limit: 10,\n total,\n };\n};\n\nexport { withDefaultPagination, transformPagedPaginationInfo, transformOffsetPaginationInfo };\n"],"names":["STRAPI_DEFAULTS","offset","start","limit","page","pageSize","paginationAttributes","withMaxLimit","maxLimit","ensureMinValues","Math","max","ensureMaxValues","withNoLimit","pagination","withDefaultPagination","args","defaults","defaultValues","merge","usePagePagination","isNil","useOffsetPagination","ensureValidValues","pipe","PaginationError","Object","assign","replacePaginationAttributes","omit","transformPagedPaginationInfo","paginationInfo","total","pageCount","ceil","floor","transformOffsetPaginationInfo"],"mappings":"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"}
1
+ {"version":3,"file":"pagination.js","sources":["../src/pagination.ts"],"sourcesContent":["import { merge, pipe, omit, isNil } from 'lodash/fp';\nimport { PaginationError } from './errors';\n\ninterface PaginationArgs {\n page: number;\n pageSize: number | null;\n start: number;\n limit: number;\n}\n\nexport interface Pagination {\n start: number;\n limit: number;\n}\n\nexport interface PagePatinationInformation {\n page: number;\n pageSize: number;\n pageCount: number;\n total: number;\n}\n\nexport interface OffsetPaginationInformation {\n start: number;\n limit: number;\n total: number;\n}\n\nconst STRAPI_DEFAULTS = {\n offset: {\n start: 0,\n limit: 10,\n },\n page: {\n page: 1,\n pageSize: 10,\n },\n};\n\nconst paginationAttributes = ['start', 'limit', 'page', 'pageSize'];\n\nconst withMaxLimit = (limit: number, maxLimit = -1) => {\n if (maxLimit === -1 || limit < maxLimit) {\n return limit;\n }\n\n return maxLimit;\n};\n\n// Ensure minimum page & pageSize values (page >= 1, pageSize >= 0, start >= 0, limit >= 0)\nconst ensureMinValues = ({ start, limit }: Pagination) => ({\n start: Math.max(start, 0),\n limit: limit === -1 ? limit : Math.max(limit, 1),\n});\n\nconst ensureMaxValues =\n (maxLimit = -1) =>\n ({ start, limit }: { start: number; limit: number }) => ({\n start,\n limit: withMaxLimit(limit, maxLimit),\n });\n\n// Apply maxLimit as the limit when limit is -1\nconst withNoLimit = (pagination: Pagination, maxLimit = -1) => ({\n ...pagination,\n limit: pagination.limit === -1 ? maxLimit : pagination.limit,\n});\n\nconst withDefaultPagination = <T extends Partial<PaginationArgs>>(\n args: T,\n { defaults = {}, maxLimit = -1 } = {}\n) => {\n const defaultValues = merge(STRAPI_DEFAULTS, defaults);\n\n const usePagePagination = !isNil(args.page) || !isNil(args.pageSize);\n const useOffsetPagination = !isNil(args.start) || !isNil(args.limit);\n\n const ensureValidValues = pipe(ensureMinValues, ensureMaxValues(maxLimit));\n\n // If there is no pagination attribute, don't modify the payload\n if (!usePagePagination && !useOffsetPagination) {\n return merge(args, ensureValidValues(defaultValues.offset));\n }\n\n // If there is page & offset pagination attributes, throw an error\n if (usePagePagination && useOffsetPagination) {\n throw new PaginationError('Cannot use both page & offset pagination in the same query');\n }\n\n const pagination: Pagination = {\n start: 0,\n limit: 0,\n };\n\n // Start / Limit\n if (useOffsetPagination) {\n const { start, limit } = merge(defaultValues.offset, args);\n\n Object.assign(pagination, { start, limit });\n }\n\n // Page / PageSize\n if (usePagePagination) {\n const pageArgs = isNil(args.pageSize)\n ? omit(['pageSize'], args)\n : { ...args, pageSize: Math.max(1, args.pageSize) };\n const { page, pageSize } = merge(defaultValues.page, pageArgs);\n const pageLimit = ensureValidValues({ start: 0, limit: pageSize }).limit;\n\n Object.assign(pagination, {\n start: (page - 1) * pageLimit,\n limit: pageLimit,\n });\n }\n\n // Handle -1 limit\n Object.assign(pagination, withNoLimit(pagination, maxLimit));\n\n const replacePaginationAttributes = pipe(\n // Remove pagination attributes\n omit(paginationAttributes),\n // Merge the object with the new pagination + ensure minimum & maximum values\n merge(ensureValidValues(pagination))\n );\n\n return replacePaginationAttributes(args);\n};\n\n/**\n * Transform pagination information into a paginated response:\n * {\n * page: number,\n * pageSize: number,\n * pageCount: number,\n * total: number\n * }\n */\nconst transformPagedPaginationInfo = (\n paginationInfo: Partial<PaginationArgs>,\n total: number\n): PagePatinationInformation => {\n if (!isNil(paginationInfo.page)) {\n const page = paginationInfo.page;\n const pageSize = paginationInfo.pageSize ?? total;\n\n return {\n page,\n pageSize,\n pageCount: pageSize > 0 ? Math.ceil(total / pageSize) : 0,\n total,\n };\n }\n\n if (!isNil(paginationInfo.start)) {\n const start = paginationInfo.start;\n const limit = paginationInfo.limit ?? total;\n\n // Start limit to page page size\n return {\n page: Math.floor(start / limit) + 1,\n pageSize: limit,\n pageCount: limit > 0 ? Math.ceil(total / limit) : 0,\n total,\n };\n }\n\n // Default pagination\n return {\n ...paginationInfo,\n page: 1,\n pageSize: 10,\n pageCount: 1,\n total,\n };\n};\n\n/**\n * Transform pagination information into a offset response:\n * {\n * start: number,\n * limit: number,\n * total: number\n * }\n */\nconst transformOffsetPaginationInfo = (\n paginationInfo: Partial<PaginationArgs>,\n total: number\n): OffsetPaginationInformation => {\n if (!isNil(paginationInfo.page)) {\n const limit = paginationInfo.pageSize ?? total;\n const start = (paginationInfo.page - 1) * limit;\n\n return { start, limit, total };\n }\n\n if (!isNil(paginationInfo.start)) {\n const start = paginationInfo.start;\n const limit = paginationInfo.limit ?? total;\n\n // Start limit to page page size\n return { start, limit, total };\n }\n\n // Default pagination\n return {\n ...paginationInfo,\n start: 0,\n limit: 10,\n total,\n };\n};\n\nexport { withDefaultPagination, transformPagedPaginationInfo, transformOffsetPaginationInfo };\n"],"names":["STRAPI_DEFAULTS","offset","start","limit","page","pageSize","paginationAttributes","withMaxLimit","maxLimit","ensureMinValues","Math","max","ensureMaxValues","withNoLimit","pagination","withDefaultPagination","args","defaults","defaultValues","merge","usePagePagination","isNil","useOffsetPagination","ensureValidValues","pipe","PaginationError","Object","assign","pageArgs","omit","pageLimit","replacePaginationAttributes","transformPagedPaginationInfo","paginationInfo","total","pageCount","ceil","floor","transformOffsetPaginationInfo"],"mappings":"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"}
@@ -64,13 +64,20 @@ const withDefaultPagination = (args, { defaults = {}, maxLimit = -1 } = {})=>{
64
64
  }
65
65
  // Page / PageSize
66
66
  if (usePagePagination) {
67
- const { page, pageSize } = merge(defaultValues.page, {
67
+ const pageArgs = isNil(args.pageSize) ? omit([
68
+ 'pageSize'
69
+ ], args) : {
68
70
  ...args,
69
- pageSize: Math.max(1, args.pageSize ?? 0)
70
- });
71
- Object.assign(pagination, {
72
- start: (page - 1) * pageSize,
71
+ pageSize: Math.max(1, args.pageSize)
72
+ };
73
+ const { page, pageSize } = merge(defaultValues.page, pageArgs);
74
+ const pageLimit = ensureValidValues({
75
+ start: 0,
73
76
  limit: pageSize
77
+ }).limit;
78
+ Object.assign(pagination, {
79
+ start: (page - 1) * pageLimit,
80
+ limit: pageLimit
74
81
  });
75
82
  }
76
83
  // Handle -1 limit
@@ -1 +1 @@
1
- {"version":3,"file":"pagination.mjs","sources":["../src/pagination.ts"],"sourcesContent":["import { merge, pipe, omit, isNil } from 'lodash/fp';\nimport { PaginationError } from './errors';\n\ninterface PaginationArgs {\n page: number;\n pageSize: number;\n start: number;\n limit: number;\n}\n\nexport interface Pagination {\n start: number;\n limit: number;\n}\n\nexport interface PagePatinationInformation {\n page: number;\n pageSize: number;\n pageCount: number;\n total: number;\n}\n\nexport interface OffsetPaginationInformation {\n start: number;\n limit: number;\n total: number;\n}\n\nconst STRAPI_DEFAULTS = {\n offset: {\n start: 0,\n limit: 10,\n },\n page: {\n page: 1,\n pageSize: 10,\n },\n};\n\nconst paginationAttributes = ['start', 'limit', 'page', 'pageSize'];\n\nconst withMaxLimit = (limit: number, maxLimit = -1) => {\n if (maxLimit === -1 || limit < maxLimit) {\n return limit;\n }\n\n return maxLimit;\n};\n\n// Ensure minimum page & pageSize values (page >= 1, pageSize >= 0, start >= 0, limit >= 0)\nconst ensureMinValues = ({ start, limit }: Pagination) => ({\n start: Math.max(start, 0),\n limit: limit === -1 ? limit : Math.max(limit, 1),\n});\n\nconst ensureMaxValues =\n (maxLimit = -1) =>\n ({ start, limit }: { start: number; limit: number }) => ({\n start,\n limit: withMaxLimit(limit, maxLimit),\n });\n\n// Apply maxLimit as the limit when limit is -1\nconst withNoLimit = (pagination: Pagination, maxLimit = -1) => ({\n ...pagination,\n limit: pagination.limit === -1 ? maxLimit : pagination.limit,\n});\n\nconst withDefaultPagination = <T extends Partial<PaginationArgs>>(\n args: T,\n { defaults = {}, maxLimit = -1 } = {}\n) => {\n const defaultValues = merge(STRAPI_DEFAULTS, defaults);\n\n const usePagePagination = !isNil(args.page) || !isNil(args.pageSize);\n const useOffsetPagination = !isNil(args.start) || !isNil(args.limit);\n\n const ensureValidValues = pipe(ensureMinValues, ensureMaxValues(maxLimit));\n\n // If there is no pagination attribute, don't modify the payload\n if (!usePagePagination && !useOffsetPagination) {\n return merge(args, ensureValidValues(defaultValues.offset));\n }\n\n // If there is page & offset pagination attributes, throw an error\n if (usePagePagination && useOffsetPagination) {\n throw new PaginationError('Cannot use both page & offset pagination in the same query');\n }\n\n const pagination: Pagination = {\n start: 0,\n limit: 0,\n };\n\n // Start / Limit\n if (useOffsetPagination) {\n const { start, limit } = merge(defaultValues.offset, args);\n\n Object.assign(pagination, { start, limit });\n }\n\n // Page / PageSize\n if (usePagePagination) {\n const { page, pageSize } = merge(defaultValues.page, {\n ...args,\n pageSize: Math.max(1, args.pageSize ?? 0),\n });\n\n Object.assign(pagination, {\n start: (page - 1) * pageSize,\n limit: pageSize,\n });\n }\n\n // Handle -1 limit\n Object.assign(pagination, withNoLimit(pagination, maxLimit));\n\n const replacePaginationAttributes = pipe(\n // Remove pagination attributes\n omit(paginationAttributes),\n // Merge the object with the new pagination + ensure minimum & maximum values\n merge(ensureValidValues(pagination))\n );\n\n return replacePaginationAttributes(args);\n};\n\n/**\n * Transform pagination information into a paginated response:\n * {\n * page: number,\n * pageSize: number,\n * pageCount: number,\n * total: number\n * }\n */\nconst transformPagedPaginationInfo = (\n paginationInfo: Partial<PaginationArgs>,\n total: number\n): PagePatinationInformation => {\n if (!isNil(paginationInfo.page)) {\n const page = paginationInfo.page;\n const pageSize = paginationInfo.pageSize ?? total;\n\n return {\n page,\n pageSize,\n pageCount: pageSize > 0 ? Math.ceil(total / pageSize) : 0,\n total,\n };\n }\n\n if (!isNil(paginationInfo.start)) {\n const start = paginationInfo.start;\n const limit = paginationInfo.limit ?? total;\n\n // Start limit to page page size\n return {\n page: Math.floor(start / limit) + 1,\n pageSize: limit,\n pageCount: limit > 0 ? Math.ceil(total / limit) : 0,\n total,\n };\n }\n\n // Default pagination\n return {\n ...paginationInfo,\n page: 1,\n pageSize: 10,\n pageCount: 1,\n total,\n };\n};\n\n/**\n * Transform pagination information into a offset response:\n * {\n * start: number,\n * limit: number,\n * total: number\n * }\n */\nconst transformOffsetPaginationInfo = (\n paginationInfo: Partial<PaginationArgs>,\n total: number\n): OffsetPaginationInformation => {\n if (!isNil(paginationInfo.page)) {\n const limit = paginationInfo.pageSize ?? total;\n const start = (paginationInfo.page - 1) * limit;\n\n return { start, limit, total };\n }\n\n if (!isNil(paginationInfo.start)) {\n const start = paginationInfo.start;\n const limit = paginationInfo.limit ?? total;\n\n // Start limit to page page size\n return { start, limit, total };\n }\n\n // Default pagination\n return {\n ...paginationInfo,\n start: 0,\n limit: 10,\n total,\n };\n};\n\nexport { withDefaultPagination, transformPagedPaginationInfo, transformOffsetPaginationInfo };\n"],"names":["STRAPI_DEFAULTS","offset","start","limit","page","pageSize","paginationAttributes","withMaxLimit","maxLimit","ensureMinValues","Math","max","ensureMaxValues","withNoLimit","pagination","withDefaultPagination","args","defaults","defaultValues","merge","usePagePagination","isNil","useOffsetPagination","ensureValidValues","pipe","PaginationError","Object","assign","replacePaginationAttributes","omit","transformPagedPaginationInfo","paginationInfo","total","pageCount","ceil","floor","transformOffsetPaginationInfo"],"mappings":"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"}
1
+ {"version":3,"file":"pagination.mjs","sources":["../src/pagination.ts"],"sourcesContent":["import { merge, pipe, omit, isNil } from 'lodash/fp';\nimport { PaginationError } from './errors';\n\ninterface PaginationArgs {\n page: number;\n pageSize: number | null;\n start: number;\n limit: number;\n}\n\nexport interface Pagination {\n start: number;\n limit: number;\n}\n\nexport interface PagePatinationInformation {\n page: number;\n pageSize: number;\n pageCount: number;\n total: number;\n}\n\nexport interface OffsetPaginationInformation {\n start: number;\n limit: number;\n total: number;\n}\n\nconst STRAPI_DEFAULTS = {\n offset: {\n start: 0,\n limit: 10,\n },\n page: {\n page: 1,\n pageSize: 10,\n },\n};\n\nconst paginationAttributes = ['start', 'limit', 'page', 'pageSize'];\n\nconst withMaxLimit = (limit: number, maxLimit = -1) => {\n if (maxLimit === -1 || limit < maxLimit) {\n return limit;\n }\n\n return maxLimit;\n};\n\n// Ensure minimum page & pageSize values (page >= 1, pageSize >= 0, start >= 0, limit >= 0)\nconst ensureMinValues = ({ start, limit }: Pagination) => ({\n start: Math.max(start, 0),\n limit: limit === -1 ? limit : Math.max(limit, 1),\n});\n\nconst ensureMaxValues =\n (maxLimit = -1) =>\n ({ start, limit }: { start: number; limit: number }) => ({\n start,\n limit: withMaxLimit(limit, maxLimit),\n });\n\n// Apply maxLimit as the limit when limit is -1\nconst withNoLimit = (pagination: Pagination, maxLimit = -1) => ({\n ...pagination,\n limit: pagination.limit === -1 ? maxLimit : pagination.limit,\n});\n\nconst withDefaultPagination = <T extends Partial<PaginationArgs>>(\n args: T,\n { defaults = {}, maxLimit = -1 } = {}\n) => {\n const defaultValues = merge(STRAPI_DEFAULTS, defaults);\n\n const usePagePagination = !isNil(args.page) || !isNil(args.pageSize);\n const useOffsetPagination = !isNil(args.start) || !isNil(args.limit);\n\n const ensureValidValues = pipe(ensureMinValues, ensureMaxValues(maxLimit));\n\n // If there is no pagination attribute, don't modify the payload\n if (!usePagePagination && !useOffsetPagination) {\n return merge(args, ensureValidValues(defaultValues.offset));\n }\n\n // If there is page & offset pagination attributes, throw an error\n if (usePagePagination && useOffsetPagination) {\n throw new PaginationError('Cannot use both page & offset pagination in the same query');\n }\n\n const pagination: Pagination = {\n start: 0,\n limit: 0,\n };\n\n // Start / Limit\n if (useOffsetPagination) {\n const { start, limit } = merge(defaultValues.offset, args);\n\n Object.assign(pagination, { start, limit });\n }\n\n // Page / PageSize\n if (usePagePagination) {\n const pageArgs = isNil(args.pageSize)\n ? omit(['pageSize'], args)\n : { ...args, pageSize: Math.max(1, args.pageSize) };\n const { page, pageSize } = merge(defaultValues.page, pageArgs);\n const pageLimit = ensureValidValues({ start: 0, limit: pageSize }).limit;\n\n Object.assign(pagination, {\n start: (page - 1) * pageLimit,\n limit: pageLimit,\n });\n }\n\n // Handle -1 limit\n Object.assign(pagination, withNoLimit(pagination, maxLimit));\n\n const replacePaginationAttributes = pipe(\n // Remove pagination attributes\n omit(paginationAttributes),\n // Merge the object with the new pagination + ensure minimum & maximum values\n merge(ensureValidValues(pagination))\n );\n\n return replacePaginationAttributes(args);\n};\n\n/**\n * Transform pagination information into a paginated response:\n * {\n * page: number,\n * pageSize: number,\n * pageCount: number,\n * total: number\n * }\n */\nconst transformPagedPaginationInfo = (\n paginationInfo: Partial<PaginationArgs>,\n total: number\n): PagePatinationInformation => {\n if (!isNil(paginationInfo.page)) {\n const page = paginationInfo.page;\n const pageSize = paginationInfo.pageSize ?? total;\n\n return {\n page,\n pageSize,\n pageCount: pageSize > 0 ? Math.ceil(total / pageSize) : 0,\n total,\n };\n }\n\n if (!isNil(paginationInfo.start)) {\n const start = paginationInfo.start;\n const limit = paginationInfo.limit ?? total;\n\n // Start limit to page page size\n return {\n page: Math.floor(start / limit) + 1,\n pageSize: limit,\n pageCount: limit > 0 ? Math.ceil(total / limit) : 0,\n total,\n };\n }\n\n // Default pagination\n return {\n ...paginationInfo,\n page: 1,\n pageSize: 10,\n pageCount: 1,\n total,\n };\n};\n\n/**\n * Transform pagination information into a offset response:\n * {\n * start: number,\n * limit: number,\n * total: number\n * }\n */\nconst transformOffsetPaginationInfo = (\n paginationInfo: Partial<PaginationArgs>,\n total: number\n): OffsetPaginationInformation => {\n if (!isNil(paginationInfo.page)) {\n const limit = paginationInfo.pageSize ?? total;\n const start = (paginationInfo.page - 1) * limit;\n\n return { start, limit, total };\n }\n\n if (!isNil(paginationInfo.start)) {\n const start = paginationInfo.start;\n const limit = paginationInfo.limit ?? total;\n\n // Start limit to page page size\n return { start, limit, total };\n }\n\n // Default pagination\n return {\n ...paginationInfo,\n start: 0,\n limit: 10,\n total,\n };\n};\n\nexport { withDefaultPagination, transformPagedPaginationInfo, transformOffsetPaginationInfo };\n"],"names":["STRAPI_DEFAULTS","offset","start","limit","page","pageSize","paginationAttributes","withMaxLimit","maxLimit","ensureMinValues","Math","max","ensureMaxValues","withNoLimit","pagination","withDefaultPagination","args","defaults","defaultValues","merge","usePagePagination","isNil","useOffsetPagination","ensureValidValues","pipe","PaginationError","Object","assign","pageArgs","omit","pageLimit","replacePaginationAttributes","transformPagedPaginationInfo","paginationInfo","total","pageCount","ceil","floor","transformOffsetPaginationInfo"],"mappings":"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"}
@@ -54,7 +54,7 @@ const parseDate = (value)=>{
54
54
  const date = dates__namespace.parseISO(value);
55
55
  if (dates__namespace.isValid(date)) return dates__namespace.format(date, 'yyyy-MM-dd');
56
56
  throw new Error(`Invalid format, expected an ISO compatible date`);
57
- } catch (error) {
57
+ } catch {
58
58
  throw new Error(`Invalid format, expected an ISO compatible date`);
59
59
  }
60
60
  };
@@ -71,7 +71,7 @@ const parseDateTimeOrTimestamp = (value)=>{
71
71
  const milliUnixDate = dates__namespace.parse(value, 'T', new Date());
72
72
  if (dates__namespace.isValid(milliUnixDate)) return milliUnixDate;
73
73
  throw new Error(`Invalid format, expected a timestamp or an ISO date`);
74
- } catch (error) {
74
+ } catch {
75
75
  throw new Error(`Invalid format, expected a timestamp or an ISO date`);
76
76
  }
77
77
  };
@@ -1 +1 @@
1
- {"version":3,"file":"parse-type.js","sources":["../src/parse-type.ts"],"sourcesContent":["import * as _ from 'lodash';\nimport * as dates from 'date-fns';\n\nconst timeRegex = /^(2[0-3]|[01][0-9]):([0-5][0-9]):([0-5][0-9])(.[0-9]{1,3})?$/;\n\nconst isDate = (v: unknown): v is Date => {\n return dates.isDate(v);\n};\n\nconst parseTime = (value: unknown): string => {\n if (isDate(value)) {\n return dates.format(value, 'HH:mm:ss.SSS');\n }\n\n if (typeof value !== 'string') {\n throw new Error(`Expected a string, got a ${typeof value}`);\n }\n const result = value.match(timeRegex);\n\n if (result === null) {\n throw new Error('Invalid time format, expected HH:mm:ss.SSS');\n }\n\n const [, hours, minutes, seconds, fraction = '.000'] = result;\n const fractionPart = _.padEnd(fraction.slice(1), 3, '0');\n\n return `${hours}:${minutes}:${seconds}.${fractionPart}`;\n};\n\nconst parseDate = (value: unknown) => {\n if (isDate(value)) {\n return dates.format(value, 'yyyy-MM-dd');\n }\n\n if (typeof value !== 'string') {\n throw new Error(`Expected a string, got a ${typeof value}`);\n }\n\n try {\n const date = dates.parseISO(value);\n\n if (dates.isValid(date)) return dates.format(date, 'yyyy-MM-dd');\n\n throw new Error(`Invalid format, expected an ISO compatible date`);\n } catch (error) {\n throw new Error(`Invalid format, expected an ISO compatible date`);\n }\n};\n\nconst parseDateTimeOrTimestamp = (value: unknown) => {\n if (isDate(value)) {\n return value;\n }\n\n if (typeof value !== 'string') {\n throw new Error(`Expected a string, got a ${typeof value}`);\n }\n\n try {\n const date = dates.parseISO(value);\n if (dates.isValid(date)) return date;\n\n const milliUnixDate = dates.parse(value, 'T', new Date());\n if (dates.isValid(milliUnixDate)) return milliUnixDate;\n\n throw new Error(`Invalid format, expected a timestamp or an ISO date`);\n } catch (error) {\n throw new Error(`Invalid format, expected a timestamp or an ISO date`);\n }\n};\n\ntype TypeMap = {\n boolean: boolean;\n integer: number;\n biginteger: number;\n float: number;\n decimal: number;\n time: string;\n date: string;\n timestamp: Date;\n datetime: Date;\n};\n\nexport interface ParseTypeOptions<T extends keyof TypeMap> {\n type: T;\n value: unknown;\n forceCast?: boolean;\n}\n\nconst parseBoolean = (value: unknown, options: { forceCast?: boolean }): boolean => {\n const { forceCast = false } = options;\n\n if (typeof value === 'boolean') {\n return value;\n }\n\n if (typeof value === 'string' || typeof value === 'number') {\n if (['true', 't', '1', 1].includes(value)) {\n return true;\n }\n\n if (['false', 'f', '0', 0].includes(value)) {\n return false;\n }\n }\n\n if (forceCast) {\n return Boolean(value);\n }\n\n throw new Error('Invalid boolean input. Expected \"t\",\"1\",\"true\",\"false\",\"0\",\"f\"');\n};\n\n/**\n * Cast basic values based on attribute type\n */\nconst parseType = <Type extends keyof TypeMap>(options: ParseTypeOptions<Type>): TypeMap[Type] => {\n const { type, value, forceCast } = options;\n\n switch (type) {\n case 'boolean':\n return parseBoolean(value, { forceCast }) as TypeMap[Type];\n case 'integer':\n case 'biginteger':\n case 'float':\n case 'decimal': {\n return _.toNumber(value) as TypeMap[Type];\n }\n case 'time': {\n return parseTime(value) as TypeMap[Type];\n }\n case 'date': {\n return parseDate(value) as TypeMap[Type];\n }\n case 'timestamp':\n case 'datetime': {\n return parseDateTimeOrTimestamp(value) as TypeMap[Type];\n }\n default:\n return value as TypeMap[Type];\n }\n};\n\nexport default parseType;\n"],"names":["timeRegex","isDate","v","dates","parseTime","value","format","Error","result","match","hours","minutes","seconds","fraction","fractionPart","_","padEnd","slice","parseDate","date","parseISO","isValid","error","parseDateTimeOrTimestamp","milliUnixDate","parse","Date","parseBoolean","options","forceCast","includes","Boolean","parseType","type","toNumber"],"mappings":"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"}
1
+ {"version":3,"file":"parse-type.js","sources":["../src/parse-type.ts"],"sourcesContent":["import * as _ from 'lodash';\nimport * as dates from 'date-fns';\n\nconst timeRegex = /^(2[0-3]|[01][0-9]):([0-5][0-9]):([0-5][0-9])(.[0-9]{1,3})?$/;\n\nconst isDate = (v: unknown): v is Date => {\n return dates.isDate(v);\n};\n\nconst parseTime = (value: unknown): string => {\n if (isDate(value)) {\n return dates.format(value, 'HH:mm:ss.SSS');\n }\n\n if (typeof value !== 'string') {\n throw new Error(`Expected a string, got a ${typeof value}`);\n }\n const result = value.match(timeRegex);\n\n if (result === null) {\n throw new Error('Invalid time format, expected HH:mm:ss.SSS');\n }\n\n const [, hours, minutes, seconds, fraction = '.000'] = result;\n const fractionPart = _.padEnd(fraction.slice(1), 3, '0');\n\n return `${hours}:${minutes}:${seconds}.${fractionPart}`;\n};\n\nconst parseDate = (value: unknown) => {\n if (isDate(value)) {\n return dates.format(value, 'yyyy-MM-dd');\n }\n\n if (typeof value !== 'string') {\n throw new Error(`Expected a string, got a ${typeof value}`);\n }\n\n try {\n const date = dates.parseISO(value);\n\n if (dates.isValid(date)) return dates.format(date, 'yyyy-MM-dd');\n\n throw new Error(`Invalid format, expected an ISO compatible date`);\n } catch {\n throw new Error(`Invalid format, expected an ISO compatible date`);\n }\n};\n\nconst parseDateTimeOrTimestamp = (value: unknown) => {\n if (isDate(value)) {\n return value;\n }\n\n if (typeof value !== 'string') {\n throw new Error(`Expected a string, got a ${typeof value}`);\n }\n\n try {\n const date = dates.parseISO(value);\n if (dates.isValid(date)) return date;\n\n const milliUnixDate = dates.parse(value, 'T', new Date());\n if (dates.isValid(milliUnixDate)) return milliUnixDate;\n\n throw new Error(`Invalid format, expected a timestamp or an ISO date`);\n } catch {\n throw new Error(`Invalid format, expected a timestamp or an ISO date`);\n }\n};\n\ntype TypeMap = {\n boolean: boolean;\n integer: number;\n biginteger: number;\n float: number;\n decimal: number;\n time: string;\n date: string;\n timestamp: Date;\n datetime: Date;\n};\n\nexport interface ParseTypeOptions<T extends keyof TypeMap> {\n type: T;\n value: unknown;\n forceCast?: boolean;\n}\n\nconst parseBoolean = (value: unknown, options: { forceCast?: boolean }): boolean => {\n const { forceCast = false } = options;\n\n if (typeof value === 'boolean') {\n return value;\n }\n\n if (typeof value === 'string' || typeof value === 'number') {\n if (['true', 't', '1', 1].includes(value)) {\n return true;\n }\n\n if (['false', 'f', '0', 0].includes(value)) {\n return false;\n }\n }\n\n if (forceCast) {\n return Boolean(value);\n }\n\n throw new Error('Invalid boolean input. Expected \"t\",\"1\",\"true\",\"false\",\"0\",\"f\"');\n};\n\n/**\n * Cast basic values based on attribute type\n */\nconst parseType = <Type extends keyof TypeMap>(options: ParseTypeOptions<Type>): TypeMap[Type] => {\n const { type, value, forceCast } = options;\n\n switch (type) {\n case 'boolean':\n return parseBoolean(value, { forceCast }) as TypeMap[Type];\n case 'integer':\n case 'biginteger':\n case 'float':\n case 'decimal': {\n return _.toNumber(value) as TypeMap[Type];\n }\n case 'time': {\n return parseTime(value) as TypeMap[Type];\n }\n case 'date': {\n return parseDate(value) as TypeMap[Type];\n }\n case 'timestamp':\n case 'datetime': {\n return parseDateTimeOrTimestamp(value) as TypeMap[Type];\n }\n default:\n return value as TypeMap[Type];\n }\n};\n\nexport default parseType;\n"],"names":["timeRegex","isDate","v","dates","parseTime","value","format","Error","result","match","hours","minutes","seconds","fraction","fractionPart","_","padEnd","slice","parseDate","date","parseISO","isValid","parseDateTimeOrTimestamp","milliUnixDate","parse","Date","parseBoolean","options","forceCast","includes","Boolean","parseType","type","toNumber"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAGA,MAAMA,SAAAA,GAAY,8DAAA;AAElB,MAAMC,SAAS,CAACC,CAAAA,GAAAA;IACd,OAAOC,gBAAAA,CAAMF,MAAM,CAACC,CAAAA,CAAAA;AACtB,CAAA;AAEA,MAAME,YAAY,CAACC,KAAAA,GAAAA;AACjB,IAAA,IAAIJ,OAAOI,KAAAA,CAAAA,EAAQ;QACjB,OAAOF,gBAAAA,CAAMG,MAAM,CAACD,KAAAA,EAAO,cAAA,CAAA;AAC7B,IAAA;IAEA,IAAI,OAAOA,UAAU,QAAA,EAAU;AAC7B,QAAA,MAAM,IAAIE,KAAAA,CAAM,CAAC,yBAAyB,EAAE,OAAOF,KAAAA,CAAAA,CAAO,CAAA;AAC5D,IAAA;IACA,MAAMG,MAAAA,GAASH,KAAAA,CAAMI,KAAK,CAACT,SAAAA,CAAAA;AAE3B,IAAA,IAAIQ,WAAW,IAAA,EAAM;AACnB,QAAA,MAAM,IAAID,KAAAA,CAAM,4CAAA,CAAA;AAClB,IAAA;AAEA,IAAA,MAAM,GAAGG,KAAAA,EAAOC,OAAAA,EAASC,SAASC,QAAAA,GAAW,MAAM,CAAC,GAAGL,MAAAA;IACvD,MAAMM,YAAAA,GAAeC,aAAEC,MAAM,CAACH,SAASI,KAAK,CAAC,IAAI,CAAA,EAAG,GAAA,CAAA;IAEpD,OAAO,CAAA,EAAGP,KAAAA,CAAM,CAAC,EAAEC,OAAAA,CAAQ,CAAC,EAAEC,OAAAA,CAAQ,CAAC,EAAEE,YAAAA,CAAAA,CAAc;AACzD,CAAA;AAEA,MAAMI,YAAY,CAACb,KAAAA,GAAAA;AACjB,IAAA,IAAIJ,OAAOI,KAAAA,CAAAA,EAAQ;QACjB,OAAOF,gBAAAA,CAAMG,MAAM,CAACD,KAAAA,EAAO,YAAA,CAAA;AAC7B,IAAA;IAEA,IAAI,OAAOA,UAAU,QAAA,EAAU;AAC7B,QAAA,MAAM,IAAIE,KAAAA,CAAM,CAAC,yBAAyB,EAAE,OAAOF,KAAAA,CAAAA,CAAO,CAAA;AAC5D,IAAA;IAEA,IAAI;QACF,MAAMc,IAAAA,GAAOhB,gBAAAA,CAAMiB,QAAQ,CAACf,KAAAA,CAAAA;QAE5B,IAAIF,gBAAAA,CAAMkB,OAAO,CAACF,IAAAA,CAAAA,EAAO,OAAOhB,gBAAAA,CAAMG,MAAM,CAACa,IAAAA,EAAM,YAAA,CAAA;AAEnD,QAAA,MAAM,IAAIZ,KAAAA,CAAM,CAAC,+CAA+C,CAAC,CAAA;AACnE,IAAA,CAAA,CAAE,OAAM;AACN,QAAA,MAAM,IAAIA,KAAAA,CAAM,CAAC,+CAA+C,CAAC,CAAA;AACnE,IAAA;AACF,CAAA;AAEA,MAAMe,2BAA2B,CAACjB,KAAAA,GAAAA;AAChC,IAAA,IAAIJ,OAAOI,KAAAA,CAAAA,EAAQ;QACjB,OAAOA,KAAAA;AACT,IAAA;IAEA,IAAI,OAAOA,UAAU,QAAA,EAAU;AAC7B,QAAA,MAAM,IAAIE,KAAAA,CAAM,CAAC,yBAAyB,EAAE,OAAOF,KAAAA,CAAAA,CAAO,CAAA;AAC5D,IAAA;IAEA,IAAI;QACF,MAAMc,IAAAA,GAAOhB,gBAAAA,CAAMiB,QAAQ,CAACf,KAAAA,CAAAA;AAC5B,QAAA,IAAIF,gBAAAA,CAAMkB,OAAO,CAACF,IAAAA,CAAAA,EAAO,OAAOA,IAAAA;AAEhC,QAAA,MAAMI,gBAAgBpB,gBAAAA,CAAMqB,KAAK,CAACnB,KAAAA,EAAO,KAAK,IAAIoB,IAAAA,EAAAA,CAAAA;AAClD,QAAA,IAAItB,gBAAAA,CAAMkB,OAAO,CAACE,aAAAA,CAAAA,EAAgB,OAAOA,aAAAA;AAEzC,QAAA,MAAM,IAAIhB,KAAAA,CAAM,CAAC,mDAAmD,CAAC,CAAA;AACvE,IAAA,CAAA,CAAE,OAAM;AACN,QAAA,MAAM,IAAIA,KAAAA,CAAM,CAAC,mDAAmD,CAAC,CAAA;AACvE,IAAA;AACF,CAAA;AAoBA,MAAMmB,YAAAA,GAAe,CAACrB,KAAAA,EAAgBsB,OAAAA,GAAAA;AACpC,IAAA,MAAM,EAAEC,SAAAA,GAAY,KAAK,EAAE,GAAGD,OAAAA;IAE9B,IAAI,OAAOtB,UAAU,SAAA,EAAW;QAC9B,OAAOA,KAAAA;AACT,IAAA;AAEA,IAAA,IAAI,OAAOA,KAAAA,KAAU,QAAA,IAAY,OAAOA,UAAU,QAAA,EAAU;QAC1D,IAAI;AAAC,YAAA,MAAA;AAAQ,YAAA,GAAA;AAAK,YAAA,GAAA;AAAK,YAAA;SAAE,CAACwB,QAAQ,CAACxB,KAAAA,CAAAA,EAAQ;YACzC,OAAO,IAAA;AACT,QAAA;QAEA,IAAI;AAAC,YAAA,OAAA;AAAS,YAAA,GAAA;AAAK,YAAA,GAAA;AAAK,YAAA;SAAE,CAACwB,QAAQ,CAACxB,KAAAA,CAAAA,EAAQ;YAC1C,OAAO,KAAA;AACT,QAAA;AACF,IAAA;AAEA,IAAA,IAAIuB,SAAAA,EAAW;AACb,QAAA,OAAOE,OAAAA,CAAQzB,KAAAA,CAAAA;AACjB,IAAA;AAEA,IAAA,MAAM,IAAIE,KAAAA,CAAM,gEAAA,CAAA;AAClB,CAAA;AAEA;;IAGA,MAAMwB,YAAY,CAA6BJ,OAAAA,GAAAA;AAC7C,IAAA,MAAM,EAAEK,IAAI,EAAE3B,KAAK,EAAEuB,SAAS,EAAE,GAAGD,OAAAA;IAEnC,OAAQK,IAAAA;QACN,KAAK,SAAA;AACH,YAAA,OAAON,aAAarB,KAAAA,EAAO;AAAEuB,gBAAAA;AAAU,aAAA,CAAA;QACzC,KAAK,SAAA;QACL,KAAK,YAAA;QACL,KAAK,OAAA;QACL,KAAK,SAAA;AAAW,YAAA;gBACd,OAAOb,YAAAA,CAAEkB,QAAQ,CAAC5B,KAAAA,CAAAA;AACpB,YAAA;QACA,KAAK,MAAA;AAAQ,YAAA;AACX,gBAAA,OAAOD,SAAAA,CAAUC,KAAAA,CAAAA;AACnB,YAAA;QACA,KAAK,MAAA;AAAQ,YAAA;AACX,gBAAA,OAAOa,SAAAA,CAAUb,KAAAA,CAAAA;AACnB,YAAA;QACA,KAAK,WAAA;QACL,KAAK,UAAA;AAAY,YAAA;AACf,gBAAA,OAAOiB,wBAAAA,CAAyBjB,KAAAA,CAAAA;AAClC,YAAA;AACA,QAAA;YACE,OAAOA,KAAAA;AACX;AACF;;;;"}
@@ -31,7 +31,7 @@ const parseDate = (value)=>{
31
31
  const date = dates.parseISO(value);
32
32
  if (dates.isValid(date)) return dates.format(date, 'yyyy-MM-dd');
33
33
  throw new Error(`Invalid format, expected an ISO compatible date`);
34
- } catch (error) {
34
+ } catch {
35
35
  throw new Error(`Invalid format, expected an ISO compatible date`);
36
36
  }
37
37
  };
@@ -48,7 +48,7 @@ const parseDateTimeOrTimestamp = (value)=>{
48
48
  const milliUnixDate = dates.parse(value, 'T', new Date());
49
49
  if (dates.isValid(milliUnixDate)) return milliUnixDate;
50
50
  throw new Error(`Invalid format, expected a timestamp or an ISO date`);
51
- } catch (error) {
51
+ } catch {
52
52
  throw new Error(`Invalid format, expected a timestamp or an ISO date`);
53
53
  }
54
54
  };
@@ -1 +1 @@
1
- {"version":3,"file":"parse-type.mjs","sources":["../src/parse-type.ts"],"sourcesContent":["import * as _ from 'lodash';\nimport * as dates from 'date-fns';\n\nconst timeRegex = /^(2[0-3]|[01][0-9]):([0-5][0-9]):([0-5][0-9])(.[0-9]{1,3})?$/;\n\nconst isDate = (v: unknown): v is Date => {\n return dates.isDate(v);\n};\n\nconst parseTime = (value: unknown): string => {\n if (isDate(value)) {\n return dates.format(value, 'HH:mm:ss.SSS');\n }\n\n if (typeof value !== 'string') {\n throw new Error(`Expected a string, got a ${typeof value}`);\n }\n const result = value.match(timeRegex);\n\n if (result === null) {\n throw new Error('Invalid time format, expected HH:mm:ss.SSS');\n }\n\n const [, hours, minutes, seconds, fraction = '.000'] = result;\n const fractionPart = _.padEnd(fraction.slice(1), 3, '0');\n\n return `${hours}:${minutes}:${seconds}.${fractionPart}`;\n};\n\nconst parseDate = (value: unknown) => {\n if (isDate(value)) {\n return dates.format(value, 'yyyy-MM-dd');\n }\n\n if (typeof value !== 'string') {\n throw new Error(`Expected a string, got a ${typeof value}`);\n }\n\n try {\n const date = dates.parseISO(value);\n\n if (dates.isValid(date)) return dates.format(date, 'yyyy-MM-dd');\n\n throw new Error(`Invalid format, expected an ISO compatible date`);\n } catch (error) {\n throw new Error(`Invalid format, expected an ISO compatible date`);\n }\n};\n\nconst parseDateTimeOrTimestamp = (value: unknown) => {\n if (isDate(value)) {\n return value;\n }\n\n if (typeof value !== 'string') {\n throw new Error(`Expected a string, got a ${typeof value}`);\n }\n\n try {\n const date = dates.parseISO(value);\n if (dates.isValid(date)) return date;\n\n const milliUnixDate = dates.parse(value, 'T', new Date());\n if (dates.isValid(milliUnixDate)) return milliUnixDate;\n\n throw new Error(`Invalid format, expected a timestamp or an ISO date`);\n } catch (error) {\n throw new Error(`Invalid format, expected a timestamp or an ISO date`);\n }\n};\n\ntype TypeMap = {\n boolean: boolean;\n integer: number;\n biginteger: number;\n float: number;\n decimal: number;\n time: string;\n date: string;\n timestamp: Date;\n datetime: Date;\n};\n\nexport interface ParseTypeOptions<T extends keyof TypeMap> {\n type: T;\n value: unknown;\n forceCast?: boolean;\n}\n\nconst parseBoolean = (value: unknown, options: { forceCast?: boolean }): boolean => {\n const { forceCast = false } = options;\n\n if (typeof value === 'boolean') {\n return value;\n }\n\n if (typeof value === 'string' || typeof value === 'number') {\n if (['true', 't', '1', 1].includes(value)) {\n return true;\n }\n\n if (['false', 'f', '0', 0].includes(value)) {\n return false;\n }\n }\n\n if (forceCast) {\n return Boolean(value);\n }\n\n throw new Error('Invalid boolean input. Expected \"t\",\"1\",\"true\",\"false\",\"0\",\"f\"');\n};\n\n/**\n * Cast basic values based on attribute type\n */\nconst parseType = <Type extends keyof TypeMap>(options: ParseTypeOptions<Type>): TypeMap[Type] => {\n const { type, value, forceCast } = options;\n\n switch (type) {\n case 'boolean':\n return parseBoolean(value, { forceCast }) as TypeMap[Type];\n case 'integer':\n case 'biginteger':\n case 'float':\n case 'decimal': {\n return _.toNumber(value) as TypeMap[Type];\n }\n case 'time': {\n return parseTime(value) as TypeMap[Type];\n }\n case 'date': {\n return parseDate(value) as TypeMap[Type];\n }\n case 'timestamp':\n case 'datetime': {\n return parseDateTimeOrTimestamp(value) as TypeMap[Type];\n }\n default:\n return value as TypeMap[Type];\n }\n};\n\nexport default parseType;\n"],"names":["timeRegex","isDate","v","dates","parseTime","value","format","Error","result","match","hours","minutes","seconds","fraction","fractionPart","_","padEnd","slice","parseDate","date","parseISO","isValid","error","parseDateTimeOrTimestamp","milliUnixDate","parse","Date","parseBoolean","options","forceCast","includes","Boolean","parseType","type","toNumber"],"mappings":"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"}
1
+ {"version":3,"file":"parse-type.mjs","sources":["../src/parse-type.ts"],"sourcesContent":["import * as _ from 'lodash';\nimport * as dates from 'date-fns';\n\nconst timeRegex = /^(2[0-3]|[01][0-9]):([0-5][0-9]):([0-5][0-9])(.[0-9]{1,3})?$/;\n\nconst isDate = (v: unknown): v is Date => {\n return dates.isDate(v);\n};\n\nconst parseTime = (value: unknown): string => {\n if (isDate(value)) {\n return dates.format(value, 'HH:mm:ss.SSS');\n }\n\n if (typeof value !== 'string') {\n throw new Error(`Expected a string, got a ${typeof value}`);\n }\n const result = value.match(timeRegex);\n\n if (result === null) {\n throw new Error('Invalid time format, expected HH:mm:ss.SSS');\n }\n\n const [, hours, minutes, seconds, fraction = '.000'] = result;\n const fractionPart = _.padEnd(fraction.slice(1), 3, '0');\n\n return `${hours}:${minutes}:${seconds}.${fractionPart}`;\n};\n\nconst parseDate = (value: unknown) => {\n if (isDate(value)) {\n return dates.format(value, 'yyyy-MM-dd');\n }\n\n if (typeof value !== 'string') {\n throw new Error(`Expected a string, got a ${typeof value}`);\n }\n\n try {\n const date = dates.parseISO(value);\n\n if (dates.isValid(date)) return dates.format(date, 'yyyy-MM-dd');\n\n throw new Error(`Invalid format, expected an ISO compatible date`);\n } catch {\n throw new Error(`Invalid format, expected an ISO compatible date`);\n }\n};\n\nconst parseDateTimeOrTimestamp = (value: unknown) => {\n if (isDate(value)) {\n return value;\n }\n\n if (typeof value !== 'string') {\n throw new Error(`Expected a string, got a ${typeof value}`);\n }\n\n try {\n const date = dates.parseISO(value);\n if (dates.isValid(date)) return date;\n\n const milliUnixDate = dates.parse(value, 'T', new Date());\n if (dates.isValid(milliUnixDate)) return milliUnixDate;\n\n throw new Error(`Invalid format, expected a timestamp or an ISO date`);\n } catch {\n throw new Error(`Invalid format, expected a timestamp or an ISO date`);\n }\n};\n\ntype TypeMap = {\n boolean: boolean;\n integer: number;\n biginteger: number;\n float: number;\n decimal: number;\n time: string;\n date: string;\n timestamp: Date;\n datetime: Date;\n};\n\nexport interface ParseTypeOptions<T extends keyof TypeMap> {\n type: T;\n value: unknown;\n forceCast?: boolean;\n}\n\nconst parseBoolean = (value: unknown, options: { forceCast?: boolean }): boolean => {\n const { forceCast = false } = options;\n\n if (typeof value === 'boolean') {\n return value;\n }\n\n if (typeof value === 'string' || typeof value === 'number') {\n if (['true', 't', '1', 1].includes(value)) {\n return true;\n }\n\n if (['false', 'f', '0', 0].includes(value)) {\n return false;\n }\n }\n\n if (forceCast) {\n return Boolean(value);\n }\n\n throw new Error('Invalid boolean input. Expected \"t\",\"1\",\"true\",\"false\",\"0\",\"f\"');\n};\n\n/**\n * Cast basic values based on attribute type\n */\nconst parseType = <Type extends keyof TypeMap>(options: ParseTypeOptions<Type>): TypeMap[Type] => {\n const { type, value, forceCast } = options;\n\n switch (type) {\n case 'boolean':\n return parseBoolean(value, { forceCast }) as TypeMap[Type];\n case 'integer':\n case 'biginteger':\n case 'float':\n case 'decimal': {\n return _.toNumber(value) as TypeMap[Type];\n }\n case 'time': {\n return parseTime(value) as TypeMap[Type];\n }\n case 'date': {\n return parseDate(value) as TypeMap[Type];\n }\n case 'timestamp':\n case 'datetime': {\n return parseDateTimeOrTimestamp(value) as TypeMap[Type];\n }\n default:\n return value as TypeMap[Type];\n }\n};\n\nexport default parseType;\n"],"names":["timeRegex","isDate","v","dates","parseTime","value","format","Error","result","match","hours","minutes","seconds","fraction","fractionPart","_","padEnd","slice","parseDate","date","parseISO","isValid","parseDateTimeOrTimestamp","milliUnixDate","parse","Date","parseBoolean","options","forceCast","includes","Boolean","parseType","type","toNumber"],"mappings":"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"}
package/dist/policy.js CHANGED
@@ -8,7 +8,7 @@ const createPolicy = (options)=>{
8
8
  if (validator) {
9
9
  try {
10
10
  validator(config);
11
- } catch (e) {
11
+ } catch {
12
12
  throw new Error(`Invalid config passed to "${name}" policy.`);
13
13
  }
14
14
  }
@@ -1 +1 @@
1
- {"version":3,"file":"policy.js","sources":["../src/policy.ts"],"sourcesContent":["import { eq } from 'lodash/fp';\n\ninterface Options {\n name: string;\n validator?(config: unknown): void;\n handler(...args: any[]): any;\n}\n\nconst createPolicy = (options: Options) => {\n const { name = 'unnamed', validator, handler } = options;\n\n const wrappedValidator = (config: unknown) => {\n if (validator) {\n try {\n validator(config);\n } catch (e) {\n throw new Error(`Invalid config passed to \"${name}\" policy.`);\n }\n }\n };\n\n return {\n name,\n validator: wrappedValidator,\n handler,\n };\n};\n\nconst createPolicyContext = (type: string, ctx: object) => {\n return Object.assign(\n {\n is: eq(type),\n get type() {\n return type;\n },\n },\n ctx\n );\n};\n\nexport { createPolicy, createPolicyContext };\n"],"names":["createPolicy","options","name","validator","handler","wrappedValidator","config","e","Error","createPolicyContext","type","ctx","Object","assign","is","eq"],"mappings":";;;;AAQA,MAAMA,eAAe,CAACC,OAAAA,GAAAA;IACpB,MAAM,EAAEC,OAAO,SAAS,EAAEC,SAAS,EAAEC,OAAO,EAAE,GAAGH,OAAAA;AAEjD,IAAA,MAAMI,mBAAmB,CAACC,MAAAA,GAAAA;AACxB,QAAA,IAAIH,SAAAA,EAAW;YACb,IAAI;gBACFA,SAAAA,CAAUG,MAAAA,CAAAA;AACZ,YAAA,CAAA,CAAE,OAAOC,CAAAA,EAAG;AACV,gBAAA,MAAM,IAAIC,KAAAA,CAAM,CAAC,0BAA0B,EAAEN,IAAAA,CAAK,SAAS,CAAC,CAAA;AAC9D,YAAA;AACF,QAAA;AACF,IAAA,CAAA;IAEA,OAAO;AACLA,QAAAA,IAAAA;QACAC,SAAAA,EAAWE,gBAAAA;AACXD,QAAAA;AACF,KAAA;AACF;AAEA,MAAMK,mBAAAA,GAAsB,CAACC,IAAAA,EAAcC,GAAAA,GAAAA;IACzC,OAAOC,MAAAA,CAAOC,MAAM,CAClB;AACEC,QAAAA,EAAAA,EAAIC,KAAAA,CAAGL,IAAAA,CAAAA;AACP,QAAA,IAAIA,IAAAA,CAAAA,GAAO;YACT,OAAOA,IAAAA;AACT,QAAA;KACF,EACAC,GAAAA,CAAAA;AAEJ;;;;;"}
1
+ {"version":3,"file":"policy.js","sources":["../src/policy.ts"],"sourcesContent":["import { eq } from 'lodash/fp';\n\ninterface Options {\n name: string;\n validator?(config: unknown): void;\n handler(...args: any[]): any;\n}\n\nconst createPolicy = (options: Options) => {\n const { name = 'unnamed', validator, handler } = options;\n\n const wrappedValidator = (config: unknown) => {\n if (validator) {\n try {\n validator(config);\n } catch {\n throw new Error(`Invalid config passed to \"${name}\" policy.`);\n }\n }\n };\n\n return {\n name,\n validator: wrappedValidator,\n handler,\n };\n};\n\nconst createPolicyContext = (type: string, ctx: object) => {\n return Object.assign(\n {\n is: eq(type),\n get type() {\n return type;\n },\n },\n ctx\n );\n};\n\nexport { createPolicy, createPolicyContext };\n"],"names":["createPolicy","options","name","validator","handler","wrappedValidator","config","Error","createPolicyContext","type","ctx","Object","assign","is","eq"],"mappings":";;;;AAQA,MAAMA,eAAe,CAACC,OAAAA,GAAAA;IACpB,MAAM,EAAEC,OAAO,SAAS,EAAEC,SAAS,EAAEC,OAAO,EAAE,GAAGH,OAAAA;AAEjD,IAAA,MAAMI,mBAAmB,CAACC,MAAAA,GAAAA;AACxB,QAAA,IAAIH,SAAAA,EAAW;YACb,IAAI;gBACFA,SAAAA,CAAUG,MAAAA,CAAAA;AACZ,YAAA,CAAA,CAAE,OAAM;AACN,gBAAA,MAAM,IAAIC,KAAAA,CAAM,CAAC,0BAA0B,EAAEL,IAAAA,CAAK,SAAS,CAAC,CAAA;AAC9D,YAAA;AACF,QAAA;AACF,IAAA,CAAA;IAEA,OAAO;AACLA,QAAAA,IAAAA;QACAC,SAAAA,EAAWE,gBAAAA;AACXD,QAAAA;AACF,KAAA;AACF;AAEA,MAAMI,mBAAAA,GAAsB,CAACC,IAAAA,EAAcC,GAAAA,GAAAA;IACzC,OAAOC,MAAAA,CAAOC,MAAM,CAClB;AACEC,QAAAA,EAAAA,EAAIC,KAAAA,CAAGL,IAAAA,CAAAA;AACP,QAAA,IAAIA,IAAAA,CAAAA,GAAO;YACT,OAAOA,IAAAA;AACT,QAAA;KACF,EACAC,GAAAA,CAAAA;AAEJ;;;;;"}
package/dist/policy.mjs CHANGED
@@ -6,7 +6,7 @@ const createPolicy = (options)=>{
6
6
  if (validator) {
7
7
  try {
8
8
  validator(config);
9
- } catch (e) {
9
+ } catch {
10
10
  throw new Error(`Invalid config passed to "${name}" policy.`);
11
11
  }
12
12
  }
@@ -1 +1 @@
1
- {"version":3,"file":"policy.mjs","sources":["../src/policy.ts"],"sourcesContent":["import { eq } from 'lodash/fp';\n\ninterface Options {\n name: string;\n validator?(config: unknown): void;\n handler(...args: any[]): any;\n}\n\nconst createPolicy = (options: Options) => {\n const { name = 'unnamed', validator, handler } = options;\n\n const wrappedValidator = (config: unknown) => {\n if (validator) {\n try {\n validator(config);\n } catch (e) {\n throw new Error(`Invalid config passed to \"${name}\" policy.`);\n }\n }\n };\n\n return {\n name,\n validator: wrappedValidator,\n handler,\n };\n};\n\nconst createPolicyContext = (type: string, ctx: object) => {\n return Object.assign(\n {\n is: eq(type),\n get type() {\n return type;\n },\n },\n ctx\n );\n};\n\nexport { createPolicy, createPolicyContext };\n"],"names":["createPolicy","options","name","validator","handler","wrappedValidator","config","e","Error","createPolicyContext","type","ctx","Object","assign","is","eq"],"mappings":";;AAQA,MAAMA,eAAe,CAACC,OAAAA,GAAAA;IACpB,MAAM,EAAEC,OAAO,SAAS,EAAEC,SAAS,EAAEC,OAAO,EAAE,GAAGH,OAAAA;AAEjD,IAAA,MAAMI,mBAAmB,CAACC,MAAAA,GAAAA;AACxB,QAAA,IAAIH,SAAAA,EAAW;YACb,IAAI;gBACFA,SAAAA,CAAUG,MAAAA,CAAAA;AACZ,YAAA,CAAA,CAAE,OAAOC,CAAAA,EAAG;AACV,gBAAA,MAAM,IAAIC,KAAAA,CAAM,CAAC,0BAA0B,EAAEN,IAAAA,CAAK,SAAS,CAAC,CAAA;AAC9D,YAAA;AACF,QAAA;AACF,IAAA,CAAA;IAEA,OAAO;AACLA,QAAAA,IAAAA;QACAC,SAAAA,EAAWE,gBAAAA;AACXD,QAAAA;AACF,KAAA;AACF;AAEA,MAAMK,mBAAAA,GAAsB,CAACC,IAAAA,EAAcC,GAAAA,GAAAA;IACzC,OAAOC,MAAAA,CAAOC,MAAM,CAClB;AACEC,QAAAA,EAAAA,EAAIC,EAAAA,CAAGL,IAAAA,CAAAA;AACP,QAAA,IAAIA,IAAAA,CAAAA,GAAO;YACT,OAAOA,IAAAA;AACT,QAAA;KACF,EACAC,GAAAA,CAAAA;AAEJ;;;;"}
1
+ {"version":3,"file":"policy.mjs","sources":["../src/policy.ts"],"sourcesContent":["import { eq } from 'lodash/fp';\n\ninterface Options {\n name: string;\n validator?(config: unknown): void;\n handler(...args: any[]): any;\n}\n\nconst createPolicy = (options: Options) => {\n const { name = 'unnamed', validator, handler } = options;\n\n const wrappedValidator = (config: unknown) => {\n if (validator) {\n try {\n validator(config);\n } catch {\n throw new Error(`Invalid config passed to \"${name}\" policy.`);\n }\n }\n };\n\n return {\n name,\n validator: wrappedValidator,\n handler,\n };\n};\n\nconst createPolicyContext = (type: string, ctx: object) => {\n return Object.assign(\n {\n is: eq(type),\n get type() {\n return type;\n },\n },\n ctx\n );\n};\n\nexport { createPolicy, createPolicyContext };\n"],"names":["createPolicy","options","name","validator","handler","wrappedValidator","config","Error","createPolicyContext","type","ctx","Object","assign","is","eq"],"mappings":";;AAQA,MAAMA,eAAe,CAACC,OAAAA,GAAAA;IACpB,MAAM,EAAEC,OAAO,SAAS,EAAEC,SAAS,EAAEC,OAAO,EAAE,GAAGH,OAAAA;AAEjD,IAAA,MAAMI,mBAAmB,CAACC,MAAAA,GAAAA;AACxB,QAAA,IAAIH,SAAAA,EAAW;YACb,IAAI;gBACFA,SAAAA,CAAUG,MAAAA,CAAAA;AACZ,YAAA,CAAA,CAAE,OAAM;AACN,gBAAA,MAAM,IAAIC,KAAAA,CAAM,CAAC,0BAA0B,EAAEL,IAAAA,CAAK,SAAS,CAAC,CAAA;AAC9D,YAAA;AACF,QAAA;AACF,IAAA,CAAA;IAEA,OAAO;AACLA,QAAAA,IAAAA;QACAC,SAAAA,EAAWE,gBAAAA;AACXD,QAAAA;AACF,KAAA;AACF;AAEA,MAAMI,mBAAAA,GAAsB,CAACC,IAAAA,EAAcC,GAAAA,GAAAA;IACzC,OAAOC,MAAAA,CAAOC,MAAM,CAClB;AACEC,QAAAA,EAAAA,EAAIC,EAAAA,CAAGL,IAAAA,CAAAA;AACP,QAAA,IAAIA,IAAAA,CAAAA,GAAO;YACT,OAAOA,IAAAA;AACT,QAAA;KACF,EACAC,GAAAA,CAAAA;AAEJ;;;;"}
@@ -1,4 +1,4 @@
1
- export declare const sanitizeRouteForSerialization: ({ request, response, ...rest }: Record<string, unknown>) => Record<string, unknown>;
1
+ export declare const sanitizeRouteForSerialization: ({ request: _request, response: _response, ...rest }: Record<string, unknown>) => Record<string, unknown>;
2
2
  export declare const sanitizeRoutesArrayForSerialization: (routes: unknown[]) => Record<string, unknown>[];
3
3
  export declare const sanitizeRoutesMapForSerialization: (map: Record<string, unknown[]>) => Record<string, unknown>;
4
4
  //# sourceMappingURL=route-serialization.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"route-serialization.d.ts","sourceRoot":"","sources":["../src/route-serialization.ts"],"names":[],"mappings":"AASA,eAAO,MAAM,6BAA6B,GAAI,gCAI3C,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAa,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAE/D,eAAO,MAAM,mCAAmC,GAAI,QAAQ,OAAO,EAAE,KAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAGxD,CAAC;AAExC,eAAO,MAAM,iCAAiC,GAC5C,KAAK,MAAM,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC,KAC7B,MAAM,CAAC,MAAM,EAAE,OAAO,CAOtB,CAAC"}
1
+ {"version":3,"file":"route-serialization.d.ts","sourceRoot":"","sources":["../src/route-serialization.ts"],"names":[],"mappings":"AASA,eAAO,MAAM,6BAA6B,GAAI,qDAI3C,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAa,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAE/D,eAAO,MAAM,mCAAmC,GAAI,QAAQ,OAAO,EAAE,KAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAGxD,CAAC;AAExC,eAAO,MAAM,iCAAiC,GAC5C,KAAK,MAAM,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC,KAC7B,MAAM,CAAC,MAAM,EAAE,OAAO,CAOtB,CAAC"}
@@ -7,7 +7,7 @@
7
7
  * NOTE: some content API routes are returned to the admin panel e.g. to
8
8
  * populate the users and permissions roles page. We need to ensure that the
9
9
  * routes can be serialized to JSON without errors.
10
- */ const sanitizeRouteForSerialization = ({ request, response, ...rest })=>rest;
10
+ */ const sanitizeRouteForSerialization = ({ request: _request, response: _response, ...rest })=>rest;
11
11
  const sanitizeRoutesArrayForSerialization = (routes)=>routes.filter((route)=>!!route && typeof route === 'object').map(sanitizeRouteForSerialization);
12
12
  const sanitizeRoutesMapForSerialization = (map)=>Object.entries(map).reduce((acc, [key, value])=>({
13
13
  ...acc,
@@ -1 +1 @@
1
- {"version":3,"file":"route-serialization.js","sources":["../src/route-serialization.ts"],"sourcesContent":["/*\n * Utility to sanitize content API route objects for safe JSON serialization.\n * Removes Zod validation fields (request/response) for safe serialization.\n *\n * NOTE: some content API routes are returned to the admin panel e.g. to\n * populate the users and permissions roles page. We need to ensure that the\n * routes can be serialized to JSON without errors.\n */\n\nexport const sanitizeRouteForSerialization = ({\n request,\n response,\n ...rest\n}: Record<string, unknown>) => rest as Record<string, unknown>;\n\nexport const sanitizeRoutesArrayForSerialization = (routes: unknown[]): Record<string, unknown>[] =>\n routes\n .filter((route): route is Record<string, unknown> => !!route && typeof route === 'object')\n .map(sanitizeRouteForSerialization);\n\nexport const sanitizeRoutesMapForSerialization = (\n map: Record<string, unknown[]>\n): Record<string, unknown> =>\n Object.entries(map).reduce(\n (acc, [key, value]) => ({\n ...acc,\n [key]: Array.isArray(value) ? sanitizeRoutesArrayForSerialization(value) : value,\n }),\n {}\n );\n"],"names":["sanitizeRouteForSerialization","request","response","rest","sanitizeRoutesArrayForSerialization","routes","filter","route","map","sanitizeRoutesMapForSerialization","Object","entries","reduce","acc","key","value","Array","isArray"],"mappings":";;AAAA;;;;;;;AAOC,IAEM,MAAMA,6BAAAA,GAAgC,CAAC,EAC5CC,OAAO,EACPC,QAAQ,EACR,GAAGC,IAAAA,EACqB,GAAKA;MAElBC,mCAAAA,GAAsC,CAACC,MAAAA,GAClDA,MAAAA,CACGC,MAAM,CAAC,CAACC,KAAAA,GAA4C,CAAC,CAACA,KAAAA,IAAS,OAAOA,UAAU,QAAA,CAAA,CAChFC,GAAG,CAACR,6BAAAA;MAEIS,iCAAAA,GAAoC,CAC/CD,GAAAA,GAEAE,MAAAA,CAAOC,OAAO,CAACH,GAAAA,CAAAA,CAAKI,MAAM,CACxB,CAACC,GAAAA,EAAK,CAACC,GAAAA,EAAKC,KAAAA,CAAM,IAAM;AACtB,YAAA,GAAGF,GAAG;AACN,YAAA,CAACC,MAAME,KAAAA,CAAMC,OAAO,CAACF,KAAAA,CAAAA,GAASX,oCAAoCW,KAAAA,CAAAA,GAASA;SAC7E,CAAA,EACA,EAAC;;;;;;"}
1
+ {"version":3,"file":"route-serialization.js","sources":["../src/route-serialization.ts"],"sourcesContent":["/*\n * Utility to sanitize content API route objects for safe JSON serialization.\n * Removes Zod validation fields (request/response) for safe serialization.\n *\n * NOTE: some content API routes are returned to the admin panel e.g. to\n * populate the users and permissions roles page. We need to ensure that the\n * routes can be serialized to JSON without errors.\n */\n\nexport const sanitizeRouteForSerialization = ({\n request: _request,\n response: _response,\n ...rest\n}: Record<string, unknown>) => rest as Record<string, unknown>;\n\nexport const sanitizeRoutesArrayForSerialization = (routes: unknown[]): Record<string, unknown>[] =>\n routes\n .filter((route): route is Record<string, unknown> => !!route && typeof route === 'object')\n .map(sanitizeRouteForSerialization);\n\nexport const sanitizeRoutesMapForSerialization = (\n map: Record<string, unknown[]>\n): Record<string, unknown> =>\n Object.entries(map).reduce(\n (acc, [key, value]) => ({\n ...acc,\n [key]: Array.isArray(value) ? sanitizeRoutesArrayForSerialization(value) : value,\n }),\n {}\n );\n"],"names":["sanitizeRouteForSerialization","request","_request","response","_response","rest","sanitizeRoutesArrayForSerialization","routes","filter","route","map","sanitizeRoutesMapForSerialization","Object","entries","reduce","acc","key","value","Array","isArray"],"mappings":";;AAAA;;;;;;;AAOC,IAEM,MAAMA,6BAAAA,GAAgC,CAAC,EAC5CC,OAAAA,EAASC,QAAQ,EACjBC,QAAAA,EAAUC,SAAS,EACnB,GAAGC,IAAAA,EACqB,GAAKA;MAElBC,mCAAAA,GAAsC,CAACC,MAAAA,GAClDA,MAAAA,CACGC,MAAM,CAAC,CAACC,KAAAA,GAA4C,CAAC,CAACA,KAAAA,IAAS,OAAOA,UAAU,QAAA,CAAA,CAChFC,GAAG,CAACV,6BAAAA;MAEIW,iCAAAA,GAAoC,CAC/CD,GAAAA,GAEAE,MAAAA,CAAOC,OAAO,CAACH,GAAAA,CAAAA,CAAKI,MAAM,CACxB,CAACC,GAAAA,EAAK,CAACC,GAAAA,EAAKC,KAAAA,CAAM,IAAM;AACtB,YAAA,GAAGF,GAAG;AACN,YAAA,CAACC,MAAME,KAAAA,CAAMC,OAAO,CAACF,KAAAA,CAAAA,GAASX,oCAAoCW,KAAAA,CAAAA,GAASA;SAC7E,CAAA,EACA,EAAC;;;;;;"}
@@ -5,7 +5,7 @@
5
5
  * NOTE: some content API routes are returned to the admin panel e.g. to
6
6
  * populate the users and permissions roles page. We need to ensure that the
7
7
  * routes can be serialized to JSON without errors.
8
- */ const sanitizeRouteForSerialization = ({ request, response, ...rest })=>rest;
8
+ */ const sanitizeRouteForSerialization = ({ request: _request, response: _response, ...rest })=>rest;
9
9
  const sanitizeRoutesArrayForSerialization = (routes)=>routes.filter((route)=>!!route && typeof route === 'object').map(sanitizeRouteForSerialization);
10
10
  const sanitizeRoutesMapForSerialization = (map)=>Object.entries(map).reduce((acc, [key, value])=>({
11
11
  ...acc,
@@ -1 +1 @@
1
- {"version":3,"file":"route-serialization.mjs","sources":["../src/route-serialization.ts"],"sourcesContent":["/*\n * Utility to sanitize content API route objects for safe JSON serialization.\n * Removes Zod validation fields (request/response) for safe serialization.\n *\n * NOTE: some content API routes are returned to the admin panel e.g. to\n * populate the users and permissions roles page. We need to ensure that the\n * routes can be serialized to JSON without errors.\n */\n\nexport const sanitizeRouteForSerialization = ({\n request,\n response,\n ...rest\n}: Record<string, unknown>) => rest as Record<string, unknown>;\n\nexport const sanitizeRoutesArrayForSerialization = (routes: unknown[]): Record<string, unknown>[] =>\n routes\n .filter((route): route is Record<string, unknown> => !!route && typeof route === 'object')\n .map(sanitizeRouteForSerialization);\n\nexport const sanitizeRoutesMapForSerialization = (\n map: Record<string, unknown[]>\n): Record<string, unknown> =>\n Object.entries(map).reduce(\n (acc, [key, value]) => ({\n ...acc,\n [key]: Array.isArray(value) ? sanitizeRoutesArrayForSerialization(value) : value,\n }),\n {}\n );\n"],"names":["sanitizeRouteForSerialization","request","response","rest","sanitizeRoutesArrayForSerialization","routes","filter","route","map","sanitizeRoutesMapForSerialization","Object","entries","reduce","acc","key","value","Array","isArray"],"mappings":"AAAA;;;;;;;AAOC,IAEM,MAAMA,6BAAAA,GAAgC,CAAC,EAC5CC,OAAO,EACPC,QAAQ,EACR,GAAGC,IAAAA,EACqB,GAAKA;MAElBC,mCAAAA,GAAsC,CAACC,MAAAA,GAClDA,MAAAA,CACGC,MAAM,CAAC,CAACC,KAAAA,GAA4C,CAAC,CAACA,KAAAA,IAAS,OAAOA,UAAU,QAAA,CAAA,CAChFC,GAAG,CAACR,6BAAAA;MAEIS,iCAAAA,GAAoC,CAC/CD,GAAAA,GAEAE,MAAAA,CAAOC,OAAO,CAACH,GAAAA,CAAAA,CAAKI,MAAM,CACxB,CAACC,GAAAA,EAAK,CAACC,GAAAA,EAAKC,KAAAA,CAAM,IAAM;AACtB,YAAA,GAAGF,GAAG;AACN,YAAA,CAACC,MAAME,KAAAA,CAAMC,OAAO,CAACF,KAAAA,CAAAA,GAASX,oCAAoCW,KAAAA,CAAAA,GAASA;SAC7E,CAAA,EACA,EAAC;;;;"}
1
+ {"version":3,"file":"route-serialization.mjs","sources":["../src/route-serialization.ts"],"sourcesContent":["/*\n * Utility to sanitize content API route objects for safe JSON serialization.\n * Removes Zod validation fields (request/response) for safe serialization.\n *\n * NOTE: some content API routes are returned to the admin panel e.g. to\n * populate the users and permissions roles page. We need to ensure that the\n * routes can be serialized to JSON without errors.\n */\n\nexport const sanitizeRouteForSerialization = ({\n request: _request,\n response: _response,\n ...rest\n}: Record<string, unknown>) => rest as Record<string, unknown>;\n\nexport const sanitizeRoutesArrayForSerialization = (routes: unknown[]): Record<string, unknown>[] =>\n routes\n .filter((route): route is Record<string, unknown> => !!route && typeof route === 'object')\n .map(sanitizeRouteForSerialization);\n\nexport const sanitizeRoutesMapForSerialization = (\n map: Record<string, unknown[]>\n): Record<string, unknown> =>\n Object.entries(map).reduce(\n (acc, [key, value]) => ({\n ...acc,\n [key]: Array.isArray(value) ? sanitizeRoutesArrayForSerialization(value) : value,\n }),\n {}\n );\n"],"names":["sanitizeRouteForSerialization","request","_request","response","_response","rest","sanitizeRoutesArrayForSerialization","routes","filter","route","map","sanitizeRoutesMapForSerialization","Object","entries","reduce","acc","key","value","Array","isArray"],"mappings":"AAAA;;;;;;;AAOC,IAEM,MAAMA,6BAAAA,GAAgC,CAAC,EAC5CC,OAAAA,EAASC,QAAQ,EACjBC,QAAAA,EAAUC,SAAS,EACnB,GAAGC,IAAAA,EACqB,GAAKA;MAElBC,mCAAAA,GAAsC,CAACC,MAAAA,GAClDA,MAAAA,CACGC,MAAM,CAAC,CAACC,KAAAA,GAA4C,CAAC,CAACA,KAAAA,IAAS,OAAOA,UAAU,QAAA,CAAA,CAChFC,GAAG,CAACV,6BAAAA;MAEIW,iCAAAA,GAAoC,CAC/CD,GAAAA,GAEAE,MAAAA,CAAOC,OAAO,CAACH,GAAAA,CAAAA,CAAKI,MAAM,CACxB,CAACC,GAAAA,EAAK,CAACC,GAAAA,EAAKC,KAAAA,CAAM,IAAM;AACtB,YAAA,GAAGF,GAAG;AACN,YAAA,CAACC,MAAME,KAAAA,CAAMC,OAAO,CAACF,KAAAA,CAAAA,GAASX,oCAAoCW,KAAAA,CAAAA,GAASA;SAC7E,CAAA,EACA,EAAC;;;;"}
@@ -99,7 +99,9 @@ const createAPISanitizers = (opts)=>{
99
99
  throw new Error('Missing schema in sanitizeOutput');
100
100
  }
101
101
  if (fp.isArray(data)) {
102
- const res = new Array(data.length);
102
+ const res = Array.from({
103
+ length: data.length
104
+ });
103
105
  for(let i = 0; i < data.length; i += 1){
104
106
  res[i] = await sanitizeOutput(data[i], schema, {
105
107
  auth
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../src/sanitize/index.ts"],"sourcesContent":["import { CurriedFunction1 } from 'lodash';\nimport { isArray, cloneDeep, omit, pick } from 'lodash/fp';\nimport type { z } from 'zod/v4';\n\nimport { constants, getNonWritableAttributes } from '../content-types';\nimport { ALLOWED_QUERY_PARAM_KEYS } from '../content-api-constants';\nimport {\n type RouteLike,\n getExtraQueryKeysFromRoute,\n getExtraRootKeysFromRouteBody,\n} from '../content-api-route-params';\nimport { pipe as pipeAsync } from '../async';\n\nimport * as visitors from './visitors';\nimport * as sanitizers from './sanitizers';\nimport traverseEntity from '../traverse-entity';\n\nimport { traverseQueryFilters, traverseQuerySort, traverseQueryPopulate } from '../traverse';\nimport type { Model, Data } from '../types';\nimport { validatePublicationFilterQueryParam } from '../publication-filter';\nimport { hasSort } from '../sort-query';\n\nexport interface Options {\n auth?: unknown;\n /**\n * If true, removes fields that are not declared in the schema (input) or keeps only allowed query param keys (query).\n * Defaults to false for backward compatibility.\n * TODO: In Strapi 6, strictParams will default to true (and may be removed as an option)\n */\n strictParams?: boolean;\n /**\n * When set, extra query/input params are derived from the route's request schema (and validated/sanitized with Zod).\n * When absent, no extra params are allowed in strict mode.\n */\n route?: RouteLike;\n}\n\nexport interface Sanitizer {\n (schema: Model): CurriedFunction1<Data, Promise<Data>>;\n}\nexport interface SanitizeFunc {\n (data: unknown, schema: Model, options?: Options): Promise<unknown>;\n}\n\nexport type SanitizeQueryParamHandler = (\n value: unknown,\n schema: Model,\n options?: Options\n) => Promise<unknown>;\n\nexport type SanitizeBodyParamHandler = (\n value: unknown,\n schema: Model,\n options?: Options\n) => Promise<unknown>;\n\nexport interface APIOptions {\n sanitizers?: Sanitizers;\n getModel: (model: string) => Model;\n}\n\nexport interface Sanitizers {\n input?: Sanitizer[];\n output?: Sanitizer[];\n}\n\nconst createAPISanitizers = (opts: APIOptions) => {\n const { getModel } = opts;\n\n const sanitizeInput: SanitizeFunc = (\n data: unknown,\n schema: Model,\n { auth, strictParams = false, route } = {}\n ) => {\n if (!schema) {\n throw new Error('Missing schema in sanitizeInput');\n }\n if (isArray(data)) {\n return Promise.all(\n data.map((entry) => sanitizeInput(entry, schema, { auth, strictParams, route }))\n );\n }\n\n const allowedExtraRootKeys = getExtraRootKeysFromRouteBody(route);\n\n const nonWritableAttributes = getNonWritableAttributes(schema);\n\n const transforms = [\n // Remove first level ID in inputs\n omit(constants.ID_ATTRIBUTE),\n omit(constants.DOC_ID_ATTRIBUTE),\n // Remove non-writable attributes\n traverseEntity(visitors.removeRestrictedFields(nonWritableAttributes), { schema, getModel }),\n ];\n\n if (strictParams) {\n // Remove unrecognized fields (allowedExtraRootKeys = registered input param keys)\n transforms.push(\n traverseEntity(visitors.removeUnrecognizedFields, {\n schema,\n getModel,\n allowedExtraRootKeys,\n })\n );\n }\n\n if (auth) {\n // Remove restricted relations\n transforms.push(\n traverseEntity(visitors.removeRestrictedRelations(auth), { schema, getModel })\n );\n }\n\n // Apply sanitizers from registry if exists\n opts?.sanitizers?.input?.forEach((sanitizer: Sanitizer) => transforms.push(sanitizer(schema)));\n\n /**\n * For each extra root key from the route's body schema present in data, run Zod safeParse.\n * If parsing fails, the key is removed from the output.\n *\n * Content-api sends the document payload as body.data; the controller calls sanitizeInput(body.data, ctx),\n * so the input we receive here is the inner payload (keys like \"relatedMedia\", \"name\"), not the full body.\n * The route's body schema is z.object({ data: ... }), so its shape includes \"data\". We skip \"data\" because\n * the main document payload is already sanitized above by traverseEntity (removeUnrecognizedFields, etc.);\n * relation ops (connect/disconnect/set) are handled there, not by the route's Zod schema. We only run\n * Zod here for truly extra root keys added via addInputParams (e.g. clientMutationId).\n */\n const routeBodySanitizeTransform = async (data: Data): Promise<Data> => {\n if (!data || typeof data !== 'object' || Array.isArray(data)) return data;\n const obj = data as Record<string, unknown>;\n const bodySchema = route?.request?.body?.['application/json'];\n if (bodySchema && typeof bodySchema === 'object' && 'shape' in bodySchema) {\n const shape = (bodySchema as { shape: Record<string, z.ZodTypeAny> }).shape;\n for (const key of Object.keys(shape)) {\n if (key === 'data' || !(key in obj)) continue;\n const zodSchema = shape[key];\n if (zodSchema && typeof (zodSchema as z.ZodTypeAny).safeParse === 'function') {\n const result = (zodSchema as z.ZodTypeAny).safeParse(obj[key]);\n if (result.success) {\n obj[key] = result.data;\n } else {\n delete obj[key];\n }\n }\n }\n }\n return data;\n };\n (transforms as Array<(data: Data) => Data | Promise<Data>>).push(routeBodySanitizeTransform);\n\n return pipeAsync(...transforms)(data as Data);\n };\n\n const sanitizeOutput: SanitizeFunc = async (data, schema: Model, { auth } = {}) => {\n if (!schema) {\n throw new Error('Missing schema in sanitizeOutput');\n }\n if (isArray(data)) {\n const res = new Array(data.length);\n for (let i = 0; i < data.length; i += 1) {\n res[i] = await sanitizeOutput(data[i], schema, { auth });\n }\n return res;\n }\n\n const transforms = [\n (data: Data) => sanitizers.defaultSanitizeOutput({ schema, getModel }, data),\n ];\n\n if (auth) {\n transforms.push(\n traverseEntity(visitors.removeRestrictedRelations(auth), { schema, getModel })\n );\n }\n\n // Apply sanitizers from registry if exists\n opts?.sanitizers?.output?.forEach((sanitizer: Sanitizer) => transforms.push(sanitizer(schema)));\n\n return pipeAsync(...transforms)(data as Data);\n };\n\n const sanitizeQuery = async (\n query: Record<string, unknown>,\n schema: Model,\n { auth, strictParams = false, route }: Options = {}\n ) => {\n if (!schema) {\n throw new Error('Missing schema in sanitizeQuery');\n }\n const { filters, sort, fields, populate } = query;\n\n const sanitizedQuery = cloneDeep(query);\n\n if ('publicationFilter' in sanitizedQuery) {\n validatePublicationFilterQueryParam(sanitizedQuery.publicationFilter);\n }\n\n if (filters) {\n Object.assign(sanitizedQuery, { filters: await sanitizeFilters(filters, schema, { auth }) });\n }\n\n if (hasSort(sort)) {\n Object.assign(sanitizedQuery, { sort: await sanitizeSort(sort, schema, { auth }) });\n } else if ('sort' in sanitizedQuery) {\n delete sanitizedQuery.sort;\n }\n\n if (fields) {\n Object.assign(sanitizedQuery, { fields: await sanitizeFields(fields, schema) });\n }\n\n if (populate) {\n Object.assign(sanitizedQuery, { populate: await sanitizePopulate(populate, schema) });\n }\n\n const extraQueryKeys = getExtraQueryKeysFromRoute(route);\n const routeQuerySchema = route?.request?.query;\n if (routeQuerySchema) {\n for (const key of extraQueryKeys) {\n if (key in query) {\n const zodSchema = routeQuerySchema[key];\n if (zodSchema && typeof (zodSchema as z.ZodTypeAny).safeParse === 'function') {\n const result = (zodSchema as z.ZodTypeAny).safeParse(query[key]);\n if (result.success) {\n sanitizedQuery[key] = result.data;\n } else {\n delete sanitizedQuery[key];\n }\n }\n }\n }\n }\n\n if (strictParams) {\n const allowedKeys = [...ALLOWED_QUERY_PARAM_KEYS, ...extraQueryKeys];\n return pick(allowedKeys, sanitizedQuery) as Record<string, unknown>;\n }\n\n return sanitizedQuery;\n };\n\n const sanitizeFilters: SanitizeFunc = (filters, schema: Model, { auth } = {}) => {\n if (!schema) {\n throw new Error('Missing schema in sanitizeFilters');\n }\n if (isArray(filters)) {\n return Promise.all(filters.map((filter) => sanitizeFilters(filter, schema, { auth })));\n }\n\n const transforms = [sanitizers.defaultSanitizeFilters({ schema, getModel })];\n\n if (auth) {\n transforms.push(\n traverseQueryFilters(visitors.removeRestrictedRelations(auth), { schema, getModel })\n );\n }\n\n return pipeAsync(...transforms)(filters);\n };\n\n const sanitizeSort: SanitizeFunc = (sort, schema: Model, { auth } = {}) => {\n if (!schema) {\n throw new Error('Missing schema in sanitizeSort');\n }\n const transforms = [sanitizers.defaultSanitizeSort({ schema, getModel })];\n\n if (auth) {\n transforms.push(\n traverseQuerySort(visitors.removeRestrictedRelations(auth), { schema, getModel })\n );\n }\n\n return pipeAsync(...transforms)(sort);\n };\n\n const sanitizeFields: SanitizeFunc = (fields, schema: Model) => {\n if (!schema) {\n throw new Error('Missing schema in sanitizeFields');\n }\n const transforms = [sanitizers.defaultSanitizeFields({ schema, getModel })];\n\n return pipeAsync(...transforms)(fields);\n };\n\n const sanitizePopulate: SanitizeFunc = (populate, schema: Model, { auth } = {}) => {\n if (!schema) {\n throw new Error('Missing schema in sanitizePopulate');\n }\n const transforms = [sanitizers.defaultSanitizePopulate({ schema, getModel })];\n\n if (auth) {\n transforms.push(\n traverseQueryPopulate(visitors.removeRestrictedRelations(auth), { schema, getModel })\n );\n }\n\n return pipeAsync(...transforms)(populate);\n };\n\n return {\n input: sanitizeInput,\n output: sanitizeOutput,\n query: sanitizeQuery,\n filters: sanitizeFilters,\n sort: sanitizeSort,\n fields: sanitizeFields,\n populate: sanitizePopulate,\n };\n};\n\nexport { createAPISanitizers, sanitizers, visitors };\n\nexport type APISanitiers = ReturnType<typeof createAPISanitizers>;\n"],"names":["createAPISanitizers","opts","getModel","sanitizeInput","data","schema","auth","strictParams","route","Error","isArray","Promise","all","map","entry","allowedExtraRootKeys","getExtraRootKeysFromRouteBody","nonWritableAttributes","getNonWritableAttributes","transforms","omit","constants","ID_ATTRIBUTE","DOC_ID_ATTRIBUTE","traverseEntity","visitors","push","sanitizers","input","forEach","sanitizer","routeBodySanitizeTransform","Array","obj","bodySchema","request","body","shape","key","Object","keys","zodSchema","safeParse","result","success","pipeAsync","sanitizeOutput","res","length","i","output","sanitizeQuery","query","filters","sort","fields","populate","sanitizedQuery","cloneDeep","validatePublicationFilterQueryParam","publicationFilter","assign","sanitizeFilters","hasSort","sanitizeSort","sanitizeFields","sanitizePopulate","extraQueryKeys","getExtraQueryKeysFromRoute","routeQuerySchema","allowedKeys","ALLOWED_QUERY_PARAM_KEYS","pick","filter","traverseQueryFilters","traverseQuerySort","traverseQueryPopulate"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../../src/sanitize/index.ts"],"sourcesContent":["import { CurriedFunction1 } from 'lodash';\nimport { isArray, cloneDeep, omit, pick } from 'lodash/fp';\nimport type { z } from 'zod/v4';\n\nimport { constants, getNonWritableAttributes } from '../content-types';\nimport { ALLOWED_QUERY_PARAM_KEYS } from '../content-api-constants';\nimport {\n type RouteLike,\n getExtraQueryKeysFromRoute,\n getExtraRootKeysFromRouteBody,\n} from '../content-api-route-params';\nimport { pipe as pipeAsync } from '../async';\n\nimport * as visitors from './visitors';\nimport * as sanitizers from './sanitizers';\nimport traverseEntity from '../traverse-entity';\n\nimport { traverseQueryFilters, traverseQuerySort, traverseQueryPopulate } from '../traverse';\nimport type { Model, Data } from '../types';\nimport { validatePublicationFilterQueryParam } from '../publication-filter';\nimport { hasSort } from '../sort-query';\n\nexport interface Options {\n auth?: unknown;\n /**\n * If true, removes fields that are not declared in the schema (input) or keeps only allowed query param keys (query).\n * Defaults to false for backward compatibility.\n * TODO: In Strapi 6, strictParams will default to true (and may be removed as an option)\n */\n strictParams?: boolean;\n /**\n * When set, extra query/input params are derived from the route's request schema (and validated/sanitized with Zod).\n * When absent, no extra params are allowed in strict mode.\n */\n route?: RouteLike;\n}\n\nexport interface Sanitizer {\n (schema: Model): CurriedFunction1<Data, Promise<Data>>;\n}\nexport interface SanitizeFunc {\n (data: unknown, schema: Model, options?: Options): Promise<unknown>;\n}\n\nexport type SanitizeQueryParamHandler = (\n value: unknown,\n schema: Model,\n options?: Options\n) => Promise<unknown>;\n\nexport type SanitizeBodyParamHandler = (\n value: unknown,\n schema: Model,\n options?: Options\n) => Promise<unknown>;\n\nexport interface APIOptions {\n sanitizers?: Sanitizers;\n getModel: (model: string) => Model;\n}\n\nexport interface Sanitizers {\n input?: Sanitizer[];\n output?: Sanitizer[];\n}\n\nconst createAPISanitizers = (opts: APIOptions) => {\n const { getModel } = opts;\n\n const sanitizeInput: SanitizeFunc = (\n data: unknown,\n schema: Model,\n { auth, strictParams = false, route } = {}\n ) => {\n if (!schema) {\n throw new Error('Missing schema in sanitizeInput');\n }\n if (isArray(data)) {\n return Promise.all(\n data.map((entry) => sanitizeInput(entry, schema, { auth, strictParams, route }))\n );\n }\n\n const allowedExtraRootKeys = getExtraRootKeysFromRouteBody(route);\n\n const nonWritableAttributes = getNonWritableAttributes(schema);\n\n const transforms = [\n // Remove first level ID in inputs\n omit(constants.ID_ATTRIBUTE),\n omit(constants.DOC_ID_ATTRIBUTE),\n // Remove non-writable attributes\n traverseEntity(visitors.removeRestrictedFields(nonWritableAttributes), { schema, getModel }),\n ];\n\n if (strictParams) {\n // Remove unrecognized fields (allowedExtraRootKeys = registered input param keys)\n transforms.push(\n traverseEntity(visitors.removeUnrecognizedFields, {\n schema,\n getModel,\n allowedExtraRootKeys,\n })\n );\n }\n\n if (auth) {\n // Remove restricted relations\n transforms.push(\n traverseEntity(visitors.removeRestrictedRelations(auth), { schema, getModel })\n );\n }\n\n // Apply sanitizers from registry if exists\n opts?.sanitizers?.input?.forEach((sanitizer: Sanitizer) => transforms.push(sanitizer(schema)));\n\n /**\n * For each extra root key from the route's body schema present in data, run Zod safeParse.\n * If parsing fails, the key is removed from the output.\n *\n * Content-api sends the document payload as body.data; the controller calls sanitizeInput(body.data, ctx),\n * so the input we receive here is the inner payload (keys like \"relatedMedia\", \"name\"), not the full body.\n * The route's body schema is z.object({ data: ... }), so its shape includes \"data\". We skip \"data\" because\n * the main document payload is already sanitized above by traverseEntity (removeUnrecognizedFields, etc.);\n * relation ops (connect/disconnect/set) are handled there, not by the route's Zod schema. We only run\n * Zod here for truly extra root keys added via addInputParams (e.g. clientMutationId).\n */\n const routeBodySanitizeTransform = async (data: Data): Promise<Data> => {\n if (!data || typeof data !== 'object' || Array.isArray(data)) return data;\n const obj = data as Record<string, unknown>;\n const bodySchema = route?.request?.body?.['application/json'];\n if (bodySchema && typeof bodySchema === 'object' && 'shape' in bodySchema) {\n const shape = (bodySchema as { shape: Record<string, z.ZodTypeAny> }).shape;\n for (const key of Object.keys(shape)) {\n if (key === 'data' || !(key in obj)) continue;\n const zodSchema = shape[key];\n if (zodSchema && typeof (zodSchema as z.ZodTypeAny).safeParse === 'function') {\n const result = (zodSchema as z.ZodTypeAny).safeParse(obj[key]);\n if (result.success) {\n obj[key] = result.data;\n } else {\n delete obj[key];\n }\n }\n }\n }\n return data;\n };\n (transforms as Array<(data: Data) => Data | Promise<Data>>).push(routeBodySanitizeTransform);\n\n return pipeAsync(...transforms)(data as Data);\n };\n\n const sanitizeOutput: SanitizeFunc = async (data, schema: Model, { auth } = {}) => {\n if (!schema) {\n throw new Error('Missing schema in sanitizeOutput');\n }\n if (isArray(data)) {\n const res: unknown[] = Array.from({ length: data.length });\n for (let i = 0; i < data.length; i += 1) {\n res[i] = await sanitizeOutput(data[i], schema, { auth });\n }\n return res;\n }\n\n const transforms = [\n (data: Data) => sanitizers.defaultSanitizeOutput({ schema, getModel }, data),\n ];\n\n if (auth) {\n transforms.push(\n traverseEntity(visitors.removeRestrictedRelations(auth), { schema, getModel })\n );\n }\n\n // Apply sanitizers from registry if exists\n opts?.sanitizers?.output?.forEach((sanitizer: Sanitizer) => transforms.push(sanitizer(schema)));\n\n return pipeAsync(...transforms)(data as Data);\n };\n\n const sanitizeQuery = async (\n query: Record<string, unknown>,\n schema: Model,\n { auth, strictParams = false, route }: Options = {}\n ) => {\n if (!schema) {\n throw new Error('Missing schema in sanitizeQuery');\n }\n const { filters, sort, fields, populate } = query;\n\n const sanitizedQuery = cloneDeep(query);\n\n if ('publicationFilter' in sanitizedQuery) {\n validatePublicationFilterQueryParam(sanitizedQuery.publicationFilter);\n }\n\n if (filters) {\n Object.assign(sanitizedQuery, { filters: await sanitizeFilters(filters, schema, { auth }) });\n }\n\n if (hasSort(sort)) {\n Object.assign(sanitizedQuery, { sort: await sanitizeSort(sort, schema, { auth }) });\n } else if ('sort' in sanitizedQuery) {\n delete sanitizedQuery.sort;\n }\n\n if (fields) {\n Object.assign(sanitizedQuery, { fields: await sanitizeFields(fields, schema) });\n }\n\n if (populate) {\n Object.assign(sanitizedQuery, { populate: await sanitizePopulate(populate, schema) });\n }\n\n const extraQueryKeys = getExtraQueryKeysFromRoute(route);\n const routeQuerySchema = route?.request?.query;\n if (routeQuerySchema) {\n for (const key of extraQueryKeys) {\n if (key in query) {\n const zodSchema = routeQuerySchema[key];\n if (zodSchema && typeof (zodSchema as z.ZodTypeAny).safeParse === 'function') {\n const result = (zodSchema as z.ZodTypeAny).safeParse(query[key]);\n if (result.success) {\n sanitizedQuery[key] = result.data;\n } else {\n delete sanitizedQuery[key];\n }\n }\n }\n }\n }\n\n if (strictParams) {\n const allowedKeys = [...ALLOWED_QUERY_PARAM_KEYS, ...extraQueryKeys];\n return pick(allowedKeys, sanitizedQuery) as Record<string, unknown>;\n }\n\n return sanitizedQuery;\n };\n\n const sanitizeFilters: SanitizeFunc = (filters, schema: Model, { auth } = {}) => {\n if (!schema) {\n throw new Error('Missing schema in sanitizeFilters');\n }\n if (isArray(filters)) {\n return Promise.all(filters.map((filter) => sanitizeFilters(filter, schema, { auth })));\n }\n\n const transforms = [sanitizers.defaultSanitizeFilters({ schema, getModel })];\n\n if (auth) {\n transforms.push(\n traverseQueryFilters(visitors.removeRestrictedRelations(auth), { schema, getModel })\n );\n }\n\n return pipeAsync(...transforms)(filters);\n };\n\n const sanitizeSort: SanitizeFunc = (sort, schema: Model, { auth } = {}) => {\n if (!schema) {\n throw new Error('Missing schema in sanitizeSort');\n }\n const transforms = [sanitizers.defaultSanitizeSort({ schema, getModel })];\n\n if (auth) {\n transforms.push(\n traverseQuerySort(visitors.removeRestrictedRelations(auth), { schema, getModel })\n );\n }\n\n return pipeAsync(...transforms)(sort);\n };\n\n const sanitizeFields: SanitizeFunc = (fields, schema: Model) => {\n if (!schema) {\n throw new Error('Missing schema in sanitizeFields');\n }\n const transforms = [sanitizers.defaultSanitizeFields({ schema, getModel })];\n\n return pipeAsync(...transforms)(fields);\n };\n\n const sanitizePopulate: SanitizeFunc = (populate, schema: Model, { auth } = {}) => {\n if (!schema) {\n throw new Error('Missing schema in sanitizePopulate');\n }\n const transforms = [sanitizers.defaultSanitizePopulate({ schema, getModel })];\n\n if (auth) {\n transforms.push(\n traverseQueryPopulate(visitors.removeRestrictedRelations(auth), { schema, getModel })\n );\n }\n\n return pipeAsync(...transforms)(populate);\n };\n\n return {\n input: sanitizeInput,\n output: sanitizeOutput,\n query: sanitizeQuery,\n filters: sanitizeFilters,\n sort: sanitizeSort,\n fields: sanitizeFields,\n populate: sanitizePopulate,\n };\n};\n\nexport { createAPISanitizers, sanitizers, visitors };\n\nexport type APISanitiers = ReturnType<typeof createAPISanitizers>;\n"],"names":["createAPISanitizers","opts","getModel","sanitizeInput","data","schema","auth","strictParams","route","Error","isArray","Promise","all","map","entry","allowedExtraRootKeys","getExtraRootKeysFromRouteBody","nonWritableAttributes","getNonWritableAttributes","transforms","omit","constants","ID_ATTRIBUTE","DOC_ID_ATTRIBUTE","traverseEntity","visitors","push","sanitizers","input","forEach","sanitizer","routeBodySanitizeTransform","Array","obj","bodySchema","request","body","shape","key","Object","keys","zodSchema","safeParse","result","success","pipeAsync","sanitizeOutput","res","from","length","i","output","sanitizeQuery","query","filters","sort","fields","populate","sanitizedQuery","cloneDeep","validatePublicationFilterQueryParam","publicationFilter","assign","sanitizeFilters","hasSort","sanitizeSort","sanitizeFields","sanitizePopulate","extraQueryKeys","getExtraQueryKeysFromRoute","routeQuerySchema","allowedKeys","ALLOWED_QUERY_PARAM_KEYS","pick","filter","traverseQueryFilters","traverseQuerySort","traverseQueryPopulate"],"mappings":"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"}
@@ -100,7 +100,9 @@ const createAPISanitizers = (opts)=>{
100
100
  throw new Error('Missing schema in sanitizeOutput');
101
101
  }
102
102
  if (isArray(data)) {
103
- const res = new Array(data.length);
103
+ const res = Array.from({
104
+ length: data.length
105
+ });
104
106
  for(let i = 0; i < data.length; i += 1){
105
107
  res[i] = await sanitizeOutput(data[i], schema, {
106
108
  auth
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","sources":["../../src/sanitize/index.ts"],"sourcesContent":["import { CurriedFunction1 } from 'lodash';\nimport { isArray, cloneDeep, omit, pick } from 'lodash/fp';\nimport type { z } from 'zod/v4';\n\nimport { constants, getNonWritableAttributes } from '../content-types';\nimport { ALLOWED_QUERY_PARAM_KEYS } from '../content-api-constants';\nimport {\n type RouteLike,\n getExtraQueryKeysFromRoute,\n getExtraRootKeysFromRouteBody,\n} from '../content-api-route-params';\nimport { pipe as pipeAsync } from '../async';\n\nimport * as visitors from './visitors';\nimport * as sanitizers from './sanitizers';\nimport traverseEntity from '../traverse-entity';\n\nimport { traverseQueryFilters, traverseQuerySort, traverseQueryPopulate } from '../traverse';\nimport type { Model, Data } from '../types';\nimport { validatePublicationFilterQueryParam } from '../publication-filter';\nimport { hasSort } from '../sort-query';\n\nexport interface Options {\n auth?: unknown;\n /**\n * If true, removes fields that are not declared in the schema (input) or keeps only allowed query param keys (query).\n * Defaults to false for backward compatibility.\n * TODO: In Strapi 6, strictParams will default to true (and may be removed as an option)\n */\n strictParams?: boolean;\n /**\n * When set, extra query/input params are derived from the route's request schema (and validated/sanitized with Zod).\n * When absent, no extra params are allowed in strict mode.\n */\n route?: RouteLike;\n}\n\nexport interface Sanitizer {\n (schema: Model): CurriedFunction1<Data, Promise<Data>>;\n}\nexport interface SanitizeFunc {\n (data: unknown, schema: Model, options?: Options): Promise<unknown>;\n}\n\nexport type SanitizeQueryParamHandler = (\n value: unknown,\n schema: Model,\n options?: Options\n) => Promise<unknown>;\n\nexport type SanitizeBodyParamHandler = (\n value: unknown,\n schema: Model,\n options?: Options\n) => Promise<unknown>;\n\nexport interface APIOptions {\n sanitizers?: Sanitizers;\n getModel: (model: string) => Model;\n}\n\nexport interface Sanitizers {\n input?: Sanitizer[];\n output?: Sanitizer[];\n}\n\nconst createAPISanitizers = (opts: APIOptions) => {\n const { getModel } = opts;\n\n const sanitizeInput: SanitizeFunc = (\n data: unknown,\n schema: Model,\n { auth, strictParams = false, route } = {}\n ) => {\n if (!schema) {\n throw new Error('Missing schema in sanitizeInput');\n }\n if (isArray(data)) {\n return Promise.all(\n data.map((entry) => sanitizeInput(entry, schema, { auth, strictParams, route }))\n );\n }\n\n const allowedExtraRootKeys = getExtraRootKeysFromRouteBody(route);\n\n const nonWritableAttributes = getNonWritableAttributes(schema);\n\n const transforms = [\n // Remove first level ID in inputs\n omit(constants.ID_ATTRIBUTE),\n omit(constants.DOC_ID_ATTRIBUTE),\n // Remove non-writable attributes\n traverseEntity(visitors.removeRestrictedFields(nonWritableAttributes), { schema, getModel }),\n ];\n\n if (strictParams) {\n // Remove unrecognized fields (allowedExtraRootKeys = registered input param keys)\n transforms.push(\n traverseEntity(visitors.removeUnrecognizedFields, {\n schema,\n getModel,\n allowedExtraRootKeys,\n })\n );\n }\n\n if (auth) {\n // Remove restricted relations\n transforms.push(\n traverseEntity(visitors.removeRestrictedRelations(auth), { schema, getModel })\n );\n }\n\n // Apply sanitizers from registry if exists\n opts?.sanitizers?.input?.forEach((sanitizer: Sanitizer) => transforms.push(sanitizer(schema)));\n\n /**\n * For each extra root key from the route's body schema present in data, run Zod safeParse.\n * If parsing fails, the key is removed from the output.\n *\n * Content-api sends the document payload as body.data; the controller calls sanitizeInput(body.data, ctx),\n * so the input we receive here is the inner payload (keys like \"relatedMedia\", \"name\"), not the full body.\n * The route's body schema is z.object({ data: ... }), so its shape includes \"data\". We skip \"data\" because\n * the main document payload is already sanitized above by traverseEntity (removeUnrecognizedFields, etc.);\n * relation ops (connect/disconnect/set) are handled there, not by the route's Zod schema. We only run\n * Zod here for truly extra root keys added via addInputParams (e.g. clientMutationId).\n */\n const routeBodySanitizeTransform = async (data: Data): Promise<Data> => {\n if (!data || typeof data !== 'object' || Array.isArray(data)) return data;\n const obj = data as Record<string, unknown>;\n const bodySchema = route?.request?.body?.['application/json'];\n if (bodySchema && typeof bodySchema === 'object' && 'shape' in bodySchema) {\n const shape = (bodySchema as { shape: Record<string, z.ZodTypeAny> }).shape;\n for (const key of Object.keys(shape)) {\n if (key === 'data' || !(key in obj)) continue;\n const zodSchema = shape[key];\n if (zodSchema && typeof (zodSchema as z.ZodTypeAny).safeParse === 'function') {\n const result = (zodSchema as z.ZodTypeAny).safeParse(obj[key]);\n if (result.success) {\n obj[key] = result.data;\n } else {\n delete obj[key];\n }\n }\n }\n }\n return data;\n };\n (transforms as Array<(data: Data) => Data | Promise<Data>>).push(routeBodySanitizeTransform);\n\n return pipeAsync(...transforms)(data as Data);\n };\n\n const sanitizeOutput: SanitizeFunc = async (data, schema: Model, { auth } = {}) => {\n if (!schema) {\n throw new Error('Missing schema in sanitizeOutput');\n }\n if (isArray(data)) {\n const res = new Array(data.length);\n for (let i = 0; i < data.length; i += 1) {\n res[i] = await sanitizeOutput(data[i], schema, { auth });\n }\n return res;\n }\n\n const transforms = [\n (data: Data) => sanitizers.defaultSanitizeOutput({ schema, getModel }, data),\n ];\n\n if (auth) {\n transforms.push(\n traverseEntity(visitors.removeRestrictedRelations(auth), { schema, getModel })\n );\n }\n\n // Apply sanitizers from registry if exists\n opts?.sanitizers?.output?.forEach((sanitizer: Sanitizer) => transforms.push(sanitizer(schema)));\n\n return pipeAsync(...transforms)(data as Data);\n };\n\n const sanitizeQuery = async (\n query: Record<string, unknown>,\n schema: Model,\n { auth, strictParams = false, route }: Options = {}\n ) => {\n if (!schema) {\n throw new Error('Missing schema in sanitizeQuery');\n }\n const { filters, sort, fields, populate } = query;\n\n const sanitizedQuery = cloneDeep(query);\n\n if ('publicationFilter' in sanitizedQuery) {\n validatePublicationFilterQueryParam(sanitizedQuery.publicationFilter);\n }\n\n if (filters) {\n Object.assign(sanitizedQuery, { filters: await sanitizeFilters(filters, schema, { auth }) });\n }\n\n if (hasSort(sort)) {\n Object.assign(sanitizedQuery, { sort: await sanitizeSort(sort, schema, { auth }) });\n } else if ('sort' in sanitizedQuery) {\n delete sanitizedQuery.sort;\n }\n\n if (fields) {\n Object.assign(sanitizedQuery, { fields: await sanitizeFields(fields, schema) });\n }\n\n if (populate) {\n Object.assign(sanitizedQuery, { populate: await sanitizePopulate(populate, schema) });\n }\n\n const extraQueryKeys = getExtraQueryKeysFromRoute(route);\n const routeQuerySchema = route?.request?.query;\n if (routeQuerySchema) {\n for (const key of extraQueryKeys) {\n if (key in query) {\n const zodSchema = routeQuerySchema[key];\n if (zodSchema && typeof (zodSchema as z.ZodTypeAny).safeParse === 'function') {\n const result = (zodSchema as z.ZodTypeAny).safeParse(query[key]);\n if (result.success) {\n sanitizedQuery[key] = result.data;\n } else {\n delete sanitizedQuery[key];\n }\n }\n }\n }\n }\n\n if (strictParams) {\n const allowedKeys = [...ALLOWED_QUERY_PARAM_KEYS, ...extraQueryKeys];\n return pick(allowedKeys, sanitizedQuery) as Record<string, unknown>;\n }\n\n return sanitizedQuery;\n };\n\n const sanitizeFilters: SanitizeFunc = (filters, schema: Model, { auth } = {}) => {\n if (!schema) {\n throw new Error('Missing schema in sanitizeFilters');\n }\n if (isArray(filters)) {\n return Promise.all(filters.map((filter) => sanitizeFilters(filter, schema, { auth })));\n }\n\n const transforms = [sanitizers.defaultSanitizeFilters({ schema, getModel })];\n\n if (auth) {\n transforms.push(\n traverseQueryFilters(visitors.removeRestrictedRelations(auth), { schema, getModel })\n );\n }\n\n return pipeAsync(...transforms)(filters);\n };\n\n const sanitizeSort: SanitizeFunc = (sort, schema: Model, { auth } = {}) => {\n if (!schema) {\n throw new Error('Missing schema in sanitizeSort');\n }\n const transforms = [sanitizers.defaultSanitizeSort({ schema, getModel })];\n\n if (auth) {\n transforms.push(\n traverseQuerySort(visitors.removeRestrictedRelations(auth), { schema, getModel })\n );\n }\n\n return pipeAsync(...transforms)(sort);\n };\n\n const sanitizeFields: SanitizeFunc = (fields, schema: Model) => {\n if (!schema) {\n throw new Error('Missing schema in sanitizeFields');\n }\n const transforms = [sanitizers.defaultSanitizeFields({ schema, getModel })];\n\n return pipeAsync(...transforms)(fields);\n };\n\n const sanitizePopulate: SanitizeFunc = (populate, schema: Model, { auth } = {}) => {\n if (!schema) {\n throw new Error('Missing schema in sanitizePopulate');\n }\n const transforms = [sanitizers.defaultSanitizePopulate({ schema, getModel })];\n\n if (auth) {\n transforms.push(\n traverseQueryPopulate(visitors.removeRestrictedRelations(auth), { schema, getModel })\n );\n }\n\n return pipeAsync(...transforms)(populate);\n };\n\n return {\n input: sanitizeInput,\n output: sanitizeOutput,\n query: sanitizeQuery,\n filters: sanitizeFilters,\n sort: sanitizeSort,\n fields: sanitizeFields,\n populate: sanitizePopulate,\n };\n};\n\nexport { createAPISanitizers, sanitizers, visitors };\n\nexport type APISanitiers = ReturnType<typeof createAPISanitizers>;\n"],"names":["createAPISanitizers","opts","getModel","sanitizeInput","data","schema","auth","strictParams","route","Error","isArray","Promise","all","map","entry","allowedExtraRootKeys","getExtraRootKeysFromRouteBody","nonWritableAttributes","getNonWritableAttributes","transforms","omit","constants","ID_ATTRIBUTE","DOC_ID_ATTRIBUTE","traverseEntity","visitors","push","sanitizers","input","forEach","sanitizer","routeBodySanitizeTransform","Array","obj","bodySchema","request","body","shape","key","Object","keys","zodSchema","safeParse","result","success","pipeAsync","sanitizeOutput","res","length","i","output","sanitizeQuery","query","filters","sort","fields","populate","sanitizedQuery","cloneDeep","validatePublicationFilterQueryParam","publicationFilter","assign","sanitizeFilters","hasSort","sanitizeSort","sanitizeFields","sanitizePopulate","extraQueryKeys","getExtraQueryKeysFromRoute","routeQuerySchema","allowedKeys","ALLOWED_QUERY_PARAM_KEYS","pick","filter","traverseQueryFilters","traverseQuerySort","traverseQueryPopulate"],"mappings":"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"}
1
+ {"version":3,"file":"index.mjs","sources":["../../src/sanitize/index.ts"],"sourcesContent":["import { CurriedFunction1 } from 'lodash';\nimport { isArray, cloneDeep, omit, pick } from 'lodash/fp';\nimport type { z } from 'zod/v4';\n\nimport { constants, getNonWritableAttributes } from '../content-types';\nimport { ALLOWED_QUERY_PARAM_KEYS } from '../content-api-constants';\nimport {\n type RouteLike,\n getExtraQueryKeysFromRoute,\n getExtraRootKeysFromRouteBody,\n} from '../content-api-route-params';\nimport { pipe as pipeAsync } from '../async';\n\nimport * as visitors from './visitors';\nimport * as sanitizers from './sanitizers';\nimport traverseEntity from '../traverse-entity';\n\nimport { traverseQueryFilters, traverseQuerySort, traverseQueryPopulate } from '../traverse';\nimport type { Model, Data } from '../types';\nimport { validatePublicationFilterQueryParam } from '../publication-filter';\nimport { hasSort } from '../sort-query';\n\nexport interface Options {\n auth?: unknown;\n /**\n * If true, removes fields that are not declared in the schema (input) or keeps only allowed query param keys (query).\n * Defaults to false for backward compatibility.\n * TODO: In Strapi 6, strictParams will default to true (and may be removed as an option)\n */\n strictParams?: boolean;\n /**\n * When set, extra query/input params are derived from the route's request schema (and validated/sanitized with Zod).\n * When absent, no extra params are allowed in strict mode.\n */\n route?: RouteLike;\n}\n\nexport interface Sanitizer {\n (schema: Model): CurriedFunction1<Data, Promise<Data>>;\n}\nexport interface SanitizeFunc {\n (data: unknown, schema: Model, options?: Options): Promise<unknown>;\n}\n\nexport type SanitizeQueryParamHandler = (\n value: unknown,\n schema: Model,\n options?: Options\n) => Promise<unknown>;\n\nexport type SanitizeBodyParamHandler = (\n value: unknown,\n schema: Model,\n options?: Options\n) => Promise<unknown>;\n\nexport interface APIOptions {\n sanitizers?: Sanitizers;\n getModel: (model: string) => Model;\n}\n\nexport interface Sanitizers {\n input?: Sanitizer[];\n output?: Sanitizer[];\n}\n\nconst createAPISanitizers = (opts: APIOptions) => {\n const { getModel } = opts;\n\n const sanitizeInput: SanitizeFunc = (\n data: unknown,\n schema: Model,\n { auth, strictParams = false, route } = {}\n ) => {\n if (!schema) {\n throw new Error('Missing schema in sanitizeInput');\n }\n if (isArray(data)) {\n return Promise.all(\n data.map((entry) => sanitizeInput(entry, schema, { auth, strictParams, route }))\n );\n }\n\n const allowedExtraRootKeys = getExtraRootKeysFromRouteBody(route);\n\n const nonWritableAttributes = getNonWritableAttributes(schema);\n\n const transforms = [\n // Remove first level ID in inputs\n omit(constants.ID_ATTRIBUTE),\n omit(constants.DOC_ID_ATTRIBUTE),\n // Remove non-writable attributes\n traverseEntity(visitors.removeRestrictedFields(nonWritableAttributes), { schema, getModel }),\n ];\n\n if (strictParams) {\n // Remove unrecognized fields (allowedExtraRootKeys = registered input param keys)\n transforms.push(\n traverseEntity(visitors.removeUnrecognizedFields, {\n schema,\n getModel,\n allowedExtraRootKeys,\n })\n );\n }\n\n if (auth) {\n // Remove restricted relations\n transforms.push(\n traverseEntity(visitors.removeRestrictedRelations(auth), { schema, getModel })\n );\n }\n\n // Apply sanitizers from registry if exists\n opts?.sanitizers?.input?.forEach((sanitizer: Sanitizer) => transforms.push(sanitizer(schema)));\n\n /**\n * For each extra root key from the route's body schema present in data, run Zod safeParse.\n * If parsing fails, the key is removed from the output.\n *\n * Content-api sends the document payload as body.data; the controller calls sanitizeInput(body.data, ctx),\n * so the input we receive here is the inner payload (keys like \"relatedMedia\", \"name\"), not the full body.\n * The route's body schema is z.object({ data: ... }), so its shape includes \"data\". We skip \"data\" because\n * the main document payload is already sanitized above by traverseEntity (removeUnrecognizedFields, etc.);\n * relation ops (connect/disconnect/set) are handled there, not by the route's Zod schema. We only run\n * Zod here for truly extra root keys added via addInputParams (e.g. clientMutationId).\n */\n const routeBodySanitizeTransform = async (data: Data): Promise<Data> => {\n if (!data || typeof data !== 'object' || Array.isArray(data)) return data;\n const obj = data as Record<string, unknown>;\n const bodySchema = route?.request?.body?.['application/json'];\n if (bodySchema && typeof bodySchema === 'object' && 'shape' in bodySchema) {\n const shape = (bodySchema as { shape: Record<string, z.ZodTypeAny> }).shape;\n for (const key of Object.keys(shape)) {\n if (key === 'data' || !(key in obj)) continue;\n const zodSchema = shape[key];\n if (zodSchema && typeof (zodSchema as z.ZodTypeAny).safeParse === 'function') {\n const result = (zodSchema as z.ZodTypeAny).safeParse(obj[key]);\n if (result.success) {\n obj[key] = result.data;\n } else {\n delete obj[key];\n }\n }\n }\n }\n return data;\n };\n (transforms as Array<(data: Data) => Data | Promise<Data>>).push(routeBodySanitizeTransform);\n\n return pipeAsync(...transforms)(data as Data);\n };\n\n const sanitizeOutput: SanitizeFunc = async (data, schema: Model, { auth } = {}) => {\n if (!schema) {\n throw new Error('Missing schema in sanitizeOutput');\n }\n if (isArray(data)) {\n const res: unknown[] = Array.from({ length: data.length });\n for (let i = 0; i < data.length; i += 1) {\n res[i] = await sanitizeOutput(data[i], schema, { auth });\n }\n return res;\n }\n\n const transforms = [\n (data: Data) => sanitizers.defaultSanitizeOutput({ schema, getModel }, data),\n ];\n\n if (auth) {\n transforms.push(\n traverseEntity(visitors.removeRestrictedRelations(auth), { schema, getModel })\n );\n }\n\n // Apply sanitizers from registry if exists\n opts?.sanitizers?.output?.forEach((sanitizer: Sanitizer) => transforms.push(sanitizer(schema)));\n\n return pipeAsync(...transforms)(data as Data);\n };\n\n const sanitizeQuery = async (\n query: Record<string, unknown>,\n schema: Model,\n { auth, strictParams = false, route }: Options = {}\n ) => {\n if (!schema) {\n throw new Error('Missing schema in sanitizeQuery');\n }\n const { filters, sort, fields, populate } = query;\n\n const sanitizedQuery = cloneDeep(query);\n\n if ('publicationFilter' in sanitizedQuery) {\n validatePublicationFilterQueryParam(sanitizedQuery.publicationFilter);\n }\n\n if (filters) {\n Object.assign(sanitizedQuery, { filters: await sanitizeFilters(filters, schema, { auth }) });\n }\n\n if (hasSort(sort)) {\n Object.assign(sanitizedQuery, { sort: await sanitizeSort(sort, schema, { auth }) });\n } else if ('sort' in sanitizedQuery) {\n delete sanitizedQuery.sort;\n }\n\n if (fields) {\n Object.assign(sanitizedQuery, { fields: await sanitizeFields(fields, schema) });\n }\n\n if (populate) {\n Object.assign(sanitizedQuery, { populate: await sanitizePopulate(populate, schema) });\n }\n\n const extraQueryKeys = getExtraQueryKeysFromRoute(route);\n const routeQuerySchema = route?.request?.query;\n if (routeQuerySchema) {\n for (const key of extraQueryKeys) {\n if (key in query) {\n const zodSchema = routeQuerySchema[key];\n if (zodSchema && typeof (zodSchema as z.ZodTypeAny).safeParse === 'function') {\n const result = (zodSchema as z.ZodTypeAny).safeParse(query[key]);\n if (result.success) {\n sanitizedQuery[key] = result.data;\n } else {\n delete sanitizedQuery[key];\n }\n }\n }\n }\n }\n\n if (strictParams) {\n const allowedKeys = [...ALLOWED_QUERY_PARAM_KEYS, ...extraQueryKeys];\n return pick(allowedKeys, sanitizedQuery) as Record<string, unknown>;\n }\n\n return sanitizedQuery;\n };\n\n const sanitizeFilters: SanitizeFunc = (filters, schema: Model, { auth } = {}) => {\n if (!schema) {\n throw new Error('Missing schema in sanitizeFilters');\n }\n if (isArray(filters)) {\n return Promise.all(filters.map((filter) => sanitizeFilters(filter, schema, { auth })));\n }\n\n const transforms = [sanitizers.defaultSanitizeFilters({ schema, getModel })];\n\n if (auth) {\n transforms.push(\n traverseQueryFilters(visitors.removeRestrictedRelations(auth), { schema, getModel })\n );\n }\n\n return pipeAsync(...transforms)(filters);\n };\n\n const sanitizeSort: SanitizeFunc = (sort, schema: Model, { auth } = {}) => {\n if (!schema) {\n throw new Error('Missing schema in sanitizeSort');\n }\n const transforms = [sanitizers.defaultSanitizeSort({ schema, getModel })];\n\n if (auth) {\n transforms.push(\n traverseQuerySort(visitors.removeRestrictedRelations(auth), { schema, getModel })\n );\n }\n\n return pipeAsync(...transforms)(sort);\n };\n\n const sanitizeFields: SanitizeFunc = (fields, schema: Model) => {\n if (!schema) {\n throw new Error('Missing schema in sanitizeFields');\n }\n const transforms = [sanitizers.defaultSanitizeFields({ schema, getModel })];\n\n return pipeAsync(...transforms)(fields);\n };\n\n const sanitizePopulate: SanitizeFunc = (populate, schema: Model, { auth } = {}) => {\n if (!schema) {\n throw new Error('Missing schema in sanitizePopulate');\n }\n const transforms = [sanitizers.defaultSanitizePopulate({ schema, getModel })];\n\n if (auth) {\n transforms.push(\n traverseQueryPopulate(visitors.removeRestrictedRelations(auth), { schema, getModel })\n );\n }\n\n return pipeAsync(...transforms)(populate);\n };\n\n return {\n input: sanitizeInput,\n output: sanitizeOutput,\n query: sanitizeQuery,\n filters: sanitizeFilters,\n sort: sanitizeSort,\n fields: sanitizeFields,\n populate: sanitizePopulate,\n };\n};\n\nexport { createAPISanitizers, sanitizers, visitors };\n\nexport type APISanitiers = ReturnType<typeof createAPISanitizers>;\n"],"names":["createAPISanitizers","opts","getModel","sanitizeInput","data","schema","auth","strictParams","route","Error","isArray","Promise","all","map","entry","allowedExtraRootKeys","getExtraRootKeysFromRouteBody","nonWritableAttributes","getNonWritableAttributes","transforms","omit","constants","ID_ATTRIBUTE","DOC_ID_ATTRIBUTE","traverseEntity","visitors","push","sanitizers","input","forEach","sanitizer","routeBodySanitizeTransform","Array","obj","bodySchema","request","body","shape","key","Object","keys","zodSchema","safeParse","result","success","pipeAsync","sanitizeOutput","res","from","length","i","output","sanitizeQuery","query","filters","sort","fields","populate","sanitizedQuery","cloneDeep","validatePublicationFilterQueryParam","publicationFilter","assign","sanitizeFilters","hasSort","sanitizeSort","sanitizeFields","sanitizePopulate","extraQueryKeys","getExtraQueryKeysFromRoute","routeQuerySchema","allowedKeys","ALLOWED_QUERY_PARAM_KEYS","pick","filter","traverseQueryFilters","traverseQuerySort","traverseQueryPopulate"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@strapi/utils",
3
- "version": "5.51.1",
3
+ "version": "5.51.2",
4
4
  "description": "Shared utilities for the Strapi packages",
5
5
  "keywords": [
6
6
  "strapi",
@@ -65,13 +65,13 @@
65
65
  "@types/jest": "29.5.2",
66
66
  "@types/koa": "2.15.2",
67
67
  "@types/node": "20.19.41",
68
- "eslint-config-custom": "5.51.1",
68
+ "eslint-config-custom": "5.51.2",
69
69
  "jest": "29.6.0",
70
70
  "koa": "2.16.4",
71
71
  "koa-body": "6.0.1",
72
- "tsconfig": "5.51.1",
72
+ "tsconfig": "5.51.2",
73
73
  "vitest": "catalog:",
74
- "vitest-config": "5.51.1"
74
+ "vitest-config": "5.51.2"
75
75
  },
76
76
  "engines": {
77
77
  "node": ">=20.0.0 <=26.x.x",