mirror of
https://github.com/datahub-project/datahub.git
synced 2025-12-25 17:08:29 +00:00
updates decomm time format. limits decomm time to +7 days. updates interaface for calendars. fixes issue with acl expiresAt
This commit is contained in:
parent
d34afc92e0
commit
01813e843c
@ -6,12 +6,25 @@ import { action } from 'ember-decorators/object';
|
||||
import { IAccessControlAccessTypeOption } from 'wherehows-web/typings/api/datasets/aclaccess';
|
||||
import { getDefaultRequestAccessControlEntry } from 'wherehows-web/utils/datasets/acl-access';
|
||||
|
||||
/**
|
||||
* Returns the number of days in milliseconds, default is 1 day
|
||||
* @param {number} [day=1] the number of days to scale
|
||||
*/
|
||||
const millisecondDays = (day = 1) => day * 24 * 60 * 60 * 1000;
|
||||
|
||||
/**
|
||||
* Date object with the minimum selectable date for acl request expiration,
|
||||
* at least 1 day from now
|
||||
* @type {Date}
|
||||
*/
|
||||
const minSelectableExpirationDate = new Date(Date.now() + 24 * 60 * 60 * 1000);
|
||||
const minSelectableExpirationDate = new Date(Date.now() + millisecondDays());
|
||||
|
||||
/**
|
||||
* Date object with the maximum selectable date for acl request expiration,
|
||||
* up to 7 days from now
|
||||
* @type {Date}
|
||||
*/
|
||||
const maxSelectableExpirationDate = new Date(Date.now() + millisecondDays(7));
|
||||
|
||||
export default class DatasetAclAccess extends Component {
|
||||
/**
|
||||
@ -42,6 +55,13 @@ export default class DatasetAclAccess extends Component {
|
||||
*/
|
||||
minSelectableExpirationDate: Date = minSelectableExpirationDate;
|
||||
|
||||
/**
|
||||
* The furthest date a user can select as an expiration date
|
||||
* @type {Date}
|
||||
* @memberof DatasetAclAccess
|
||||
*/
|
||||
maxSelectableExpirationDate: Date = maxSelectableExpirationDate;
|
||||
|
||||
/**
|
||||
* External action invoked on change to access request access type
|
||||
* @type {(option: IAccessControlAccessTypeOption) => void}
|
||||
|
||||
@ -3,6 +3,7 @@ import { getProperties, computed, set } from '@ember/object';
|
||||
import ComputedProperty, { oneWay } from '@ember/object/computed';
|
||||
import { baseCommentEditorOptions } from 'wherehows-web/constants';
|
||||
import { action } from 'ember-decorators/object';
|
||||
import { IDatasetView } from 'wherehows-web/typings/api/datasets/dataset';
|
||||
|
||||
export default class DatasetDeprecation extends Component {
|
||||
tagName = 'div';
|
||||
@ -25,10 +26,10 @@ export default class DatasetDeprecation extends Component {
|
||||
|
||||
/**
|
||||
* Date the dataset should be decommissioned
|
||||
* @type {Date}
|
||||
* @type {IDatasetView.decommissionTime}
|
||||
* @memberof DatasetAclAccess
|
||||
*/
|
||||
decommissionDate: Date;
|
||||
decommissionTime: IDatasetView['decommissionTime'];
|
||||
|
||||
/**
|
||||
* The earliest date a user can select as a decommission date
|
||||
@ -90,13 +91,13 @@ export default class DatasetDeprecation extends Component {
|
||||
|
||||
/**
|
||||
* The external action to be completed when a save is initiated
|
||||
* @type {(isDeprecated: boolean, updateDeprecationNode: string, decommissionDate: Date) => Promise<void>}
|
||||
* @type {(isDeprecated: boolean, updateDeprecationNode: string, decommissionTime: Date | null) => Promise<void>}
|
||||
* @memberof DatasetDeprecation
|
||||
*/
|
||||
onUpdateDeprecation: (
|
||||
isDeprecated: boolean,
|
||||
updateDeprecationNode: string,
|
||||
decommissionDate: Date
|
||||
decommissionTime: Date | null
|
||||
) => Promise<void> | void;
|
||||
|
||||
editorOptions = {
|
||||
@ -115,32 +116,33 @@ export default class DatasetDeprecation extends Component {
|
||||
}
|
||||
|
||||
/**
|
||||
* Handles updates to the decommissionDate attribute
|
||||
* @param {Date} decommissionDate date dataset should be decommissioned
|
||||
* Handles updates to the decommissionTime attribute
|
||||
* @param {Date} decommissionTime date dataset should be decommissioned
|
||||
*/
|
||||
@action
|
||||
onDecommissionDateChange(this: DatasetDeprecation, decommissionDate: Date) {
|
||||
set(this, 'decommissionDate', decommissionDate);
|
||||
onDecommissionDateChange(this: DatasetDeprecation, decommissionTime: Date) {
|
||||
set(this, 'decommissionTime', new Date(decommissionTime).getTime());
|
||||
}
|
||||
|
||||
/**
|
||||
* Invokes the save action with the updated values for
|
||||
* deprecated decommissionDate, and deprecationNote
|
||||
* deprecated decommissionTime, and deprecationNote
|
||||
* @return {Promise<void>}
|
||||
*/
|
||||
@action
|
||||
async onSave(this: DatasetDeprecation) {
|
||||
const { deprecatedAlias, deprecationNoteAlias, decommissionDate } = getProperties(this, [
|
||||
const { deprecatedAlias, deprecationNoteAlias, decommissionTime } = getProperties(this, [
|
||||
'deprecatedAlias',
|
||||
'deprecationNoteAlias',
|
||||
'decommissionDate'
|
||||
'decommissionTime'
|
||||
]);
|
||||
const { onUpdateDeprecation } = this;
|
||||
|
||||
if (onUpdateDeprecation) {
|
||||
const noteValue = deprecatedAlias ? deprecationNoteAlias : '';
|
||||
const time = decommissionTime ? new Date(decommissionTime) : null;
|
||||
|
||||
await onUpdateDeprecation(!!deprecatedAlias, noteValue || '', decommissionDate);
|
||||
await onUpdateDeprecation(!!deprecatedAlias, noteValue || '', time);
|
||||
set(this, 'deprecationNoteAlias', noteValue);
|
||||
}
|
||||
}
|
||||
|
||||
@ -28,6 +28,12 @@ export default class DatasetPropertiesContainer extends Component {
|
||||
*/
|
||||
deprecationNote: IDatasetView['deprecationNote'];
|
||||
|
||||
/**
|
||||
* Time when the dataset will be decommissioned
|
||||
* @type {IDatasetView.decommissionTime}
|
||||
*/
|
||||
decommissionTime: IDatasetView['decommissionTime'];
|
||||
|
||||
/**
|
||||
* THe list of properties for the dataset, currently unavailable for v2
|
||||
* @type {any[]}
|
||||
@ -61,15 +67,15 @@ export default class DatasetPropertiesContainer extends Component {
|
||||
getDeprecationPropertiesTask = task(function*(
|
||||
this: DatasetPropertiesContainer
|
||||
): IterableIterator<Promise<IDatasetView>> {
|
||||
const { deprecated, deprecationNote }: IDatasetView = yield readDatasetByUrn(get(this, 'urn'));
|
||||
setProperties(this, { deprecated, deprecationNote });
|
||||
const { deprecated, deprecationNote, decommissionTime }: IDatasetView = yield readDatasetByUrn(get(this, 'urn'));
|
||||
setProperties(this, { deprecated, deprecationNote, decommissionTime });
|
||||
});
|
||||
|
||||
/**
|
||||
* Persists the changes to the dataset deprecation properties upstream
|
||||
* @param {boolean} isDeprecated
|
||||
* @param {string} updatedDeprecationNote
|
||||
* @param {Date} decommissionDate dataset decommission date
|
||||
* @param {Date} decommissionTime dataset decommission date
|
||||
* @return {Promise<void>}
|
||||
*/
|
||||
@action
|
||||
@ -77,7 +83,7 @@ export default class DatasetPropertiesContainer extends Component {
|
||||
this: DatasetPropertiesContainer,
|
||||
isDeprecated: boolean,
|
||||
updatedDeprecationNote: string,
|
||||
decommissionDate: Date
|
||||
decommissionTime: Date | null
|
||||
): Promise<void> {
|
||||
const { notify } = get(this, 'notifications');
|
||||
|
||||
@ -86,7 +92,7 @@ export default class DatasetPropertiesContainer extends Component {
|
||||
get(this, 'urn'),
|
||||
isDeprecated,
|
||||
updatedDeprecationNote || '',
|
||||
decommissionDate
|
||||
isDeprecated && decommissionTime ? decommissionTime.getTime() : null
|
||||
);
|
||||
|
||||
notify(NotificationEvent.success, {
|
||||
|
||||
@ -86,6 +86,15 @@ $gray-color: rgb(234, 234, 234);
|
||||
outline: none;
|
||||
}
|
||||
}
|
||||
|
||||
&__cal-dropdown {
|
||||
box-shadow: rgba(0, 0, 0, 0.172549) 0 6px 12px 0;
|
||||
border: 1px solid get-color(black, 0.3);
|
||||
}
|
||||
|
||||
&__cal-input-trigger {
|
||||
padding: item-spacing(1);
|
||||
}
|
||||
}
|
||||
|
||||
.acl-table {
|
||||
|
||||
@ -31,6 +31,15 @@
|
||||
&__decommission-calendar {
|
||||
@include ember-power-calendar($cell-size: item-spacing(7), $primary-color: get-color(blue7));
|
||||
}
|
||||
|
||||
&__cal-input-trigger {
|
||||
padding: item-spacing(1);
|
||||
}
|
||||
|
||||
&__cal-dropdown {
|
||||
box-shadow: rgba(0, 0, 0, 0.172549) 0 6px 12px 0;
|
||||
border: 1px solid get-color(black, 0.3);
|
||||
}
|
||||
}
|
||||
|
||||
.dataset-deprecation-header {
|
||||
|
||||
@ -69,40 +69,52 @@
|
||||
<h4 class="acl-form__meta__header">When should your access expire?</h4>
|
||||
<p class="acl-form__meta__content ">If not specified, defaults to 2 days from now</p>
|
||||
|
||||
{{#power-calendar
|
||||
selected=selectedDate
|
||||
center=centeredDate
|
||||
class="acl-expiration-calendar"
|
||||
onSelect=(action "onExpirationDateChange" value="date")
|
||||
onCenterChange=(action (mut centeredDate) value="date") as |calendar|}}
|
||||
{{#basic-dropdown as |dropdown|}}
|
||||
<input type="text"
|
||||
placeholder="Enter Date"
|
||||
data-ebd-id="{{dropdown.uniqueId}}-trigger"
|
||||
class="acl-form__cal-input-trigger"
|
||||
value={{if userAclRequest.expiresAt (moment-format (mult userAclRequest.expiresAt 1000) 'DD-MMM-YYYY')}}
|
||||
onclick={{dropdown.actions.toggle}}
|
||||
readonly>
|
||||
|
||||
<nav class="ember-power-calendar-nav">
|
||||
{{#dropdown.content class="acl-form__cal-dropdown"}}
|
||||
{{#power-calendar
|
||||
selected=selectedDate
|
||||
center=centeredDate
|
||||
class="acl-expiration-calendar"
|
||||
onSelect=(action "onExpirationDateChange" value="date")
|
||||
onCenterChange=(action (mut centeredDate) value="date") as |calendar|}}
|
||||
|
||||
<button
|
||||
type="button"
|
||||
class="ember-power-calendar-nav-control"
|
||||
onclick={{action calendar.actions.moveCenter -1 'month'}}>
|
||||
<
|
||||
</button>
|
||||
<div class="ember-power-calendar-nav-title">
|
||||
{{moment-format calendar.center 'MMMM YYYY'}}
|
||||
<nav class="ember-power-calendar-nav">
|
||||
|
||||
<p>
|
||||
{{if hasValidExpiration (concat "Expires in " (moment-from-now calendar.selected))}}
|
||||
</p>
|
||||
<button
|
||||
type="button"
|
||||
class="ember-power-calendar-nav-control"
|
||||
onclick={{action calendar.actions.moveCenter -1 'month'}}>
|
||||
<
|
||||
</button>
|
||||
<div class="ember-power-calendar-nav-title">
|
||||
{{moment-format calendar.center 'MMMM YYYY'}}
|
||||
|
||||
</div>
|
||||
<button
|
||||
type="button"
|
||||
class="ember-power-calendar-nav-control"
|
||||
onclick={{action calendar.actions.moveCenter 1 'month'}}>
|
||||
>
|
||||
</button>
|
||||
</nav>
|
||||
<p>
|
||||
{{if hasValidExpiration (concat "Expires in " (moment-from-now calendar.selected))}}
|
||||
</p>
|
||||
|
||||
{{calendar.days minDate=minSelectableExpirationDate}}
|
||||
</div>
|
||||
<button
|
||||
type="button"
|
||||
class="ember-power-calendar-nav-control"
|
||||
onclick={{action calendar.actions.moveCenter 1 'month'}}>
|
||||
>
|
||||
</button>
|
||||
</nav>
|
||||
|
||||
{{/power-calendar}}
|
||||
{{calendar.days minDate=minSelectableExpirationDate maxDate=maxSelectableExpirationDate}}
|
||||
|
||||
{{/power-calendar}}
|
||||
{{/dropdown.content}}
|
||||
{{/basic-dropdown}}
|
||||
</div>
|
||||
|
||||
<div class="comment-new__actions">
|
||||
|
||||
@ -28,43 +28,56 @@
|
||||
|
||||
<h4 class="dataset-deprecation-header">When should this dataset be decommissioned?</h4>
|
||||
|
||||
{{#power-calendar
|
||||
selected=selectedDate
|
||||
center=centeredDate
|
||||
class="dataset-deprecation-toggle__decommission-calendar"
|
||||
onSelect=(action "onDecommissionDateChange" value="date")
|
||||
onCenterChange=(action (mut centeredDate) value="date") as |calendar|}}
|
||||
{{#basic-dropdown as |dropdown|}}
|
||||
<input type="text"
|
||||
placeholder="Enter Date"
|
||||
data-ebd-id="{{dropdown.uniqueId}}-trigger"
|
||||
class="dataset-deprecation-toggle__cal-input-trigger"
|
||||
value={{if decommissionTime (moment-format decommissionTime 'DD-MMM-YYYY')}}
|
||||
onclick={{dropdown.actions.toggle}}
|
||||
readonly>
|
||||
|
||||
<nav class="ember-power-calendar-nav">
|
||||
{{#dropdown.content class="dataset-deprecation-toggle__cal-dropdown"}}
|
||||
{{#power-calendar
|
||||
selected=selectedDate
|
||||
center=centeredDate
|
||||
class="dataset-deprecation-toggle__decommission-calendar"
|
||||
onSelect=(action "onDecommissionDateChange" value="date")
|
||||
onCenterChange=(action (mut centeredDate) value="date") as |calendar|}}
|
||||
|
||||
<button
|
||||
type="button"
|
||||
class="ember-power-calendar-nav-control"
|
||||
onclick={{action calendar.actions.moveCenter -1 'month'}}>
|
||||
<
|
||||
</button>
|
||||
<div class="ember-power-calendar-nav-title">
|
||||
{{moment-format calendar.center 'MMMM YYYY'}}
|
||||
</div>
|
||||
<button
|
||||
type="button"
|
||||
class="ember-power-calendar-nav-control"
|
||||
onclick={{action calendar.actions.moveCenter 1 'month'}}>
|
||||
>
|
||||
</button>
|
||||
</nav>
|
||||
<nav class="ember-power-calendar-nav">
|
||||
|
||||
{{calendar.days minDate=minSelectableDecommissionDate}}
|
||||
<button
|
||||
type="button"
|
||||
class="ember-power-calendar-nav-control"
|
||||
onclick={{action calendar.actions.moveCenter -1 'month'}}>
|
||||
<
|
||||
</button>
|
||||
<div class="ember-power-calendar-nav-title">
|
||||
{{moment-format calendar.center 'MMMM YYYY'}}
|
||||
</div>
|
||||
<button
|
||||
type="button"
|
||||
class="ember-power-calendar-nav-control"
|
||||
onclick={{action calendar.actions.moveCenter 1 'month'}}>
|
||||
>
|
||||
</button>
|
||||
</nav>
|
||||
|
||||
{{/power-calendar}}
|
||||
{{calendar.days minDate=minSelectableDecommissionDate}}
|
||||
|
||||
<p class="decommission-date {{unless decommissionDate 'decommission-date--required'}}">
|
||||
{{#unless decommissionDate}}
|
||||
Please specify a date when this dataset will be decommissioned
|
||||
{{/power-calendar}}
|
||||
{{/dropdown.content}}
|
||||
{{/basic-dropdown}}
|
||||
|
||||
|
||||
<p class="decommission-date {{unless decommissionTime 'decommission-date--required'}}">
|
||||
{{#unless decommissionTime}}
|
||||
Please specify a date when this dataset will be decommissioned
|
||||
{{/unless}}
|
||||
|
||||
<strong>
|
||||
{{if decommissionDate (concat 'Will be decommissioned on ' (moment-format decommissionDate 'MMMM DD YYYY')) ''}}
|
||||
{{if decommissionTime (concat 'Will be decommissioned on ' (moment-format decommissionTime 'MMMM DD YYYY')) ''}}
|
||||
</strong>
|
||||
</p>
|
||||
|
||||
@ -73,8 +86,8 @@
|
||||
<div class="dataset-deprecation-toggle__actions">
|
||||
<button
|
||||
type="submit"
|
||||
disabled={{and deprecatedAlias (not decommissionDate)}}
|
||||
class="nacho-button--large nacho-button--secondary">
|
||||
class="nacho-button--large nacho-button--secondary"
|
||||
disabled={{and deprecatedAlias (not decommissionTime)}}>
|
||||
Update Deprecation Status
|
||||
</button>
|
||||
</div>
|
||||
|
||||
@ -1,6 +1,7 @@
|
||||
{{dataset-deprecation
|
||||
deprecated=deprecated
|
||||
deprecationNote=deprecationNote
|
||||
decommissionTime=decommissionTime
|
||||
onUpdateDeprecation=(action "updateDeprecation")
|
||||
}}
|
||||
|
||||
|
||||
@ -44,6 +44,7 @@ interface IDatasetView {
|
||||
deprecationNote: string;
|
||||
createdTime: number;
|
||||
modifiedTime: number;
|
||||
decommissionTime: number | null;
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@ -187,21 +187,21 @@ const readPinotProperties = async (id: number) => {
|
||||
* @param {string} urn
|
||||
* @param {boolean} deprecated
|
||||
* @param {string} deprecationNote
|
||||
* @param {Date} decommissionDate
|
||||
* @param {Date | null} decommissionTime
|
||||
* @return {Promise<void>}
|
||||
*/
|
||||
const updateDatasetDeprecationByUrn = (
|
||||
urn: string,
|
||||
deprecated: boolean,
|
||||
deprecationNote: string = '',
|
||||
decommissionDate: Date
|
||||
decommissionTime: number | null
|
||||
): Promise<void> =>
|
||||
putJSON<void>({
|
||||
url: datasetDeprecationUrlByUrn(urn),
|
||||
data: {
|
||||
deprecated,
|
||||
deprecationNote,
|
||||
decommissionTime: decommissionDate
|
||||
decommissionTime
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
@ -35,13 +35,13 @@
|
||||
"broccoli-merge-trees": "^2.0.0",
|
||||
"codecov": "^3.0.0",
|
||||
"ember-ajax": "^3.0.0",
|
||||
"ember-basic-dropdown": "^1.0.0",
|
||||
"ember-cli": "~2.18.0",
|
||||
"ember-cli-app-version": "^3.0.0",
|
||||
"ember-cli-babel": "^6.6.0",
|
||||
"ember-cli-bootstrap-sassy": "^0.5.8",
|
||||
"ember-cli-code-coverage": "theseyi/ember-cli-code-coverage",
|
||||
"ember-cli-dependency-checker": "^2.0.0",
|
||||
"ember-cli-dependency-lint": "^1.0.3",
|
||||
"ember-cli-eslint": "^4.2.1",
|
||||
"ember-cli-eyeglass": "^3.3.1",
|
||||
"ember-cli-htmlbars": "^2.0.1",
|
||||
|
||||
@ -2779,6 +2779,14 @@ ember-basic-dropdown@^0.34.0:
|
||||
ember-native-dom-helpers "^0.5.4"
|
||||
ember-wormhole "^0.5.2"
|
||||
|
||||
ember-basic-dropdown@^1.0.0:
|
||||
version "1.0.0"
|
||||
resolved "https://registry.yarnpkg.com/ember-basic-dropdown/-/ember-basic-dropdown-1.0.0.tgz#bbafcaab986ba86dfe8d02b0f8529984229bd738"
|
||||
dependencies:
|
||||
ember-cli-babel "^6.12.0"
|
||||
ember-cli-htmlbars "^2.0.3"
|
||||
ember-maybe-in-element "^0.1.3"
|
||||
|
||||
ember-cli-app-version@^3.0.0:
|
||||
version "3.1.3"
|
||||
resolved "https://registry.yarnpkg.com/ember-cli-app-version/-/ember-cli-app-version-3.1.3.tgz#26d25f5e653ff0106f0b39da6d75518ba8ed282d"
|
||||
@ -2814,7 +2822,7 @@ ember-cli-babel@^6.0.0, ember-cli-babel@^6.0.0-beta.7, ember-cli-babel@^6.1.0, e
|
||||
ember-cli-version-checker "^2.1.0"
|
||||
semver "^5.4.1"
|
||||
|
||||
ember-cli-babel@^6.0.0-beta.4, ember-cli-babel@^6.0.0-beta.9, ember-cli-babel@^6.11.0, ember-cli-babel@^6.8.2:
|
||||
ember-cli-babel@^6.0.0-beta.4, ember-cli-babel@^6.0.0-beta.9, ember-cli-babel@^6.11.0, ember-cli-babel@^6.12.0, ember-cli-babel@^6.8.2:
|
||||
version "6.12.0"
|
||||
resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-6.12.0.tgz#3adcdbe1278da1fcd0b9038f1360cb4ac5d4414c"
|
||||
dependencies:
|
||||
@ -2884,15 +2892,6 @@ ember-cli-dependency-checker@^2.0.0:
|
||||
resolve "^1.5.0"
|
||||
semver "^5.3.0"
|
||||
|
||||
ember-cli-dependency-lint@^1.0.3:
|
||||
version "1.0.3"
|
||||
resolved "https://registry.yarnpkg.com/ember-cli-dependency-lint/-/ember-cli-dependency-lint-1.0.3.tgz#44699b889e2ba2ccaacbfbe62a738ed7bdb80955"
|
||||
dependencies:
|
||||
archy "^1.0.0"
|
||||
broccoli-plugin "^1.3.0"
|
||||
chalk "^2.3.0"
|
||||
semver "^5.5.0"
|
||||
|
||||
ember-cli-eslint@^4.2.1:
|
||||
version "4.2.3"
|
||||
resolved "https://registry.yarnpkg.com/ember-cli-eslint/-/ember-cli-eslint-4.2.3.tgz#2844d3f5e8184f19b2d7132ba99eb0b370b55598"
|
||||
@ -3460,6 +3459,12 @@ ember-maybe-import-regenerator@^0.1.5:
|
||||
ember-cli-babel "^6.0.0-beta.4"
|
||||
regenerator-runtime "^0.9.5"
|
||||
|
||||
ember-maybe-in-element@^0.1.3:
|
||||
version "0.1.3"
|
||||
resolved "https://registry.yarnpkg.com/ember-maybe-in-element/-/ember-maybe-in-element-0.1.3.tgz#1c89be49246e580c1090336ad8be31e373f71b60"
|
||||
dependencies:
|
||||
ember-cli-babel "^6.11.0"
|
||||
|
||||
ember-metrics@^0.12.1:
|
||||
version "0.12.1"
|
||||
resolved "https://registry.yarnpkg.com/ember-metrics/-/ember-metrics-0.12.1.tgz#8659343bf7b8bda403e70d482ff59cc9714d89f6"
|
||||
@ -8298,7 +8303,7 @@ semver-diff@^2.0.0:
|
||||
dependencies:
|
||||
semver "^5.0.3"
|
||||
|
||||
"semver@2 >=2.2.1 || 3.x || 4 || 5", "semver@2 || 3 || 4 || 5", "semver@2.x || 3.x || 4 || 5", semver@5.5.0, "semver@^2.3.0 || 3.x || 4 || 5", semver@^5.0.3, semver@^5.1.0, semver@^5.1.1, semver@^5.3.0, semver@^5.4.1, semver@^5.5.0:
|
||||
"semver@2 >=2.2.1 || 3.x || 4 || 5", "semver@2 || 3 || 4 || 5", "semver@2.x || 3.x || 4 || 5", semver@5.5.0, "semver@^2.3.0 || 3.x || 4 || 5", semver@^5.0.3, semver@^5.1.0, semver@^5.1.1, semver@^5.3.0, semver@^5.4.1:
|
||||
version "5.5.0"
|
||||
resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.0.tgz#dc4bbc7a6ca9d916dee5d43516f0092b58f7b8ab"
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user