Skip to content

Commit

Permalink
Merge pull request #4396 from bmac/deprecate-date-parse
Browse files Browse the repository at this point in the history
Deprecate date parse
  • Loading branch information
bmac committed May 25, 2016
2 parents 6a44cc3 + 17b1f1c commit 77dc781
Show file tree
Hide file tree
Showing 4 changed files with 61 additions and 26 deletions.
51 changes: 32 additions & 19 deletions addon/-private/ext/date.js
Expand Up @@ -3,37 +3,22 @@
*/

import Ember from 'ember';
import { deprecate } from 'ember-data/-private/debug';

/**
Date.parse with progressive enhancement for ISO 8601 <https://github.com/csnover/js-iso8601>
© 2011 Colin Snover <http://zetafleet.com>
Released under MIT license.
@class Date
@namespace Ember
@static
*/
Ember.Date = Ember.Date || {};

var origParse = Date.parse;
var numericKeys = [1, 4, 5, 6, 7, 10, 11];

/**
@method parse
@param {Date} date
@return {Number} timestamp
*/
Ember.Date.parse = function (date) {
export const parseDate = function (date) {
var timestamp, struct;
var minutesOffset = 0;

// ES5 §15.9.4.2 states that the string should attempt to be parsed as a Date Time String Format string
// before falling back to any implementation-specific date parsing, so that’s what we do, even if native
// implementations could be faster
// 1 YYYY 2 MM 3 DD 4 HH 5 mm 6 ss 7 msec 8 Z 9 ± 10 tzHH 11 tzmm
if ((struct = /^(\d{4}|[+\-]\d{6})(?:-(\d{2})(?:-(\d{2}))?)?(?:T(\d{2}):(\d{2})(?::(\d{2})(?:\.(\d{3}))?)?(?:(Z)|([+\-])(\d{2})(?::(\d{2}))?)?)?$/.exec(date))) {
if ((struct = /^(\d{4}|[+\-]\d{6})(?:-(\d{2})(?:-(\d{2}))?)?(?:T(\d{2}):(\d{2})(?::(\d{2})(?:\.(\d{3}))?)?(?:(Z)|([+\-])(\d{2})(?:(\d{2}))?)?)?$/.exec(date))) {
// avoid NaN timestamps caused by “undefined” values being passed to Date.UTC
for (var i = 0, k; (k = numericKeys[i]); ++i) {
struct[k] = +struct[k] || 0;
Expand All @@ -59,6 +44,34 @@ Ember.Date.parse = function (date) {
return timestamp;
};

Ember.Date.parse = function (date) {
// throw deprecation
deprecate(`Ember.Date.parse is deprecated because Safari 5-, IE8-, and
Firefox 3.6- are no longer supported (see
https://github.com/csnover/js-iso8601 for the history of this issue).
Please use Date.parse instead`, false, {
id: 'ds.ember.date.parse-deprecate',
until: '3.0.0'
});

return parseDate(date);
};

if (Ember.EXTEND_PROTOTYPES === true || Ember.EXTEND_PROTOTYPES.Date) {
Date.parse = Ember.Date.parse;
deprecate(`Overriding Date.parse with Ember.Date.parse is deprecated. Please set ENV.EmberENV.EXTEND_PROTOTYPES.Date to false in config/environment.js
// config/environment.js
ENV = {
EmberENV: {
EXTEND_PROTOTYPES: {
Date: false,
}
}
}
`, false, {
id: 'ds.date.parse-deprecate',
until: '3.0.0'
});
Date.parse = parseDate;
}
5 changes: 2 additions & 3 deletions addon/-private/transforms/date.js
@@ -1,5 +1,4 @@
import Ember from 'ember';
import "ember-data/-private/ext/date";
import { parseDate } from "ember-data/-private/ext/date";

/**
The `DS.DateTransform` class is used to serialize and deserialize
Expand Down Expand Up @@ -28,7 +27,7 @@ export default Transform.extend({
var type = typeof serialized;

if (type === "string") {
return new Date(Ember.Date.parse(serialized));
return new Date(parseDate(serialized));
} else if (type === "number") {
return new Date(serialized);
} else if (serialized === null || serialized === undefined) {
Expand Down
3 changes: 2 additions & 1 deletion tests/unit/model-test.js
Expand Up @@ -5,6 +5,7 @@ import testInDebug from 'dummy/tests/helpers/test-in-debug';
import QUnit, {module, test} from 'qunit';
import DS from 'ember-data';
import isEnabled from 'ember-data/-private/features';
import { parseDate } from "ember-data/-private/ext/date";

const AssertionPrototype = QUnit.assert;

Expand Down Expand Up @@ -975,7 +976,7 @@ test("a DS.Model can describe Date attributes", function(assert) {
assert.converts('date', undefined, undefined);

var dateString = "2011-12-31T00:08:16.000Z";
var date = new Date(Ember.Date.parse(dateString));
var date = new Date(parseDate(dateString));


var Person = DS.Model.extend({
Expand Down
28 changes: 25 additions & 3 deletions tests/unit/transform/date-test.js
@@ -1,14 +1,17 @@
import Ember from 'ember';

import {module, test} from 'qunit';

import DS from 'ember-data';
import Ember from 'ember';

import testInDebug from 'dummy/tests/helpers/test-in-debug';
import { parseDate } from "ember-data/-private/ext/date";

module("unit/transform - DS.DateTransform");

var dateString = "2015-01-01T00:00:00.000Z";
var dateInMillis = Ember.Date.parse(dateString);
var dateInMillis = parseDate(dateString);
var date = new Date(dateInMillis);
var run = Ember.run;

test("#serialize", function(assert) {
var transform = new DS.DateTransform();
Expand All @@ -35,3 +38,22 @@ test("#deserialize", function(assert) {
assert.equal(transform.deserialize(null), null);
assert.equal(transform.deserialize(undefined), null);
});

test("#deserialize with different offset formats", function(assert) {
var transform = new DS.DateTransform();
var dateString = '2003-05-24T23:00:00.000+0000';
var dateStringColon = '2013-03-15T23:22:00.000+00:00';
var dateStringShortOffset = '2016-12-02T17:30:00.000+00';

assert.equal(transform.deserialize(dateString).getTime(), 1053817200000);
assert.equal(transform.deserialize(dateStringShortOffset).getTime(), 1480699800000);
assert.equal(transform.deserialize(dateStringColon).getTime(), 1363389720000);
});

testInDebug('Ember.Date.parse has been deprecated', function(assert) {
run(function() {
assert.expectDeprecation(function() {
Ember.Date.parse(dateString);
}, /Ember.Date.parse is deprecated/);
});
});

0 comments on commit 77dc781

Please sign in to comment.