Huge News!Announcing our $40M Series B led by Abstract Ventures.Learn More
Socket
Sign inDemoInstall
Socket

chrono-node

Package Overview
Dependencies
Maintainers
1
Versions
107
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

chrono-node - npm Package Compare versions

Comparing version 2.2.7 to 2.3.0

dist/bundle.js

13

dist/chrono.d.ts

@@ -1,3 +0,3 @@

import { ParsingComponents, ParsingResult } from "./results";
import { Component, ParsedResult, ParsingOption } from "./index";
import { ReferenceWithTimezone, ParsingComponents, ParsingResult } from "./results";
import { Component, ParsedResult, ParsingOption, ParsingReference } from "./index";
import { AsyncDebugBlock, DebugHandler } from "./debugging";

@@ -22,4 +22,4 @@ export interface Configuration {

clone(): Chrono;
parseDate(text: string, referenceDate?: Date, option?: ParsingOption): Date | null;
parse(text: string, referenceDate?: Date, option?: ParsingOption): ParsedResult[];
parseDate(text: string, referenceDate?: ParsingReference | Date, option?: ParsingOption): Date | null;
parse(text: string, referenceDate?: ParsingReference | Date, option?: ParsingOption): ParsedResult[];
private static executeParser;

@@ -29,5 +29,6 @@ }

readonly text: string;
readonly option: ParsingOption;
readonly reference: ReferenceWithTimezone;
readonly refDate: Date;
readonly option: ParsingOption;
constructor(text: string, refDate: Date, option: ParsingOption);
constructor(text: string, refDate?: ParsingReference | Date, option?: ParsingOption);
createParsingComponents(components?: {

@@ -34,0 +35,0 @@ [c in Component]?: number;

@@ -23,3 +23,3 @@ "use strict";

parse(text, referenceDate, option) {
const context = new ParsingContext(text, referenceDate || new Date(), option || {});
const context = new ParsingContext(text, referenceDate, option);
let results = [];

@@ -76,4 +76,5 @@ this.parsers.forEach((parser) => {

this.text = text;
this.refDate = refDate;
this.option = option;
this.reference = new results_1.ReferenceWithTimezone(refDate);
this.option = option !== null && option !== void 0 ? option : {};
this.refDate = this.reference.instant;
}

@@ -84,3 +85,3 @@ createParsingComponents(components) {

}
return new results_1.ParsingComponents(this.refDate, components);
return new results_1.ParsingComponents(this.reference, components);
}

@@ -91,3 +92,3 @@ createParsingResult(index, textOrEndIndex, startComponents, endComponents) {

const end = endComponents ? this.createParsingComponents(endComponents) : null;
return new results_1.ParsingResult(this.refDate, index, text, start, end);
return new results_1.ParsingResult(this.reference, index, text, start, end);
}

@@ -94,0 +95,0 @@ debug(block) {

@@ -1,6 +0,6 @@

import { ParsingComponents } from "../results";
export declare function now(refDate: Date): ParsingComponents;
export declare function today(refDate: Date): ParsingComponents;
export declare function yesterday(refDate: Date): ParsingComponents;
export declare function tomorrow(refDate: Date): ParsingComponents;
export declare function tonight(refDate: Date, implyHour?: number): ParsingComponents;
import { ParsingComponents, ReferenceWithTimezone } from "../results";
export declare function now(reference: ReferenceWithTimezone): ParsingComponents;
export declare function today(reference: ReferenceWithTimezone): ParsingComponents;
export declare function yesterday(reference: ReferenceWithTimezone): ParsingComponents;
export declare function tomorrow(reference: ReferenceWithTimezone): ParsingComponents;
export declare function tonight(reference: ReferenceWithTimezone, implyHour?: number): ParsingComponents;

@@ -11,13 +11,14 @@ "use strict";

const index_1 = require("../index");
function now(refDate) {
const targetDate = dayjs_1.default(refDate);
const component = new results_1.ParsingComponents(refDate, {});
function now(reference) {
const targetDate = dayjs_1.default(reference.instant);
const component = new results_1.ParsingComponents(reference, {});
dayjs_2.assignSimilarDate(component, targetDate);
dayjs_2.assignSimilarTime(component, targetDate);
component.assign("timezoneOffset", targetDate.utcOffset());
return component;
}
exports.now = now;
function today(refDate) {
const targetDate = dayjs_1.default(refDate);
const component = new results_1.ParsingComponents(refDate, {});
function today(reference) {
const targetDate = dayjs_1.default(reference.instant);
const component = new results_1.ParsingComponents(reference, {});
dayjs_2.assignSimilarDate(component, targetDate);

@@ -28,5 +29,5 @@ dayjs_2.implySimilarTime(component, targetDate);

exports.today = today;
function yesterday(refDate) {
let targetDate = dayjs_1.default(refDate);
const component = new results_1.ParsingComponents(refDate, {});
function yesterday(reference) {
let targetDate = dayjs_1.default(reference.instant);
const component = new results_1.ParsingComponents(reference, {});
targetDate = targetDate.add(-1, "day");

@@ -38,5 +39,5 @@ dayjs_2.assignSimilarDate(component, targetDate);

exports.yesterday = yesterday;
function tomorrow(refDate) {
const targetDate = dayjs_1.default(refDate);
const component = new results_1.ParsingComponents(refDate, {});
function tomorrow(reference) {
const targetDate = dayjs_1.default(reference.instant);
const component = new results_1.ParsingComponents(reference, {});
dayjs_2.assignTheNextDay(component, targetDate);

@@ -46,5 +47,5 @@ return component;

exports.tomorrow = tomorrow;
function tonight(refDate, implyHour = 22) {
const targetDate = dayjs_1.default(refDate);
const component = new results_1.ParsingComponents(refDate, {});
function tonight(reference, implyHour = 22) {
const targetDate = dayjs_1.default(reference.instant);
const component = new results_1.ParsingComponents(reference, {});
component.imply("hour", implyHour);

@@ -51,0 +52,0 @@ component.imply("meridiem", index_1.Meridiem.PM);

@@ -7,5 +7,9 @@ import * as en from "./locales/en";

timezones?: {
string: number;
[tzKeyword: string]: number;
};
}
export interface ParsingReference {
instant?: Date;
timezone?: string | number;
}
export interface ParsedResult {

@@ -37,3 +41,3 @@ readonly refDate: Date;

export declare const casual: Chrono;
export declare function parse(text: string, ref?: Date, option?: ParsingOption): ParsedResult[];
export declare function parseDate(text: string, ref?: Date, option?: ParsingOption): Date;
export declare function parse(text: string, ref?: ParsingReference | Date, option?: ParsingOption): ParsedResult[];
export declare function parseDate(text: string, ref?: ParsingReference | Date, option?: ParsingOption): Date;

@@ -46,6 +46,6 @@ "use strict";

case "jetzt":
component = references.now(context.refDate);
component = references.now(context.reference);
break;
case "heute":
component = references.today(context.refDate);
component = references.today(context.reference);
break;

@@ -52,0 +52,0 @@ case "morgen":

@@ -40,13 +40,13 @@ "use strict";

case "now":
return references.now(context.refDate);
return references.now(context.reference);
case "today":
return references.today(context.refDate);
return references.today(context.reference);
case "yesterday":
return references.yesterday(context.refDate);
return references.yesterday(context.reference);
case "tomorrow":
case "tmr":
case "tmrw":
return references.tomorrow(context.refDate);
return references.tomorrow(context.reference);
case "tonight":
return references.tonight(context.refDate);
return references.tonight(context.reference);
default:

@@ -53,0 +53,0 @@ if (lowerText.match(/last\s*night/)) {

@@ -25,3 +25,3 @@ "use strict";

timeUnits[timeunit] = 1;
return results_1.ParsingComponents.createRelativeFromRefDate(context.refDate, timeUnits);
return results_1.ParsingComponents.createRelativeFromRefInstant(context.refDate, timeUnits);
}

@@ -31,3 +31,3 @@ if (modifier == "last" || modifier == "past") {

timeUnits[timeunit] = -1;
return results_1.ParsingComponents.createRelativeFromRefDate(context.refDate, timeUnits);
return results_1.ParsingComponents.createRelativeFromRefInstant(context.refDate, timeUnits);
}

@@ -34,0 +34,0 @@ const components = context.createParsingComponents();

@@ -20,5 +20,5 @@ "use strict";

const outputTimeUnits = timeunits_1.reverseTimeUnits(timeUnits);
return results_1.ParsingComponents.createRelativeFromRefDate(context.refDate, outputTimeUnits);
return results_1.ParsingComponents.createRelativeFromRefInstant(context.refDate, outputTimeUnits);
}
}
exports.default = ENTimeUnitAgoFormatParser;

@@ -22,5 +22,5 @@ "use strict";

}
return results_1.ParsingComponents.createRelativeFromRefDate(context.refDate, timeUnits);
return results_1.ParsingComponents.createRelativeFromRefInstant(context.refDate, timeUnits);
}
}
exports.default = ENTimeUnitCasualRelativeFormatParser;

@@ -19,5 +19,5 @@ "use strict";

const fragments = constants_1.parseTimeUnits(match[GROUP_NUM_TIMEUNITS]);
return results_1.ParsingComponents.createRelativeFromRefDate(context.refDate, fragments);
return results_1.ParsingComponents.createRelativeFromRefInstant(context.refDate, fragments);
}
}
exports.default = ENTimeUnitLaterFormatParser;

@@ -15,5 +15,5 @@ "use strict";

const timeUnits = constants_1.parseTimeUnits(match[1]);
return results_1.ParsingComponents.createRelativeFromRefDate(context.refDate, timeUnits);
return results_1.ParsingComponents.createRelativeFromRefInstant(context.refDate, timeUnits);
}
}
exports.default = ENTimeUnitWithinFormatParser;

@@ -40,9 +40,9 @@ "use strict";

case "maintenant":
return references.now(context.refDate);
return references.now(context.reference);
case "aujourd'hui":
return references.today(context.refDate);
return references.today(context.reference);
case "hier":
return references.yesterday(context.refDate);
return references.yesterday(context.reference);
case "demain":
return references.tomorrow(context.refDate);
return references.tomorrow(context.reference);
default:

@@ -49,0 +49,0 @@ if (lowerText.match(/cette\s*nuit/)) {

@@ -17,5 +17,5 @@ "use strict";

const outputTimeUnits = timeunits_1.reverseTimeUnits(timeUnits);
return results_1.ParsingComponents.createRelativeFromRefDate(context.refDate, outputTimeUnits);
return results_1.ParsingComponents.createRelativeFromRefInstant(context.refDate, outputTimeUnits);
}
}
exports.default = FRTimeUnitAgoFormatParser;

@@ -32,5 +32,5 @@ "use strict";

}
return results_1.ParsingComponents.createRelativeFromRefDate(context.refDate, timeUnits);
return results_1.ParsingComponents.createRelativeFromRefInstant(context.refDate, timeUnits);
}
}
exports.default = FRTimeUnitAgoFormatParser;

@@ -12,5 +12,5 @@ "use strict";

const timeUnits = constants_1.parseTimeUnits(match[1]);
return results_1.ParsingComponents.createRelativeFromRefDate(context.refDate, timeUnits);
return results_1.ParsingComponents.createRelativeFromRefInstant(context.refDate, timeUnits);
}
}
exports.default = FRTimeUnitWithinFormatParser;

@@ -39,8 +39,8 @@ "use strict";

case "昨日":
return references.yesterday(context.refDate);
return references.yesterday(context.reference);
case "明日":
return references.tomorrow(context.refDate);
return references.tomorrow(context.reference);
case "今日":
case "当日":
return references.today(context.refDate);
return references.today(context.reference);
}

@@ -47,0 +47,0 @@ if (text == "今夜" || text == "今夕" || text == "今晩") {

@@ -33,10 +33,10 @@ "use strict";

case "nu":
return references.now(context.refDate);
return references.now(context.reference);
case "vandaag":
return references.today(context.refDate);
return references.today(context.reference);
case "morgen":
case "morgend":
return references.tomorrow(context.refDate);
return references.tomorrow(context.reference);
case "gisteren":
return references.yesterday(context.refDate);
return references.yesterday(context.reference);
}

@@ -43,0 +43,0 @@ return component;

@@ -12,5 +12,5 @@ "use strict";

const timeUnits = constants_1.parseTimeUnits(match[1]);
return results_1.ParsingComponents.createRelativeFromRefDate(context.refDate, timeUnits);
return results_1.ParsingComponents.createRelativeFromRefInstant(context.refDate, timeUnits);
}
}
exports.default = NLTimeUnitWithinFormatParser;

@@ -33,10 +33,10 @@ "use strict";

case "agora":
return references.now(context.refDate);
return references.now(context.reference);
case "hoje":
return references.today(context.refDate);
return references.today(context.reference);
case "amanha":
case "amanhã":
return references.tomorrow(context.refDate);
return references.tomorrow(context.reference);
case "ontem":
return references.yesterday(context.refDate);
return references.yesterday(context.reference);
}

@@ -43,0 +43,0 @@ return component;

@@ -1,7 +0,13 @@

import { Component, ParsedComponents, ParsedResult } from "./index";
import { Component, ParsedComponents, ParsedResult, ParsingReference } from "./index";
import dayjs, { OpUnitType, QUnitType } from "dayjs";
export declare class ReferenceWithTimezone {
readonly instant: Date;
readonly timezoneOffset: number;
constructor(input?: ParsingReference | Date);
}
export declare class ParsingComponents implements ParsedComponents {
private knownValues;
private impliedValues;
constructor(refDate: Date, knownComponents?: {
private reference;
constructor(reference: ReferenceWithTimezone, knownComponents?: {
[c in Component]?: number;

@@ -25,4 +31,4 @@ });

private dateWithoutTimezoneAdjustment;
private getTimezoneAdjustmentMinute;
static createRelativeFromRefDate(refDate: Date, fragments: {
private getSystemTimezoneAdjustmentMinute;
static createRelativeFromRefInstant(refInstant: Date, fragments: {
[c in OpUnitType | QUnitType]?: number;

@@ -35,5 +41,6 @@ }): ParsingComponents;

text: string;
reference: ReferenceWithTimezone;
start: ParsingComponents;
end?: ParsingComponents;
constructor(refDate: Date, index: number, text: string, start?: ParsingComponents, end?: ParsingComponents);
constructor(reference: ReferenceWithTimezone, index: number, text: string, start?: ParsingComponents, end?: ParsingComponents);
clone(): ParsingResult;

@@ -40,0 +47,0 @@ date(): Date;

@@ -6,9 +6,26 @@ "use strict";

Object.defineProperty(exports, "__esModule", { value: true });
exports.ParsingResult = exports.ParsingComponents = void 0;
exports.ParsingResult = exports.ParsingComponents = exports.ReferenceWithTimezone = void 0;
const quarterOfYear_1 = __importDefault(require("dayjs/plugin/quarterOfYear"));
const dayjs_1 = __importDefault(require("dayjs"));
const dayjs_2 = require("./utils/dayjs");
const timezone_1 = require("./timezone");
dayjs_1.default.extend(quarterOfYear_1.default);
class ReferenceWithTimezone {
constructor(input) {
var _a, _b;
input = input !== null && input !== void 0 ? input : new Date();
if (input instanceof Date) {
this.instant = input;
this.timezoneOffset = -input.getTimezoneOffset();
}
else {
this.instant = (_a = input.instant) !== null && _a !== void 0 ? _a : new Date();
this.timezoneOffset = timezone_1.toTimezoneOffset((_b = input.timezone) !== null && _b !== void 0 ? _b : -this.instant.getTimezoneOffset());
}
}
}
exports.ReferenceWithTimezone = ReferenceWithTimezone;
class ParsingComponents {
constructor(refDate, knownComponents) {
constructor(reference, knownComponents) {
this.reference = reference;
this.knownValues = {};

@@ -21,3 +38,3 @@ this.impliedValues = {};

}
const refDayJs = dayjs_1.default(refDate);
const refDayJs = dayjs_1.default(reference.instant);
this.imply("day", refDayJs.date());

@@ -63,3 +80,3 @@ this.imply("month", refDayJs.month() + 1);

clone() {
const component = new ParsingComponents(new Date());
const component = new ParsingComponents(this.reference);
component.knownValues = {};

@@ -88,3 +105,3 @@ component.impliedValues = {};

isValidDate() {
const date = this.isCertain("timezoneOffset") ? this.dateWithoutTimezoneAdjustment() : this.date();
const date = this.dateWithoutTimezoneAdjustment();
if (date.getFullYear() !== this.get("year"))

@@ -110,3 +127,3 @@ return false;

const date = this.dateWithoutTimezoneAdjustment();
return new Date(date.getTime() + this.getTimezoneAdjustmentMinute(date) * 60000);
return new Date(date.getTime() + this.getSystemTimezoneAdjustmentMinute() * 60000);
}

@@ -118,21 +135,23 @@ dateWithoutTimezoneAdjustment() {

}
getTimezoneAdjustmentMinute(date) {
getSystemTimezoneAdjustmentMinute() {
var _a;
date = date !== null && date !== void 0 ? date : new Date();
const currentTimezoneOffset = -date.getTimezoneOffset();
const targetTimezoneOffset = (_a = this.get("timezoneOffset")) !== null && _a !== void 0 ? _a : currentTimezoneOffset;
const currentTimezoneOffset = -new Date().getTimezoneOffset();
const targetTimezoneOffset = (_a = this.get("timezoneOffset")) !== null && _a !== void 0 ? _a : this.reference.timezoneOffset;
return currentTimezoneOffset - targetTimezoneOffset;
}
static createRelativeFromRefDate(refDate, fragments) {
let date = dayjs_1.default(refDate);
static createRelativeFromRefInstant(refInstant, fragments) {
let date = dayjs_1.default(refInstant);
for (const key in fragments) {
date = date.add(fragments[key], key);
}
const components = new ParsingComponents(refDate);
const reference = new ReferenceWithTimezone(refInstant);
const components = new ParsingComponents(reference);
if (fragments["hour"] || fragments["minute"] || fragments["second"]) {
dayjs_2.assignSimilarTime(components, date);
dayjs_2.assignSimilarDate(components, date);
components.assign("timezoneOffset", -refInstant.getTimezoneOffset());
}
else {
dayjs_2.implySimilarTime(components, date);
components.imply("timezoneOffset", -refInstant.getTimezoneOffset());
if (fragments["d"]) {

@@ -168,11 +187,12 @@ components.assign("day", date.date());

class ParsingResult {
constructor(refDate, index, text, start, end) {
this.refDate = refDate;
constructor(reference, index, text, start, end) {
this.reference = reference;
this.refDate = reference.instant;
this.index = index;
this.text = text;
this.start = start || new ParsingComponents(this.refDate);
this.start = start || new ParsingComponents(reference);
this.end = end;
}
clone() {
const result = new ParsingResult(this.refDate, this.index, this.text);
const result = new ParsingResult(this.reference, this.index, this.text);
result.start = this.start ? this.start.clone() : null;

@@ -179,0 +199,0 @@ result.end = this.end ? this.end.clone() : null;

@@ -21,3 +21,2 @@ "use strict";

component.assign("millisecond", targetDayJs.millisecond());
component.assign("timezoneOffset", targetDayJs.utcOffset());
}

@@ -30,4 +29,3 @@ exports.assignSimilarTime = assignSimilarTime;

component.imply("millisecond", targetDayJs.millisecond());
component.imply("timezoneOffset", targetDayJs.utcOffset());
}
exports.implySimilarTime = implySimilarTime;

@@ -18,3 +18,3 @@ {

"license": "MIT",
"version": "2.2.7",
"version": "2.3.0",
"directories": {

@@ -37,4 +37,4 @@ "source": "./src",

"ts-jest": "^26.1.1",
"typedoc": "^0.20.25",
"typescript": "^4.1.3"
"typedoc": "^0.20.36",
"typescript": "~4.2.4"
},

@@ -41,0 +41,0 @@ "husky": {

@@ -69,19 +69,35 @@ # Chrono (v2)

```typescript
parse(text: string, refDate?: Date, option?: ParsingOption): ParsedResult[] {...}
parse(text: string, ref?: ParsingReference, option?: ParsingOption): ParsedResult[] {...}
```
#### Reference Date
#### Parsing Reference (Date / Timezone)
Today's "Friday" is different from last month's "Friday".
The meaning of the referenced dates depends on when they are mentioned.
Chrono lets you define a reference date using `chrono.parse(text, ref)` and `chrono.parseDate(text, ref)`.
The meaning of the referenced dates depends on when and where they are mentioned.
Chrono lets you define the reference as `Date` or `ParsingReference` object:
```javascript
chrono.parseDate('Friday', new Date(2012, 7, 23));
// Fri Aug 24 2012 12:00:00 GMT+0700 (ICT)
// (Note: the exmaples run on JST timezone)
chrono.parseDate('Friday', new Date(2012, 7, 1));
// Fri Aug 03 2012 12:00:00 GMT+0700 (ICT)
chrono.parseDate('Friday', new Date(2012, 8 - 1, 23));
// Fri Aug 24 2012 12:00:00 GMT+0900 (JST)
chrono.parseDate('Friday', new Date(2012, 8 - 1, 1));
// Fri Aug 03 2012 12:00:00 GMT+0900 (JST)
chrono.parseDate("Friday at 4pm", {
// Wed Jun 09 2021 21:00:00 GMT+0900 (JST)
// = Wed Jun 09 2021 07:00:00 GMT-0500 (CDT)
instant: new Date(1623240000000),
timezone: "CDT",
})
// Sat Jun 12 2021 06:00:00 GMT+0900 (JST)
// = Fri Jun 11 2021 16:00:00 GMT-0500 (CDT)
```
#### ParsingReference
* `instance?: Date` The instant when the input is written or mentioned
* `timezone?: string | number` The timezone where the input is written or mentioned.
Support minute-offset (number) and timezone name (e.g. "GMT", "CDT")
### Parsing Options

@@ -88,0 +104,0 @@

@@ -1,3 +0,3 @@

import { ParsingComponents, ParsingResult } from "./results";
import { Component, ParsedResult, ParsingOption } from "./index";
import { ReferenceWithTimezone, ParsingComponents, ParsingResult } from "./results";
import { Component, ParsedResult, ParsingOption, ParsingReference } from "./index";
import { AsyncDebugBlock, DebugHandler } from "./debugging";

@@ -71,3 +71,3 @@ import { createCasualConfiguration } from "./locales/en";

*/
parseDate(text: string, referenceDate?: Date, option?: ParsingOption): Date | null {
parseDate(text: string, referenceDate?: ParsingReference | Date, option?: ParsingOption): Date | null {
const results = this.parse(text, referenceDate, option);

@@ -77,4 +77,4 @@ return results.length > 0 ? results[0].start.date() : null;

parse(text: string, referenceDate?: Date, option?: ParsingOption): ParsedResult[] {
const context = new ParsingContext(text, referenceDate || new Date(), option || {});
parse(text: string, referenceDate?: ParsingReference | Date, option?: ParsingOption): ParsedResult[] {
const context = new ParsingContext(text, referenceDate, option);

@@ -141,4 +141,17 @@ let results = [];

export class ParsingContext implements DebugHandler {
constructor(readonly text: string, readonly refDate: Date, readonly option: ParsingOption) {}
readonly text: string;
readonly option: ParsingOption;
readonly reference: ReferenceWithTimezone;
// Deprecated. Use reference.instant instead.
readonly refDate: Date;
constructor(text: string, refDate?: ParsingReference | Date, option?: ParsingOption) {
this.text = text;
this.reference = new ReferenceWithTimezone(refDate);
this.option = option ?? {};
this.refDate = this.reference.instant;
}
createParsingComponents(components?: { [c in Component]?: number } | ParsingComponents): ParsingComponents {

@@ -149,3 +162,3 @@ if (components instanceof ParsingComponents) {

return new ParsingComponents(this.refDate, components);
return new ParsingComponents(this.reference, components);
}

@@ -164,3 +177,3 @@

return new ParsingResult(this.refDate, index, text, start, end);
return new ParsingResult(this.reference, index, text, start, end);
}

@@ -167,0 +180,0 @@

@@ -1,2 +0,2 @@

import { ParsingComponents } from "../results";
import { ParsingComponents, ReferenceWithTimezone } from "../results";
import dayjs from "dayjs";

@@ -6,13 +6,14 @@ import { assignSimilarDate, assignSimilarTime, assignTheNextDay, implySimilarTime } from "../utils/dayjs";

export function now(refDate: Date): ParsingComponents {
const targetDate = dayjs(refDate);
const component = new ParsingComponents(refDate, {});
export function now(reference: ReferenceWithTimezone): ParsingComponents {
const targetDate = dayjs(reference.instant);
const component = new ParsingComponents(reference, {});
assignSimilarDate(component, targetDate);
assignSimilarTime(component, targetDate);
component.assign("timezoneOffset", targetDate.utcOffset());
return component;
}
export function today(refDate: Date): ParsingComponents {
const targetDate = dayjs(refDate);
const component = new ParsingComponents(refDate, {});
export function today(reference: ReferenceWithTimezone): ParsingComponents {
const targetDate = dayjs(reference.instant);
const component = new ParsingComponents(reference, {});
assignSimilarDate(component, targetDate);

@@ -25,7 +26,6 @@ implySimilarTime(component, targetDate);

* The previous day. Imply the same time.
* @param refDate
*/
export function yesterday(refDate: Date): ParsingComponents {
let targetDate = dayjs(refDate);
const component = new ParsingComponents(refDate, {});
export function yesterday(reference: ReferenceWithTimezone): ParsingComponents {
let targetDate = dayjs(reference.instant);
const component = new ParsingComponents(reference, {});
targetDate = targetDate.add(-1, "day");

@@ -39,7 +39,6 @@ assignSimilarDate(component, targetDate);

* The following day with dayjs.assignTheNextDay()
* @param refDate
*/
export function tomorrow(refDate: Date): ParsingComponents {
const targetDate = dayjs(refDate);
const component = new ParsingComponents(refDate, {});
export function tomorrow(reference: ReferenceWithTimezone): ParsingComponents {
const targetDate = dayjs(reference.instant);
const component = new ParsingComponents(reference, {});
assignTheNextDay(component, targetDate);

@@ -49,5 +48,5 @@ return component;

export function tonight(refDate: Date, implyHour = 22): ParsingComponents {
const targetDate = dayjs(refDate);
const component = new ParsingComponents(refDate, {});
export function tonight(reference: ReferenceWithTimezone, implyHour = 22): ParsingComponents {
const targetDate = dayjs(reference.instant);
const component = new ParsingComponents(reference, {});
component.imply("hour", implyHour);

@@ -54,0 +53,0 @@ component.imply("meridiem", Meridiem.PM);

@@ -17,3 +17,3 @@ import { DebugHandler, DebugConsume } from "./debugging";

*/
timezones?: { string: number };
timezones?: { [tzKeyword: string]: number };

@@ -27,2 +27,18 @@ /**

export interface ParsingReference {
/**
* Reference date. The instant (JavaScript Date object) when the input is written or mention.
* This effect date/time implication (e.g. weekday or time mentioning).
* (default = now)
*/
instant?: Date;
/**
* Reference timezone. The timezone where the input is written or mention.
* Date/time implication will account the difference between input timezone and the current system timezone.
* (default = current timezone)
*/
timezone?: string | number;
}
/**

@@ -109,3 +125,3 @@ * Parsed result or final output.

*/
export function parse(text: string, ref?: Date, option?: ParsingOption): ParsedResult[] {
export function parse(text: string, ref?: ParsingReference | Date, option?: ParsingOption): ParsedResult[] {
return casual.parse(text, ref, option);

@@ -117,4 +133,4 @@ }

*/
export function parseDate(text: string, ref?: Date, option?: ParsingOption): Date {
export function parseDate(text: string, ref?: ParsingReference | Date, option?: ParsingOption): Date {
return casual.parseDate(text, ref, option);
}

@@ -32,7 +32,7 @@ import { ParsingContext } from "../../../chrono";

case "jetzt":
component = references.now(context.refDate);
component = references.now(context.reference);
break;
case "heute":
component = references.today(context.refDate);
component = references.today(context.reference);
break;

@@ -39,0 +39,0 @@

@@ -22,9 +22,9 @@ import { ParsingContext } from "../../../chrono";

case "now":
return references.now(context.refDate);
return references.now(context.reference);
case "today":
return references.today(context.refDate);
return references.today(context.reference);
case "yesterday":
return references.yesterday(context.refDate);
return references.yesterday(context.reference);

@@ -34,6 +34,6 @@ case "tomorrow":

case "tmrw":
return references.tomorrow(context.refDate);
return references.tomorrow(context.reference);
case "tonight":
return references.tonight(context.refDate);
return references.tonight(context.reference);

@@ -40,0 +40,0 @@ default:

@@ -29,3 +29,3 @@ import { TIME_UNIT_DICTIONARY } from "../constants";

timeUnits[timeunit] = 1;
return ParsingComponents.createRelativeFromRefDate(context.refDate, timeUnits);
return ParsingComponents.createRelativeFromRefInstant(context.refDate, timeUnits);
}

@@ -36,3 +36,3 @@

timeUnits[timeunit] = -1;
return ParsingComponents.createRelativeFromRefDate(context.refDate, timeUnits);
return ParsingComponents.createRelativeFromRefInstant(context.refDate, timeUnits);
}

@@ -39,0 +39,0 @@

@@ -24,4 +24,4 @@ import { ParsingContext } from "../../../chrono";

return ParsingComponents.createRelativeFromRefDate(context.refDate, outputTimeUnits);
return ParsingComponents.createRelativeFromRefInstant(context.refDate, outputTimeUnits);
}
}

@@ -25,4 +25,4 @@ import { TIME_UNITS_PATTERN, parseTimeUnits } from "../constants";

return ParsingComponents.createRelativeFromRefDate(context.refDate, timeUnits);
return ParsingComponents.createRelativeFromRefInstant(context.refDate, timeUnits);
}
}

@@ -25,4 +25,4 @@ import { ParsingContext } from "../../../chrono";

const fragments = parseTimeUnits(match[GROUP_NUM_TIMEUNITS]);
return ParsingComponents.createRelativeFromRefDate(context.refDate, fragments);
return ParsingComponents.createRelativeFromRefInstant(context.refDate, fragments);
}
}

@@ -24,4 +24,4 @@ import { TIME_UNITS_PATTERN, parseTimeUnits } from "../constants";

const timeUnits = parseTimeUnits(match[1]);
return ParsingComponents.createRelativeFromRefDate(context.refDate, timeUnits);
return ParsingComponents.createRelativeFromRefInstant(context.refDate, timeUnits);
}
}

@@ -21,12 +21,12 @@ import { ParsingContext } from "../../../chrono";

case "maintenant":
return references.now(context.refDate);
return references.now(context.reference);
case "aujourd'hui":
return references.today(context.refDate);
return references.today(context.reference);
case "hier":
return references.yesterday(context.refDate);
return references.yesterday(context.reference);
case "demain":
return references.tomorrow(context.refDate);
return references.tomorrow(context.reference);

@@ -33,0 +33,0 @@ default:

@@ -20,4 +20,4 @@ import { ParsingContext } from "../../../chrono";

return ParsingComponents.createRelativeFromRefDate(context.refDate, outputTimeUnits);
return ParsingComponents.createRelativeFromRefInstant(context.refDate, outputTimeUnits);
}
}

@@ -41,4 +41,4 @@ import { ParsingContext } from "../../../chrono";

return ParsingComponents.createRelativeFromRefDate(context.refDate, timeUnits);
return ParsingComponents.createRelativeFromRefInstant(context.refDate, timeUnits);
}
}

@@ -13,4 +13,4 @@ import { TIME_UNITS_PATTERN, parseTimeUnits } from "../constants";

const timeUnits = parseTimeUnits(match[1]);
return ParsingComponents.createRelativeFromRefDate(context.refDate, timeUnits);
return ParsingComponents.createRelativeFromRefInstant(context.refDate, timeUnits);
}
}

@@ -21,10 +21,10 @@ import { Parser, ParsingContext } from "../../../chrono";

case "昨日":
return references.yesterday(context.refDate);
return references.yesterday(context.reference);
case "明日":
return references.tomorrow(context.refDate);
return references.tomorrow(context.reference);
case "今日":
case "当日":
return references.today(context.refDate);
return references.today(context.reference);
}

@@ -31,0 +31,0 @@

@@ -17,13 +17,13 @@ import { ParsingContext } from "../../../chrono";

case "nu":
return references.now(context.refDate);
return references.now(context.reference);
case "vandaag":
return references.today(context.refDate);
return references.today(context.reference);
case "morgen":
case "morgend":
return references.tomorrow(context.refDate);
return references.tomorrow(context.reference);
case "gisteren":
return references.yesterday(context.refDate);
return references.yesterday(context.reference);
}

@@ -30,0 +30,0 @@

@@ -13,4 +13,4 @@ import { TIME_UNITS_PATTERN, parseTimeUnits } from "../constants";

const timeUnits = parseTimeUnits(match[1]);
return ParsingComponents.createRelativeFromRefDate(context.refDate, timeUnits);
return ParsingComponents.createRelativeFromRefInstant(context.refDate, timeUnits);
}
}

@@ -17,13 +17,13 @@ import { ParsingContext } from "../../../chrono";

case "agora":
return references.now(context.refDate);
return references.now(context.reference);
case "hoje":
return references.today(context.refDate);
return references.today(context.reference);
case "amanha":
case "amanhã":
return references.tomorrow(context.refDate);
return references.tomorrow(context.reference);
case "ontem":
return references.yesterday(context.refDate);
return references.yesterday(context.reference);
}

@@ -30,0 +30,0 @@

@@ -1,2 +0,2 @@

import { Component, ParsedComponents, ParsedResult } from "./index";
import { Component, ParsedComponents, ParsedResult, ParsingReference } from "./index";

@@ -6,9 +6,28 @@ import quarterOfYear from "dayjs/plugin/quarterOfYear";

import { assignSimilarDate, assignSimilarTime, implySimilarTime } from "./utils/dayjs";
import { toTimezoneOffset } from "./timezone";
dayjs.extend(quarterOfYear);
export class ReferenceWithTimezone {
readonly instant: Date;
readonly timezoneOffset: number;
constructor(input?: ParsingReference | Date) {
input = input ?? new Date();
if (input instanceof Date) {
this.instant = input;
this.timezoneOffset = -input.getTimezoneOffset();
} else {
this.instant = input.instant ?? new Date();
this.timezoneOffset = toTimezoneOffset(input.timezone ?? -this.instant.getTimezoneOffset());
}
}
}
export class ParsingComponents implements ParsedComponents {
private knownValues: { [c in Component]?: number };
private impliedValues: { [c in Component]?: number };
private reference: ReferenceWithTimezone;
constructor(refDate: Date, knownComponents?: { [c in Component]?: number }) {
constructor(reference: ReferenceWithTimezone, knownComponents?: { [c in Component]?: number }) {
this.reference = reference;
this.knownValues = {};

@@ -22,3 +41,3 @@ this.impliedValues = {};

const refDayJs = dayjs(refDate);
const refDayJs = dayjs(reference.instant);
this.imply("day", refDayJs.date());

@@ -73,3 +92,3 @@ this.imply("month", refDayJs.month() + 1);

clone(): ParsingComponents {
const component = new ParsingComponents(new Date());
const component = new ParsingComponents(this.reference);
component.knownValues = {};

@@ -106,3 +125,3 @@ component.impliedValues = {};

isValidDate(): boolean {
const date = this.isCertain("timezoneOffset") ? this.dateWithoutTimezoneAdjustment() : this.date();
const date = this.dateWithoutTimezoneAdjustment();

@@ -130,3 +149,3 @@ if (date.getFullYear() !== this.get("year")) return false;

const date = this.dateWithoutTimezoneAdjustment();
return new Date(date.getTime() + this.getTimezoneAdjustmentMinute(date) * 60000);
return new Date(date.getTime() + this.getSystemTimezoneAdjustmentMinute() * 60000);
}

@@ -149,14 +168,14 @@

private getTimezoneAdjustmentMinute(date?: Date) {
date = date ?? new Date();
const currentTimezoneOffset = -date.getTimezoneOffset();
const targetTimezoneOffset = this.get("timezoneOffset") ?? currentTimezoneOffset;
private getSystemTimezoneAdjustmentMinute() {
const currentTimezoneOffset = -new Date().getTimezoneOffset();
const targetTimezoneOffset = this.get("timezoneOffset") ?? this.reference.timezoneOffset;
return currentTimezoneOffset - targetTimezoneOffset;
}
static createRelativeFromRefDate(
refDate: Date,
static createRelativeFromRefInstant(
refInstant: Date,
fragments: { [c in OpUnitType | QUnitType]?: number }
): ParsingComponents {
let date = dayjs(refDate);
let date = dayjs(refInstant);
for (const key in fragments) {

@@ -166,8 +185,11 @@ date = date.add(fragments[key as OpUnitType], key as OpUnitType);

const components = new ParsingComponents(refDate);
const reference = new ReferenceWithTimezone(refInstant);
const components = new ParsingComponents(reference);
if (fragments["hour"] || fragments["minute"] || fragments["second"]) {
assignSimilarTime(components, date);
assignSimilarDate(components, date);
components.assign("timezoneOffset", -refInstant.getTimezoneOffset());
} else {
implySimilarTime(components, date);
components.imply("timezoneOffset", -refInstant.getTimezoneOffset());

@@ -207,10 +229,19 @@ if (fragments["d"]) {

reference: ReferenceWithTimezone;
start: ParsingComponents;
end?: ParsingComponents;
constructor(refDate: Date, index: number, text: string, start?: ParsingComponents, end?: ParsingComponents) {
this.refDate = refDate;
constructor(
reference: ReferenceWithTimezone,
index: number,
text: string,
start?: ParsingComponents,
end?: ParsingComponents
) {
this.reference = reference;
this.refDate = reference.instant;
this.index = index;
this.text = text;
this.start = start || new ParsingComponents(this.refDate);
this.start = start || new ParsingComponents(reference);
this.end = end;

@@ -220,3 +251,3 @@ }

clone() {
const result = new ParsingResult(this.refDate, this.index, this.text);
const result = new ParsingResult(this.reference, this.index, this.text);
result.start = this.start ? this.start.clone() : null;

@@ -223,0 +254,0 @@ result.end = this.end ? this.end.clone() : null;

@@ -21,3 +21,2 @@ import { ParsingComponents } from "../results";

component.assign("millisecond", targetDayJs.millisecond());
component.assign("timezoneOffset", targetDayJs.utcOffset());
}

@@ -30,3 +29,2 @@

component.imply("millisecond", targetDayJs.millisecond());
component.imply("timezoneOffset", targetDayJs.utcOffset());
}

@@ -211,2 +211,24 @@ import * as chrono from "../../src";

}
{
const text = "in 10 minutes";
const result = chrono.parse(text, { instant: refDate, timezone: "BST" })[0] as ParsingResult;
expect(result.text).toBe(text);
result.start.imply("timezoneOffset", 60);
expect(result).toBeDate(new Date("Sun Nov 29 2020 13:34:13 GMT+0900 (Japan Standard Time)"));
expect(result).toBeDate(new Date("Sun Nov 29 2020 5:34:13 GMT+0100"));
}
{
const text = "in 10 minutes";
const result = chrono.parse(text, { instant: refDate, timezone: "JST" })[0] as ParsingResult;
expect(result.text).toBe(text);
result.start.imply("timezoneOffset", 60);
expect(result).toBeDate(new Date("Sun Nov 29 2020 13:34:13 GMT+0900 (Japan Standard Time)"));
expect(result).toBeDate(new Date("Sun Nov 29 2020 5:34:13 GMT+0100"));
}
});

@@ -91,6 +91,9 @@ import * as chrono from "../../src";

testSingleCase(chrono, "in 3 hours GMT", refDate, (result, text) => {
expect(result.text).toBe("in 3 hours");
expect(result.start.get("timezoneOffset")).toBe(-refDate.getTimezoneOffset());
});
// This test fail when the system/assume timezone is exactly similar to the mentioned timezone
// Temporary disable this test
// testSingleCase(chrono, "in 3 hours GMT", refDate, (result, text) => {
// expect(result.text).toBe("in 3 hours");
// expect(result.start.get("timezoneOffset")).toBe(-refDate.getTimezoneOffset());
// });
});

@@ -97,0 +100,0 @@

@@ -1,6 +0,6 @@

import { ParsingComponents } from "../src/results";
import { ParsingComponents, ReferenceWithTimezone } from "../src/results";
test("Test - Create & manipulate date results", () => {
const refDate = new Date();
const components = new ParsingComponents(refDate, { year: 2014, month: 11, day: 24 });
const reference = new ReferenceWithTimezone(new Date());
const components = new ParsingComponents(reference, { year: 2014, month: 11, day: 24 });

@@ -35,7 +35,26 @@ expect(components.get("year")).toBe(2014);

test("Test - Calendar checking with implied components", () => {
const reference = new ReferenceWithTimezone(new Date());
{
const components = new ParsingComponents(reference, {
"day": 13,
"month": 3,
"year": 2021,
"hour": 14,
"minute": 22,
"second": 14,
"millisecond": 0,
});
components.imply("timezoneOffset", -300);
expect(components.isValidDate()).toBe(true);
}
});
test("Test - Calendar Checking", () => {
const refDate = new Date();
const reference = new ReferenceWithTimezone(new Date());
{
const components = new ParsingComponents(refDate, { year: 2014, month: 11, day: 24 });
const components = new ParsingComponents(reference, { year: 2014, month: 11, day: 24 });
expect(components.isValidDate()).toBe(true);

@@ -45,3 +64,3 @@ }

{
const components = new ParsingComponents(refDate, { year: 2014, month: 11, day: 24, hour: 12 });
const components = new ParsingComponents(reference, { year: 2014, month: 11, day: 24, hour: 12 });
expect(components.isValidDate()).toBe(true);

@@ -51,3 +70,3 @@ }

{
const components = new ParsingComponents(refDate, { year: 2014, month: 11, day: 24, hour: 12, minute: 30 });
const components = new ParsingComponents(reference, { year: 2014, month: 11, day: 24, hour: 12, minute: 30 });
expect(components.isValidDate()).toBe(true);

@@ -57,3 +76,3 @@ }

{
const components = new ParsingComponents(refDate, {
const components = new ParsingComponents(reference, {
year: 2014,

@@ -70,3 +89,3 @@ month: 11,

{
const components = new ParsingComponents(refDate, { year: 2014, month: 13, day: 24 });
const components = new ParsingComponents(reference, { year: 2014, month: 13, day: 24 });
expect(components.isValidDate()).toBe(false);

@@ -76,3 +95,3 @@ }

{
const components = new ParsingComponents(refDate, { year: 2014, month: 11, day: 32 });
const components = new ParsingComponents(reference, { year: 2014, month: 11, day: 32 });
expect(components.isValidDate()).toBe(false);

@@ -82,3 +101,3 @@ }

{
const components = new ParsingComponents(refDate, { year: 2014, month: 11, day: 24, hour: 24 });
const components = new ParsingComponents(reference, { year: 2014, month: 11, day: 24, hour: 24 });
expect(components.isValidDate()).toBe(false);

@@ -88,3 +107,3 @@ }

{
const components = new ParsingComponents(refDate, { year: 2014, month: 11, day: 24, hour: 12, minute: 60 });
const components = new ParsingComponents(reference, { year: 2014, month: 11, day: 24, hour: 12, minute: 60 });
expect(components.isValidDate()).toBe(false);

@@ -94,3 +113,3 @@ }

{
const components = new ParsingComponents(refDate, {
const components = new ParsingComponents(reference, {
year: 2014,

@@ -97,0 +116,0 @@ month: 11,

import { BufferedDebugHandler } from "../src/debugging";
import { en, ParsedResult, ParsingOption } from "../src";
import { en, ParsedResult, ParsingOption, ParsingReference } from "../src";
interface ChronoLike {
parse(text: string, ref?: Date, option?: ParsingOption): ParsedResult[];
parse(text: string, ref?: ParsingReference | Date, option?: ParsingOption): ParsedResult[];
}

@@ -14,3 +14,3 @@

text: string,
refDateOrCheckResult?: Date | CheckResult,
refDateOrCheckResult?: ParsingReference | Date | CheckResult,
checkResult?: CheckResult

@@ -21,3 +21,3 @@ );

text: string,
refDateOrCheckResult?: Date | CheckResult,
refDateOrCheckResult?: ParsingReference | Date | CheckResult,
optionOrCheckResult?: ParsingOption | CheckResult,

@@ -29,3 +29,3 @@ checkResult?: CheckResult

text: string,
refDateOrCheckResult?: Date | CheckResult,
refDateOrCheckResult?: ParsingReference | Date | CheckResult,
optionOrCheckResult?: ParsingOption | CheckResult,

@@ -32,0 +32,0 @@ checkResult?: CheckResult

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc