@warlock.js/seal 5.24.0 → 5.25.0
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/CHANGELOG.md +11 -0
- package/LICENSE +21 -21
- package/cjs/index.cjs +10 -5
- package/cjs/index.cjs.map +1 -1
- package/cjs/{object-DPPttDAF.cjs → object-BuKApaax.cjs} +3 -3
- package/cjs/object-BuKApaax.cjs.map +1 -0
- package/cjs/object.cjs +2 -2
- package/cjs/{required-methods-DJTm7yNP.cjs → required-methods-BOVNRtci.cjs} +12 -2
- package/cjs/required-methods-BOVNRtci.cjs.map +1 -0
- package/cjs/{string-C_pAtZPC.cjs → string-DpDpgefH.cjs} +2 -2
- package/cjs/string-DpDpgefH.cjs.map +1 -0
- package/cjs/string.cjs +2 -2
- package/esm/config.d.mts +0 -1
- package/esm/config.d.mts.map +1 -1
- package/esm/config.mjs.map +1 -1
- package/esm/factory/validate.mjs.map +1 -1
- package/esm/factory/validators.d.mts.map +1 -1
- package/esm/factory/validators.mjs +1 -1
- package/esm/factory/validators.mjs.map +1 -1
- package/esm/helpers/date-helpers.mjs.map +1 -1
- package/esm/helpers/get-field-value.d.mts +0 -1
- package/esm/helpers/get-field-value.d.mts.map +1 -1
- package/esm/helpers/get-field-value.mjs.map +1 -1
- package/esm/helpers/index.d.mts +5 -0
- package/esm/helpers/path-helpers.mjs.map +1 -1
- package/esm/helpers/validation-helpers.d.mts +0 -1
- package/esm/helpers/validation-helpers.d.mts.map +1 -1
- package/esm/mutators/array-mutators.d.mts +0 -1
- package/esm/mutators/array-mutators.d.mts.map +1 -1
- package/esm/mutators/array-mutators.mjs.map +1 -1
- package/esm/mutators/boolean-mutators.d.mts +0 -1
- package/esm/mutators/boolean-mutators.d.mts.map +1 -1
- package/esm/mutators/date-mutators.d.mts +0 -1
- package/esm/mutators/date-mutators.d.mts.map +1 -1
- package/esm/mutators/date-mutators.mjs.map +1 -1
- package/esm/mutators/index.d.mts +7 -0
- package/esm/mutators/number-mutators.d.mts +0 -1
- package/esm/mutators/number-mutators.d.mts.map +1 -1
- package/esm/mutators/number-mutators.mjs.map +1 -1
- package/esm/mutators/object-mutators.d.mts +0 -1
- package/esm/mutators/object-mutators.d.mts.map +1 -1
- package/esm/mutators/object-mutators.mjs.map +1 -1
- package/esm/mutators/scalar-mutators.d.mts +0 -1
- package/esm/mutators/scalar-mutators.d.mts.map +1 -1
- package/esm/mutators/scalar-mutators.mjs.map +1 -1
- package/esm/mutators/string-mutators.d.mts +0 -1
- package/esm/mutators/string-mutators.d.mts.map +1 -1
- package/esm/mutators/string-mutators.mjs.map +1 -1
- package/esm/plugins/plugin-system.mjs.map +1 -1
- package/esm/rules/array/array-rules.d.mts +0 -1
- package/esm/rules/array/array-rules.d.mts.map +1 -1
- package/esm/rules/array/array-rules.mjs.map +1 -1
- package/esm/rules/array/index.d.mts +1 -0
- package/esm/rules/color/color-rules.d.mts +0 -1
- package/esm/rules/color/color-rules.d.mts.map +1 -1
- package/esm/rules/color/color-rules.mjs.map +1 -1
- package/esm/rules/color/index.d.mts +1 -0
- package/esm/rules/common/enum.d.mts +0 -1
- package/esm/rules/common/enum.d.mts.map +1 -1
- package/esm/rules/common/enum.mjs.map +1 -1
- package/esm/rules/common/equals-field-rules.d.mts +0 -1
- package/esm/rules/common/equals-field-rules.d.mts.map +1 -1
- package/esm/rules/common/equals-field-rules.mjs.map +1 -1
- package/esm/rules/common/index.d.mts +6 -0
- package/esm/rules/common/instanceof.d.mts +0 -1
- package/esm/rules/common/instanceof.d.mts.map +1 -1
- package/esm/rules/common/literal.d.mts +0 -1
- package/esm/rules/common/literal.d.mts.map +1 -1
- package/esm/rules/common/type-rules.d.mts +0 -1
- package/esm/rules/common/type-rules.d.mts.map +1 -1
- package/esm/rules/common/type-rules.mjs.map +1 -1
- package/esm/rules/common/unknown-key.d.mts +0 -1
- package/esm/rules/common/unknown-key.d.mts.map +1 -1
- package/esm/rules/conditional/forbidden-if-rules.d.mts +0 -1
- package/esm/rules/conditional/forbidden-if-rules.d.mts.map +1 -1
- package/esm/rules/conditional/forbidden-if-rules.mjs.map +1 -1
- package/esm/rules/conditional/index.d.mts +10 -0
- package/esm/rules/conditional/present-if-rules.d.mts +0 -1
- package/esm/rules/conditional/present-if-rules.d.mts.map +1 -1
- package/esm/rules/conditional/present-if-rules.mjs.map +1 -1
- package/esm/rules/conditional/present-unless-rules.d.mts +0 -1
- package/esm/rules/conditional/present-unless-rules.d.mts.map +1 -1
- package/esm/rules/conditional/present-unless-rules.mjs.map +1 -1
- package/esm/rules/conditional/present-with-rules.d.mts +0 -1
- package/esm/rules/conditional/present-with-rules.d.mts.map +1 -1
- package/esm/rules/conditional/present-with-rules.mjs.map +1 -1
- package/esm/rules/conditional/present-without-rules.d.mts +0 -1
- package/esm/rules/conditional/present-without-rules.d.mts.map +1 -1
- package/esm/rules/conditional/present-without-rules.mjs.map +1 -1
- package/esm/rules/conditional/required-if-rules.d.mts +0 -1
- package/esm/rules/conditional/required-if-rules.d.mts.map +1 -1
- package/esm/rules/conditional/required-if-rules.mjs.map +1 -1
- package/esm/rules/conditional/required-unless-rules.d.mts +0 -1
- package/esm/rules/conditional/required-unless-rules.d.mts.map +1 -1
- package/esm/rules/conditional/required-unless-rules.mjs.map +1 -1
- package/esm/rules/conditional/required-when-rule.d.mts +0 -1
- package/esm/rules/conditional/required-when-rule.d.mts.map +1 -1
- package/esm/rules/conditional/required-with-rules.d.mts +0 -1
- package/esm/rules/conditional/required-with-rules.d.mts.map +1 -1
- package/esm/rules/conditional/required-with-rules.mjs.map +1 -1
- package/esm/rules/conditional/required-without-rules.d.mts +0 -1
- package/esm/rules/conditional/required-without-rules.d.mts.map +1 -1
- package/esm/rules/conditional/required-without-rules.mjs.map +1 -1
- package/esm/rules/core/equal.d.mts +0 -1
- package/esm/rules/core/equal.d.mts.map +1 -1
- package/esm/rules/core/equal.mjs.map +1 -1
- package/esm/rules/core/forbidden.d.mts +0 -1
- package/esm/rules/core/forbidden.d.mts.map +1 -1
- package/esm/rules/core/forbidden.mjs.map +1 -1
- package/esm/rules/core/index.d.mts +5 -0
- package/esm/rules/core/required.d.mts +0 -1
- package/esm/rules/core/required.d.mts.map +1 -1
- package/esm/rules/core/required.mjs.map +1 -1
- package/esm/rules/core/union.d.mts.map +1 -1
- package/esm/rules/core/union.mjs.map +1 -1
- package/esm/rules/core/when.d.mts +0 -1
- package/esm/rules/core/when.d.mts.map +1 -1
- package/esm/rules/core/when.mjs.map +1 -1
- package/esm/rules/date/date-comparison-rules.d.mts +0 -1
- package/esm/rules/date/date-comparison-rules.d.mts.map +1 -1
- package/esm/rules/date/date-comparison-rules.mjs.map +1 -1
- package/esm/rules/date/date-day-rules.d.mts +0 -1
- package/esm/rules/date/date-day-rules.d.mts.map +1 -1
- package/esm/rules/date/date-day-rules.mjs.map +1 -1
- package/esm/rules/date/date-field-comparison-rules.d.mts +0 -1
- package/esm/rules/date/date-field-comparison-rules.d.mts.map +1 -1
- package/esm/rules/date/date-field-comparison-rules.mjs.map +1 -1
- package/esm/rules/date/date-period-rules.d.mts +0 -1
- package/esm/rules/date/date-period-rules.d.mts.map +1 -1
- package/esm/rules/date/date-period-rules.mjs.map +1 -1
- package/esm/rules/date/date-relative-rules.d.mts +0 -1
- package/esm/rules/date/date-relative-rules.d.mts.map +1 -1
- package/esm/rules/date/date-relative-rules.mjs.map +1 -1
- package/esm/rules/date/date-special-rules.d.mts +0 -1
- package/esm/rules/date/date-special-rules.d.mts.map +1 -1
- package/esm/rules/date/date-special-rules.mjs.map +1 -1
- package/esm/rules/date/date.d.mts +0 -1
- package/esm/rules/date/date.d.mts.map +1 -1
- package/esm/rules/date/date.mjs.map +1 -1
- package/esm/rules/date/index.d.mts +7 -0
- package/esm/rules/file/dimensions.d.mts +0 -1
- package/esm/rules/file/dimensions.d.mts.map +1 -1
- package/esm/rules/file/dimensions.mjs.map +1 -1
- package/esm/rules/file/file-size.d.mts +0 -1
- package/esm/rules/file/file-size.d.mts.map +1 -1
- package/esm/rules/file/file-size.mjs.map +1 -1
- package/esm/rules/file/index.d.mts +2 -0
- package/esm/rules/index.d.mts +45 -0
- package/esm/rules/length/index.d.mts +1 -0
- package/esm/rules/length/length-rules.d.mts +0 -1
- package/esm/rules/length/length-rules.d.mts.map +1 -1
- package/esm/rules/length/length-rules.mjs.map +1 -1
- package/esm/rules/number/index.d.mts +1 -0
- package/esm/rules/number/number-rules.d.mts +0 -1
- package/esm/rules/number/number-rules.d.mts.map +1 -1
- package/esm/rules/number/number-rules.mjs.map +1 -1
- package/esm/rules/scalar/accepted-rule.mjs.map +1 -1
- package/esm/rules/scalar/declined-rule.mjs.map +1 -1
- package/esm/rules/string/alpha.d.mts +0 -1
- package/esm/rules/string/alpha.d.mts.map +1 -1
- package/esm/rules/string/alpha.mjs.map +1 -1
- package/esm/rules/string/credit-card.d.mts +0 -1
- package/esm/rules/string/credit-card.d.mts.map +1 -1
- package/esm/rules/string/credit-card.mjs.map +1 -1
- package/esm/rules/string/email.d.mts +0 -1
- package/esm/rules/string/email.d.mts.map +1 -1
- package/esm/rules/string/email.mjs.map +1 -1
- package/esm/rules/string/id-formats.d.mts +0 -1
- package/esm/rules/string/id-formats.d.mts.map +1 -1
- package/esm/rules/string/index.d.mts +11 -0
- package/esm/rules/string/ip.d.mts +0 -1
- package/esm/rules/string/ip.d.mts.map +1 -1
- package/esm/rules/string/matches.d.mts +0 -1
- package/esm/rules/string/matches.d.mts.map +1 -1
- package/esm/rules/string/matches.mjs.map +1 -1
- package/esm/rules/string/pattern.d.mts +0 -1
- package/esm/rules/string/pattern.d.mts.map +1 -1
- package/esm/rules/string/pattern.mjs.map +1 -1
- package/esm/rules/string/string-comparison.d.mts +0 -1
- package/esm/rules/string/string-comparison.d.mts.map +1 -1
- package/esm/rules/string/string-comparison.mjs.map +1 -1
- package/esm/rules/string/strong-password-rule.d.mts +0 -1
- package/esm/rules/string/strong-password-rule.d.mts.map +1 -1
- package/esm/rules/string/strong-password-rule.mjs.map +1 -1
- package/esm/rules/string/url.d.mts +0 -1
- package/esm/rules/string/url.d.mts.map +1 -1
- package/esm/rules/string/url.mjs.map +1 -1
- package/esm/rules/string/without-whitespace.d.mts +0 -1
- package/esm/rules/string/without-whitespace.d.mts.map +1 -1
- package/esm/rules/string/without-whitespace.mjs.map +1 -1
- package/esm/standard-schema/index.d.mts +3 -0
- package/esm/standard-schema/map-result.d.mts +0 -1
- package/esm/standard-schema/map-result.d.mts.map +1 -1
- package/esm/types/date-types.mjs.map +1 -1
- package/esm/types/index.d.mts +10 -0
- package/esm/validators/any-validator.mjs.map +1 -1
- package/esm/validators/array-validator.d.mts.map +1 -1
- package/esm/validators/array-validator.mjs +1 -0
- package/esm/validators/array-validator.mjs.map +1 -1
- package/esm/validators/base-validator.d.mts +2 -1
- package/esm/validators/base-validator.d.mts.map +1 -1
- package/esm/validators/base-validator.mjs +11 -1
- package/esm/validators/base-validator.mjs.map +1 -1
- package/esm/validators/boolean-validator.d.mts.map +1 -1
- package/esm/validators/boolean-validator.mjs +1 -0
- package/esm/validators/boolean-validator.mjs.map +1 -1
- package/esm/validators/computed-validator.d.mts.map +1 -1
- package/esm/validators/date-validator.d.mts +0 -1
- package/esm/validators/date-validator.d.mts.map +1 -1
- package/esm/validators/date-validator.mjs +1 -0
- package/esm/validators/date-validator.mjs.map +1 -1
- package/esm/validators/discriminated-union-validator.d.mts.map +1 -1
- package/esm/validators/float-validator.mjs.map +1 -1
- package/esm/validators/int-validator.mjs.map +1 -1
- package/esm/validators/lazy-validator.d.mts.map +1 -1
- package/esm/validators/literal-validator.d.mts.map +1 -1
- package/esm/validators/literal-validator.mjs +1 -3
- package/esm/validators/literal-validator.mjs.map +1 -1
- package/esm/validators/managed-validator.d.mts.map +1 -1
- package/esm/validators/methods/equality-conditional-methods.d.mts +0 -1
- package/esm/validators/methods/equality-conditional-methods.d.mts.map +1 -1
- package/esm/validators/methods/equality-conditional-methods.mjs.map +1 -1
- package/esm/validators/methods/forbidden-methods.mjs.map +1 -1
- package/esm/validators/methods/present-methods.mjs.map +1 -1
- package/esm/validators/methods/required-methods.d.mts +0 -1
- package/esm/validators/methods/required-methods.d.mts.map +1 -1
- package/esm/validators/methods/required-methods.mjs.map +1 -1
- package/esm/validators/number-validator.d.mts.map +1 -1
- package/esm/validators/number-validator.mjs +1 -0
- package/esm/validators/number-validator.mjs.map +1 -1
- package/esm/validators/numeric-validator.mjs.map +1 -1
- package/esm/validators/object-validator.d.mts.map +1 -1
- package/esm/validators/object-validator.mjs +1 -1
- package/esm/validators/object-validator.mjs.map +1 -1
- package/esm/validators/record-validator.d.mts.map +1 -1
- package/esm/validators/record-validator.mjs.map +1 -1
- package/esm/validators/scalar-validator.d.mts.map +1 -1
- package/esm/validators/scalar-validator.mjs +1 -0
- package/esm/validators/scalar-validator.mjs.map +1 -1
- package/esm/validators/string-validator.mjs.map +1 -1
- package/esm/validators/tuple-validator.d.mts.map +1 -1
- package/esm/validators/tuple-validator.mjs.map +1 -1
- package/esm/validators/union-validator.mjs.map +1 -1
- package/llms-full.txt +1165 -1165
- package/package.json +1 -1
- package/skills/bridge-standard-schema/SKILL.md +138 -138
- package/skills/define-structural-shape/SKILL.md +138 -138
- package/skills/extend-seal-with-plugins/SKILL.md +178 -178
- package/skills/generate-json-schema/SKILL.md +143 -143
- package/skills/handle-seal-errors/SKILL.md +148 -148
- package/skills/pick-seal-primitive/SKILL.md +149 -149
- package/cjs/object-DPPttDAF.cjs.map +0 -1
- package/cjs/required-methods-DJTm7yNP.cjs.map +0 -1
- package/cjs/string-C_pAtZPC.cjs.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"date-period-rules.mjs","names":[],"sources":["../../../../../../../../seal/src/rules/date/date-period-rules.ts"],"sourcesContent":["import { get } from \"@mongez/reinforcements\";\r\nimport { invalidRule, VALID_RULE } from \"../../helpers\";\r\nimport type { SchemaRule } from \"../../types\";\r\n\r\nconst MONTHS = {\r\n 1: \"january\",\r\n 2: \"february\",\r\n 3: \"march\",\r\n 4: \"april\",\r\n 5: \"may\",\r\n 6: \"june\",\r\n 7: \"july\",\r\n 8: \"august\",\r\n 9: \"september\",\r\n 10: \"october\",\r\n 11: \"november\",\r\n 12: \"december\",\r\n};\r\n\r\nexport type Month = keyof typeof MONTHS;\r\n\r\n/**\r\n * Month rule - date must be in specific month (1-12)\r\n */\r\nexport const monthRule: SchemaRule<{ month: Month }> = {\r\n name: \"month\",\r\n defaultErrorMessage: \"The :input must be in month :month\",\r\n async validate(value: Date, context) {\r\n const inputDate = new Date(value);\r\n const month = inputDate.getMonth() + 1; // getMonth() returns 0-11\r\n\r\n if (month === this.context.options.month) {\r\n return VALID_RULE;\r\n }\r\n\r\n this.context.translatableParams.month =\r\n MONTHS[this.context.options.month as keyof typeof MONTHS];\r\n return invalidRule(this, context);\r\n },\r\n};\r\n\r\n/**\r\n * Year rule - date must be in specific year\r\n */\r\nexport const yearRule: SchemaRule<{ year: number }> = {\r\n name: \"year\",\r\n defaultErrorMessage: \"The :input must be in year :year\",\r\n async validate(value: Date, context) {\r\n const inputDate = new Date(value);\r\n const year = inputDate.getFullYear();\r\n\r\n if (year === this.context.options.year) {\r\n return VALID_RULE;\r\n }\r\n\r\n this.context.translationParams.year = this.context.options.year;\r\n return invalidRule(this, context);\r\n },\r\n};\r\n\r\n/**\r\n * Between years rule - date must be between start and end years\r\n * Supports field names with sibling scope\r\n */\r\nexport const betweenYearsRule: SchemaRule<{\r\n startYear: number | string;\r\n endYear: number | string;\r\n scope?: \"global\" | \"sibling\";\r\n}> = {\r\n name: \"betweenYears\",\r\n defaultErrorMessage: \"The :input must be between :startYear and :endYear\",\r\n async validate(value: Date, context) {\r\n const { startYear, endYear, scope = \"global\" } = this.context.options;\r\n const inputDate = new Date(value);\r\n const inputYear = inputDate.getFullYear();\r\n\r\n // Extract start year\r\n let compareStartYear: number;\r\n if (typeof startYear === \"number\") {\r\n compareStartYear = startYear;\r\n } else {\r\n const source = scope === \"sibling\" ? context.parent : context.allValues;\r\n const fieldValue = get(source, startYear);\r\n\r\n if (fieldValue === undefined) {\r\n return VALID_RULE;\r\n }\r\n\r\n if (fieldValue instanceof Date) {\r\n compareStartYear = fieldValue.getFullYear();\r\n } else if (typeof fieldValue === \"number\") {\r\n compareStartYear = fieldValue;\r\n } else {\r\n const date = new Date(fieldValue);\r\n if (!isNaN(date.getTime())) {\r\n compareStartYear = date.getFullYear();\r\n } else {\r\n return VALID_RULE;\r\n }\r\n }\r\n }\r\n\r\n // Extract end year\r\n let compareEndYear: number;\r\n if (typeof endYear === \"number\") {\r\n compareEndYear = endYear;\r\n } else {\r\n const source = scope === \"sibling\" ? context.parent : context.allValues;\r\n const fieldValue = get(source, endYear);\r\n\r\n if (fieldValue === undefined) {\r\n return VALID_RULE;\r\n }\r\n\r\n if (fieldValue instanceof Date) {\r\n compareEndYear = fieldValue.getFullYear();\r\n } else if (typeof fieldValue === \"number\") {\r\n compareEndYear = fieldValue;\r\n } else {\r\n const date = new Date(fieldValue);\r\n if (!isNaN(date.getTime())) {\r\n compareEndYear = date.getFullYear();\r\n } else {\r\n return VALID_RULE;\r\n }\r\n }\r\n }\r\n\r\n if (inputYear >= compareStartYear && inputYear <= compareEndYear) {\r\n return VALID_RULE;\r\n }\r\n\r\n this.context.translationParams.startYear = compareStartYear;\r\n this.context.translationParams.endYear = compareEndYear;\r\n return invalidRule(this, context);\r\n },\r\n};\r\n\r\n/**\r\n * Between months rule - date must be between start and end months (1-12)\r\n * Supports field names with sibling scope\r\n */\r\nexport const betweenMonthsRule: SchemaRule<{\r\n startMonth: Month | string;\r\n endMonth: Month | string;\r\n scope?: \"global\" | \"sibling\";\r\n}> = {\r\n name: \"betweenMonths\",\r\n defaultErrorMessage: \"The :input must be between month :startMonth and :endMonth\",\r\n async validate(value: Date, context) {\r\n const { startMonth, endMonth, scope = \"global\" } = this.context.options;\r\n const inputDate = new Date(value);\r\n const inputMonth = inputDate.getMonth() + 1; // getMonth() returns 0-11\r\n\r\n // Extract start month\r\n let compareStartMonth: number;\r\n if (typeof startMonth === \"number\") {\r\n compareStartMonth = startMonth;\r\n this.context.translatableParams.startMonth = MONTHS[compareStartMonth as keyof typeof MONTHS];\r\n } else {\r\n const source = scope === \"sibling\" ? context.parent : context.allValues;\r\n const fieldValue = get(source, startMonth);\r\n\r\n if (fieldValue === undefined) {\r\n return VALID_RULE;\r\n }\r\n\r\n this.context.translatableParams.startMonth = startMonth;\r\n\r\n if (fieldValue instanceof Date) {\r\n compareStartMonth = fieldValue.getMonth() + 1;\r\n } else if (typeof fieldValue === \"number\") {\r\n compareStartMonth = fieldValue;\r\n } else {\r\n const date = new Date(fieldValue);\r\n if (!isNaN(date.getTime())) {\r\n compareStartMonth = date.getMonth() + 1;\r\n } else {\r\n return VALID_RULE;\r\n }\r\n }\r\n }\r\n\r\n // Extract end month\r\n let compareEndMonth: number;\r\n if (typeof endMonth === \"number\") {\r\n compareEndMonth = endMonth;\r\n this.context.translatableParams.endMonth = MONTHS[compareEndMonth as keyof typeof MONTHS];\r\n } else {\r\n const source = scope === \"sibling\" ? context.parent : context.allValues;\r\n const fieldValue = get(source, endMonth);\r\n\r\n if (fieldValue === undefined) {\r\n return VALID_RULE;\r\n }\r\n\r\n this.context.translatableParams.endMonth = endMonth;\r\n\r\n if (fieldValue instanceof Date) {\r\n compareEndMonth = fieldValue.getMonth() + 1;\r\n } else if (typeof fieldValue === \"number\") {\r\n compareEndMonth = fieldValue;\r\n } else {\r\n const date = new Date(fieldValue);\r\n if (!isNaN(date.getTime())) {\r\n compareEndMonth = date.getMonth() + 1;\r\n } else {\r\n return VALID_RULE;\r\n }\r\n }\r\n }\r\n\r\n if (inputMonth >= compareStartMonth && inputMonth <= compareEndMonth) {\r\n return VALID_RULE;\r\n }\r\n\r\n return invalidRule(this, context);\r\n },\r\n};\r\n\r\n/**\r\n * Between days rule - date must be between start and end days (1-31)\r\n * Supports field names with sibling scope\r\n */\r\nexport const betweenDaysRule: SchemaRule<{\r\n startDay: number | string;\r\n endDay: number | string;\r\n scope?: \"global\" | \"sibling\";\r\n}> = {\r\n name: \"betweenDays\",\r\n defaultErrorMessage: \"The :input must be between day :startDay and :endDay\",\r\n async validate(value: Date, context) {\r\n const { startDay, endDay, scope = \"global\" } = this.context.options;\r\n const inputDate = new Date(value);\r\n const inputDay = inputDate.getDate();\r\n\r\n // Extract start day\r\n let compareStartDay: number;\r\n if (typeof startDay === \"number\") {\r\n compareStartDay = startDay;\r\n } else {\r\n const source = scope === \"sibling\" ? context.parent : context.allValues;\r\n const fieldValue = get(source, startDay);\r\n\r\n if (fieldValue === undefined) {\r\n return VALID_RULE;\r\n }\r\n\r\n if (fieldValue instanceof Date) {\r\n compareStartDay = fieldValue.getDate();\r\n } else if (typeof fieldValue === \"number\") {\r\n compareStartDay = fieldValue;\r\n } else {\r\n const date = new Date(fieldValue);\r\n if (!isNaN(date.getTime())) {\r\n compareStartDay = date.getDate();\r\n } else {\r\n return VALID_RULE;\r\n }\r\n }\r\n }\r\n\r\n // Extract end day\r\n let compareEndDay: number;\r\n if (typeof endDay === \"number\") {\r\n compareEndDay = endDay;\r\n } else {\r\n const source = scope === \"sibling\" ? context.parent : context.allValues;\r\n const fieldValue = get(source, endDay);\r\n\r\n if (fieldValue === undefined) {\r\n return VALID_RULE;\r\n }\r\n\r\n if (fieldValue instanceof Date) {\r\n compareEndDay = fieldValue.getDate();\r\n } else if (typeof fieldValue === \"number\") {\r\n compareEndDay = fieldValue;\r\n } else {\r\n const date = new Date(fieldValue);\r\n if (!isNaN(date.getTime())) {\r\n compareEndDay = date.getDate();\r\n } else {\r\n return VALID_RULE;\r\n }\r\n }\r\n }\r\n\r\n if (inputDay >= compareStartDay && inputDay <= compareEndDay) {\r\n return VALID_RULE;\r\n }\r\n\r\n this.context.translationParams.startDay = compareStartDay;\r\n this.context.translationParams.endDay = compareEndDay;\r\n return invalidRule(this, context);\r\n },\r\n};\r\n\r\n/**\r\n * Quarter rule - date must be in specific quarter (1-4)\r\n */\r\nexport const quarterRule: SchemaRule<{ quarter: 1 | 2 | 3 | 4 }> = {\r\n name: \"quarter\",\r\n defaultErrorMessage: \"The :input must be in quarter :quarter\",\r\n async validate(value: Date, context) {\r\n const inputDate = new Date(value);\r\n const month = inputDate.getMonth() + 1;\r\n const quarter = Math.ceil(month / 3);\r\n\r\n if (quarter === this.context.options.quarter) {\r\n return VALID_RULE;\r\n }\r\n\r\n this.context.translationParams.quarter = this.context.options.quarter;\r\n return invalidRule(this, context);\r\n },\r\n};\r\n\r\n/**\r\n * Between times rule - time must be between start and end times (HH:MM format)\r\n */\r\nexport const betweenTimesRule: SchemaRule<{\r\n startTime: string;\r\n endTime: string;\r\n}> = {\r\n name: \"betweenTimes\",\r\n defaultErrorMessage: \"The :input must be between :startTime and :endTime\",\r\n async validate(value: Date, context) {\r\n const inputDate = new Date(value);\r\n const inputHour = inputDate.getHours();\r\n const inputMinute = inputDate.getMinutes();\r\n const inputTimeInMinutes = inputHour * 60 + inputMinute;\r\n\r\n const { startTime, endTime } = this.context.options;\r\n\r\n // Parse start time\r\n const [startHour, startMinute] = startTime.split(\":\").map(Number);\n if (startHour === undefined || startMinute === undefined) {\n return invalidRule(this, context);\n }\n const startTimeInMinutes = startHour * 60 + startMinute;\r\n\r\n // Parse end time\r\n const [endHour, endMinute] = endTime.split(\":\").map(Number);\n if (endHour === undefined || endMinute === undefined) {\n return invalidRule(this, context);\n }\n const endTimeInMinutes = endHour * 60 + endMinute;\r\n\r\n if (inputTimeInMinutes >= startTimeInMinutes && inputTimeInMinutes <= endTimeInMinutes) {\r\n return VALID_RULE;\r\n }\r\n\r\n this.context.translationParams.startTime = startTime;\r\n this.context.translationParams.endTime = endTime;\r\n return invalidRule(this, context);\r\n },\r\n};\r\n\r\n/**\r\n * Min year rule - year must be >= given year or field\r\n * Smart detection: number or field name\r\n * Supports both global and sibling scope\r\n */\r\nexport const minYearRule: SchemaRule<{\r\n yearOrField: number | string;\r\n scope?: \"global\" | \"sibling\";\r\n}> = {\r\n name: \"minYear\",\r\n description: \"The date year must be at least the given year or field\",\r\n defaultErrorMessage: \"The :input year must be higher than :yearOrField\",\r\n async validate(value: Date, context) {\r\n const { yearOrField, scope = \"global\" } = this.context.options;\r\n let compareYear: number;\r\n\r\n if (typeof yearOrField === \"number\") {\r\n compareYear = yearOrField;\r\n this.context.translationParams.yearOrField = yearOrField;\r\n } else {\r\n const source = scope === \"sibling\" ? context.parent : context.allValues;\r\n const fieldValue = get(source, yearOrField);\r\n\r\n if (fieldValue === undefined) {\r\n return VALID_RULE;\r\n }\r\n\r\n this.context.translatableParams.yearOrField = yearOrField;\r\n\r\n // If field contains a date, extract the year\r\n if (fieldValue instanceof Date) {\r\n compareYear = fieldValue.getFullYear();\r\n } else if (typeof fieldValue === \"number\") {\r\n compareYear = fieldValue;\r\n } else {\r\n // Try to parse as date and extract year\r\n const date = new Date(fieldValue);\r\n if (!isNaN(date.getTime())) {\r\n compareYear = date.getFullYear();\r\n } else {\r\n return VALID_RULE;\r\n }\r\n }\r\n }\r\n\r\n const inputDate = new Date(value);\r\n const inputYear = inputDate.getFullYear();\r\n\r\n if (inputYear >= compareYear) {\r\n return VALID_RULE;\r\n }\r\n\r\n return invalidRule(this, context);\r\n },\r\n};\r\n\r\n/**\r\n * Max year rule - year must be <= given year or field\r\n * Smart detection: number or field name\r\n * Supports both global and sibling scope\r\n */\r\nexport const maxYearRule: SchemaRule<{\r\n yearOrField: number | string;\r\n scope?: \"global\" | \"sibling\";\r\n}> = {\r\n name: \"maxYear\",\r\n description: \"The date year must be at most the given year or field\",\r\n defaultErrorMessage: \"The :input year must be at most :yearOrField\",\r\n async validate(value: Date, context) {\r\n const { yearOrField, scope = \"global\" } = this.context.options;\r\n let compareYear: number;\r\n\r\n if (typeof yearOrField === \"number\") {\r\n compareYear = yearOrField;\r\n this.context.translationParams.yearOrField = compareYear;\r\n } else {\r\n const source = scope === \"sibling\" ? context.parent : context.allValues;\r\n const fieldValue = get(source, yearOrField);\r\n\r\n if (fieldValue === undefined) {\r\n return VALID_RULE;\r\n }\r\n\r\n this.context.translatableParams.yearOrField = yearOrField;\r\n\r\n // If field contains a date, extract the year\r\n if (fieldValue instanceof Date) {\r\n compareYear = fieldValue.getFullYear();\r\n } else if (typeof fieldValue === \"number\") {\r\n compareYear = fieldValue;\r\n } else {\r\n // Try to parse as date and extract year\r\n const date = new Date(fieldValue);\r\n if (!isNaN(date.getTime())) {\r\n compareYear = date.getFullYear();\r\n } else {\r\n return VALID_RULE;\r\n }\r\n }\r\n }\r\n\r\n const inputDate = new Date(value);\r\n const inputYear = inputDate.getFullYear();\r\n\r\n if (inputYear <= compareYear) {\r\n return VALID_RULE;\r\n }\r\n\r\n return invalidRule(this, context);\r\n },\r\n};\r\n\r\n/**\r\n * Min month rule - month must be >= given month or field (1-12)\r\n * Smart detection: number or field name\r\n * Supports both global and sibling scope\r\n */\r\nexport const minMonthRule: SchemaRule<{\r\n monthOrField: number | string;\r\n scope?: \"global\" | \"sibling\";\r\n}> = {\r\n name: \"minMonth\",\r\n description: \"The date month must be at least the given month or field\",\r\n defaultErrorMessage: \"The :input month must be at least :monthOrField\",\r\n async validate(value: Date, context) {\r\n const { monthOrField, scope = \"global\" } = this.context.options;\r\n let compareMonth: number;\r\n\r\n if (typeof monthOrField === \"number\") {\r\n compareMonth = monthOrField;\r\n this.context.translationParams.monthOrField = compareMonth;\r\n } else {\r\n const source = scope === \"sibling\" ? context.parent : context.allValues;\r\n const fieldValue = get(source, monthOrField);\r\n\r\n if (fieldValue === undefined) {\r\n return VALID_RULE;\r\n }\r\n\r\n this.context.translatableParams.monthOrField = monthOrField;\r\n\r\n // If field contains a date, extract the month\r\n if (fieldValue instanceof Date) {\r\n compareMonth = fieldValue.getMonth() + 1; // getMonth() returns 0-11\r\n } else if (typeof fieldValue === \"number\") {\r\n compareMonth = fieldValue;\r\n } else {\r\n // Try to parse as date and extract month\r\n const date = new Date(fieldValue);\r\n if (!isNaN(date.getTime())) {\r\n compareMonth = date.getMonth() + 1;\r\n } else {\r\n return VALID_RULE;\r\n }\r\n }\r\n }\r\n\r\n const inputDate = new Date(value);\r\n const inputMonth = inputDate.getMonth() + 1; // getMonth() returns 0-11\r\n\r\n if (inputMonth >= compareMonth) {\r\n return VALID_RULE;\r\n }\r\n return invalidRule(this, context);\r\n },\r\n};\r\n\r\n/**\r\n * Max month rule - month must be <= given month or field (1-12)\r\n * Smart detection: number or field name\r\n * Supports both global and sibling scope\r\n */\r\nexport const maxMonthRule: SchemaRule<{\r\n monthOrField: Month | string;\r\n scope?: \"global\" | \"sibling\";\r\n}> = {\r\n name: \"maxMonth\",\r\n description: \"The date month must be at most the given month or field\",\r\n defaultErrorMessage: \"The :input month must be at most :monthOrField\",\r\n async validate(value: Date, context) {\r\n const { monthOrField, scope = \"global\" } = this.context.options;\r\n let compareMonth: number;\r\n\r\n if (typeof monthOrField === \"number\") {\r\n compareMonth = monthOrField;\r\n this.context.translatableParams.monthOrField = MONTHS[monthOrField];\r\n } else {\r\n const source = scope === \"sibling\" ? context.parent : context.allValues;\r\n const fieldValue = get(source, monthOrField);\r\n\r\n if (fieldValue === undefined) {\r\n return VALID_RULE;\r\n }\r\n\r\n this.context.translatableParams.monthOrField = monthOrField;\r\n\r\n // If field contains a date, extract the month\r\n if (fieldValue instanceof Date) {\r\n compareMonth = fieldValue.getMonth() + 1; // getMonth() returns 0-11\r\n } else if (typeof fieldValue === \"number\") {\r\n compareMonth = fieldValue;\r\n } else {\r\n // Try to parse as date and extract month\r\n const date = new Date(fieldValue);\r\n if (!isNaN(date.getTime())) {\r\n compareMonth = date.getMonth() + 1;\r\n } else {\r\n return VALID_RULE;\r\n }\r\n }\r\n }\r\n\r\n const inputDate = new Date(value);\r\n const inputMonth = inputDate.getMonth() + 1; // getMonth() returns 0-11\r\n\r\n if (inputMonth <= compareMonth) {\r\n return VALID_RULE;\r\n }\r\n\r\n return invalidRule(this, context);\r\n },\r\n};\r\n\r\n/**\r\n * Min day rule - day must be >= given day or field (1-31)\r\n * Smart detection: number or field name\r\n * Supports both global and sibling scope\r\n */\r\nexport const minDayRule: SchemaRule<{\r\n dayOrField: number | string;\r\n scope?: \"global\" | \"sibling\";\r\n}> = {\r\n name: \"minDay\",\r\n description: \"The date day must be at least the given day or field\",\r\n defaultErrorMessage: \"The :input day must be higher than :dayOrField\",\r\n async validate(value: Date, context) {\r\n const { dayOrField, scope = \"global\" } = this.context.options;\r\n let compareDay: number;\r\n\r\n if (typeof dayOrField === \"number\") {\r\n compareDay = dayOrField;\r\n this.context.translationParams.dayOrField = dayOrField;\r\n } else {\r\n const source = scope === \"sibling\" ? context.parent : context.allValues;\r\n const fieldValue = get(source, dayOrField);\r\n\r\n if (fieldValue === undefined) {\r\n return VALID_RULE;\r\n }\r\n\r\n this.context.translatableParams.dayOrField = dayOrField;\r\n\r\n // If field contains a date, extract the day\r\n if (fieldValue instanceof Date) {\r\n compareDay = fieldValue.getDate();\r\n } else if (typeof fieldValue === \"number\") {\r\n compareDay = fieldValue;\r\n } else {\r\n // Try to parse as date and extract day\r\n const date = new Date(fieldValue);\r\n if (!isNaN(date.getTime())) {\r\n compareDay = date.getDate();\r\n } else {\r\n return VALID_RULE;\r\n }\r\n }\r\n }\r\n\r\n const inputDate = new Date(value);\r\n const inputDay = inputDate.getDate();\r\n\r\n if (inputDay >= compareDay) {\r\n return VALID_RULE;\r\n }\r\n return invalidRule(this, context);\r\n },\r\n};\r\n\r\n/**\r\n * Max day rule - day must be <= given day or field (1-31)\r\n * Smart detection: number or field name\r\n * Supports both global and sibling scope\r\n */\r\nexport const maxDayRule: SchemaRule<{\r\n dayOrField: number | string;\r\n scope?: \"global\" | \"sibling\";\r\n}> = {\r\n name: \"maxDay\",\r\n description: \"The date day must be at most the given day or field\",\r\n defaultErrorMessage: \"The :input day must be at most :dayOrField\",\r\n async validate(value: Date, context) {\r\n const { dayOrField, scope = \"global\" } = this.context.options;\r\n let compareDay: number;\r\n\r\n if (typeof dayOrField === \"number\") {\r\n compareDay = dayOrField;\r\n this.context.translationParams.dayOrField = dayOrField;\r\n } else {\r\n const source = scope === \"sibling\" ? context.parent : context.allValues;\r\n const fieldValue = get(source, dayOrField);\r\n\r\n if (fieldValue === undefined) {\r\n return VALID_RULE;\r\n }\r\n\r\n this.context.translatableParams.dayOrField = dayOrField;\r\n\r\n // If field contains a date, extract the day\r\n if (fieldValue instanceof Date) {\r\n compareDay = fieldValue.getDate();\r\n } else if (typeof fieldValue === \"number\") {\r\n compareDay = fieldValue;\r\n } else {\r\n // Try to parse as date and extract day\r\n const date = new Date(fieldValue);\r\n if (!isNaN(date.getTime())) {\r\n compareDay = date.getDate();\r\n } else {\r\n return VALID_RULE;\r\n }\r\n }\r\n }\r\n\r\n const inputDate = new Date(value);\r\n const inputDay = inputDate.getDate();\r\n\r\n if (inputDay <= compareDay) {\r\n return VALID_RULE;\r\n }\r\n return invalidRule(this, context);\r\n },\r\n};\r\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"date-period-rules.mjs","names":[],"sources":["../../../../../../../../seal/src/rules/date/date-period-rules.ts"],"sourcesContent":["import { get } from \"@mongez/reinforcements\";\nimport { invalidRule, VALID_RULE } from \"../../helpers\";\nimport type { SchemaRule } from \"../../types\";\n\nconst MONTHS = {\n 1: \"january\",\n 2: \"february\",\n 3: \"march\",\n 4: \"april\",\n 5: \"may\",\n 6: \"june\",\n 7: \"july\",\n 8: \"august\",\n 9: \"september\",\n 10: \"october\",\n 11: \"november\",\n 12: \"december\",\n};\n\nexport type Month = keyof typeof MONTHS;\n\n/**\n * Month rule - date must be in specific month (1-12)\n */\nexport const monthRule: SchemaRule<{ month: Month }> = {\n name: \"month\",\n defaultErrorMessage: \"The :input must be in month :month\",\n async validate(value: Date, context) {\n const inputDate = new Date(value);\n const month = inputDate.getMonth() + 1; // getMonth() returns 0-11\n\n if (month === this.context.options.month) {\n return VALID_RULE;\n }\n\n this.context.translatableParams.month =\n MONTHS[this.context.options.month as keyof typeof MONTHS];\n return invalidRule(this, context);\n },\n};\n\n/**\n * Year rule - date must be in specific year\n */\nexport const yearRule: SchemaRule<{ year: number }> = {\n name: \"year\",\n defaultErrorMessage: \"The :input must be in year :year\",\n async validate(value: Date, context) {\n const inputDate = new Date(value);\n const year = inputDate.getFullYear();\n\n if (year === this.context.options.year) {\n return VALID_RULE;\n }\n\n this.context.translationParams.year = this.context.options.year;\n return invalidRule(this, context);\n },\n};\n\n/**\n * Between years rule - date must be between start and end years\n * Supports field names with sibling scope\n */\nexport const betweenYearsRule: SchemaRule<{\n startYear: number | string;\n endYear: number | string;\n scope?: \"global\" | \"sibling\";\n}> = {\n name: \"betweenYears\",\n defaultErrorMessage: \"The :input must be between :startYear and :endYear\",\n async validate(value: Date, context) {\n const { startYear, endYear, scope = \"global\" } = this.context.options;\n const inputDate = new Date(value);\n const inputYear = inputDate.getFullYear();\n\n // Extract start year\n let compareStartYear: number;\n if (typeof startYear === \"number\") {\n compareStartYear = startYear;\n } else {\n const source = scope === \"sibling\" ? context.parent : context.allValues;\n const fieldValue = get(source, startYear);\n\n if (fieldValue === undefined) {\n return VALID_RULE;\n }\n\n if (fieldValue instanceof Date) {\n compareStartYear = fieldValue.getFullYear();\n } else if (typeof fieldValue === \"number\") {\n compareStartYear = fieldValue;\n } else {\n const date = new Date(fieldValue);\n if (!isNaN(date.getTime())) {\n compareStartYear = date.getFullYear();\n } else {\n return VALID_RULE;\n }\n }\n }\n\n // Extract end year\n let compareEndYear: number;\n if (typeof endYear === \"number\") {\n compareEndYear = endYear;\n } else {\n const source = scope === \"sibling\" ? context.parent : context.allValues;\n const fieldValue = get(source, endYear);\n\n if (fieldValue === undefined) {\n return VALID_RULE;\n }\n\n if (fieldValue instanceof Date) {\n compareEndYear = fieldValue.getFullYear();\n } else if (typeof fieldValue === \"number\") {\n compareEndYear = fieldValue;\n } else {\n const date = new Date(fieldValue);\n if (!isNaN(date.getTime())) {\n compareEndYear = date.getFullYear();\n } else {\n return VALID_RULE;\n }\n }\n }\n\n if (inputYear >= compareStartYear && inputYear <= compareEndYear) {\n return VALID_RULE;\n }\n\n this.context.translationParams.startYear = compareStartYear;\n this.context.translationParams.endYear = compareEndYear;\n return invalidRule(this, context);\n },\n};\n\n/**\n * Between months rule - date must be between start and end months (1-12)\n * Supports field names with sibling scope\n */\nexport const betweenMonthsRule: SchemaRule<{\n startMonth: Month | string;\n endMonth: Month | string;\n scope?: \"global\" | \"sibling\";\n}> = {\n name: \"betweenMonths\",\n defaultErrorMessage: \"The :input must be between month :startMonth and :endMonth\",\n async validate(value: Date, context) {\n const { startMonth, endMonth, scope = \"global\" } = this.context.options;\n const inputDate = new Date(value);\n const inputMonth = inputDate.getMonth() + 1; // getMonth() returns 0-11\n\n // Extract start month\n let compareStartMonth: number;\n if (typeof startMonth === \"number\") {\n compareStartMonth = startMonth;\n this.context.translatableParams.startMonth = MONTHS[compareStartMonth as keyof typeof MONTHS];\n } else {\n const source = scope === \"sibling\" ? context.parent : context.allValues;\n const fieldValue = get(source, startMonth);\n\n if (fieldValue === undefined) {\n return VALID_RULE;\n }\n\n this.context.translatableParams.startMonth = startMonth;\n\n if (fieldValue instanceof Date) {\n compareStartMonth = fieldValue.getMonth() + 1;\n } else if (typeof fieldValue === \"number\") {\n compareStartMonth = fieldValue;\n } else {\n const date = new Date(fieldValue);\n if (!isNaN(date.getTime())) {\n compareStartMonth = date.getMonth() + 1;\n } else {\n return VALID_RULE;\n }\n }\n }\n\n // Extract end month\n let compareEndMonth: number;\n if (typeof endMonth === \"number\") {\n compareEndMonth = endMonth;\n this.context.translatableParams.endMonth = MONTHS[compareEndMonth as keyof typeof MONTHS];\n } else {\n const source = scope === \"sibling\" ? context.parent : context.allValues;\n const fieldValue = get(source, endMonth);\n\n if (fieldValue === undefined) {\n return VALID_RULE;\n }\n\n this.context.translatableParams.endMonth = endMonth;\n\n if (fieldValue instanceof Date) {\n compareEndMonth = fieldValue.getMonth() + 1;\n } else if (typeof fieldValue === \"number\") {\n compareEndMonth = fieldValue;\n } else {\n const date = new Date(fieldValue);\n if (!isNaN(date.getTime())) {\n compareEndMonth = date.getMonth() + 1;\n } else {\n return VALID_RULE;\n }\n }\n }\n\n if (inputMonth >= compareStartMonth && inputMonth <= compareEndMonth) {\n return VALID_RULE;\n }\n\n return invalidRule(this, context);\n },\n};\n\n/**\n * Between days rule - date must be between start and end days (1-31)\n * Supports field names with sibling scope\n */\nexport const betweenDaysRule: SchemaRule<{\n startDay: number | string;\n endDay: number | string;\n scope?: \"global\" | \"sibling\";\n}> = {\n name: \"betweenDays\",\n defaultErrorMessage: \"The :input must be between day :startDay and :endDay\",\n async validate(value: Date, context) {\n const { startDay, endDay, scope = \"global\" } = this.context.options;\n const inputDate = new Date(value);\n const inputDay = inputDate.getDate();\n\n // Extract start day\n let compareStartDay: number;\n if (typeof startDay === \"number\") {\n compareStartDay = startDay;\n } else {\n const source = scope === \"sibling\" ? context.parent : context.allValues;\n const fieldValue = get(source, startDay);\n\n if (fieldValue === undefined) {\n return VALID_RULE;\n }\n\n if (fieldValue instanceof Date) {\n compareStartDay = fieldValue.getDate();\n } else if (typeof fieldValue === \"number\") {\n compareStartDay = fieldValue;\n } else {\n const date = new Date(fieldValue);\n if (!isNaN(date.getTime())) {\n compareStartDay = date.getDate();\n } else {\n return VALID_RULE;\n }\n }\n }\n\n // Extract end day\n let compareEndDay: number;\n if (typeof endDay === \"number\") {\n compareEndDay = endDay;\n } else {\n const source = scope === \"sibling\" ? context.parent : context.allValues;\n const fieldValue = get(source, endDay);\n\n if (fieldValue === undefined) {\n return VALID_RULE;\n }\n\n if (fieldValue instanceof Date) {\n compareEndDay = fieldValue.getDate();\n } else if (typeof fieldValue === \"number\") {\n compareEndDay = fieldValue;\n } else {\n const date = new Date(fieldValue);\n if (!isNaN(date.getTime())) {\n compareEndDay = date.getDate();\n } else {\n return VALID_RULE;\n }\n }\n }\n\n if (inputDay >= compareStartDay && inputDay <= compareEndDay) {\n return VALID_RULE;\n }\n\n this.context.translationParams.startDay = compareStartDay;\n this.context.translationParams.endDay = compareEndDay;\n return invalidRule(this, context);\n },\n};\n\n/**\n * Quarter rule - date must be in specific quarter (1-4)\n */\nexport const quarterRule: SchemaRule<{ quarter: 1 | 2 | 3 | 4 }> = {\n name: \"quarter\",\n defaultErrorMessage: \"The :input must be in quarter :quarter\",\n async validate(value: Date, context) {\n const inputDate = new Date(value);\n const month = inputDate.getMonth() + 1;\n const quarter = Math.ceil(month / 3);\n\n if (quarter === this.context.options.quarter) {\n return VALID_RULE;\n }\n\n this.context.translationParams.quarter = this.context.options.quarter;\n return invalidRule(this, context);\n },\n};\n\n/**\n * Between times rule - time must be between start and end times (HH:MM format)\n */\nexport const betweenTimesRule: SchemaRule<{\n startTime: string;\n endTime: string;\n}> = {\n name: \"betweenTimes\",\n defaultErrorMessage: \"The :input must be between :startTime and :endTime\",\n async validate(value: Date, context) {\n const inputDate = new Date(value);\n const inputHour = inputDate.getHours();\n const inputMinute = inputDate.getMinutes();\n const inputTimeInMinutes = inputHour * 60 + inputMinute;\n\n const { startTime, endTime } = this.context.options;\n\n // Parse start time\n const [startHour, startMinute] = startTime.split(\":\").map(Number);\n if (startHour === undefined || startMinute === undefined) {\n return invalidRule(this, context);\n }\n const startTimeInMinutes = startHour * 60 + startMinute;\n\n // Parse end time\n const [endHour, endMinute] = endTime.split(\":\").map(Number);\n if (endHour === undefined || endMinute === undefined) {\n return invalidRule(this, context);\n }\n const endTimeInMinutes = endHour * 60 + endMinute;\n\n if (inputTimeInMinutes >= startTimeInMinutes && inputTimeInMinutes <= endTimeInMinutes) {\n return VALID_RULE;\n }\n\n this.context.translationParams.startTime = startTime;\n this.context.translationParams.endTime = endTime;\n return invalidRule(this, context);\n },\n};\n\n/**\n * Min year rule - year must be >= given year or field\n * Smart detection: number or field name\n * Supports both global and sibling scope\n */\nexport const minYearRule: SchemaRule<{\n yearOrField: number | string;\n scope?: \"global\" | \"sibling\";\n}> = {\n name: \"minYear\",\n description: \"The date year must be at least the given year or field\",\n defaultErrorMessage: \"The :input year must be higher than :yearOrField\",\n async validate(value: Date, context) {\n const { yearOrField, scope = \"global\" } = this.context.options;\n let compareYear: number;\n\n if (typeof yearOrField === \"number\") {\n compareYear = yearOrField;\n this.context.translationParams.yearOrField = yearOrField;\n } else {\n const source = scope === \"sibling\" ? context.parent : context.allValues;\n const fieldValue = get(source, yearOrField);\n\n if (fieldValue === undefined) {\n return VALID_RULE;\n }\n\n this.context.translatableParams.yearOrField = yearOrField;\n\n // If field contains a date, extract the year\n if (fieldValue instanceof Date) {\n compareYear = fieldValue.getFullYear();\n } else if (typeof fieldValue === \"number\") {\n compareYear = fieldValue;\n } else {\n // Try to parse as date and extract year\n const date = new Date(fieldValue);\n if (!isNaN(date.getTime())) {\n compareYear = date.getFullYear();\n } else {\n return VALID_RULE;\n }\n }\n }\n\n const inputDate = new Date(value);\n const inputYear = inputDate.getFullYear();\n\n if (inputYear >= compareYear) {\n return VALID_RULE;\n }\n\n return invalidRule(this, context);\n },\n};\n\n/**\n * Max year rule - year must be <= given year or field\n * Smart detection: number or field name\n * Supports both global and sibling scope\n */\nexport const maxYearRule: SchemaRule<{\n yearOrField: number | string;\n scope?: \"global\" | \"sibling\";\n}> = {\n name: \"maxYear\",\n description: \"The date year must be at most the given year or field\",\n defaultErrorMessage: \"The :input year must be at most :yearOrField\",\n async validate(value: Date, context) {\n const { yearOrField, scope = \"global\" } = this.context.options;\n let compareYear: number;\n\n if (typeof yearOrField === \"number\") {\n compareYear = yearOrField;\n this.context.translationParams.yearOrField = compareYear;\n } else {\n const source = scope === \"sibling\" ? context.parent : context.allValues;\n const fieldValue = get(source, yearOrField);\n\n if (fieldValue === undefined) {\n return VALID_RULE;\n }\n\n this.context.translatableParams.yearOrField = yearOrField;\n\n // If field contains a date, extract the year\n if (fieldValue instanceof Date) {\n compareYear = fieldValue.getFullYear();\n } else if (typeof fieldValue === \"number\") {\n compareYear = fieldValue;\n } else {\n // Try to parse as date and extract year\n const date = new Date(fieldValue);\n if (!isNaN(date.getTime())) {\n compareYear = date.getFullYear();\n } else {\n return VALID_RULE;\n }\n }\n }\n\n const inputDate = new Date(value);\n const inputYear = inputDate.getFullYear();\n\n if (inputYear <= compareYear) {\n return VALID_RULE;\n }\n\n return invalidRule(this, context);\n },\n};\n\n/**\n * Min month rule - month must be >= given month or field (1-12)\n * Smart detection: number or field name\n * Supports both global and sibling scope\n */\nexport const minMonthRule: SchemaRule<{\n monthOrField: number | string;\n scope?: \"global\" | \"sibling\";\n}> = {\n name: \"minMonth\",\n description: \"The date month must be at least the given month or field\",\n defaultErrorMessage: \"The :input month must be at least :monthOrField\",\n async validate(value: Date, context) {\n const { monthOrField, scope = \"global\" } = this.context.options;\n let compareMonth: number;\n\n if (typeof monthOrField === \"number\") {\n compareMonth = monthOrField;\n this.context.translationParams.monthOrField = compareMonth;\n } else {\n const source = scope === \"sibling\" ? context.parent : context.allValues;\n const fieldValue = get(source, monthOrField);\n\n if (fieldValue === undefined) {\n return VALID_RULE;\n }\n\n this.context.translatableParams.monthOrField = monthOrField;\n\n // If field contains a date, extract the month\n if (fieldValue instanceof Date) {\n compareMonth = fieldValue.getMonth() + 1; // getMonth() returns 0-11\n } else if (typeof fieldValue === \"number\") {\n compareMonth = fieldValue;\n } else {\n // Try to parse as date and extract month\n const date = new Date(fieldValue);\n if (!isNaN(date.getTime())) {\n compareMonth = date.getMonth() + 1;\n } else {\n return VALID_RULE;\n }\n }\n }\n\n const inputDate = new Date(value);\n const inputMonth = inputDate.getMonth() + 1; // getMonth() returns 0-11\n\n if (inputMonth >= compareMonth) {\n return VALID_RULE;\n }\n return invalidRule(this, context);\n },\n};\n\n/**\n * Max month rule - month must be <= given month or field (1-12)\n * Smart detection: number or field name\n * Supports both global and sibling scope\n */\nexport const maxMonthRule: SchemaRule<{\n monthOrField: Month | string;\n scope?: \"global\" | \"sibling\";\n}> = {\n name: \"maxMonth\",\n description: \"The date month must be at most the given month or field\",\n defaultErrorMessage: \"The :input month must be at most :monthOrField\",\n async validate(value: Date, context) {\n const { monthOrField, scope = \"global\" } = this.context.options;\n let compareMonth: number;\n\n if (typeof monthOrField === \"number\") {\n compareMonth = monthOrField;\n this.context.translatableParams.monthOrField = MONTHS[monthOrField];\n } else {\n const source = scope === \"sibling\" ? context.parent : context.allValues;\n const fieldValue = get(source, monthOrField);\n\n if (fieldValue === undefined) {\n return VALID_RULE;\n }\n\n this.context.translatableParams.monthOrField = monthOrField;\n\n // If field contains a date, extract the month\n if (fieldValue instanceof Date) {\n compareMonth = fieldValue.getMonth() + 1; // getMonth() returns 0-11\n } else if (typeof fieldValue === \"number\") {\n compareMonth = fieldValue;\n } else {\n // Try to parse as date and extract month\n const date = new Date(fieldValue);\n if (!isNaN(date.getTime())) {\n compareMonth = date.getMonth() + 1;\n } else {\n return VALID_RULE;\n }\n }\n }\n\n const inputDate = new Date(value);\n const inputMonth = inputDate.getMonth() + 1; // getMonth() returns 0-11\n\n if (inputMonth <= compareMonth) {\n return VALID_RULE;\n }\n\n return invalidRule(this, context);\n },\n};\n\n/**\n * Min day rule - day must be >= given day or field (1-31)\n * Smart detection: number or field name\n * Supports both global and sibling scope\n */\nexport const minDayRule: SchemaRule<{\n dayOrField: number | string;\n scope?: \"global\" | \"sibling\";\n}> = {\n name: \"minDay\",\n description: \"The date day must be at least the given day or field\",\n defaultErrorMessage: \"The :input day must be higher than :dayOrField\",\n async validate(value: Date, context) {\n const { dayOrField, scope = \"global\" } = this.context.options;\n let compareDay: number;\n\n if (typeof dayOrField === \"number\") {\n compareDay = dayOrField;\n this.context.translationParams.dayOrField = dayOrField;\n } else {\n const source = scope === \"sibling\" ? context.parent : context.allValues;\n const fieldValue = get(source, dayOrField);\n\n if (fieldValue === undefined) {\n return VALID_RULE;\n }\n\n this.context.translatableParams.dayOrField = dayOrField;\n\n // If field contains a date, extract the day\n if (fieldValue instanceof Date) {\n compareDay = fieldValue.getDate();\n } else if (typeof fieldValue === \"number\") {\n compareDay = fieldValue;\n } else {\n // Try to parse as date and extract day\n const date = new Date(fieldValue);\n if (!isNaN(date.getTime())) {\n compareDay = date.getDate();\n } else {\n return VALID_RULE;\n }\n }\n }\n\n const inputDate = new Date(value);\n const inputDay = inputDate.getDate();\n\n if (inputDay >= compareDay) {\n return VALID_RULE;\n }\n return invalidRule(this, context);\n },\n};\n\n/**\n * Max day rule - day must be <= given day or field (1-31)\n * Smart detection: number or field name\n * Supports both global and sibling scope\n */\nexport const maxDayRule: SchemaRule<{\n dayOrField: number | string;\n scope?: \"global\" | \"sibling\";\n}> = {\n name: \"maxDay\",\n description: \"The date day must be at most the given day or field\",\n defaultErrorMessage: \"The :input day must be at most :dayOrField\",\n async validate(value: Date, context) {\n const { dayOrField, scope = \"global\" } = this.context.options;\n let compareDay: number;\n\n if (typeof dayOrField === \"number\") {\n compareDay = dayOrField;\n this.context.translationParams.dayOrField = dayOrField;\n } else {\n const source = scope === \"sibling\" ? context.parent : context.allValues;\n const fieldValue = get(source, dayOrField);\n\n if (fieldValue === undefined) {\n return VALID_RULE;\n }\n\n this.context.translatableParams.dayOrField = dayOrField;\n\n // If field contains a date, extract the day\n if (fieldValue instanceof Date) {\n compareDay = fieldValue.getDate();\n } else if (typeof fieldValue === \"number\") {\n compareDay = fieldValue;\n } else {\n // Try to parse as date and extract day\n const date = new Date(fieldValue);\n if (!isNaN(date.getTime())) {\n compareDay = date.getDate();\n } else {\n return VALID_RULE;\n }\n }\n }\n\n const inputDate = new Date(value);\n const inputDay = inputDate.getDate();\n\n if (inputDay <= compareDay) {\n return VALID_RULE;\n }\n return invalidRule(this, context);\n },\n};\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"date-relative-rules.d.mts","names":[],"sources":["../../../../../../../../seal/src/rules/date/date-relative-rules.ts"],"mappings":";;;;;
|
|
1
|
+
{"version":3,"file":"date-relative-rules.d.mts","names":[],"sources":["../../../../../../../../seal/src/rules/date/date-relative-rules.ts"],"mappings":";;;;;cAMa,cAAA,EAAgB,UAAU;EAAG,IAAI;AAAA;;AAAA;AAsB9C;cAAa,kBAAA,EAAoB,UAAU;EAAG,IAAI;AAAA;AAAA;AA2BlD;;AA3BkD,cA2BrC,oBAAA,EAAsB,UAAU;EAAG,IAAI;AAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"date-relative-rules.mjs","names":[],"sources":["../../../../../../../../seal/src/rules/date/date-relative-rules.ts"],"sourcesContent":["import { invalidRule, VALID_RULE } from \"../../helpers\";\
|
|
1
|
+
{"version":3,"file":"date-relative-rules.mjs","names":[],"sources":["../../../../../../../../seal/src/rules/date/date-relative-rules.ts"],"sourcesContent":["import { invalidRule, VALID_RULE } from \"../../helpers\";\nimport type { SchemaRule } from \"../../types\";\n\n/**\n * Within days rule - date must be within X days from now (past or future)\n */\nexport const withinDaysRule: SchemaRule<{ days: number }> = {\n name: \"withinDays\",\n defaultErrorMessage: \"The :input must be within :days days from now\",\n async validate(value: Date, context) {\n const now = new Date();\n const inputDate = new Date(value);\n const diffTime = Math.abs(inputDate.getTime() - now.getTime());\n const diffDays = Math.ceil(diffTime / (1000 * 60 * 60 * 24));\n\n if (diffDays <= this.context.options.days) {\n return VALID_RULE;\n }\n\n this.context.translationParams.days = this.context.options.days;\n\n return invalidRule(this, context);\n },\n};\n\n/**\n * Within past days rule - date must be within X days in the past\n */\nexport const withinPastDaysRule: SchemaRule<{ days: number }> = {\n name: \"withinPastDays\",\n defaultErrorMessage: \"The :input must be within the past :days days\",\n async validate(value: Date, context) {\n const now = new Date();\n const inputDate = new Date(value);\n\n if (inputDate > now) {\n return invalidRule(this, context); // Must be in past\n }\n\n const diffTime = now.getTime() - inputDate.getTime();\n const diffDays = Math.ceil(diffTime / (1000 * 60 * 60 * 24));\n\n if (diffDays <= this.context.options.days) {\n return VALID_RULE;\n }\n\n this.context.translationParams.days = this.context.options.days;\n\n return invalidRule(this, context);\n },\n};\n\n/**\n * Within future days rule - date must be within X days in the future\n */\nexport const withinFutureDaysRule: SchemaRule<{ days: number }> = {\n name: \"withinFutureDays\",\n defaultErrorMessage: \"The :input must be within the next :days days\",\n async validate(value: Date, context) {\n const now = new Date();\n const inputDate = new Date(value);\n\n if (inputDate < now) {\n return invalidRule(this, context); // Must be in future\n }\n\n const diffTime = inputDate.getTime() - now.getTime();\n const diffDays = Math.ceil(diffTime / (1000 * 60 * 60 * 24));\n\n if (diffDays <= this.context.options.days) {\n return VALID_RULE;\n }\n\n this.context.translationParams.days = this.context.options.days;\n\n return invalidRule(this, context);\n },\n};\n"],"mappings":";;;;;;;AAMA,MAAa,iBAA+C;CAC1D,MAAM;CACN,qBAAqB;CACrB,MAAM,SAAS,OAAa,SAAS;EACnC,MAAM,sBAAM,IAAI,KAAK;EACrB,MAAM,YAAY,IAAI,KAAK,KAAK;EAChC,MAAM,WAAW,KAAK,IAAI,UAAU,QAAQ,IAAI,IAAI,QAAQ,CAAC;EAG7D,IAFiB,KAAK,KAAK,YAAY,MAAO,KAAK,KAAK,GAE7C,KAAK,KAAK,QAAQ,QAAQ,MACnC,OAAO;EAGT,KAAK,QAAQ,kBAAkB,OAAO,KAAK,QAAQ,QAAQ;EAE3D,OAAO,YAAY,MAAM,OAAO;CAClC;AACF;;;;AAKA,MAAa,qBAAmD;CAC9D,MAAM;CACN,qBAAqB;CACrB,MAAM,SAAS,OAAa,SAAS;EACnC,MAAM,sBAAM,IAAI,KAAK;EACrB,MAAM,YAAY,IAAI,KAAK,KAAK;EAEhC,IAAI,YAAY,KACd,OAAO,YAAY,MAAM,OAAO;EAGlC,MAAM,WAAW,IAAI,QAAQ,IAAI,UAAU,QAAQ;EAGnD,IAFiB,KAAK,KAAK,YAAY,MAAO,KAAK,KAAK,GAE7C,KAAK,KAAK,QAAQ,QAAQ,MACnC,OAAO;EAGT,KAAK,QAAQ,kBAAkB,OAAO,KAAK,QAAQ,QAAQ;EAE3D,OAAO,YAAY,MAAM,OAAO;CAClC;AACF;;;;AAKA,MAAa,uBAAqD;CAChE,MAAM;CACN,qBAAqB;CACrB,MAAM,SAAS,OAAa,SAAS;EACnC,MAAM,sBAAM,IAAI,KAAK;EACrB,MAAM,YAAY,IAAI,KAAK,KAAK;EAEhC,IAAI,YAAY,KACd,OAAO,YAAY,MAAM,OAAO;EAGlC,MAAM,WAAW,UAAU,QAAQ,IAAI,IAAI,QAAQ;EAGnD,IAFiB,KAAK,KAAK,YAAY,MAAO,KAAK,KAAK,GAE7C,KAAK,KAAK,QAAQ,QAAQ,MACnC,OAAO;EAGT,KAAK,QAAQ,kBAAkB,OAAO,KAAK,QAAQ,QAAQ;EAE3D,OAAO,YAAY,MAAM,OAAO;CAClC;AACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"date-special-rules.d.mts","names":[],"sources":["../../../../../../../../seal/src/rules/date/date-special-rules.ts"],"mappings":";;;;;
|
|
1
|
+
{"version":3,"file":"date-special-rules.d.mts","names":[],"sources":["../../../../../../../../seal/src/rules/date/date-special-rules.ts"],"mappings":";;;;;cAMa,YAAA,EAAc,UAAU;EAAG,MAAA;EAAiB,MAAA;AAAA;;;;cAsC5C,cAAA,EAAgB,UAAU;EAAG,MAAA;EAAgB,MAAA;AAAA;;;;cA6B7C,YAAA,EAAc,UAgB1B"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"date-special-rules.mjs","names":[],"sources":["../../../../../../../../seal/src/rules/date/date-special-rules.ts"],"sourcesContent":["import { invalidRule, VALID_RULE } from \"../../helpers\";\
|
|
1
|
+
{"version":3,"file":"date-special-rules.mjs","names":[],"sources":["../../../../../../../../seal/src/rules/date/date-special-rules.ts"],"sourcesContent":["import { invalidRule, VALID_RULE } from \"../../helpers\";\nimport type { SchemaRule } from \"../../types\";\n\n/**\n * Birthday rule - valid birthday (not in future, reasonable age)\n */\nexport const birthdayRule: SchemaRule<{ minAge?: number; maxAge?: number }> = {\n name: \"birthday\",\n defaultErrorMessage: \"The :input must be a valid birthday\",\n async validate(birthDate: Date, context) {\n const today = new Date();\n\n // Must not be in the future\n if (birthDate > today) {\n return invalidRule(this, context);\n }\n\n // Calculate age\n let age = today.getFullYear() - birthDate.getFullYear();\n const monthDiff = today.getMonth() - birthDate.getMonth();\n\n if (monthDiff < 0 || (monthDiff === 0 && today.getDate() < birthDate.getDate())) {\n age--;\n }\n\n // Check minimum age (default: 0)\n const minAge = this.context.options.minAge ?? 0;\n if (age < minAge) {\n return invalidRule(this, context);\n }\n\n // Check maximum age (default: 150)\n const maxAge = this.context.options.maxAge ?? 150;\n if (age > maxAge) {\n return invalidRule(this, context);\n }\n\n return VALID_RULE;\n },\n};\n\n/**\n * Between age rule - age must be between min and max years\n */\nexport const betweenAgeRule: SchemaRule<{ minAge: number; maxAge: number }> = {\n name: \"betweenAge\",\n defaultErrorMessage: \"Age must be between :minAge and :maxAge years\",\n async validate(value: Date, context) {\n const birthDate = new Date(value);\n const today = new Date();\n let age = today.getFullYear() - birthDate.getFullYear();\n const monthDiff = today.getMonth() - birthDate.getMonth();\n\n if (monthDiff < 0 || (monthDiff === 0 && today.getDate() < birthDate.getDate())) {\n age--;\n }\n\n const { minAge, maxAge } = this.context.options;\n\n if (age >= minAge && age <= maxAge) {\n return VALID_RULE;\n }\n\n this.context.translationParams.minAge = minAge;\n this.context.translationParams.maxAge = maxAge;\n\n return invalidRule(this, context);\n },\n};\n\n/**\n * Leap year rule - date must be in a leap year\n */\nexport const leapYearRule: SchemaRule = {\n name: \"leapYear\",\n defaultErrorMessage: \"The :input must be in a leap year\",\n async validate(value: Date, context) {\n const inputDate = new Date(value);\n const year = inputDate.getFullYear();\n\n // Leap year logic: divisible by 4, except century years unless divisible by 400\n const isLeapYear = (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0;\n\n if (isLeapYear) {\n return VALID_RULE;\n }\n\n return invalidRule(this, context);\n },\n};\n"],"mappings":";;;;;;;AAMA,MAAa,eAAiE;CAC5E,MAAM;CACN,qBAAqB;CACrB,MAAM,SAAS,WAAiB,SAAS;EACvC,MAAM,wBAAQ,IAAI,KAAK;EAGvB,IAAI,YAAY,OACd,OAAO,YAAY,MAAM,OAAO;EAIlC,IAAI,MAAM,MAAM,YAAY,IAAI,UAAU,YAAY;EACtD,MAAM,YAAY,MAAM,SAAS,IAAI,UAAU,SAAS;EAExD,IAAI,YAAY,KAAM,cAAc,KAAK,MAAM,QAAQ,IAAI,UAAU,QAAQ,GAC3E;EAIF,MAAM,SAAS,KAAK,QAAQ,QAAQ,UAAU;EAC9C,IAAI,MAAM,QACR,OAAO,YAAY,MAAM,OAAO;EAIlC,MAAM,SAAS,KAAK,QAAQ,QAAQ,UAAU;EAC9C,IAAI,MAAM,QACR,OAAO,YAAY,MAAM,OAAO;EAGlC,OAAO;CACT;AACF;;;;AAKA,MAAa,iBAAiE;CAC5E,MAAM;CACN,qBAAqB;CACrB,MAAM,SAAS,OAAa,SAAS;EACnC,MAAM,YAAY,IAAI,KAAK,KAAK;EAChC,MAAM,wBAAQ,IAAI,KAAK;EACvB,IAAI,MAAM,MAAM,YAAY,IAAI,UAAU,YAAY;EACtD,MAAM,YAAY,MAAM,SAAS,IAAI,UAAU,SAAS;EAExD,IAAI,YAAY,KAAM,cAAc,KAAK,MAAM,QAAQ,IAAI,UAAU,QAAQ,GAC3E;EAGF,MAAM,EAAE,QAAQ,WAAW,KAAK,QAAQ;EAExC,IAAI,OAAO,UAAU,OAAO,QAC1B,OAAO;EAGT,KAAK,QAAQ,kBAAkB,SAAS;EACxC,KAAK,QAAQ,kBAAkB,SAAS;EAExC,OAAO,YAAY,MAAM,OAAO;CAClC;AACF;;;;AAKA,MAAa,eAA2B;CACtC,MAAM;CACN,qBAAqB;CACrB,MAAM,SAAS,OAAa,SAAS;EAEnC,MAAM,OAAO,IADS,KAAK,KACN,CAAC,CAAC,YAAY;EAKnC,IAFoB,OAAO,MAAM,KAAK,OAAO,QAAQ,KAAM,OAAO,QAAQ,GAGxE,OAAO;EAGT,OAAO,YAAY,MAAM,OAAO;CAClC;AACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"date.d.mts","names":[],"sources":["../../../../../../../../seal/src/rules/date/date.ts"],"mappings":";;;;;;
|
|
1
|
+
{"version":3,"file":"date.d.mts","names":[],"sources":["../../../../../../../../seal/src/rules/date/date.ts"],"mappings":";;;;;;cAUa,QAAA,EAAU,UAUtB;;;;AAAA;cAMY,WAAA,EAAa,UAAU;EAClC,WAAA,EAAa,IAAA;EACb,KAAA;AAAA;;;;;cAqCW,WAAA,EAAa,UAAU;EAClC,WAAA,EAAa,IAAA;EACb,KAAA;AAAA;;;;cAmCW,aAAA,EAAe,UAc3B;;;;cAKY,eAAA,EAAiB,UAc7B;AAjCD;;;AAAA,cAsCa,YAAA,EAAc,UAAU;EAAG,IAAI;AAAA;;;;cAmB/B,cAAA,EAAgB,UAAU;EAAG,IAAI;AAAA;;;AAnBF;cAsC/B,gBAAA,EAAkB,UAAU;EACvC,SAAA;EACA,OAAA;AAAA;AArB4C;AAmB9C;;AAnB8C,cA2CjC,cAAA,EAAgB,UAAU;EAAG,MAAM;AAAA;;;;cAoBnC,gBAAA,EAAkB,UAAU;EAAG,MAAM;AAAA;;;AApBF;cAwCnC,kBAAA,EAAoB,UAAU;EACzC,WAAA;EACA,SAAA;AAAA;AAtBgD;AAoBlD;;AApBkD,cA6CrC,OAAA,EAAS,UAAU;EAAG,KAAK;AAAA;;;;cA0B3B,UAAA,EAAY,UAAU;EAAG,KAAK;AAAA;;;AA1BH;cAoD3B,UAAA,EAAY,UAAU;EAAG,KAAK;AAAA;;AA1BA;AA0B3C;cA0Ba,WAAA,EAAa,UAAU;EAAG,GAAA,EAAK,OAAA;AAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"date.mjs","names":[],"sources":["../../../../../../../../seal/src/rules/date/date.ts"],"sourcesContent":["import { get } from \"@mongez/reinforcements\";\r\nimport { invalidRule, VALID_RULE } from \"../../helpers\";\r\nimport { isDateValue } from \"../../helpers/date-helpers\";\r\nimport type { SchemaRule } from \"../../types\";\r\nimport type { WeekDay } from \"../../types/date-types\";\r\nimport { WEEK_DAYS } from \"../../types/date-types\";\r\n\r\n/**\r\n * Date rule - validates date format\r\n */\r\nexport const dateRule: SchemaRule = {\r\n name: \"date\",\r\n defaultErrorMessage: \"The :input must be a valid date\",\r\n async validate(value: any, context) {\r\n if (value instanceof Date && !isNaN(value.getTime())) {\r\n return VALID_RULE;\r\n }\r\n\r\n return invalidRule(this, context);\r\n },\r\n};\r\n\r\n/**\r\n * Min date rule - date must be >= given date or field\r\n * Smart detection: date value or field name\r\n */\r\nexport const minDateRule: SchemaRule<{\r\n dateOrField: Date | string | number;\r\n scope?: \"global\" | \"sibling\";\r\n}> = {\r\n name: \"minDate\",\r\n description: \"The field must be at least the given date or field\",\r\n defaultErrorMessage: \"The :input must be at least :dateOrField\",\r\n async validate(value: Date, context) {\r\n const { dateOrField, scope = \"global\" } = this.context.options;\r\n let compareDate: Date;\r\n\r\n if (isDateValue(dateOrField)) {\r\n // Value comparison\r\n compareDate = new Date(dateOrField);\r\n } else {\r\n // Field comparison\r\n const source = scope === \"sibling\" ? context.parent : context.allValues;\r\n const fieldValue = get(source, dateOrField as string);\r\n\r\n if (fieldValue === undefined) {\r\n return VALID_RULE;\r\n }\r\n\r\n compareDate = new Date(fieldValue);\r\n }\r\n\r\n const inputDate = new Date(value);\r\n\r\n if (inputDate >= compareDate) {\r\n return VALID_RULE;\r\n }\r\n return invalidRule(this, context);\r\n },\r\n};\r\n\r\n/**\r\n * Max date rule - date must be <= given date or field\r\n * Smart detection: date value or field name\r\n */\r\nexport const maxDateRule: SchemaRule<{\r\n dateOrField: Date | string | number;\r\n scope?: \"global\" | \"sibling\";\r\n}> = {\r\n name: \"maxDate\",\r\n defaultErrorMessage: \"The :input must be at most :dateOrField\",\r\n async validate(value: Date, context) {\r\n const { dateOrField, scope = \"global\" } = this.context.options;\r\n let compareDate: Date;\r\n\r\n if (isDateValue(dateOrField)) {\r\n // Value comparison\r\n compareDate = new Date(dateOrField);\r\n } else {\r\n // Field comparison\r\n const source = scope === \"sibling\" ? context.parent : context.allValues;\r\n const fieldValue = get(source, dateOrField as string);\r\n\r\n if (fieldValue === undefined) {\r\n return VALID_RULE;\r\n }\r\n\r\n compareDate = new Date(fieldValue);\r\n }\r\n\r\n const inputDate = new Date(value);\r\n\r\n if (inputDate <= compareDate) {\r\n return VALID_RULE;\r\n }\r\n return invalidRule(this, context);\r\n },\r\n};\r\n\r\n/**\r\n * From today rule - date must be today or in the future\r\n */\r\nexport const fromTodayRule: SchemaRule = {\r\n name: \"fromToday\",\r\n defaultErrorMessage: \"The :input must be today or in the future\",\r\n async validate(value: Date, context) {\r\n const today = new Date();\r\n today.setHours(0, 0, 0, 0);\r\n const inputDate = new Date(value);\r\n inputDate.setHours(0, 0, 0, 0);\r\n\r\n if (inputDate >= today) {\r\n return VALID_RULE;\r\n }\r\n return invalidRule(this, context);\r\n },\r\n};\r\n\r\n/**\r\n * Before today rule - date must be before today\r\n */\r\nexport const beforeTodayRule: SchemaRule = {\r\n name: \"beforeToday\",\r\n defaultErrorMessage: \"The :input must be before today\",\r\n async validate(value: Date, context) {\r\n const today = new Date();\r\n today.setHours(0, 0, 0, 0);\r\n const inputDate = new Date(value);\r\n inputDate.setHours(0, 0, 0, 0);\r\n\r\n if (inputDate < today) {\r\n return VALID_RULE;\r\n }\r\n return invalidRule(this, context);\r\n },\r\n};\r\n\r\n/**\r\n * From hour rule - time must be from specific hour onwards\r\n */\r\nexport const fromHourRule: SchemaRule<{ hour: number }> = {\r\n name: \"fromHour\",\r\n defaultErrorMessage: \"The :input must be from :hour:00 onwards\",\r\n async validate(value: Date, context) {\r\n const inputDate = new Date(value);\r\n const hour = inputDate.getHours();\r\n\r\n if (hour >= this.context.options.hour) {\r\n return VALID_RULE;\r\n }\r\n\r\n this.context.translationParams.hour = this.context.options.hour;\r\n return invalidRule(this, context);\r\n },\r\n};\r\n\r\n/**\r\n * Before hour rule - time must be before specific hour\r\n */\r\nexport const beforeHourRule: SchemaRule<{ hour: number }> = {\r\n name: \"beforeHour\",\r\n defaultErrorMessage: \"The :input must be before :hour:00\",\r\n async validate(value: Date, context) {\r\n const inputDate = new Date(value);\r\n const hour = inputDate.getHours();\r\n\r\n if (hour < this.context.options.hour) {\r\n return VALID_RULE;\r\n }\r\n\r\n this.context.translationParams.hour = this.context.options.hour;\r\n return invalidRule(this, context);\r\n },\r\n};\r\n\r\n/**\r\n * Between hours rule - time must be between start and end hours\r\n */\r\nexport const betweenHoursRule: SchemaRule<{\r\n startHour: number;\r\n endHour: number;\r\n}> = {\r\n name: \"betweenHours\",\r\n defaultErrorMessage: \"The :input must be between :startHour:00 and :endHour:00\",\r\n async validate(value: Date, context) {\r\n const inputDate = new Date(value);\r\n const hour = inputDate.getHours();\r\n const { startHour, endHour } = this.context.options;\r\n\r\n if (hour >= startHour && hour <= endHour) {\r\n return VALID_RULE;\r\n }\r\n\r\n this.context.translationParams.startHour = startHour;\r\n this.context.translationParams.endHour = endHour;\r\n return invalidRule(this, context);\r\n },\r\n};\r\n\r\n/**\r\n * From minute rule - time must be from specific minute onwards\r\n */\r\nexport const fromMinuteRule: SchemaRule<{ minute: number }> = {\r\n name: \"fromMinute\",\r\n defaultErrorMessage: \"The :input must be from minute :minute onwards\",\r\n async validate(value: Date, context) {\r\n const inputDate = new Date(value);\r\n const minute = inputDate.getMinutes();\r\n\r\n if (minute >= this.context.options.minute) {\r\n return VALID_RULE;\r\n }\r\n\r\n this.context.translationParams.minute = this.context.options.minute;\r\n\r\n return invalidRule(this, context);\r\n },\r\n};\r\n\r\n/**\r\n * Before minute rule - time must be before specific minute\r\n */\r\nexport const beforeMinuteRule: SchemaRule<{ minute: number }> = {\r\n name: \"beforeMinute\",\r\n defaultErrorMessage: \"The :input must be before minute :minute\",\r\n async validate(value: Date, context) {\r\n const inputDate = new Date(value);\r\n const minute = inputDate.getMinutes();\r\n\r\n if (minute < this.context.options.minute) {\r\n return VALID_RULE;\r\n }\r\n\r\n this.context.translationParams.minute = this.context.options.minute;\r\n\r\n return invalidRule(this, context);\r\n },\r\n};\r\n\r\n/**\r\n * Between minutes rule - time must be between start and end minutes\r\n */\r\nexport const betweenMinutesRule: SchemaRule<{\r\n startMinute: number;\r\n endMinute: number;\r\n}> = {\r\n name: \"betweenMinutes\",\r\n defaultErrorMessage: \"The :input must be between minute :startMinute and :endMinute\",\r\n async validate(value: Date, context) {\r\n const inputDate = new Date(value);\r\n const minute = inputDate.getMinutes();\r\n const { startMinute, endMinute } = this.context.options;\r\n\r\n if (minute >= startMinute && minute <= endMinute) {\r\n return VALID_RULE;\r\n }\r\n\r\n this.context.translationParams.startMinute = startMinute;\r\n this.context.translationParams.endMinute = endMinute;\r\n\r\n return invalidRule(this, context);\r\n },\r\n};\r\n\r\n/**\r\n * Age rule - calculate age from date\r\n */\r\nexport const ageRule: SchemaRule<{ years: number }> = {\r\n name: \"age\",\r\n defaultErrorMessage: \"The :input must be exactly :years years old\",\r\n async validate(value: Date, context) {\r\n const birthDate = new Date(value);\r\n const today = new Date();\r\n let age = today.getFullYear() - birthDate.getFullYear();\r\n const monthDiff = today.getMonth() - birthDate.getMonth();\r\n\r\n if (monthDiff < 0 || (monthDiff === 0 && today.getDate() < birthDate.getDate())) {\r\n age--;\r\n }\r\n\r\n if (age === this.context.options.years) {\r\n return VALID_RULE;\r\n }\r\n\r\n this.context.translationParams.years = this.context.options.years;\r\n\r\n return invalidRule(this, context);\r\n },\r\n};\r\n\r\n/**\r\n * Min age rule - minimum age requirement\r\n */\r\nexport const minAgeRule: SchemaRule<{ years: number }> = {\r\n name: \"minAge\",\r\n defaultErrorMessage: \"The :input must be at least :years years old\",\r\n async validate(value: Date, context) {\r\n const birthDate = new Date(value);\r\n const today = new Date();\r\n let age = today.getFullYear() - birthDate.getFullYear();\r\n const monthDiff = today.getMonth() - birthDate.getMonth();\r\n\r\n if (monthDiff < 0 || (monthDiff === 0 && today.getDate() < birthDate.getDate())) {\r\n age--;\r\n }\r\n\r\n if (age >= this.context.options.years) {\r\n return VALID_RULE;\r\n }\r\n\r\n this.context.translationParams.years = this.context.options.years;\r\n\r\n return invalidRule(this, context);\r\n },\r\n};\r\n\r\n/**\r\n * Max age rule - maximum age requirement\r\n */\r\nexport const maxAgeRule: SchemaRule<{ years: number }> = {\r\n name: \"maxAge\",\r\n defaultErrorMessage: \"The :input must be at most :years years old\",\r\n async validate(value: Date, context) {\r\n const birthDate = new Date(value);\r\n const today = new Date();\r\n let age = today.getFullYear() - birthDate.getFullYear();\r\n const monthDiff = today.getMonth() - birthDate.getMonth();\r\n\r\n if (monthDiff < 0 || (monthDiff === 0 && today.getDate() < birthDate.getDate())) {\r\n age--;\r\n }\r\n\r\n if (age <= this.context.options.years) {\r\n return VALID_RULE;\r\n }\r\n\r\n this.context.translationParams.years = this.context.options.years;\r\n\r\n return invalidRule(this, context);\r\n },\r\n};\r\n\r\n/**\r\n * Week day rule - date must be specific weekday\r\n */\r\nexport const weekDayRule: SchemaRule<{ day: WeekDay }> = {\r\n name: \"weekDay\",\r\n defaultErrorMessage: \"The :input must be a :day\",\r\n async validate(value: Date, context) {\r\n const inputDate = new Date(value);\r\n const dayOfWeek = inputDate.getDay();\r\n const expectedDay = WEEK_DAYS[this.context.options.day];\r\n\r\n if (dayOfWeek === expectedDay) {\r\n return VALID_RULE;\r\n }\r\n\r\n this.context.translatableParams.day = this.context.options.day;\r\n\r\n return invalidRule(this, context);\r\n },\r\n};\r\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"date.mjs","names":[],"sources":["../../../../../../../../seal/src/rules/date/date.ts"],"sourcesContent":["import { get } from \"@mongez/reinforcements\";\nimport { invalidRule, VALID_RULE } from \"../../helpers\";\nimport { isDateValue } from \"../../helpers/date-helpers\";\nimport type { SchemaRule } from \"../../types\";\nimport type { WeekDay } from \"../../types/date-types\";\nimport { WEEK_DAYS } from \"../../types/date-types\";\n\n/**\n * Date rule - validates date format\n */\nexport const dateRule: SchemaRule = {\n name: \"date\",\n defaultErrorMessage: \"The :input must be a valid date\",\n async validate(value: any, context) {\n if (value instanceof Date && !isNaN(value.getTime())) {\n return VALID_RULE;\n }\n\n return invalidRule(this, context);\n },\n};\n\n/**\n * Min date rule - date must be >= given date or field\n * Smart detection: date value or field name\n */\nexport const minDateRule: SchemaRule<{\n dateOrField: Date | string | number;\n scope?: \"global\" | \"sibling\";\n}> = {\n name: \"minDate\",\n description: \"The field must be at least the given date or field\",\n defaultErrorMessage: \"The :input must be at least :dateOrField\",\n async validate(value: Date, context) {\n const { dateOrField, scope = \"global\" } = this.context.options;\n let compareDate: Date;\n\n if (isDateValue(dateOrField)) {\n // Value comparison\n compareDate = new Date(dateOrField);\n } else {\n // Field comparison\n const source = scope === \"sibling\" ? context.parent : context.allValues;\n const fieldValue = get(source, dateOrField as string);\n\n if (fieldValue === undefined) {\n return VALID_RULE;\n }\n\n compareDate = new Date(fieldValue);\n }\n\n const inputDate = new Date(value);\n\n if (inputDate >= compareDate) {\n return VALID_RULE;\n }\n return invalidRule(this, context);\n },\n};\n\n/**\n * Max date rule - date must be <= given date or field\n * Smart detection: date value or field name\n */\nexport const maxDateRule: SchemaRule<{\n dateOrField: Date | string | number;\n scope?: \"global\" | \"sibling\";\n}> = {\n name: \"maxDate\",\n defaultErrorMessage: \"The :input must be at most :dateOrField\",\n async validate(value: Date, context) {\n const { dateOrField, scope = \"global\" } = this.context.options;\n let compareDate: Date;\n\n if (isDateValue(dateOrField)) {\n // Value comparison\n compareDate = new Date(dateOrField);\n } else {\n // Field comparison\n const source = scope === \"sibling\" ? context.parent : context.allValues;\n const fieldValue = get(source, dateOrField as string);\n\n if (fieldValue === undefined) {\n return VALID_RULE;\n }\n\n compareDate = new Date(fieldValue);\n }\n\n const inputDate = new Date(value);\n\n if (inputDate <= compareDate) {\n return VALID_RULE;\n }\n return invalidRule(this, context);\n },\n};\n\n/**\n * From today rule - date must be today or in the future\n */\nexport const fromTodayRule: SchemaRule = {\n name: \"fromToday\",\n defaultErrorMessage: \"The :input must be today or in the future\",\n async validate(value: Date, context) {\n const today = new Date();\n today.setHours(0, 0, 0, 0);\n const inputDate = new Date(value);\n inputDate.setHours(0, 0, 0, 0);\n\n if (inputDate >= today) {\n return VALID_RULE;\n }\n return invalidRule(this, context);\n },\n};\n\n/**\n * Before today rule - date must be before today\n */\nexport const beforeTodayRule: SchemaRule = {\n name: \"beforeToday\",\n defaultErrorMessage: \"The :input must be before today\",\n async validate(value: Date, context) {\n const today = new Date();\n today.setHours(0, 0, 0, 0);\n const inputDate = new Date(value);\n inputDate.setHours(0, 0, 0, 0);\n\n if (inputDate < today) {\n return VALID_RULE;\n }\n return invalidRule(this, context);\n },\n};\n\n/**\n * From hour rule - time must be from specific hour onwards\n */\nexport const fromHourRule: SchemaRule<{ hour: number }> = {\n name: \"fromHour\",\n defaultErrorMessage: \"The :input must be from :hour:00 onwards\",\n async validate(value: Date, context) {\n const inputDate = new Date(value);\n const hour = inputDate.getHours();\n\n if (hour >= this.context.options.hour) {\n return VALID_RULE;\n }\n\n this.context.translationParams.hour = this.context.options.hour;\n return invalidRule(this, context);\n },\n};\n\n/**\n * Before hour rule - time must be before specific hour\n */\nexport const beforeHourRule: SchemaRule<{ hour: number }> = {\n name: \"beforeHour\",\n defaultErrorMessage: \"The :input must be before :hour:00\",\n async validate(value: Date, context) {\n const inputDate = new Date(value);\n const hour = inputDate.getHours();\n\n if (hour < this.context.options.hour) {\n return VALID_RULE;\n }\n\n this.context.translationParams.hour = this.context.options.hour;\n return invalidRule(this, context);\n },\n};\n\n/**\n * Between hours rule - time must be between start and end hours\n */\nexport const betweenHoursRule: SchemaRule<{\n startHour: number;\n endHour: number;\n}> = {\n name: \"betweenHours\",\n defaultErrorMessage: \"The :input must be between :startHour:00 and :endHour:00\",\n async validate(value: Date, context) {\n const inputDate = new Date(value);\n const hour = inputDate.getHours();\n const { startHour, endHour } = this.context.options;\n\n if (hour >= startHour && hour <= endHour) {\n return VALID_RULE;\n }\n\n this.context.translationParams.startHour = startHour;\n this.context.translationParams.endHour = endHour;\n return invalidRule(this, context);\n },\n};\n\n/**\n * From minute rule - time must be from specific minute onwards\n */\nexport const fromMinuteRule: SchemaRule<{ minute: number }> = {\n name: \"fromMinute\",\n defaultErrorMessage: \"The :input must be from minute :minute onwards\",\n async validate(value: Date, context) {\n const inputDate = new Date(value);\n const minute = inputDate.getMinutes();\n\n if (minute >= this.context.options.minute) {\n return VALID_RULE;\n }\n\n this.context.translationParams.minute = this.context.options.minute;\n\n return invalidRule(this, context);\n },\n};\n\n/**\n * Before minute rule - time must be before specific minute\n */\nexport const beforeMinuteRule: SchemaRule<{ minute: number }> = {\n name: \"beforeMinute\",\n defaultErrorMessage: \"The :input must be before minute :minute\",\n async validate(value: Date, context) {\n const inputDate = new Date(value);\n const minute = inputDate.getMinutes();\n\n if (minute < this.context.options.minute) {\n return VALID_RULE;\n }\n\n this.context.translationParams.minute = this.context.options.minute;\n\n return invalidRule(this, context);\n },\n};\n\n/**\n * Between minutes rule - time must be between start and end minutes\n */\nexport const betweenMinutesRule: SchemaRule<{\n startMinute: number;\n endMinute: number;\n}> = {\n name: \"betweenMinutes\",\n defaultErrorMessage: \"The :input must be between minute :startMinute and :endMinute\",\n async validate(value: Date, context) {\n const inputDate = new Date(value);\n const minute = inputDate.getMinutes();\n const { startMinute, endMinute } = this.context.options;\n\n if (minute >= startMinute && minute <= endMinute) {\n return VALID_RULE;\n }\n\n this.context.translationParams.startMinute = startMinute;\n this.context.translationParams.endMinute = endMinute;\n\n return invalidRule(this, context);\n },\n};\n\n/**\n * Age rule - calculate age from date\n */\nexport const ageRule: SchemaRule<{ years: number }> = {\n name: \"age\",\n defaultErrorMessage: \"The :input must be exactly :years years old\",\n async validate(value: Date, context) {\n const birthDate = new Date(value);\n const today = new Date();\n let age = today.getFullYear() - birthDate.getFullYear();\n const monthDiff = today.getMonth() - birthDate.getMonth();\n\n if (monthDiff < 0 || (monthDiff === 0 && today.getDate() < birthDate.getDate())) {\n age--;\n }\n\n if (age === this.context.options.years) {\n return VALID_RULE;\n }\n\n this.context.translationParams.years = this.context.options.years;\n\n return invalidRule(this, context);\n },\n};\n\n/**\n * Min age rule - minimum age requirement\n */\nexport const minAgeRule: SchemaRule<{ years: number }> = {\n name: \"minAge\",\n defaultErrorMessage: \"The :input must be at least :years years old\",\n async validate(value: Date, context) {\n const birthDate = new Date(value);\n const today = new Date();\n let age = today.getFullYear() - birthDate.getFullYear();\n const monthDiff = today.getMonth() - birthDate.getMonth();\n\n if (monthDiff < 0 || (monthDiff === 0 && today.getDate() < birthDate.getDate())) {\n age--;\n }\n\n if (age >= this.context.options.years) {\n return VALID_RULE;\n }\n\n this.context.translationParams.years = this.context.options.years;\n\n return invalidRule(this, context);\n },\n};\n\n/**\n * Max age rule - maximum age requirement\n */\nexport const maxAgeRule: SchemaRule<{ years: number }> = {\n name: \"maxAge\",\n defaultErrorMessage: \"The :input must be at most :years years old\",\n async validate(value: Date, context) {\n const birthDate = new Date(value);\n const today = new Date();\n let age = today.getFullYear() - birthDate.getFullYear();\n const monthDiff = today.getMonth() - birthDate.getMonth();\n\n if (monthDiff < 0 || (monthDiff === 0 && today.getDate() < birthDate.getDate())) {\n age--;\n }\n\n if (age <= this.context.options.years) {\n return VALID_RULE;\n }\n\n this.context.translationParams.years = this.context.options.years;\n\n return invalidRule(this, context);\n },\n};\n\n/**\n * Week day rule - date must be specific weekday\n */\nexport const weekDayRule: SchemaRule<{ day: WeekDay }> = {\n name: \"weekDay\",\n defaultErrorMessage: \"The :input must be a :day\",\n async validate(value: Date, context) {\n const inputDate = new Date(value);\n const dayOfWeek = inputDate.getDay();\n const expectedDay = WEEK_DAYS[this.context.options.day];\n\n if (dayOfWeek === expectedDay) {\n return VALID_RULE;\n }\n\n this.context.translatableParams.day = this.context.options.day;\n\n return invalidRule(this, context);\n },\n};\n"],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { ageRule, beforeHourRule, beforeMinuteRule, beforeTodayRule, betweenHoursRule, betweenMinutesRule, dateRule, fromHourRule, fromMinuteRule, fromTodayRule, maxAgeRule, maxDateRule, minAgeRule, minDateRule, weekDayRule } from "./date.mjs";
|
|
2
|
+
import { afterTodayRule, betweenDatesRule, futureRule, pastRule, todayRule } from "./date-comparison-rules.mjs";
|
|
3
|
+
import { businessDayRule, weekdayRule, weekdaysRule, weekendRule } from "./date-day-rules.mjs";
|
|
4
|
+
import { afterFieldRule, beforeFieldRule, sameAsFieldDateRule } from "./date-field-comparison-rules.mjs";
|
|
5
|
+
import { Month, betweenDaysRule, betweenMonthsRule, betweenTimesRule, betweenYearsRule, maxDayRule, maxMonthRule, maxYearRule, minDayRule, minMonthRule, minYearRule, monthRule, quarterRule, yearRule } from "./date-period-rules.mjs";
|
|
6
|
+
import { withinDaysRule, withinFutureDaysRule, withinPastDaysRule } from "./date-relative-rules.mjs";
|
|
7
|
+
import { betweenAgeRule, birthdayRule, leapYearRule } from "./date-special-rules.mjs";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dimensions.d.mts","names":[],"sources":["../../../../../../../../seal/src/rules/file/dimensions.ts"],"mappings":";;;;;
|
|
1
|
+
{"version":3,"file":"dimensions.d.mts","names":[],"sources":["../../../../../../../../seal/src/rules/file/dimensions.ts"],"mappings":";;;;;cAMa,YAAA,EAAc,UAAU;EAAG,QAAQ;AAAA;;AAAA;AAmBhD;cAAa,YAAA,EAAc,UAAU;EAAG,QAAQ;AAAA;AAAA;AAmBhD;;AAnBgD,cAmBnC,aAAA,EAAe,UAAU;EAAG,SAAS;AAAA;AAmBlD;;;AAAA,cAAa,aAAA,EAAe,UAAU;EAAG,SAAS;AAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dimensions.mjs","names":[],"sources":["../../../../../../../../seal/src/rules/file/dimensions.ts"],"sourcesContent":["import { invalidRule, VALID_RULE } from \"../../helpers\";\
|
|
1
|
+
{"version":3,"file":"dimensions.mjs","names":[],"sources":["../../../../../../../../seal/src/rules/file/dimensions.ts"],"sourcesContent":["import { invalidRule, VALID_RULE } from \"../../helpers\";\nimport type { SchemaRule } from \"../../types\";\n\n/**\n * Min width rule - image width validation\n */\nexport const minWidthRule: SchemaRule<{ minWidth: number }> = {\n name: \"minWidth\",\n defaultErrorMessage: \"The :input must be at least :minWidth pixels wide\",\n async validate(value: any, context) {\n const dimensions = await value.dimensions();\n\n if (dimensions.width >= this.context.options.minWidth) {\n return VALID_RULE;\n }\n\n this.context.translationParams.minWidth = this.context.options.minWidth;\n\n return invalidRule(this, context);\n },\n};\n\n/**\n * Max width rule - image width validation\n */\nexport const maxWidthRule: SchemaRule<{ maxWidth: number }> = {\n name: \"maxWidth\",\n defaultErrorMessage: \"The :input must be at most :maxWidth pixels wide\",\n async validate(value: any, context) {\n const dimensions = await value.dimensions();\n\n if (dimensions.width <= this.context.options.maxWidth) {\n return VALID_RULE;\n }\n\n this.context.translationParams.maxWidth = this.context.options.maxWidth;\n\n return invalidRule(this, context);\n },\n};\n\n/**\n * Min height rule - image height validation\n */\nexport const minHeightRule: SchemaRule<{ minHeight: number }> = {\n name: \"minHeight\",\n defaultErrorMessage: \"The :input must be at least :minHeight pixels tall\",\n async validate(value: any, context) {\n const dimensions = await value.dimensions();\n\n if (dimensions.height >= this.context.options.minHeight) {\n return VALID_RULE;\n }\n\n this.context.translationParams.minHeight = this.context.options.minHeight;\n\n return invalidRule(this, context);\n },\n};\n\n/**\n * Max height rule - image height validation\n */\nexport const maxHeightRule: SchemaRule<{ maxHeight: number }> = {\n name: \"maxHeight\",\n defaultErrorMessage: \"The :input must be at most :maxHeight pixels tall\",\n async validate(value: any, context) {\n const dimensions = await value.dimensions();\n\n if (dimensions.height <= this.context.options.maxHeight) {\n return VALID_RULE;\n }\n\n this.context.translationParams.maxHeight = this.context.options.maxHeight;\n\n return invalidRule(this, context);\n },\n};\n"],"mappings":";;;;;;;AAMA,MAAa,eAAiD;CAC5D,MAAM;CACN,qBAAqB;CACrB,MAAM,SAAS,OAAY,SAAS;EAGlC,KAAI,MAFqB,MAAM,WAAW,EAE5B,CAAC,SAAS,KAAK,QAAQ,QAAQ,UAC3C,OAAO;EAGT,KAAK,QAAQ,kBAAkB,WAAW,KAAK,QAAQ,QAAQ;EAE/D,OAAO,YAAY,MAAM,OAAO;CAClC;AACF;;;;AAKA,MAAa,eAAiD;CAC5D,MAAM;CACN,qBAAqB;CACrB,MAAM,SAAS,OAAY,SAAS;EAGlC,KAAI,MAFqB,MAAM,WAAW,EAE5B,CAAC,SAAS,KAAK,QAAQ,QAAQ,UAC3C,OAAO;EAGT,KAAK,QAAQ,kBAAkB,WAAW,KAAK,QAAQ,QAAQ;EAE/D,OAAO,YAAY,MAAM,OAAO;CAClC;AACF;;;;AAKA,MAAa,gBAAmD;CAC9D,MAAM;CACN,qBAAqB;CACrB,MAAM,SAAS,OAAY,SAAS;EAGlC,KAAI,MAFqB,MAAM,WAAW,EAE5B,CAAC,UAAU,KAAK,QAAQ,QAAQ,WAC5C,OAAO;EAGT,KAAK,QAAQ,kBAAkB,YAAY,KAAK,QAAQ,QAAQ;EAEhE,OAAO,YAAY,MAAM,OAAO;CAClC;AACF;;;;AAKA,MAAa,gBAAmD;CAC9D,MAAM;CACN,qBAAqB;CACrB,MAAM,SAAS,OAAY,SAAS;EAGlC,KAAI,MAFqB,MAAM,WAAW,EAE5B,CAAC,UAAU,KAAK,QAAQ,QAAQ,WAC5C,OAAO;EAGT,KAAK,QAAQ,kBAAkB,YAAY,KAAK,QAAQ,QAAQ;EAEhE,OAAO,YAAY,MAAM,OAAO;CAClC;AACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"file-size.d.mts","names":[],"sources":["../../../../../../../../seal/src/rules/file/file-size.ts"],"mappings":";;;;;
|
|
1
|
+
{"version":3,"file":"file-size.d.mts","names":[],"sources":["../../../../../../../../seal/src/rules/file/file-size.ts"],"mappings":";;;;;cAMa,eAAA,EAAiB,UAAU;EAAG,OAAO;AAAA;;AAAA;AAmBlD;cAAa,eAAA,EAAiB,UAAU;EAAG,OAAO;AAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"file-size.mjs","names":[],"sources":["../../../../../../../../seal/src/rules/file/file-size.ts"],"sourcesContent":["import { humanizeSize, invalidRule, VALID_RULE } from \"../../helpers\";\
|
|
1
|
+
{"version":3,"file":"file-size.mjs","names":[],"sources":["../../../../../../../../seal/src/rules/file/file-size.ts"],"sourcesContent":["import { humanizeSize, invalidRule, VALID_RULE } from \"../../helpers\";\nimport type { SchemaRule } from \"../../types\";\n\n/**\n * Max file size rule\n */\nexport const maxFileSizeRule: SchemaRule<{ maxSize: number }> = {\n name: \"maxFileSize\",\n defaultErrorMessage: \"The :input must not exceed :maxSize\",\n async validate(value: any, context) {\n const size = typeof value.size === \"function\" ? await value.size() : value.size;\n\n if (size <= this.context.options.maxSize) {\n return VALID_RULE;\n }\n\n this.context.translationParams.maxSize = humanizeSize(this.context.options.maxSize);\n\n return invalidRule(this, context);\n },\n};\n\n/**\n * Min file size rule\n */\nexport const minFileSizeRule: SchemaRule<{ minSize: number }> = {\n name: \"minFileSize\",\n defaultErrorMessage: \"The :input must be at least :minSize\",\n async validate(value: any, context) {\n const size = typeof value.size === \"function\" ? await value.size() : value.size;\n\n if (size >= this.context.options.minSize) {\n return VALID_RULE;\n }\n\n this.context.translationParams.minSize = humanizeSize(this.context.options.minSize);\n\n return invalidRule(this, context);\n },\n};\n"],"mappings":";;;;;;;;AAMA,MAAa,kBAAmD;CAC9D,MAAM;CACN,qBAAqB;CACrB,MAAM,SAAS,OAAY,SAAS;EAGlC,KAFa,OAAO,MAAM,SAAS,aAAa,MAAM,MAAM,KAAK,IAAI,MAAM,SAE/D,KAAK,QAAQ,QAAQ,SAC/B,OAAO;EAGT,KAAK,QAAQ,kBAAkB,UAAU,aAAa,KAAK,QAAQ,QAAQ,OAAO;EAElF,OAAO,YAAY,MAAM,OAAO;CAClC;AACF;;;;AAKA,MAAa,kBAAmD;CAC9D,MAAM;CACN,qBAAqB;CACrB,MAAM,SAAS,OAAY,SAAS;EAGlC,KAFa,OAAO,MAAM,SAAS,aAAa,MAAM,MAAM,KAAK,IAAI,MAAM,SAE/D,KAAK,QAAQ,QAAQ,SAC/B,OAAO;EAGT,KAAK,QAAQ,kBAAkB,UAAU,aAAa,KAAK,QAAQ,QAAQ,OAAO;EAElF,OAAO,YAAY,MAAM,OAAO;CAClC;AACF"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { equalRule } from "./core/equal.mjs";
|
|
2
|
+
import { forbiddenRule } from "./core/forbidden.mjs";
|
|
3
|
+
import { presentRule, requiredRule } from "./core/required.mjs";
|
|
4
|
+
import { unionRule } from "./core/union.mjs";
|
|
5
|
+
import { whenRule } from "./core/when.mjs";
|
|
6
|
+
import { alphaNumericRule, alphaRule, isNumericRule } from "./string/alpha.mjs";
|
|
7
|
+
import { isCreditCardRule } from "./string/credit-card.mjs";
|
|
8
|
+
import { emailRule } from "./string/email.mjs";
|
|
9
|
+
import { UUIDVersion, cuidRule, nanoidRule, ulidRule, uuidRule } from "./string/id-formats.mjs";
|
|
10
|
+
import { ip4Rule, ip6Rule, ipRule, isIP, isIPv4, isIPv6 } from "./string/ip.mjs";
|
|
11
|
+
import { matchesRule } from "./string/matches.mjs";
|
|
12
|
+
import { patternRule } from "./string/pattern.mjs";
|
|
13
|
+
import { containsRule, endsWithRule, notContainsRule, startsWithRule } from "./string/string-comparison.mjs";
|
|
14
|
+
import { strongPasswordRule } from "./string/strong-password-rule.mjs";
|
|
15
|
+
import { urlRule } from "./string/url.mjs";
|
|
16
|
+
import { withoutWhitespaceRule } from "./string/without-whitespace.mjs";
|
|
17
|
+
import { betweenNumbersRule, evenRule, greaterThanRule, lessThanRule, maxRule, minRule, moduloRule, negativeRule, oddRule, positiveRule } from "./number/number-rules.mjs";
|
|
18
|
+
import { betweenLengthRule, lengthRule, maxLengthRule, maxWordsRule, minLengthRule, minWordsRule, wordsRule } from "./length/length-rules.mjs";
|
|
19
|
+
import { sortedArrayRule, uniqueArrayRule } from "./array/array-rules.mjs";
|
|
20
|
+
import { ageRule, beforeHourRule, beforeMinuteRule, beforeTodayRule, betweenHoursRule, betweenMinutesRule, dateRule, fromHourRule, fromMinuteRule, fromTodayRule, maxAgeRule, maxDateRule, minAgeRule, minDateRule, weekDayRule } from "./date/date.mjs";
|
|
21
|
+
import { afterTodayRule, betweenDatesRule, futureRule, pastRule, todayRule } from "./date/date-comparison-rules.mjs";
|
|
22
|
+
import { businessDayRule, weekdayRule, weekdaysRule, weekendRule } from "./date/date-day-rules.mjs";
|
|
23
|
+
import { afterFieldRule, beforeFieldRule, sameAsFieldDateRule } from "./date/date-field-comparison-rules.mjs";
|
|
24
|
+
import { Month, betweenDaysRule, betweenMonthsRule, betweenTimesRule, betweenYearsRule, maxDayRule, maxMonthRule, maxYearRule, minDayRule, minMonthRule, minYearRule, monthRule, quarterRule, yearRule } from "./date/date-period-rules.mjs";
|
|
25
|
+
import { withinDaysRule, withinFutureDaysRule, withinPastDaysRule } from "./date/date-relative-rules.mjs";
|
|
26
|
+
import { betweenAgeRule, birthdayRule, leapYearRule } from "./date/date-special-rules.mjs";
|
|
27
|
+
import { maxHeightRule, maxWidthRule, minHeightRule, minWidthRule } from "./file/dimensions.mjs";
|
|
28
|
+
import { maxFileSizeRule, minFileSizeRule } from "./file/file-size.mjs";
|
|
29
|
+
import { colorRule, darkColorRule, hexColorRule, hslColorRule, lightColorRule, rgbColorRule, rgbaColorRule } from "./color/color-rules.mjs";
|
|
30
|
+
import { requiredIfAllEmptyRule, requiredIfAllNotEmptyRule, requiredIfAnyEmptyRule, requiredIfAnyNotEmptyRule, requiredIfEmptyRule, requiredIfInRule, requiredIfNotEmptyRule, requiredIfNotInRule, requiredIfRule } from "./conditional/required-if-rules.mjs";
|
|
31
|
+
import { requiredUnlessRule } from "./conditional/required-unless-rules.mjs";
|
|
32
|
+
import { requiredWhenRule } from "./conditional/required-when-rule.mjs";
|
|
33
|
+
import { requiredWithAllRule, requiredWithAnyRule, requiredWithRule } from "./conditional/required-with-rules.mjs";
|
|
34
|
+
import { requiredWithoutAllRule, requiredWithoutAnyRule, requiredWithoutRule } from "./conditional/required-without-rules.mjs";
|
|
35
|
+
import { presentIfEmptyRule, presentIfInRule, presentIfNotEmptyRule, presentIfNotInRule, presentIfRule } from "./conditional/present-if-rules.mjs";
|
|
36
|
+
import { presentUnlessRule } from "./conditional/present-unless-rules.mjs";
|
|
37
|
+
import { presentWithAllRule, presentWithAnyRule, presentWithRule } from "./conditional/present-with-rules.mjs";
|
|
38
|
+
import { presentWithoutAllRule, presentWithoutAnyRule, presentWithoutRule } from "./conditional/present-without-rules.mjs";
|
|
39
|
+
import { forbiddenIfEmptyRule, forbiddenIfInRule, forbiddenIfNotEmptyRule, forbiddenIfNotInRule, forbiddenIfNotRule, forbiddenIfRule } from "./conditional/forbidden-if-rules.mjs";
|
|
40
|
+
import { allowedValuesRule, enumRule, inRule, notAllowedValuesRule } from "./common/enum.mjs";
|
|
41
|
+
import { equalsFieldRule, notEqualsFieldRule } from "./common/equals-field-rules.mjs";
|
|
42
|
+
import { instanceofRule } from "./common/instanceof.mjs";
|
|
43
|
+
import { literalRule } from "./common/literal.mjs";
|
|
44
|
+
import { arrayRule, booleanRule, floatRule, intRule, numberRule, objectRule, plainObjectRule, scalarRule, stringRule } from "./common/type-rules.mjs";
|
|
45
|
+
import { unknownKeyRule } from "./common/unknown-key.mjs";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import { betweenLengthRule, lengthRule, maxLengthRule, maxWordsRule, minLengthRule, minWordsRule, wordsRule } from "./length-rules.mjs";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"length-rules.d.mts","names":[],"sources":["../../../../../../../../seal/src/rules/length/length-rules.ts"],"mappings":";;;;;AAOA
|
|
1
|
+
{"version":3,"file":"length-rules.d.mts","names":[],"sources":["../../../../../../../../seal/src/rules/length/length-rules.ts"],"mappings":";;;;;AAOA;cAAa,aAAA,EAAe,UAAU;EAAG,SAAS;AAAA;AAAA;AAoBlD;;;AApBkD,cAoBrC,aAAA,EAAe,UAAU;EAAG,SAAS;AAAA;;;;;cAoBrC,iBAAA,EAAmB,UAAU;EACxC,SAAA;EACA,SAAA;AAAA;AAsBF;;;;AAAA,cAAa,UAAA,EAAY,UAAU;EAAG,MAAM;AAAA;;;AAmBI;cAAnC,YAAA,EAAc,UAAU;EAAG,QAAQ;AAAA;;AAiBA;AAiBhD;cAjBa,YAAA,EAAc,UAAU;EAAG,QAAQ;AAAA;AAiBN;;;AAAA,cAA7B,SAAA,EAAW,UAAU;EAAG,KAAK;AAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"length-rules.mjs","names":[],"sources":["../../../../../../../../seal/src/rules/length/length-rules.ts"],"sourcesContent":["import { invalidRule, VALID_RULE } from \"../../helpers\";\
|
|
1
|
+
{"version":3,"file":"length-rules.mjs","names":[],"sources":["../../../../../../../../seal/src/rules/length/length-rules.ts"],"sourcesContent":["import { invalidRule, VALID_RULE } from \"../../helpers\";\nimport type { SchemaRule } from \"../../types\";\n\n/**\n * Min length rule - validates minimum length\n * Works for any value with a length property (strings, arrays, etc.)\n */\nexport const minLengthRule: SchemaRule<{ minLength: number }> = {\n name: \"minLength\",\n defaultErrorMessage: \"The :input must be at least :minLength characters long\",\n async validate(value: any, context) {\n const length = typeof value?.length === \"number\" ? value.length : String(value || \"\").length;\n\n if (length >= this.context.options.minLength) {\n return VALID_RULE;\n }\n\n this.context.translationParams.minLength = this.context.options.minLength;\n\n return invalidRule(this, context);\n },\n};\n\n/**\n * Max length rule - validates maximum length\n * Works for any value with a length property (strings, arrays, etc.)\n */\nexport const maxLengthRule: SchemaRule<{ maxLength: number }> = {\n name: \"maxLength\",\n defaultErrorMessage: \"The :input must not exceed :maxLength characters\",\n async validate(value: any, context) {\n const length = typeof value?.length === \"number\" ? value.length : String(value || \"\").length;\n\n if (length <= this.context.options.maxLength) {\n return VALID_RULE;\n }\n\n this.context.translationParams.maxLength = this.context.options.maxLength;\n\n return invalidRule(this, context);\n },\n};\n\n/**\n * Between length rule - validates length is between min and max (inclusive)\n * Works for any value with a length property (strings, arrays, etc.)\n */\nexport const betweenLengthRule: SchemaRule<{\n minLength: number;\n maxLength: number;\n}> = {\n name: \"betweenLength\",\n defaultErrorMessage: \"The :input must be between :minLength and :maxLength characters long\",\n async validate(value: any, context) {\n const length = typeof value?.length === \"number\" ? value.length : String(value || \"\").length;\n\n if (length >= this.context.options.minLength && length <= this.context.options.maxLength) {\n return VALID_RULE;\n }\n\n this.context.translationParams.minLength = this.context.options.minLength;\n this.context.translationParams.maxLength = this.context.options.maxLength;\n\n return invalidRule(this, context);\n },\n};\n\n/**\n * Length rule - validates exact length\n * Works for any value with a length property (strings, arrays, etc.)\n */\nexport const lengthRule: SchemaRule<{ length: number }> = {\n name: \"length\",\n defaultErrorMessage: \"The :input must be exactly :length characters long\",\n async validate(value: any, context) {\n const length = typeof value?.length === \"number\" ? value.length : String(value || \"\").length;\n\n if (length === this.context.options.length) {\n return VALID_RULE;\n }\n\n this.context.translationParams.length = this.context.options.length;\n\n return invalidRule(this, context);\n },\n};\n\n/**\n * Min words rule - validates minimum word count\n */\nexport const minWordsRule: SchemaRule<{ minWords: number }> = {\n name: \"minWords\",\n defaultErrorMessage: \"The :input must be at least :minWords words\",\n async validate(value: any, context) {\n if (String(value || \"\").split(\" \").length >= this.context.options.minWords) {\n return VALID_RULE;\n }\n\n this.context.translationParams.minWords = this.context.options.minWords;\n\n return invalidRule(this, context);\n },\n};\n\n/**\n * Max words rule - validates maximum word count\n */\nexport const maxWordsRule: SchemaRule<{ maxWords: number }> = {\n name: \"maxWords\",\n defaultErrorMessage: \"The :input must be at most :maxWords words\",\n async validate(value: any, context) {\n if (String(value || \"\").split(\" \").length <= this.context.options.maxWords) {\n return VALID_RULE;\n }\n\n this.context.translationParams.maxWords = this.context.options.maxWords;\n\n return invalidRule(this, context);\n },\n};\n\n/**\n * Words rule - validates exact word count\n */\nexport const wordsRule: SchemaRule<{ words: number }> = {\n name: \"words\",\n defaultErrorMessage: \"The :input must be exactly :words words\",\n async validate(value: any, context) {\n if (String(value || \"\").split(\" \").length === this.context.options.words) {\n return VALID_RULE;\n }\n\n this.context.translationParams.words = this.context.options.words;\n\n return invalidRule(this, context);\n },\n};\n"],"mappings":";;;;;;;;AAOA,MAAa,gBAAmD;CAC9D,MAAM;CACN,qBAAqB;CACrB,MAAM,SAAS,OAAY,SAAS;EAGlC,KAFe,OAAO,OAAO,WAAW,WAAW,MAAM,SAAS,OAAO,SAAS,EAAE,CAAC,CAAC,WAExE,KAAK,QAAQ,QAAQ,WACjC,OAAO;EAGT,KAAK,QAAQ,kBAAkB,YAAY,KAAK,QAAQ,QAAQ;EAEhE,OAAO,YAAY,MAAM,OAAO;CAClC;AACF;;;;;AAMA,MAAa,gBAAmD;CAC9D,MAAM;CACN,qBAAqB;CACrB,MAAM,SAAS,OAAY,SAAS;EAGlC,KAFe,OAAO,OAAO,WAAW,WAAW,MAAM,SAAS,OAAO,SAAS,EAAE,CAAC,CAAC,WAExE,KAAK,QAAQ,QAAQ,WACjC,OAAO;EAGT,KAAK,QAAQ,kBAAkB,YAAY,KAAK,QAAQ,QAAQ;EAEhE,OAAO,YAAY,MAAM,OAAO;CAClC;AACF;;;;;AAMA,MAAa,oBAGR;CACH,MAAM;CACN,qBAAqB;CACrB,MAAM,SAAS,OAAY,SAAS;EAClC,MAAM,SAAS,OAAO,OAAO,WAAW,WAAW,MAAM,SAAS,OAAO,SAAS,EAAE,CAAC,CAAC;EAEtF,IAAI,UAAU,KAAK,QAAQ,QAAQ,aAAa,UAAU,KAAK,QAAQ,QAAQ,WAC7E,OAAO;EAGT,KAAK,QAAQ,kBAAkB,YAAY,KAAK,QAAQ,QAAQ;EAChE,KAAK,QAAQ,kBAAkB,YAAY,KAAK,QAAQ,QAAQ;EAEhE,OAAO,YAAY,MAAM,OAAO;CAClC;AACF;;;;;AAMA,MAAa,aAA6C;CACxD,MAAM;CACN,qBAAqB;CACrB,MAAM,SAAS,OAAY,SAAS;EAGlC,KAFe,OAAO,OAAO,WAAW,WAAW,MAAM,SAAS,OAAO,SAAS,EAAE,CAAC,CAAC,YAEvE,KAAK,QAAQ,QAAQ,QAClC,OAAO;EAGT,KAAK,QAAQ,kBAAkB,SAAS,KAAK,QAAQ,QAAQ;EAE7D,OAAO,YAAY,MAAM,OAAO;CAClC;AACF;;;;AAKA,MAAa,eAAiD;CAC5D,MAAM;CACN,qBAAqB;CACrB,MAAM,SAAS,OAAY,SAAS;EAClC,IAAI,OAAO,SAAS,EAAE,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,UAAU,KAAK,QAAQ,QAAQ,UAChE,OAAO;EAGT,KAAK,QAAQ,kBAAkB,WAAW,KAAK,QAAQ,QAAQ;EAE/D,OAAO,YAAY,MAAM,OAAO;CAClC;AACF;;;;AAKA,MAAa,eAAiD;CAC5D,MAAM;CACN,qBAAqB;CACrB,MAAM,SAAS,OAAY,SAAS;EAClC,IAAI,OAAO,SAAS,EAAE,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,UAAU,KAAK,QAAQ,QAAQ,UAChE,OAAO;EAGT,KAAK,QAAQ,kBAAkB,WAAW,KAAK,QAAQ,QAAQ;EAE/D,OAAO,YAAY,MAAM,OAAO;CAClC;AACF;;;;AAKA,MAAa,YAA2C;CACtD,MAAM;CACN,qBAAqB;CACrB,MAAM,SAAS,OAAY,SAAS;EAClC,IAAI,OAAO,SAAS,EAAE,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,WAAW,KAAK,QAAQ,QAAQ,OACjE,OAAO;EAGT,KAAK,QAAQ,kBAAkB,QAAQ,KAAK,QAAQ,QAAQ;EAE5D,OAAO,YAAY,MAAM,OAAO;CAClC;AACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import { betweenNumbersRule, evenRule, greaterThanRule, lessThanRule, maxRule, minRule, moduloRule, negativeRule, oddRule, positiveRule } from "./number-rules.mjs";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"number-rules.d.mts","names":[],"sources":["../../../../../../../../seal/src/rules/number/number-rules.ts"],"mappings":";;;;;AAQA
|
|
1
|
+
{"version":3,"file":"number-rules.d.mts","names":[],"sources":["../../../../../../../../seal/src/rules/number/number-rules.ts"],"mappings":";;;;;AAQA;cAAa,OAAA,EAAS,UAAU;EAC9B,GAAA;EACA,KAAA;AAAA;;;;AAAK;cAwCM,OAAA,EAAS,UAAU;EAC9B,GAAA;EACA,KAAA;AAAA;;;;;cAwCW,eAAA,EAAiB,UAAU;EACtC,KAAA;EACA,KAAA;AAAA;;;;;cAwCW,YAAA,EAAc,UAAU;EACnC,KAAA;EACA,KAAA;AAAA;;;;cAuCW,YAAA,EAAc,UAU1B;;;AAjDM;cAsDM,YAAA,EAAc,UAU1B;;;;cAKY,OAAA,EAAS,UAUrB;AAzBD;;;AAAA,cA8Ba,QAAA,EAAU,UAUtB;AA9BA;AAKD;;AALC,cAmCY,UAAA,EAAY,UAAU;EAAG,KAAK;AAAA;AAf3C;;;;AAAA,cAiCa,kBAAA,EAAoB,UAAU;EACzC,GAAA;EACA,GAAA;EACA,KAAA;AAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"number-rules.mjs","names":[],"sources":["../../../../../../../../seal/src/rules/number/number-rules.ts"],"sourcesContent":["import { get } from \"@mongez/reinforcements\";\r\nimport { invalidRule, VALID_RULE } from \"../../helpers\";\r\nimport type { SchemaRule } from \"../../types\";\r\n\r\n/**\r\n * Min rule - value must be equal or greater than minimum\r\n * Supports field names with sibling scope\r\n */\r\nexport const minRule: SchemaRule<{\r\n min: number | string;\r\n scope?: \"global\" | \"sibling\";\r\n}> = {\r\n name: \"min\",\r\n defaultErrorMessage: \"The :input must be at least :min\",\r\n async validate(value: any, context) {\r\n const { min, scope = \"global\" } = this.context.options;\r\n let compareMin: number;\r\n\r\n if (typeof min === \"number\") {\r\n compareMin = min;\r\n this.context.translationParams.min = min;\r\n } else {\r\n const source = scope === \"sibling\" ? context.parent : context.allValues;\r\n const fieldValue = get(source, min);\r\n\r\n if (fieldValue === undefined) {\r\n return VALID_RULE;\r\n }\r\n\r\n this.context.translatableParams.min = min;\r\n\r\n compareMin = Number(fieldValue);\r\n\r\n if (isNaN(compareMin)) {\r\n return VALID_RULE;\r\n }\r\n }\r\n\r\n if (value >= compareMin) {\r\n return VALID_RULE;\r\n }\r\n\r\n return invalidRule(this, context);\r\n },\r\n};\r\n\r\n/**\r\n * Max rule - value must be equal or less than maximum\r\n * Supports field names with sibling scope\r\n */\r\nexport const maxRule: SchemaRule<{\r\n max: number | string;\r\n scope?: \"global\" | \"sibling\";\r\n}> = {\r\n name: \"max\",\r\n defaultErrorMessage: \"The :input must equal to or less than :max\",\r\n async validate(value: any, context) {\r\n const { max, scope = \"global\" } = this.context.options;\r\n let compareMax: number;\r\n\r\n if (typeof max === \"number\") {\r\n compareMax = max;\r\n this.context.translationParams.max = max;\r\n } else {\r\n const source = scope === \"sibling\" ? context.parent : context.allValues;\r\n const fieldValue = get(source, max);\r\n\r\n if (fieldValue === undefined) {\r\n return VALID_RULE;\r\n }\r\n\r\n this.context.translatableParams.max = max;\r\n\r\n compareMax = Number(fieldValue);\r\n\r\n if (isNaN(compareMax)) {\r\n return VALID_RULE;\r\n }\r\n }\r\n\r\n if (value <= compareMax) {\r\n return VALID_RULE;\r\n }\r\n\r\n return invalidRule(this, context);\r\n },\r\n};\r\n\r\n/**\r\n * Greater than rule - value must be strictly greater than minimum\r\n * Supports field names with sibling scope\r\n */\r\nexport const greaterThanRule: SchemaRule<{\r\n value: number | string;\r\n scope?: \"global\" | \"sibling\";\r\n}> = {\r\n name: \"greaterThan\",\r\n defaultErrorMessage: \"The :input must be greater than :value\",\r\n async validate(value: any, context) {\r\n const { value: compareValue, scope = \"global\" } = this.context.options;\r\n let compareNumber: number;\r\n\r\n if (typeof compareValue === \"number\") {\r\n compareNumber = compareValue;\r\n this.context.translationParams.value = compareValue;\r\n } else {\r\n const source = scope === \"sibling\" ? context.parent : context.allValues;\r\n const fieldValue = get(source, compareValue);\r\n\r\n if (fieldValue === undefined) {\r\n return VALID_RULE;\r\n }\r\n\r\n this.context.translatableParams.value = compareValue;\r\n\r\n compareNumber = Number(fieldValue);\r\n\r\n if (isNaN(compareNumber)) {\r\n return VALID_RULE;\r\n }\r\n }\r\n\r\n if (value > compareNumber) {\r\n return VALID_RULE;\r\n }\r\n\r\n return invalidRule(this, context);\r\n },\r\n};\r\n\r\n/**\r\n * Less than rule - value must be strictly less than maximum\r\n * Supports field names with sibling scope\r\n */\r\nexport const lessThanRule: SchemaRule<{\r\n value: number | string;\r\n scope?: \"global\" | \"sibling\";\r\n}> = {\r\n name: \"lessThan\",\r\n defaultErrorMessage: \"The :input must be less than :value\",\r\n async validate(value: any, context) {\r\n const { value: compareValue, scope = \"global\" } = this.context.options;\r\n let compareNumber: number;\r\n\r\n if (typeof compareValue === \"number\") {\r\n compareNumber = compareValue;\r\n this.context.translationParams.value = compareValue;\r\n } else {\r\n const source = scope === \"sibling\" ? context.parent : context.allValues;\r\n const fieldValue = get(source, compareValue);\r\n\r\n if (fieldValue === undefined) {\r\n return VALID_RULE;\r\n }\r\n\r\n this.context.translatableParams.value = compareValue;\r\n\r\n compareNumber = Number(fieldValue);\r\n\r\n if (isNaN(compareNumber)) {\r\n return VALID_RULE;\r\n }\r\n }\r\n\r\n if (value < compareNumber) {\r\n return VALID_RULE;\r\n }\r\n\r\n return invalidRule(this, context);\r\n },\r\n};\r\n\r\n/**\r\n * Positive rule - value must be greater than 0\r\n */\r\nexport const positiveRule: SchemaRule = {\r\n name: \"positive\",\r\n defaultErrorMessage: \"The :input must be a positive number\",\r\n async validate(value: any, context) {\r\n if (value > 0) {\r\n return VALID_RULE;\r\n }\r\n\r\n return invalidRule(this, context);\r\n },\r\n};\r\n\r\n/**\r\n * Negative rule - value must be less than 0\r\n */\r\nexport const negativeRule: SchemaRule = {\r\n name: \"negative\",\r\n defaultErrorMessage: \"The :input must be a negative number\",\r\n async validate(value: any, context) {\r\n if (value < 0) {\r\n return VALID_RULE;\r\n }\r\n\r\n return invalidRule(this, context);\r\n },\r\n};\r\n\r\n/**\r\n * Odd rule - value must be an odd number\r\n */\r\nexport const oddRule: SchemaRule = {\r\n name: \"odd\",\r\n defaultErrorMessage: \"The :input must be an odd number\",\r\n async validate(value: any, context) {\r\n if (value % 2 !== 0) {\r\n return VALID_RULE;\r\n }\r\n\r\n return invalidRule(this, context);\r\n },\r\n};\r\n\r\n/**\r\n * Even rule - value must be an even number\r\n */\r\nexport const evenRule: SchemaRule = {\r\n name: \"even\",\r\n defaultErrorMessage: \"The :input must be an even number\",\r\n async validate(value: any, context) {\r\n if (value % 2 === 0) {\r\n return VALID_RULE;\r\n }\r\n\r\n return invalidRule(this, context);\r\n },\r\n};\r\n\r\n/**\r\n * Modulo rule - value must be divisible by given number\r\n */\r\nexport const moduloRule: SchemaRule<{ value: number }> = {\r\n name: \"modulo\",\r\n defaultErrorMessage: \"The :input must be divisible by :value\",\r\n async validate(value: any, context) {\r\n if (value % this.context.options.value === 0) {\r\n return VALID_RULE;\r\n }\r\n\r\n this.context.translationParams.value = this.context.options.value;\r\n\r\n return invalidRule(this, context);\r\n },\r\n};\r\n\r\n/**\r\n * Between rule - value must be between the given two numbers (Inclusive)\r\n * Supports field names with sibling scope\r\n */\r\nexport const betweenNumbersRule: SchemaRule<{\r\n min: number | string;\r\n max: number | string;\r\n scope?: \"global\" | \"sibling\";\r\n}> = {\r\n name: \"betweenNumbers\",\r\n defaultErrorMessage: \"The :input must be between :min and :max\",\r\n async validate(value: any, context) {\r\n const { min, max, scope = \"global\" } = this.context.options;\r\n\r\n // Extract min value\r\n let compareMin: number;\r\n if (typeof min === \"number\") {\r\n compareMin = min;\r\n this.context.translationParams.min = min;\r\n } else {\r\n const source = scope === \"sibling\" ? context.parent : context.allValues;\r\n const fieldValue = get(source, min);\r\n\r\n if (fieldValue === undefined) {\r\n return VALID_RULE;\r\n }\r\n\r\n this.context.translatableParams.min = min;\r\n\r\n compareMin = Number(fieldValue);\r\n if (isNaN(compareMin)) {\r\n return VALID_RULE;\r\n }\r\n }\r\n\r\n // Extract max value\r\n let compareMax: number;\r\n if (typeof max === \"number\") {\r\n compareMax = max;\r\n this.context.translationParams.max = max;\r\n } else {\r\n const source = scope === \"sibling\" ? context.parent : context.allValues;\r\n const fieldValue = get(source, max);\r\n\r\n if (fieldValue === undefined) {\r\n return VALID_RULE;\r\n }\r\n\r\n this.context.translatableParams.max = max;\r\n\r\n compareMax = Number(fieldValue);\r\n if (isNaN(compareMax)) {\r\n return VALID_RULE;\r\n }\r\n }\r\n\r\n if (value >= compareMin && value <= compareMax) {\r\n return VALID_RULE;\r\n }\r\n\r\n return invalidRule(this, context);\r\n },\r\n};\r\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"number-rules.mjs","names":[],"sources":["../../../../../../../../seal/src/rules/number/number-rules.ts"],"sourcesContent":["import { get } from \"@mongez/reinforcements\";\nimport { invalidRule, VALID_RULE } from \"../../helpers\";\nimport type { SchemaRule } from \"../../types\";\n\n/**\n * Min rule - value must be equal or greater than minimum\n * Supports field names with sibling scope\n */\nexport const minRule: SchemaRule<{\n min: number | string;\n scope?: \"global\" | \"sibling\";\n}> = {\n name: \"min\",\n defaultErrorMessage: \"The :input must be at least :min\",\n async validate(value: any, context) {\n const { min, scope = \"global\" } = this.context.options;\n let compareMin: number;\n\n if (typeof min === \"number\") {\n compareMin = min;\n this.context.translationParams.min = min;\n } else {\n const source = scope === \"sibling\" ? context.parent : context.allValues;\n const fieldValue = get(source, min);\n\n if (fieldValue === undefined) {\n return VALID_RULE;\n }\n\n this.context.translatableParams.min = min;\n\n compareMin = Number(fieldValue);\n\n if (isNaN(compareMin)) {\n return VALID_RULE;\n }\n }\n\n if (value >= compareMin) {\n return VALID_RULE;\n }\n\n return invalidRule(this, context);\n },\n};\n\n/**\n * Max rule - value must be equal or less than maximum\n * Supports field names with sibling scope\n */\nexport const maxRule: SchemaRule<{\n max: number | string;\n scope?: \"global\" | \"sibling\";\n}> = {\n name: \"max\",\n defaultErrorMessage: \"The :input must equal to or less than :max\",\n async validate(value: any, context) {\n const { max, scope = \"global\" } = this.context.options;\n let compareMax: number;\n\n if (typeof max === \"number\") {\n compareMax = max;\n this.context.translationParams.max = max;\n } else {\n const source = scope === \"sibling\" ? context.parent : context.allValues;\n const fieldValue = get(source, max);\n\n if (fieldValue === undefined) {\n return VALID_RULE;\n }\n\n this.context.translatableParams.max = max;\n\n compareMax = Number(fieldValue);\n\n if (isNaN(compareMax)) {\n return VALID_RULE;\n }\n }\n\n if (value <= compareMax) {\n return VALID_RULE;\n }\n\n return invalidRule(this, context);\n },\n};\n\n/**\n * Greater than rule - value must be strictly greater than minimum\n * Supports field names with sibling scope\n */\nexport const greaterThanRule: SchemaRule<{\n value: number | string;\n scope?: \"global\" | \"sibling\";\n}> = {\n name: \"greaterThan\",\n defaultErrorMessage: \"The :input must be greater than :value\",\n async validate(value: any, context) {\n const { value: compareValue, scope = \"global\" } = this.context.options;\n let compareNumber: number;\n\n if (typeof compareValue === \"number\") {\n compareNumber = compareValue;\n this.context.translationParams.value = compareValue;\n } else {\n const source = scope === \"sibling\" ? context.parent : context.allValues;\n const fieldValue = get(source, compareValue);\n\n if (fieldValue === undefined) {\n return VALID_RULE;\n }\n\n this.context.translatableParams.value = compareValue;\n\n compareNumber = Number(fieldValue);\n\n if (isNaN(compareNumber)) {\n return VALID_RULE;\n }\n }\n\n if (value > compareNumber) {\n return VALID_RULE;\n }\n\n return invalidRule(this, context);\n },\n};\n\n/**\n * Less than rule - value must be strictly less than maximum\n * Supports field names with sibling scope\n */\nexport const lessThanRule: SchemaRule<{\n value: number | string;\n scope?: \"global\" | \"sibling\";\n}> = {\n name: \"lessThan\",\n defaultErrorMessage: \"The :input must be less than :value\",\n async validate(value: any, context) {\n const { value: compareValue, scope = \"global\" } = this.context.options;\n let compareNumber: number;\n\n if (typeof compareValue === \"number\") {\n compareNumber = compareValue;\n this.context.translationParams.value = compareValue;\n } else {\n const source = scope === \"sibling\" ? context.parent : context.allValues;\n const fieldValue = get(source, compareValue);\n\n if (fieldValue === undefined) {\n return VALID_RULE;\n }\n\n this.context.translatableParams.value = compareValue;\n\n compareNumber = Number(fieldValue);\n\n if (isNaN(compareNumber)) {\n return VALID_RULE;\n }\n }\n\n if (value < compareNumber) {\n return VALID_RULE;\n }\n\n return invalidRule(this, context);\n },\n};\n\n/**\n * Positive rule - value must be greater than 0\n */\nexport const positiveRule: SchemaRule = {\n name: \"positive\",\n defaultErrorMessage: \"The :input must be a positive number\",\n async validate(value: any, context) {\n if (value > 0) {\n return VALID_RULE;\n }\n\n return invalidRule(this, context);\n },\n};\n\n/**\n * Negative rule - value must be less than 0\n */\nexport const negativeRule: SchemaRule = {\n name: \"negative\",\n defaultErrorMessage: \"The :input must be a negative number\",\n async validate(value: any, context) {\n if (value < 0) {\n return VALID_RULE;\n }\n\n return invalidRule(this, context);\n },\n};\n\n/**\n * Odd rule - value must be an odd number\n */\nexport const oddRule: SchemaRule = {\n name: \"odd\",\n defaultErrorMessage: \"The :input must be an odd number\",\n async validate(value: any, context) {\n if (value % 2 !== 0) {\n return VALID_RULE;\n }\n\n return invalidRule(this, context);\n },\n};\n\n/**\n * Even rule - value must be an even number\n */\nexport const evenRule: SchemaRule = {\n name: \"even\",\n defaultErrorMessage: \"The :input must be an even number\",\n async validate(value: any, context) {\n if (value % 2 === 0) {\n return VALID_RULE;\n }\n\n return invalidRule(this, context);\n },\n};\n\n/**\n * Modulo rule - value must be divisible by given number\n */\nexport const moduloRule: SchemaRule<{ value: number }> = {\n name: \"modulo\",\n defaultErrorMessage: \"The :input must be divisible by :value\",\n async validate(value: any, context) {\n if (value % this.context.options.value === 0) {\n return VALID_RULE;\n }\n\n this.context.translationParams.value = this.context.options.value;\n\n return invalidRule(this, context);\n },\n};\n\n/**\n * Between rule - value must be between the given two numbers (Inclusive)\n * Supports field names with sibling scope\n */\nexport const betweenNumbersRule: SchemaRule<{\n min: number | string;\n max: number | string;\n scope?: \"global\" | \"sibling\";\n}> = {\n name: \"betweenNumbers\",\n defaultErrorMessage: \"The :input must be between :min and :max\",\n async validate(value: any, context) {\n const { min, max, scope = \"global\" } = this.context.options;\n\n // Extract min value\n let compareMin: number;\n if (typeof min === \"number\") {\n compareMin = min;\n this.context.translationParams.min = min;\n } else {\n const source = scope === \"sibling\" ? context.parent : context.allValues;\n const fieldValue = get(source, min);\n\n if (fieldValue === undefined) {\n return VALID_RULE;\n }\n\n this.context.translatableParams.min = min;\n\n compareMin = Number(fieldValue);\n if (isNaN(compareMin)) {\n return VALID_RULE;\n }\n }\n\n // Extract max value\n let compareMax: number;\n if (typeof max === \"number\") {\n compareMax = max;\n this.context.translationParams.max = max;\n } else {\n const source = scope === \"sibling\" ? context.parent : context.allValues;\n const fieldValue = get(source, max);\n\n if (fieldValue === undefined) {\n return VALID_RULE;\n }\n\n this.context.translatableParams.max = max;\n\n compareMax = Number(fieldValue);\n if (isNaN(compareMax)) {\n return VALID_RULE;\n }\n }\n\n if (value >= compareMin && value <= compareMax) {\n return VALID_RULE;\n }\n\n return invalidRule(this, context);\n },\n};\n"],"mappings":"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"}
|