Skip to content

Commit

Permalink
fix: luxon to moment - performance reason
Browse files Browse the repository at this point in the history
  • Loading branch information
Adi Fatkhurozi committed Jul 20, 2023
1 parent 4ae31bc commit 434bfbc
Show file tree
Hide file tree
Showing 7 changed files with 51 additions and 61 deletions.
19 changes: 10 additions & 9 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -78,15 +78,12 @@ console.log(result); // Output: 25
## Examples

```typescript
import { DateTime } from 'luxon';
import moment from 'moment'
import { createParser, FunctionMap } from '../'

describe('example', () => {
it('basic operator', () => {
const parser = createParser({
luxon: {
toISO: {}
}
})
expect(parser.evaluate('(2 + 3) * 4 - 4')).toBe(16)
expect(parser.evaluate('-4 + 5')).toBe(1)
Expand Down Expand Up @@ -202,15 +199,19 @@ describe('example', () => {
it('date', () => {
const parser = createParser();

// expect( parser.evaluate(`date()`)).toBe(DateTime.now().toISO())
// expect( parser.evaluate(`date("2020-01-01")`)).toBe('2020-01-01T00:00:00.000+07:00')
// expect(parser.evaluate(`date()`)).toBe(moment().toISOString())
expect(parser.evaluate(`date("2020-01-01")`)).toBe('2019-12-31T17:00:00.000Z')
expect(parser.evaluate(`date_day(date("2020-01-01"))`)).toBe(1)
expect(parser.evaluate(`date_month(date("2020-01-01"))`)).toBe(1)
expect(parser.evaluate(`date_year(date("2020-01-01"))`)).toBe(2020)
expect(parser.evaluate(`date_format("2020-01-01", "dd-MM-yyyy")`)).toBe("01-01-2020")
expect(parser.evaluate(`date_in_format("2020-01-01", "yyyy-MM-dd")`)).toBe('2020-01-01T00:00:00.000+07:00')
expect(parser.evaluate(`date_in_millis(${DateTime.fromISO("2020-01-01").toMillis()})`)).toBe('2020-01-01T00:00:00.000+07:00')
expect(parser.evaluate(`date_format("DD-MM-YYYY", "2020-01-01")`)).toBe("01-01-2020")
expect(parser.evaluate(`date_in_format("YYYY-MM-DD", "2020-01-01")`)).toBe('2019-12-31T17:00:00.000Z')
expect(parser.evaluate(`date_in_millis(${moment("2020/01/01", 'YYYY/MM/DD').valueOf()})`)).toBe('2019-12-31T17:00:00.000Z')
expect(parser.evaluate(`date_millis("2020-01-01")`)).toBe(1577811600000)
expect(parser.evaluate(`date_format("DD-MM-YYYY", date_plus(1, "day", "2020-01-05"))`)).toBe("06-01-2020")
expect(parser.evaluate(`date_format("DD-MM-YYYY", date_plus(-1, "day", "2020-01-05"))`)).toBe("04-01-2020")
expect(parser.evaluate(`date_format("DD-MM-YYYY", date_minus(1, "day", "2020-01-05"))`)).toBe("04-01-2020")
expect(parser.evaluate(`date_format("DD-MM-YYYY", date_minus(-1, "day", "2020-01-05"))`)).toBe("06-01-2020")
})
});
```
25 changes: 9 additions & 16 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

3 changes: 1 addition & 2 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,6 @@
"@babel/runtime": "^7.22.3",
"@types/benchmark": "^2.1.2",
"@types/jest": "^29.5.2",
"@types/luxon": "^3.3.0",
"jest": "^29.5.0",
"semantic-release": "^21.0.3",
"ts-jest": "^29.1.0",
Expand Down Expand Up @@ -77,6 +76,6 @@
"dependencies": {
"benny": "^3.7.1",
"expressionparser": "^1.1.5",
"luxon": "^3.3.0"
"moment": "^2.29.4"
}
}
2 changes: 1 addition & 1 deletion scripts/copy-files.js
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,7 @@ async function createModulePackages({ from, to }) {

// add package here
const packageIncludes = [
'luxon'
'moment'
];

async function includeFileInBuild(file) {
Expand Down
6 changes: 0 additions & 6 deletions src/ExpressionParser.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,3 @@
import { ToISOTimeOptions } from "luxon";

export interface ParserState {
tokens: string[];
currentTokenIndex: number;
Expand All @@ -15,9 +13,6 @@ export type OperatorMap = { [key: string]: (a: any, b: any) => any };
export type ExpressionParserConstructor = {
variables?: VariableMap,
regex?: RegExp,
luxon?: {
toISO?: ToISOTimeOptions
}
}


Expand Down Expand Up @@ -296,7 +291,6 @@ export class ExpressionParser {
variables?: VariableMap,
): any {
const tempVariables = { ...this.variables, ...(variables || {}) };

const state: ParserState = {
tokens: this.tokenize(expression),
currentTokenIndex: 0,
Expand Down
28 changes: 15 additions & 13 deletions src/createParser.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
import ExpressionParser, { ExpressionParserConstructor, FunctionMap, OperatorMap } from "./ExpressionParser"
import { DateTime } from 'luxon'
import moment from 'moment'

type Unit = "year" | "years" | "y" | "month" | "months" | "M" | "week" | "weeks" | "w" | "day" | "days" | "d" | "hour" | "hours" | "h" | "minute" | "minutes" | "m" | "second" | "seconds" | "s" | "millisecond" | "milliseconds" | "ms"

export function createParser(props: ExpressionParserConstructor = {}) {
const luxonConfigToISO = props.luxon?.toISO
const parser = new ExpressionParser({
...props,
variables: {
Expand Down Expand Up @@ -53,17 +54,18 @@ export function createParser(props: ExpressionParserConstructor = {}) {
lower: (_, value: string) => value.toLowerCase(),
regex: (_, value: any, regex: string, flags?: string) => new RegExp(regex, flags).test(value),
// DATE ==================================================================================
date: (_, value: string,) => DateTime.fromISO(value).toISO(luxonConfigToISO) || DateTime.now().toISO(luxonConfigToISO),
date_day: (_, value: string,) => DateTime.fromISO(value).day || DateTime.now().day,
date_month: (_, value: string,) => DateTime.fromISO(value).month || DateTime.now().month,
date_year: (_, value: string,) => DateTime.fromISO(value).year || DateTime.now().year,
date_hour: (_, value: string,) => DateTime.fromISO(value).hour || DateTime.now().hour,
date_minute: (_, value: string,) => DateTime.fromISO(value).minute,
date_format: (_, value: string, format: string) => DateTime.fromISO(value).toFormat(format).toString(),
date_in_format: (_, value: string, format: string) => DateTime.fromFormat(value, format).toISO(luxonConfigToISO),
date_in_millis: (_, value: number) => DateTime.fromMillis(value).toISO(),
date_millis: (_, value: string) => DateTime.fromISO(value).toMillis(),
date_plus: (_, value: string) => DateTime.fromISO(value),
date: (_, date: string) => date ? moment(date).toISOString() : moment().toISOString(),
date_day: (_, date: string) => date ? moment(date).date() : moment().date(),
date_month: (_, date: string) => date ? moment(date).month() + 1 : moment().month() + 1,
date_year: (_, date: string) => date ? moment(date).year() : moment().year(),
date_hour: (_, date: string) => date ? moment(date).hour() : moment().hour(),
date_minute: (_, date: string) => date ? moment(date).minute() : moment().minute(),
date_format: (_, format: string, date: string) => date ? moment(date).format(format).toString() : moment().format(format).toString(),
date_in_format: (_, format: string, date: string) => date ? moment(date, format).toISOString() : moment().toISOString(),
date_in_millis: (_, date: number) => moment(date).toISOString(),
date_millis: (_, date: string) => date ? moment(date).valueOf() : moment().valueOf(),
date_plus: (_, amount: number, unit: Unit, date: string) => date ? moment(date).add(amount, unit) : moment().add(amount, unit),
date_minus: (_, amount: number, unit: Unit, date: string) => date ? moment(date).subtract(amount, unit) : moment().subtract(amount, unit),

// CONDITION ==================================================================================
if: (_, condition: boolean, truthy: any, falsy) => {
Expand Down
29 changes: 15 additions & 14 deletions src/test/index.test.ts
Original file line number Diff line number Diff line change
@@ -1,12 +1,9 @@
import { DateTime } from 'luxon';
import moment from 'moment'
import { createParser, FunctionMap } from '../'

describe('example', () => {
it('basic operator', () => {
const parser = createParser({
luxon: {
toISO: {}
}
})
expect(parser.evaluate('(2 + 3) * 4 - 4')).toBe(16)
expect(parser.evaluate('-4 + 5')).toBe(1)
Expand Down Expand Up @@ -122,14 +119,18 @@ describe('example', () => {
it('date', () => {
const parser = createParser();

// expect( parser.evaluate(`date()`)).toBe(DateTime.now().toISO())
// expect( parser.evaluate(`date("2020-01-01")`)).toBe('2020-01-01T00:00:00.000+07:00')
// expect(parser.evaluate(`date_day(date("2020-01-01"))`)).toBe(1)
// expect(parser.evaluate(`date_month(date("2020-01-01"))`)).toBe(1)
// expect(parser.evaluate(`date_year(date("2020-01-01"))`)).toBe(2020)
// expect(parser.evaluate(`date_format("2020-01-01", "dd-MM-yyyy")`)).toBe("01-01-2020")
// expect(parser.evaluate(`date_in_format("2020-01-01", "yyyy-MM-dd")`)).toBe('2020-01-01T00:00:00.000+07:00')
// expect(parser.evaluate(`date_in_millis(${DateTime.fromISO("2020-01-01").toMillis()})`)).toBe('2020-01-01T00:00:00.000+07:00')
// expect(parser.evaluate(`date_millis("2020-01-01")`)).toBe(1577811600000)
// expect(parser.evaluate(`date()`)).toBe(moment().toISOString())
expect(parser.evaluate(`date("2020-01-01")`)).toBe('2019-12-31T17:00:00.000Z')
expect(parser.evaluate(`date_day(date("2020-01-01"))`)).toBe(1)
expect(parser.evaluate(`date_month(date("2020-01-01"))`)).toBe(1)
expect(parser.evaluate(`date_year(date("2020-01-01"))`)).toBe(2020)
expect(parser.evaluate(`date_format("DD-MM-YYYY", "2020-01-01")`)).toBe("01-01-2020")
expect(parser.evaluate(`date_in_format("YYYY-MM-DD", "2020-01-01")`)).toBe('2019-12-31T17:00:00.000Z')
expect(parser.evaluate(`date_in_millis(${moment("2020/01/01", 'YYYY/MM/DD').valueOf()})`)).toBe('2019-12-31T17:00:00.000Z')
expect(parser.evaluate(`date_millis("2020-01-01")`)).toBe(1577811600000)
expect(parser.evaluate(`date_format("DD-MM-YYYY", date_plus(1, "day", "2020-01-05"))`)).toBe("06-01-2020")
expect(parser.evaluate(`date_format("DD-MM-YYYY", date_plus(-1, "day", "2020-01-05"))`)).toBe("04-01-2020")
expect(parser.evaluate(`date_format("DD-MM-YYYY", date_minus(1, "day", "2020-01-05"))`)).toBe("04-01-2020")
expect(parser.evaluate(`date_format("DD-MM-YYYY", date_minus(-1, "day", "2020-01-05"))`)).toBe("06-01-2020")
})
});
});

0 comments on commit 434bfbc

Please sign in to comment.