mirror of https://github.com/hashicorp/consul
Merge pull request #7177 from hashicorp/ui-staging
ui: UI Release Merge (ui-staging merge)pull/7191/head
commit
bf492d2678
|
@ -35,15 +35,18 @@ start-consul: deps
|
||||||
start-api: deps
|
start-api: deps
|
||||||
yarn run start:api
|
yarn run start:api
|
||||||
|
|
||||||
test: deps
|
test: deps test-node
|
||||||
yarn run test
|
yarn run test
|
||||||
|
|
||||||
test-view: deps
|
test-view: deps test-node
|
||||||
yarn run test:view
|
yarn run test:view
|
||||||
|
|
||||||
test-parallel: deps
|
test-parallel: deps
|
||||||
yarn run test:parallel
|
yarn run test:parallel
|
||||||
|
|
||||||
|
test-node:
|
||||||
|
yarn run test:node
|
||||||
|
|
||||||
lint: deps
|
lint: deps
|
||||||
yarn run lint:hbs && yarn run lint:js
|
yarn run lint:hbs && yarn run lint:js
|
||||||
|
|
||||||
|
|
|
@ -56,7 +56,33 @@ export default Component.extend({
|
||||||
return getSplitters(get(this, 'chain.Nodes'));
|
return getSplitters(get(this, 'chain.Nodes'));
|
||||||
}),
|
}),
|
||||||
routes: computed('chain.Nodes', function() {
|
routes: computed('chain.Nodes', function() {
|
||||||
return getRoutes(get(this, 'chain.Nodes'), this.dom.guid);
|
const routes = getRoutes(get(this, 'chain.Nodes'), this.dom.guid);
|
||||||
|
// if we have no routes with a PathPrefix of '/' or one with no definition at all
|
||||||
|
// then add our own 'default catch all'
|
||||||
|
if (
|
||||||
|
!routes.find(item => get(item, 'Definition.Match.HTTP.PathPrefix') === '/') &&
|
||||||
|
!routes.find(item => typeof item.Definition === 'undefined')
|
||||||
|
) {
|
||||||
|
let nextNode = `resolver:${this.chain.ServiceName}.${this.chain.Namespace}.${this.chain.Datacenter}`;
|
||||||
|
const splitterID = `splitter:${this.chain.ServiceName}`;
|
||||||
|
if (typeof this.chain.Nodes[splitterID] !== 'undefined') {
|
||||||
|
nextNode = splitterID;
|
||||||
|
}
|
||||||
|
routes.push({
|
||||||
|
Default: true,
|
||||||
|
ID: `route:${this.chain.ServiceName}`,
|
||||||
|
Name: this.chain.ServiceName,
|
||||||
|
Definition: {
|
||||||
|
Match: {
|
||||||
|
HTTP: {
|
||||||
|
PathPrefix: '/',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
NextNode: nextNode,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
return routes;
|
||||||
}),
|
}),
|
||||||
resolvers: computed('chain.{Nodes,Targets}', function() {
|
resolvers: computed('chain.{Nodes,Targets}', function() {
|
||||||
return getResolvers(
|
return getResolvers(
|
||||||
|
@ -73,7 +99,7 @@ export default Component.extend({
|
||||||
switch (item.Type) {
|
switch (item.Type) {
|
||||||
case 'splitter':
|
case 'splitter':
|
||||||
item.Splits.forEach(splitter => {
|
item.Splits.forEach(splitter => {
|
||||||
graph.addLink(`splitter:${item.Name}`, splitter.NextNode);
|
graph.addLink(item.ID, splitter.NextNode);
|
||||||
});
|
});
|
||||||
break;
|
break;
|
||||||
case 'router':
|
case 'router':
|
||||||
|
|
|
@ -7,6 +7,7 @@ export default FormComponent.extend({
|
||||||
datacenterRepo: service('repository/dc/component'),
|
datacenterRepo: service('repository/dc/component'),
|
||||||
type: 'policy',
|
type: 'policy',
|
||||||
name: 'policy',
|
name: 'policy',
|
||||||
|
allowServiceIdentity: true,
|
||||||
classNames: ['policy-form'],
|
classNames: ['policy-form'],
|
||||||
|
|
||||||
isScoped: false,
|
isScoped: false,
|
||||||
|
|
|
@ -12,6 +12,7 @@ export default ChildSelectorComponent.extend({
|
||||||
datacenterRepo: service('repository/dc/component'),
|
datacenterRepo: service('repository/dc/component'),
|
||||||
name: 'policy',
|
name: 'policy',
|
||||||
type: 'policy',
|
type: 'policy',
|
||||||
|
allowServiceIdentity: true,
|
||||||
classNames: ['policy-selector'],
|
classNames: ['policy-selector'],
|
||||||
init: function() {
|
init: function() {
|
||||||
this._super(...arguments);
|
this._super(...arguments);
|
||||||
|
|
|
@ -4,7 +4,7 @@ export function initialize(container) {
|
||||||
if (env('CONSUL_UI_DISABLE_REALTIME')) {
|
if (env('CONSUL_UI_DISABLE_REALTIME')) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
['node', 'coordinate', 'session', 'service', 'proxy', 'discovery-chain']
|
['node', 'coordinate', 'session', 'service', 'proxy', 'discovery-chain', 'intention']
|
||||||
.concat(env('CONSUL_NSPACES_ENABLED') ? ['nspace/enabled'] : [])
|
.concat(env('CONSUL_NSPACES_ENABLED') ? ['nspace/enabled'] : [])
|
||||||
.map(function(item) {
|
.map(function(item) {
|
||||||
// create repositories that return a promise resolving to an EventSource
|
// create repositories that return a promise resolving to an EventSource
|
||||||
|
@ -70,6 +70,12 @@ export function initialize(container) {
|
||||||
proxyRepo: 'repository/proxy/event-source',
|
proxyRepo: 'repository/proxy/event-source',
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
route: 'dc/intentions/index',
|
||||||
|
services: {
|
||||||
|
repo: 'repository/intention/event-source',
|
||||||
|
},
|
||||||
|
},
|
||||||
{
|
{
|
||||||
service: 'form',
|
service: 'form',
|
||||||
services: {
|
services: {
|
||||||
|
|
|
@ -65,6 +65,9 @@
|
||||||
padding: 10px;
|
padding: 10px;
|
||||||
padding-left: 36px;
|
padding-left: 36px;
|
||||||
}
|
}
|
||||||
|
%menu-panel .is-active {
|
||||||
|
position: relative;
|
||||||
|
}
|
||||||
%menu-panel .is-active > *::after {
|
%menu-panel .is-active > *::after {
|
||||||
position: absolute;
|
position: absolute;
|
||||||
top: 50%;
|
top: 50%;
|
||||||
|
|
|
@ -10,6 +10,9 @@ html.template-node.template-list .unhealthy h2 {
|
||||||
html.template-node.template-show #meta-data table tr {
|
html.template-node.template-show #meta-data table tr {
|
||||||
cursor: default;
|
cursor: default;
|
||||||
}
|
}
|
||||||
|
html.template-node.template-show #services table tbody td em {
|
||||||
|
display: inline-block;
|
||||||
|
}
|
||||||
.healthy > div > ul > li {
|
.healthy > div > ul > li {
|
||||||
padding-top: 16px;
|
padding-top: 16px;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
{{head-layout}}
|
||||||
|
{{title 'Consul' separator=' - '}}
|
||||||
{{#if (not loading)}}
|
{{#if (not loading)}}
|
||||||
{{outlet}}
|
{{outlet}}
|
||||||
{{else}}
|
{{else}}
|
||||||
|
|
|
@ -3,8 +3,9 @@
|
||||||
{{#yield-slot name='template'}}
|
{{#yield-slot name='template'}}
|
||||||
{{else}}
|
{{else}}
|
||||||
<header>
|
<header>
|
||||||
Policy or service identity?
|
Policy{{if allowServiceIdentity ' or service identity?' ''}}
|
||||||
</header>
|
</header>
|
||||||
|
{{#if allowServiceIdentity}}
|
||||||
<p>
|
<p>
|
||||||
A Service Identity is default policy with a configurable service name. This saves you some time and effort you're using Consul for Connect features.
|
A Service Identity is default policy with a configurable service name. This saves you some time and effort you're using Consul for Connect features.
|
||||||
</p>
|
</p>
|
||||||
|
@ -13,10 +14,13 @@
|
||||||
{{#each templates as |template|}}
|
{{#each templates as |template|}}
|
||||||
<label>
|
<label>
|
||||||
<span>{{template.name}}</span>
|
<span>{{template.name}}</span>
|
||||||
<input data-test-radiobutton={{concat 'template_' template.template}} type="radio" name="{{name}}[template]" value={{template.template}} checked={{eq item.template template.template}} onchange={{action (changeset-set item 'template') value='target.value'}}/>
|
<input data-test-radiobutton={{concat 'template_' template.template}} type="radio" name={{concat name '[template]'}} value={{template.template}} checked={{eq item.template template.template}} onchange={{action (changeset-set item 'template') value='target.value'}}/>
|
||||||
</label>
|
</label>
|
||||||
{{/each}}
|
{{/each}}
|
||||||
</div>
|
</div>
|
||||||
|
{{else}}
|
||||||
|
<input type="hidden" name={{concat name '[template]'}} value="" />
|
||||||
|
{{/if}}
|
||||||
{{/yield-slot}}
|
{{/yield-slot}}
|
||||||
<label class="type-text{{if (and item.error.Name (not item.isPristine)) ' has-error'}}">
|
<label class="type-text{{if (and item.error.Name (not item.isPristine)) ' has-error'}}">
|
||||||
<span>Name</span>
|
<span>Name</span>
|
||||||
|
|
|
@ -17,7 +17,7 @@
|
||||||
<h2>New Policy</h2>
|
<h2>New Policy</h2>
|
||||||
{{/block-slot}}
|
{{/block-slot}}
|
||||||
{{#block-slot name='body'}}
|
{{#block-slot name='body'}}
|
||||||
{{policy-form form=form dc=dc}}
|
{{policy-form form=form dc=dc allowServiceIdentity=allowServiceIdentity}}
|
||||||
{{/block-slot}}
|
{{/block-slot}}
|
||||||
{{#block-slot name='actions' as |close|}}
|
{{#block-slot name='actions' as |close|}}
|
||||||
<button type="submit" {{action 'save' item items (queue (action close) (action 'reset'))}} disabled={{if (or item.isSaving item.isPristine item.isInvalid) 'disabled'}}>
|
<button type="submit" {{action 'save' item items (queue (action close) (action 'reset'))}} disabled={{if (or item.isSaving item.isPristine item.isInvalid) 'disabled'}}>
|
||||||
|
|
|
@ -23,7 +23,29 @@
|
||||||
{{#each item.Children as |child|}}
|
{{#each item.Children as |child|}}
|
||||||
<li onclick={{onclick}} id={{concat 'resolver:' child.ID}}>
|
<li onclick={{onclick}} id={{concat 'resolver:' child.ID}}>
|
||||||
<a name="">
|
<a name="">
|
||||||
{{#if child.Failover}}
|
{{#if child.Redirect}}
|
||||||
|
<dl class="redirect">
|
||||||
|
<dt data-tooltip="Redirect">Redirect</dt>
|
||||||
|
<dd>
|
||||||
|
{{child.Name}}
|
||||||
|
</dd>
|
||||||
|
</dl>
|
||||||
|
{{#if child.Failover}}
|
||||||
|
<dl class="failover">
|
||||||
|
<dt data-tooltip={{concat child.Failover.Type ' failover'}}>{{concat child.Failover.Type ' failover'}}</dt>
|
||||||
|
<dd>
|
||||||
|
<ol>
|
||||||
|
{{#each child.Failover.Targets as |target|}}
|
||||||
|
<li>
|
||||||
|
<span>{{target}}</span>
|
||||||
|
</li>
|
||||||
|
{{/each}}
|
||||||
|
</ol>
|
||||||
|
</dd>
|
||||||
|
</dl>
|
||||||
|
{{/if}}
|
||||||
|
{{else if child.Failover}}
|
||||||
|
{{child.Name}}
|
||||||
<dl class="failover">
|
<dl class="failover">
|
||||||
<dt data-tooltip={{concat child.Failover.Type ' failover'}}>{{concat child.Failover.Type ' failover'}}</dt>
|
<dt data-tooltip={{concat child.Failover.Type ' failover'}}>{{concat child.Failover.Type ' failover'}}</dt>
|
||||||
<dd>
|
<dd>
|
||||||
|
@ -36,13 +58,6 @@
|
||||||
</ol>
|
</ol>
|
||||||
</dd>
|
</dd>
|
||||||
</dl>
|
</dl>
|
||||||
{{else if child.Redirect}}
|
|
||||||
<dl class="redirect">
|
|
||||||
<dt data-tooltip="Redirect">Redirect</dt>
|
|
||||||
<dd>
|
|
||||||
{{child.Name}}
|
|
||||||
</dd>
|
|
||||||
</dl>
|
|
||||||
{{else}}
|
{{else}}
|
||||||
{{child.Name}}
|
{{child.Name}}
|
||||||
{{/if}}
|
{{/if}}
|
||||||
|
|
|
@ -1,3 +1,12 @@
|
||||||
|
{{#if isAuthorized }}
|
||||||
|
{{#if create }}
|
||||||
|
{{title 'New Policy'}}
|
||||||
|
{{else}}
|
||||||
|
{{title 'Edit Policy'}}
|
||||||
|
{{/if}}
|
||||||
|
{{else}}
|
||||||
|
{{title 'Access Controls'}}
|
||||||
|
{{/if}}
|
||||||
{{#app-view class=(concat 'policy ' (if (or isAuthorized isEnabled) 'edit' 'list')) loading=isLoading authorized=isAuthorized enabled=isEnabled}}
|
{{#app-view class=(concat 'policy ' (if (or isAuthorized isEnabled) 'edit' 'list')) loading=isLoading authorized=isAuthorized enabled=isEnabled}}
|
||||||
{{#block-slot name='notification' as |status type|}}
|
{{#block-slot name='notification' as |status type|}}
|
||||||
{{partial 'dc/acls/policies/notifications'}}
|
{{partial 'dc/acls/policies/notifications'}}
|
||||||
|
|
|
@ -1,3 +1,8 @@
|
||||||
|
{{#if isAuthorized }}
|
||||||
|
{{title 'Policies'}}
|
||||||
|
{{else}}
|
||||||
|
{{title 'Access Controls'}}
|
||||||
|
{{/if}}
|
||||||
{{#app-view class=(concat 'policy ' (if (not isAuthorized) 'edit' 'list')) loading=isLoading authorized=isAuthorized enabled=isEnabled}}
|
{{#app-view class=(concat 'policy ' (if (not isAuthorized) 'edit' 'list')) loading=isLoading authorized=isAuthorized enabled=isEnabled}}
|
||||||
{{#block-slot name='notification' as |status type|}}
|
{{#block-slot name='notification' as |status type|}}
|
||||||
{{partial 'dc/acls/policies/notifications'}}
|
{{partial 'dc/acls/policies/notifications'}}
|
||||||
|
|
|
@ -1,3 +1,12 @@
|
||||||
|
{{#if isAuthorized }}
|
||||||
|
{{#if item.ID}}
|
||||||
|
{{title 'Edit Role'}}
|
||||||
|
{{else}}
|
||||||
|
{{title 'New Role'}}
|
||||||
|
{{/if}}
|
||||||
|
{{else}}
|
||||||
|
{{title 'Access Controls'}}
|
||||||
|
{{/if}}
|
||||||
{{#app-view class=(concat 'role ' (if (or isAuthorized isEnabled) 'edit' 'list')) loading=isLoading authorized=isAuthorized enabled=isEnabled}}
|
{{#app-view class=(concat 'role ' (if (or isAuthorized isEnabled) 'edit' 'list')) loading=isLoading authorized=isAuthorized enabled=isEnabled}}
|
||||||
{{#block-slot name='notification' as |status type|}}
|
{{#block-slot name='notification' as |status type|}}
|
||||||
{{partial 'dc/acls/roles/notifications'}}
|
{{partial 'dc/acls/roles/notifications'}}
|
||||||
|
|
|
@ -1,3 +1,8 @@
|
||||||
|
{{#if isAuthorized }}
|
||||||
|
{{title 'Roles'}}
|
||||||
|
{{else}}
|
||||||
|
{{title 'Access Controls'}}
|
||||||
|
{{/if}}
|
||||||
{{#app-view class=(concat 'role ' (if (not isAuthorized) 'edit' 'list')) loading=isLoading authorized=isAuthorized enabled=isEnabled}}
|
{{#app-view class=(concat 'role ' (if (not isAuthorized) 'edit' 'list')) loading=isLoading authorized=isAuthorized enabled=isEnabled}}
|
||||||
{{#block-slot name='notification' as |status type|}}
|
{{#block-slot name='notification' as |status type|}}
|
||||||
{{partial 'dc/acls/roles/notifications'}}
|
{{partial 'dc/acls/roles/notifications'}}
|
||||||
|
|
|
@ -1,3 +1,12 @@
|
||||||
|
{{#if isAuthorized }}
|
||||||
|
{{#if create}}
|
||||||
|
{{title 'New Token'}}
|
||||||
|
{{else}}
|
||||||
|
{{title 'Edit Token'}}
|
||||||
|
{{/if}}
|
||||||
|
{{else}}
|
||||||
|
{{title 'Access Controls'}}
|
||||||
|
{{/if}}
|
||||||
{{#app-view class=(concat 'token ' (if (or isAuthorized isEnabled) 'edit' 'list')) loading=isLoading authorized=isAuthorized enabled=isEnabled}}
|
{{#app-view class=(concat 'token ' (if (or isAuthorized isEnabled) 'edit' 'list')) loading=isLoading authorized=isAuthorized enabled=isEnabled}}
|
||||||
{{#block-slot name='notification' as |status type|}}
|
{{#block-slot name='notification' as |status type|}}
|
||||||
{{partial 'dc/acls/tokens/notifications'}}
|
{{partial 'dc/acls/tokens/notifications'}}
|
||||||
|
|
|
@ -1,3 +1,8 @@
|
||||||
|
{{#if isAuthorized }}
|
||||||
|
{{title 'Tokens'}}
|
||||||
|
{{else}}
|
||||||
|
{{title 'Access Controls'}}
|
||||||
|
{{/if}}
|
||||||
{{#app-view class=(concat 'token ' (if (and isEnabled (not isAuthorized)) 'edit' 'list')) loading=isLoading authorized=isAuthorized enabled=isEnabled}}
|
{{#app-view class=(concat 'token ' (if (and isEnabled (not isAuthorized)) 'edit' 'list')) loading=isLoading authorized=isAuthorized enabled=isEnabled}}
|
||||||
{{#block-slot name='notification' as |status type subject|}}
|
{{#block-slot name='notification' as |status type subject|}}
|
||||||
{{partial 'dc/acls/tokens/notifications'}}
|
{{partial 'dc/acls/tokens/notifications'}}
|
||||||
|
|
|
@ -1,3 +1,9 @@
|
||||||
|
{{#if item.ID }}
|
||||||
|
{{title 'Edit Intention'}}
|
||||||
|
{{else}}
|
||||||
|
{{title 'New Intention'}}
|
||||||
|
{{/if}}
|
||||||
|
|
||||||
{{#app-view class="intention edit" loading=isLoading}}
|
{{#app-view class="intention edit" loading=isLoading}}
|
||||||
{{#block-slot name='notification' as |status type|}}
|
{{#block-slot name='notification' as |status type|}}
|
||||||
{{partial 'dc/intentions/notifications'}}
|
{{partial 'dc/intentions/notifications'}}
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
{{title 'Intentions'}}
|
||||||
{{#app-view class="intention list"}}
|
{{#app-view class="intention list"}}
|
||||||
{{#block-slot name='notification' as |status type|}}
|
{{#block-slot name='notification' as |status type|}}
|
||||||
{{partial 'dc/intentions/notifications'}}
|
{{partial 'dc/intentions/notifications'}}
|
||||||
|
|
|
@ -1,3 +1,8 @@
|
||||||
|
{{#if create }}
|
||||||
|
{{title 'New Key/Value'}}
|
||||||
|
{{else}}
|
||||||
|
{{title 'Edit Key/Value'}}
|
||||||
|
{{/if}}
|
||||||
{{#app-view class="kv edit" loading=isLoading}}
|
{{#app-view class="kv edit" loading=isLoading}}
|
||||||
{{#block-slot name='notification' as |status type|}}
|
{{#block-slot name='notification' as |status type|}}
|
||||||
{{partial 'dc/kv/notifications'}}
|
{{partial 'dc/kv/notifications'}}
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
{{title 'Key/Value'}}
|
||||||
{{#app-view class="kv list" loading=isLoading}}
|
{{#app-view class="kv list" loading=isLoading}}
|
||||||
{{#block-slot name='notification' as |status type|}}
|
{{#block-slot name='notification' as |status type|}}
|
||||||
{{partial 'dc/kv/notifications'}}
|
{{partial 'dc/kv/notifications'}}
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
{{title 'Nodes'}}
|
||||||
{{#app-view class="node list"}}
|
{{#app-view class="node list"}}
|
||||||
{{#block-slot name='header'}}
|
{{#block-slot name='header'}}
|
||||||
<h1>
|
<h1>
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
{{title item.Node}}
|
||||||
{{#app-view class="node show"}}
|
{{#app-view class="node show"}}
|
||||||
{{#block-slot name='notification' as |status type|}}
|
{{#block-slot name='notification' as |status type|}}
|
||||||
{{!TODO: Move sessions to its own folder within nodes }}
|
{{!TODO: Move sessions to its own folder within nodes }}
|
||||||
|
|
|
@ -30,7 +30,7 @@
|
||||||
<p>
|
<p>
|
||||||
By adding policies to this namespaces, you will apply them to all tokens created within this namespace.
|
By adding policies to this namespaces, you will apply them to all tokens created within this namespace.
|
||||||
</p>
|
</p>
|
||||||
{{policy-selector dc=dc nspace='default' items=item.ACLs.PolicyDefaults}}
|
{{policy-selector dc=dc nspace='default' allowServiceIdentity=false items=item.ACLs.PolicyDefaults}}
|
||||||
</fieldset>
|
</fieldset>
|
||||||
{{/if}}
|
{{/if}}
|
||||||
<div>
|
<div>
|
||||||
|
|
|
@ -1,3 +1,8 @@
|
||||||
|
{{#if create }}
|
||||||
|
{{title 'New Namespace'}}
|
||||||
|
{{else}}
|
||||||
|
{{title 'Edit Namespace'}}
|
||||||
|
{{/if}}
|
||||||
{{#app-view class="nspace edit" loading=isLoading}}
|
{{#app-view class="nspace edit" loading=isLoading}}
|
||||||
{{#block-slot name='notification' as |status type|}}
|
{{#block-slot name='notification' as |status type|}}
|
||||||
{{partial 'dc/nspaces/notifications'}}
|
{{partial 'dc/nspaces/notifications'}}
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
{{title 'Namespaces'}}
|
||||||
{{#app-view class="nspace list" loading=isLoading}}
|
{{#app-view class="nspace list" loading=isLoading}}
|
||||||
{{#block-slot name='notification' as |status type subject|}}
|
{{#block-slot name='notification' as |status type subject|}}
|
||||||
{{partial 'dc/nspaces/notifications'}}
|
{{partial 'dc/nspaces/notifications'}}
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
{{title 'Services'}}
|
||||||
{{#app-view class="service list"}}
|
{{#app-view class="service list"}}
|
||||||
{{#block-slot name='notification' as |status type|}}
|
{{#block-slot name='notification' as |status type|}}
|
||||||
{{partial 'dc/services/notifications'}}
|
{{partial 'dc/services/notifications'}}
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
{{title item.ID}}
|
||||||
{{#app-view class="instance show"}}
|
{{#app-view class="instance show"}}
|
||||||
{{#block-slot name='notification' as |status type|}}
|
{{#block-slot name='notification' as |status type|}}
|
||||||
{{partial 'dc/services/notifications'}}
|
{{partial 'dc/services/notifications'}}
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
{{title item.Service.Service}}
|
||||||
{{#app-view class="service show"}}
|
{{#app-view class="service show"}}
|
||||||
{{#block-slot name='notification' as |status type|}}
|
{{#block-slot name='notification' as |status type|}}
|
||||||
{{partial 'dc/services/notifications'}}
|
{{partial 'dc/services/notifications'}}
|
||||||
|
|
|
@ -0,0 +1 @@
|
||||||
|
<title>{{model.title}}</title>
|
|
@ -1,3 +1,4 @@
|
||||||
|
{{title "Settings"}}
|
||||||
{{#hashicorp-consul id="wrapper" permissions=permissions dcs=dcs dc=dc nspaces=nspaces nspace=nspace}}
|
{{#hashicorp-consul id="wrapper" permissions=permissions dcs=dcs dc=dc nspaces=nspaces nspace=nspace}}
|
||||||
{{#app-view class="settings show"}}
|
{{#app-view class="settings show"}}
|
||||||
{{#block-slot name='header'}}
|
{{#block-slot name='header'}}
|
||||||
|
@ -27,7 +28,7 @@
|
||||||
{{#if (not (env 'CONSUL_UI_DISABLE_REALTIME'))}}
|
{{#if (not (env 'CONSUL_UI_DISABLE_REALTIME'))}}
|
||||||
<fieldset>
|
<fieldset>
|
||||||
<h2>Blocking Queries</h2>
|
<h2>Blocking Queries</h2>
|
||||||
<p>Keep catalog info up-to-date without refreshing the page. Any changes made to services and nodes would be reflected in real time.</p>
|
<p>Keep catalog info up-to-date without refreshing the page. Any changes made to services, nodes and intentions would be reflected in real time.</p>
|
||||||
<div class="type-toggle">
|
<div class="type-toggle">
|
||||||
<label>
|
<label>
|
||||||
<input type="checkbox" name="client[blocking]" checked={{if item.client.blocking 'checked'}} onchange={{action 'change'}} />
|
<input type="checkbox" name="client[blocking]" checked={{if item.client.blocking 'checked'}} onchange={{action 'change'}} />
|
||||||
|
|
|
@ -38,6 +38,14 @@ export const getSplitters = function(nodes) {
|
||||||
return getNodesByType(nodes, 'splitter').map(function(item) {
|
return getNodesByType(nodes, 'splitter').map(function(item) {
|
||||||
// Splitters need IDs adding so we can find them in the DOM later
|
// Splitters need IDs adding so we can find them in the DOM later
|
||||||
item.ID = `splitter:${item.Name}`;
|
item.ID = `splitter:${item.Name}`;
|
||||||
|
// splitters have a service.nspace as a name
|
||||||
|
// do the reverse dance to ensure we don't mess up any
|
||||||
|
// serivice names with dots in them
|
||||||
|
const temp = item.Name.split('.');
|
||||||
|
temp.reverse();
|
||||||
|
temp.shift();
|
||||||
|
temp.reverse();
|
||||||
|
item.Name = temp.join('.');
|
||||||
return item;
|
return item;
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
@ -53,45 +61,74 @@ export const getRoutes = function(nodes, uid) {
|
||||||
};
|
};
|
||||||
export const getResolvers = function(dc, nspace = 'default', targets = {}, nodes = {}) {
|
export const getResolvers = function(dc, nspace = 'default', targets = {}, nodes = {}) {
|
||||||
const resolvers = {};
|
const resolvers = {};
|
||||||
Object.values(targets).forEach(target => {
|
// make all our resolver nodes
|
||||||
const node = nodes[`resolver:${target.ID}`];
|
Object.values(nodes)
|
||||||
const resolver = findResolver(resolvers, target.Service, nspace, dc);
|
.filter(item => item.Type === 'resolver')
|
||||||
// We use this to figure out whether this target is a redirect target
|
.forEach(function(item) {
|
||||||
const alternate = getAlternateServices([target.ID], `service.${nspace}.${dc}`);
|
const parts = item.Name.split('.');
|
||||||
|
let subset;
|
||||||
let failovers;
|
// this will leave behind the service.name.nspace.dc even if the service name contains a dot
|
||||||
// Figure out the failover type
|
if (parts.length > 3) {
|
||||||
if (typeof node.Resolver.Failover !== 'undefined') {
|
subset = parts.shift();
|
||||||
failovers = getAlternateServices(node.Resolver.Failover.Targets, target.ID);
|
}
|
||||||
}
|
parts.reverse();
|
||||||
switch (true) {
|
// slice off from dc.nspace onwards leaving the potentially dot containing service name
|
||||||
// This target is a redirect
|
// const nodeDc =
|
||||||
case alternate.Type !== 'Service':
|
parts.shift();
|
||||||
resolver.Children.push({
|
// const nodeNspace =
|
||||||
Redirect: true,
|
parts.shift();
|
||||||
ID: target.ID,
|
// if it does contain a dot put it back to the correct order
|
||||||
Name: target[alternate.Type],
|
parts.reverse();
|
||||||
});
|
const service = parts.join('.');
|
||||||
break;
|
const resolver = findResolver(resolvers, service, nspace, dc);
|
||||||
// This target is a Subset
|
let failovers;
|
||||||
case typeof target.ServiceSubset !== 'undefined':
|
if (typeof item.Resolver.Failover !== 'undefined') {
|
||||||
resolver.Children.push({
|
// figure out what type of failover this is
|
||||||
|
failovers = getAlternateServices(item.Resolver.Failover.Targets, item.Name);
|
||||||
|
}
|
||||||
|
if (subset) {
|
||||||
|
const child = {
|
||||||
Subset: true,
|
Subset: true,
|
||||||
ID: target.ID,
|
ID: item.Name,
|
||||||
Name: target.ServiceSubset,
|
Name: subset,
|
||||||
Filter: target.Subset.Filter,
|
};
|
||||||
...(typeof failovers !== 'undefined'
|
if (typeof failovers !== 'undefined') {
|
||||||
? {
|
child.Failover = failovers;
|
||||||
Failover: failovers,
|
}
|
||||||
}
|
resolver.Children.push(child);
|
||||||
: {}),
|
} else {
|
||||||
});
|
|
||||||
break;
|
|
||||||
// This target is just normal service that might have failovers
|
|
||||||
default:
|
|
||||||
if (typeof failovers !== 'undefined') {
|
if (typeof failovers !== 'undefined') {
|
||||||
resolver.Failover = failovers;
|
resolver.Failover = failovers;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
Object.values(targets).forEach(target => {
|
||||||
|
// Failovers don't have a specific node
|
||||||
|
if (typeof nodes[`resolver:${target.ID}`] !== 'undefined') {
|
||||||
|
// We use this to figure out whether this target is a redirect target
|
||||||
|
const alternate = getAlternateServices([target.ID], `service.${nspace}.${dc}`);
|
||||||
|
// as Failovers don't make it here, we know anything that has alternateServices
|
||||||
|
// must be a redirect
|
||||||
|
if (alternate.Type !== 'Service') {
|
||||||
|
// find the already created resolver
|
||||||
|
const resolver = findResolver(resolvers, target.Service, nspace, dc);
|
||||||
|
// and add the redirect as a child, redirects are always children
|
||||||
|
const child = {
|
||||||
|
Redirect: true,
|
||||||
|
ID: target.ID,
|
||||||
|
Name: target[alternate.Type],
|
||||||
|
};
|
||||||
|
// redirects can then also have failovers
|
||||||
|
// so it this one does, figure out what type they are and add them
|
||||||
|
// to the redirect
|
||||||
|
if (typeof nodes[`resolver:${target.ID}`].Resolver.Failover !== 'undefined') {
|
||||||
|
child.Failover = getAlternateServices(
|
||||||
|
nodes[`resolver:${target.ID}`].Resolver.Failover.Targets,
|
||||||
|
target.ID
|
||||||
|
);
|
||||||
|
}
|
||||||
|
resolver.Children.push(child);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
return Object.values(resolvers);
|
return Object.values(resolvers);
|
||||||
|
|
|
@ -0,0 +1,39 @@
|
||||||
|
const test = require('tape');
|
||||||
|
|
||||||
|
const getEnvironment = require('../../config/environment.js');
|
||||||
|
|
||||||
|
test(
|
||||||
|
'config has the correct environment settings',
|
||||||
|
function(t) {
|
||||||
|
[
|
||||||
|
{
|
||||||
|
environment: 'production',
|
||||||
|
CONSUL_BINARY_TYPE: 'oss',
|
||||||
|
CONSUL_ACLS_ENABLED: '{{.ACLsEnabled}}',
|
||||||
|
CONSUL_NSPACES_ENABLED: '{{ if .NamespacesEnabled }}{{.NamespacesEnabled}}{{ else }}false{{ end }}',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
environment: 'test',
|
||||||
|
CONSUL_BINARY_TYPE: 'oss',
|
||||||
|
CONSUL_ACLS_ENABLED: true,
|
||||||
|
CONSUL_NSPACES_ENABLED: true,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
environment: 'staging',
|
||||||
|
CONSUL_BINARY_TYPE: 'oss',
|
||||||
|
CONSUL_ACLS_ENABLED: true,
|
||||||
|
CONSUL_NSPACES_ENABLED: true,
|
||||||
|
}
|
||||||
|
].forEach(
|
||||||
|
function(item) {
|
||||||
|
const env = getEnvironment(item.environment);
|
||||||
|
Object.keys(item).forEach(
|
||||||
|
function(key) {
|
||||||
|
t.equal(env[key], item[key], `Expect ${key} to equal ${item[key]} in the ${item.environment} environment`);
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
);
|
||||||
|
t.end();
|
||||||
|
}
|
||||||
|
);
|
|
@ -24,6 +24,7 @@
|
||||||
"test": "ember test --test-port=${EMBER_TEST_PORT:-7357}",
|
"test": "ember test --test-port=${EMBER_TEST_PORT:-7357}",
|
||||||
"test:parallel": "EMBER_EXAM_PARALLEL=true ember exam --split=4 --parallel",
|
"test:parallel": "EMBER_EXAM_PARALLEL=true ember exam --split=4 --parallel",
|
||||||
"test:view": "ember test --server --test-port=${EMBER_TEST_PORT:-7357}",
|
"test:view": "ember test --server --test-port=${EMBER_TEST_PORT:-7357}",
|
||||||
|
"test:node": "tape ./node-tests/**/*.js",
|
||||||
"test:coverage": "COVERAGE=true ember test --test-port=${EMBER_TEST_PORT:-7357}",
|
"test:coverage": "COVERAGE=true ember test --test-port=${EMBER_TEST_PORT:-7357}",
|
||||||
"test:view:coverage": "COVERAGE=true ember test --server --test-port=${EMBER_TEST_PORT:-7357}",
|
"test:view:coverage": "COVERAGE=true ember test --server --test-port=${EMBER_TEST_PORT:-7357}",
|
||||||
"steps:list": "node ./lib/commands/bin/list.js"
|
"steps:list": "node ./lib/commands/bin/list.js"
|
||||||
|
@ -86,6 +87,7 @@
|
||||||
"ember-load-initializers": "^2.0.0",
|
"ember-load-initializers": "^2.0.0",
|
||||||
"ember-math-helpers": "^2.4.0",
|
"ember-math-helpers": "^2.4.0",
|
||||||
"ember-maybe-import-regenerator": "^0.1.6",
|
"ember-maybe-import-regenerator": "^0.1.6",
|
||||||
|
"ember-page-title": "^5.1.0",
|
||||||
"ember-power-select": "^3.0.3",
|
"ember-power-select": "^3.0.3",
|
||||||
"ember-power-select-with-create": "^0.6.0",
|
"ember-power-select-with-create": "^0.6.0",
|
||||||
"ember-qunit": "^4.4.1",
|
"ember-qunit": "^4.4.1",
|
||||||
|
@ -107,6 +109,7 @@
|
||||||
"node-sass": "^4.9.3",
|
"node-sass": "^4.9.3",
|
||||||
"prettier": "^1.10.2",
|
"prettier": "^1.10.2",
|
||||||
"qunit-dom": "^0.9.0",
|
"qunit-dom": "^0.9.0",
|
||||||
|
"tape": "^4.13.0",
|
||||||
"text-encoding": "^0.7.0"
|
"text-encoding": "^0.7.0"
|
||||||
},
|
},
|
||||||
"engines": {
|
"engines": {
|
||||||
|
|
|
@ -0,0 +1,19 @@
|
||||||
|
@setupApplicationTest
|
||||||
|
Feature: dc / acls / policies / as many / nspaces: As many for nspaces
|
||||||
|
Scenario:
|
||||||
|
Given 1 datacenter model with the value "datacenter"
|
||||||
|
And 1 nspace model from yaml
|
||||||
|
---
|
||||||
|
Name: key
|
||||||
|
ACLs:
|
||||||
|
PolicyDefaults: ~
|
||||||
|
RoleDefaults: ~
|
||||||
|
---
|
||||||
|
When I visit the nspace page for yaml
|
||||||
|
---
|
||||||
|
dc: datacenter
|
||||||
|
namespace: key
|
||||||
|
---
|
||||||
|
Then the url should be /datacenter/namespaces/key
|
||||||
|
And I click policies.create
|
||||||
|
And I don't see the "#policies [data-test-radiobutton=template_service-identity]" element
|
|
@ -0,0 +1,14 @@
|
||||||
|
@setupApplicationTest
|
||||||
|
Feature: dc / acls / policies / create
|
||||||
|
Scenario:
|
||||||
|
Given 1 datacenter model with the value "datacenter"
|
||||||
|
When I visit the policy page for yaml
|
||||||
|
---
|
||||||
|
dc: datacenter
|
||||||
|
---
|
||||||
|
Then the url should be /datacenter/acls/policies/create
|
||||||
|
And the title should be "New Policy - Consul"
|
||||||
|
|
||||||
|
@ignore
|
||||||
|
Scenario: Test we can create a ACLs Policy
|
||||||
|
Then ok
|
|
@ -10,6 +10,7 @@ Feature: dc / acls / policies / index: ACL Policy List
|
||||||
---
|
---
|
||||||
Then the url should be /dc-1/acls/policies
|
Then the url should be /dc-1/acls/policies
|
||||||
Then I see 3 policy models
|
Then I see 3 policy models
|
||||||
|
And the title should be "Policies - Consul"
|
||||||
Scenario: Searching the policies
|
Scenario: Searching the policies
|
||||||
Given 1 datacenter model with the value "dc-1"
|
Given 1 datacenter model with the value "dc-1"
|
||||||
And 3 policy models from yaml
|
And 3 policy models from yaml
|
||||||
|
|
|
@ -15,6 +15,7 @@ Feature: dc / acls / policies / update: ACL Policy Update
|
||||||
---
|
---
|
||||||
Then the url should be /datacenter/acls/policies/policy-id
|
Then the url should be /datacenter/acls/policies/policy-id
|
||||||
Then I see 3 token models
|
Then I see 3 token models
|
||||||
|
And the title should be "Edit Policy - Consul"
|
||||||
Scenario: Update to [Name], [Rules], [Description]
|
Scenario: Update to [Name], [Rules], [Description]
|
||||||
Then I fill in the policy form with yaml
|
Then I fill in the policy form with yaml
|
||||||
---
|
---
|
||||||
|
|
|
@ -0,0 +1,14 @@
|
||||||
|
@setupApplicationTest
|
||||||
|
Feature: dc / acls / roles / create
|
||||||
|
Scenario:
|
||||||
|
Given 1 datacenter model with the value "datacenter"
|
||||||
|
When I visit the role page for yaml
|
||||||
|
---
|
||||||
|
dc: datacenter
|
||||||
|
---
|
||||||
|
Then the url should be /datacenter/acls/roles/create
|
||||||
|
And the title should be "New Role - Consul"
|
||||||
|
|
||||||
|
@ignore
|
||||||
|
Scenario: Test we can create a ACLs role
|
||||||
|
Then ok
|
|
@ -10,6 +10,7 @@ Feature: dc / acls / roles / index: ACL Roles List
|
||||||
---
|
---
|
||||||
Then the url should be /dc-1/acls/roles
|
Then the url should be /dc-1/acls/roles
|
||||||
Then I see 3 role models
|
Then I see 3 role models
|
||||||
|
And the title should be "Roles - Consul"
|
||||||
Scenario: Searching the roles
|
Scenario: Searching the roles
|
||||||
Given 1 datacenter model with the value "dc-1"
|
Given 1 datacenter model with the value "dc-1"
|
||||||
And 3 role models from yaml
|
And 3 role models from yaml
|
||||||
|
|
|
@ -14,6 +14,7 @@ Feature: dc / acls / roles / update: ACL Role Update
|
||||||
---
|
---
|
||||||
Then the url should be /datacenter/acls/roles/role-id
|
Then the url should be /datacenter/acls/roles/role-id
|
||||||
Then I see 3 token models
|
Then I see 3 token models
|
||||||
|
And the title should be "Edit Role - Consul"
|
||||||
Scenario: Update to [Name], [Rules], [Description]
|
Scenario: Update to [Name], [Rules], [Description]
|
||||||
Then I fill in the role form with yaml
|
Then I fill in the role form with yaml
|
||||||
---
|
---
|
||||||
|
|
|
@ -0,0 +1,14 @@
|
||||||
|
@setupApplicationTest
|
||||||
|
Feature: dc / acls / tokens / create
|
||||||
|
Scenario:
|
||||||
|
Given 1 datacenter model with the value "datacenter"
|
||||||
|
When I visit the token page for yaml
|
||||||
|
---
|
||||||
|
dc: datacenter
|
||||||
|
---
|
||||||
|
Then the url should be /datacenter/acls/tokens/create
|
||||||
|
And the title should be "New Token - Consul"
|
||||||
|
|
||||||
|
@ignore
|
||||||
|
Scenario: Test we can create a ACLs Token
|
||||||
|
Then ok
|
|
@ -9,6 +9,7 @@ Feature: dc / acls / tokens / index: ACL Token List
|
||||||
dc: dc-1
|
dc: dc-1
|
||||||
---
|
---
|
||||||
Then the url should be /dc-1/acls/tokens
|
Then the url should be /dc-1/acls/tokens
|
||||||
|
And the title should be "Tokens - Consul"
|
||||||
Then I see 3 token models
|
Then I see 3 token models
|
||||||
Scenario: Searching the tokens
|
Scenario: Searching the tokens
|
||||||
Given 1 datacenter model with the value "dc-1"
|
Given 1 datacenter model with the value "dc-1"
|
||||||
|
|
|
@ -13,6 +13,7 @@ Feature: dc / acls / tokens / update: ACL Token Update
|
||||||
token: key
|
token: key
|
||||||
---
|
---
|
||||||
Then the url should be /datacenter/acls/tokens/key
|
Then the url should be /datacenter/acls/tokens/key
|
||||||
|
And the title should be "Edit Token - Consul"
|
||||||
Scenario: Update to [Name]
|
Scenario: Update to [Name]
|
||||||
Then I fill in with yaml
|
Then I fill in with yaml
|
||||||
---
|
---
|
||||||
|
|
|
@ -19,6 +19,7 @@ Feature: dc / intentions / create: Intention Create
|
||||||
dc: datacenter
|
dc: datacenter
|
||||||
---
|
---
|
||||||
Then the url should be /datacenter/intentions/create
|
Then the url should be /datacenter/intentions/create
|
||||||
|
And the title should be "New Intention - Consul"
|
||||||
# Set source
|
# Set source
|
||||||
And I click "[data-test-source-element] .ember-power-select-trigger"
|
And I click "[data-test-source-element] .ember-power-select-trigger"
|
||||||
And I type "web" into ".ember-power-select-search-input"
|
And I type "web" into ".ember-power-select-search-input"
|
||||||
|
@ -39,5 +40,6 @@ Feature: dc / intentions / create: Intention Create
|
||||||
Action: deny
|
Action: deny
|
||||||
---
|
---
|
||||||
Then the url should be /datacenter/intentions
|
Then the url should be /datacenter/intentions
|
||||||
|
And the title should be "Intentions - Consul"
|
||||||
And "[data-notification]" has the "notification-create" class
|
And "[data-notification]" has the "notification-create" class
|
||||||
And "[data-notification]" has the "success" class
|
And "[data-notification]" has the "success" class
|
||||||
|
|
|
@ -12,6 +12,7 @@ Feature: dc / intentions / update: Intention Update
|
||||||
intention: intention-id
|
intention: intention-id
|
||||||
---
|
---
|
||||||
Then the url should be /datacenter/intentions/intention-id
|
Then the url should be /datacenter/intentions/intention-id
|
||||||
|
And the title should be "Edit Intention - Consul"
|
||||||
Scenario: Update to [Description], [Action]
|
Scenario: Update to [Description], [Action]
|
||||||
Then I fill in with yaml
|
Then I fill in with yaml
|
||||||
---
|
---
|
||||||
|
@ -25,6 +26,7 @@ Feature: dc / intentions / update: Intention Update
|
||||||
Action: [Action]
|
Action: [Action]
|
||||||
---
|
---
|
||||||
Then the url should be /datacenter/intentions
|
Then the url should be /datacenter/intentions
|
||||||
|
And the title should be "Intentions - Consul"
|
||||||
And "[data-notification]" has the "notification-update" class
|
And "[data-notification]" has the "notification-update" class
|
||||||
And "[data-notification]" has the "success" class
|
And "[data-notification]" has the "success" class
|
||||||
Where:
|
Where:
|
||||||
|
|
|
@ -0,0 +1,14 @@
|
||||||
|
@setupApplicationTest
|
||||||
|
Feature: dc / kvs / create
|
||||||
|
Scenario:
|
||||||
|
Given 1 datacenter model with the value "datacenter"
|
||||||
|
When I visit the kv page for yaml
|
||||||
|
---
|
||||||
|
dc: datacenter
|
||||||
|
---
|
||||||
|
Then the url should be /datacenter/kv/create
|
||||||
|
And the title should be "New Key/Value - Consul"
|
||||||
|
|
||||||
|
@ignore
|
||||||
|
Scenario: Test we can create a KV
|
||||||
|
Then ok
|
|
@ -13,6 +13,7 @@ Feature: dc / kvs / update: KV Update
|
||||||
kv: "[Name]"
|
kv: "[Name]"
|
||||||
---
|
---
|
||||||
Then the url should be /datacenter/kv/[EncodedName]/edit
|
Then the url should be /datacenter/kv/[EncodedName]/edit
|
||||||
|
And the title should be "Edit Key/Value - Consul"
|
||||||
# Turn the Code Editor off so we can fill the value easier
|
# Turn the Code Editor off so we can fill the value easier
|
||||||
And I click "[name=json]"
|
And I click "[name=json]"
|
||||||
Then I fill in with yaml
|
Then I fill in with yaml
|
||||||
|
@ -52,6 +53,7 @@ Feature: dc / kvs / update: KV Update
|
||||||
And I submit
|
And I submit
|
||||||
Then a PUT request was made to "/v1/kv/key?dc=datacenter&ns=@!namespace" with the body " "
|
Then a PUT request was made to "/v1/kv/key?dc=datacenter&ns=@!namespace" with the body " "
|
||||||
Then the url should be /datacenter/kv
|
Then the url should be /datacenter/kv
|
||||||
|
And the title should be "Key/Value - Consul"
|
||||||
And "[data-notification]" has the "notification-update" class
|
And "[data-notification]" has the "notification-update" class
|
||||||
And "[data-notification]" has the "success" class
|
And "[data-notification]" has the "success" class
|
||||||
Scenario: Update to a key change value to ''
|
Scenario: Update to a key change value to ''
|
||||||
|
|
|
@ -5,7 +5,7 @@ Feature: dc / list-blocking
|
||||||
I want to see changes if I change consul externally
|
I want to see changes if I change consul externally
|
||||||
Background:
|
Background:
|
||||||
Given 1 datacenter model with the value "dc-1"
|
Given 1 datacenter model with the value "dc-1"
|
||||||
Scenario: Viewing the listing pages
|
Scenario: Viewing the listing pages for [Page]
|
||||||
Given 3 [Model] models
|
Given 3 [Model] models
|
||||||
And a network latency of 100
|
And a network latency of 100
|
||||||
When I visit the [Page] page for yaml
|
When I visit the [Page] page for yaml
|
||||||
|
@ -25,8 +25,9 @@ Feature: dc / list-blocking
|
||||||
| Page | Model | Url |
|
| Page | Model | Url |
|
||||||
| services | service | services |
|
| services | service | services |
|
||||||
| nodes | node | nodes |
|
| nodes | node | nodes |
|
||||||
|
| intentions | intention | intentions |
|
||||||
------------------------------------------------
|
------------------------------------------------
|
||||||
Scenario: Viewing detail pages with a listing
|
Scenario: Viewing detail pages with a listing for [Page]
|
||||||
Given 3 [Model] models
|
Given 3 [Model] models
|
||||||
And a network latency of 100
|
And a network latency of 100
|
||||||
When I visit the [Page] page for yaml
|
When I visit the [Page] page for yaml
|
||||||
|
|
|
@ -14,6 +14,7 @@ Feature: dc / nodes / index
|
||||||
dc: dc-1
|
dc: dc-1
|
||||||
---
|
---
|
||||||
Then the url should be /dc-1/nodes
|
Then the url should be /dc-1/nodes
|
||||||
|
And the title should be "Nodes - Consul"
|
||||||
Then I see 3 node models
|
Then I see 3 node models
|
||||||
Scenario: Seeing the leader in unhealthy listing
|
Scenario: Seeing the leader in unhealthy listing
|
||||||
Given 3 node models from yaml
|
Given 3 node models from yaml
|
||||||
|
|
|
@ -75,6 +75,7 @@ Feature: dc / nodes / show: Show node
|
||||||
node: node-0
|
node: node-0
|
||||||
---
|
---
|
||||||
Then the url should be /dc1/nodes/node-0
|
Then the url should be /dc1/nodes/node-0
|
||||||
|
And the title should be "node-0 - Consul"
|
||||||
And the url "/v1/internal/ui/node/node-0" responds with a 404 status
|
And the url "/v1/internal/ui/node/node-0" responds with a 404 status
|
||||||
And pause until I see the text "no longer exists" in "[data-notification]"
|
And pause until I see the text "no longer exists" in "[data-notification]"
|
||||||
@ignore
|
@ignore
|
||||||
|
|
|
@ -0,0 +1,14 @@
|
||||||
|
@setupApplicationTest
|
||||||
|
Feature: dc / acls / nspaces / create
|
||||||
|
Scenario:
|
||||||
|
Given 1 datacenter model with the value "datacenter"
|
||||||
|
When I visit the nspace page for yaml
|
||||||
|
---
|
||||||
|
dc: datacenter
|
||||||
|
---
|
||||||
|
Then the url should be /datacenter/namespaces/create
|
||||||
|
And the title should be "New Namespace - Consul"
|
||||||
|
|
||||||
|
@ignore
|
||||||
|
Scenario: Test we can create a Namespace
|
||||||
|
Then ok
|
|
@ -15,6 +15,7 @@ Feature: dc / nspaces / index: Nspaces List
|
||||||
dc: dc-1
|
dc: dc-1
|
||||||
---
|
---
|
||||||
Then the url should be /dc-1/namespaces
|
Then the url should be /dc-1/namespaces
|
||||||
|
And the title should be "Namespaces - Consul"
|
||||||
Scenario:
|
Scenario:
|
||||||
Then I see 3 nspace models
|
Then I see 3 nspace models
|
||||||
Scenario: Searching the nspaces
|
Scenario: Searching the nspaces
|
||||||
|
|
|
@ -14,6 +14,7 @@ Feature: dc / nspaces / update: Nspace Update
|
||||||
namespace: namespace
|
namespace: namespace
|
||||||
---
|
---
|
||||||
Then the url should be /datacenter/namespaces/namespace
|
Then the url should be /datacenter/namespaces/namespace
|
||||||
|
And the title should be "Edit Namespace - Consul"
|
||||||
Scenario: Update to [Description]
|
Scenario: Update to [Description]
|
||||||
Then I fill in with yaml
|
Then I fill in with yaml
|
||||||
---
|
---
|
||||||
|
|
|
@ -26,6 +26,7 @@ Feature: dc / services / index: List Services
|
||||||
dc: dc-1
|
dc: dc-1
|
||||||
---
|
---
|
||||||
Then the url should be /dc-1/services
|
Then the url should be /dc-1/services
|
||||||
|
And the title should be "Services - Consul"
|
||||||
Then I see 6 service models
|
Then I see 6 service models
|
||||||
And I see externalSource on the services like yaml
|
And I see externalSource on the services like yaml
|
||||||
---
|
---
|
||||||
|
|
|
@ -81,6 +81,7 @@ Feature: dc / services / instances / show: Show Service Instance
|
||||||
When I click metaData on the tabs
|
When I click metaData on the tabs
|
||||||
And I see metaDataIsSelected on the tabs
|
And I see metaDataIsSelected on the tabs
|
||||||
And I see 3 of the metaData object
|
And I see 3 of the metaData object
|
||||||
|
And the title should be "service-0-with-id - Consul"
|
||||||
|
|
||||||
Scenario: A Service instance warns when deregistered whilst blocking
|
Scenario: A Service instance warns when deregistered whilst blocking
|
||||||
Given settings from yaml
|
Given settings from yaml
|
||||||
|
|
|
@ -16,6 +16,8 @@ Feature: dc / services / show: Show Service
|
||||||
service: service-0
|
service: service-0
|
||||||
---
|
---
|
||||||
Then I see externalSource like "consul"
|
Then I see externalSource like "consul"
|
||||||
|
And the title should be "service-0 - Consul"
|
||||||
|
|
||||||
Scenario: Given a service with an 'unsupported' external source, there is no logo
|
Scenario: Given a service with an 'unsupported' external source, there is no logo
|
||||||
Given 1 datacenter model with the value "dc1"
|
Given 1 datacenter model with the value "dc1"
|
||||||
And 1 node models
|
And 1 node models
|
||||||
|
|
|
@ -0,0 +1,9 @@
|
||||||
|
@setupApplicationTest
|
||||||
|
@notNamespaceable
|
||||||
|
|
||||||
|
Feature: settings / show: Show Settings Page
|
||||||
|
Scenario:
|
||||||
|
Given 1 datacenter model with the value "datacenter"
|
||||||
|
When I visit the settings page
|
||||||
|
Then the url should be /setting
|
||||||
|
And the title should be "Settings - Consul"
|
|
@ -0,0 +1,10 @@
|
||||||
|
import steps from '../../../../steps';
|
||||||
|
|
||||||
|
// step definitions that are shared between features should be moved to the
|
||||||
|
// tests/acceptance/steps/steps.js file
|
||||||
|
|
||||||
|
export default function(assert) {
|
||||||
|
return steps(assert).then('I should find a file', function() {
|
||||||
|
assert.ok(true, this.step);
|
||||||
|
});
|
||||||
|
}
|
|
@ -0,0 +1,10 @@
|
||||||
|
import steps from '../../../steps';
|
||||||
|
|
||||||
|
// step definitions that are shared between features should be moved to the
|
||||||
|
// tests/acceptance/steps/steps.js file
|
||||||
|
|
||||||
|
export default function(assert) {
|
||||||
|
return steps(assert).then('I should find a file', function() {
|
||||||
|
assert.ok(true, this.step);
|
||||||
|
});
|
||||||
|
}
|
|
@ -0,0 +1,10 @@
|
||||||
|
import steps from '../../../steps';
|
||||||
|
|
||||||
|
// step definitions that are shared between features should be moved to the
|
||||||
|
// tests/acceptance/steps/steps.js file
|
||||||
|
|
||||||
|
export default function(assert) {
|
||||||
|
return steps(assert).then('I should find a file', function() {
|
||||||
|
assert.ok(true, this.step);
|
||||||
|
});
|
||||||
|
}
|
|
@ -0,0 +1,10 @@
|
||||||
|
import steps from '../../../steps';
|
||||||
|
|
||||||
|
// step definitions that are shared between features should be moved to the
|
||||||
|
// tests/acceptance/steps/steps.js file
|
||||||
|
|
||||||
|
export default function(assert) {
|
||||||
|
return steps(assert).then('I should find a file', function() {
|
||||||
|
assert.ok(true, this.step);
|
||||||
|
});
|
||||||
|
}
|
|
@ -0,0 +1,10 @@
|
||||||
|
import steps from '../../steps';
|
||||||
|
|
||||||
|
// step definitions that are shared between features should be moved to the
|
||||||
|
// tests/acceptance/steps/steps.js file
|
||||||
|
|
||||||
|
export default function(assert) {
|
||||||
|
return steps(assert).then('I should find a file', function() {
|
||||||
|
assert.ok(true, this.step);
|
||||||
|
});
|
||||||
|
}
|
|
@ -0,0 +1,10 @@
|
||||||
|
import steps from '../../steps';
|
||||||
|
|
||||||
|
// step definitions that are shared between features should be moved to the
|
||||||
|
// tests/acceptance/steps/steps.js file
|
||||||
|
|
||||||
|
export default function(assert) {
|
||||||
|
return steps(assert).then('I should find a file', function() {
|
||||||
|
assert.ok(true, this.step);
|
||||||
|
});
|
||||||
|
}
|
|
@ -0,0 +1,10 @@
|
||||||
|
import steps from '../steps';
|
||||||
|
|
||||||
|
// step definitions that are shared between features should be moved to the
|
||||||
|
// tests/acceptance/steps/steps.js file
|
||||||
|
|
||||||
|
export default function(assert) {
|
||||||
|
return steps(assert).then('I should find a file', function() {
|
||||||
|
assert.ok(true, this.step);
|
||||||
|
});
|
||||||
|
}
|
|
@ -3,7 +3,7 @@
|
||||||
<head>
|
<head>
|
||||||
<meta charset="utf-8">
|
<meta charset="utf-8">
|
||||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||||
<title>ConsulUi Tests</title>
|
<title>Consul</title>
|
||||||
<meta name="description" content="">
|
<meta name="description" content="">
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||||
{{content-for "head"}}
|
{{content-for "head"}}
|
||||||
|
|
|
@ -109,6 +109,8 @@ export default {
|
||||||
nspaces: create(
|
nspaces: create(
|
||||||
nspaces(visitable, deletable, creatable, clickable, attribute, collection, text, freetextFilter)
|
nspaces(visitable, deletable, creatable, clickable, attribute, collection, text, freetextFilter)
|
||||||
),
|
),
|
||||||
nspace: create(nspace(visitable, submitable, deletable, cancelable)),
|
nspace: create(
|
||||||
|
nspace(visitable, submitable, deletable, cancelable, policySelector, roleSelector)
|
||||||
|
),
|
||||||
settings: create(settings(visitable, submitable)),
|
settings: create(settings(visitable, submitable)),
|
||||||
};
|
};
|
||||||
|
|
|
@ -1,8 +1,17 @@
|
||||||
export default function(visitable, submitable, deletable, cancelable) {
|
export default function(
|
||||||
|
visitable,
|
||||||
|
submitable,
|
||||||
|
deletable,
|
||||||
|
cancelable,
|
||||||
|
policySelector,
|
||||||
|
roleSelector
|
||||||
|
) {
|
||||||
return {
|
return {
|
||||||
visit: visitable(['/:dc/namespaces/:namespace', '/:dc/namespaces/create']),
|
visit: visitable(['/:dc/namespaces/:namespace', '/:dc/namespaces/create']),
|
||||||
...submitable({}, 'form > div'),
|
...submitable({}, 'form > div'),
|
||||||
...cancelable({}, 'form > div'),
|
...cancelable({}, 'form > div'),
|
||||||
...deletable({}, 'form > div'),
|
...deletable({}, 'form > div'),
|
||||||
|
policies: policySelector(),
|
||||||
|
roles: roleSelector(),
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
export default function(visitable, submitable) {
|
export default function(visitable, submitable) {
|
||||||
return submitable({
|
return submitable({
|
||||||
visit: visitable('/settings'),
|
visit: visitable('/setting'),
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
|
@ -40,6 +40,9 @@ export default function(scenario, assert, pauseUntil, find, currentURL, clipboar
|
||||||
.dom(document.querySelector(selector))
|
.dom(document.querySelector(selector))
|
||||||
.hasClass(cls, `Expected [class] to contain ${cls} on ${selector}`);
|
.hasClass(cls, `Expected [class] to contain ${cls} on ${selector}`);
|
||||||
})
|
})
|
||||||
|
.then([`I don't see the "$selector" element`], function(selector) {
|
||||||
|
assert.equal(document.querySelector(selector), null, `Expected not to see ${selector}`);
|
||||||
|
})
|
||||||
.then(['"$selector" doesn\'t have the "$class" class'], function(selector, cls) {
|
.then(['"$selector" doesn\'t have the "$class" class'], function(selector, cls) {
|
||||||
assert.ok(
|
assert.ok(
|
||||||
!document.querySelector(selector).classList.contains(cls),
|
!document.querySelector(selector).classList.contains(cls),
|
||||||
|
@ -66,5 +69,8 @@ export default function(scenario, assert, pauseUntil, find, currentURL, clipboar
|
||||||
}
|
}
|
||||||
const current = currentURL() || '';
|
const current = currentURL() || '';
|
||||||
assert.equal(current, url, `Expected the url to be ${url} was ${current}`);
|
assert.equal(current, url, `Expected the url to be ${url} was ${current}`);
|
||||||
|
})
|
||||||
|
.then(['the title should be "$title"'], function(title) {
|
||||||
|
assert.equal(document.title, title, `Expected the document.title to equal "${title}"`);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
|
@ -92,4 +92,108 @@ module('Unit | Utility | components/discovery-chain/get-resolvers', function() {
|
||||||
})
|
})
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
test('it finds subsets with failovers correctly', function(assert) {
|
||||||
|
return Promise.resolve({
|
||||||
|
Chain: {
|
||||||
|
ServiceName: 'service-name',
|
||||||
|
Namespace: 'default',
|
||||||
|
Datacenter: 'dc-1',
|
||||||
|
Protocol: 'http',
|
||||||
|
StartNode: '',
|
||||||
|
Nodes: {
|
||||||
|
'resolver:v2.dc-failover.default.dc-1': {
|
||||||
|
Type: 'resolver',
|
||||||
|
Name: 'v2.dc-failover.default.dc-1',
|
||||||
|
Resolver: {
|
||||||
|
Target: 'v2.dc-failover.defauilt.dc-1',
|
||||||
|
Failover: {
|
||||||
|
Targets: ['v2.dc-failover.default.dc-5', 'v2.dc-failover.default.dc-6'],
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
Targets: {
|
||||||
|
'v2.dc-failover.default.dc-1': {
|
||||||
|
ID: 'v2.dc-failover.default.dc-1',
|
||||||
|
Service: 'dc-failover',
|
||||||
|
Namespace: 'default',
|
||||||
|
Datacenter: 'dc-1',
|
||||||
|
Subset: {
|
||||||
|
Filter: '',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
'v2.dc-failover.default.dc-6': {
|
||||||
|
ID: 'v2.dc-failover.default.dc-6',
|
||||||
|
Service: 'dc-failover',
|
||||||
|
Namespace: 'default',
|
||||||
|
Datacenter: 'dc-6',
|
||||||
|
Subset: {
|
||||||
|
Filter: '',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}).then(function({ Chain }) {
|
||||||
|
const actual = getResolvers(dc, nspace, Chain.Targets, Chain.Nodes);
|
||||||
|
const expected = {
|
||||||
|
ID: 'dc-failover.default.dc-1',
|
||||||
|
Name: 'dc-failover',
|
||||||
|
Children: [
|
||||||
|
{
|
||||||
|
Subset: true,
|
||||||
|
ID: 'v2.dc-failover.default.dc-1',
|
||||||
|
Name: 'v2',
|
||||||
|
Failover: {
|
||||||
|
Type: 'Datacenter',
|
||||||
|
Targets: ['dc-5', 'dc-6'],
|
||||||
|
},
|
||||||
|
},
|
||||||
|
],
|
||||||
|
};
|
||||||
|
assert.deepEqual(actual[0], expected);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
test('it finds services with failovers correctly', function(assert) {
|
||||||
|
return Promise.resolve({
|
||||||
|
Chain: {
|
||||||
|
ServiceName: 'service-name',
|
||||||
|
Namespace: 'default',
|
||||||
|
Datacenter: 'dc-1',
|
||||||
|
Protocol: 'http',
|
||||||
|
StartNode: '',
|
||||||
|
Nodes: {
|
||||||
|
'resolver:dc-failover.default.dc-1': {
|
||||||
|
Type: 'resolver',
|
||||||
|
Name: 'dc-failover.default.dc-1',
|
||||||
|
Resolver: {
|
||||||
|
Target: 'dc-failover.defauilt.dc-1',
|
||||||
|
Failover: {
|
||||||
|
Targets: ['dc-failover.default.dc-5', 'dc-failover.default.dc-6'],
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
Targets: {
|
||||||
|
'dc-failover.default.dc-1': {
|
||||||
|
ID: 'dc-failover.default.dc-1',
|
||||||
|
Service: 'dc-failover',
|
||||||
|
Namespace: 'default',
|
||||||
|
Datacenter: 'dc-1',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}).then(function({ Chain }) {
|
||||||
|
const actual = getResolvers(dc, nspace, Chain.Targets, Chain.Nodes);
|
||||||
|
const expected = {
|
||||||
|
ID: 'dc-failover.default.dc-1',
|
||||||
|
Name: 'dc-failover',
|
||||||
|
Children: [],
|
||||||
|
Failover: {
|
||||||
|
Type: 'Datacenter',
|
||||||
|
Targets: ['dc-5', 'dc-6'],
|
||||||
|
},
|
||||||
|
};
|
||||||
|
assert.deepEqual(actual[0], expected);
|
||||||
|
});
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
198
ui-v2/yarn.lock
198
ui-v2/yarn.lock
|
@ -4082,6 +4082,18 @@ dedent@^0.7.0:
|
||||||
resolved "https://registry.yarnpkg.com/dedent/-/dedent-0.7.0.tgz#2495ddbaf6eb874abb0e1be9df22d2e5a544326c"
|
resolved "https://registry.yarnpkg.com/dedent/-/dedent-0.7.0.tgz#2495ddbaf6eb874abb0e1be9df22d2e5a544326c"
|
||||||
integrity sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw=
|
integrity sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw=
|
||||||
|
|
||||||
|
deep-equal@~1.1.1:
|
||||||
|
version "1.1.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.1.1.tgz#b5c98c942ceffaf7cb051e24e1434a25a2e6076a"
|
||||||
|
integrity sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==
|
||||||
|
dependencies:
|
||||||
|
is-arguments "^1.0.4"
|
||||||
|
is-date-object "^1.0.1"
|
||||||
|
is-regex "^1.0.4"
|
||||||
|
object-is "^1.0.1"
|
||||||
|
object-keys "^1.1.1"
|
||||||
|
regexp.prototype.flags "^1.2.0"
|
||||||
|
|
||||||
deep-extend@^0.6.0:
|
deep-extend@^0.6.0:
|
||||||
version "0.6.0"
|
version "0.6.0"
|
||||||
resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac"
|
resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac"
|
||||||
|
@ -4135,6 +4147,11 @@ define-property@^2.0.2:
|
||||||
is-descriptor "^1.0.2"
|
is-descriptor "^1.0.2"
|
||||||
isobject "^3.0.1"
|
isobject "^3.0.1"
|
||||||
|
|
||||||
|
defined@~1.0.0:
|
||||||
|
version "1.0.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/defined/-/defined-1.0.0.tgz#c98d9bcef75674188e110969151199e39b1fa693"
|
||||||
|
integrity sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=
|
||||||
|
|
||||||
del@^5.0.0:
|
del@^5.0.0:
|
||||||
version "5.1.0"
|
version "5.1.0"
|
||||||
resolved "https://registry.yarnpkg.com/del/-/del-5.1.0.tgz#d9487c94e367410e6eff2925ee58c0c84a75b3a7"
|
resolved "https://registry.yarnpkg.com/del/-/del-5.1.0.tgz#d9487c94e367410e6eff2925ee58c0c84a75b3a7"
|
||||||
|
@ -4263,6 +4280,13 @@ dot-prop@^4.1.0:
|
||||||
dependencies:
|
dependencies:
|
||||||
is-obj "^1.0.0"
|
is-obj "^1.0.0"
|
||||||
|
|
||||||
|
dotignore@~0.1.2:
|
||||||
|
version "0.1.2"
|
||||||
|
resolved "https://registry.yarnpkg.com/dotignore/-/dotignore-0.1.2.tgz#f942f2200d28c3a76fbdd6f0ee9f3257c8a2e905"
|
||||||
|
integrity sha512-UGGGWfSauusaVJC+8fgV+NVvBXkCTmVv7sk6nojDZZvuOUNGUy0Zk4UpHQD6EDjS0jpBwcACvH4eofvyzBcRDw==
|
||||||
|
dependencies:
|
||||||
|
minimatch "^3.0.4"
|
||||||
|
|
||||||
duplexer3@^0.1.4:
|
duplexer3@^0.1.4:
|
||||||
version "0.1.4"
|
version "0.1.4"
|
||||||
resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2"
|
resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2"
|
||||||
|
@ -4428,7 +4452,7 @@ ember-cli-babel-plugin-helpers@^1.0.0, ember-cli-babel-plugin-helpers@^1.1.0:
|
||||||
resolved "https://registry.yarnpkg.com/ember-cli-babel-plugin-helpers/-/ember-cli-babel-plugin-helpers-1.1.0.tgz#de3baedd093163b6c2461f95964888c1676325ac"
|
resolved "https://registry.yarnpkg.com/ember-cli-babel-plugin-helpers/-/ember-cli-babel-plugin-helpers-1.1.0.tgz#de3baedd093163b6c2461f95964888c1676325ac"
|
||||||
integrity sha512-Zr4my8Xn+CzO0gIuFNXji0eTRml5AxZUTDQz/wsNJ5AJAtyFWCY4QtKdoELNNbiCVGt1lq5yLiwTm4scGKu6xA==
|
integrity sha512-Zr4my8Xn+CzO0gIuFNXji0eTRml5AxZUTDQz/wsNJ5AJAtyFWCY4QtKdoELNNbiCVGt1lq5yLiwTm4scGKu6xA==
|
||||||
|
|
||||||
ember-cli-babel@^6.0.0, ember-cli-babel@^6.0.0-beta.4, ember-cli-babel@^6.0.0-beta.7, ember-cli-babel@^6.10.0, ember-cli-babel@^6.12.0, ember-cli-babel@^6.16.0, ember-cli-babel@^6.3.0, ember-cli-babel@^6.6.0, ember-cli-babel@^6.8.1, ember-cli-babel@^6.8.2, ember-cli-babel@^6.9.0, ember-cli-babel@^6.9.2:
|
ember-cli-babel@^6.0.0, ember-cli-babel@^6.0.0-beta.4, ember-cli-babel@^6.0.0-beta.7, ember-cli-babel@^6.10.0, ember-cli-babel@^6.11.0, ember-cli-babel@^6.12.0, ember-cli-babel@^6.16.0, ember-cli-babel@^6.3.0, ember-cli-babel@^6.6.0, ember-cli-babel@^6.8.1, ember-cli-babel@^6.8.2, ember-cli-babel@^6.9.0, ember-cli-babel@^6.9.2:
|
||||||
version "6.18.0"
|
version "6.18.0"
|
||||||
resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-6.18.0.tgz#3f6435fd275172edeff2b634ee7b29ce74318957"
|
resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-6.18.0.tgz#3f6435fd275172edeff2b634ee7b29ce74318957"
|
||||||
integrity sha512-7ceC8joNYxY2wES16iIBlbPSxwKDBhYwC8drU3ZEvuPDMwVv1KzxCNu1fvxyFEBWhwaRNTUxSCsEVoTd9nosGA==
|
integrity sha512-7ceC8joNYxY2wES16iIBlbPSxwKDBhYwC8drU3ZEvuPDMwVv1KzxCNu1fvxyFEBWhwaRNTUxSCsEVoTd9nosGA==
|
||||||
|
@ -4539,6 +4563,14 @@ ember-cli-get-component-path-option@^1.0.0:
|
||||||
resolved "https://registry.yarnpkg.com/ember-cli-get-component-path-option/-/ember-cli-get-component-path-option-1.0.0.tgz#0d7b595559e2f9050abed804f1d8eff1b08bc771"
|
resolved "https://registry.yarnpkg.com/ember-cli-get-component-path-option/-/ember-cli-get-component-path-option-1.0.0.tgz#0d7b595559e2f9050abed804f1d8eff1b08bc771"
|
||||||
integrity sha1-DXtZVVni+QUKvtgE8djv8bCLx3E=
|
integrity sha1-DXtZVVni+QUKvtgE8djv8bCLx3E=
|
||||||
|
|
||||||
|
ember-cli-head@^0.4.0:
|
||||||
|
version "0.4.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/ember-cli-head/-/ember-cli-head-0.4.1.tgz#28b7ee86439746640834b232a3b34ab1329f3cf3"
|
||||||
|
integrity sha512-MIgshw5nGil7Q/TU4SDRCsgsiA3wPC9WqOig/g1LlHTNXjR4vH7s/ddG7GTfK5Kt4ZQHJEUDXpd/lIbdBkIQ/Q==
|
||||||
|
dependencies:
|
||||||
|
ember-cli-babel "^6.11.0"
|
||||||
|
ember-cli-htmlbars "^2.0.3"
|
||||||
|
|
||||||
ember-cli-htmlbars-inline-precompile@^2.1.0:
|
ember-cli-htmlbars-inline-precompile@^2.1.0:
|
||||||
version "2.1.0"
|
version "2.1.0"
|
||||||
resolved "https://registry.yarnpkg.com/ember-cli-htmlbars-inline-precompile/-/ember-cli-htmlbars-inline-precompile-2.1.0.tgz#61b91ff1879d44ae504cadb46fb1f2604995ae08"
|
resolved "https://registry.yarnpkg.com/ember-cli-htmlbars-inline-precompile/-/ember-cli-htmlbars-inline-precompile-2.1.0.tgz#61b91ff1879d44ae504cadb46fb1f2604995ae08"
|
||||||
|
@ -4561,7 +4593,7 @@ ember-cli-htmlbars-inline-precompile@^3.0.0:
|
||||||
heimdalljs-logger "^0.1.9"
|
heimdalljs-logger "^0.1.9"
|
||||||
silent-error "^1.1.0"
|
silent-error "^1.1.0"
|
||||||
|
|
||||||
ember-cli-htmlbars@^2.0.1:
|
ember-cli-htmlbars@^2.0.1, ember-cli-htmlbars@^2.0.3:
|
||||||
version "2.0.5"
|
version "2.0.5"
|
||||||
resolved "https://registry.yarnpkg.com/ember-cli-htmlbars/-/ember-cli-htmlbars-2.0.5.tgz#b5a105429a6bce4f7c9c97b667e3b8926e31397f"
|
resolved "https://registry.yarnpkg.com/ember-cli-htmlbars/-/ember-cli-htmlbars-2.0.5.tgz#b5a105429a6bce4f7c9c97b667e3b8926e31397f"
|
||||||
integrity sha512-3f3PAxdnQ/fhQa8XP/3z4RLRgLHxV8j4Ln75aHbRdemOCjBa048KxL9l+acRLhCulbGQCMnLiIUIC89PAzLrcA==
|
integrity sha512-3f3PAxdnQ/fhQa8XP/3z4RLRgLHxV8j4Ln75aHbRdemOCjBa048KxL9l+acRLhCulbGQCMnLiIUIC89PAzLrcA==
|
||||||
|
@ -4904,6 +4936,13 @@ ember-computed-style@^0.3.0:
|
||||||
ember-compatibility-helpers "^1.2.0"
|
ember-compatibility-helpers "^1.2.0"
|
||||||
ember-maybe-import-regenerator "^0.1.5"
|
ember-maybe-import-regenerator "^0.1.5"
|
||||||
|
|
||||||
|
ember-copy@^1.0.0:
|
||||||
|
version "1.0.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/ember-copy/-/ember-copy-1.0.0.tgz#426554ba6cf65920f31d24d0a3ca2cb1be16e4aa"
|
||||||
|
integrity sha512-aiZNAvOmdemHdvZNn0b5b/0d9g3JFpcOsrDgfhYEbfd7SzE0b69YiaVK2y3wjqfjuuiA54vOllGN4pjSzECNSw==
|
||||||
|
dependencies:
|
||||||
|
ember-cli-babel "^6.6.0"
|
||||||
|
|
||||||
ember-data@~3.12.0:
|
ember-data@~3.12.0:
|
||||||
version "3.12.0"
|
version "3.12.0"
|
||||||
resolved "https://registry.yarnpkg.com/ember-data/-/ember-data-3.12.0.tgz#ce20c41163ce50124d12a4370641fd9b4a21c3e2"
|
resolved "https://registry.yarnpkg.com/ember-data/-/ember-data-3.12.0.tgz#ce20c41163ce50124d12a4370641fd9b4a21c3e2"
|
||||||
|
@ -5037,6 +5076,16 @@ ember-native-dom-helpers@^0.5.3:
|
||||||
broccoli-funnel "^1.1.0"
|
broccoli-funnel "^1.1.0"
|
||||||
ember-cli-babel "^6.6.0"
|
ember-cli-babel "^6.6.0"
|
||||||
|
|
||||||
|
ember-page-title@^5.1.0:
|
||||||
|
version "5.1.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/ember-page-title/-/ember-page-title-5.1.0.tgz#baf9fc00f95faf638f8493740a1f80daaa5007e9"
|
||||||
|
integrity sha512-Ou2kwvwlQdDxre20WUMDym54e+5r9g0lTINFiBZUavoBCOUYdBP711LbmmUIIlYblZTOb/TWadNEQZpd2DkIAg==
|
||||||
|
dependencies:
|
||||||
|
ember-cli-babel "^7.7.3"
|
||||||
|
ember-cli-head "^0.4.0"
|
||||||
|
ember-cli-htmlbars "^3.0.1"
|
||||||
|
ember-copy "^1.0.0"
|
||||||
|
|
||||||
ember-power-select-with-create@^0.6.0:
|
ember-power-select-with-create@^0.6.0:
|
||||||
version "0.6.2"
|
version "0.6.2"
|
||||||
resolved "https://registry.yarnpkg.com/ember-power-select-with-create/-/ember-power-select-with-create-0.6.2.tgz#05faf361c435f5c2c61c24e687aebddefd569897"
|
resolved "https://registry.yarnpkg.com/ember-power-select-with-create/-/ember-power-select-with-create-0.6.2.tgz#05faf361c435f5c2c61c24e687aebddefd569897"
|
||||||
|
@ -5337,6 +5386,23 @@ es-abstract@^1.13.0, es-abstract@^1.5.1:
|
||||||
string.prototype.trimleft "^2.0.0"
|
string.prototype.trimleft "^2.0.0"
|
||||||
string.prototype.trimright "^2.0.0"
|
string.prototype.trimright "^2.0.0"
|
||||||
|
|
||||||
|
es-abstract@^1.17.0-next.1:
|
||||||
|
version "1.17.4"
|
||||||
|
resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.17.4.tgz#e3aedf19706b20e7c2594c35fc0d57605a79e184"
|
||||||
|
integrity sha512-Ae3um/gb8F0mui/jPL+QiqmglkUsaQf7FwBEHYIFkztkneosu9imhqHpBzQ3h1vit8t5iQ74t6PEVvphBZiuiQ==
|
||||||
|
dependencies:
|
||||||
|
es-to-primitive "^1.2.1"
|
||||||
|
function-bind "^1.1.1"
|
||||||
|
has "^1.0.3"
|
||||||
|
has-symbols "^1.0.1"
|
||||||
|
is-callable "^1.1.5"
|
||||||
|
is-regex "^1.0.5"
|
||||||
|
object-inspect "^1.7.0"
|
||||||
|
object-keys "^1.1.1"
|
||||||
|
object.assign "^4.1.0"
|
||||||
|
string.prototype.trimleft "^2.1.1"
|
||||||
|
string.prototype.trimright "^2.1.1"
|
||||||
|
|
||||||
es-to-primitive@^1.2.0:
|
es-to-primitive@^1.2.0:
|
||||||
version "1.2.0"
|
version "1.2.0"
|
||||||
resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.0.tgz#edf72478033456e8dda8ef09e00ad9650707f377"
|
resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.0.tgz#edf72478033456e8dda8ef09e00ad9650707f377"
|
||||||
|
@ -5346,6 +5412,15 @@ es-to-primitive@^1.2.0:
|
||||||
is-date-object "^1.0.1"
|
is-date-object "^1.0.1"
|
||||||
is-symbol "^1.0.2"
|
is-symbol "^1.0.2"
|
||||||
|
|
||||||
|
es-to-primitive@^1.2.1:
|
||||||
|
version "1.2.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a"
|
||||||
|
integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==
|
||||||
|
dependencies:
|
||||||
|
is-callable "^1.1.4"
|
||||||
|
is-date-object "^1.0.1"
|
||||||
|
is-symbol "^1.0.2"
|
||||||
|
|
||||||
escape-html@~1.0.3:
|
escape-html@~1.0.3:
|
||||||
version "1.0.3"
|
version "1.0.3"
|
||||||
resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988"
|
resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988"
|
||||||
|
@ -5984,6 +6059,13 @@ follow-redirects@^1.0.0:
|
||||||
dependencies:
|
dependencies:
|
||||||
debug "^3.0.0"
|
debug "^3.0.0"
|
||||||
|
|
||||||
|
for-each@~0.3.3:
|
||||||
|
version "0.3.3"
|
||||||
|
resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e"
|
||||||
|
integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==
|
||||||
|
dependencies:
|
||||||
|
is-callable "^1.1.3"
|
||||||
|
|
||||||
for-in@^1.0.2:
|
for-in@^1.0.2:
|
||||||
version "1.0.2"
|
version "1.0.2"
|
||||||
resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80"
|
resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80"
|
||||||
|
@ -6165,7 +6247,7 @@ fstream@^1.0.0, fstream@^1.0.12:
|
||||||
mkdirp ">=0.5 0"
|
mkdirp ">=0.5 0"
|
||||||
rimraf "2"
|
rimraf "2"
|
||||||
|
|
||||||
function-bind@^1.0.2, function-bind@^1.1.1:
|
function-bind@^1.0.2, function-bind@^1.1.1, function-bind@~1.1.1:
|
||||||
version "1.1.1"
|
version "1.1.1"
|
||||||
resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d"
|
resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d"
|
||||||
integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==
|
integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==
|
||||||
|
@ -6312,7 +6394,7 @@ glob@^7.0.0, glob@^7.0.3, glob@^7.0.4, glob@^7.1.2, glob@^7.1.4, glob@~7.1.1:
|
||||||
once "^1.3.0"
|
once "^1.3.0"
|
||||||
path-is-absolute "^1.0.0"
|
path-is-absolute "^1.0.0"
|
||||||
|
|
||||||
glob@^7.1.3:
|
glob@^7.1.3, glob@~7.1.6:
|
||||||
version "7.1.6"
|
version "7.1.6"
|
||||||
resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6"
|
resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6"
|
||||||
integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==
|
integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==
|
||||||
|
@ -6517,6 +6599,11 @@ has-symbols@^1.0.0:
|
||||||
resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.0.tgz#ba1a8f1af2a0fc39650f5c850367704122063b44"
|
resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.0.tgz#ba1a8f1af2a0fc39650f5c850367704122063b44"
|
||||||
integrity sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=
|
integrity sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=
|
||||||
|
|
||||||
|
has-symbols@^1.0.1:
|
||||||
|
version "1.0.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.1.tgz#9f5214758a44196c406d9bd76cebf81ec2dd31e8"
|
||||||
|
integrity sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==
|
||||||
|
|
||||||
has-to-string-tag-x@^1.2.0:
|
has-to-string-tag-x@^1.2.0:
|
||||||
version "1.4.1"
|
version "1.4.1"
|
||||||
resolved "https://registry.yarnpkg.com/has-to-string-tag-x/-/has-to-string-tag-x-1.4.1.tgz#a045ab383d7b4b2012a00148ab0aa5f290044d4d"
|
resolved "https://registry.yarnpkg.com/has-to-string-tag-x/-/has-to-string-tag-x-1.4.1.tgz#a045ab383d7b4b2012a00148ab0aa5f290044d4d"
|
||||||
|
@ -6560,7 +6647,7 @@ has-values@^1.0.0:
|
||||||
is-number "^3.0.0"
|
is-number "^3.0.0"
|
||||||
kind-of "^4.0.0"
|
kind-of "^4.0.0"
|
||||||
|
|
||||||
has@^1.0.1, has@^1.0.3:
|
has@^1.0.1, has@^1.0.3, has@~1.0.3:
|
||||||
version "1.0.3"
|
version "1.0.3"
|
||||||
resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796"
|
resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796"
|
||||||
integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==
|
integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==
|
||||||
|
@ -6853,7 +6940,7 @@ inflight@^1.0.4:
|
||||||
once "^1.3.0"
|
once "^1.3.0"
|
||||||
wrappy "1"
|
wrappy "1"
|
||||||
|
|
||||||
inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.0, inherits@~2.0.1, inherits@~2.0.3:
|
inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.0, inherits@~2.0.1, inherits@~2.0.3, inherits@~2.0.4:
|
||||||
version "2.0.4"
|
version "2.0.4"
|
||||||
resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c"
|
resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c"
|
||||||
integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
|
integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
|
||||||
|
@ -6962,6 +7049,11 @@ is-accessor-descriptor@^1.0.0:
|
||||||
dependencies:
|
dependencies:
|
||||||
kind-of "^6.0.0"
|
kind-of "^6.0.0"
|
||||||
|
|
||||||
|
is-arguments@^1.0.4:
|
||||||
|
version "1.0.4"
|
||||||
|
resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.0.4.tgz#3faf966c7cba0ff437fb31f6250082fcf0448cf3"
|
||||||
|
integrity sha512-xPh0Rmt8NE65sNzvyUmWgI1tz3mKq74lGA0mL8LYZcoIzKOzDh6HmrYm3d18k60nHerC8A9Km8kYu87zfSFnLA==
|
||||||
|
|
||||||
is-arrayish@^0.2.1:
|
is-arrayish@^0.2.1:
|
||||||
version "0.2.1"
|
version "0.2.1"
|
||||||
resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d"
|
resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d"
|
||||||
|
@ -6984,6 +7076,11 @@ is-buffer@~2.0.3:
|
||||||
resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.3.tgz#4ecf3fcf749cbd1e472689e109ac66261a25e725"
|
resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.3.tgz#4ecf3fcf749cbd1e472689e109ac66261a25e725"
|
||||||
integrity sha512-U15Q7MXTuZlrbymiz95PJpZxu8IlipAp4dtS3wOdgPXx3mqBnslrWU14kxfHB+Py/+2PVKSr37dMAgM2A4uArw==
|
integrity sha512-U15Q7MXTuZlrbymiz95PJpZxu8IlipAp4dtS3wOdgPXx3mqBnslrWU14kxfHB+Py/+2PVKSr37dMAgM2A4uArw==
|
||||||
|
|
||||||
|
is-callable@^1.1.3, is-callable@^1.1.5:
|
||||||
|
version "1.1.5"
|
||||||
|
resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.5.tgz#f7e46b596890456db74e7f6e976cb3273d06faab"
|
||||||
|
integrity sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==
|
||||||
|
|
||||||
is-callable@^1.1.4:
|
is-callable@^1.1.4:
|
||||||
version "1.1.4"
|
version "1.1.4"
|
||||||
resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.4.tgz#1e1adf219e1eeb684d691f9d6a05ff0d30a24d75"
|
resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.4.tgz#1e1adf219e1eeb684d691f9d6a05ff0d30a24d75"
|
||||||
|
@ -7156,6 +7253,13 @@ is-regex@^1.0.4:
|
||||||
dependencies:
|
dependencies:
|
||||||
has "^1.0.1"
|
has "^1.0.1"
|
||||||
|
|
||||||
|
is-regex@^1.0.5, is-regex@~1.0.5:
|
||||||
|
version "1.0.5"
|
||||||
|
resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.5.tgz#39d589a358bf18967f726967120b8fc1aed74eae"
|
||||||
|
integrity sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==
|
||||||
|
dependencies:
|
||||||
|
has "^1.0.3"
|
||||||
|
|
||||||
is-regexp@^1.0.0:
|
is-regexp@^1.0.0:
|
||||||
version "1.0.0"
|
version "1.0.0"
|
||||||
resolved "https://registry.yarnpkg.com/is-regexp/-/is-regexp-1.0.0.tgz#fd2d883545c46bac5a633e7b9a09e87fa2cb5069"
|
resolved "https://registry.yarnpkg.com/is-regexp/-/is-regexp-1.0.0.tgz#fd2d883545c46bac5a633e7b9a09e87fa2cb5069"
|
||||||
|
@ -8303,7 +8407,7 @@ minimist@0.0.8:
|
||||||
resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d"
|
resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d"
|
||||||
integrity sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=
|
integrity sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=
|
||||||
|
|
||||||
minimist@^1.1.1, minimist@^1.1.3, minimist@^1.2.0:
|
minimist@^1.1.1, minimist@^1.1.3, minimist@^1.2.0, minimist@~1.2.0:
|
||||||
version "1.2.0"
|
version "1.2.0"
|
||||||
resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284"
|
resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284"
|
||||||
integrity sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=
|
integrity sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=
|
||||||
|
@ -8794,6 +8898,16 @@ object-inspect@^1.6.0:
|
||||||
resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.6.0.tgz#c70b6cbf72f274aab4c34c0c82f5167bf82cf15b"
|
resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.6.0.tgz#c70b6cbf72f274aab4c34c0c82f5167bf82cf15b"
|
||||||
integrity sha512-GJzfBZ6DgDAmnuaM3104jR4s1Myxr3Y3zfIyN4z3UdqN69oSRacNK8UhnobDdC+7J2AHCjGwxQubNJfE70SXXQ==
|
integrity sha512-GJzfBZ6DgDAmnuaM3104jR4s1Myxr3Y3zfIyN4z3UdqN69oSRacNK8UhnobDdC+7J2AHCjGwxQubNJfE70SXXQ==
|
||||||
|
|
||||||
|
object-inspect@^1.7.0, object-inspect@~1.7.0:
|
||||||
|
version "1.7.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.7.0.tgz#f4f6bd181ad77f006b5ece60bd0b6f398ff74a67"
|
||||||
|
integrity sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw==
|
||||||
|
|
||||||
|
object-is@^1.0.1:
|
||||||
|
version "1.0.2"
|
||||||
|
resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.0.2.tgz#6b80eb84fe451498f65007982f035a5b445edec4"
|
||||||
|
integrity sha512-Epah+btZd5wrrfjkJZq1AOB9O6OxUQto45hzFd7lXGrpHPGE0W1k+426yrZV+k6NJOzLNNW/nVsmZdIWsAqoOQ==
|
||||||
|
|
||||||
object-keys@^1.0.11, object-keys@^1.0.12, object-keys@^1.1.1:
|
object-keys@^1.0.11, object-keys@^1.0.12, object-keys@^1.1.1:
|
||||||
version "1.1.1"
|
version "1.1.1"
|
||||||
resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e"
|
resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e"
|
||||||
|
@ -9761,6 +9875,14 @@ regexp-tree@^0.1.6:
|
||||||
resolved "https://registry.yarnpkg.com/regexp-tree/-/regexp-tree-0.1.13.tgz#5b19ab9377edc68bc3679256840bb29afc158d7f"
|
resolved "https://registry.yarnpkg.com/regexp-tree/-/regexp-tree-0.1.13.tgz#5b19ab9377edc68bc3679256840bb29afc158d7f"
|
||||||
integrity sha512-hwdV/GQY5F8ReLZWO+W1SRoN5YfpOKY6852+tBFcma72DKBIcHjPRIlIvQN35bCOljuAfP2G2iB0FC/w236mUw==
|
integrity sha512-hwdV/GQY5F8ReLZWO+W1SRoN5YfpOKY6852+tBFcma72DKBIcHjPRIlIvQN35bCOljuAfP2G2iB0FC/w236mUw==
|
||||||
|
|
||||||
|
regexp.prototype.flags@^1.2.0:
|
||||||
|
version "1.3.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.3.0.tgz#7aba89b3c13a64509dabcf3ca8d9fbb9bdf5cb75"
|
||||||
|
integrity sha512-2+Q0C5g951OlYlJz6yu5/M33IcsESLlLfsyIaLJaG4FA2r4yP8MvVMJUUP/fVBkSpbbbZlS5gynbEWLipiiXiQ==
|
||||||
|
dependencies:
|
||||||
|
define-properties "^1.1.3"
|
||||||
|
es-abstract "^1.17.0-next.1"
|
||||||
|
|
||||||
regexpp@^2.0.1:
|
regexpp@^2.0.1:
|
||||||
version "2.0.1"
|
version "2.0.1"
|
||||||
resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-2.0.1.tgz#8d19d31cf632482b589049f8281f93dbcba4d07f"
|
resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-2.0.1.tgz#8d19d31cf632482b589049f8281f93dbcba4d07f"
|
||||||
|
@ -9965,6 +10087,13 @@ resolve@^1.10.0, resolve@^1.3.3:
|
||||||
dependencies:
|
dependencies:
|
||||||
path-parse "^1.0.6"
|
path-parse "^1.0.6"
|
||||||
|
|
||||||
|
resolve@~1.14.2:
|
||||||
|
version "1.14.2"
|
||||||
|
resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.14.2.tgz#dbf31d0fa98b1f29aa5169783b9c290cb865fea2"
|
||||||
|
integrity sha512-EjlOBLBO1kxsUxsKjLt7TAECyKW6fOh1VRkykQkKGzcBbjjPIxBqGh0jf7GJ3k/f5mxMqW3htMD3WdTUVtW8HQ==
|
||||||
|
dependencies:
|
||||||
|
path-parse "^1.0.6"
|
||||||
|
|
||||||
responselike@1.0.2:
|
responselike@1.0.2:
|
||||||
version "1.0.2"
|
version "1.0.2"
|
||||||
resolved "https://registry.yarnpkg.com/responselike/-/responselike-1.0.2.tgz#918720ef3b631c5642be068f15ade5a46f4ba1e7"
|
resolved "https://registry.yarnpkg.com/responselike/-/responselike-1.0.2.tgz#918720ef3b631c5642be068f15ade5a46f4ba1e7"
|
||||||
|
@ -9980,6 +10109,13 @@ restore-cursor@^2.0.0:
|
||||||
onetime "^2.0.0"
|
onetime "^2.0.0"
|
||||||
signal-exit "^3.0.2"
|
signal-exit "^3.0.2"
|
||||||
|
|
||||||
|
resumer@~0.0.0:
|
||||||
|
version "0.0.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/resumer/-/resumer-0.0.0.tgz#f1e8f461e4064ba39e82af3cdc2a8c893d076759"
|
||||||
|
integrity sha1-8ej0YeQGS6Oegq883CqMiT0HZ1k=
|
||||||
|
dependencies:
|
||||||
|
through "~2.3.4"
|
||||||
|
|
||||||
ret@~0.1.10:
|
ret@~0.1.10:
|
||||||
version "0.1.15"
|
version "0.1.15"
|
||||||
resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc"
|
resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc"
|
||||||
|
@ -10718,6 +10854,15 @@ string-width@^3.0.0:
|
||||||
is-fullwidth-code-point "^2.0.0"
|
is-fullwidth-code-point "^2.0.0"
|
||||||
strip-ansi "^5.1.0"
|
strip-ansi "^5.1.0"
|
||||||
|
|
||||||
|
string.prototype.trim@~1.2.1:
|
||||||
|
version "1.2.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.1.tgz#141233dff32c82bfad80684d7e5f0869ee0fb782"
|
||||||
|
integrity sha512-MjGFEeqixw47dAMFMtgUro/I0+wNqZB5GKXGt1fFr24u3TzDXCPu7J9Buppzoe3r/LqkSDLDDJzE15RGWDGAVw==
|
||||||
|
dependencies:
|
||||||
|
define-properties "^1.1.3"
|
||||||
|
es-abstract "^1.17.0-next.1"
|
||||||
|
function-bind "^1.1.1"
|
||||||
|
|
||||||
string.prototype.trimleft@^2.0.0:
|
string.prototype.trimleft@^2.0.0:
|
||||||
version "2.0.0"
|
version "2.0.0"
|
||||||
resolved "https://registry.yarnpkg.com/string.prototype.trimleft/-/string.prototype.trimleft-2.0.0.tgz#68b6aa8e162c6a80e76e3a8a0c2e747186e271ff"
|
resolved "https://registry.yarnpkg.com/string.prototype.trimleft/-/string.prototype.trimleft-2.0.0.tgz#68b6aa8e162c6a80e76e3a8a0c2e747186e271ff"
|
||||||
|
@ -10726,6 +10871,14 @@ string.prototype.trimleft@^2.0.0:
|
||||||
define-properties "^1.1.2"
|
define-properties "^1.1.2"
|
||||||
function-bind "^1.0.2"
|
function-bind "^1.0.2"
|
||||||
|
|
||||||
|
string.prototype.trimleft@^2.1.1:
|
||||||
|
version "2.1.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/string.prototype.trimleft/-/string.prototype.trimleft-2.1.1.tgz#9bdb8ac6abd6d602b17a4ed321870d2f8dcefc74"
|
||||||
|
integrity sha512-iu2AGd3PuP5Rp7x2kEZCrB2Nf41ehzh+goo8TV7z8/XDBbsvc6HQIlUl9RjkZ4oyrW1XM5UwlGl1oVEaDjg6Ag==
|
||||||
|
dependencies:
|
||||||
|
define-properties "^1.1.3"
|
||||||
|
function-bind "^1.1.1"
|
||||||
|
|
||||||
string.prototype.trimright@^2.0.0:
|
string.prototype.trimright@^2.0.0:
|
||||||
version "2.0.0"
|
version "2.0.0"
|
||||||
resolved "https://registry.yarnpkg.com/string.prototype.trimright/-/string.prototype.trimright-2.0.0.tgz#ab4a56d802a01fbe7293e11e84f24dc8164661dd"
|
resolved "https://registry.yarnpkg.com/string.prototype.trimright/-/string.prototype.trimright-2.0.0.tgz#ab4a56d802a01fbe7293e11e84f24dc8164661dd"
|
||||||
|
@ -10734,6 +10887,14 @@ string.prototype.trimright@^2.0.0:
|
||||||
define-properties "^1.1.2"
|
define-properties "^1.1.2"
|
||||||
function-bind "^1.0.2"
|
function-bind "^1.0.2"
|
||||||
|
|
||||||
|
string.prototype.trimright@^2.1.1:
|
||||||
|
version "2.1.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/string.prototype.trimright/-/string.prototype.trimright-2.1.1.tgz#440314b15996c866ce8a0341894d45186200c5d9"
|
||||||
|
integrity sha512-qFvWL3/+QIgZXVmJBfpHmxLB7xsUXz6HsUmP8+5dRaC3Q7oKUv9Vo6aMCRZC1smrtyECFsIT30PqBJ1gTjAs+g==
|
||||||
|
dependencies:
|
||||||
|
define-properties "^1.1.3"
|
||||||
|
function-bind "^1.1.1"
|
||||||
|
|
||||||
string_decoder@0.10, string_decoder@~0.10.x:
|
string_decoder@0.10, string_decoder@~0.10.x:
|
||||||
version "0.10.31"
|
version "0.10.31"
|
||||||
resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94"
|
resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94"
|
||||||
|
@ -10908,6 +11069,27 @@ tapable@^1.0.0, tapable@^1.1.0:
|
||||||
resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.3.tgz#a1fccc06b58db61fd7a45da2da44f5f3a3e67ba2"
|
resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.3.tgz#a1fccc06b58db61fd7a45da2da44f5f3a3e67ba2"
|
||||||
integrity sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==
|
integrity sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==
|
||||||
|
|
||||||
|
tape@^4.13.0:
|
||||||
|
version "4.13.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/tape/-/tape-4.13.0.tgz#e2f581ff5f12a7cbd787e9f83c76c2851782fce2"
|
||||||
|
integrity sha512-J/hvA+GJnuWJ0Sj8Z0dmu3JgMNU+MmusvkCT7+SN4/2TklW18FNCp/UuHIEhPZwHfy4sXfKYgC7kypKg4umbOw==
|
||||||
|
dependencies:
|
||||||
|
deep-equal "~1.1.1"
|
||||||
|
defined "~1.0.0"
|
||||||
|
dotignore "~0.1.2"
|
||||||
|
for-each "~0.3.3"
|
||||||
|
function-bind "~1.1.1"
|
||||||
|
glob "~7.1.6"
|
||||||
|
has "~1.0.3"
|
||||||
|
inherits "~2.0.4"
|
||||||
|
is-regex "~1.0.5"
|
||||||
|
minimist "~1.2.0"
|
||||||
|
object-inspect "~1.7.0"
|
||||||
|
resolve "~1.14.2"
|
||||||
|
resumer "~0.0.0"
|
||||||
|
string.prototype.trim "~1.2.1"
|
||||||
|
through "~2.3.8"
|
||||||
|
|
||||||
tar@^2.0.0:
|
tar@^2.0.0:
|
||||||
version "2.2.2"
|
version "2.2.2"
|
||||||
resolved "https://registry.yarnpkg.com/tar/-/tar-2.2.2.tgz#0ca8848562c7299b8b446ff6a4d60cdbb23edc40"
|
resolved "https://registry.yarnpkg.com/tar/-/tar-2.2.2.tgz#0ca8848562c7299b8b446ff6a4d60cdbb23edc40"
|
||||||
|
@ -11045,7 +11227,7 @@ through2@^3.0.1:
|
||||||
dependencies:
|
dependencies:
|
||||||
readable-stream "2 || 3"
|
readable-stream "2 || 3"
|
||||||
|
|
||||||
through@^2.3.6:
|
through@^2.3.6, through@~2.3.4, through@~2.3.8:
|
||||||
version "2.3.8"
|
version "2.3.8"
|
||||||
resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5"
|
resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5"
|
||||||
integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=
|
integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=
|
||||||
|
|
Loading…
Reference in New Issue