From 9395e7970b353974b6ae12da1b925f57b1df05ff Mon Sep 17 00:00:00 2001 From: DraftMan Date: Thu, 19 May 2022 06:43:11 +0200 Subject: [PATCH] =?UTF-8?q?refactor:=20=E2=99=BB=EF=B8=8F=20migrate=20`mom?= =?UTF-8?q?ent.js`=20to=20`dayjs`=20(#14400)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 3 +- src/data-types.js | 22 +++++------ src/dialects/db2/data-types.js | 11 ++---- src/dialects/db2/query.js | 4 +- src/dialects/ibmi/data-types.js | 10 ++--- src/dialects/mariadb/connection-manager.js | 4 +- src/dialects/mariadb/data-types.js | 14 +++---- src/dialects/mssql/data-types.js | 4 +- src/dialects/mysql/connection-manager.js | 4 +- src/dialects/mysql/data-types.js | 12 +++--- src/dialects/postgres/connection-manager.js | 6 +-- src/dialects/snowflake/data-types.js | 12 +++--- src/sequelize.d.ts | 2 +- src/sequelize.js | 3 +- src/utils/dayjs.ts | 27 +++++++++++++ src/utils/index.ts | 1 + src/utils/validator-extras.js | 16 +------- .../integration/associations/has-many.test.js | 4 +- test/integration/data-types.test.js | 22 +++++------ .../postgres/connection-manager.test.js | 2 +- .../dialects/snowflake/smoke.test.js | 4 +- test/integration/instance/destroy.test.js | 14 +++---- test/integration/model.test.js | 18 ++++----- test/integration/model/findAll.test.js | 12 +++--- test/integration/model/json.test.js | 8 ++-- test/integration/sequelize/query.test.js | 4 +- .../dialects/postgres/query-generator.test.js | 38 +++++++++---------- .../dialects/sqlite/query-generator.test.js | 16 ++++---- test/unit/instance/is-soft-deleted.test.js | 4 +- yarn.lock | 7 +++- 30 files changed, 153 insertions(+), 155 deletions(-) create mode 100644 src/utils/dayjs.ts diff --git a/package.json b/package.json index f44b75c5be05..8bf9e992863d 100644 --- a/package.json +++ b/package.json @@ -40,12 +40,11 @@ "@types/debug": "^4.1.7", "@types/inflection": "^1.13.0", "@types/validator": "^13.7.1", + "dayjs": "^1.11.1", "debug": "^4.3.3", "dottie": "^2.0.2", "inflection": "^1.13.2", "lodash": "^4.17.21", - "moment": "^2.29.1", - "moment-timezone": "^0.5.34", "pg-connection-string": "^2.5.0", "retry-as-promised": "^5.0.0", "semver": "^7.3.5", diff --git a/src/data-types.js b/src/data-types.js index 3999c4063492..e413cdd2f1c6 100644 --- a/src/data-types.js +++ b/src/data-types.js @@ -5,13 +5,13 @@ const _ = require('lodash'); const wkx = require('wkx'); const sequelizeErrors = require('./errors'); const Validator = require('./utils/validator-extras').validator; -const momentTz = require('moment-timezone'); -const moment = require('moment'); +const dayjs = require('dayjs'); const { logger } = require('./utils/logger'); const warnings = {}; const { classToInvokable } = require('./utils/class-to-invokable'); const { joinSQLFragments } = require('./utils/join-sql-fragments'); +const { isValidTimeZone } = require('./utils/dayjs'); class ABSTRACT { toString(options) { @@ -518,23 +518,19 @@ class DATE extends ABSTRACT { _applyTimezone(date, options) { if (options.timezone) { - if (momentTz.tz.zone(options.timezone)) { - return momentTz(date).tz(options.timezone); + if (isValidTimeZone(options.timezone)) { + return dayjs(date).tz(options.timezone); } - return moment(date).utcOffset(options.timezone); + return dayjs(date).utcOffset(options.timezone); } - return momentTz(date); + return dayjs(date); } _stringify(date, options) { - if (!moment.isMoment(date)) { - date = this._applyTimezone(date, options); - } - // Z here means current timezone, _not_ UTC - return date.format('YYYY-MM-DD HH:mm:ss.SSS Z'); + return this._applyTimezone(date, options).format('YYYY-MM-DD HH:mm:ss.SSS Z'); } } @@ -547,12 +543,12 @@ class DATEONLY extends ABSTRACT { } _stringify(date) { - return moment(date).format('YYYY-MM-DD'); + return dayjs(date).format('YYYY-MM-DD'); } _sanitize(value, options) { if ((!options || options && !options.raw) && Boolean(value)) { - return moment(value).format('YYYY-MM-DD'); + return dayjs(value).format('YYYY-MM-DD'); } return value; diff --git a/src/dialects/db2/data-types.js b/src/dialects/db2/data-types.js index bb326d587e66..efb7bd4f367a 100644 --- a/src/dialects/db2/data-types.js +++ b/src/dialects/db2/data-types.js @@ -1,7 +1,6 @@ 'use strict'; -const momentTz = require('moment-timezone'); -const moment = require('moment'); +const dayjs = require('dayjs'); module.exports = BaseTypes => { const warn = BaseTypes.ABSTRACT.warn.bind(undefined, @@ -228,9 +227,7 @@ module.exports = BaseTypes => { } _stringify(date, options) { - if (!moment.isMoment(date)) { - date = this._applyTimezone(date, options); - } + date = this._applyTimezone(date, options); if (this._length > 0) { let msec = '.'; @@ -253,7 +250,7 @@ module.exports = BaseTypes => { return value; } - value = new Date(momentTz.utc(value)); + value = new Date(dayjs.utc(value)); return value; } @@ -261,7 +258,7 @@ module.exports = BaseTypes => { class DATEONLY extends BaseTypes.DATEONLY { static parse(value) { - return momentTz(value).format('YYYY-MM-DD'); + return dayjs(value).format('YYYY-MM-DD'); } } diff --git a/src/dialects/db2/query.js b/src/dialects/db2/query.js index b104e817a640..b2d65db65f60 100644 --- a/src/dialects/db2/query.js +++ b/src/dialects/db2/query.js @@ -8,7 +8,7 @@ const sequelizeErrors = require('../../errors'); const parserStore = require('../parserStore')('db2'); const _ = require('lodash'); const { logger } = require('../../utils/logger'); -const moment = require('moment'); +const dayjs = require('dayjs'); const debug = logger.debugContext('sql:db2'); @@ -160,7 +160,7 @@ export class Db2Query extends AbstractQuery { if (parse) { data[i][column] = parse(value); } else if (coltypes[column] === 'TIMESTAMP') { - data[i][column] = new Date(moment.utc(value)); + data[i][column] = new Date(dayjs.utc(value)); } else if (coltypes[column] === 'BLOB') { data[i][column] = new Buffer.from(value); } else if (coltypes[column].indexOf('FOR BIT DATA') > 0) { diff --git a/src/dialects/ibmi/data-types.js b/src/dialects/ibmi/data-types.js index 138c6779f262..30a35974ce60 100644 --- a/src/dialects/ibmi/data-types.js +++ b/src/dialects/ibmi/data-types.js @@ -1,6 +1,6 @@ 'use strict'; -const moment = require('moment'); +const dayjs = require('dayjs'); module.exports = BaseTypes => { const warn = BaseTypes.ABSTRACT.warn.bind(undefined, 'https://www.ibm.com/support/knowledgecenter/en/ssw_ibm_i_73/db2/rbafzch2data.htm'); @@ -61,14 +61,10 @@ module.exports = BaseTypes => { static parse(date) { if (!date.includes('+')) { // For backwards compat. Dates inserted by sequelize < 2.0dev12 will not have a timestamp set - const mome = moment.utc(date); - - return mome.toDate(); + return dayjs.utc(date).toDate(); } - const mome = moment.utc(date); - - return mome.toDate(); + return dayjs.utc(date).toDate(); } _stringify(date, options) { diff --git a/src/dialects/mariadb/connection-manager.js b/src/dialects/mariadb/connection-manager.js index 2aaa60b0717f..1e882508b44b 100644 --- a/src/dialects/mariadb/connection-manager.js +++ b/src/dialects/mariadb/connection-manager.js @@ -5,7 +5,7 @@ const { ConnectionManager } = require('../abstract/connection-manager'); const SequelizeErrors = require('../../errors'); const { logger } = require('../../utils/logger'); const DataTypes = require('../../data-types').mariadb; -const momentTz = require('moment-timezone'); +const dayjs = require('dayjs'); const debug = logger.debugContext('connection:mariadb'); const parserStore = require('../parserStore')('mariadb'); @@ -55,7 +55,7 @@ export class MariaDbConnectionManager extends ConnectionManager { async connect(config) { // Named timezone is not supported in mariadb, convert to offset let tzOffset = this.sequelize.options.timezone; - tzOffset = /\//.test(tzOffset) ? momentTz.tz(tzOffset).format('Z') + tzOffset = /\//.test(tzOffset) ? dayjs.tz(undefined, tzOffset).format('Z') : tzOffset; const connectionConfig = { diff --git a/src/dialects/mariadb/data-types.js b/src/dialects/mariadb/data-types.js index ad3ca6a69497..e1a7b1f40b60 100644 --- a/src/dialects/mariadb/data-types.js +++ b/src/dialects/mariadb/data-types.js @@ -2,8 +2,8 @@ const wkx = require('wkx'); const _ = require('lodash'); -const momentTz = require('moment-timezone'); -const moment = require('moment'); +const dayjs = require('dayjs'); +const { isValidTimeZone } = require('../../utils/dayjs'); module.exports = BaseTypes => { BaseTypes.ABSTRACT.prototype.dialectTypes = 'https://mariadb.com/kb/en/library/resultset/#field-types'; @@ -58,11 +58,7 @@ module.exports = BaseTypes => { } _stringify(date, options) { - if (!moment.isMoment(date)) { - date = this._applyTimezone(date, options); - } - - return date.format('YYYY-MM-DD HH:mm:ss.SSS'); + return this._applyTimezone(date, options).format('YYYY-MM-DD HH:mm:ss.SSS'); } static parse(value, options) { @@ -71,8 +67,8 @@ module.exports = BaseTypes => { return value; } - if (momentTz.tz.zone(options.timezone)) { - value = momentTz.tz(value, options.timezone).toDate(); + if (isValidTimeZone(options.timezone)) { + value = dayjs.tz(value, options.timezone).toDate(); } else { value = new Date(`${value} ${options.timezone}`); } diff --git a/src/dialects/mssql/data-types.js b/src/dialects/mssql/data-types.js index 1b2517f00da0..6da0e1c75e49 100644 --- a/src/dialects/mssql/data-types.js +++ b/src/dialects/mssql/data-types.js @@ -1,6 +1,6 @@ 'use strict'; -const moment = require('moment'); +const dayjs = require('dayjs'); module.exports = BaseTypes => { const warn = BaseTypes.ABSTRACT.warn.bind(undefined, 'https://msdn.microsoft.com/en-us/library/ms187752%28v=sql.110%29.aspx'); @@ -138,7 +138,7 @@ module.exports = BaseTypes => { class DATEONLY extends BaseTypes.DATEONLY { static parse(value) { - return moment(value).format('YYYY-MM-DD'); + return dayjs(value).format('YYYY-MM-DD'); } } diff --git a/src/dialects/mysql/connection-manager.js b/src/dialects/mysql/connection-manager.js index 355cc69dadee..f4520197eef5 100644 --- a/src/dialects/mysql/connection-manager.js +++ b/src/dialects/mysql/connection-manager.js @@ -4,7 +4,7 @@ const { ConnectionManager } = require('../abstract/connection-manager'); const SequelizeErrors = require('../../errors'); const { logger } = require('../../utils/logger'); const DataTypes = require('../../data-types').mysql; -const momentTz = require('moment-timezone'); +const dayjs = require('dayjs'); const debug = logger.debugContext('connection:mysql'); const parserStore = require('../parserStore')('mysql'); @@ -107,7 +107,7 @@ export class MySqlConnectionManager extends ConnectionManager { // set timezone for this connection // but named timezone are not directly supported in mysql, so get its offset first let tzOffset = this.sequelize.options.timezone; - tzOffset = /\//.test(tzOffset) ? momentTz.tz(tzOffset).format('Z') : tzOffset; + tzOffset = /\//.test(tzOffset) ? dayjs.tz(undefined, tzOffset).format('Z') : tzOffset; await promisify(cb => connection.query(`SET time_zone = '${tzOffset}'`, cb))(); } diff --git a/src/dialects/mysql/data-types.js b/src/dialects/mysql/data-types.js index 6b8f25f4f382..3c5f55c401e6 100644 --- a/src/dialects/mysql/data-types.js +++ b/src/dialects/mysql/data-types.js @@ -2,8 +2,8 @@ const wkx = require('wkx'); const _ = require('lodash'); -const momentTz = require('moment-timezone'); -const moment = require('moment'); +const dayjs = require('dayjs'); +const { isValidTimeZone } = require('../../utils/dayjs'); module.exports = BaseTypes => { BaseTypes.ABSTRACT.prototype.dialectTypes = 'https://dev.mysql.com/doc/refman/5.7/en/data-types.html'; @@ -58,9 +58,7 @@ module.exports = BaseTypes => { } _stringify(date, options) { - if (!moment.isMoment(date)) { - date = this._applyTimezone(date, options); - } + date = this._applyTimezone(date, options); // Fractional DATETIMEs only supported on MySQL 5.6.4+ if (this._length) { @@ -76,8 +74,8 @@ module.exports = BaseTypes => { return value; } - if (momentTz.tz.zone(options.timezone)) { - value = momentTz.tz(value, options.timezone).toDate(); + if (isValidTimeZone(options.timezone)) { + value = dayjs.tz(value, options.timezone).toDate(); } else { value = new Date(`${value} ${options.timezone}`); } diff --git a/src/dialects/postgres/connection-manager.js b/src/dialects/postgres/connection-manager.js index b3f44db42979..e9db61051eeb 100644 --- a/src/dialects/postgres/connection-manager.js +++ b/src/dialects/postgres/connection-manager.js @@ -3,12 +3,13 @@ const _ = require('lodash'); const { ConnectionManager } = require('../abstract/connection-manager'); const { logger } = require('../../utils/logger'); +const { isValidTimeZone } = require('../../utils/dayjs'); const debug = logger.debugContext('connection:pg'); const sequelizeErrors = require('../../errors'); const semver = require('semver'); const dataTypes = require('../../data-types'); -const momentTz = require('moment-timezone'); +const dayjs = require('dayjs'); const { promisify } = require('util'); export class PostgresConnectionManager extends ConnectionManager { @@ -243,8 +244,7 @@ export class PostgresConnectionManager extends ConnectionManager { } if (!this.sequelize.config.keepDefaultTimezone) { - const isZone = Boolean(momentTz.tz.zone(this.sequelize.options.timezone)); - if (isZone) { + if (isValidTimeZone(this.sequelize.options.timezone)) { query += `SET TIME ZONE '${this.sequelize.options.timezone}';`; } else { query += `SET TIME ZONE INTERVAL '${this.sequelize.options.timezone}' HOUR TO MINUTE;`; diff --git a/src/dialects/snowflake/data-types.js b/src/dialects/snowflake/data-types.js index 92bab39e380f..b9d34c23829b 100644 --- a/src/dialects/snowflake/data-types.js +++ b/src/dialects/snowflake/data-types.js @@ -1,7 +1,7 @@ 'use strict'; -const momentTz = require('moment-timezone'); -const moment = require('moment'); +const dayjs = require('dayjs'); +const { isValidTimeZone } = require('../../utils/dayjs'); module.exports = BaseTypes => { BaseTypes.ABSTRACT.prototype.dialectTypes = 'https://dev.snowflake.com/doc/refman/5.7/en/data-types.html'; @@ -43,9 +43,7 @@ module.exports = BaseTypes => { } _stringify(date, options) { - if (!moment.isMoment(date)) { - date = this._applyTimezone(date, options); - } + date = this._applyTimezone(date, options); if (this._length) { return date.format('YYYY-MM-DD HH:mm:ss.SSS'); @@ -60,8 +58,8 @@ module.exports = BaseTypes => { return value; } - if (momentTz.tz.zone(options.timezone)) { - value = momentTz.tz(value, options.timezone).toDate(); + if (isValidTimeZone(options.timezone)) { + value = dayjs.tz(value, options.timezone).toDate(); } else { value = new Date(`${value} ${options.timezone}`); } diff --git a/src/sequelize.d.ts b/src/sequelize.d.ts index 0924295085c4..a3d737f5e995 100644 --- a/src/sequelize.d.ts +++ b/src/sequelize.d.ts @@ -278,7 +278,7 @@ export interface Options extends Logging { * used to SET TIMEZONE when connecting to the server, to ensure that the result of NOW, CURRENT_TIMESTAMP * and other time related functions have in the right timezone. For best cross platform performance use the * format - * +/-HH:MM. Will also accept string versions of timezones used by moment.js (e.g. 'America/Los_Angeles'); + * +/-HH:MM. Will also accept string versions of timezones supported by Intl.Locale (e.g. 'America/Los_Angeles'); * this is useful to capture daylight savings time changes. * * @default '+00:00' diff --git a/src/sequelize.js b/src/sequelize.js index eca042a78c00..a2c563065a04 100644 --- a/src/sequelize.js +++ b/src/sequelize.js @@ -31,6 +31,7 @@ const { BelongsTo } = require('./associations/belongs-to'); const { HasOne } = require('./associations/has-one'); const { BelongsToMany } = require('./associations/belongs-to-many'); const { HasMany } = require('./associations/has-many'); +require('./utils/dayjs'); /** * This is the main class, the entry point to sequelize. @@ -152,7 +153,7 @@ export class Sequelize { * @param {string} [options.schema=null] A schema to use * @param {object} [options.set={}] Default options for sequelize.set * @param {object} [options.sync={}] Default options for sequelize.sync - * @param {string} [options.timezone='+00:00'] The timezone used when converting a date from the database into a JavaScript date. The timezone is also used to SET TIMEZONE when connecting to the server, to ensure that the result of NOW, CURRENT_TIMESTAMP and other time related functions have in the right timezone. For best cross platform performance use the format +/-HH:MM. Will also accept string versions of timezones used by moment.js (e.g. 'America/Los_Angeles'); this is useful to capture daylight savings time changes. + * @param {string} [options.timezone='+00:00'] The timezone used when converting a date from the database into a JavaScript date. The timezone is also used to SET TIMEZONE when connecting to the server, to ensure that the result of NOW, CURRENT_TIMESTAMP and other time related functions have in the right timezone. For best cross platform performance use the format +/-HH:MM. Will also accept string versions of timezones supported by Intl.Locale (e.g. 'America/Los_Angeles'); this is useful to capture daylight savings time changes. * @param {string|boolean} [options.clientMinMessages='warning'] (Deprecated) The PostgreSQL `client_min_messages` session parameter. Set to `false` to not override the database's default. * @param {boolean} [options.standardConformingStrings=true] The PostgreSQL `standard_conforming_strings` session parameter. Set to `false` to not set the option. WARNING: Setting this to false may expose vulnerabilities and is not recommended! * @param {Function} [options.logging=console.log] A function that gets executed every time Sequelize would log something. Function may receive multiple parameters but only first one is printed by `console.log`. To print all values use `(...msg) => console.log(msg)` diff --git a/src/utils/dayjs.ts b/src/utils/dayjs.ts new file mode 100644 index 000000000000..025f05f18cfc --- /dev/null +++ b/src/utils/dayjs.ts @@ -0,0 +1,27 @@ +import dayjs from 'dayjs'; +import timezone from 'dayjs/plugin/timezone'; +import utc from 'dayjs/plugin/utc'; + +dayjs.extend(utc); +dayjs.extend(timezone); + +const history = new Map(); + +export function isValidTimeZone(tz: string) { + if (history.has(tz)) { + return history.get(tz); + } + + let status: boolean; + try { + Intl.DateTimeFormat(undefined, { timeZone: tz }); + + status = true; + } catch { + status = false; + } + + history.set(tz, status); + + return status; +} diff --git a/src/utils/index.ts b/src/utils/index.ts index a79dbb22f2b1..ccd2b6dd25c2 100644 --- a/src/utils/index.ts +++ b/src/utils/index.ts @@ -10,6 +10,7 @@ export * from './join-sql-fragments'; export * from './object'; export * from './sequelize-method'; export * from './string'; +export * from './dayjs'; /** * getComplexSize diff --git a/src/utils/validator-extras.js b/src/utils/validator-extras.js index 41503c6bf618..881ee2bbb90d 100644 --- a/src/utils/validator-extras.js +++ b/src/utils/validator-extras.js @@ -2,7 +2,7 @@ const _ = require('lodash'); const validator = _.cloneDeep(require('validator')); -const moment = require('moment'); +const dayjs = require('dayjs'); export const extensions = { extend(name, fn) { @@ -88,19 +88,7 @@ validator.isNull = validator.isEmpty; // isDate removed in 7.0.0 // https://github.com/chriso/validator.js/commit/095509fc707a4dc0e99f85131df1176ad6389fc9 validator.isDate = function (dateString) { - // avoid http://momentjs.com/guides/#/warnings/js-date/ - // by doing a preliminary check on `dateString` - const parsed = Date.parse(dateString); - if (isNaN(parsed)) { - // fail if we can't parse it - return false; - } - - // otherwise convert to ISO 8601 as moment prefers - // http://momentjs.com/docs/#/parsing/string/ - const date = new Date(parsed); - - return moment(date.toISOString()).isValid(); + return dayjs(dateString).isValid(); }; export { validator }; diff --git a/test/integration/associations/has-many.test.js b/test/integration/associations/has-many.test.js index fb0a02b98266..fa0d46193a37 100644 --- a/test/integration/associations/has-many.test.js +++ b/test/integration/associations/has-many.test.js @@ -5,7 +5,7 @@ const chai = require('chai'); const expect = chai.expect; const Support = require('../support'); const { DataTypes, Sequelize, Op } = require('@sequelize/core'); -const moment = require('moment'); +const dayjs = require('dayjs'); const sinon = require('sinon'); const current = Support.sequelize; @@ -974,7 +974,7 @@ describe(Support.getTestDialectTeaser('HasMany'), () => { ]); await article.setLabels([label1, label2]); - const labels = await article.getLabels({ where: { until: { [Op.gt]: moment('2014-01-02').toDate() } } }); + const labels = await article.getLabels({ where: { until: { [Op.gt]: dayjs('2014-01-02').toDate() } } }); expect(labels).to.be.instanceof(Array); expect(labels).to.have.length(1); expect(labels[0].text).to.equal('Epicness'); diff --git a/test/integration/data-types.test.js b/test/integration/data-types.test.js index 618270e1d979..02d50f6651b0 100644 --- a/test/integration/data-types.test.js +++ b/test/integration/data-types.test.js @@ -6,7 +6,7 @@ const expect = chai.expect; const Support = require('./support'); const sinon = require('sinon'); const _ = require('lodash'); -const moment = require('moment'); +const dayjs = require('dayjs'); const current = Support.sequelize; const uuid = require('uuid'); @@ -24,15 +24,11 @@ describe(Support.getTestDialectTeaser('DataTypes'), () => { it('allows me to return values from a custom parse function', async () => { const parse = DataTypes.DATE.parse = sinon.spy(value => { - return moment(value, 'YYYY-MM-DD HH:mm:ss'); + return dayjs(value, 'YYYY-MM-DD HH:mm:ss'); }); const stringify = DataTypes.DATE.prototype.stringify = sinon.spy(function (value, options) { - if (!moment.isMoment(value)) { - value = this._applyTimezone(value, options); - } - - return value.format('YYYY-MM-DD HH:mm:ss'); + return this._applyTimezone(value, options).format('YYYY-MM-DD HH:mm:ss'); }); current.refreshTypes(); @@ -46,7 +42,7 @@ describe(Support.getTestDialectTeaser('DataTypes'), () => { await current.sync({ force: true }); await User.create({ - dateField: moment('2011 10 31', 'YYYY MM DD'), + dateField: dayjs('2011 10 31', 'YYYY MM DD'), }); const obj = await User.findAll(); @@ -54,7 +50,7 @@ describe(Support.getTestDialectTeaser('DataTypes'), () => { expect(parse).to.have.been.called; expect(stringify).to.have.been.called; - expect(moment.isMoment(user.dateField)).to.be.ok; + expect(dayjs.isDayjs(user.dateField)).to.be.ok; delete DataTypes.DATE.parse; }); @@ -154,13 +150,13 @@ describe(Support.getTestDialectTeaser('DataTypes'), () => { it('calls parse and stringify for DATEONLY', async () => { const Type = new DataTypes.DATEONLY(); - await testSuccess(Type, moment(new Date()).format('YYYY-MM-DD')); + await testSuccess(Type, dayjs().format('YYYY-MM-DD')); }); it('calls parse and stringify for TIME', async () => { const Type = new DataTypes.TIME(); - await testSuccess(Type, moment(new Date()).format('HH:mm:ss')); + await testSuccess(Type, dayjs().format('HH:mm:ss')); }); it('calls parse and stringify for BLOB', async () => { @@ -674,7 +670,7 @@ describe(Support.getTestDialectTeaser('DataTypes'), () => { const Model = this.sequelize.define('user', { stamp: DataTypes.DATEONLY, }); - const testDate = moment().format('YYYY-MM-DD'); + const testDate = dayjs().format('YYYY-MM-DD'); const newDate = new Date(); await Model.sync({ force: true }); @@ -710,7 +706,7 @@ describe(Support.getTestDialectTeaser('DataTypes'), () => { const Model = this.sequelize.define('user', { stamp: DataTypes.DATEONLY, }); - const testDate = moment().format('YYYY-MM-DD'); + const testDate = dayjs().format('YYYY-MM-DD'); await Model.sync({ force: true }); const record2 = await Model.create({ stamp: testDate }); diff --git a/test/integration/dialects/postgres/connection-manager.test.js b/test/integration/dialects/postgres/connection-manager.test.js index 3a85f0a3c04c..a530449238ab 100644 --- a/test/integration/dialects/postgres/connection-manager.test.js +++ b/test/integration/dialects/postgres/connection-manager.test.js @@ -20,7 +20,7 @@ if (dialect.startsWith('postgres')) { expect(row).to.be.not.null; } - it('should correctly parse the moment based timezone while fetching hstore oids', async function () { + it('should correctly parse the timezone while fetching hstore oids', async function () { await checkTimezoneParsing(this.sequelize.options); }); diff --git a/test/integration/dialects/snowflake/smoke.test.js b/test/integration/dialects/snowflake/smoke.test.js index 3b27206f550e..6f399ca92499 100644 --- a/test/integration/dialects/snowflake/smoke.test.js +++ b/test/integration/dialects/snowflake/smoke.test.js @@ -4,7 +4,7 @@ const Support = require('../../support'); const dialect = Support.getTestDialect(); const { DataTypes } = require('@sequelize/core'); -const moment = require('moment'); +const dayjs = require('dayjs'); if (dialect === 'snowflake') { describe('[SNOWFLAKE Specific] Smoke test', () => { @@ -27,7 +27,7 @@ if (dialect === 'snowflake') { await User.sync({ force: true }); await User.create({ id: 1, username: 'jozef', lastActivity: new Date(Date.UTC(2021, 5, 21)) }); - await User.create({ id: 2, username: 'jeff', lastActivity: moment(Date.UTC(2021, 5, 22)).format('YYYY-MM-DD HH:mm:ss Z') }); + await User.create({ id: 2, username: 'jeff', lastActivity: dayjs(Date.UTC(2021, 5, 22)).format('YYYY-MM-DD HH:mm:ss Z') }); }); after(async () => { diff --git a/test/integration/instance/destroy.test.js b/test/integration/instance/destroy.test.js index 9ad47bbd3e81..29db6be4addb 100644 --- a/test/integration/instance/destroy.test.js +++ b/test/integration/instance/destroy.test.js @@ -4,7 +4,7 @@ const chai = require('chai'); const expect = chai.expect; const sinon = require('sinon'); -const moment = require('moment'); +const dayjs = require('dayjs'); const Support = require('../support'); const { DataTypes } = require('@sequelize/core'); @@ -224,15 +224,15 @@ describe(Support.getTestDialectTeaser('Instance'), () => { }); expect(user2).to.be.ok; - expect(moment.utc(user2.deletedAt).startOf('second').toISOString()) - .to.equal(moment.utc(deletedAt).startOf('second').toISOString()); + expect(dayjs.utc(user2.deletedAt).startOf('second').toISOString()) + .to.equal(dayjs.utc(deletedAt).startOf('second').toISOString()); expect(user2.username).to.equal('foo'); const user1 = user2; // update model and delete again user1.username = 'bar'; const user0 = await user1.destroy(); - expect(moment.utc(user0.deletedAt).startOf('second').toISOString()) - .to.equal(moment.utc(deletedAt).startOf('second').toISOString(), + expect(dayjs.utc(user0.deletedAt).startOf('second').toISOString()) + .to.equal(dayjs.utc(deletedAt).startOf('second').toISOString(), 'should not updated deletedAt when destroying multiple times'); const user = await ParanoidUser.findOne({ @@ -243,8 +243,8 @@ describe(Support.getTestDialectTeaser('Instance'), () => { }); expect(user).to.be.ok; - expect(moment.utc(user.deletedAt).startOf('second').toISOString()) - .to.equal(moment.utc(deletedAt).startOf('second').toISOString()); + expect(dayjs.utc(user.deletedAt).startOf('second').toISOString()) + .to.equal(dayjs.utc(deletedAt).startOf('second').toISOString()); expect(user.username).to.equal('bar'); }); diff --git a/test/integration/model.test.js b/test/integration/model.test.js index 8b58895a8aa3..78d1ee3d33c9 100644 --- a/test/integration/model.test.js +++ b/test/integration/model.test.js @@ -9,7 +9,7 @@ const { DataTypes, Sequelize, Op, AggregateError } = require('@sequelize/core'); const dialect = Support.getTestDialect(); const sinon = require('sinon'); const _ = require('lodash'); -const moment = require('moment'); +const dayjs = require('dayjs'); const current = Support.sequelize; const semver = require('semver'); @@ -114,11 +114,11 @@ describe(Support.getTestDialectTeaser('Model'), () => { aNumber: DataTypes.INTEGER, createdAt: { type: DataTypes.DATE, - defaultValue: moment('2012-01-01').toDate(), + defaultValue: dayjs('2012-01-01').toDate(), }, updatedAt: { type: DataTypes.DATE, - defaultValue: moment('2012-01-02').toDate(), + defaultValue: dayjs('2012-01-02').toDate(), }, }, { timestamps: true }); @@ -126,11 +126,11 @@ describe(Support.getTestDialectTeaser('Model'), () => { const user = await UserTable.create({ aNumber: 5 }); await UserTable.bulkCreate([{ aNumber: 10 }, { aNumber: 12 }]); const users = await UserTable.findAll({ where: { aNumber: { [Op.gte]: 10 } } }); - expect(moment(user.createdAt).format('YYYY-MM-DD')).to.equal('2012-01-01'); - expect(moment(user.updatedAt).format('YYYY-MM-DD')).to.equal('2012-01-02'); + expect(dayjs(user.createdAt).format('YYYY-MM-DD')).to.equal('2012-01-01'); + expect(dayjs(user.updatedAt).format('YYYY-MM-DD')).to.equal('2012-01-02'); for (const u of users) { - expect(moment(u.createdAt).format('YYYY-MM-DD')).to.equal('2012-01-01'); - expect(moment(u.updatedAt).format('YYYY-MM-DD')).to.equal('2012-01-02'); + expect(dayjs(u.createdAt).format('YYYY-MM-DD')).to.equal('2012-01-01'); + expect(dayjs(u.updatedAt).format('YYYY-MM-DD')).to.equal('2012-01-02'); } }); @@ -1566,7 +1566,7 @@ describe(Support.getTestDialectTeaser('Model'), () => { await ParanoidUser.bulkCreate(data); // since we save in UTC, let's format to UTC time - const date = moment().utc().format('YYYY-MM-DD h:mm'); + const date = dayjs().utc().format('YYYY-MM-DD h:mm'); await ParanoidUser.destroy({ where: { secretValue: '42' } }); let users = await ParanoidUser.findAll({ order: ['id'] }); @@ -1581,7 +1581,7 @@ describe(Support.getTestDialectTeaser('Model'), () => { expect(users[0].username).to.equal('Peter'); expect(users[1].username).to.equal('Paul'); - const formatDate = val => moment(new Date(val)).utc().format('YYYY-MM-DD h:mm'); + const formatDate = val => dayjs(val).utc().format('YYYY-MM-DD h:mm'); expect(formatDate(users[0].deletedAt)).to.equal(date); expect(formatDate(users[1].deletedAt)).to.equal(date); diff --git a/test/integration/model/findAll.test.js b/test/integration/model/findAll.test.js index 993ac4cce58c..dcd3be3d36c5 100644 --- a/test/integration/model/findAll.test.js +++ b/test/integration/model/findAll.test.js @@ -10,7 +10,7 @@ const { DataTypes, Op, Sequelize } = require('@sequelize/core'); const dialect = Support.getTestDialect(); const _ = require('lodash'); -const moment = require('moment'); +const dayjs = require('dayjs'); const current = Support.sequelize; const promiseProps = require('p-props'); @@ -392,11 +392,11 @@ describe(Support.getTestDialectTeaser('Model'), () => { expect(users[0].intVal).to.equal(10); }); - it('should be able to find a row using greater than or equal to logic with moment dates', async function () { + it('should be able to find a row using greater than or equal to logic with dayjs dates', async function () { const users = await this.User.findAll({ where: { theDate: { - [Op.gte]: moment('2013-01-09'), + [Op.gte]: dayjs('2013-01-09'), }, }, }); @@ -1348,8 +1348,8 @@ describe(Support.getTestDialectTeaser('Model'), () => { describe('normal findAll', () => { beforeEach(async function () { - const user = await this.User.create({ username: 'user', data: 'foobar', theDate: moment().toDate() }); - const user2 = await this.User.create({ username: 'user2', data: 'bar', theDate: moment().toDate() }); + const user = await this.User.create({ username: 'user', data: 'foobar', theDate: dayjs().toDate() }); + const user2 = await this.User.create({ username: 'user2', data: 'bar', theDate: dayjs().toDate() }); this.users = [user].concat(user2); }); @@ -1376,7 +1376,7 @@ describe(Support.getTestDialectTeaser('Model'), () => { }); it('sorts the results via a date column', async function () { - await this.User.create({ username: 'user3', data: 'bar', theDate: moment().add(2, 'hours').toDate() }); + await this.User.create({ username: 'user3', data: 'bar', theDate: dayjs().add(2, 'hours').toDate() }); const users = await this.User.findAll({ order: [['theDate', 'DESC']] }); expect(users[0].id).to.be.above(users[2].id); }); diff --git a/test/integration/model/json.test.js b/test/integration/model/json.test.js index 6f966ca9195f..ef50262896df 100644 --- a/test/integration/model/json.test.js +++ b/test/integration/model/json.test.js @@ -1,7 +1,7 @@ 'use strict'; const chai = require('chai'); -const moment = require('moment'); +const dayjs = require('dayjs'); const expect = chai.expect; const Support = require('../support'); @@ -249,10 +249,10 @@ describe(Support.getTestDialectTeaser('Model'), () => { }); it('should be possible to query dates with array operators', async function () { - const now = moment().milliseconds(0).toDate(); - const before = moment().milliseconds(0).subtract(1, 'day') + const now = dayjs().millisecond(0).toDate(); + const before = dayjs().millisecond(0).subtract(1, 'day') .toDate(); - const after = moment().milliseconds(0).add(1, 'day') + const after = dayjs().millisecond(0).add(1, 'day') .toDate(); await Promise.all([this.Event.create({ diff --git a/test/integration/sequelize/query.test.js b/test/integration/sequelize/query.test.js index 4bc3737f4639..92bbc52621e5 100644 --- a/test/integration/sequelize/query.test.js +++ b/test/integration/sequelize/query.test.js @@ -8,7 +8,7 @@ const { Sequelize, DataTypes, DatabaseError, UniqueConstraintError, ForeignKeyCo const dialect = Support.getTestDialect(); const sequelize = Support.sequelize; const sinon = require('sinon'); -const moment = require('moment'); +const dayjs = require('dayjs'); const qq = str => { if (['postgres', 'mssql', 'db2', 'ibmi'].includes(dialect)) { @@ -727,7 +727,7 @@ describe(Support.getTestDialectTeaser('Sequelize'), () => { } const [result] = await this.sequelize.query(`SELECT ${datetime} AS t${dialect === 'ibmi' ? ' FROM SYSIBM.SYSDUMMY1' : ''}`); - expect(moment(result[0].t).isValid()).to.be.true; + expect(dayjs(result[0].t).isValid()).to.be.true; }); if (Support.getTestDialect() === 'postgres') { diff --git a/test/unit/dialects/postgres/query-generator.test.js b/test/unit/dialects/postgres/query-generator.test.js index 7fd4457c8be1..6af6e46cc29f 100644 --- a/test/unit/dialects/postgres/query-generator.test.js +++ b/test/unit/dialects/postgres/query-generator.test.js @@ -8,7 +8,7 @@ const { PostgresQueryGenerator: QueryGenerator } = require('@sequelize/core/_non const Support = require('../../support'); const dialect = Support.getTestDialect(); -const moment = require('moment'); +const dayjs = require('dayjs'); const current = Support.sequelize; const _ = require('lodash'); @@ -648,12 +648,12 @@ if (dialect.startsWith('postgres')) { bind: { sequelize_1: `foo';DROP TABLE myTable;` }, }, }, { - arguments: ['myTable', { name: 'foo', birthday: moment('2011-03-27 10:01:55 +0000', 'YYYY-MM-DD HH:mm:ss Z').toDate() }], + arguments: ['myTable', { name: 'foo', birthday: dayjs('2011-03-27 10:01:55 +0000', 'YYYY-MM-DD HH:mm:ss Z').toDate() }], expectation: { query: 'INSERT INTO "myTable" ("name","birthday") VALUES ($sequelize_1,$sequelize_2);', bind: { sequelize_1: 'foo', - sequelize_2: moment('2011-03-27 10:01:55 +0000', 'YYYY-MM-DD HH:mm:ss Z').toDate(), + sequelize_2: dayjs('2011-03-27 10:01:55 +0000', 'YYYY-MM-DD HH:mm:ss Z').toDate(), }, }, }, { @@ -750,10 +750,10 @@ if (dialect.startsWith('postgres')) { }, context: { options: { quoteIdentifiers: false } }, }, { - arguments: ['myTable', { name: 'foo', birthday: moment('2011-03-27 10:01:55 +0000', 'YYYY-MM-DD HH:mm:ss Z').toDate() }], + arguments: ['myTable', { name: 'foo', birthday: dayjs('2011-03-27 10:01:55 +0000', 'YYYY-MM-DD HH:mm:ss Z').toDate() }], expectation: { query: 'INSERT INTO myTable (name,birthday) VALUES ($sequelize_1,$sequelize_2);', - bind: { sequelize_1: 'foo', sequelize_2: moment('2011-03-27 10:01:55 +0000', 'YYYY-MM-DD HH:mm:ss Z').toDate() }, + bind: { sequelize_1: 'foo', sequelize_2: dayjs('2011-03-27 10:01:55 +0000', 'YYYY-MM-DD HH:mm:ss Z').toDate() }, }, context: { options: { quoteIdentifiers: false } }, }, { @@ -842,7 +842,7 @@ if (dialect.startsWith('postgres')) { arguments: ['myTable', [{ name: 'foo\';DROP TABLE myTable;' }, { name: 'bar' }]], expectation: 'INSERT INTO "myTable" ("name") VALUES (\'foo\'\';DROP TABLE myTable;\'),(\'bar\');', }, { - arguments: ['myTable', [{ name: 'foo', birthday: moment('2011-03-27 10:01:55 +0000', 'YYYY-MM-DD HH:mm:ss Z').toDate() }, { name: 'bar', birthday: moment('2012-03-27 10:01:55 +0000', 'YYYY-MM-DD HH:mm:ss Z').toDate() }]], + arguments: ['myTable', [{ name: 'foo', birthday: dayjs('2011-03-27 10:01:55 +0000', 'YYYY-MM-DD HH:mm:ss Z').toDate() }, { name: 'bar', birthday: dayjs('2012-03-27 10:01:55 +0000', 'YYYY-MM-DD HH:mm:ss Z').toDate() }]], expectation: 'INSERT INTO "myTable" ("name","birthday") VALUES (\'foo\',\'2011-03-27 10:01:55.000 +00:00\'),(\'bar\',\'2012-03-27 10:01:55.000 +00:00\');', }, { arguments: ['myTable', [{ name: 'foo', foo: 1 }, { name: 'bar', foo: 2 }]], @@ -886,7 +886,7 @@ if (dialect.startsWith('postgres')) { expectation: 'INSERT INTO myTable (name) VALUES (\'foo\'\';DROP TABLE myTable;\'),(\'bar\');', context: { options: { quoteIdentifiers: false } }, }, { - arguments: ['myTable', [{ name: 'foo', birthday: moment('2011-03-27 10:01:55 +0000', 'YYYY-MM-DD HH:mm:ss Z').toDate() }, { name: 'bar', birthday: moment('2012-03-27 10:01:55 +0000', 'YYYY-MM-DD HH:mm:ss Z').toDate() }]], + arguments: ['myTable', [{ name: 'foo', birthday: dayjs('2011-03-27 10:01:55 +0000', 'YYYY-MM-DD HH:mm:ss Z').toDate() }, { name: 'bar', birthday: dayjs('2012-03-27 10:01:55 +0000', 'YYYY-MM-DD HH:mm:ss Z').toDate() }]], expectation: 'INSERT INTO myTable (name,birthday) VALUES (\'foo\',\'2011-03-27 10:01:55.000 +00:00\'),(\'bar\',\'2012-03-27 10:01:55.000 +00:00\');', context: { options: { quoteIdentifiers: false } }, }, { @@ -926,16 +926,16 @@ if (dialect.startsWith('postgres')) { updateQuery: [ { - arguments: ['myTable', { name: 'foo', birthday: moment('2011-03-27 10:01:55 +0000', 'YYYY-MM-DD HH:mm:ss Z').toDate() }, { id: 2 }], + arguments: ['myTable', { name: 'foo', birthday: dayjs('2011-03-27 10:01:55 +0000', 'YYYY-MM-DD HH:mm:ss Z').toDate() }, { id: 2 }], expectation: { query: 'UPDATE "myTable" SET "name"=$sequelize_1,"birthday"=$sequelize_2 WHERE "id" = $sequelize_3', - bind: { sequelize_1: 'foo', sequelize_2: moment('2011-03-27 10:01:55 +0000', 'YYYY-MM-DD HH:mm:ss Z').toDate(), sequelize_3: 2 }, + bind: { sequelize_1: 'foo', sequelize_2: dayjs('2011-03-27 10:01:55 +0000', 'YYYY-MM-DD HH:mm:ss Z').toDate(), sequelize_3: 2 }, }, }, { - arguments: ['myTable', { name: 'foo', birthday: moment('2011-03-27 10:01:55 +0000', 'YYYY-MM-DD HH:mm:ss Z').toDate() }, { id: 2 }], + arguments: ['myTable', { name: 'foo', birthday: dayjs('2011-03-27 10:01:55 +0000', 'YYYY-MM-DD HH:mm:ss Z').toDate() }, { id: 2 }], expectation: { query: 'UPDATE "myTable" SET "name"=$sequelize_1,"birthday"=$sequelize_2 WHERE "id" = $sequelize_3', - bind: { sequelize_1: 'foo', sequelize_2: moment('2011-03-27 10:01:55 +0000', 'YYYY-MM-DD HH:mm:ss Z').toDate(), sequelize_3: 2 }, + bind: { sequelize_1: 'foo', sequelize_2: dayjs('2011-03-27 10:01:55 +0000', 'YYYY-MM-DD HH:mm:ss Z').toDate(), sequelize_3: 2 }, }, }, { arguments: ['myTable', { bar: 2 }, { name: 'foo' }], @@ -989,10 +989,10 @@ if (dialect.startsWith('postgres')) { }, context: { options: { omitNull: true } }, }, { - arguments: [{ tableName: 'myTable', schema: 'mySchema' }, { name: 'foo', birthday: moment('2011-03-27 10:01:55 +0000', 'YYYY-MM-DD HH:mm:ss Z').toDate() }, { id: 2 }], + arguments: [{ tableName: 'myTable', schema: 'mySchema' }, { name: 'foo', birthday: dayjs('2011-03-27 10:01:55 +0000', 'YYYY-MM-DD HH:mm:ss Z').toDate() }, { id: 2 }], expectation: { query: 'UPDATE "mySchema"."myTable" SET "name"=$sequelize_1,"birthday"=$sequelize_2 WHERE "id" = $sequelize_3', - bind: { sequelize_1: 'foo', sequelize_2: moment('2011-03-27 10:01:55 +0000', 'YYYY-MM-DD HH:mm:ss Z').toDate(), sequelize_3: 2 }, + bind: { sequelize_1: 'foo', sequelize_2: dayjs('2011-03-27 10:01:55 +0000', 'YYYY-MM-DD HH:mm:ss Z').toDate(), sequelize_3: 2 }, }, }, { arguments: [{ tableName: 'myTable', schema: 'mySchema' }, { name: 'foo\';DROP TABLE mySchema.myTable;' }, { name: 'foo' }], @@ -1026,17 +1026,17 @@ if (dialect.startsWith('postgres')) { // Variants when quoteIdentifiers is false { - arguments: ['myTable', { name: 'foo', birthday: moment('2011-03-27 10:01:55 +0000', 'YYYY-MM-DD HH:mm:ss Z').toDate() }, { id: 2 }], + arguments: ['myTable', { name: 'foo', birthday: dayjs('2011-03-27 10:01:55 +0000', 'YYYY-MM-DD HH:mm:ss Z').toDate() }, { id: 2 }], expectation: { query: 'UPDATE myTable SET name=$sequelize_1,birthday=$sequelize_2 WHERE id = $sequelize_3', - bind: { sequelize_1: 'foo', sequelize_2: moment('2011-03-27 10:01:55 +0000', 'YYYY-MM-DD HH:mm:ss Z').toDate(), sequelize_3: 2 }, + bind: { sequelize_1: 'foo', sequelize_2: dayjs('2011-03-27 10:01:55 +0000', 'YYYY-MM-DD HH:mm:ss Z').toDate(), sequelize_3: 2 }, }, context: { options: { quoteIdentifiers: false } }, }, { - arguments: ['myTable', { name: 'foo', birthday: moment('2011-03-27 10:01:55 +0000', 'YYYY-MM-DD HH:mm:ss Z').toDate() }, { id: 2 }], + arguments: ['myTable', { name: 'foo', birthday: dayjs('2011-03-27 10:01:55 +0000', 'YYYY-MM-DD HH:mm:ss Z').toDate() }, { id: 2 }], expectation: { query: 'UPDATE myTable SET name=$sequelize_1,birthday=$sequelize_2 WHERE id = $sequelize_3', - bind: { sequelize_1: 'foo', sequelize_2: moment('2011-03-27 10:01:55 +0000', 'YYYY-MM-DD HH:mm:ss Z').toDate(), sequelize_3: 2 }, + bind: { sequelize_1: 'foo', sequelize_2: dayjs('2011-03-27 10:01:55 +0000', 'YYYY-MM-DD HH:mm:ss Z').toDate(), sequelize_3: 2 }, }, context: { options: { quoteIdentifiers: false } }, }, { @@ -1089,10 +1089,10 @@ if (dialect.startsWith('postgres')) { }, context: { options: { omitNull: true, quoteIdentifiers: false } }, }, { - arguments: [{ schema: 'mySchema', tableName: 'myTable' }, { name: 'foo', birthday: moment('2011-03-27 10:01:55 +0000', 'YYYY-MM-DD HH:mm:ss Z').toDate() }, { id: 2 }], + arguments: [{ schema: 'mySchema', tableName: 'myTable' }, { name: 'foo', birthday: dayjs('2011-03-27 10:01:55 +0000', 'YYYY-MM-DD HH:mm:ss Z').toDate() }, { id: 2 }], expectation: { query: 'UPDATE mySchema.myTable SET name=$sequelize_1,birthday=$sequelize_2 WHERE id = $sequelize_3', - bind: { sequelize_1: 'foo', sequelize_2: moment('2011-03-27 10:01:55 +0000', 'YYYY-MM-DD HH:mm:ss Z').toDate(), sequelize_3: 2 }, + bind: { sequelize_1: 'foo', sequelize_2: dayjs('2011-03-27 10:01:55 +0000', 'YYYY-MM-DD HH:mm:ss Z').toDate(), sequelize_3: 2 }, }, context: { options: { quoteIdentifiers: false } }, }, { diff --git a/test/unit/dialects/sqlite/query-generator.test.js b/test/unit/dialects/sqlite/query-generator.test.js index fba195221ce8..73b801b2fb8d 100644 --- a/test/unit/dialects/sqlite/query-generator.test.js +++ b/test/unit/dialects/sqlite/query-generator.test.js @@ -8,7 +8,7 @@ const { DataTypes, Op } = require('@sequelize/core'); const dialect = Support.getTestDialect(); const _ = require('lodash'); -const moment = require('moment'); +const dayjs = require('dayjs'); const { SqliteQueryGenerator: QueryGenerator } = require('@sequelize/core/_non-semver-use-at-your-own-risk_/dialects/sqlite/query-generator.js'); if (dialect === 'sqlite') { @@ -411,10 +411,10 @@ if (dialect === 'sqlite') { bind: { sequelize_1: 'bar', sequelize_2: undefined }, }, }, { - arguments: ['myTable', { name: 'foo', birthday: moment('2011-03-27 10:01:55 +0000', 'YYYY-MM-DD HH:mm:ss Z').toDate() }], + arguments: ['myTable', { name: 'foo', birthday: dayjs('2011-03-27 10:01:55 +0000', 'YYYY-MM-DD HH:mm:ss Z').toDate() }], expectation: { query: 'INSERT INTO `myTable` (`name`,`birthday`) VALUES ($sequelize_1,$sequelize_2);', - bind: { sequelize_1: 'foo', sequelize_2: moment('2011-03-27 10:01:55 +0000', 'YYYY-MM-DD HH:mm:ss Z').toDate() }, + bind: { sequelize_1: 'foo', sequelize_2: dayjs('2011-03-27 10:01:55 +0000', 'YYYY-MM-DD HH:mm:ss Z').toDate() }, }, }, { arguments: ['myTable', { name: 'foo', value: true }], @@ -477,7 +477,7 @@ if (dialect === 'sqlite') { arguments: ['myTable', [{ name: '\'bar\'' }, { name: 'foo' }]], expectation: 'INSERT INTO `myTable` (`name`) VALUES (\'\'\'bar\'\'\'),(\'foo\');', }, { - arguments: ['myTable', [{ name: 'foo', birthday: moment('2011-03-27 10:01:55 +0000', 'YYYY-MM-DD HH:mm:ss Z').toDate() }, { name: 'bar', birthday: moment('2012-03-27 10:01:55 +0000', 'YYYY-MM-DD HH:mm:ss Z').toDate() }]], + arguments: ['myTable', [{ name: 'foo', birthday: dayjs('2011-03-27 10:01:55 +0000', 'YYYY-MM-DD HH:mm:ss Z').toDate() }, { name: 'bar', birthday: dayjs('2012-03-27 10:01:55 +0000', 'YYYY-MM-DD HH:mm:ss Z').toDate() }]], expectation: 'INSERT INTO `myTable` (`name`,`birthday`) VALUES (\'foo\',\'2011-03-27 10:01:55.000 +00:00\'),(\'bar\',\'2012-03-27 10:01:55.000 +00:00\');', }, { arguments: ['myTable', [{ name: 'bar', value: null }, { name: 'foo', value: 1 }]], @@ -517,16 +517,16 @@ if (dialect === 'sqlite') { updateQuery: [ { - arguments: ['myTable', { name: 'foo', birthday: moment('2011-03-27 10:01:55 +0000', 'YYYY-MM-DD HH:mm:ss Z').toDate() }, { id: 2 }], + arguments: ['myTable', { name: 'foo', birthday: dayjs('2011-03-27 10:01:55 +0000', 'YYYY-MM-DD HH:mm:ss Z').toDate() }, { id: 2 }], expectation: { query: 'UPDATE `myTable` SET `name`=$sequelize_1,`birthday`=$sequelize_2 WHERE `id` = $sequelize_3', - bind: { sequelize_1: 'foo', sequelize_2: moment('2011-03-27 10:01:55 +0000', 'YYYY-MM-DD HH:mm:ss Z').toDate(), sequelize_3: 2 }, + bind: { sequelize_1: 'foo', sequelize_2: dayjs('2011-03-27 10:01:55 +0000', 'YYYY-MM-DD HH:mm:ss Z').toDate(), sequelize_3: 2 }, }, }, { - arguments: ['myTable', { name: 'foo', birthday: moment('2011-03-27 10:01:55 +0000', 'YYYY-MM-DD HH:mm:ss Z').toDate() }, { id: 2 }], + arguments: ['myTable', { name: 'foo', birthday: dayjs('2011-03-27 10:01:55 +0000', 'YYYY-MM-DD HH:mm:ss Z').toDate() }, { id: 2 }], expectation: { query: 'UPDATE `myTable` SET `name`=$sequelize_1,`birthday`=$sequelize_2 WHERE `id` = $sequelize_3', - bind: { sequelize_1: 'foo', sequelize_2: moment('2011-03-27 10:01:55 +0000', 'YYYY-MM-DD HH:mm:ss Z').toDate(), sequelize_3: 2 }, + bind: { sequelize_1: 'foo', sequelize_2: dayjs('2011-03-27 10:01:55 +0000', 'YYYY-MM-DD HH:mm:ss Z').toDate(), sequelize_3: 2 }, }, }, { arguments: ['myTable', { name: 'foo' }, { id: 2 }], diff --git a/test/unit/instance/is-soft-deleted.test.js b/test/unit/instance/is-soft-deleted.test.js index 2ac60b3ee0e1..786817fcb107 100644 --- a/test/unit/instance/is-soft-deleted.test.js +++ b/test/unit/instance/is-soft-deleted.test.js @@ -8,7 +8,7 @@ const Support = require('../support'); const current = Support.sequelize; const { DataTypes } = require('@sequelize/core'); -const moment = require('moment'); +const dayjs = require('dayjs'); describe(Support.getTestDialectTeaser('Instance'), () => { describe('isSoftDeleted', () => { @@ -66,7 +66,7 @@ describe(Support.getTestDialectTeaser('Instance'), () => { }); it('should return true if the soft-delete property is set', function () { - this.paranoidUser.setDataValue('deletedAt', moment().subtract(5, 'days').format()); + this.paranoidUser.setDataValue('deletedAt', dayjs().subtract(5, 'days').format()); expect(this.paranoidUser.isSoftDeleted()).to.be.true; }); }); diff --git a/yarn.lock b/yarn.lock index 06d60bf3e432..f07fc388923e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2647,6 +2647,11 @@ dateformat@^3.0.0: resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-3.0.3.tgz#a6e37499a4d9a9cf85ef5872044d62901c9889ae" integrity sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q== +dayjs@^1.11.1: + version "1.11.1" + resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.11.1.tgz#90b33a3dda3417258d48ad2771b415def6545eb0" + integrity sha512-ER7EjqVAMkRRsxNCC5YqJ9d9VQYuWdGt7aiH2qA5R5wt8ZmWaP2dLUSIK6y/kVzLMlmh1Tvu5xUf4M/wdGJ5KA== + debug@4, debug@4.3.4, debug@^4.0.0, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.3.2, debug@^4.3.3, debug@^4.3.4: version "4.3.4" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" @@ -5882,7 +5887,7 @@ moment-timezone@^0.5.15, moment-timezone@^0.5.34: dependencies: moment ">= 2.9.0" -"moment@>= 2.9.0", moment@^2.29.1, moment@^2.29.3: +"moment@>= 2.9.0", moment@^2.29.3: version "2.29.3" resolved "https://registry.yarnpkg.com/moment/-/moment-2.29.3.tgz#edd47411c322413999f7a5940d526de183c031f3" integrity sha512-c6YRvhEo//6T2Jz/vVtYzqBzwvPT95JBQ+smCytzf7c50oMZRsR/a4w88aD34I+/QVSfnoAnSBFPJHItlOMJVw==