-
-
Notifications
You must be signed in to change notification settings - Fork 87
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #123 from ego-io/feature/date-range
feature/date range
- Loading branch information
Showing
23 changed files
with
353 additions
and
5 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
21 changes: 21 additions & 0 deletions
21
packages/core/field/__snapshots__/date-range-field.type.test.ts.snap
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,21 @@ | ||
// Vitest Snapshot v1 | ||
|
||
exports[`dateRangeFieldValue 1`] = ` | ||
[ZodError: [ | ||
{ | ||
"code": "custom", | ||
"message": "date range value from should before value to", | ||
"path": [] | ||
} | ||
]] | ||
`; | ||
|
||
exports[`dateRangeFieldValue 2`] = ` | ||
[ZodError: [ | ||
{ | ||
"code": "custom", | ||
"message": "date range value from should before value to", | ||
"path": [] | ||
} | ||
]] | ||
`; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,17 @@ | ||
import { ValueObject } from '@egodb/domain' | ||
import { isDate } from 'date-fns' | ||
import type { IDateRangeFieldValue } from './date-range-field.type' | ||
|
||
export class DateRangeFieldValue extends ValueObject<IDateRangeFieldValue> { | ||
constructor(value: IDateRangeFieldValue) { | ||
super(value ? value : { value }) | ||
} | ||
|
||
static isDateRange(value: unknown): value is IDateRangeFieldValue { | ||
return Array.isArray(value) && value.length === 2 && isDate(value[0]) && isDate(value[1]) | ||
} | ||
|
||
unpack() { | ||
return Array.isArray(this.props) ? this.props : null | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,42 @@ | ||
import type { IDateRangeFilterOperator } from '../filter' | ||
import type { IDateRangeFilter } from '../filter/date-range.filter' | ||
import { DateRangeFieldValue } from './date-range-field-value' | ||
import type { | ||
DateRangeType, | ||
ICreateDateRangeFieldSchema, | ||
ICreateDateRangeFieldValue, | ||
IDateRangeFieldValue, | ||
} from './date-range-field.type' | ||
import { BaseField } from './field.base' | ||
import type { IDateRangeField } from './field.type' | ||
import { FieldId, FieldName, FieldValueConstraints } from './value-objects' | ||
|
||
export class DateRangeField extends BaseField<IDateRangeField> { | ||
get type(): DateRangeType { | ||
return 'date-range' | ||
} | ||
|
||
static create(input: ICreateDateRangeFieldSchema): DateRangeField { | ||
return new DateRangeField({ | ||
id: FieldId.from(input.id), | ||
name: FieldName.create(input.name), | ||
valueConstrains: FieldValueConstraints.create({ required: input.required }), | ||
}) | ||
} | ||
|
||
static unsafeCreate(input: ICreateDateRangeFieldSchema): DateRangeField { | ||
return new DateRangeField({ | ||
id: FieldId.from(input.id), | ||
name: FieldName.unsafaCreate(input.name), | ||
valueConstrains: FieldValueConstraints.unsafeCreate({ required: input.required }), | ||
}) | ||
} | ||
|
||
createValue(value: ICreateDateRangeFieldValue): DateRangeFieldValue { | ||
return new DateRangeFieldValue(value) | ||
} | ||
|
||
createFilter(operator: IDateRangeFilterOperator, value: IDateRangeFieldValue | null): IDateRangeFilter { | ||
return { operator, value, path: this.name.value, type: 'date-range' } | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,20 @@ | ||
import { addMilliseconds } from 'date-fns' | ||
import { SafeParseError } from 'zod' | ||
import { dateRangeFieldValue, IDateRangeFieldValue } from './date-range-field.type' | ||
|
||
const now = new Date() | ||
|
||
test.each<[IDateRangeFieldValue, boolean]>([ | ||
[[now, addMilliseconds(now, 1)], false], | ||
[[now, addMilliseconds(now, -1)], true], | ||
[[now, now], true], | ||
[null, false], | ||
])('dateRangeFieldValue', (data, expectError) => { | ||
const result = dateRangeFieldValue.safeParse(data) | ||
|
||
if (!expectError) { | ||
expect(result.success).toBe(true) | ||
} else { | ||
expect((result as SafeParseError<IDateRangeFieldValue>).error).toMatchSnapshot() | ||
} | ||
}) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,40 @@ | ||
import { isAfter } from 'date-fns' | ||
import { z } from 'zod' | ||
import { DateRangeField } from './date-range-field' | ||
import { baseFieldQuerySchema, createBaseFieldsSchema } from './field.base' | ||
import { FIELD_TYPE_KEY } from './field.constant' | ||
|
||
export const dateRangeTypeSchema = z.literal('date-range') | ||
export type DateRangeType = z.infer<typeof dateRangeTypeSchema> | ||
const dateRangeTypeObjectSchema = z.object({ [FIELD_TYPE_KEY]: dateRangeTypeSchema }) | ||
|
||
export const createDateRangeFieldSchema = createBaseFieldsSchema.merge(dateRangeTypeObjectSchema) | ||
export type ICreateDateRangeFieldSchema = z.infer<typeof createDateRangeFieldSchema> | ||
|
||
export const dateRangeFieldQuerySchema = baseFieldQuerySchema.merge(dateRangeTypeObjectSchema) | ||
|
||
export const dateRangeFieldValue = z | ||
.tuple([z.date(), z.date()]) | ||
.nullable() | ||
.refine( | ||
(checker) => { | ||
if (checker) { | ||
const [from, to] = checker | ||
return isAfter(to, from) | ||
} | ||
return true | ||
}, | ||
{ message: 'date range value from should before value to' }, | ||
) | ||
|
||
export type IDateRangeFieldValue = z.infer<typeof dateRangeFieldValue> | ||
|
||
export const createDateRangeFieldValue = dateRangeFieldValue | ||
export type ICreateDateRangeFieldValue = z.infer<typeof createDateRangeFieldValue> | ||
|
||
export const createDateRangeFieldValue_internal = z | ||
.object({ value: createDateRangeFieldValue }) | ||
.merge(dateRangeTypeObjectSchema) | ||
.merge(z.object({ field: z.instanceof(DateRangeField) })) | ||
|
||
export type ICreateDateRangeFieldValue_internal = z.infer<typeof createDateRangeFieldValue_internal> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.