refactor(deps): replace moment with dayjs

Replace Mermaid's dependency on `moment` with `dayjs`.

[Moment is now in maintenance mode][1], and they don't recommend
using it.

[Dayjs][2] has almost exactly the same API as moment, and is still
curently being maintained. Unlike moment, dayjs objects are immutable,
which makes our life much easier, but we need to do
`a = a.add(1, "day")` instead of just `a.add(1, "day")`.

We can't use `dayjs.duration`, because unlike `moment.duration`,
[dayjs durations always degrade to ms][3].
This causes issues with daylight savings, since it assumes that each
day is 24 hours, when some days have 23/25 hours with daylight savings.
(it also assumes that each month is 30 days).

However, `dayjs.add(1, "d");` correctly adds 1 days, even when that
day is only 23 hours long, so we can use that instead.

[1]: https://momentjs.com/docs/#/-project-status/
[2]: https://day.js.org/
[3]: https://day.js.org/docs/en/durations/durations
This commit is contained in:
Alois Klink 2023-02-16 20:17:57 +00:00
parent 06640aba06
commit a5db04b01c
9 changed files with 208 additions and 223 deletions

View File

@ -184,7 +184,7 @@ The following formatting options are supported:
| `YY` | 14 | 2 digit year | | `YY` | 14 | 2 digit year |
| `Q` | 1..4 | Quarter of year. Sets month to first month in quarter. | | `Q` | 1..4 | Quarter of year. Sets month to first month in quarter. |
| `M MM` | 1..12 | Month number | | `M MM` | 1..12 | Month number |
| `MMM MMMM` | January..Dec | Month name in locale set by `moment.locale()` | | `MMM MMMM` | January..Dec | Month name in locale set by `dayjs.locale()` |
| `D DD` | 1..31 | Day of month | | `D DD` | 1..31 | Day of month |
| `Do` | 1st..31st | Day of month with ordinal | | `Do` | 1st..31st | Day of month with ordinal |
| `DDD DDDD` | 1..365 | Day of year | | `DDD DDDD` | 1..365 | Day of year |
@ -200,7 +200,7 @@ The following formatting options are supported:
| `SSS` | 0..999 | Thousandths of a second | | `SSS` | 0..999 | Thousandths of a second |
| `Z ZZ` | +12:00 | Offset from UTC as +-HH:mm, +-HHmm, or Z | | `Z ZZ` | +12:00 | Offset from UTC as +-HH:mm, +-HHmm, or Z |
More info in: <https://momentjs.com/docs/#/parsing/string-format/> More info in: <https://day.js.org/docs/en/parse/string-format/>
### Output date format on the axis ### Output date format on the axis

View File

@ -57,11 +57,11 @@
"cytoscape-fcose": "^2.1.0", "cytoscape-fcose": "^2.1.0",
"d3": "^7.4.0", "d3": "^7.4.0",
"dagre-d3-es": "7.0.9", "dagre-d3-es": "7.0.9",
"dayjs": "^1.11.7",
"dompurify": "2.4.3", "dompurify": "2.4.3",
"elkjs": "^0.8.2", "elkjs": "^0.8.2",
"khroma": "^2.0.0", "khroma": "^2.0.0",
"lodash-es": "^4.17.21", "lodash-es": "^4.17.21",
"moment-mini": "^2.29.4",
"non-layered-tidy-tree-layout": "^2.0.2", "non-layered-tidy-tree-layout": "^2.0.2",
"stylis": "^4.1.2", "stylis": "^4.1.2",
"ts-dedent": "^2.2.0", "ts-dedent": "^2.2.0",

View File

@ -1,5 +1,8 @@
import moment from 'moment-mini';
import { sanitizeUrl } from '@braintree/sanitize-url'; import { sanitizeUrl } from '@braintree/sanitize-url';
import dayjs from 'dayjs';
import dayjsIsoWeek from 'dayjs/plugin/isoWeek';
import dayjsCustomParseFormat from 'dayjs/plugin/customParseFormat';
import dayjsAdvancedFormat from 'dayjs/plugin/advancedFormat';
import { log } from '../../logger'; import { log } from '../../logger';
import * as configApi from '../../config'; import * as configApi from '../../config';
import utils from '../../utils'; import utils from '../../utils';
@ -15,6 +18,10 @@ import {
getDiagramTitle, getDiagramTitle,
} from '../../commonDb'; } from '../../commonDb';
dayjs.extend(dayjsIsoWeek);
dayjs.extend(dayjsCustomParseFormat);
dayjs.extend(dayjsAdvancedFormat);
let dateFormat = ''; let dateFormat = '';
let axisFormat = ''; let axisFormat = '';
let tickInterval = undefined; let tickInterval = undefined;
@ -162,18 +169,58 @@ export const isInvalidDate = function (date, dateFormat, excludes, includes) {
return excludes.includes(date.format(dateFormat.trim())); return excludes.includes(date.format(dateFormat.trim()));
}; };
/**
* TODO: fully document what this function does and what types it accepts
*
* @param {object} task - The task to check.
* @param {string | Date} task.startTime - Might be a `Date` or a `string`.
* TODO: is this always a Date?
* @param {string | Date} task.endTime - Might be a `Date` or a `string`.
* TODO: is this always a Date?
* @param {string} dateFormat - Dayjs date format string.
* @param {*} excludes
* @param {*} includes
*/
const checkTaskDates = function (task, dateFormat, excludes, includes) { const checkTaskDates = function (task, dateFormat, excludes, includes) {
if (!excludes.length || task.manualEndTime) { if (!excludes.length || task.manualEndTime) {
return; return;
} }
let startTime = moment(task.startTime, dateFormat, true); let startTime;
startTime.add(1, 'd'); if (task.startTime instanceof Date) {
let endTime = moment(task.endTime, dateFormat, true); startTime = dayjs(task.startTime);
let renderEndTime = fixTaskDates(startTime, endTime, dateFormat, excludes, includes); } else {
task.endTime = endTime.toDate(); startTime = dayjs(task.startTime, dateFormat, true);
}
startTime = startTime.add(1, 'd');
let originalEndTime;
if (task.endTime instanceof Date) {
originalEndTime = dayjs(task.endTime);
} else {
originalEndTime = dayjs(task.endTime, dateFormat, true);
}
const [fixedEndTime, renderEndTime] = fixTaskDates(
startTime,
originalEndTime,
dateFormat,
excludes,
includes
);
task.endTime = fixedEndTime.toDate();
task.renderEndTime = renderEndTime; task.renderEndTime = renderEndTime;
}; };
/**
* TODO: what does this function do?
*
* @param {dayjs.Dayjs} startTime - The start time.
* @param {dayjs.Dayjs} endTime - The original end time (will return a different end time if it's invalid).
* @param {string} dateFormat - Dayjs date format string.
* @param {*} excludes
* @param {*} includes
* @returns {[endTime: dayjs.Dayjs, renderEndTime: Date | null]} The new `endTime`, and the end time to render.
* `renderEndTime` may be `null` if `startTime` is newer than `endTime`.
*/
const fixTaskDates = function (startTime, endTime, dateFormat, excludes, includes) { const fixTaskDates = function (startTime, endTime, dateFormat, excludes, includes) {
let invalid = false; let invalid = false;
let renderEndTime = null; let renderEndTime = null;
@ -183,11 +230,11 @@ const fixTaskDates = function (startTime, endTime, dateFormat, excludes, include
} }
invalid = isInvalidDate(startTime, dateFormat, excludes, includes); invalid = isInvalidDate(startTime, dateFormat, excludes, includes);
if (invalid) { if (invalid) {
endTime.add(1, 'd'); endTime = endTime.add(1, 'd');
} }
startTime.add(1, 'd'); startTime = startTime.add(1, 'd');
} }
return renderEndTime; return [endTime, renderEndTime];
}; };
const getStartDate = function (prevTime, dateFormat, str) { const getStartDate = function (prevTime, dateFormat, str) {
@ -223,7 +270,7 @@ const getStartDate = function (prevTime, dateFormat, str) {
} }
// Check for actual date set // Check for actual date set
let mDate = moment(str, dateFormat.trim(), true); let mDate = dayjs(str, dateFormat.trim(), true);
if (mDate.isValid()) { if (mDate.isValid()) {
return mDate.toDate(); return mDate.toDate();
} else { } else {
@ -238,11 +285,14 @@ const getStartDate = function (prevTime, dateFormat, str) {
}; };
/** /**
* Parse a string as a moment duration. * Parse a string into the args for `dayjs.add()`.
* *
* The string have to be compound by a value and a shorthand duration unit. For example `5d` * The string have to be compound by a value and a shorthand duration unit. For example `5d`
* represents 5 days. * represents 5 days.
* *
* Please be aware that 1 day may be 23 or 25 hours, if the user lives in an area
* that has daylight savings time (or even 23.5/24.5 hours in Lord Howe Island!)
*
* Shorthand unit supported are: * Shorthand unit supported are:
* *
* - `y` for years * - `y` for years
@ -254,33 +304,36 @@ const getStartDate = function (prevTime, dateFormat, str) {
* - `ms` for milliseconds * - `ms` for milliseconds
* *
* @param {string} str - A string representing the duration. * @param {string} str - A string representing the duration.
* @returns {moment.Duration} A moment duration, including an invalid moment for invalid input * @returns {[value: number, unit: dayjs.ManipulateType]} Arguments to pass to `dayjs.add()`
* string.
*/ */
const parseDuration = function (str) { const parseDuration = function (str) {
const statement = /^(\d+(?:\.\d+)?)([Mdhmswy]|ms)$/.exec(str.trim()); const statement = /^(\d+(?:\.\d+)?)([Mdhmswy]|ms)$/.exec(str.trim());
if (statement !== null) { if (statement !== null) {
return moment.duration(Number.parseFloat(statement[1]), statement[2]); return [Number.parseFloat(statement[1]), statement[2]];
} }
return moment.duration.invalid(); // NaN means an invalid duration
return [NaN, 'ms'];
}; };
const getEndDate = function (prevTime, dateFormat, str, inclusive = false) { const getEndDate = function (prevTime, dateFormat, str, inclusive = false) {
str = str.trim(); str = str.trim();
// Check for actual date // Check for actual date
let mDate = moment(str, dateFormat.trim(), true); let mDate = dayjs(str, dateFormat.trim(), true);
if (mDate.isValid()) { if (mDate.isValid()) {
if (inclusive) { if (inclusive) {
mDate.add(1, 'd'); mDate = mDate.add(1, 'd');
} }
return mDate.toDate(); return mDate.toDate();
} }
const endTime = moment(prevTime); let endTime = dayjs(prevTime);
const duration = parseDuration(str); const [durationValue, durationUnit] = parseDuration(str);
if (duration.isValid()) { if (!Number.isNaN(durationValue)) {
endTime.add(duration); const newEndTime = endTime.add(durationValue, durationUnit);
if (newEndTime.isValid()) {
endTime = newEndTime;
}
} }
return endTime.toDate(); return endTime.toDate();
}; };
@ -346,7 +399,7 @@ const compileData = function (prevTask, dataStr) {
if (endTimeData) { if (endTimeData) {
task.endTime = getEndDate(task.startTime, dateFormat, endTimeData, inclusiveEndDates); task.endTime = getEndDate(task.startTime, dateFormat, endTimeData, inclusiveEndDates);
task.manualEndTime = moment(endTimeData, 'YYYY-MM-DD', true).isValid(); task.manualEndTime = dayjs(endTimeData, 'YYYY-MM-DD', true).isValid();
checkTaskDates(task, dateFormat, excludes, includes); checkTaskDates(task, dateFormat, excludes, includes);
} }
@ -496,7 +549,7 @@ const compileTasks = function () {
); );
if (rawTasks[pos].endTime) { if (rawTasks[pos].endTime) {
rawTasks[pos].processed = true; rawTasks[pos].processed = true;
rawTasks[pos].manualEndTime = moment( rawTasks[pos].manualEndTime = dayjs(
rawTasks[pos].raw.endTime.data, rawTasks[pos].raw.endTime.data,
'YYYY-MM-DD', 'YYYY-MM-DD',
true true

View File

@ -1,5 +1,5 @@
// @ts-nocheck TODO: Fix TS // @ts-nocheck TODO: Fix TS
import moment from 'moment-mini'; import dayjs from 'dayjs';
import ganttDb from './ganttDb'; import ganttDb from './ganttDb';
import { convert } from '../../tests/util'; import { convert } from '../../tests/util';
@ -9,7 +9,7 @@ describe('when using the ganttDb', function () {
}); });
describe('when using duration', function () { describe('when using duration', function () {
it.each([{ str: '1d', expected: moment.duration(1, 'd') }])( it.each([{ str: '1d', expected: [1, 'd'] }])(
'should %s resulting in $o duration', 'should %s resulting in $o duration',
({ str, expected }) => { ({ str, expected }) => {
expect(ganttDb.parseDuration(str)).toEqual(expected); expect(ganttDb.parseDuration(str)).toEqual(expected);
@ -19,11 +19,11 @@ describe('when using the ganttDb', function () {
it.each( it.each(
convert` convert`
str | expected str | expected
${'1d'} | ${moment.duration(1, 'd')} ${'1d'} | ${[1, 'd']}
${'2w'} | ${moment.duration(2, 'w')} ${'2w'} | ${[2, 'w']}
${'1ms'} | ${moment.duration(1, 'ms')} ${'1ms'} | ${[1, 'ms']}
${'0.1s'} | ${moment.duration(100, 'ms')} ${'0.1s'} | ${[0.1, 's']}
${'1f'} | ${moment.duration.invalid()} ${'1f'} | ${[NaN, 'ms']}
` `
)('should $str resulting in $expected duration', ({ str, expected }) => { )('should $str resulting in $expected duration', ({ str, expected }) => {
expect(ganttDb.parseDuration(str)).toEqual(expected); expect(ganttDb.parseDuration(str)).toEqual(expected);
@ -171,44 +171,44 @@ describe('when using the ganttDb', function () {
const tasks = ganttDb.getTasks(); const tasks = ganttDb.getTasks();
expect(tasks[0].startTime).toEqual(moment('2019-02-01', 'YYYY-MM-DD').toDate()); expect(tasks[0].startTime).toEqual(dayjs('2019-02-01', 'YYYY-MM-DD').toDate());
expect(tasks[0].endTime).toEqual(moment('2019-02-04', 'YYYY-MM-DD').toDate()); expect(tasks[0].endTime).toEqual(dayjs('2019-02-04', 'YYYY-MM-DD').toDate());
expect(tasks[0].renderEndTime).toEqual(moment('2019-02-02', 'YYYY-MM-DD').toDate()); expect(tasks[0].renderEndTime).toEqual(dayjs('2019-02-02', 'YYYY-MM-DD').toDate());
expect(tasks[0].id).toEqual('id1'); expect(tasks[0].id).toEqual('id1');
expect(tasks[0].task).toEqual('test1'); expect(tasks[0].task).toEqual('test1');
expect(tasks[1].startTime).toEqual(moment('2019-02-04', 'YYYY-MM-DD').toDate()); expect(tasks[1].startTime).toEqual(dayjs('2019-02-04', 'YYYY-MM-DD').toDate());
expect(tasks[1].endTime).toEqual(moment('2019-02-07', 'YYYY-MM-DD').toDate()); expect(tasks[1].endTime).toEqual(dayjs('2019-02-07', 'YYYY-MM-DD').toDate());
expect(tasks[1].renderEndTime).toEqual(moment('2019-02-06', 'YYYY-MM-DD').toDate()); expect(tasks[1].renderEndTime).toEqual(dayjs('2019-02-06', 'YYYY-MM-DD').toDate());
expect(tasks[1].id).toEqual('id2'); expect(tasks[1].id).toEqual('id2');
expect(tasks[1].task).toEqual('test2'); expect(tasks[1].task).toEqual('test2');
expect(tasks[2].startTime).toEqual(moment('2019-02-07', 'YYYY-MM-DD').toDate()); expect(tasks[2].startTime).toEqual(dayjs('2019-02-07', 'YYYY-MM-DD').toDate());
expect(tasks[2].endTime).toEqual(moment('2019-02-20', 'YYYY-MM-DD').toDate()); expect(tasks[2].endTime).toEqual(dayjs('2019-02-20', 'YYYY-MM-DD').toDate());
expect(tasks[2].renderEndTime).toEqual(moment('2019-02-20', 'YYYY-MM-DD').toDate()); expect(tasks[2].renderEndTime).toEqual(dayjs('2019-02-20', 'YYYY-MM-DD').toDate());
expect(tasks[2].id).toEqual('id3'); expect(tasks[2].id).toEqual('id3');
expect(tasks[2].task).toEqual('test3'); expect(tasks[2].task).toEqual('test3');
expect(tasks[3].startTime).toEqual(moment('2019-02-01', 'YYYY-MM-DD').toDate()); expect(tasks[3].startTime).toEqual(dayjs('2019-02-01', 'YYYY-MM-DD').toDate());
expect(tasks[3].endTime).toEqual(moment('2019-02-20', 'YYYY-MM-DD').toDate()); expect(tasks[3].endTime).toEqual(dayjs('2019-02-20', 'YYYY-MM-DD').toDate());
expect(tasks[3].renderEndTime).toBeNull(); // Fixed end expect(tasks[3].renderEndTime).toBeNull(); // Fixed end
expect(tasks[3].id).toEqual('id4'); expect(tasks[3].id).toEqual('id4');
expect(tasks[3].task).toEqual('test4'); expect(tasks[3].task).toEqual('test4');
expect(tasks[4].startTime).toEqual(moment('2019-02-20', 'YYYY-MM-DD').toDate()); expect(tasks[4].startTime).toEqual(dayjs('2019-02-20', 'YYYY-MM-DD').toDate());
expect(tasks[4].endTime).toEqual(moment('2019-02-21', 'YYYY-MM-DD').toDate()); expect(tasks[4].endTime).toEqual(dayjs('2019-02-21', 'YYYY-MM-DD').toDate());
expect(tasks[4].renderEndTime).toEqual(moment('2019-02-21', 'YYYY-MM-DD').toDate()); expect(tasks[4].renderEndTime).toEqual(dayjs('2019-02-21', 'YYYY-MM-DD').toDate());
expect(tasks[4].id).toEqual('id5'); expect(tasks[4].id).toEqual('id5');
expect(tasks[4].task).toEqual('test5'); expect(tasks[4].task).toEqual('test5');
expect(tasks[5].startTime).toEqual(moment('2019-02-13', 'YYYY-MM-DD').toDate()); expect(tasks[5].startTime).toEqual(dayjs('2019-02-13', 'YYYY-MM-DD').toDate());
expect(tasks[5].endTime).toEqual(moment('2019-02-18', 'YYYY-MM-DD').toDate()); expect(tasks[5].endTime).toEqual(dayjs('2019-02-18', 'YYYY-MM-DD').toDate());
expect(tasks[5].renderEndTime).toEqual(moment('2019-02-15', 'YYYY-MM-DD').toDate()); expect(tasks[5].renderEndTime).toEqual(dayjs('2019-02-15', 'YYYY-MM-DD').toDate());
expect(tasks[5].id).toEqual('id6'); expect(tasks[5].id).toEqual('id6');
expect(tasks[5].task).toEqual('test6'); expect(tasks[5].task).toEqual('test6');
expect(tasks[6].startTime).toEqual(moment('2019-02-18', 'YYYY-MM-DD').toDate()); expect(tasks[6].startTime).toEqual(dayjs('2019-02-18', 'YYYY-MM-DD').toDate());
expect(tasks[6].endTime).toEqual(moment('2019-02-19', 'YYYY-MM-DD').toDate()); expect(tasks[6].endTime).toEqual(dayjs('2019-02-19', 'YYYY-MM-DD').toDate());
expect(tasks[6].id).toEqual('id7'); expect(tasks[6].id).toEqual('id7');
expect(tasks[6].task).toEqual('test7'); expect(tasks[6].task).toEqual('test7');
}); });
@ -243,109 +243,103 @@ describe('when using the ganttDb', function () {
const tasks = ganttDb.getTasks(); const tasks = ganttDb.getTasks();
// Section - A section // Section - A section
expect(tasks[0].startTime).toEqual(moment('2014-01-06', 'YYYY-MM-DD').toDate()); expect(tasks[0].startTime).toEqual(dayjs('2014-01-06', 'YYYY-MM-DD').toDate());
expect(tasks[0].endTime).toEqual(moment('2014-01-08', 'YYYY-MM-DD').toDate()); expect(tasks[0].endTime).toEqual(dayjs('2014-01-08', 'YYYY-MM-DD').toDate());
expect(tasks[0].order).toEqual(0); expect(tasks[0].order).toEqual(0);
expect(tasks[0].id).toEqual('des1'); expect(tasks[0].id).toEqual('des1');
expect(tasks[0].task).toEqual('Completed task'); expect(tasks[0].task).toEqual('Completed task');
expect(tasks[1].startTime).toEqual(moment('2014-01-09', 'YYYY-MM-DD').toDate()); expect(tasks[1].startTime).toEqual(dayjs('2014-01-09', 'YYYY-MM-DD').toDate());
expect(tasks[1].endTime).toEqual(moment('2014-01-12', 'YYYY-MM-DD').toDate()); expect(tasks[1].endTime).toEqual(dayjs('2014-01-12', 'YYYY-MM-DD').toDate());
expect(tasks[1].order).toEqual(1); expect(tasks[1].order).toEqual(1);
expect(tasks[1].id).toEqual('des2'); expect(tasks[1].id).toEqual('des2');
expect(tasks[1].task).toEqual('Active task'); expect(tasks[1].task).toEqual('Active task');
expect(tasks[2].startTime).toEqual(moment('2014-01-12', 'YYYY-MM-DD').toDate()); expect(tasks[2].startTime).toEqual(dayjs('2014-01-12', 'YYYY-MM-DD').toDate());
expect(tasks[2].endTime).toEqual(moment('2014-01-17', 'YYYY-MM-DD').toDate()); expect(tasks[2].endTime).toEqual(dayjs('2014-01-17', 'YYYY-MM-DD').toDate());
expect(tasks[2].order).toEqual(2); expect(tasks[2].order).toEqual(2);
expect(tasks[2].id).toEqual('des3'); expect(tasks[2].id).toEqual('des3');
expect(tasks[2].task).toEqual('Future task'); expect(tasks[2].task).toEqual('Future task');
expect(tasks[3].startTime).toEqual(moment('2014-01-17', 'YYYY-MM-DD').toDate()); expect(tasks[3].startTime).toEqual(dayjs('2014-01-17', 'YYYY-MM-DD').toDate());
expect(tasks[3].endTime).toEqual(moment('2014-01-22', 'YYYY-MM-DD').toDate()); expect(tasks[3].endTime).toEqual(dayjs('2014-01-22', 'YYYY-MM-DD').toDate());
expect(tasks[3].order).toEqual(3); expect(tasks[3].order).toEqual(3);
expect(tasks[3].id).toEqual('des4'); expect(tasks[3].id).toEqual('des4');
expect(tasks[3].task).toEqual('Future task2'); expect(tasks[3].task).toEqual('Future task2');
// Section - Critical tasks // Section - Critical tasks
expect(tasks[4].startTime).toEqual(moment('2014-01-06', 'YYYY-MM-DD').toDate()); expect(tasks[4].startTime).toEqual(dayjs('2014-01-06', 'YYYY-MM-DD').toDate());
expect(tasks[4].endTime).toEqual(moment('2014-01-07', 'YYYY-MM-DD').toDate()); expect(tasks[4].endTime).toEqual(dayjs('2014-01-07', 'YYYY-MM-DD').toDate());
expect(tasks[4].order).toEqual(4); expect(tasks[4].order).toEqual(4);
expect(tasks[4].id).toEqual('task1'); expect(tasks[4].id).toEqual('task1');
expect(tasks[4].task).toEqual('Completed task in the critical line'); expect(tasks[4].task).toEqual('Completed task in the critical line');
expect(tasks[5].startTime).toEqual(moment('2014-01-08', 'YYYY-MM-DD').toDate()); expect(tasks[5].startTime).toEqual(dayjs('2014-01-08', 'YYYY-MM-DD').toDate());
expect(tasks[5].endTime).toEqual(moment('2014-01-10', 'YYYY-MM-DD').toDate()); expect(tasks[5].endTime).toEqual(dayjs('2014-01-10', 'YYYY-MM-DD').toDate());
expect(tasks[5].order).toEqual(5); expect(tasks[5].order).toEqual(5);
expect(tasks[5].id).toEqual('task2'); expect(tasks[5].id).toEqual('task2');
expect(tasks[5].task).toEqual('Implement parser and jison'); expect(tasks[5].task).toEqual('Implement parser and jison');
expect(tasks[6].startTime).toEqual(moment('2014-01-10', 'YYYY-MM-DD').toDate()); expect(tasks[6].startTime).toEqual(dayjs('2014-01-10', 'YYYY-MM-DD').toDate());
expect(tasks[6].endTime).toEqual(moment('2014-01-13', 'YYYY-MM-DD').toDate()); expect(tasks[6].endTime).toEqual(dayjs('2014-01-13', 'YYYY-MM-DD').toDate());
expect(tasks[6].order).toEqual(6); expect(tasks[6].order).toEqual(6);
expect(tasks[6].id).toEqual('task3'); expect(tasks[6].id).toEqual('task3');
expect(tasks[6].task).toEqual('Create tests for parser'); expect(tasks[6].task).toEqual('Create tests for parser');
expect(tasks[7].startTime).toEqual(moment('2014-01-13', 'YYYY-MM-DD').toDate()); expect(tasks[7].startTime).toEqual(dayjs('2014-01-13', 'YYYY-MM-DD').toDate());
expect(tasks[7].endTime).toEqual(moment('2014-01-18', 'YYYY-MM-DD').toDate()); expect(tasks[7].endTime).toEqual(dayjs('2014-01-18', 'YYYY-MM-DD').toDate());
expect(tasks[7].order).toEqual(7); expect(tasks[7].order).toEqual(7);
expect(tasks[7].id).toEqual('task4'); expect(tasks[7].id).toEqual('task4');
expect(tasks[7].task).toEqual('Future task in critical line'); expect(tasks[7].task).toEqual('Future task in critical line');
expect(tasks[8].startTime).toEqual(moment('2014-01-18', 'YYYY-MM-DD').toDate()); expect(tasks[8].startTime).toEqual(dayjs('2014-01-18', 'YYYY-MM-DD').toDate());
expect(tasks[8].endTime).toEqual(moment('2014-01-20', 'YYYY-MM-DD').toDate()); expect(tasks[8].endTime).toEqual(dayjs('2014-01-20', 'YYYY-MM-DD').toDate());
expect(tasks[8].order).toEqual(8); expect(tasks[8].order).toEqual(8);
expect(tasks[8].id).toEqual('task5'); expect(tasks[8].id).toEqual('task5');
expect(tasks[8].task).toEqual('Create tests for renderer'); expect(tasks[8].task).toEqual('Create tests for renderer');
expect(tasks[9].startTime).toEqual(moment('2014-01-20', 'YYYY-MM-DD').toDate()); expect(tasks[9].startTime).toEqual(dayjs('2014-01-20', 'YYYY-MM-DD').toDate());
expect(tasks[9].endTime).toEqual(moment('2014-01-21', 'YYYY-MM-DD').toDate()); expect(tasks[9].endTime).toEqual(dayjs('2014-01-21', 'YYYY-MM-DD').toDate());
expect(tasks[9].order).toEqual(9); expect(tasks[9].order).toEqual(9);
expect(tasks[9].id).toEqual('task6'); expect(tasks[9].id).toEqual('task6');
expect(tasks[9].task).toEqual('Add to mermaid'); expect(tasks[9].task).toEqual('Add to mermaid');
// Section - Documentation // Section - Documentation
expect(tasks[10].startTime).toEqual(moment('2014-01-08', 'YYYY-MM-DD').toDate()); expect(tasks[10].startTime).toEqual(dayjs('2014-01-08', 'YYYY-MM-DD').toDate());
expect(tasks[10].endTime).toEqual(moment('2014-01-11', 'YYYY-MM-DD').toDate()); expect(tasks[10].endTime).toEqual(dayjs('2014-01-11', 'YYYY-MM-DD').toDate());
expect(tasks[10].order).toEqual(10); expect(tasks[10].order).toEqual(10);
expect(tasks[10].id).toEqual('a1'); expect(tasks[10].id).toEqual('a1');
expect(tasks[10].task).toEqual('Describe gantt syntax'); expect(tasks[10].task).toEqual('Describe gantt syntax');
expect(tasks[11].startTime).toEqual(moment('2014-01-11', 'YYYY-MM-DD').toDate()); expect(tasks[11].startTime).toEqual(dayjs('2014-01-11', 'YYYY-MM-DD').toDate());
expect(tasks[11].endTime).toEqual( expect(tasks[11].endTime).toEqual(dayjs('2014-01-11 20:00:00', 'YYYY-MM-DD HH:mm:ss').toDate());
moment('2014-01-11 20:00:00', 'YYYY-MM-DD HH:mm:ss').toDate()
);
expect(tasks[11].order).toEqual(11); expect(tasks[11].order).toEqual(11);
expect(tasks[11].id).toEqual('task7'); expect(tasks[11].id).toEqual('task7');
expect(tasks[11].task).toEqual('Add gantt diagram to demo page'); expect(tasks[11].task).toEqual('Add gantt diagram to demo page');
expect(tasks[12].startTime).toEqual(moment('2014-01-11', 'YYYY-MM-DD').toDate()); expect(tasks[12].startTime).toEqual(dayjs('2014-01-11', 'YYYY-MM-DD').toDate());
expect(tasks[12].endTime).toEqual(moment('2014-01-13', 'YYYY-MM-DD').toDate()); expect(tasks[12].endTime).toEqual(dayjs('2014-01-13', 'YYYY-MM-DD').toDate());
expect(tasks[12].order).toEqual(12); expect(tasks[12].order).toEqual(12);
expect(tasks[12].id).toEqual('doc1'); expect(tasks[12].id).toEqual('doc1');
expect(tasks[12].task).toEqual('Add another diagram to demo page'); expect(tasks[12].task).toEqual('Add another diagram to demo page');
// Section - Last section // Section - Last section
expect(tasks[13].startTime).toEqual(moment('2014-01-13', 'YYYY-MM-DD').toDate()); expect(tasks[13].startTime).toEqual(dayjs('2014-01-13', 'YYYY-MM-DD').toDate());
expect(tasks[13].endTime).toEqual(moment('2014-01-16', 'YYYY-MM-DD').toDate()); expect(tasks[13].endTime).toEqual(dayjs('2014-01-16', 'YYYY-MM-DD').toDate());
expect(tasks[13].order).toEqual(13); expect(tasks[13].order).toEqual(13);
expect(tasks[13].id).toEqual('task8'); expect(tasks[13].id).toEqual('task8');
expect(tasks[13].task).toEqual('Describe gantt syntax'); expect(tasks[13].task).toEqual('Describe gantt syntax');
expect(tasks[14].startTime).toEqual(moment('2014-01-16', 'YYYY-MM-DD').toDate()); expect(tasks[14].startTime).toEqual(dayjs('2014-01-16', 'YYYY-MM-DD').toDate());
expect(tasks[14].endTime).toEqual( expect(tasks[14].endTime).toEqual(dayjs('2014-01-16 20:00:00', 'YYYY-MM-DD HH:mm:ss').toDate());
moment('2014-01-16 20:00:00', 'YYYY-MM-DD HH:mm:ss').toDate()
);
expect(tasks[14].order).toEqual(14); expect(tasks[14].order).toEqual(14);
expect(tasks[14].id).toEqual('task9'); expect(tasks[14].id).toEqual('task9');
expect(tasks[14].task).toEqual('Add gantt diagram to demo page'); expect(tasks[14].task).toEqual('Add gantt diagram to demo page');
expect(tasks[15].startTime).toEqual( expect(tasks[15].startTime).toEqual(
moment('2014-01-16 20:00:00', 'YYYY-MM-DD HH:mm:ss').toDate() dayjs('2014-01-16 20:00:00', 'YYYY-MM-DD HH:mm:ss').toDate()
);
expect(tasks[15].endTime).toEqual(
moment('2014-01-18 20:00:00', 'YYYY-MM-DD HH:mm:ss').toDate()
); );
expect(tasks[15].endTime).toEqual(dayjs('2014-01-18 20:00:00', 'YYYY-MM-DD HH:mm:ss').toDate());
expect(tasks[15].order).toEqual(15); expect(tasks[15].order).toEqual(15);
expect(tasks[15].id).toEqual('task10'); expect(tasks[15].id).toEqual('task10');
expect(tasks[15].task).toEqual('Add another diagram to demo page'); expect(tasks[15].task).toEqual('Add another diagram to demo page');
@ -358,14 +352,14 @@ describe('when using the ganttDb', function () {
ganttDb.addTask('test2', 'id2,after id1,20d'); ganttDb.addTask('test2', 'id2,after id1,20d');
const tasks = ganttDb.getTasks(); const tasks = ganttDb.getTasks();
expect(tasks[0].startTime).toEqual(moment('2019-09-30', 'YYYY-MM-DD').toDate()); expect(tasks[0].startTime).toEqual(dayjs('2019-09-30', 'YYYY-MM-DD').toDate());
expect(tasks[0].endTime).toEqual(moment('2019-10-11', 'YYYY-MM-DD').toDate()); expect(tasks[0].endTime).toEqual(dayjs('2019-10-11', 'YYYY-MM-DD').toDate());
expect(tasks[1].renderEndTime).toBeNull(); // Fixed end expect(tasks[1].renderEndTime).toBeNull(); // Fixed end
expect(tasks[0].id).toEqual('id1'); expect(tasks[0].id).toEqual('id1');
expect(tasks[0].task).toEqual('test1'); expect(tasks[0].task).toEqual('test1');
expect(tasks[1].startTime).toEqual(moment('2019-10-11', 'YYYY-MM-DD').toDate()); expect(tasks[1].startTime).toEqual(dayjs('2019-10-11', 'YYYY-MM-DD').toDate());
expect(tasks[1].endTime).toEqual(moment('2019-10-31', 'YYYY-MM-DD').toDate()); expect(tasks[1].endTime).toEqual(dayjs('2019-10-31', 'YYYY-MM-DD').toDate());
expect(tasks[1].renderEndTime).toBeNull(); // Fixed end expect(tasks[1].renderEndTime).toBeNull(); // Fixed end
expect(tasks[1].id).toEqual('id2'); expect(tasks[1].id).toEqual('id2');
expect(tasks[1].task).toEqual('test2'); expect(tasks[1].task).toEqual('test2');
@ -414,13 +408,13 @@ describe('when using the ganttDb', function () {
}); });
it('should automatically add one day to all end dates', function () { it('should automatically add one day to all end dates', function () {
const tasks = ganttDb.getTasks(); const tasks = ganttDb.getTasks();
expect(tasks[0].startTime).toEqual(moment('2019-02-01', 'YYYY-MM-DD').toDate()); expect(tasks[0].startTime).toEqual(dayjs('2019-02-01', 'YYYY-MM-DD').toDate());
expect(tasks[0].endTime).toEqual(moment('2019-02-02', 'YYYY-MM-DD').toDate()); expect(tasks[0].endTime).toEqual(dayjs('2019-02-02', 'YYYY-MM-DD').toDate());
expect(tasks[0].id).toEqual('id1'); expect(tasks[0].id).toEqual('id1');
expect(tasks[0].task).toEqual('test1'); expect(tasks[0].task).toEqual('test1');
expect(tasks[1].startTime).toEqual(moment('2019-02-01', 'YYYY-MM-DD').toDate()); expect(tasks[1].startTime).toEqual(dayjs('2019-02-01', 'YYYY-MM-DD').toDate());
expect(tasks[1].endTime).toEqual(moment('2019-02-04', 'YYYY-MM-DD').toDate()); expect(tasks[1].endTime).toEqual(dayjs('2019-02-04', 'YYYY-MM-DD').toDate());
expect(tasks[1].renderEndTime).toBeNull(); // Fixed end expect(tasks[1].renderEndTime).toBeNull(); // Fixed end
expect(tasks[1].manualEndTime).toBeTruthy(); expect(tasks[1].manualEndTime).toBeTruthy();
expect(tasks[1].id).toEqual('id2'); expect(tasks[1].id).toEqual('id2');

View File

@ -1,4 +1,4 @@
import moment from 'moment-mini'; import dayjs from 'dayjs';
import { log } from '../../logger'; import { log } from '../../logger';
import { import {
select, select,
@ -435,16 +435,16 @@ export const draw = function (text, id, version, diagObj) {
const excludeRanges = []; const excludeRanges = [];
let range = null; let range = null;
let d = moment(minTime); let d = dayjs(minTime);
while (d.valueOf() <= maxTime) { while (d.valueOf() <= maxTime) {
if (diagObj.db.isInvalidDate(d, dateFormat, excludes, includes)) { if (diagObj.db.isInvalidDate(d, dateFormat, excludes, includes)) {
if (!range) { if (!range) {
range = { range = {
start: d.clone(), start: d,
end: d.clone(), end: d,
}; };
} else { } else {
range.end = d.clone(); range.end = d;
} }
} else { } else {
if (range) { if (range) {
@ -452,7 +452,7 @@ export const draw = function (text, id, version, diagObj) {
range = null; range = null;
} }
} }
d.add(1, 'd'); d = d.add(1, 'd');
} }
const rectangles = svg.append('g').selectAll('rect').data(excludeRanges).enter(); const rectangles = svg.append('g').selectAll('rect').data(excludeRanges).enter();
@ -467,7 +467,7 @@ export const draw = function (text, id, version, diagObj) {
}) })
.attr('y', conf.gridLineStartPadding) .attr('y', conf.gridLineStartPadding)
.attr('width', function (d) { .attr('width', function (d) {
const renderEnd = d.end.clone().add(1, 'day'); const renderEnd = d.end.add(1, 'day');
return timeScale(renderEnd) - timeScale(d.start); return timeScale(renderEnd) - timeScale(d.start);
}) })
.attr('height', h - theTopPad - conf.gridLineStartPadding) .attr('height', h - theTopPad - conf.gridLineStartPadding)

View File

@ -116,7 +116,7 @@ The following formatting options are supported:
| `YY` | 14 | 2 digit year | | `YY` | 14 | 2 digit year |
| `Q` | 1..4 | Quarter of year. Sets month to first month in quarter. | | `Q` | 1..4 | Quarter of year. Sets month to first month in quarter. |
| `M MM` | 1..12 | Month number | | `M MM` | 1..12 | Month number |
| `MMM MMMM` | January..Dec | Month name in locale set by `moment.locale()` | | `MMM MMMM` | January..Dec | Month name in locale set by `dayjs.locale()` |
| `D DD` | 1..31 | Day of month | | `D DD` | 1..31 | Day of month |
| `Do` | 1st..31st | Day of month with ordinal | | `Do` | 1st..31st | Day of month with ordinal |
| `DDD DDDD` | 1..365 | Day of year | | `DDD DDDD` | 1..365 | Day of year |
@ -132,7 +132,7 @@ The following formatting options are supported:
| `SSS` | 0..999 | Thousandths of a second | | `SSS` | 0..999 | Thousandths of a second |
| `Z ZZ` | +12:00 | Offset from UTC as +-HH:mm, +-HHmm, or Z | | `Z ZZ` | +12:00 | Offset from UTC as +-HH:mm, +-HHmm, or Z |
More info in: https://momentjs.com/docs/#/parsing/string-format/ More info in: https://day.js.org/docs/en/parse/string-format/
### Output date format on the axis ### Output date format on the axis

View File

@ -2,7 +2,7 @@
/* eslint-disable @typescript-eslint/no-unused-vars */ /* eslint-disable @typescript-eslint/no-unused-vars */
/* eslint-disable @typescript-eslint/no-empty-function */ /* eslint-disable @typescript-eslint/no-empty-function */
/* eslint-disable no-console */ /* eslint-disable no-console */
import moment from 'moment-mini'; import dayjs from 'dayjs';
export type LogLevel = 'trace' | 'debug' | 'info' | 'warn' | 'error' | 'fatal'; export type LogLevel = 'trace' | 'debug' | 'info' | 'warn' | 'error' | 'fatal';
@ -85,6 +85,6 @@ export const setLogLevel = function (level: keyof typeof LEVELS | number | strin
* @returns The format with the timestamp and log level * @returns The format with the timestamp and log level
*/ */
const format = (level: Uppercase<LogLevel>): string => { const format = (level: Uppercase<LogLevel>): string => {
const time = moment().format('ss.SSS'); const time = dayjs().format('ss.SSS');
return `%c${time} : ${level} : `; return `%c${time} : ${level} : `;
}; };

View File

@ -7,8 +7,8 @@ Jest code
```ts ```ts
it.each` it.each`
str | expected str | expected
${'1d'} | ${moment.duration(1, 'd')} ${'1d'} | ${dayjs.duration(1, 'd')}
${'2w'} | ${moment.duration(2, 'w')} ${'2w'} | ${dayjs.duration(2, 'w')}
`('should parse $str to $expected duration', ({ str, expected }) => { `('should parse $str to $expected duration', ({ str, expected }) => {
expect(yourFunction(str)).toEqual(expected); expect(yourFunction(str)).toEqual(expected);
}); });
@ -18,8 +18,8 @@ Vitest code
```ts ```ts
it.each(convert` it.each(convert`
str | expected str | expected
${'1d'} | ${moment.duration(1, 'd')} ${'1d'} | ${dayjs.duration(1, 'd')}
${'2w'} | ${moment.duration(2, 'w')} ${'2w'} | ${dayjs.duration(2, 'w')}
`)('should parse $str to $expected duration', ({ str, expected }) => { `)('should parse $str to $expected duration', ({ str, expected }) => {
expect(yourFunction(str)).toEqual(expected); expect(yourFunction(str)).toEqual(expected);
}); });

158
pnpm-lock.yaml generated
View File

@ -48,10 +48,10 @@ importers:
version: 4.2.1 version: 4.2.1
'@typescript-eslint/eslint-plugin': '@typescript-eslint/eslint-plugin':
specifier: ^5.48.2 specifier: ^5.48.2
version: 5.48.2_azmbqzqvrlvblbdtiwxwvyvjjy version: 5.48.2_iljmjqxcygjq3saipl7gerxpvi
'@typescript-eslint/parser': '@typescript-eslint/parser':
specifier: ^5.48.2 specifier: ^5.48.2
version: 5.48.2_et5x32uxl7z5ldub3ye5rhlyqm version: 5.48.2_yygwinqv3a2io74xmwofqb7uka
'@vitest/coverage-c8': '@vitest/coverage-c8':
specifier: ^0.28.4 specifier: ^0.28.4
version: 0.28.4_vun5xzxu3tkrssf3erdbijyyki version: 0.28.4_vun5xzxu3tkrssf3erdbijyyki
@ -93,7 +93,7 @@ importers:
version: 7.1.0 version: 7.1.0
eslint-plugin-jest: eslint-plugin-jest:
specifier: ^27.1.5 specifier: ^27.1.5
version: 27.1.5_i5clxtuiaceouxhg5syqkw5wwi version: 27.1.5_5rcd23qw3h5vuffwo2owxb3hw4
eslint-plugin-jsdoc: eslint-plugin-jsdoc:
specifier: ^39.6.2 specifier: ^39.6.2
version: 39.6.2_eslint@8.32.0 version: 39.6.2_eslint@8.32.0
@ -162,10 +162,10 @@ importers:
version: 1.15.4 version: 1.15.4
ts-node: ts-node:
specifier: ^10.9.1 specifier: ^10.9.1
version: 10.9.1_w6ufic3jqylcjznzspnj4wjqfe version: 10.9.1_cbe7ovvae6zqfnmtgctpgpys54
typescript: typescript:
specifier: ^4.8.4 specifier: ^4.8.4
version: 4.9.5 version: 4.8.4
vite: vite:
specifier: ^4.1.1 specifier: ^4.1.1
version: 4.1.1_@types+node@18.11.9 version: 4.1.1_@types+node@18.11.9
@ -193,6 +193,9 @@ importers:
dagre-d3-es: dagre-d3-es:
specifier: 7.0.9 specifier: 7.0.9
version: 7.0.9 version: 7.0.9
dayjs:
specifier: ^1.11.7
version: 1.11.7
dompurify: dompurify:
specifier: 2.4.3 specifier: 2.4.3
version: 2.4.3 version: 2.4.3
@ -205,9 +208,6 @@ importers:
lodash-es: lodash-es:
specifier: ^4.17.21 specifier: ^4.17.21
version: 4.17.21 version: 4.17.21
moment-mini:
specifier: ^2.29.4
version: 2.29.4
non-layered-tidy-tree-layout: non-layered-tidy-tree-layout:
specifier: ^2.0.2 specifier: ^2.0.2
version: 2.0.2 version: 2.0.2
@ -1266,11 +1266,11 @@ packages:
'@types/node': 14.18.29 '@types/node': 14.18.29
chalk: 4.1.2 chalk: 4.1.2
cosmiconfig: 7.0.1 cosmiconfig: 7.0.1
cosmiconfig-typescript-loader: 4.1.0_2uclxasecupgvdn72amnhmyg7y cosmiconfig-typescript-loader: 4.1.0_nxlrwu45zhpwmwjzs33dzt3ak4
lodash: 4.17.21 lodash: 4.17.21
resolve-from: 5.0.0 resolve-from: 5.0.0
ts-node: 10.9.1_yxpazyh7n5pql7jdaglasgwqki ts-node: 10.9.1_sqjhzn5m3vxyw66a2xhtc43hby
typescript: 4.9.5 typescript: 4.8.4
transitivePeerDependencies: transitivePeerDependencies:
- '@swc/core' - '@swc/core'
- '@swc/wasm' - '@swc/wasm'
@ -3087,7 +3087,7 @@ packages:
/@types/serve-index/1.9.1: /@types/serve-index/1.9.1:
resolution: {integrity: sha512-d/Hs3nWDxNL2xAczmOVZNj92YZCS6RGxfBPjKzuu/XirCgXdpKEb88dYNbrYGint6IVWLNP+yonwVAuRC0T2Dg==} resolution: {integrity: sha512-d/Hs3nWDxNL2xAczmOVZNj92YZCS6RGxfBPjKzuu/XirCgXdpKEb88dYNbrYGint6IVWLNP+yonwVAuRC0T2Dg==}
dependencies: dependencies:
'@types/express': 4.17.14 '@types/express': 4.17.17
dev: true dev: true
/@types/serve-static/1.15.0: /@types/serve-static/1.15.0:
@ -3190,7 +3190,7 @@ packages:
- supports-color - supports-color
dev: true dev: true
/@typescript-eslint/eslint-plugin/5.48.2_azmbqzqvrlvblbdtiwxwvyvjjy: /@typescript-eslint/eslint-plugin/5.48.2_iljmjqxcygjq3saipl7gerxpvi:
resolution: {integrity: sha512-sR0Gja9Ky1teIq4qJOl0nC+Tk64/uYdX+mi+5iB//MH8gwyx8e3SOyhEzeLZEFEEfCaLf8KJq+Bd/6je1t+CAg==} resolution: {integrity: sha512-sR0Gja9Ky1teIq4qJOl0nC+Tk64/uYdX+mi+5iB//MH8gwyx8e3SOyhEzeLZEFEEfCaLf8KJq+Bd/6je1t+CAg==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
peerDependencies: peerDependencies:
@ -3201,18 +3201,18 @@ packages:
typescript: typescript:
optional: true optional: true
dependencies: dependencies:
'@typescript-eslint/parser': 5.48.2_et5x32uxl7z5ldub3ye5rhlyqm '@typescript-eslint/parser': 5.48.2_yygwinqv3a2io74xmwofqb7uka
'@typescript-eslint/scope-manager': 5.48.2 '@typescript-eslint/scope-manager': 5.48.2
'@typescript-eslint/type-utils': 5.48.2_et5x32uxl7z5ldub3ye5rhlyqm '@typescript-eslint/type-utils': 5.48.2_yygwinqv3a2io74xmwofqb7uka
'@typescript-eslint/utils': 5.48.2_et5x32uxl7z5ldub3ye5rhlyqm '@typescript-eslint/utils': 5.48.2_yygwinqv3a2io74xmwofqb7uka
debug: 4.3.4 debug: 4.3.4
eslint: 8.32.0 eslint: 8.32.0
ignore: 5.2.0 ignore: 5.2.0
natural-compare-lite: 1.4.0 natural-compare-lite: 1.4.0
regexpp: 3.2.0 regexpp: 3.2.0
semver: 7.3.8 semver: 7.3.8
tsutils: 3.21.0_typescript@4.9.5 tsutils: 3.21.0_typescript@4.8.4
typescript: 4.9.5 typescript: 4.8.4
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
dev: true dev: true
@ -3237,7 +3237,7 @@ packages:
- supports-color - supports-color
dev: true dev: true
/@typescript-eslint/parser/5.48.2_et5x32uxl7z5ldub3ye5rhlyqm: /@typescript-eslint/parser/5.48.2_yygwinqv3a2io74xmwofqb7uka:
resolution: {integrity: sha512-38zMsKsG2sIuM5Oi/olurGwYJXzmtdsHhn5mI/pQogP+BjYVkK5iRazCQ8RGS0V+YLk282uWElN70zAAUmaYHw==} resolution: {integrity: sha512-38zMsKsG2sIuM5Oi/olurGwYJXzmtdsHhn5mI/pQogP+BjYVkK5iRazCQ8RGS0V+YLk282uWElN70zAAUmaYHw==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
peerDependencies: peerDependencies:
@ -3249,10 +3249,10 @@ packages:
dependencies: dependencies:
'@typescript-eslint/scope-manager': 5.48.2 '@typescript-eslint/scope-manager': 5.48.2
'@typescript-eslint/types': 5.48.2 '@typescript-eslint/types': 5.48.2
'@typescript-eslint/typescript-estree': 5.48.2_typescript@4.9.5 '@typescript-eslint/typescript-estree': 5.48.2_typescript@4.8.4
debug: 4.3.4 debug: 4.3.4
eslint: 8.32.0 eslint: 8.32.0
typescript: 4.9.5 typescript: 4.8.4
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
dev: true dev: true
@ -3293,7 +3293,7 @@ packages:
- supports-color - supports-color
dev: true dev: true
/@typescript-eslint/type-utils/5.48.2_et5x32uxl7z5ldub3ye5rhlyqm: /@typescript-eslint/type-utils/5.48.2_yygwinqv3a2io74xmwofqb7uka:
resolution: {integrity: sha512-QVWx7J5sPMRiOMJp5dYshPxABRoZV1xbRirqSk8yuIIsu0nvMTZesKErEA3Oix1k+uvsk8Cs8TGJ6kQ0ndAcew==} resolution: {integrity: sha512-QVWx7J5sPMRiOMJp5dYshPxABRoZV1xbRirqSk8yuIIsu0nvMTZesKErEA3Oix1k+uvsk8Cs8TGJ6kQ0ndAcew==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
peerDependencies: peerDependencies:
@ -3303,12 +3303,12 @@ packages:
typescript: typescript:
optional: true optional: true
dependencies: dependencies:
'@typescript-eslint/typescript-estree': 5.48.2_typescript@4.9.5 '@typescript-eslint/typescript-estree': 5.48.2_typescript@4.8.4
'@typescript-eslint/utils': 5.48.2_et5x32uxl7z5ldub3ye5rhlyqm '@typescript-eslint/utils': 5.48.2_yygwinqv3a2io74xmwofqb7uka
debug: 4.3.4 debug: 4.3.4
eslint: 8.32.0 eslint: 8.32.0
tsutils: 3.21.0_typescript@4.9.5 tsutils: 3.21.0_typescript@4.8.4
typescript: 4.9.5 typescript: 4.8.4
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
dev: true dev: true
@ -3344,28 +3344,7 @@ packages:
- supports-color - supports-color
dev: true dev: true
/@typescript-eslint/typescript-estree/5.42.1_typescript@4.9.5: /@typescript-eslint/typescript-estree/5.48.2_typescript@4.8.4:
resolution: {integrity: sha512-qElc0bDOuO0B8wDhhW4mYVgi/LZL+igPwXtV87n69/kYC/7NG3MES0jHxJNCr4EP7kY1XVsRy8C/u3DYeTKQmw==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
peerDependencies:
typescript: '*'
peerDependenciesMeta:
typescript:
optional: true
dependencies:
'@typescript-eslint/types': 5.42.1
'@typescript-eslint/visitor-keys': 5.42.1
debug: 4.3.4
globby: 11.1.0
is-glob: 4.0.3
semver: 7.3.8
tsutils: 3.21.0_typescript@4.9.5
typescript: 4.9.5
transitivePeerDependencies:
- supports-color
dev: true
/@typescript-eslint/typescript-estree/5.48.2_typescript@4.9.5:
resolution: {integrity: sha512-bibvD3z6ilnoVxUBFEgkO0k0aFvUc4Cttt0dAreEr+nrAHhWzkO83PEVVuieK3DqcgL6VAK5dkzK8XUVja5Zcg==} resolution: {integrity: sha512-bibvD3z6ilnoVxUBFEgkO0k0aFvUc4Cttt0dAreEr+nrAHhWzkO83PEVVuieK3DqcgL6VAK5dkzK8XUVja5Zcg==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
peerDependencies: peerDependencies:
@ -3380,32 +3359,12 @@ packages:
globby: 11.1.0 globby: 11.1.0
is-glob: 4.0.3 is-glob: 4.0.3
semver: 7.3.8 semver: 7.3.8
tsutils: 3.21.0_typescript@4.9.5 tsutils: 3.21.0_typescript@4.8.4
typescript: 4.9.5 typescript: 4.8.4
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
dev: true dev: true
/@typescript-eslint/utils/5.42.1_et5x32uxl7z5ldub3ye5rhlyqm:
resolution: {integrity: sha512-Gxvf12xSp3iYZd/fLqiQRD4uKZjDNR01bQ+j8zvhPjpsZ4HmvEFL/tC4amGNyxN9Rq+iqvpHLhlqx6KTxz9ZyQ==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
peerDependencies:
eslint: ^6.0.0 || ^7.0.0 || ^8.0.0
dependencies:
'@types/json-schema': 7.0.11
'@types/semver': 7.3.12
'@typescript-eslint/scope-manager': 5.42.1
'@typescript-eslint/types': 5.42.1
'@typescript-eslint/typescript-estree': 5.42.1_typescript@4.9.5
eslint: 8.32.0
eslint-scope: 5.1.1
eslint-utils: 3.0.0_eslint@8.32.0
semver: 7.3.8
transitivePeerDependencies:
- supports-color
- typescript
dev: true
/@typescript-eslint/utils/5.42.1_yygwinqv3a2io74xmwofqb7uka: /@typescript-eslint/utils/5.42.1_yygwinqv3a2io74xmwofqb7uka:
resolution: {integrity: sha512-Gxvf12xSp3iYZd/fLqiQRD4uKZjDNR01bQ+j8zvhPjpsZ4HmvEFL/tC4amGNyxN9Rq+iqvpHLhlqx6KTxz9ZyQ==} resolution: {integrity: sha512-Gxvf12xSp3iYZd/fLqiQRD4uKZjDNR01bQ+j8zvhPjpsZ4HmvEFL/tC4amGNyxN9Rq+iqvpHLhlqx6KTxz9ZyQ==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
@ -3426,7 +3385,7 @@ packages:
- typescript - typescript
dev: true dev: true
/@typescript-eslint/utils/5.48.2_et5x32uxl7z5ldub3ye5rhlyqm: /@typescript-eslint/utils/5.48.2_yygwinqv3a2io74xmwofqb7uka:
resolution: {integrity: sha512-2h18c0d7jgkw6tdKTlNaM7wyopbLRBiit8oAxoP89YnuBOzCZ8g8aBCaCqq7h208qUTroL7Whgzam7UY3HVLow==} resolution: {integrity: sha512-2h18c0d7jgkw6tdKTlNaM7wyopbLRBiit8oAxoP89YnuBOzCZ8g8aBCaCqq7h208qUTroL7Whgzam7UY3HVLow==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
peerDependencies: peerDependencies:
@ -3436,7 +3395,7 @@ packages:
'@types/semver': 7.3.12 '@types/semver': 7.3.12
'@typescript-eslint/scope-manager': 5.48.2 '@typescript-eslint/scope-manager': 5.48.2
'@typescript-eslint/types': 5.48.2 '@typescript-eslint/types': 5.48.2
'@typescript-eslint/typescript-estree': 5.48.2_typescript@4.9.5 '@typescript-eslint/typescript-estree': 5.48.2_typescript@4.8.4
eslint: 8.32.0 eslint: 8.32.0
eslint-scope: 5.1.1 eslint-scope: 5.1.1
eslint-utils: 3.0.0_eslint@8.32.0 eslint-utils: 3.0.0_eslint@8.32.0
@ -5014,7 +4973,7 @@ packages:
layout-base: 2.0.1 layout-base: 2.0.1
dev: false dev: false
/cosmiconfig-typescript-loader/4.1.0_2uclxasecupgvdn72amnhmyg7y: /cosmiconfig-typescript-loader/4.1.0_nxlrwu45zhpwmwjzs33dzt3ak4:
resolution: {integrity: sha512-HbWIuR5O+XO5Oj9SZ5bzgrD4nN+rfhrm2PMb0FVx+t+XIvC45n8F0oTNnztXtspWGw0i2IzHaUWFD5LzV1JB4A==} resolution: {integrity: sha512-HbWIuR5O+XO5Oj9SZ5bzgrD4nN+rfhrm2PMb0FVx+t+XIvC45n8F0oTNnztXtspWGw0i2IzHaUWFD5LzV1JB4A==}
engines: {node: '>=12', npm: '>=6'} engines: {node: '>=12', npm: '>=6'}
peerDependencies: peerDependencies:
@ -5025,8 +4984,8 @@ packages:
dependencies: dependencies:
'@types/node': 14.18.29 '@types/node': 14.18.29
cosmiconfig: 7.0.1 cosmiconfig: 7.0.1
ts-node: 10.9.1_yxpazyh7n5pql7jdaglasgwqki ts-node: 10.9.1_sqjhzn5m3vxyw66a2xhtc43hby
typescript: 4.9.5 typescript: 4.8.4
dev: true dev: true
/cosmiconfig/7.0.1: /cosmiconfig/7.0.1:
@ -5378,7 +5337,7 @@ packages:
cli-table3: 0.6.3 cli-table3: 0.6.3
commander: 5.1.0 commander: 5.1.0
common-tags: 1.8.2 common-tags: 1.8.2
dayjs: 1.11.5 dayjs: 1.11.7
debug: 4.3.4_supports-color@8.1.1 debug: 4.3.4_supports-color@8.1.1
enquirer: 2.3.6 enquirer: 2.3.6
eventemitter2: 6.4.7 eventemitter2: 6.4.7
@ -5718,9 +5677,8 @@ packages:
engines: {node: '>=0.11'} engines: {node: '>=0.11'}
dev: true dev: true
/dayjs/1.11.5: /dayjs/1.11.7:
resolution: {integrity: sha512-CAdX5Q3YW3Gclyo5Vpqkgpj8fSdLQcRuzfX6mC6Phy0nfJ0eGYOeS7m4mt2plDWLAtA4TqTakvbboHvUxfe4iA==} resolution: {integrity: sha512-+Yw9U6YO5TQohxLcIkrXBeY73WP3ejHWVvx8XCk3gxvQDCTEmS48ZrSZCKciI7Bhl/uCMyxYtE9UqRILmFphkQ==}
dev: true
/debug/2.6.9: /debug/2.6.9:
resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==}
@ -6240,7 +6198,7 @@ packages:
htmlparser2: 8.0.1 htmlparser2: 8.0.1
dev: true dev: true
/eslint-plugin-jest/27.1.5_i5clxtuiaceouxhg5syqkw5wwi: /eslint-plugin-jest/27.1.5_5rcd23qw3h5vuffwo2owxb3hw4:
resolution: {integrity: sha512-CK2dekZ5VBdzsOSOH5Fc1rwC+cWXjkcyrmf1RV714nDUDKu+o73TTJiDxpbILG8PtPPpAAl3ywzh5QA7Ft0mjA==} resolution: {integrity: sha512-CK2dekZ5VBdzsOSOH5Fc1rwC+cWXjkcyrmf1RV714nDUDKu+o73TTJiDxpbILG8PtPPpAAl3ywzh5QA7Ft0mjA==}
engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
peerDependencies: peerDependencies:
@ -6253,8 +6211,8 @@ packages:
jest: jest:
optional: true optional: true
dependencies: dependencies:
'@typescript-eslint/eslint-plugin': 5.48.2_azmbqzqvrlvblbdtiwxwvyvjjy '@typescript-eslint/eslint-plugin': 5.48.2_iljmjqxcygjq3saipl7gerxpvi
'@typescript-eslint/utils': 5.42.1_et5x32uxl7z5ldub3ye5rhlyqm '@typescript-eslint/utils': 5.42.1_yygwinqv3a2io74xmwofqb7uka
eslint: 8.32.0 eslint: 8.32.0
jest: 29.3.1_odkjkoia5xunhxkdrka32ib6vi jest: 29.3.1_odkjkoia5xunhxkdrka32ib6vi
transitivePeerDependencies: transitivePeerDependencies:
@ -7882,7 +7840,7 @@ packages:
pretty-format: 29.3.1 pretty-format: 29.3.1
slash: 3.0.0 slash: 3.0.0
strip-json-comments: 3.1.1 strip-json-comments: 3.1.1
ts-node: 10.9.1_w6ufic3jqylcjznzspnj4wjqfe ts-node: 10.9.1_cbe7ovvae6zqfnmtgctpgpys54
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
dev: true dev: true
@ -8259,8 +8217,8 @@ packages:
'@sideway/pinpoint': 2.0.0 '@sideway/pinpoint': 2.0.0
dev: true dev: true
/joi/17.7.1: /joi/17.8.3:
resolution: {integrity: sha512-teoLhIvWE298R6AeJywcjR4sX2hHjB3/xJX4qPjg+gTg+c0mzUDsziYlqPmLomq9gVsfaMcgPaGc7VxtD/9StA==} resolution: {integrity: sha512-q5Fn6Tj/jR8PfrLrx4fpGH4v9qM6o+vDUfD4/3vxxyg34OmKcNqYZ1qn2mpLza96S8tL0p0rIw2gOZX+/cTg9w==}
dependencies: dependencies:
'@hapi/hoek': 9.3.0 '@hapi/hoek': 9.3.0
'@hapi/topo': 5.1.0 '@hapi/topo': 5.1.0
@ -9338,10 +9296,6 @@ packages:
ufo: 1.0.1 ufo: 1.0.1
dev: true dev: true
/moment-mini/2.29.4:
resolution: {integrity: sha512-uhXpYwHFeiTbY9KSgPPRoo1nt8OxNVdMVoTBYHfSEKeRkIkwGpO+gERmhuhBtzfaeOyTkykSrm2+noJBgqt3Hg==}
dev: false
/mri/1.2.0: /mri/1.2.0:
resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==}
engines: {node: '>=4'} engines: {node: '>=4'}
@ -11352,7 +11306,7 @@ packages:
engines: {node: '>=6.10'} engines: {node: '>=6.10'}
dev: false dev: false
/ts-node/10.9.1_w6ufic3jqylcjznzspnj4wjqfe: /ts-node/10.9.1_cbe7ovvae6zqfnmtgctpgpys54:
resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==} resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==}
hasBin: true hasBin: true
peerDependencies: peerDependencies:
@ -11378,12 +11332,12 @@ packages:
create-require: 1.1.1 create-require: 1.1.1
diff: 4.0.2 diff: 4.0.2
make-error: 1.3.6 make-error: 1.3.6
typescript: 4.9.5 typescript: 4.8.4
v8-compile-cache-lib: 3.0.1 v8-compile-cache-lib: 3.0.1
yn: 3.1.1 yn: 3.1.1
dev: true dev: true
/ts-node/10.9.1_yxpazyh7n5pql7jdaglasgwqki: /ts-node/10.9.1_sqjhzn5m3vxyw66a2xhtc43hby:
resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==} resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==}
hasBin: true hasBin: true
peerDependencies: peerDependencies:
@ -11409,7 +11363,7 @@ packages:
create-require: 1.1.1 create-require: 1.1.1
diff: 4.0.2 diff: 4.0.2
make-error: 1.3.6 make-error: 1.3.6
typescript: 4.9.5 typescript: 4.8.4
v8-compile-cache-lib: 3.0.1 v8-compile-cache-lib: 3.0.1
yn: 3.1.1 yn: 3.1.1
dev: true dev: true
@ -11432,16 +11386,6 @@ packages:
typescript: 4.8.4 typescript: 4.8.4
dev: true dev: true
/tsutils/3.21.0_typescript@4.9.5:
resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==}
engines: {node: '>= 6'}
peerDependencies:
typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta'
dependencies:
tslib: 1.14.1
typescript: 4.9.5
dev: true
/tunnel-agent/0.6.0: /tunnel-agent/0.6.0:
resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==}
dependencies: dependencies:
@ -11544,12 +11488,6 @@ packages:
hasBin: true hasBin: true
dev: true dev: true
/typescript/4.9.5:
resolution: {integrity: sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==}
engines: {node: '>=4.2.0'}
hasBin: true
dev: true
/uc.micro/1.0.6: /uc.micro/1.0.6:
resolution: {integrity: sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==} resolution: {integrity: sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==}
dev: true dev: true
@ -12146,7 +12084,7 @@ packages:
hasBin: true hasBin: true
dependencies: dependencies:
axios: 0.27.2_debug@4.3.4 axios: 0.27.2_debug@4.3.4
joi: 17.7.1 joi: 17.8.3
lodash: 4.17.21 lodash: 4.17.21
minimist: 1.2.8 minimist: 1.2.8
rxjs: 7.8.0 rxjs: 7.8.0