@bgord/tools 1.3.24 → 1.4.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/dist/src/age-years.vo.d.ts +11 -0
- package/dist/src/age-years.vo.js +6 -0
- package/dist/{age.vo.js → src/age.vo.js} +2 -1
- package/dist/src/api-key.vo.d.ts +7 -0
- package/dist/src/api-key.vo.js +7 -0
- package/dist/src/basename.vo.d.ts +12 -0
- package/dist/src/basename.vo.js +22 -0
- package/dist/src/day-iso-id.vo.d.ts +9 -0
- package/dist/{day-iso-id.vo.js → src/day-iso-id.vo.js} +4 -8
- package/dist/{day.vo.js → src/day.vo.js} +7 -6
- package/dist/src/directory-path-absolute.vo.d.ts +12 -0
- package/dist/{directory-path-absolute.vo.js → src/directory-path-absolute.vo.js} +5 -12
- package/dist/src/directory-path-relative.vo.d.ts +12 -0
- package/dist/{directory-path-relative.vo.js → src/directory-path-relative.vo.js} +5 -12
- package/dist/src/distance-value.vo.d.ts +7 -0
- package/dist/src/distance-value.vo.js +5 -0
- package/dist/{distance.vo.js → src/distance.vo.js} +7 -6
- package/dist/src/division-factor.vo.d.ts +7 -0
- package/dist/src/division-factor.vo.js +5 -0
- package/dist/src/duration-ms.vo.d.ts +6 -0
- package/dist/src/duration-ms.vo.js +5 -0
- package/dist/{duration.service.js → src/duration.service.js} +2 -1
- package/dist/src/email.vo.d.ts +6 -0
- package/dist/src/email.vo.js +4 -0
- package/dist/{etags.vo.js → src/etags.vo.js} +3 -2
- package/dist/src/extension.vo.d.ts +9 -0
- package/dist/src/extension.vo.js +15 -0
- package/dist/src/feature-flag-value.vo.d.ts +10 -0
- package/dist/{feature-flag-value.vo.js → src/feature-flag-value.vo.js} +2 -2
- package/dist/src/file-path-absolute-schema.vo.d.ts +17 -0
- package/dist/{file-path-absolute-schema.vo.js → src/file-path-absolute-schema.vo.js} +6 -13
- package/dist/src/file-path-relative-schema.vo.d.ts +17 -0
- package/dist/{file-path-relative-schema.vo.js → src/file-path-relative-schema.vo.js} +6 -13
- package/dist/{file-path.vo.js → src/file-path.vo.js} +5 -4
- package/dist/src/filename-affix.vo.d.ts +13 -0
- package/dist/{filename-affix.vo.js → src/filename-affix.vo.js} +4 -9
- package/dist/src/filename-from-string.vo.d.ts +10 -0
- package/dist/{filename-from-string.vo.js → src/filename-from-string.vo.js} +5 -8
- package/dist/{filename.vo.js → src/filename.vo.js} +8 -7
- package/dist/src/height-milimiters.vo.d.ts +7 -0
- package/dist/src/height-milimiters.vo.js +8 -0
- package/dist/{height.vo.js → src/height.vo.js} +4 -3
- package/dist/src/hour-value.vo.d.ts +7 -0
- package/dist/src/hour-value.vo.js +5 -0
- package/dist/{hour.vo.js → src/hour.vo.js} +3 -2
- package/dist/src/iban-schema.vo.d.ts +7 -0
- package/dist/src/iban-schema.vo.js +7 -0
- package/dist/{iban.vo.js → src/iban.vo.js} +2 -1
- package/dist/src/image.vo.d.ts +13 -0
- package/dist/src/image.vo.js +10 -0
- package/dist/src/integer-non-negative.vo.d.ts +7 -0
- package/dist/src/integer-non-negative.vo.js +8 -0
- package/dist/src/integer-positive.vo.d.ts +7 -0
- package/dist/src/integer-positive.vo.js +5 -0
- package/dist/src/integer.vo.d.ts +6 -0
- package/dist/src/integer.vo.js +4 -0
- package/dist/src/language.vo.d.ts +7 -0
- package/dist/{language.vo.js → src/language.vo.js} +2 -2
- package/dist/src/mime-value.vo.d.ts +7 -0
- package/dist/{mime-value.vo.js → src/mime-value.vo.js} +4 -7
- package/dist/{mime.vo.js → src/mime.vo.js} +2 -1
- package/dist/src/mimes.js +19 -0
- package/dist/src/minute-value.vo.d.ts +7 -0
- package/dist/src/minute-value.vo.js +5 -0
- package/dist/{minute.vo.js → src/minute.vo.js} +3 -2
- package/dist/src/money-amount.vo.d.ts +7 -0
- package/dist/src/money-amount.vo.js +5 -0
- package/dist/{money.vo.js → src/money.vo.js} +7 -6
- package/dist/src/month-iso-id.vo.d.ts +8 -0
- package/dist/{month-iso-id.vo.js → src/month-iso-id.vo.js} +5 -9
- package/dist/{month.vo.js → src/month.vo.js} +5 -4
- package/dist/src/multiplication-factor.vo.d.ts +7 -0
- package/dist/src/multiplication-factor.vo.js +8 -0
- package/dist/src/object-key.vo.d.ts +11 -0
- package/dist/src/object-key.vo.js +19 -0
- package/dist/src/package-version-schema.vo.d.ts +8 -0
- package/dist/{package-version-schema.vo.js → src/package-version-schema.vo.js} +4 -7
- package/dist/{package-version.vo.js → src/package-version.vo.js} +3 -4
- package/dist/src/pagination-page.vo.d.ts +6 -0
- package/dist/src/pagination-page.vo.js +3 -0
- package/dist/src/pagination-skip.vo.d.ts +7 -0
- package/dist/src/pagination-skip.vo.js +3 -0
- package/dist/src/pagination-take.vo.d.ts +7 -0
- package/dist/src/pagination-take.vo.js +3 -0
- package/dist/{pagination.service.js → src/pagination.service.js} +8 -7
- package/dist/src/quarter-iso-id.vo.d.ts +8 -0
- package/dist/src/quarter-iso-id.vo.js +7 -0
- package/dist/{quarter.vo.js → src/quarter.vo.js} +3 -2
- package/dist/src/reordering-item-position-value.vo.d.ts +6 -0
- package/dist/src/reordering-item-position-value.vo.js +3 -0
- package/dist/{reordering.service.d.ts → src/reordering.service.d.ts} +9 -9
- package/dist/{reordering.service.js → src/reordering.service.js} +7 -7
- package/dist/src/revision-value.vo.d.ts +7 -0
- package/dist/src/revision-value.vo.js +3 -0
- package/dist/{revision.vo.js → src/revision.vo.js} +3 -2
- package/dist/{rounding-decimal.strategy.d.ts → src/rounding-decimal.strategy.d.ts} +2 -2
- package/dist/src/rounding-decimal.strategy.js +14 -0
- package/dist/src/size-bytes.vo.d.ts +6 -0
- package/dist/src/size-bytes.vo.js +5 -0
- package/dist/{size.vo.js → src/size.vo.js} +5 -4
- package/dist/src/time-zone-offset-value.vo.d.ts +8 -0
- package/dist/src/time-zone-offset-value.vo.js +13 -0
- package/dist/src/timestamp-value.vo.d.ts +6 -0
- package/dist/src/timestamp-value.vo.js +5 -0
- package/dist/{timestamp.vo.js → src/timestamp.vo.js} +2 -1
- package/dist/src/timezone.vo.d.ts +9 -0
- package/dist/{timezone.vo.js → src/timezone.vo.js} +7 -10
- package/dist/src/url-with-slash.vo.d.ts +6 -0
- package/dist/src/url-with-slash.vo.js +5 -0
- package/dist/src/url-without-slash.vo.d.ts +6 -0
- package/dist/src/url-without-slash.vo.js +5 -0
- package/dist/src/week-iso-id.vo.d.ts +8 -0
- package/dist/{week-iso-id.vo.js → src/week-iso-id.vo.js} +5 -9
- package/dist/{week.vo.js → src/week.vo.js} +5 -4
- package/dist/src/weekday-iso-id.vo.d.ts +7 -0
- package/dist/src/weekday-iso-id.vo.js +5 -0
- package/dist/{weekday.vo.js → src/weekday.vo.js} +9 -8
- package/dist/src/weight-grams.vo.d.ts +7 -0
- package/dist/src/weight-grams.vo.js +5 -0
- package/dist/{weight.vo.js → src/weight.vo.js} +8 -7
- package/dist/src/year-iso-id.vo.d.ts +7 -0
- package/dist/src/year-iso-id.vo.js +7 -0
- package/dist/{year.vo.js → src/year.vo.js} +6 -5
- package/dist/tests/age-years.vo.test.d.ts +1 -0
- package/dist/tests/age-years.vo.test.js +24 -0
- package/dist/tests/age.vo.test.d.ts +1 -0
- package/dist/tests/age.vo.test.js +106 -0
- package/dist/tests/api-key.vo.test.d.ts +1 -0
- package/dist/tests/api-key.vo.test.js +24 -0
- package/dist/tests/basename.vo.test.d.ts +1 -0
- package/dist/tests/basename.vo.test.js +53 -0
- package/dist/tests/batch.test.d.ts +1 -0
- package/dist/tests/batch.test.js +24 -0
- package/dist/tests/date-calculator.service.test.d.ts +1 -0
- package/dist/tests/date-calculator.service.test.js +32 -0
- package/dist/tests/date-formatter.service.test.d.ts +1 -0
- package/dist/tests/date-formatter.service.test.js +22 -0
- package/dist/tests/date-range.vo.test.d.ts +1 -0
- package/dist/tests/date-range.vo.test.js +49 -0
- package/dist/tests/day-iso-id.vo.test.d.ts +1 -0
- package/dist/tests/day-iso-id.vo.test.js +36 -0
- package/dist/tests/day.vo.test.d.ts +1 -0
- package/dist/tests/day.vo.test.js +68 -0
- package/dist/tests/directory-path-absolute.vo.test.d.ts +1 -0
- package/dist/tests/directory-path-absolute.vo.test.js +47 -0
- package/dist/tests/directory-path-relative.vo.test.d.ts +1 -0
- package/dist/tests/directory-path-relative.vo.test.js +44 -0
- package/dist/tests/distance-value.vo.test.d.ts +1 -0
- package/dist/tests/distance-value.vo.test.js +21 -0
- package/dist/tests/distance.vo.test.d.ts +1 -0
- package/dist/tests/distance.vo.test.js +74 -0
- package/dist/tests/division-factor.vo.test.d.ts +1 -0
- package/dist/tests/division-factor.vo.test.js +21 -0
- package/dist/tests/dll.service.test.d.ts +1 -0
- package/dist/tests/dll.service.test.js +381 -0
- package/dist/tests/duration-ms.vo.test.d.ts +1 -0
- package/dist/tests/duration-ms.vo.test.js +18 -0
- package/dist/tests/duration.service.test.d.ts +1 -0
- package/dist/tests/duration.service.test.js +126 -0
- package/dist/tests/email-mask.service.test.d.ts +1 -0
- package/dist/tests/email-mask.service.test.js +15 -0
- package/dist/tests/email.vo.test.d.ts +1 -0
- package/dist/tests/email.vo.test.js +17 -0
- package/dist/tests/etags.vo.test.d.ts +1 -0
- package/dist/tests/etags.vo.test.js +54 -0
- package/dist/tests/extension.vo.test.d.ts +1 -0
- package/dist/tests/extension.vo.test.js +51 -0
- package/dist/tests/feature-flag-value.vo.test.d.ts +1 -0
- package/dist/tests/feature-flag-value.vo.test.js +12 -0
- package/dist/tests/feature-flag.vo.test.d.ts +1 -0
- package/dist/tests/feature-flag.vo.test.js +13 -0
- package/dist/tests/file-path-absolute-schema.vo.test.d.ts +1 -0
- package/dist/tests/file-path-absolute-schema.vo.test.js +53 -0
- package/dist/tests/file-path-relative-schema.vo.test.d.ts +1 -0
- package/dist/tests/file-path-relative-schema.vo.test.js +52 -0
- package/dist/tests/file-path.vo.test.d.ts +1 -0
- package/dist/tests/file-path.vo.test.js +74 -0
- package/dist/tests/filename-affix.vo.test.d.ts +1 -0
- package/dist/tests/filename-affix.vo.test.js +30 -0
- package/dist/tests/filename-from-string.vo.test.d.ts +1 -0
- package/dist/tests/filename-from-string.vo.test.js +37 -0
- package/dist/tests/filename.vo.test.d.ts +1 -0
- package/dist/tests/filename.vo.test.js +93 -0
- package/dist/tests/height-milimiters.vo.test.d.ts +1 -0
- package/dist/tests/height-milimiters.vo.test.js +21 -0
- package/dist/tests/height.vo.test.d.ts +1 -0
- package/dist/tests/height.vo.test.js +64 -0
- package/dist/tests/hour-value.vo.test.d.ts +1 -0
- package/dist/tests/hour-value.vo.test.js +24 -0
- package/dist/tests/hour.vo.test.d.ts +1 -0
- package/dist/tests/hour.vo.test.js +64 -0
- package/dist/tests/iban-mask.service.test.d.ts +1 -0
- package/dist/tests/iban-mask.service.test.js +13 -0
- package/dist/tests/iban-schema.vo.test.d.ts +1 -0
- package/dist/tests/iban-schema.vo.test.js +43 -0
- package/dist/tests/iban.vo.test.d.ts +1 -0
- package/dist/tests/iban.vo.test.js +46 -0
- package/dist/tests/image.vo.test.d.ts +1 -0
- package/dist/tests/image.vo.test.js +41 -0
- package/dist/tests/integer-non-negative.vo.test.d.ts +1 -0
- package/dist/tests/integer-non-negative.vo.test.js +22 -0
- package/dist/tests/integer-positive.vo.test.d.ts +1 -0
- package/dist/tests/integer-positive.vo.test.js +21 -0
- package/dist/tests/integer.vo.test.d.ts +1 -0
- package/dist/tests/integer.vo.test.js +21 -0
- package/dist/tests/language.vo.test.d.ts +1 -0
- package/dist/tests/language.vo.test.js +28 -0
- package/dist/tests/linear-regression.service.test.d.ts +1 -0
- package/dist/tests/linear-regression.service.test.js +111 -0
- package/dist/tests/mean.service.test.d.ts +1 -0
- package/dist/tests/mean.service.test.js +23 -0
- package/dist/tests/mime-registry-entry.vo.test.d.ts +1 -0
- package/dist/tests/mime-registry-entry.vo.test.js +15 -0
- package/dist/tests/mime-registry.service.test.d.ts +1 -0
- package/dist/tests/mime-registry.service.test.js +45 -0
- package/dist/tests/mime-value.vo.test.d.ts +1 -0
- package/dist/tests/mime-value.vo.test.js +49 -0
- package/dist/tests/mime.vo.test.d.ts +1 -0
- package/dist/tests/mime.vo.test.js +53 -0
- package/dist/tests/mimes.test.d.ts +1 -0
- package/dist/tests/mimes.test.js +28 -0
- package/dist/tests/min-max-scaler.service.test.d.ts +1 -0
- package/dist/tests/min-max-scaler.service.test.js +116 -0
- package/dist/tests/minute-value.vo.test.d.ts +1 -0
- package/dist/tests/minute-value.vo.test.js +24 -0
- package/dist/tests/minute.vo.test.d.ts +1 -0
- package/dist/tests/minute.vo.test.js +64 -0
- package/dist/tests/mocks.d.ts +6 -0
- package/dist/tests/mocks.js +7 -0
- package/dist/tests/money-amount.vo.test.d.ts +1 -0
- package/dist/tests/money-amount.vo.test.js +21 -0
- package/dist/tests/money.vo.test.d.ts +1 -0
- package/dist/tests/money.vo.test.js +90 -0
- package/dist/tests/month-iso-id.vo.test.d.ts +1 -0
- package/dist/tests/month-iso-id.vo.test.js +36 -0
- package/dist/tests/month.vo.test.d.ts +1 -0
- package/dist/tests/month.vo.test.js +65 -0
- package/dist/tests/multiplication-factor.vo.test.d.ts +1 -0
- package/dist/tests/multiplication-factor.vo.test.js +19 -0
- package/dist/tests/noop.test.d.ts +1 -0
- package/dist/tests/noop.test.js +12 -0
- package/dist/tests/object-key.vo.test.d.ts +1 -0
- package/dist/tests/object-key.vo.test.js +56 -0
- package/dist/tests/outlier-detector.service.test.d.ts +1 -0
- package/dist/tests/outlier-detector.service.test.js +35 -0
- package/dist/tests/package-version-schema.vo.test.d.ts +1 -0
- package/dist/tests/package-version-schema.vo.test.js +32 -0
- package/dist/tests/package-version.vo.test.d.ts +1 -0
- package/dist/tests/package-version.vo.test.js +138 -0
- package/dist/tests/pagination-page.vo.test.d.ts +1 -0
- package/dist/tests/pagination-page.vo.test.js +26 -0
- package/dist/tests/pagination-skip.vo.test.d.ts +1 -0
- package/dist/tests/pagination-skip.vo.test.js +23 -0
- package/dist/tests/pagination-take.vo.test.d.ts +1 -0
- package/dist/tests/pagination-take.vo.test.js +25 -0
- package/dist/tests/pagination.service.test.d.ts +1 -0
- package/dist/tests/pagination.service.test.js +92 -0
- package/dist/tests/percentage.service.test.d.ts +1 -0
- package/dist/tests/percentage.service.test.js +16 -0
- package/dist/tests/population-standard-deviation.service.test.d.ts +1 -0
- package/dist/tests/population-standard-deviation.service.test.js +20 -0
- package/dist/tests/quarter-iso-id.vo.test.d.ts +1 -0
- package/dist/tests/quarter-iso-id.vo.test.js +30 -0
- package/dist/tests/quarter.vo.test.d.ts +1 -0
- package/dist/tests/quarter.vo.test.js +54 -0
- package/dist/tests/random.service.test.d.ts +1 -0
- package/dist/tests/random.service.test.js +93 -0
- package/dist/tests/rate-limiter.service.test.d.ts +1 -0
- package/dist/tests/rate-limiter.service.test.js +39 -0
- package/dist/tests/relative-date.vo.test.d.ts +1 -0
- package/dist/tests/relative-date.vo.test.js +22 -0
- package/dist/tests/reordering-item-position-value.vo.test.d.ts +1 -0
- package/dist/tests/reordering-item-position-value.vo.test.js +21 -0
- package/dist/tests/reordering.service.test.d.ts +1 -0
- package/dist/tests/reordering.service.test.js +76 -0
- package/dist/tests/repeat.test.d.ts +1 -0
- package/dist/tests/repeat.test.js +8 -0
- package/dist/tests/revision-value.vo.test.d.ts +1 -0
- package/dist/tests/revision-value.vo.test.js +21 -0
- package/dist/tests/revision.vo.test.d.ts +1 -0
- package/dist/tests/revision.vo.test.js +52 -0
- package/dist/tests/rounding-decimal.strategy.test.d.ts +1 -0
- package/dist/tests/rounding-decimal.strategy.test.js +17 -0
- package/dist/tests/rounding-down.strategy.test.d.ts +1 -0
- package/dist/tests/rounding-down.strategy.test.js +9 -0
- package/dist/tests/rounding-to-nearest.strategy.test.d.ts +1 -0
- package/dist/tests/rounding-to-nearest.strategy.test.js +9 -0
- package/dist/tests/rounding-up.strategy.test.d.ts +1 -0
- package/dist/tests/rounding-up.strategy.test.js +9 -0
- package/dist/tests/size-bytes.vo.test.d.ts +1 -0
- package/dist/tests/size-bytes.vo.test.js +21 -0
- package/dist/tests/size.vo.test.d.ts +1 -0
- package/dist/tests/size.vo.test.js +93 -0
- package/dist/tests/slug.service.test.d.ts +1 -0
- package/dist/tests/slug.service.test.js +45 -0
- package/dist/tests/sum.service.test.d.ts +1 -0
- package/dist/tests/sum.service.test.js +22 -0
- package/dist/tests/thousands-separator.service.test.d.ts +1 -0
- package/dist/tests/thousands-separator.service.test.js +27 -0
- package/dist/tests/time-zone-offset-value.test.d.ts +1 -0
- package/dist/tests/time-zone-offset-value.test.js +27 -0
- package/dist/tests/timestamp-value.vo.test.d.ts +1 -0
- package/dist/tests/timestamp-value.vo.test.js +21 -0
- package/dist/tests/timestamp.vo.test.d.ts +1 -0
- package/dist/tests/timestamp.vo.test.js +73 -0
- package/dist/tests/timezone.vo.test.d.ts +1 -0
- package/dist/tests/timezone.vo.test.js +29 -0
- package/dist/tests/url-with-slash.vo.test.d.ts +1 -0
- package/dist/tests/url-with-slash.vo.test.js +24 -0
- package/dist/tests/url-without-slash.vo.test.d.ts +1 -0
- package/dist/tests/url-without-slash.vo.test.js +25 -0
- package/dist/tests/visually-unambiguous-characters-generator.service.test.d.ts +1 -0
- package/dist/tests/visually-unambiguous-characters-generator.service.test.js +89 -0
- package/dist/tests/week-iso-id.vo.test.d.ts +1 -0
- package/dist/tests/week-iso-id.vo.test.js +37 -0
- package/dist/tests/week.vo.test.d.ts +1 -0
- package/dist/tests/week.vo.test.js +64 -0
- package/dist/tests/weekday-iso-id.vo.test.d.ts +1 -0
- package/dist/tests/weekday-iso-id.vo.test.js +24 -0
- package/dist/tests/weekday.vo.test.d.ts +1 -0
- package/dist/tests/weekday.vo.test.js +51 -0
- package/dist/tests/weight-grams.vo.test.d.ts +1 -0
- package/dist/tests/weight-grams.vo.test.js +21 -0
- package/dist/tests/weight.vo.test.d.ts +1 -0
- package/dist/tests/weight.vo.test.js +66 -0
- package/dist/tests/year-iso-id.vo.test.d.ts +1 -0
- package/dist/tests/year-iso-id.vo.test.js +23 -0
- package/dist/tests/year.vo.test.d.ts +1 -0
- package/dist/tests/year.vo.test.js +79 -0
- package/dist/tests/z-score.service.test.d.ts +1 -0
- package/dist/tests/z-score.service.test.js +26 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +9 -12
- package/dist/age-years.vo.d.ts +0 -11
- package/dist/age-years.vo.js +0 -11
- package/dist/api-key.vo.d.ts +0 -8
- package/dist/api-key.vo.js +0 -11
- package/dist/basename.vo.d.ts +0 -12
- package/dist/basename.vo.js +0 -27
- package/dist/day-iso-id.vo.d.ts +0 -9
- package/dist/directory-path-absolute.vo.d.ts +0 -12
- package/dist/directory-path-relative.vo.d.ts +0 -12
- package/dist/distance-value.vo.d.ts +0 -7
- package/dist/distance-value.vo.js +0 -9
- package/dist/division-factor.vo.d.ts +0 -7
- package/dist/division-factor.vo.js +0 -8
- package/dist/duration-ms.vo.d.ts +0 -6
- package/dist/duration-ms.vo.js +0 -4
- package/dist/email.vo.d.ts +0 -6
- package/dist/email.vo.js +0 -4
- package/dist/extension.vo.d.ts +0 -9
- package/dist/extension.vo.js +0 -21
- package/dist/feature-flag-value.vo.d.ts +0 -10
- package/dist/file-path-absolute-schema.vo.d.ts +0 -14
- package/dist/file-path-relative-schema.vo.d.ts +0 -14
- package/dist/filename-affix.vo.d.ts +0 -13
- package/dist/filename-from-string.vo.d.ts +0 -10
- package/dist/height-milimiters.vo.d.ts +0 -7
- package/dist/height-milimiters.vo.js +0 -12
- package/dist/hour-value.vo.d.ts +0 -7
- package/dist/hour-value.vo.js +0 -10
- package/dist/iban-schema.vo.d.ts +0 -7
- package/dist/iban-schema.vo.js +0 -12
- package/dist/image.vo.d.ts +0 -13
- package/dist/image.vo.js +0 -20
- package/dist/integer-non-negative.vo.d.ts +0 -7
- package/dist/integer-non-negative.vo.js +0 -12
- package/dist/integer-positive.vo.d.ts +0 -7
- package/dist/integer-positive.vo.js +0 -9
- package/dist/integer.vo.d.ts +0 -6
- package/dist/integer.vo.js +0 -4
- package/dist/language.vo.d.ts +0 -7
- package/dist/mime-value.vo.d.ts +0 -6
- package/dist/mimes.js +0 -18
- package/dist/minute-value.vo.d.ts +0 -7
- package/dist/minute-value.vo.js +0 -10
- package/dist/money-amount.vo.d.ts +0 -7
- package/dist/money-amount.vo.js +0 -9
- package/dist/month-iso-id.vo.d.ts +0 -8
- package/dist/multiplication-factor.vo.d.ts +0 -7
- package/dist/multiplication-factor.vo.js +0 -11
- package/dist/object-key.vo.d.ts +0 -11
- package/dist/object-key.vo.js +0 -24
- package/dist/package-version-schema.vo.d.ts +0 -8
- package/dist/pagination-page.vo.d.ts +0 -6
- package/dist/pagination-page.vo.js +0 -7
- package/dist/pagination-skip.vo.d.ts +0 -7
- package/dist/pagination-skip.vo.js +0 -6
- package/dist/pagination-take.vo.d.ts +0 -7
- package/dist/pagination-take.vo.js +0 -6
- package/dist/quarter-iso-id.vo.d.ts +0 -7
- package/dist/quarter-iso-id.vo.js +0 -11
- package/dist/reordering-item-position-value.vo.d.ts +0 -6
- package/dist/reordering-item-position-value.vo.js +0 -6
- package/dist/revision-value.vo.d.ts +0 -7
- package/dist/revision-value.vo.js +0 -6
- package/dist/rounding-decimal.strategy.js +0 -19
- package/dist/size-bytes.vo.d.ts +0 -6
- package/dist/size-bytes.vo.js +0 -9
- package/dist/time-zone-offset-value.vo.d.ts +0 -8
- package/dist/time-zone-offset-value.vo.js +0 -17
- package/dist/timestamp-value.vo.d.ts +0 -6
- package/dist/timestamp-value.vo.js +0 -9
- package/dist/timezone.vo.d.ts +0 -9
- package/dist/url-with-slash.vo.d.ts +0 -6
- package/dist/url-with-slash.vo.js +0 -8
- package/dist/url-without-slash.vo.d.ts +0 -6
- package/dist/url-without-slash.vo.js +0 -8
- package/dist/week-iso-id.vo.d.ts +0 -8
- package/dist/weekday-iso-id.vo.d.ts +0 -7
- package/dist/weekday-iso-id.vo.js +0 -10
- package/dist/weight-grams.vo.d.ts +0 -7
- package/dist/weight-grams.vo.js +0 -9
- package/dist/year-iso-id.vo.d.ts +0 -7
- package/dist/year-iso-id.vo.js +0 -10
- package/dist/{age.vo.d.ts → src/age.vo.d.ts} +0 -0
- package/dist/{batch.d.ts → src/batch.d.ts} +0 -0
- package/dist/{batch.js → src/batch.js} +0 -0
- package/dist/{date-calculator.service.d.ts → src/date-calculator.service.d.ts} +0 -0
- package/dist/{date-calculator.service.js → src/date-calculator.service.js} +0 -0
- package/dist/{date-formatter.service.d.ts → src/date-formatter.service.d.ts} +0 -0
- package/dist/{date-formatter.service.js → src/date-formatter.service.js} +0 -0
- package/dist/{date-range.vo.d.ts → src/date-range.vo.d.ts} +0 -0
- package/dist/{date-range.vo.js → src/date-range.vo.js} +0 -0
- package/dist/{day.vo.d.ts → src/day.vo.d.ts} +1 -1
- /package/dist/{distance.vo.d.ts → src/distance.vo.d.ts} +0 -0
- /package/dist/{dll.service.d.ts → src/dll.service.d.ts} +0 -0
- /package/dist/{dll.service.js → src/dll.service.js} +0 -0
- /package/dist/{duration.service.d.ts → src/duration.service.d.ts} +0 -0
- /package/dist/{email-mask.service.d.ts → src/email-mask.service.d.ts} +0 -0
- /package/dist/{email-mask.service.js → src/email-mask.service.js} +0 -0
- /package/dist/{etags.vo.d.ts → src/etags.vo.d.ts} +0 -0
- /package/dist/{feature-flag.vo.d.ts → src/feature-flag.vo.d.ts} +0 -0
- /package/dist/{feature-flag.vo.js → src/feature-flag.vo.js} +0 -0
- /package/dist/{file-path.vo.d.ts → src/file-path.vo.d.ts} +0 -0
- /package/dist/{filename.vo.d.ts → src/filename.vo.d.ts} +0 -0
- /package/dist/{height.vo.d.ts → src/height.vo.d.ts} +0 -0
- /package/dist/{hour.vo.d.ts → src/hour.vo.d.ts} +0 -0
- /package/dist/{iban-mask.service.d.ts → src/iban-mask.service.d.ts} +0 -0
- /package/dist/{iban-mask.service.js → src/iban-mask.service.js} +0 -0
- /package/dist/{iban.vo.d.ts → src/iban.vo.d.ts} +0 -0
- /package/dist/{index.d.ts → src/index.d.ts} +0 -0
- /package/dist/{index.js → src/index.js} +0 -0
- /package/dist/{linear-regression.service.d.ts → src/linear-regression.service.d.ts} +0 -0
- /package/dist/{linear-regression.service.js → src/linear-regression.service.js} +0 -0
- /package/dist/{mean.service.d.ts → src/mean.service.d.ts} +0 -0
- /package/dist/{mean.service.js → src/mean.service.js} +0 -0
- /package/dist/{mime-registry-entry.vo.d.ts → src/mime-registry-entry.vo.d.ts} +0 -0
- /package/dist/{mime-registry-entry.vo.js → src/mime-registry-entry.vo.js} +0 -0
- /package/dist/{mime-registry.service.d.ts → src/mime-registry.service.d.ts} +0 -0
- /package/dist/{mime-registry.service.js → src/mime-registry.service.js} +0 -0
- /package/dist/{mime.vo.d.ts → src/mime.vo.d.ts} +0 -0
- /package/dist/{mimes.d.ts → src/mimes.d.ts} +0 -0
- /package/dist/{min-max-scaler.service.d.ts → src/min-max-scaler.service.d.ts} +0 -0
- /package/dist/{min-max-scaler.service.js → src/min-max-scaler.service.js} +0 -0
- /package/dist/{minute.vo.d.ts → src/minute.vo.d.ts} +0 -0
- /package/dist/{money.vo.d.ts → src/money.vo.d.ts} +0 -0
- /package/dist/{month.vo.d.ts → src/month.vo.d.ts} +0 -0
- /package/dist/{noop.service.d.ts → src/noop.service.d.ts} +0 -0
- /package/dist/{noop.service.js → src/noop.service.js} +0 -0
- /package/dist/{outlier-detector.service.d.ts → src/outlier-detector.service.d.ts} +0 -0
- /package/dist/{outlier-detector.service.js → src/outlier-detector.service.js} +0 -0
- /package/dist/{package-version.vo.d.ts → src/package-version.vo.d.ts} +0 -0
- /package/dist/{pagination.service.d.ts → src/pagination.service.d.ts} +0 -0
- /package/dist/{percentage.service.d.ts → src/percentage.service.d.ts} +0 -0
- /package/dist/{percentage.service.js → src/percentage.service.js} +0 -0
- /package/dist/{population-standard-deviation.service.d.ts → src/population-standard-deviation.service.d.ts} +0 -0
- /package/dist/{population-standard-deviation.service.js → src/population-standard-deviation.service.js} +0 -0
- /package/dist/{quarter.vo.d.ts → src/quarter.vo.d.ts} +0 -0
- /package/dist/{random.service.d.ts → src/random.service.d.ts} +0 -0
- /package/dist/{random.service.js → src/random.service.js} +0 -0
- /package/dist/{rate-limiter.service.d.ts → src/rate-limiter.service.d.ts} +0 -0
- /package/dist/{rate-limiter.service.js → src/rate-limiter.service.js} +0 -0
- /package/dist/{relative-date.vo.d.ts → src/relative-date.vo.d.ts} +0 -0
- /package/dist/{relative-date.vo.js → src/relative-date.vo.js} +0 -0
- /package/dist/{repeat.d.ts → src/repeat.d.ts} +0 -0
- /package/dist/{repeat.js → src/repeat.js} +0 -0
- /package/dist/{revision.vo.d.ts → src/revision.vo.d.ts} +0 -0
- /package/dist/{rounding-down.strategy.d.ts → src/rounding-down.strategy.d.ts} +0 -0
- /package/dist/{rounding-down.strategy.js → src/rounding-down.strategy.js} +0 -0
- /package/dist/{rounding-to-nearest.strategy.d.ts → src/rounding-to-nearest.strategy.d.ts} +0 -0
- /package/dist/{rounding-to-nearest.strategy.js → src/rounding-to-nearest.strategy.js} +0 -0
- /package/dist/{rounding-up.strategy.d.ts → src/rounding-up.strategy.d.ts} +0 -0
- /package/dist/{rounding-up.strategy.js → src/rounding-up.strategy.js} +0 -0
- /package/dist/{rounding.strategy.d.ts → src/rounding.strategy.d.ts} +0 -0
- /package/dist/{rounding.strategy.js → src/rounding.strategy.js} +0 -0
- /package/dist/{size.vo.d.ts → src/size.vo.d.ts} +0 -0
- /package/dist/{slug.service.d.ts → src/slug.service.d.ts} +0 -0
- /package/dist/{slug.service.js → src/slug.service.js} +0 -0
- /package/dist/{sum.service.d.ts → src/sum.service.d.ts} +0 -0
- /package/dist/{sum.service.js → src/sum.service.js} +0 -0
- /package/dist/{thousands-separator.service.d.ts → src/thousands-separator.service.d.ts} +0 -0
- /package/dist/{thousands-separator.service.js → src/thousands-separator.service.js} +0 -0
- /package/dist/{timestamp.vo.d.ts → src/timestamp.vo.d.ts} +0 -0
- /package/dist/{ts-utils.d.ts → src/ts-utils.d.ts} +0 -0
- /package/dist/{ts-utils.js → src/ts-utils.js} +0 -0
- /package/dist/{visually-unambiguous-characters-generator.service.d.ts → src/visually-unambiguous-characters-generator.service.d.ts} +0 -0
- /package/dist/{visually-unambiguous-characters-generator.service.js → src/visually-unambiguous-characters-generator.service.js} +0 -0
- /package/dist/{week.vo.d.ts → src/week.vo.d.ts} +0 -0
- /package/dist/{weekday.vo.d.ts → src/weekday.vo.d.ts} +0 -0
- /package/dist/{weight.vo.d.ts → src/weight.vo.d.ts} +0 -0
- /package/dist/{year.vo.d.ts → src/year.vo.d.ts} +0 -0
- /package/dist/{z-score.service.d.ts → src/z-score.service.d.ts} +0 -0
- /package/dist/{z-score.service.js → src/z-score.service.js} +0 -0
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { describe, expect, test } from "bun:test";
|
|
2
|
+
import * as v from "valibot";
|
|
3
|
+
import { ETag, WeakETag } from "../src/etags.vo";
|
|
4
|
+
import { RevisionValue } from "../src/revision-value.vo";
|
|
5
|
+
describe("ETag", () => {
|
|
6
|
+
test("happy path", () => {
|
|
7
|
+
const value = "123";
|
|
8
|
+
const etag = ETag.fromHeader(value);
|
|
9
|
+
//@ts-expect-error
|
|
10
|
+
expect(etag.value).toEqual(value);
|
|
11
|
+
//@ts-expect-error
|
|
12
|
+
expect(etag.revision).toEqual(123);
|
|
13
|
+
});
|
|
14
|
+
test("returns null for W/ prefix", () => {
|
|
15
|
+
const weakETagValue = "W/123";
|
|
16
|
+
const etag = ETag.fromHeader(weakETagValue);
|
|
17
|
+
expect(etag).toEqual(null);
|
|
18
|
+
});
|
|
19
|
+
test("returns null for nan", () => {
|
|
20
|
+
const weakETagValue = "abc";
|
|
21
|
+
const etag = ETag.fromHeader(weakETagValue);
|
|
22
|
+
expect(etag).toEqual(null);
|
|
23
|
+
});
|
|
24
|
+
test("returns null for empty", () => {
|
|
25
|
+
expect(ETag.fromHeader()).toEqual(null);
|
|
26
|
+
});
|
|
27
|
+
test("static", () => {
|
|
28
|
+
expect(ETag.HEADER_NAME).toEqual("ETag");
|
|
29
|
+
expect(ETag.IF_MATCH_HEADER_NAME).toEqual("if-match");
|
|
30
|
+
});
|
|
31
|
+
});
|
|
32
|
+
describe("WeakETag", () => {
|
|
33
|
+
test("happy path", () => {
|
|
34
|
+
const value = "W/123";
|
|
35
|
+
const weakEtag = WeakETag.fromHeader(value);
|
|
36
|
+
expect(weakEtag?.value).toEqual(value);
|
|
37
|
+
expect(weakEtag?.revision).toEqual(v.parse(RevisionValue, 123));
|
|
38
|
+
});
|
|
39
|
+
test("returns null for nan", () => {
|
|
40
|
+
const invalidValue = "W/abc";
|
|
41
|
+
expect(WeakETag.fromHeader(invalidValue)).toEqual(null);
|
|
42
|
+
});
|
|
43
|
+
test("throws for invalid", () => {
|
|
44
|
+
const invalidValue = "invalid";
|
|
45
|
+
expect(() => WeakETag.fromHeader(invalidValue)).toThrow("weak.etag.invalid");
|
|
46
|
+
});
|
|
47
|
+
test("throws for empty", () => {
|
|
48
|
+
expect(() => WeakETag.fromHeader()).toThrow("weak.etag.invalid");
|
|
49
|
+
});
|
|
50
|
+
test("static", () => {
|
|
51
|
+
expect(WeakETag.HEADER_NAME).toEqual("ETag");
|
|
52
|
+
expect(WeakETag.IF_MATCH_HEADER_NAME).toEqual("if-match");
|
|
53
|
+
});
|
|
54
|
+
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { describe, expect, test } from "bun:test";
|
|
2
|
+
import * as v from "valibot";
|
|
3
|
+
import { Extension } from "../src/extension.vo";
|
|
4
|
+
describe("Extension", () => {
|
|
5
|
+
test("happy path", () => {
|
|
6
|
+
expect(v.safeParse(Extension, "webp").success).toEqual(true);
|
|
7
|
+
expect(v.safeParse(Extension, "jpg").success).toEqual(true);
|
|
8
|
+
expect(v.safeParse(Extension, "7z").success).toEqual(true);
|
|
9
|
+
expect(v.safeParse(Extension, ".PNG").success).toEqual(true);
|
|
10
|
+
expect(v.safeParse(Extension, "a".repeat(16)).success).toEqual(true);
|
|
11
|
+
});
|
|
12
|
+
test("rejects non-string - number", () => {
|
|
13
|
+
expect(() => v.parse(Extension, 123)).toThrow("extension.type");
|
|
14
|
+
});
|
|
15
|
+
test("rejects non-string - null", () => {
|
|
16
|
+
expect(() => v.parse(Extension, null)).toThrow("extension.type");
|
|
17
|
+
});
|
|
18
|
+
test("rejects empty string", () => {
|
|
19
|
+
expect(() => v.parse(Extension, "")).toThrow("extension.empty");
|
|
20
|
+
});
|
|
21
|
+
test("rejects single char", () => {
|
|
22
|
+
expect(() => v.parse(Extension, "a")).toThrow("extension.empty");
|
|
23
|
+
});
|
|
24
|
+
test("rejects single dot", () => {
|
|
25
|
+
expect(() => v.parse(Extension, ".")).toThrow("extension.empty");
|
|
26
|
+
});
|
|
27
|
+
test("rejects too long", () => {
|
|
28
|
+
expect(() => v.parse(Extension, "a".repeat(17))).toThrow("extension.too.long");
|
|
29
|
+
});
|
|
30
|
+
test("rejects hyphen", () => {
|
|
31
|
+
expect(() => v.parse(Extension, "web-p")).toThrow("extension.bad.chars");
|
|
32
|
+
});
|
|
33
|
+
test("rejects space", () => {
|
|
34
|
+
expect(() => v.parse(Extension, "web p")).toThrow("extension.bad.chars");
|
|
35
|
+
});
|
|
36
|
+
test("rejects punctuation", () => {
|
|
37
|
+
expect(() => v.parse(Extension, "webp!")).toThrow("extension.bad.chars");
|
|
38
|
+
});
|
|
39
|
+
test("rejects double dot", () => {
|
|
40
|
+
expect(() => v.parse(Extension, "..png")).toThrow("extension.bad.chars");
|
|
41
|
+
});
|
|
42
|
+
test("rejects prefix", () => {
|
|
43
|
+
expect(() => v.parse(Extension, "!webp")).toThrow("extension.bad.chars");
|
|
44
|
+
});
|
|
45
|
+
test("rejects suffix", () => {
|
|
46
|
+
expect(() => v.parse(Extension, "webp ")).toThrow("extension.bad.chars");
|
|
47
|
+
});
|
|
48
|
+
test("rejects internal dot", () => {
|
|
49
|
+
expect(() => v.parse(Extension, "a.png")).toThrow("extension.bad.chars");
|
|
50
|
+
});
|
|
51
|
+
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { describe, expect, test } from "bun:test";
|
|
2
|
+
import * as v from "valibot";
|
|
3
|
+
import { FeatureFlagValue } from "../src/feature-flag-value.vo";
|
|
4
|
+
describe("FeatureFlagValue", () => {
|
|
5
|
+
test("happy path", () => {
|
|
6
|
+
expect(v.safeParse(FeatureFlagValue, "yes").success).toEqual(true);
|
|
7
|
+
expect(v.safeParse(FeatureFlagValue, "no").success).toEqual(true);
|
|
8
|
+
});
|
|
9
|
+
test("rejects other values", () => {
|
|
10
|
+
expect(() => v.parse(FeatureFlagValue, "maybe")).toThrow("feature.flag.value.invalid");
|
|
11
|
+
});
|
|
12
|
+
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { describe, expect, test } from "bun:test";
|
|
2
|
+
import { FeatureFlag } from "../src/feature-flag.vo";
|
|
3
|
+
import { FeatureFlagEnum } from "../src/feature-flag-value.vo";
|
|
4
|
+
describe("FeatureFlag", () => {
|
|
5
|
+
test("isEnabled", () => {
|
|
6
|
+
expect(FeatureFlag.isEnabled(FeatureFlagEnum.yes)).toEqual(true);
|
|
7
|
+
expect(FeatureFlag.isEnabled(FeatureFlagEnum.no)).toEqual(false);
|
|
8
|
+
});
|
|
9
|
+
test("isDisabled", () => {
|
|
10
|
+
expect(FeatureFlag.isDisabled(FeatureFlagEnum.yes)).toEqual(false);
|
|
11
|
+
expect(FeatureFlag.isDisabled(FeatureFlagEnum.no)).toEqual(true);
|
|
12
|
+
});
|
|
13
|
+
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { describe, expect, test } from "bun:test";
|
|
2
|
+
import * as v from "valibot";
|
|
3
|
+
import { DirectoryPathAbsoluteSchema } from "../src/directory-path-absolute.vo";
|
|
4
|
+
import { FilePathAbsoluteSchema } from "../src/file-path-absolute-schema.vo";
|
|
5
|
+
describe("FilePathAbsoluteSchema", () => {
|
|
6
|
+
test("happy path", () => {
|
|
7
|
+
expect({
|
|
8
|
+
directory: v.parse(FilePathAbsoluteSchema, "/avatar.webp").directory,
|
|
9
|
+
filename: v.parse(FilePathAbsoluteSchema, "/avatar.webp").filename.get(),
|
|
10
|
+
}).toEqual({ directory: v.parse(DirectoryPathAbsoluteSchema, "/"), filename: "avatar.webp" });
|
|
11
|
+
expect({
|
|
12
|
+
directory: v.parse(FilePathAbsoluteSchema, "/var/uploads/avatar.webp").directory,
|
|
13
|
+
filename: v.parse(FilePathAbsoluteSchema, "/var/uploads/avatar.webp").filename.get(),
|
|
14
|
+
}).toEqual({ directory: v.parse(DirectoryPathAbsoluteSchema, "/var/uploads"), filename: "avatar.webp" });
|
|
15
|
+
});
|
|
16
|
+
test("rejects non-string - number", () => {
|
|
17
|
+
expect(() => v.parse(FilePathAbsoluteSchema, 123)).toThrow("file.path.absolute.type");
|
|
18
|
+
});
|
|
19
|
+
test("rejects non-string - null", () => {
|
|
20
|
+
expect(() => v.parse(FilePathAbsoluteSchema, null)).toThrow("file.path.absolute.type");
|
|
21
|
+
});
|
|
22
|
+
test("rejects empty", () => {
|
|
23
|
+
expect(() => v.parse(FilePathAbsoluteSchema, "")).toThrow("file.path.absolute.empty");
|
|
24
|
+
});
|
|
25
|
+
test("rejects lacking leading slash", () => {
|
|
26
|
+
expect(() => v.parse(FilePathAbsoluteSchema, "var/uploads/avatar.webp")).toThrow("file.path.absolute.leading.slash");
|
|
27
|
+
});
|
|
28
|
+
test("rejects backslashes", () => {
|
|
29
|
+
expect(() => v.parse(FilePathAbsoluteSchema, "/var\\uploads/avatar.webp")).toThrow("file.path.absolute.backslash.forbidden");
|
|
30
|
+
});
|
|
31
|
+
test("rejects trailing slash", () => {
|
|
32
|
+
expect(() => v.parse(FilePathAbsoluteSchema, "/var/uploads/avatar.webp/")).toThrow("file.path.absolute.trailing.slash");
|
|
33
|
+
});
|
|
34
|
+
test("single-segment path keeps root directory", () => {
|
|
35
|
+
expect({
|
|
36
|
+
directory: v.parse(FilePathAbsoluteSchema, "/avatar.webp").directory,
|
|
37
|
+
filename: v.parse(FilePathAbsoluteSchema, "/avatar.webp").filename.get(),
|
|
38
|
+
}).toEqual({ directory: v.parse(DirectoryPathAbsoluteSchema, "/"), filename: "avatar.webp" });
|
|
39
|
+
});
|
|
40
|
+
test("delegated failures", () => {
|
|
41
|
+
const invalid = [
|
|
42
|
+
"/var/./avatar.webp",
|
|
43
|
+
"/var/../avatar.webp",
|
|
44
|
+
"/var/\u0000/uploads/avatar.webp",
|
|
45
|
+
"/var/uploads/",
|
|
46
|
+
"/var/uploads/avatar",
|
|
47
|
+
"/var/upload s/avatar.webp",
|
|
48
|
+
];
|
|
49
|
+
for (const value of invalid) {
|
|
50
|
+
expect(() => v.parse(FilePathAbsoluteSchema, value)).toThrow();
|
|
51
|
+
}
|
|
52
|
+
});
|
|
53
|
+
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { describe, expect, test } from "bun:test";
|
|
2
|
+
import * as v from "valibot";
|
|
3
|
+
import { DirectoryPathRelativeSchema } from "../src/directory-path-relative.vo";
|
|
4
|
+
import { FilePathRelativeSchema } from "../src/file-path-relative-schema.vo";
|
|
5
|
+
describe("FilePathRelativeSchema", () => {
|
|
6
|
+
test("happy path", () => {
|
|
7
|
+
expect({
|
|
8
|
+
directory: v.parse(FilePathRelativeSchema, "tmp/file.txt").directory,
|
|
9
|
+
filename: v.parse(FilePathRelativeSchema, "tmp/file.txt").filename.get(),
|
|
10
|
+
}).toEqual({ directory: v.parse(DirectoryPathRelativeSchema, "tmp"), filename: "file.txt" });
|
|
11
|
+
expect({
|
|
12
|
+
directory: v.parse(FilePathRelativeSchema, "a/b/c/avatar.webp").directory,
|
|
13
|
+
filename: v.parse(FilePathRelativeSchema, "a/b/c/avatar.webp").filename.get(),
|
|
14
|
+
}).toEqual({ directory: v.parse(DirectoryPathRelativeSchema, "a/b/c"), filename: "avatar.webp" });
|
|
15
|
+
expect({
|
|
16
|
+
directory: v.parse(FilePathRelativeSchema, "dir/sub/archive.tar.gz").directory,
|
|
17
|
+
filename: v.parse(FilePathRelativeSchema, "dir/sub/archive.tar.gz").filename.get(),
|
|
18
|
+
}).toEqual({ directory: v.parse(DirectoryPathRelativeSchema, "dir/sub"), filename: "archive.tar.gz" });
|
|
19
|
+
});
|
|
20
|
+
test("rejects non-string - null", () => {
|
|
21
|
+
expect(() => v.parse(FilePathRelativeSchema, null)).toThrow("file.path.relative.type");
|
|
22
|
+
});
|
|
23
|
+
test("rejects non-string - number", () => {
|
|
24
|
+
expect(() => v.parse(FilePathRelativeSchema, 123)).toThrow("file.path.relative.type");
|
|
25
|
+
});
|
|
26
|
+
test("rejects empty", () => {
|
|
27
|
+
expect(() => v.parse(FilePathRelativeSchema, "")).toThrow("file.path.relative.empty");
|
|
28
|
+
});
|
|
29
|
+
test("rejects leading slash", () => {
|
|
30
|
+
expect(() => v.parse(FilePathRelativeSchema, "/tmp/file.txt")).toThrow("file.path.relative.leading.slash");
|
|
31
|
+
});
|
|
32
|
+
test("rejects backslash", () => {
|
|
33
|
+
expect(() => v.parse(FilePathRelativeSchema, "tmp\\file.txt")).toThrow("file.path.relative.backslash.forbidden");
|
|
34
|
+
});
|
|
35
|
+
test("rejects no directory", () => {
|
|
36
|
+
expect(() => v.parse(FilePathRelativeSchema, "file.txt")).toThrow("file.path.relative.requires.directory");
|
|
37
|
+
});
|
|
38
|
+
test("delegated failures", () => {
|
|
39
|
+
const invalid = [
|
|
40
|
+
"tmp/./file.txt",
|
|
41
|
+
"tmp/../file.txt",
|
|
42
|
+
"tmp/\u0000/sub/file.txt",
|
|
43
|
+
"my dir/file.txt",
|
|
44
|
+
"tmp/file",
|
|
45
|
+
"tmp/file name.txt",
|
|
46
|
+
"tmp/",
|
|
47
|
+
];
|
|
48
|
+
for (const value of invalid) {
|
|
49
|
+
expect(() => v.parse(FilePathRelativeSchema, value)).toThrow();
|
|
50
|
+
}
|
|
51
|
+
});
|
|
52
|
+
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { describe, expect, test } from "bun:test";
|
|
2
|
+
import * as v from "valibot";
|
|
3
|
+
import { DirectoryPathAbsoluteSchema } from "../src/directory-path-absolute.vo";
|
|
4
|
+
import { DirectoryPathRelativeSchema } from "../src/directory-path-relative.vo";
|
|
5
|
+
import { FilePathAbsolute, FilePathRelative } from "../src/file-path.vo";
|
|
6
|
+
import { Filename } from "../src/filename.vo";
|
|
7
|
+
describe("FilePathRelative", () => {
|
|
8
|
+
test("fromParts", () => {
|
|
9
|
+
expect(FilePathRelative.fromParts("users/avatars", Filename.fromString("avatar.webp")).get()).toEqual("users/avatars/avatar.webp");
|
|
10
|
+
});
|
|
11
|
+
test("fromString", () => {
|
|
12
|
+
expect({
|
|
13
|
+
path: FilePathRelative.fromString("tmp/file.txt").get(),
|
|
14
|
+
directory: FilePathRelative.fromString("tmp/file.txt").getDirectory(),
|
|
15
|
+
filename: FilePathRelative.fromString("tmp/file.txt").getFilename().get(),
|
|
16
|
+
}).toEqual({
|
|
17
|
+
path: "tmp/file.txt",
|
|
18
|
+
directory: v.parse(DirectoryPathRelativeSchema, "tmp"),
|
|
19
|
+
filename: "file.txt",
|
|
20
|
+
});
|
|
21
|
+
});
|
|
22
|
+
test("rejects absolute paths", () => {
|
|
23
|
+
expect(() => FilePathRelative.fromString("/tmp/file.txt")).toThrow();
|
|
24
|
+
});
|
|
25
|
+
test("withFilename", () => {
|
|
26
|
+
expect(FilePathRelative.fromParts("users/avatars", Filename.fromString("avatar.webp"))
|
|
27
|
+
.withFilename(Filename.fromString("avatar.png"))
|
|
28
|
+
.get()).toEqual("users/avatars/avatar.png");
|
|
29
|
+
});
|
|
30
|
+
test("withDirectory", () => {
|
|
31
|
+
expect(FilePathRelative.fromParts("users/avatars", Filename.fromString("avatar.webp"))
|
|
32
|
+
.withDirectory(v.parse(DirectoryPathRelativeSchema, "users/pictures"))
|
|
33
|
+
.get()).toEqual("users/pictures/avatar.webp");
|
|
34
|
+
});
|
|
35
|
+
test("toAbsolute", () => {
|
|
36
|
+
expect(FilePathRelative.fromParts("users/avatars", Filename.fromString("avatar.webp"))
|
|
37
|
+
.toAbsolute(v.parse(DirectoryPathAbsoluteSchema, "/tmp/app"))
|
|
38
|
+
.get()).toEqual("/tmp/app/avatar.webp");
|
|
39
|
+
});
|
|
40
|
+
});
|
|
41
|
+
describe("FilePathAbsolute", () => {
|
|
42
|
+
test("fromParts", () => {
|
|
43
|
+
expect(FilePathAbsolute.fromParts("/tmp/app/users", Filename.fromString("avatar.webp")).get()).toEqual("/tmp/app/users/avatar.webp");
|
|
44
|
+
});
|
|
45
|
+
test("fromString", () => {
|
|
46
|
+
expect({
|
|
47
|
+
path: FilePathAbsolute.fromString("/avatar.webp").get(),
|
|
48
|
+
directory: FilePathAbsolute.fromString("/avatar.webp").getDirectory(),
|
|
49
|
+
filename: FilePathAbsolute.fromString("/avatar.webp").getFilename().get(),
|
|
50
|
+
}).toEqual({
|
|
51
|
+
path: "/avatar.webp",
|
|
52
|
+
directory: v.parse(DirectoryPathAbsoluteSchema, "/"),
|
|
53
|
+
filename: "avatar.webp",
|
|
54
|
+
});
|
|
55
|
+
});
|
|
56
|
+
test("rejects relative paths", () => {
|
|
57
|
+
expect(() => FilePathAbsolute.fromString("var/uploads/avatar.webp")).toThrow();
|
|
58
|
+
});
|
|
59
|
+
test("withFilename", () => {
|
|
60
|
+
expect(FilePathAbsolute.fromParts("/tmp/app/users", Filename.fromString("avatar.webp"))
|
|
61
|
+
.withFilename(Filename.fromString("avatar.png"))
|
|
62
|
+
.get()).toEqual("/tmp/app/users/avatar.png");
|
|
63
|
+
});
|
|
64
|
+
test("withDirectory", () => {
|
|
65
|
+
expect(FilePathAbsolute.fromParts("/tmp/app/users", Filename.fromString("avatar.webp"))
|
|
66
|
+
.withDirectory(v.parse(DirectoryPathAbsoluteSchema, "/var/lib/app/users"))
|
|
67
|
+
.get()).toEqual("/var/lib/app/users/avatar.webp");
|
|
68
|
+
});
|
|
69
|
+
test("toRelative", () => {
|
|
70
|
+
expect(FilePathAbsolute.fromParts("/tmp/app/users", Filename.fromString("avatar.webp"))
|
|
71
|
+
.toRelative(v.parse(DirectoryPathRelativeSchema, "users/avatars"))
|
|
72
|
+
.get()).toEqual("users/avatars/avatar.webp");
|
|
73
|
+
});
|
|
74
|
+
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { describe, expect, test } from "bun:test";
|
|
2
|
+
import * as v from "valibot";
|
|
3
|
+
import { FilenameAffix } from "../src/filename-affix.vo";
|
|
4
|
+
describe("FilenameAffixSchema", () => {
|
|
5
|
+
test("happy path", () => {
|
|
6
|
+
expect(v.safeParse(FilenameAffix, "-sm").success).toEqual(true);
|
|
7
|
+
expect(v.safeParse(FilenameAffix, "_v2").success).toEqual(true);
|
|
8
|
+
});
|
|
9
|
+
test("rejects prefix", () => {
|
|
10
|
+
expect(() => v.parse(FilenameAffix, "*-sm")).toThrow("affix.bad.chars");
|
|
11
|
+
});
|
|
12
|
+
test("rejects suffix", () => {
|
|
13
|
+
expect(() => v.parse(FilenameAffix, "sm-*")).toThrow("affix.bad.chars");
|
|
14
|
+
});
|
|
15
|
+
test("rejects non-string - number", () => {
|
|
16
|
+
expect(() => v.parse(FilenameAffix, 123)).toThrow("affix.type");
|
|
17
|
+
});
|
|
18
|
+
test("rejects non-string - null", () => {
|
|
19
|
+
expect(() => v.parse(FilenameAffix, null)).toThrow("affix.type");
|
|
20
|
+
});
|
|
21
|
+
test("rejects empty", () => {
|
|
22
|
+
expect(() => v.parse(FilenameAffix, "")).toThrow("affix.empty");
|
|
23
|
+
});
|
|
24
|
+
test("rejects too long", () => {
|
|
25
|
+
expect(() => v.parse(FilenameAffix, "x".repeat(33))).toThrow("affix.too.long");
|
|
26
|
+
});
|
|
27
|
+
test("rejects disallowed characters", () => {
|
|
28
|
+
expect(() => v.parse(FilenameAffix, "/@!")).toThrow("affix.bad.chars");
|
|
29
|
+
});
|
|
30
|
+
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { describe, expect, test } from "bun:test";
|
|
2
|
+
import * as v from "valibot";
|
|
3
|
+
import { Basename } from "../src/basename.vo";
|
|
4
|
+
import { Extension } from "../src/extension.vo";
|
|
5
|
+
import { FilenameFromString } from "../src/filename-from-string.vo";
|
|
6
|
+
describe("FilenameFromString", () => {
|
|
7
|
+
test("happy path", () => {
|
|
8
|
+
expect(v.parse(FilenameFromString, "avatar.WEBP")).toEqual({
|
|
9
|
+
basename: v.parse(Basename, "avatar"),
|
|
10
|
+
extension: v.parse(Extension, "webp"),
|
|
11
|
+
});
|
|
12
|
+
});
|
|
13
|
+
test("rejects prefix", () => {
|
|
14
|
+
expect(() => v.parse(FilenameFromString, "\navatar.png")).toThrow("filename.from.string.invalid");
|
|
15
|
+
});
|
|
16
|
+
test("rejects suffix", () => {
|
|
17
|
+
expect(() => v.parse(FilenameFromString, "avatar.png\n")).toThrow("filename.from.string.invalid");
|
|
18
|
+
});
|
|
19
|
+
test("rejects non-string - null", () => {
|
|
20
|
+
expect(() => v.parse(FilenameFromString, null)).toThrow("filename.from.string.type");
|
|
21
|
+
});
|
|
22
|
+
test("rejects non-string - number", () => {
|
|
23
|
+
expect(() => v.parse(FilenameFromString, 123)).toThrow("filename.from.string.type");
|
|
24
|
+
});
|
|
25
|
+
test("rejects empty", () => {
|
|
26
|
+
expect(() => v.parse(FilenameFromString, "")).toThrow("filename.from.string.invalid");
|
|
27
|
+
});
|
|
28
|
+
test("rejects missing extension", () => {
|
|
29
|
+
expect(() => v.parse(FilenameFromString, "avatar")).toThrow("filename.from.string.invalid");
|
|
30
|
+
});
|
|
31
|
+
test("rejects missing extension with dot", () => {
|
|
32
|
+
expect(() => v.parse(FilenameFromString, "name.")).toThrow("filename.from.string.invalid");
|
|
33
|
+
});
|
|
34
|
+
test("rejects only an extension", () => {
|
|
35
|
+
expect(() => v.parse(FilenameFromString, ".png")).toThrow("filename.from.string.invalid");
|
|
36
|
+
});
|
|
37
|
+
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import { describe, expect, test } from "bun:test";
|
|
2
|
+
import * as v from "valibot";
|
|
3
|
+
import { Basename } from "../src/basename.vo";
|
|
4
|
+
import { Extension } from "../src/extension.vo";
|
|
5
|
+
import { Filename } from "../src/filename.vo";
|
|
6
|
+
import { FilenameAffix, FilenameAffixStrategy } from "../src/filename-affix.vo";
|
|
7
|
+
import { FilenameFromStringError } from "../src/filename-from-string.vo";
|
|
8
|
+
describe("Filename", () => {
|
|
9
|
+
test("fromParts", () => {
|
|
10
|
+
expect(Filename.fromParts("report", ".PNG").get()).toEqual("report.png");
|
|
11
|
+
});
|
|
12
|
+
test("fromPartsSafe", () => {
|
|
13
|
+
const basename = v.parse(Basename, "avatar");
|
|
14
|
+
const extension = v.parse(Extension, "webp");
|
|
15
|
+
expect(Filename.fromPartsSafe(basename, extension).get()).toEqual("avatar.webp");
|
|
16
|
+
});
|
|
17
|
+
test("fromString rejects invalid input", () => {
|
|
18
|
+
expect(() => Filename.fromString("avatar")).toThrow(FilenameFromStringError.Invalid);
|
|
19
|
+
expect(() => Filename.fromString(".env")).toThrow(FilenameFromStringError.Invalid);
|
|
20
|
+
expect(() => Filename.fromString("name.")).toThrow(FilenameFromStringError.Invalid);
|
|
21
|
+
});
|
|
22
|
+
test("get", () => {
|
|
23
|
+
expect(Filename.fromParts("user-photo", "jpg").get()).toEqual("user-photo.jpg");
|
|
24
|
+
});
|
|
25
|
+
test("getBasename", () => {
|
|
26
|
+
expect(Filename.fromString("user-photo.jpg").getBasename()).toEqual(v.parse(Basename, "user-photo"));
|
|
27
|
+
});
|
|
28
|
+
test("getExtension", () => {
|
|
29
|
+
expect(Filename.fromString("user-photo.jpg").getExtension()).toEqual(v.parse(Extension, "jpg"));
|
|
30
|
+
});
|
|
31
|
+
test("withExtension", () => {
|
|
32
|
+
const filename = Filename.fromString("avatar.webp");
|
|
33
|
+
const extension = v.parse(Extension, "png");
|
|
34
|
+
const updated = filename.withExtension(extension);
|
|
35
|
+
expect(filename.get()).toEqual("avatar.webp");
|
|
36
|
+
expect(updated.get()).toEqual("avatar.png");
|
|
37
|
+
});
|
|
38
|
+
test("withBasename", () => {
|
|
39
|
+
const filename = Filename.fromString("avatar.webp");
|
|
40
|
+
const basename = v.parse(Basename, "profile_v2");
|
|
41
|
+
const updated = filename.withBasename(basename);
|
|
42
|
+
expect(filename.get()).toEqual("avatar.webp");
|
|
43
|
+
expect(updated.get()).toEqual("profile_v2.webp");
|
|
44
|
+
});
|
|
45
|
+
test("withAffix - suffix", () => {
|
|
46
|
+
expect(Filename.fromString("avatar.webp").withAffix("-sm", FilenameAffixStrategy.suffix).get()).toEqual("avatar-sm.webp");
|
|
47
|
+
});
|
|
48
|
+
test("withSuffix", () => {
|
|
49
|
+
expect(Filename.fromString("avatar.webp").withSuffix("-sm").get()).toEqual("avatar-sm.webp");
|
|
50
|
+
});
|
|
51
|
+
test("withAffix rejects invalid input - suffix", () => {
|
|
52
|
+
expect(() => Filename.fromString("avatar.webp").withAffix("", FilenameAffixStrategy.suffix)).toThrow("affix.empty");
|
|
53
|
+
});
|
|
54
|
+
test("withAffixSafe - suffix", () => {
|
|
55
|
+
const filename = Filename.fromString("avatar.webp");
|
|
56
|
+
const affix = v.parse(FilenameAffix, "-sm");
|
|
57
|
+
expect(filename.withAffixSafe(affix, FilenameAffixStrategy.suffix).get()).toEqual("avatar-sm.webp");
|
|
58
|
+
});
|
|
59
|
+
test("withSuffixSafe", () => {
|
|
60
|
+
const filename = Filename.fromString("avatar.webp");
|
|
61
|
+
const affix = v.parse(FilenameAffix, "-sm");
|
|
62
|
+
expect(filename.withSuffixSafe(affix).get()).toEqual("avatar-sm.webp");
|
|
63
|
+
});
|
|
64
|
+
test("withAffix - prefix", () => {
|
|
65
|
+
expect(Filename.fromString("avatar.webp").withAffix("sm-", FilenameAffixStrategy.prefix).get()).toEqual("sm-avatar.webp");
|
|
66
|
+
});
|
|
67
|
+
test("withPrefix", () => {
|
|
68
|
+
expect(Filename.fromString("avatar.webp").withPrefix("sm-").get()).toEqual("sm-avatar.webp");
|
|
69
|
+
});
|
|
70
|
+
test("withAffix rejects invalid input - prefix", () => {
|
|
71
|
+
expect(() => Filename.fromString("avatar.webp").withAffix("", FilenameAffixStrategy.prefix)).toThrow("affix.empty");
|
|
72
|
+
});
|
|
73
|
+
test("withAffixSafe - prefix", () => {
|
|
74
|
+
const filename = Filename.fromString("avatar.webp");
|
|
75
|
+
const affix = v.parse(FilenameAffix, "sm-");
|
|
76
|
+
expect(filename.withAffixSafe(affix, FilenameAffixStrategy.prefix).get()).toEqual("sm-avatar.webp");
|
|
77
|
+
});
|
|
78
|
+
test("withPrefixSafe", () => {
|
|
79
|
+
const filename = Filename.fromString("avatar.webp");
|
|
80
|
+
const affix = v.parse(FilenameAffix, "sm-");
|
|
81
|
+
expect(filename.withPrefixSafe(affix).get()).toEqual("sm-avatar.webp");
|
|
82
|
+
});
|
|
83
|
+
test("toString", () => {
|
|
84
|
+
const basename = v.parse(Basename, "avatar");
|
|
85
|
+
const extension = v.parse(Extension, "webp");
|
|
86
|
+
expect(Filename.fromPartsSafe(basename, extension).toString()).toEqual("avatar.webp");
|
|
87
|
+
});
|
|
88
|
+
test("toJSON", () => {
|
|
89
|
+
const basename = v.parse(Basename, "avatar");
|
|
90
|
+
const extension = v.parse(Extension, "webp");
|
|
91
|
+
expect(Filename.fromPartsSafe(basename, extension).toJSON()).toEqual("avatar.webp");
|
|
92
|
+
});
|
|
93
|
+
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { describe, expect, test } from "bun:test";
|
|
2
|
+
import * as v from "valibot";
|
|
3
|
+
import { HeightMillimeters } from "../src/height-milimiters.vo";
|
|
4
|
+
describe("HeightMillimeters", () => {
|
|
5
|
+
test("happy path", () => {
|
|
6
|
+
expect(v.safeParse(HeightMillimeters, 1).success).toEqual(true);
|
|
7
|
+
expect(v.safeParse(HeightMillimeters, 50).success).toEqual(true);
|
|
8
|
+
});
|
|
9
|
+
test("rejects non-number - null", () => {
|
|
10
|
+
expect(() => v.parse(HeightMillimeters, null)).toThrow("height.millimeters.type");
|
|
11
|
+
});
|
|
12
|
+
test("rejects non-number - string", () => {
|
|
13
|
+
expect(() => v.parse(HeightMillimeters, "123")).toThrow("height.millimeters.type");
|
|
14
|
+
});
|
|
15
|
+
test("rejects fractions", () => {
|
|
16
|
+
expect(() => v.parse(HeightMillimeters, 1.5)).toThrow("height.millimeters.type");
|
|
17
|
+
});
|
|
18
|
+
test("rejects negative numbers", () => {
|
|
19
|
+
expect(() => v.parse(HeightMillimeters, -1)).toThrow("height.millimeters.invalid");
|
|
20
|
+
});
|
|
21
|
+
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { describe, expect, test } from "bun:test";
|
|
2
|
+
import * as v from "valibot";
|
|
3
|
+
import { Height } from "../src/height.vo";
|
|
4
|
+
import { HeightMillimeters } from "../src/height-milimiters.vo";
|
|
5
|
+
import { RoundingDownStrategy } from "../src/rounding-down.strategy";
|
|
6
|
+
import { RoundingUpStrategy } from "../src/rounding-up.strategy";
|
|
7
|
+
describe("Height", () => {
|
|
8
|
+
test("fromCentimeters", () => {
|
|
9
|
+
expect(Height.fromCentimeters(180).toMillimeters()).toEqual(1800);
|
|
10
|
+
expect(Height.fromCentimeters(180.04, new RoundingDownStrategy()).toMillimeters()).toEqual(1800);
|
|
11
|
+
expect(Height.fromCentimeters(180.06, new RoundingUpStrategy()).toMillimeters()).toEqual(1801);
|
|
12
|
+
});
|
|
13
|
+
test("fromMillimeters", () => {
|
|
14
|
+
expect(Height.fromMillimeters(180).toMillimeters()).toEqual(180);
|
|
15
|
+
});
|
|
16
|
+
test("fromMillimetersSafe", () => {
|
|
17
|
+
expect(Height.fromMillimetersSafe(v.parse(HeightMillimeters, 100)).toMillimeters()).toEqual(100);
|
|
18
|
+
});
|
|
19
|
+
test("zero factory", () => {
|
|
20
|
+
expect(Height.zero().toMillimeters()).toEqual(0);
|
|
21
|
+
});
|
|
22
|
+
test("guards invalid inputs", () => {
|
|
23
|
+
expect(() => Height.fromCentimeters(-1)).toThrow("height.millimeters.invalid");
|
|
24
|
+
expect(() => Height.fromMillimeters(Number.NaN)).toThrow("height.millimeters.type");
|
|
25
|
+
expect(() => Height.fromMillimeters(Number.POSITIVE_INFINITY)).toThrow("height.millimeters.type");
|
|
26
|
+
});
|
|
27
|
+
test("toCentimeters", () => {
|
|
28
|
+
const height = Height.fromCentimeters(180);
|
|
29
|
+
expect(height.toCentimeters()).toEqual(180);
|
|
30
|
+
expect(height.toCentimeters()).toEqual(180);
|
|
31
|
+
expect(Height.fromMillimeters(1804).toCentimeters()).toEqual(180.4);
|
|
32
|
+
});
|
|
33
|
+
test("equals", () => {
|
|
34
|
+
const a = Height.fromCentimeters(1800);
|
|
35
|
+
const b = Height.fromCentimeters(180);
|
|
36
|
+
expect(a.equals(a)).toEqual(true);
|
|
37
|
+
expect(a.equals(b)).toEqual(false);
|
|
38
|
+
});
|
|
39
|
+
test("greaterThan", () => {
|
|
40
|
+
const a = Height.fromCentimeters(1800);
|
|
41
|
+
const b = Height.fromCentimeters(180);
|
|
42
|
+
expect(a.greaterThan(a)).toEqual(false);
|
|
43
|
+
expect(a.greaterThan(b)).toEqual(true);
|
|
44
|
+
});
|
|
45
|
+
test("lessThan", () => {
|
|
46
|
+
const a = Height.fromCentimeters(180);
|
|
47
|
+
const b = Height.fromCentimeters(1800);
|
|
48
|
+
expect(a.lessThan(a)).toEqual(false);
|
|
49
|
+
expect(a.lessThan(b)).toEqual(true);
|
|
50
|
+
});
|
|
51
|
+
test("isZero", () => {
|
|
52
|
+
expect(Height.zero().isZero()).toEqual(true);
|
|
53
|
+
expect(Height.fromCentimeters(180).isZero()).toEqual(false);
|
|
54
|
+
});
|
|
55
|
+
test("get", () => {
|
|
56
|
+
expect(Height.fromMillimeters(1804).get()).toEqual(1804);
|
|
57
|
+
});
|
|
58
|
+
test("toString", () => {
|
|
59
|
+
expect(Height.fromMillimeters(1804).toString()).toEqual("1804");
|
|
60
|
+
});
|
|
61
|
+
test("toJSON", () => {
|
|
62
|
+
expect(Height.fromMillimeters(1804).toJSON()).toEqual(1804);
|
|
63
|
+
});
|
|
64
|
+
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { describe, expect, test } from "bun:test";
|
|
2
|
+
import * as v from "valibot";
|
|
3
|
+
import { HourValue } from "../src/hour-value.vo";
|
|
4
|
+
describe("HourValue", () => {
|
|
5
|
+
test("happy path", () => {
|
|
6
|
+
expect(v.safeParse(HourValue, 0).success).toEqual(true);
|
|
7
|
+
expect(v.safeParse(HourValue, 23).success).toEqual(true);
|
|
8
|
+
});
|
|
9
|
+
test("rejects non-number - null", () => {
|
|
10
|
+
expect(() => v.parse(HourValue, null)).toThrow("hour.value.type");
|
|
11
|
+
});
|
|
12
|
+
test("rejects non-number - string", () => {
|
|
13
|
+
expect(() => v.parse(HourValue, "123")).toThrow("hour.value.type");
|
|
14
|
+
});
|
|
15
|
+
test("rejects fractions", () => {
|
|
16
|
+
expect(() => v.parse(HourValue, 1.5)).toThrow("hour.value.type");
|
|
17
|
+
});
|
|
18
|
+
test("rejects negative numbers", () => {
|
|
19
|
+
expect(() => v.parse(HourValue, -1)).toThrow("hour.value.invalid");
|
|
20
|
+
});
|
|
21
|
+
test("rejects too big", () => {
|
|
22
|
+
expect(() => v.parse(HourValue, 24)).toThrow("hour.value.invalid");
|
|
23
|
+
});
|
|
24
|
+
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|