Skip to content

Commit

Permalink
feat(serialization): Added serialization to Storm date-time and error…
Browse files Browse the repository at this point in the history
… classes
  • Loading branch information
sullivanpj committed Nov 19, 2023
1 parent 489284a commit 3185ac7
Show file tree
Hide file tree
Showing 20 changed files with 422 additions and 167 deletions.
16 changes: 8 additions & 8 deletions packages/date-time/project.json
Expand Up @@ -12,14 +12,14 @@
"main": "packages/date-time/src/index.ts",
"tsConfig": "packages/date-time/tsconfig.json",
"project": "packages/date-time/package.json",
"defaultConfiguration": "production",
"configurations": {
"production": {
"debug": false
},
"development": {
"debug": true
}
"defaultConfiguration": "production"
},
"configurations": {
"production": {
"debug": false
},
"development": {
"debug": true
}
}
},
Expand Down
13 changes: 11 additions & 2 deletions packages/date-time/src/date-time.ts
@@ -1,9 +1,14 @@
/* eslint-disable @typescript-eslint/no-explicit-any */
import { Temporal } from "@js-temporal/polyfill";
import { Serializable } from "@storm-software/serialization";
import { isBigInt } from "@storm-software/utilities/type-checks/is-bigint";
import { isDate } from "@storm-software/utilities/type-checks/is-date";
import { isNumber } from "@storm-software/utilities/type-checks/is-number";
import { isDateTime } from "./utilities/is-date-time";
import {
deserializeStormDateTime,
serializeStormDateTime
} from "./utilities/serialization";
import { validateDateTime } from "./utilities/validate-date-time";

export type DateTimeOptions = {
Expand Down Expand Up @@ -38,6 +43,10 @@ export type DateTimeInput =
/**
* A wrapper of the and Date class
*/
@Serializable({
serialize: serializeStormDateTime,
deserialize: deserializeStormDateTime
})
export class StormDateTime extends Date {
/**
* The current function returns a new DateTime object with the current date and time
Expand Down Expand Up @@ -72,7 +81,7 @@ export class StormDateTime extends Date {
#input: DateTimeInput;
#options: DateTimeOptions;

protected constructor(dateTime?: DateTimeInput, options?: DateTimeOptions) {
public constructor(dateTime?: DateTimeInput, options?: DateTimeOptions) {
const input = dateTime;
if (!dateTime && !options?.skipDefaulting) {
dateTime = Temporal.Now.instant();
Expand All @@ -84,7 +93,7 @@ export class StormDateTime extends Date {
? dateTime.instant
: Temporal.Instant.from(
isDate(dateTime)
? dateTime.toUTCString()
? dateTime.toJSON()
: isNumber(dateTime) || isBigInt(dateTime)
? new Date(Number(dateTime)).toISOString()
: dateTime
Expand Down
11 changes: 10 additions & 1 deletion packages/date-time/src/date.ts
@@ -1,12 +1,21 @@
/* eslint-disable @typescript-eslint/no-explicit-any */
import { Temporal } from "@js-temporal/polyfill";
import { Serializable } from "@storm-software/serialization/serializable";
import { DateTimeInput, DateTimeOptions, StormDateTime } from "./date-time";
import { isDateTime } from "./utilities/is-date-time";
import {
deserializeStormDate,
serializeStormDate
} from "./utilities/serialization";
import { validateDate } from "./utilities/validate-date";

/**
* A wrapper of the and Date class
*/
@Serializable({
serialize: serializeStormDate,
deserialize: deserializeStormDate
})
export class StormDate extends StormDateTime {
/**
* The current function returns a new DateTime object with the current date and time
Expand Down Expand Up @@ -35,7 +44,7 @@ export class StormDate extends StormDateTime {
calendar: isDateTime(dateTime) ? dateTime.calendarId : options?.calendar
});

protected constructor(dateTime?: DateTimeInput, options?: DateTimeOptions) {
public constructor(dateTime?: DateTimeInput, options?: DateTimeOptions) {
super(dateTime, options);

this.instant = this.instant
Expand Down
11 changes: 10 additions & 1 deletion packages/date-time/src/time.ts
@@ -1,12 +1,21 @@
/* eslint-disable @typescript-eslint/no-explicit-any */
import { Temporal } from "@js-temporal/polyfill";
import { Serializable } from "@storm-software/serialization/serializable";
import { DateTimeInput, DateTimeOptions, StormDateTime } from "./date-time";
import { validateTime } from "./utilities";
import { isDateTime } from "./utilities/is-date-time";
import {
deserializeStormTime,
serializeStormTime
} from "./utilities/serialization";

/**
* A wrapper of the and Date class
*/
@Serializable({
serialize: serializeStormTime,
deserialize: deserializeStormTime
})
export class StormTime extends StormDateTime {
/**
* The current function returns a new DateTime object with the current date and time
Expand Down Expand Up @@ -35,7 +44,7 @@ export class StormTime extends StormDateTime {
calendar: isDateTime(dateTime) ? dateTime.calendarId : options?.calendar
});

protected constructor(dateTime?: DateTimeInput, options?: DateTimeOptions) {
public constructor(dateTime?: DateTimeInput, options?: DateTimeOptions) {
super(dateTime, options);

this.instant = this.instant
Expand Down
2 changes: 1 addition & 1 deletion packages/date-time/src/utilities/format-date-time.ts
Expand Up @@ -10,7 +10,7 @@ import { StormDateTime } from "../date-time";
* @returns The formatted date time
*/
export const formatDateTime = (
dateTime?: StormDateTime | null,
dateTime: StormDateTime = StormDateTime.current(),
options: Partial<
Temporal.ToStringPrecisionOptions & Temporal.ShowCalendarOption
> = { smallestUnit: "milliseconds" }
Expand Down
5 changes: 3 additions & 2 deletions packages/date-time/src/utilities/format-date.ts
@@ -1,4 +1,5 @@
import { Temporal } from "@js-temporal/polyfill";
import { StormDate } from "../date";
import { StormDateTime } from "../date-time";

/**
Expand All @@ -8,8 +9,8 @@ import { StormDateTime } from "../date-time";
* @returns The formatted date
*/
export const formatDate = (
dateTime: StormDateTime = StormDateTime.current(),
dateTime: StormDateTime = StormDate.current(),
options: Partial<
Temporal.ToStringPrecisionOptions & Temporal.ShowCalendarOption
> = { smallestUnit: "milliseconds" }
> = { smallestUnit: "minute" }
): string => dateTime.zonedDateTime.toPlainDate().toString(options);
3 changes: 2 additions & 1 deletion packages/date-time/src/utilities/format-time.ts
@@ -1,5 +1,6 @@
import { Temporal } from "@js-temporal/polyfill";
import { StormDateTime } from "../date-time";
import { StormTime } from "../time";

/**
* Format a time field
Expand All @@ -8,7 +9,7 @@ import { StormDateTime } from "../date-time";
* @returns The formatted time string
*/
export const formatTime = (
dateTime: StormDateTime = StormDateTime.current(),
dateTime: StormDateTime = StormTime.current(),
options: Partial<
Temporal.ToStringPrecisionOptions & Temporal.ShowCalendarOption
> = { smallestUnit: "milliseconds" }
Expand Down
67 changes: 67 additions & 0 deletions packages/date-time/src/utilities/serialization.ts
@@ -0,0 +1,67 @@
import { JsonValue } from "@storm-software/serialization/types";
import { isSetString } from "@storm-software/utilities";
import { StormDate } from "../date";
import { StormDateTime } from "../date-time";
import { StormTime } from "../time";

/**
* Serializes a StormDateTime into a string
*
* @param dateTime - The dateTime to serialize
* @returns The serialized dateTime
*/
export function serializeStormDateTime(dateTime: StormDateTime): string {
return dateTime.instant.toJSON();
}

/**
* Deserializes a string into a StormDateTime
*
* @param utcString - The dateTime to deserialize
* @returns The deserialized dateTime
*/
export function deserializeStormDateTime(
utcString: JsonValue
): StormDateTime | null {
return isSetString(utcString) ? StormDateTime.create(utcString) : null;
}

/**
* Serializes a StormDate into a string
*
* @param date - The date to serialize
* @returns The serialized date
*/
export function serializeStormDate(date: StormDate): string {
return date.instant.toJSON();
}

/**
* Deserializes a string into a StormDate
*
* @param utcString - The date to deserialize
* @returns The deserialized date
*/
export function deserializeStormDate(utcString: JsonValue): StormDate | null {
return isSetString(utcString) ? StormDate.create(utcString) : null;
}

/**
* Serializes a StormTime into a string
*
* @param date - The time to serialize
* @returns The serialized time
*/
export function serializeStormTime(date: StormTime): string {
return date.instant.toJSON();
}

/**
* Deserializes a string into a StormTime
*
* @param utcString - The time to deserialize
* @returns The deserialized time
*/
export function deserializeStormTime(utcString: JsonValue): StormTime | null {
return isSetString(utcString) ? StormTime.create(utcString) : null;
}
7 changes: 5 additions & 2 deletions packages/errors/src/errors.ts
Expand Up @@ -13,7 +13,9 @@ export type ErrorCode =
| "invalid_request"
| "type_error"
| "processing_error"
| "user_not_logged_in";
| "internal_server_error"
| "user_not_logged_in"
| "unknown_cause";
export const ErrorCode = {
success: "success" as ErrorCode,
missing_issue_code: "missing_issue_code" as ErrorCode,
Expand All @@ -30,5 +32,6 @@ export const ErrorCode = {
type_error: "type_error" as ErrorCode,
processing_error: "processing_error" as ErrorCode,
internal_server_error: "internal_server_error" as ErrorCode,
user_not_logged_in: "user_not_logged_in" as ErrorCode
user_not_logged_in: "user_not_logged_in" as ErrorCode,
unknown_cause: "unknown_cause" as ErrorCode
};

0 comments on commit 3185ac7

Please sign in to comment.