diff --git a/app/components/doi-date.js b/app/components/doi-date.js new file mode 100644 index 000000000..5c648a0e7 --- /dev/null +++ b/app/components/doi-date.js @@ -0,0 +1,38 @@ +import Component from '@ember/component'; + +const dateTypesCompleteList = [ + 'Accepted', + 'Available', + 'Copyrighted', + 'Collected', + 'Created', + 'Issued', + 'Submitted', + 'Updated', + 'Valid', + 'Withdrawn', + 'Other', +]; + + +export default Component.extend({ + dateTypesCompleteList, + dateTypesList: dateTypesCompleteList, + dateTypes: [], + + actions: { + updateDate(value) { + this.fragment.set('date', value); + }, + selectDateType(value) { + this.fragment.set('dateType', value); + this.set('dateType', this.dateTypesCompleteList); + }, + updateDateInformation(value) { + this.fragment.set('dateInformation', value); + }, + deleteDate() { + this.model.get('dates').removeObject(this.fragment); + }, + }, +}); diff --git a/app/components/doi-dates.js b/app/components/doi-dates.js new file mode 100644 index 000000000..b319d7a7d --- /dev/null +++ b/app/components/doi-dates.js @@ -0,0 +1,23 @@ +import Component from '@ember/component'; + +export default Component.extend({ + validationClass: null, + + didReceiveAttrs() { + this._super(...arguments); + + if (!this.model.get('dates')) { + this.model.set('dates', []); + } + if (this.model.get('dates').length == 0) { + this.model.get('dates').createFragment(); + } + }, + actions: { + addDate() { + console.log(this.model.get('dates')); + console.log(this.model); + this.model.get('dates').createFragment(); + }, + }, +}); diff --git a/app/controllers/dois/show/modify.js b/app/controllers/dois/show/modify.js index ed819ecc4..d055f22a4 100644 --- a/app/controllers/dois/show/modify.js +++ b/app/controllers/dois/show/modify.js @@ -43,6 +43,7 @@ export default Controller.extend({ doi.set('relatedIdentifiers', null); doi.set('fundingReferences', null); doi.set('geoLocations', null); + doi.set('dates', null); // Don't try and set the landingPage information for DOI Updates doi.set('landingPage', null); diff --git a/app/controllers/repositories/show/dois/upload.js b/app/controllers/repositories/show/dois/upload.js index 2d6c9edef..68df3acaf 100644 --- a/app/controllers/repositories/show/dois/upload.js +++ b/app/controllers/repositories/show/dois/upload.js @@ -35,6 +35,7 @@ export default Controller.extend({ doi.set('relatedIdentifiers', null); doi.set('fundingReferences', null); doi.set('geoLocations', null); + doi.set('dates', null); let self = this; doi.save().then(function(doi) { diff --git a/app/helpers/doi-form-errors.js b/app/helpers/doi-form-errors.js index 2735e8760..091a44387 100644 --- a/app/helpers/doi-form-errors.js +++ b/app/helpers/doi-form-errors.js @@ -39,17 +39,24 @@ export function doiFormErrors([ model ]) { } if (model.relatedIdentifiers) { model.relatedIdentifiers.forEach((relatedIdentifier) => { - errorAttributes = errorAttributes.concat(relatedIdentifier.validations.errors.mapBy('attribute')); + errorAttributes = errorAttributes.concat(relatedIdentifier.validations.errors.mapBy('message')); }); } if (model.fundingReferences) { model.fundingReferences.forEach((fundingReference) => { - errorAttributes = errorAttributes.concat(fundingReference.validations.errors.mapBy('attribute')); + errorAttributes = errorAttributes.concat(fundingReference.validations.errors.mapBy('message')); + }); + } + if (model.dates) { + model.dates.forEach((date) => { + errorAttributes = errorAttributes.concat(date.validations.errors.mapBy('message')); }); } } return errorAttributes.map(function(attribute) { + console.log(attribute); + return labelList[attribute] || attribute; }).join(', '); } diff --git a/app/models/date.js b/app/models/date.js new file mode 100644 index 000000000..830f085d2 --- /dev/null +++ b/app/models/date.js @@ -0,0 +1,35 @@ + + +import DS from 'ember-data'; +import MF from 'ember-data-model-fragments'; +import { validator, buildValidations } from 'ember-cp-validations'; +import { computed } from '@ember/object'; + +const Validations = buildValidations({ + dateType: [ + validator('presence', { + presence: true, + message: 'Date type must be included when adding a Date', + isWarning: computed('model.state', function() { + return this.model.get('state') === 'draft'; + }), + disabled: computed('model.date', function() { + return this.model.get('date') == null; + }), + }), + ], + date: [ + validator('date-format', { + allowBlank: true, + isWarning: computed('model.state', function() { + return this.model.get('state') === 'draft'; + }), + }), + ], +}); + +export default MF.Fragment.extend(Validations, { + date: DS.attr('string'), + dateType: DS.attr('string'), + dateInformation: DS.attr('string'), +}); diff --git a/app/models/doi.js b/app/models/doi.js index 205c69473..554f46a1e 100644 --- a/app/models/doi.js +++ b/app/models/doi.js @@ -149,7 +149,7 @@ export default DS.Model.extend(Validations, { subjects: fragmentArray('subject', { defaultValue: [] }), contributors: fragmentArray('contributor', { defaultValue: [] }), identifiers: fragmentArray('identifier', { defaultValue: [] }), - dates: DS.attr(), + dates: fragmentArray('date', { defaultValue: [] }), language: DS.attr('string'), types: DS.attr(), relatedIdentifiers: fragmentArray('relatedIdentifier', { defaultValue: [] }), diff --git a/app/models/funding-reference.js b/app/models/funding-reference.js index e6bec5cb5..3d768200e 100644 --- a/app/models/funding-reference.js +++ b/app/models/funding-reference.js @@ -7,6 +7,7 @@ const Validations = buildValidations({ funderName: [ validator('presence', { presence: true, + message: 'Funder NAme must be included if you input a funderIdentifier.', isWarning: computed('model.state', function() { return this.model.get('state') === 'draft'; }), diff --git a/app/models/related-identifier.js b/app/models/related-identifier.js index 9225aed2d..b768a5911 100644 --- a/app/models/related-identifier.js +++ b/app/models/related-identifier.js @@ -7,7 +7,7 @@ const Validations = buildValidations({ schemeUri: [ validator('url-format', { allowBlank: true, - message: 'Please enter a valid URL.', + message: 'Please enter a valid URL for the schemeUri.', disabled: computed('model.relatedIdentifierType', function() { return [ 'HasMetadata', 'IsMetadataFor' ].includes(this.model.get('relatedIdentifierType')); }), @@ -27,7 +27,6 @@ const Validations = buildValidations({ validator('identifier-format', { allowBlank: true, dependentKeys: [ 'model.relatedIdentifierType' ], - message: 'Please enter a valid Related Identifier.', isWarning: computed('model.state', function() { return this.model.get('state') === 'draft'; }), @@ -39,6 +38,7 @@ const Validations = buildValidations({ relatedIdentifierType: [ validator('presence', { presence: true, + message: 'Please enter a Related Identifier Type for the Related Identifier.', isWarning: computed('model.state', function() { return this.model.get('state') === 'draft'; }), @@ -50,6 +50,7 @@ const Validations = buildValidations({ relationType: [ validator('presence', { presence: true, + message: 'Please enter a Relation Type for the Related Identifier.', isWarning: computed('model.state', function() { return this.model.get('state') === 'draft'; }), @@ -61,6 +62,7 @@ const Validations = buildValidations({ resourceTypeGeneral: [ validator('presence', { presence: true, + message: 'Please enter a Resource Type for the Related Identifier Metadata.', isWarning: computed('model.state', function() { return this.model.get('state') === 'draft'; }), diff --git a/app/serializers/doi.js b/app/serializers/doi.js index cace24bad..fe68495a5 100644 --- a/app/serializers/doi.js +++ b/app/serializers/doi.js @@ -26,7 +26,7 @@ export default ApplicationSerializer.extend({ contentUrl: { serialize: false }, // subjects: { serialize: false }, // contributors: { serialize: false }, - dates: { serialize: false }, + // dates: { serialize: false }, // language: { serialize: false }, // relatedIdentifiers: { serialize: false }, // sizes: { serialize: false }, diff --git a/app/templates/components/doi-alternate-identifier.hbs b/app/templates/components/doi-alternate-identifier.hbs index a367a7472..245eda01a 100644 --- a/app/templates/components/doi-alternate-identifier.hbs +++ b/app/templates/components/doi-alternate-identifier.hbs @@ -7,7 +7,7 @@
An identifier or identifiers other than the primary Identifier applied to the resource being registered.
{{else}} - +
An identifier or identifiers other than the primary Identifier applied to the resource being registered.
{{/if}} diff --git a/app/templates/components/doi-date.hbs b/app/templates/components/doi-date.hbs new file mode 100644 index 000000000..f0d31feba --- /dev/null +++ b/app/templates/components/doi-date.hbs @@ -0,0 +1,50 @@ + +{{#if (gt index 0)}} +
+ +
+{{/if}} + +
+ {{#form.element + controlType="power-select" + helpText="Type of date. " + value=fragment.dateType + options=dateTypesList + destination=fragment.dateType + disabled=disabled as |el|}} + {{el.control onChange=(action "selectDateType") placeholder="Select Date Type" allowClear=false}} + {{/form.element}} +
+ +
+ +
+ +{{#if (gt index 0)}} +
+ + + {{fa-icon "trash" pull="left" style="margin:0;"}} + + +
+{{else}} + +
Different dates relevant to the work.
+{{/if}} + + +
+ +
+ + +
Specific information about the date, if appropriate.
+ + +
\ No newline at end of file diff --git a/app/templates/components/doi-dates.hbs b/app/templates/components/doi-dates.hbs new file mode 100644 index 000000000..248c0d1be --- /dev/null +++ b/app/templates/components/doi-dates.hbs @@ -0,0 +1,12 @@ +
+ +
+ {{#each model.dates as |date index|}} + + {{/each}} + + {{#if (or (not model.dates) (lte model.dates.length 4))}} + {{fa-icon "plus"}} Add {{if (gt model.dates.length 0) "another "}}date + {{/if}} +
+
diff --git a/app/templates/components/doi-format.hbs b/app/templates/components/doi-format.hbs index 6272d72f3..270acc962 100644 --- a/app/templates/components/doi-format.hbs +++ b/app/templates/components/doi-format.hbs @@ -2,13 +2,13 @@ {{#if (gt index 0)}}
- + {{fa-icon "trash" pull="left" style="margin:0;"}}
{{else}} - + {{/if}}
Technical format of the resource.

\ No newline at end of file diff --git a/app/templates/components/doi-funding-reference.hbs b/app/templates/components/doi-funding-reference.hbs index b565429d1..ae358addc 100644 --- a/app/templates/components/doi-funding-reference.hbs +++ b/app/templates/components/doi-funding-reference.hbs @@ -36,7 +36,7 @@
- @@ -52,7 +52,7 @@
- @@ -88,7 +88,7 @@
-
@@ -99,7 +99,7 @@
-
@@ -110,7 +110,7 @@
-
diff --git a/app/templates/components/doi-geo-location.hbs b/app/templates/components/doi-geo-location.hbs index b482146e9..d39bc890e 100644 --- a/app/templates/components/doi-geo-location.hbs +++ b/app/templates/components/doi-geo-location.hbs @@ -1,14 +1,14 @@ {{#if (gt index 0)}}
- {{fa-icon "trash" pull="left" style="margin:0;"}}
{{else}} - {{/if}}
Description of a geographic location.
diff --git a/app/templates/components/doi-related-identifier.hbs b/app/templates/components/doi-related-identifier.hbs index d4a45f1ab..b22568471 100644 --- a/app/templates/components/doi-related-identifier.hbs +++ b/app/templates/components/doi-related-identifier.hbs @@ -5,13 +5,13 @@
+ class="form-control related-identifier-field no-error {{if (not fragment.relatedIdentifier) 'no-success'}}" placeholder="Related Identifier" value={{fragment.relatedIdentifier}} oninput={{action "updateRelatedIdentifier" value="target.value"}} data-test-related-identifier /> {{fa-icon "trash"}}
{{else}} - + {{/if}} @@ -68,7 +68,7 @@
-
-
Related Metadata Scheme Type
-
Size (optional) {{#if (gt index 0)}}
- + {{fa-icon "trash" pull="left" style="margin:0;"}}
{{else}} - + {{/if}}
Size (e.g. bytes, pages, inches, etc.) or duration (extent), e.g. hours, minutes, days, etc., of a resource.

\ No newline at end of file diff --git a/app/templates/components/doi-subject.hbs b/app/templates/components/doi-subject.hbs index a116fe917..35c550643 100644 --- a/app/templates/components/doi-subject.hbs +++ b/app/templates/components/doi-subject.hbs @@ -28,7 +28,7 @@
-
The name of the subject scheme or classification code or authority if one is used.
@@ -36,7 +36,7 @@
- {{fa-icon "trash"}} diff --git a/app/templates/dois/show/edit.hbs b/app/templates/dois/show/edit.hbs index b608ff35f..bd424bb29 100644 --- a/app/templates/dois/show/edit.hbs +++ b/app/templates/dois/show/edit.hbs @@ -30,17 +30,25 @@ {{#if (feature-flag 'optionalFields')}} - - - +

Recommended Fields

- - - + + + +

Optional Fields

+ + + + + + + + + {{/if}} diff --git a/app/templates/repositories/show/dois/new.hbs b/app/templates/repositories/show/dois/new.hbs index 6954fb2b2..ee5e316f6 100644 --- a/app/templates/repositories/show/dois/new.hbs +++ b/app/templates/repositories/show/dois/new.hbs @@ -22,17 +22,26 @@ {{#if (feature-flag 'optionalFields')}} - - - +

Recommended Fields

- - - + + + + +

Optional Fields

+ + + + + + + + + {{/if}} diff --git a/app/validators/date-format.js b/app/validators/date-format.js new file mode 100644 index 000000000..db22269b4 --- /dev/null +++ b/app/validators/date-format.js @@ -0,0 +1,30 @@ +/* eslint-disable no-useless-escape */ +import BaseValidator from 'ember-cp-validations/validators/base'; +import edtf from 'edtf'; + +const DateFormat = BaseValidator.extend({ + + validate(value, options) { + switch (true) { + case (!value && options.allowBlank): + return true; + case value.startsWith('-'): + return /-\d{4}/.test(value) ? true : 'Please enter a valid date'; + default: + try { + let status = edtf.parse(value, { types: [ 'Date', 'Year', 'Decade', 'Century', 'Season', 'Interval' ] }); + if (typeof status !== 'undefined') { + return true; + } else { + let message = 'Please enter a valid date'; + return message; + } + } catch (error) { + let message = 'Please enter a valid date'; + return message; + } + } + }, +}); + +export default DateFormat; diff --git a/package.json b/package.json index 0c24d2a44..ea627d9f8 100644 --- a/package.json +++ b/package.json @@ -109,6 +109,7 @@ "d3-time-format": "^2.2.3", "devtron": "^1.4.0", "dynamic-link": "^0.2.5", + "edtf": "^2.7.1", "ember-auto-import": "^1.5.3", "ember-auto-import-typescript": "^0.1.0", "ember-bootstrap": "^3.1.0", diff --git a/tests/unit/validators/date-format-test.js b/tests/unit/validators/date-format-test.js new file mode 100644 index 000000000..e4bc388ab --- /dev/null +++ b/tests/unit/validators/date-format-test.js @@ -0,0 +1,103 @@ +import { module, test } from 'qunit'; +import { setupTest } from 'ember-qunit'; + +let options, builtOptions, validator, message; + +module('Unit | Validator | date-format', function(hooks) { + setupTest(hooks); + + hooks.beforeEach(function() { + validator = this.owner.lookup('validator:date-format'); + }); + + test('it works', function(assert) { + let validator = this.owner.lookup('validator:date-format'); + assert.ok(validator); + }); + + test('year', function(assert) { + assert.expect(2); + + builtOptions = validator.buildOptions({}).toObject(); + + message = validator.validate('20008', options); + assert.equal(message, 'Please enter a valid date'); + + message = validator.validate('2008', builtOptions); + assert.equal(message, true); + }); + + test('year-month', function(assert) { + assert.expect(2); + + builtOptions = validator.buildOptions({}).toObject(); + + message = validator.validate('2008-20', options); + assert.equal(message, 'Please enter a valid date'); + + message = validator.validate('2008-12', builtOptions); + assert.equal(message, true); + }); + + test('date', function(assert) { + assert.expect(2); + + builtOptions = validator.buildOptions({}).toObject(); + + message = validator.validate('2001-11-09d', options); + assert.equal(message, 'Please enter a valid date'); + + message = validator.validate('2001-11-09', builtOptions); + assert.equal(message, true); + }); + + test('timestamp', function(assert) { + assert.expect(2); + + builtOptions = validator.buildOptions({}).toObject(); + + message = validator.validate('2015-07-02T06:000:005.000Z', options); + assert.equal(message, 'Please enter a valid date'); + + message = validator.validate('2015-07-02T06:00:05.000Z', builtOptions); + assert.equal(message, true); + }); + + test('range', function(assert) { + assert.expect(2); + + builtOptions = validator.buildOptions({}).toObject(); + + message = validator.validate('2004-03-02~1999-06-02', options); + assert.equal(message, 'Please enter a valid date'); + + message = validator.validate('2004-03-02/2005-06-02', builtOptions); + assert.equal(message, true); + }); + + test('text', function(assert) { + assert.expect(2); + + builtOptions = validator.buildOptions({}).toObject(); + + message = validator.validate('Febrera', options); + assert.equal(message, 'Please enter a valid date'); + + message = validator.validate('2008 February', builtOptions); + assert.equal(message, 'Please enter a valid date'); + }); + + test('500 BC', function(assert) { + assert.expect(2); + + builtOptions = validator.buildOptions({}).toObject(); + + message = validator.validate('0500 BC', options); + assert.equal(message, 'Please enter a valid date'); + + message = validator.validate('-0500', builtOptions); + assert.equal(message, true); + }); +}); + + diff --git a/tests/unit/validators/identifier-format.js b/tests/unit/validators/identifier-format-test.js similarity index 80% rename from tests/unit/validators/identifier-format.js rename to tests/unit/validators/identifier-format-test.js index 712d507f3..311b4a29f 100644 --- a/tests/unit/validators/identifier-format.js +++ b/tests/unit/validators/identifier-format-test.js @@ -21,9 +21,9 @@ module('Unit | Validator | identifier-format', function(hooks) { builtOptions = validator.buildOptions({}).toObject(); message = validator.validate('offirgolan', options, {relatedIdentifierType: 'ARK'}); - assert.equal(message, 'Please enter a valid URL.'); + assert.equal(message, 'Please enter a valid ARK.'); - message = validator.validate('http://www.offirgolan.com', builtOptions, {relatedIdentifierType: 'ARK'}); + message = validator.validate('ark:/12148/btv1b8449691v/f29', builtOptions, {relatedIdentifierType: 'ARK'}); assert.equal(message, true); }); @@ -35,7 +35,7 @@ module('Unit | Validator | identifier-format', function(hooks) { message = validator.validate('.org/10.3205', options, {relatedIdentifierType: 'DOI'}); assert.equal(message, 'Please enter a valid DOI.'); - message = validator.validate('https://doi.org/10.3205/11dgii122 ', builtOptions, {relatedIdentifierType: 'DOI'}); + message = validator.validate('10.3205/11dgii122 ', builtOptions, {relatedIdentifierType: 'DOI'}); assert.equal(message, true); }); @@ -45,7 +45,7 @@ module('Unit | Validator | identifier-format', function(hooks) { builtOptions = validator.buildOptions({}).toObject(); message = validator.validate('arsXiv:0706.0001', options, {relatedIdentifierType: 'arXiv'}); - assert.equal(message, 'Please enter a valid URL.'); + assert.equal(message, 'Please enter a valid arXiv.'); message = validator.validate('arXiv:0706.0001', builtOptions, {relatedIdentifierType: 'arXiv'}); assert.equal(message, true); diff --git a/yarn.lock b/yarn.lock index ceba480cb..5c203a0f7 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5216,6 +5216,11 @@ commander@^2.15.1, commander@^2.20.0, commander@^2.6.0, commander@~2.20.0: resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.0.tgz#d58bb2b5c1ee8f87b0d340027e9e94e222c5a422" integrity sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ== +commander@^2.19.0: + version "2.20.3" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" + integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== + common-tags@^1.4.0, common-tags@^1.8.0: version "1.8.0" resolved "https://registry.yarnpkg.com/common-tags/-/common-tags-1.8.0.tgz#8e3153e542d4a39e9b10554434afaaf98956a937" @@ -5922,6 +5927,11 @@ dir-glob@^3.0.1: dependencies: path-type "^4.0.0" +discontinuous-range@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/discontinuous-range/-/discontinuous-range-1.0.0.tgz#e38331f0844bba49b9a9cb71c771585aab1bc65a" + integrity sha1-44Mx8IRLukm5qctxx3FYWqsbxlo= + doctrine@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" @@ -6015,6 +6025,11 @@ dotenv@^8.0.0: resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-8.2.0.tgz#97e619259ada750eea3e4ea3e26bceea5424b16a" integrity sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw== +drange@^1.0.2: + version "1.1.1" + resolved "https://registry.yarnpkg.com/drange/-/drange-1.1.1.tgz#b2aecec2aab82fcef11dbbd7b9e32b83f8f6c0b8" + integrity sha512-pYxfDYpued//QpnLIm4Avk7rsNtAtQkUES2cwAYSvD/wd2pKD71gN2Ebj3e7klzXwjocvE8c5vx/1fxwpqmSxA== + duplexer3@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2" @@ -6058,6 +6073,14 @@ editions@^1.1.1: resolved "https://registry.yarnpkg.com/editions/-/editions-1.3.4.tgz#3662cb592347c3168eb8e498a0ff73271d67f50b" integrity sha512-gzao+mxnYDzIysXKMQi/+M1mjy/rjestjg6OPoYTtI+3Izp23oiGZitsl9lPDPiTGXbcSIk1iJWhliSaglxnUg== +edtf@^2.7.1: + version "2.7.1" + resolved "https://registry.yarnpkg.com/edtf/-/edtf-2.7.1.tgz#82d2ebde5967fadb1d931a8748c8fe62b93db702" + integrity sha512-NXSoyMkvbyGZcKHvKkqN53gsrWpJPBXEOwoKU5HL7JlP4z5xViV7YbOqLoMiFyNNDD8fmJn5Jemuluk6qqg6SA== + dependencies: + nearley "^2.19.0" + randexp "^0.5.3" + ee-first@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" @@ -11055,6 +11078,11 @@ moment-timezone@^0.5.13: resolved "https://registry.yarnpkg.com/moment/-/moment-2.24.0.tgz#0d055d53f5052aa653c9f6eb68bb5d12bf5c2b5b" integrity sha512-bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg== +moo@^0.5.0: + version "0.5.1" + resolved "https://registry.yarnpkg.com/moo/-/moo-0.5.1.tgz#7aae7f384b9b09f620b6abf6f74ebbcd1b65dbc4" + integrity sha512-I1mnb5xn4fO80BH9BLcF0yLypy2UKl+Cb01Fu0hJRkJjlCRtxZMWkTdAtDd5ZqCOxtCkhmRwyI57vWT+1iZ67w== + morgan@^1.9.1: version "1.9.1" resolved "https://registry.yarnpkg.com/morgan/-/morgan-1.9.1.tgz#0a8d16734a1d9afbc824b99df87e738e58e2da59" @@ -11158,6 +11186,17 @@ natural-compare@^1.4.0: resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= +nearley@^2.19.0: + version "2.19.1" + resolved "https://registry.yarnpkg.com/nearley/-/nearley-2.19.1.tgz#4af4006e16645ff800e9f993c3af039857d9dbdc" + integrity sha512-xq47GIUGXxU9vQg7g/y1o1xuKnkO7ev4nRWqftmQrLkfnE/FjRqDaGOUakM8XHPn/6pW3bGjU2wgoJyId90rqg== + dependencies: + commander "^2.19.0" + moo "^0.5.0" + railroad-diagrams "^1.0.0" + randexp "0.4.6" + semver "^5.4.1" + needle@^2.2.1: version "2.4.0" resolved "https://registry.yarnpkg.com/needle/-/needle-2.4.0.tgz#6833e74975c444642590e15a750288c5f939b57c" @@ -12196,6 +12235,27 @@ qunit@^2.9.3: node-watch "0.6.1" resolve "1.9.0" +railroad-diagrams@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/railroad-diagrams/-/railroad-diagrams-1.0.0.tgz#eb7e6267548ddedfb899c1b90e57374559cddb7e" + integrity sha1-635iZ1SN3t+4mcG5Dlc3RVnN234= + +randexp@0.4.6: + version "0.4.6" + resolved "https://registry.yarnpkg.com/randexp/-/randexp-0.4.6.tgz#e986ad5e5e31dae13ddd6f7b3019aa7c87f60ca3" + integrity sha512-80WNmd9DA0tmZrw9qQa62GPPWfuXJknrmVmLcxvq4uZBdYqb1wYoKTmnlGUchvVWe0XiLupYkBoXVOxz3C8DYQ== + dependencies: + discontinuous-range "1.0.0" + ret "~0.1.10" + +randexp@^0.5.3: + version "0.5.3" + resolved "https://registry.yarnpkg.com/randexp/-/randexp-0.5.3.tgz#f31c2de3148b30bdeb84b7c3f59b0ebb9fec3738" + integrity sha512-U+5l2KrcMNOUPYvazA3h5ekF80FHTUG+87SEAmHZmolh1M+i/WyTCxVzmi+tidIa1tM4BSe8g2Y/D3loWDjj+w== + dependencies: + drange "^1.0.2" + ret "^0.2.0" + randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5: version "2.1.0" resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" @@ -12630,6 +12690,11 @@ restore-cursor@^3.1.0: onetime "^5.1.0" signal-exit "^3.0.2" +ret@^0.2.0: + version "0.2.2" + resolved "https://registry.yarnpkg.com/ret/-/ret-0.2.2.tgz#b6861782a1f4762dce43402a71eb7a283f44573c" + integrity sha512-M0b3YWQs7R3Z917WRQy1HHA7Ba7D8hvZg6UE5mLykJxQVE2ju0IXbGlaHPPlkY+WN7wFP+wUMXmBFA0aV6vYGQ== + ret@~0.1.10: version "0.1.15" resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc"