@strapi/utils 5.51.0 → 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 +1 -1
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js.map +1 -1
- package/dist/errors.mjs.map +1 -1
- package/dist/install-id.js +1 -1
- package/dist/install-id.js.map +1 -1
- package/dist/install-id.mjs +1 -1
- package/dist/install-id.mjs.map +1 -1
- package/dist/pagination.d.ts +1 -1
- package/dist/pagination.d.ts.map +1 -1
- package/dist/pagination.js +12 -5
- package/dist/pagination.js.map +1 -1
- package/dist/pagination.mjs +12 -5
- package/dist/pagination.mjs.map +1 -1
- package/dist/parse-type.js +2 -2
- package/dist/parse-type.js.map +1 -1
- package/dist/parse-type.mjs +2 -2
- package/dist/parse-type.mjs.map +1 -1
- package/dist/policy.js +1 -1
- package/dist/policy.js.map +1 -1
- package/dist/policy.mjs +1 -1
- package/dist/policy.mjs.map +1 -1
- package/dist/route-serialization.d.ts +1 -1
- package/dist/route-serialization.d.ts.map +1 -1
- package/dist/route-serialization.js +1 -1
- package/dist/route-serialization.js.map +1 -1
- package/dist/route-serialization.mjs +1 -1
- package/dist/route-serialization.mjs.map +1 -1
- package/dist/sanitize/index.js +3 -1
- package/dist/sanitize/index.js.map +1 -1
- package/dist/sanitize/index.mjs +3 -1
- package/dist/sanitize/index.mjs.map +1 -1
- package/package.json +4 -4
package/dist/errors.d.ts
CHANGED
package/dist/errors.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAEA,OAAO,GAAG,MAAM,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,GAAG,MAAM,KAAK,CAAC;AAC3B,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"}
|
package/dist/errors.js.map
CHANGED
|
@@ -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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"}
|
package/dist/errors.mjs.map
CHANGED
|
@@ -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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"}
|
package/dist/install-id.js
CHANGED
|
@@ -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
|
|
15
|
+
} catch {
|
|
16
16
|
return crypto__default.default.randomUUID();
|
|
17
17
|
}
|
|
18
18
|
};
|
package/dist/install-id.js.map
CHANGED
|
@@ -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
|
|
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;;;;"}
|
package/dist/install-id.mjs
CHANGED
|
@@ -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
|
|
9
|
+
} catch {
|
|
10
10
|
return crypto.randomUUID();
|
|
11
11
|
}
|
|
12
12
|
};
|
package/dist/install-id.mjs.map
CHANGED
|
@@ -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
|
|
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;;;;"}
|
package/dist/pagination.d.ts
CHANGED
package/dist/pagination.d.ts.map
CHANGED
|
@@ -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;
|
|
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"}
|
package/dist/pagination.js
CHANGED
|
@@ -66,13 +66,20 @@ const withDefaultPagination = (args, { defaults = {}, maxLimit = -1 } = {})=>{
|
|
|
66
66
|
}
|
|
67
67
|
// Page / PageSize
|
|
68
68
|
if (usePagePagination) {
|
|
69
|
-
const
|
|
69
|
+
const pageArgs = fp.isNil(args.pageSize) ? fp.omit([
|
|
70
|
+
'pageSize'
|
|
71
|
+
], args) : {
|
|
70
72
|
...args,
|
|
71
|
-
pageSize: Math.max(1, args.pageSize
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
|
|
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
|
package/dist/pagination.js.map
CHANGED
|
@@ -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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"}
|
package/dist/pagination.mjs
CHANGED
|
@@ -64,13 +64,20 @@ const withDefaultPagination = (args, { defaults = {}, maxLimit = -1 } = {})=>{
|
|
|
64
64
|
}
|
|
65
65
|
// Page / PageSize
|
|
66
66
|
if (usePagePagination) {
|
|
67
|
-
const
|
|
67
|
+
const pageArgs = isNil(args.pageSize) ? omit([
|
|
68
|
+
'pageSize'
|
|
69
|
+
], args) : {
|
|
68
70
|
...args,
|
|
69
|
-
pageSize: Math.max(1, args.pageSize
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
|
|
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
|
package/dist/pagination.mjs.map
CHANGED
|
@@ -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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"}
|
package/dist/parse-type.js
CHANGED
|
@@ -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
|
|
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
|
|
74
|
+
} catch {
|
|
75
75
|
throw new Error(`Invalid format, expected a timestamp or an ISO date`);
|
|
76
76
|
}
|
|
77
77
|
};
|
package/dist/parse-type.js.map
CHANGED
|
@@ -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
|
|
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":"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"}
|
package/dist/parse-type.mjs
CHANGED
|
@@ -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
|
|
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
|
|
51
|
+
} catch {
|
|
52
52
|
throw new Error(`Invalid format, expected a timestamp or an ISO date`);
|
|
53
53
|
}
|
|
54
54
|
};
|
package/dist/parse-type.mjs.map
CHANGED
|
@@ -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
|
|
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
package/dist/policy.js.map
CHANGED
|
@@ -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
|
|
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
package/dist/policy.mjs.map
CHANGED
|
@@ -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
|
|
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,
|
|
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,
|
|
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,
|
|
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;;;;"}
|
package/dist/sanitize/index.js
CHANGED
|
@@ -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 =
|
|
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":";;;;;;;;;;;;;;;;;;;;AAkEA,MAAMA,sBAAsB,CAACC,IAAAA,GAAAA;IAC3B,MAAM,EAAEC,QAAQ,EAAE,GAAGD,IAAAA;AAErB,IAAA,MAAME,aAAAA,GAA8B,CAClCC,IAAAA,EACAC,MAAAA,EACA,EAAEC,IAAI,EAAEC,YAAAA,GAAe,KAAK,EAAEC,KAAK,EAAE,GAAG,EAAE,GAAA;AAE1C,QAAA,IAAI,CAACH,MAAAA,EAAQ;AACX,YAAA,MAAM,IAAII,KAAAA,CAAM,iCAAA,CAAA;AAClB,QAAA;AACA,QAAA,IAAIC,WAAQN,IAAAA,CAAAA,EAAO;YACjB,OAAOO,OAAAA,CAAQC,GAAG,CAChBR,IAAAA,CAAKS,GAAG,CAAC,CAACC,KAAAA,GAAUX,aAAAA,CAAcW,KAAAA,EAAOT,MAAAA,EAAQ;AAAEC,oBAAAA,IAAAA;AAAMC,oBAAAA,YAAAA;AAAcC,oBAAAA;AAAM,iBAAA,CAAA,CAAA,CAAA;AAEjF,QAAA;AAEA,QAAA,MAAMO,uBAAuBC,mDAAAA,CAA8BR,KAAAA,CAAAA;AAE3D,QAAA,MAAMS,wBAAwBC,qCAAAA,CAAyBb,MAAAA,CAAAA;AAEvD,QAAA,MAAMc,UAAAA,GAAa;;AAEjBC,YAAAA,OAAAA,CAAKC,uBAAUC,YAAY,CAAA;AAC3BF,YAAAA,OAAAA,CAAKC,uBAAUE,gBAAgB,CAAA;;YAE/BC,cAAAA,CAAeC,sBAA+B,CAACR,qBAAAA,CAAAA,EAAwB;AAAEZ,gBAAAA,MAAAA;AAAQH,gBAAAA;AAAS,aAAA;AAC3F,SAAA;AAED,QAAA,IAAIK,YAAAA,EAAc;;AAEhBY,YAAAA,UAAAA,CAAWO,IAAI,CACbF,cAAAA,CAAeC,wBAAiC,EAAE;AAChDpB,gBAAAA,MAAAA;AACAH,gBAAAA,QAAAA;AACAa,gBAAAA;AACF,aAAA,CAAA,CAAA;AAEJ,QAAA;AAEA,QAAA,IAAIT,IAAAA,EAAM;;AAERa,YAAAA,UAAAA,CAAWO,IAAI,CACbF,cAAAA,CAAeC,yBAAkC,CAACnB,IAAAA,CAAAA,EAAO;AAAED,gBAAAA,MAAAA;AAAQH,gBAAAA;AAAS,aAAA,CAAA,CAAA;AAEhF,QAAA;;QAGAD,IAAAA,EAAM0B,UAAAA,EAAYC,OAAOC,OAAAA,CAAQ,CAACC,YAAyBX,UAAAA,CAAWO,IAAI,CAACI,SAAAA,CAAUzB,MAAAA,CAAAA,CAAAA,CAAAA;AAErF;;;;;;;;;;QAWA,MAAM0B,6BAA6B,OAAO3B,IAAAA,GAAAA;YACxC,IAAI,CAACA,QAAQ,OAAOA,IAAAA,KAAS,YAAY4B,KAAAA,CAAMtB,OAAO,CAACN,IAAAA,CAAAA,EAAO,OAAOA,IAAAA;AACrE,YAAA,MAAM6B,GAAAA,GAAM7B,IAAAA;AACZ,YAAA,MAAM8B,UAAAA,GAAa1B,KAAAA,EAAO2B,OAAAA,EAASC,IAAAA,GAAO,kBAAA,CAAmB;AAC7D,YAAA,IAAIF,UAAAA,IAAc,OAAOA,UAAAA,KAAe,QAAA,IAAY,WAAWA,UAAAA,EAAY;gBACzE,MAAMG,KAAAA,GAAQ,UAACH,CAAuDG,KAAK;AAC3E,gBAAA,KAAK,MAAMC,GAAAA,IAAOC,MAAAA,CAAOC,IAAI,CAACH,KAAAA,CAAAA,CAAQ;AACpC,oBAAA,IAAIC,QAAQ,MAAA,IAAU,EAAEA,GAAAA,IAAOL,GAAE,CAAA,EAAI;oBACrC,MAAMQ,SAAAA,GAAYJ,KAAK,CAACC,GAAAA,CAAI;AAC5B,oBAAA,IAAIG,aAAa,OAAQA,SAAAA,CAA2BC,SAAS,KAAK,UAAA,EAAY;AAC5E,wBAAA,MAAMC,SAAS,SAACF,CAA2BC,SAAS,CAACT,GAAG,CAACK,GAAAA,CAAI,CAAA;wBAC7D,IAAIK,MAAAA,CAAOC,OAAO,EAAE;AAClBX,4BAAAA,GAAG,CAACK,GAAAA,CAAI,GAAGK,MAAAA,CAAOvC,IAAI;wBACxB,CAAA,MAAO;4BACL,OAAO6B,GAAG,CAACK,GAAAA,CAAI;AACjB,wBAAA;AACF,oBAAA;AACF,gBAAA;AACF,YAAA;YACA,OAAOlC,IAAAA;AACT,QAAA,CAAA;AACCe,QAAAA,UAAAA,CAA2DO,IAAI,CAACK,0BAAAA,CAAAA;AAEjE,QAAA,OAAOc,cAAa1B,UAAAA,CAAAA,CAAYf,IAAAA,CAAAA;AAClC,IAAA,CAAA;IAEA,MAAM0C,cAAAA,GAA+B,OAAO1C,IAAAA,EAAMC,MAAAA,EAAe,EAAEC,IAAI,EAAE,GAAG,EAAE,GAAA;AAC5E,QAAA,IAAI,CAACD,MAAAA,EAAQ;AACX,YAAA,MAAM,IAAII,KAAAA,CAAM,kCAAA,CAAA;AAClB,QAAA;AACA,QAAA,IAAIC,WAAQN,IAAAA,CAAAA,EAAO;YACjB,MAAM2C,GAAAA,GAAiBf,KAAAA,CAAMgB,IAAI,CAAC;AAAEC,gBAAAA,MAAAA,EAAQ7C,KAAK6C;AAAO,aAAA,CAAA;YACxD,IAAK,IAAIC,IAAI,CAAA,EAAGA,CAAAA,GAAI9C,KAAK6C,MAAM,EAAEC,KAAK,CAAA,CAAG;gBACvCH,GAAG,CAACG,EAAE,GAAG,MAAMJ,eAAe1C,IAAI,CAAC8C,CAAAA,CAAE,EAAE7C,MAAAA,EAAQ;AAAEC,oBAAAA;AAAK,iBAAA,CAAA;AACxD,YAAA;YACA,OAAOyC,GAAAA;AACT,QAAA;AAEA,QAAA,MAAM5B,UAAAA,GAAa;YACjB,CAACf,IAAAA,GAAeuB,gCAAgC,CAAC;AAAEtB,oBAAAA,MAAAA;AAAQH,oBAAAA;iBAAS,EAAGE,IAAAA;AACxE,SAAA;AAED,QAAA,IAAIE,IAAAA,EAAM;AACRa,YAAAA,UAAAA,CAAWO,IAAI,CACbF,cAAAA,CAAeC,yBAAkC,CAACnB,IAAAA,CAAAA,EAAO;AAAED,gBAAAA,MAAAA;AAAQH,gBAAAA;AAAS,aAAA,CAAA,CAAA;AAEhF,QAAA;;QAGAD,IAAAA,EAAM0B,UAAAA,EAAYwB,QAAQtB,OAAAA,CAAQ,CAACC,YAAyBX,UAAAA,CAAWO,IAAI,CAACI,SAAAA,CAAUzB,MAAAA,CAAAA,CAAAA,CAAAA;AAEtF,QAAA,OAAOwC,cAAa1B,UAAAA,CAAAA,CAAYf,IAAAA,CAAAA;AAClC,IAAA,CAAA;AAEA,IAAA,MAAMgD,aAAAA,GAAgB,OACpBC,KAAAA,EACAhD,MAAAA,EACA,EAAEC,IAAI,EAAEC,YAAAA,GAAe,KAAK,EAAEC,KAAK,EAAW,GAAG,EAAE,GAAA;AAEnD,QAAA,IAAI,CAACH,MAAAA,EAAQ;AACX,YAAA,MAAM,IAAII,KAAAA,CAAM,iCAAA,CAAA;AAClB,QAAA;QACA,MAAM,EAAE6C,OAAO,EAAEC,IAAI,EAAEC,MAAM,EAAEC,QAAQ,EAAE,GAAGJ,KAAAA;AAE5C,QAAA,MAAMK,iBAAiBC,YAAAA,CAAUN,KAAAA,CAAAA;AAEjC,QAAA,IAAI,uBAAuBK,cAAAA,EAAgB;AACzCE,YAAAA,qDAAAA,CAAoCF,eAAeG,iBAAiB,CAAA;AACtE,QAAA;AAEA,QAAA,IAAIP,OAAAA,EAAS;YACXf,MAAAA,CAAOuB,MAAM,CAACJ,cAAAA,EAAgB;gBAAEJ,OAAAA,EAAS,MAAMS,eAAAA,CAAgBT,OAAAA,EAASjD,MAAAA,EAAQ;AAAEC,oBAAAA;AAAK,iBAAA;AAAG,aAAA,CAAA;AAC5F,QAAA;AAEA,QAAA,IAAI0D,kBAAQT,IAAAA,CAAAA,EAAO;YACjBhB,MAAAA,CAAOuB,MAAM,CAACJ,cAAAA,EAAgB;gBAAEH,IAAAA,EAAM,MAAMU,YAAAA,CAAaV,IAAAA,EAAMlD,MAAAA,EAAQ;AAAEC,oBAAAA;AAAK,iBAAA;AAAG,aAAA,CAAA;QACnF,CAAA,MAAO,IAAI,UAAUoD,cAAAA,EAAgB;AACnC,YAAA,OAAOA,eAAeH,IAAI;AAC5B,QAAA;AAEA,QAAA,IAAIC,MAAAA,EAAQ;YACVjB,MAAAA,CAAOuB,MAAM,CAACJ,cAAAA,EAAgB;gBAAEF,MAAAA,EAAQ,MAAMU,eAAeV,MAAAA,EAAQnD,MAAAA;AAAQ,aAAA,CAAA;AAC/E,QAAA;AAEA,QAAA,IAAIoD,QAAAA,EAAU;YACZlB,MAAAA,CAAOuB,MAAM,CAACJ,cAAAA,EAAgB;gBAAED,QAAAA,EAAU,MAAMU,iBAAiBV,QAAAA,EAAUpD,MAAAA;AAAQ,aAAA,CAAA;AACrF,QAAA;AAEA,QAAA,MAAM+D,iBAAiBC,gDAAAA,CAA2B7D,KAAAA,CAAAA;QAClD,MAAM8D,gBAAAA,GAAmB9D,OAAO2B,OAAAA,EAASkB,KAAAA;AACzC,QAAA,IAAIiB,gBAAAA,EAAkB;YACpB,KAAK,MAAMhC,OAAO8B,cAAAA,CAAgB;AAChC,gBAAA,IAAI9B,OAAOe,KAAAA,EAAO;oBAChB,MAAMZ,SAAAA,GAAY6B,gBAAgB,CAAChC,GAAAA,CAAI;AACvC,oBAAA,IAAIG,aAAa,OAAQA,SAAAA,CAA2BC,SAAS,KAAK,UAAA,EAAY;AAC5E,wBAAA,MAAMC,SAAS,SAACF,CAA2BC,SAAS,CAACW,KAAK,CAACf,GAAAA,CAAI,CAAA;wBAC/D,IAAIK,MAAAA,CAAOC,OAAO,EAAE;AAClBc,4BAAAA,cAAc,CAACpB,GAAAA,CAAI,GAAGK,MAAAA,CAAOvC,IAAI;wBACnC,CAAA,MAAO;4BACL,OAAOsD,cAAc,CAACpB,GAAAA,CAAI;AAC5B,wBAAA;AACF,oBAAA;AACF,gBAAA;AACF,YAAA;AACF,QAAA;AAEA,QAAA,IAAI/B,YAAAA,EAAc;AAChB,YAAA,MAAMgE,WAAAA,GAAc;AAAIC,gBAAAA,GAAAA,4CAAAA;AAA6BJ,gBAAAA,GAAAA;AAAe,aAAA;AACpE,YAAA,OAAOK,QAAKF,WAAAA,EAAab,cAAAA,CAAAA;AAC3B,QAAA;QAEA,OAAOA,cAAAA;AACT,IAAA,CAAA;IAEA,MAAMK,eAAAA,GAAgC,CAACT,OAAAA,EAASjD,MAAAA,EAAe,EAAEC,IAAI,EAAE,GAAG,EAAE,GAAA;AAC1E,QAAA,IAAI,CAACD,MAAAA,EAAQ;AACX,YAAA,MAAM,IAAII,KAAAA,CAAM,mCAAA,CAAA;AAClB,QAAA;AACA,QAAA,IAAIC,WAAQ4C,OAAAA,CAAAA,EAAU;YACpB,OAAO3C,OAAAA,CAAQC,GAAG,CAAC0C,OAAAA,CAAQzC,GAAG,CAAC,CAAC6D,MAAAA,GAAWX,eAAAA,CAAgBW,MAAAA,EAAQrE,MAAAA,EAAQ;AAAEC,oBAAAA;AAAK,iBAAA,CAAA,CAAA,CAAA;AACpF,QAAA;AAEA,QAAA,MAAMa,UAAAA,GAAa;AAACQ,YAAAA,iCAAiC,CAAC;AAAEtB,gBAAAA,MAAAA;AAAQH,gBAAAA;AAAS,aAAA;AAAG,SAAA;AAE5E,QAAA,IAAII,IAAAA,EAAM;AACRa,YAAAA,UAAAA,CAAWO,IAAI,CACbiD,YAAAA,CAAqBlD,yBAAkC,CAACnB,IAAAA,CAAAA,EAAO;AAAED,gBAAAA,MAAAA;AAAQH,gBAAAA;AAAS,aAAA,CAAA,CAAA;AAEtF,QAAA;AAEA,QAAA,OAAO2C,cAAa1B,UAAAA,CAAAA,CAAYmC,OAAAA,CAAAA;AAClC,IAAA,CAAA;IAEA,MAAMW,YAAAA,GAA6B,CAACV,IAAAA,EAAMlD,MAAAA,EAAe,EAAEC,IAAI,EAAE,GAAG,EAAE,GAAA;AACpE,QAAA,IAAI,CAACD,MAAAA,EAAQ;AACX,YAAA,MAAM,IAAII,KAAAA,CAAM,gCAAA,CAAA;AAClB,QAAA;AACA,QAAA,MAAMU,UAAAA,GAAa;AAACQ,YAAAA,8BAA8B,CAAC;AAAEtB,gBAAAA,MAAAA;AAAQH,gBAAAA;AAAS,aAAA;AAAG,SAAA;AAEzE,QAAA,IAAII,IAAAA,EAAM;AACRa,YAAAA,UAAAA,CAAWO,IAAI,CACbkD,SAAAA,CAAkBnD,yBAAkC,CAACnB,IAAAA,CAAAA,EAAO;AAAED,gBAAAA,MAAAA;AAAQH,gBAAAA;AAAS,aAAA,CAAA,CAAA;AAEnF,QAAA;AAEA,QAAA,OAAO2C,cAAa1B,UAAAA,CAAAA,CAAYoC,IAAAA,CAAAA;AAClC,IAAA,CAAA;IAEA,MAAMW,cAAAA,GAA+B,CAACV,MAAAA,EAAQnD,MAAAA,GAAAA;AAC5C,QAAA,IAAI,CAACA,MAAAA,EAAQ;AACX,YAAA,MAAM,IAAII,KAAAA,CAAM,kCAAA,CAAA;AAClB,QAAA;AACA,QAAA,MAAMU,UAAAA,GAAa;AAACQ,YAAAA,gCAAgC,CAAC;AAAEtB,gBAAAA,MAAAA;AAAQH,gBAAAA;AAAS,aAAA;AAAG,SAAA;AAE3E,QAAA,OAAO2C,cAAa1B,UAAAA,CAAAA,CAAYqC,MAAAA,CAAAA;AAClC,IAAA,CAAA;IAEA,MAAMW,gBAAAA,GAAiC,CAACV,QAAAA,EAAUpD,MAAAA,EAAe,EAAEC,IAAI,EAAE,GAAG,EAAE,GAAA;AAC5E,QAAA,IAAI,CAACD,MAAAA,EAAQ;AACX,YAAA,MAAM,IAAII,KAAAA,CAAM,oCAAA,CAAA;AAClB,QAAA;AACA,QAAA,MAAMU,UAAAA,GAAa;AAACQ,YAAAA,kCAAkC,CAAC;AAAEtB,gBAAAA,MAAAA;AAAQH,gBAAAA;AAAS,aAAA;AAAG,SAAA;AAE7E,QAAA,IAAII,IAAAA,EAAM;AACRa,YAAAA,UAAAA,CAAWO,IAAI,CACbmD,aAAAA,CAAsBpD,yBAAkC,CAACnB,IAAAA,CAAAA,EAAO;AAAED,gBAAAA,MAAAA;AAAQH,gBAAAA;AAAS,aAAA,CAAA,CAAA;AAEvF,QAAA;AAEA,QAAA,OAAO2C,cAAa1B,UAAAA,CAAAA,CAAYsC,QAAAA,CAAAA;AAClC,IAAA,CAAA;IAEA,OAAO;QACL7B,KAAAA,EAAOzB,aAAAA;QACPgD,MAAAA,EAAQL,cAAAA;QACRO,KAAAA,EAAOD,aAAAA;QACPE,OAAAA,EAASS,eAAAA;QACTR,IAAAA,EAAMU,YAAAA;QACNT,MAAAA,EAAQU,cAAAA;QACRT,QAAAA,EAAUU;AACZ,KAAA;AACF;;;;;;"}
|
package/dist/sanitize/index.mjs
CHANGED
|
@@ -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 =
|
|
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.
|
|
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.
|
|
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.
|
|
72
|
+
"tsconfig": "5.51.2",
|
|
73
73
|
"vitest": "catalog:",
|
|
74
|
-
"vitest-config": "5.51.
|
|
74
|
+
"vitest-config": "5.51.2"
|
|
75
75
|
},
|
|
76
76
|
"engines": {
|
|
77
77
|
"node": ">=20.0.0 <=26.x.x",
|