ui: Read-only CRD/Centralized Config Intentions (#8659)

This commit is contained in:
John Cowen 2020-09-18 11:14:06 +01:00 committed by GitHub
parent c6fa758d6f
commit 65f2cd891b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
68 changed files with 1331 additions and 394 deletions

View File

@ -7,10 +7,14 @@
}}
{{else}}
<span data-test-external-source={{externalSource}} class="consul-external-source {{externalSource}}">
{{#if (eq externalSource 'aws')}}
<span>Registered via {{uppercase externalSource}}</span>
{{#if label}}
{{label}}
{{else}}
<span>Registered via {{capitalize externalSource}}</span>
{{#if (eq externalSource 'aws')}}
<span>Registered via {{uppercase externalSource}}</span>
{{else}}
<span>Registered via {{capitalize externalSource}}</span>
{{/if}}
{{/if}}
</span>
{{/if}}

View File

@ -0,0 +1,170 @@
<div
...attributes
class="consul-intention-fieldsets"
>
<fieldset disabled={{disabled}}>
<div role="group">
<fieldset>
<h2>Source</h2>
<label data-test-source-element class="type-select{{if item.error.SourceName ' has-error'}}">
<span>Source Service</span>
<PowerSelectWithCreate
@options={{services}}
@searchField="Name"
@selected={{SourceName}}
@searchPlaceholder="Type service name"
@buildSuggestion={{action "createNewLabel" "Use a Consul Service called '{{term}}'"}}
@showCreateWhen={{action "isUnique" services}}
@onCreate={{action onchange "SourceName"}}
@onChange={{action onchange "SourceName"}} as |service|>
{{#if (eq service.Name '*') }}
* (All Services)
{{else}}
{{service.Name}}
{{/if}}
</PowerSelectWithCreate>
<em>Search for an existing service, or enter any Service name.</em>
</label>
{{#if (env 'CONSUL_NSPACES_ENABLED')}}
<label data-test-source-nspace class="type-select{{if item.error.SourceNS ' has-error'}}">
<span>Source Namespace</span>
<PowerSelectWithCreate
@options={{nspaces}}
@searchField="Name"
@selected={{SourceNS}}
@searchPlaceholder="Type namespace name"
@buildSuggestion={{action "createNewLabel" "Use a Consul Namespace called '{{term}}'"}}
@showCreateWhen={{action "isUnique" nspaces}}
@onCreate={{action onchange "SourceNS"}}
@onChange={{action onchange "SourceNS"}} as |nspace|>
{{#if (eq nspace.Name '*') }}
* (All Namespaces)
{{else}}
{{nspace.Name}}
{{/if}}
</PowerSelectWithCreate>
<em>Search for an existing namespace, or enter any Namespace name.</em>
</label>
{{/if}}
</fieldset>
<fieldset>
<h2>Destination</h2>
<label data-test-destination-element class="type-select{{if item.error.DestinationName ' has-error'}}">
<span>Destination Service</span>
<PowerSelectWithCreate
@options={{services}}
@searchField="Name"
@selected={{DestinationName}}
@searchPlaceholder="Type service name"
@buildSuggestion={{action "createNewLabel" "Use a Consul Service called '{{term}}'"}}
@showCreateWhen={{action "isUnique" services}}
@onCreate={{action onchange "DestinationName"}}
@onChange={{action onchange "DestinationName"}} as |service|>
{{#if (eq service.Name '*') }}
* (All Services)
{{else}}
{{service.Name}}
{{/if}}
</PowerSelectWithCreate>
<em>Search for an existing service, or enter any Service name.</em>
</label>
{{#if (env 'CONSUL_NSPACES_ENABLED')}}
<label data-test-destination-nspace class="type-select{{if item.error.DestinationNS ' has-error'}}">
<span>Destination Namespace</span>
<PowerSelectWithCreate
@options={{nspaces}}
@searchField="Name"
@selected={{DestinationNS}}
@searchPlaceholder="Type namespace name"
@buildSuggestion={{action "createNewLabel" "Use a future Consul Namespace called '{{term}}'"}}
@showCreateWhen={{action "isUnique" nspaces}}
@onCreate={{action onchange "DestinationNS"}}
@onChange={{action onchange "DestinationNS"}} as |nspace|>
{{#if (eq nspace.Name '*') }}
* (All Namespaces)
{{else}}
{{nspace.Name}}
{{/if}}
</PowerSelectWithCreate>
<em>For the destination, you may choose any namespace for which you have access.</em>
</label>
{{/if}}
</fieldset>
</div>
<div>
<span class="label">Should this source connect to the destination?</span>
<div role="radiogroup" class={{if item.error.Action ' has-error'}}>
{{#each
(array
(hash
intent="allow"
header="Allow"
body="The source service will be allowed to connect to the destination."
)
(hash
intent="deny"
header="Deny"
body="The source service will not be allowed to connect to the destination."
)
)
as |_action|}}
<RadioCard
class={{concat 'value-' _action.intent}}
@value={{_action.intent}}
@checked={{if (eq item.Action _action.intent) 'checked'}}
@onchange={{action onchange}}
@name="Action"
as |radio|>
<header>
{{_action.header}}
</header>
<p>
{{_action.body}}
</p>
</RadioCard>
{{/each}}
</div>
</div>
<label class="type-text{{if item.error.Description ' has-error'}}">
<span>Description (Optional)</span>
<input type="text" name="Description" value={{item.Description}} placeholder="Description (Optional)" onchange={{action onchange}} />
</label>
</fieldset>
{{#if (not item.Legacy)}}
<fieldset>
<h2>Permissions</h2>
{{#if (gt item.Permissions.length 0) }}
<div class="notice info">
<p>
Permissions are L7 attributes. If any of the following permissions match the request, the Intention will apply. Requests that fail to match any of the provided routes will do the opposite of the allow/deny action above.
</p>
<p>
<a href="{{env 'CONSUL_DOCS_URL'}}/guides/acl-migrate-tokens.html" target="_blank" rel="noopener noreferrer">documentation</a>
</p>
</div>
<ConsulIntentionPermissionList @items={{item.Permissions}} />
{{else}}
<EmptyState>
<BlockSlot @name="header">
<h3>
Add permissions via CLI
</h3>
</BlockSlot>
<BlockSlot @name="body">
<p>
Permissions intercept an Intention's traffic using L7 criteria, such as path prefixes and http headers. You can use the CLI to add permissions to this intention.
</p>
</BlockSlot>
<BlockSlot @name="actions">
<li class="docs-link">
<a href="{{env 'CONSUL_DOCS_URL'}}/commands/intention" rel="noopener noreferrer" target="_blank">Documentation</a>
</li>
<li class="learn-link">
<a href="{{env 'CONSUL_DOCS_LEARN_URL'}}/consul/getting-started/connect" rel="noopener noreferrer" target="_blank">Read the guide</a>
</li>
</BlockSlot>
</EmptyState>
{{/if}}
</fieldset>
{{/if}}
</div>

View File

@ -0,0 +1,13 @@
import Component from '@ember/component';
export default Component.extend({
tagName: '',
actions: {
createNewLabel: function(template, term) {
return template.replace(/{{term}}/g, term);
},
isUnique: function(items, term) {
return !items.findBy('Name', term);
},
},
});

View File

@ -27,129 +27,36 @@
</BlockSlot>
<BlockSlot @name="form">
{{#let api.data as |item|}}
{{#if item.IsEditable}}
<DataSource
@src={{concat '/' nspace '/' dc '/services'}}
@onchange={{action "createServices" api.data}}
@onchange={{action "createServices" item}}
/>
{{#if (env 'CONSUL_NSPACES_ENABLED')}}
<DataSource
@src="/*/*/namespaces"
@onchange={{action "createNspaces" api.data}}
@onchange={{action "createNspaces" item}}
/>
{{/if}}
<form onsubmit={{action api.submit}}>
<fieldset disabled={{api.disabled}}>
<div role="group">
<fieldset>
<h2>Source</h2>
<label data-test-source-element class="type-select{{if api.data.error.SourceName ' has-error'}}">
<span>Source Service</span>
<PowerSelectWithCreate
@options={{services}}
@searchField="Name"
@selected={{SourceName}}
@searchPlaceholder="Type service name"
@buildSuggestion={{action "createNewLabel" "Use a Consul Service called '{{term}}'"}}
@showCreateWhen={{action "isUnique" services}}
@onCreate={{action api.change "SourceName"}}
@onChange={{action api.change "SourceName"}} as |service|>
{{#if (eq service.Name '*') }}
* (All Services)
{{else}}
{{service.Name}}
{{/if}}
</PowerSelectWithCreate>
<em>Search for an existing service, or enter any Service name.</em>
</label>
{{#if (env 'CONSUL_NSPACES_ENABLED')}}
<label data-test-source-nspace class="type-select{{if api.data.error.SourceNS ' has-error'}}">
<span>Source Namespace</span>
<PowerSelectWithCreate
@options={{nspaces}}
@searchField="Name"
@selected={{SourceNS}}
@searchPlaceholder="Type namespace name"
@buildSuggestion={{action "createNewLabel" "Use a Consul Namespace called '{{term}}'"}}
@showCreateWhen={{action "isUnique" nspaces}}
@onCreate={{action api.change "SourceNS"}}
@onChange={{action api.change "SourceNS"}} as |nspace|>
{{#if (eq nspace.Name '*') }}
* (All Namespaces)
{{else}}
{{nspace.Name}}
{{/if}}
</PowerSelectWithCreate>
<em>Search for an existing namespace, or enter any Namespace name.</em>
</label>
{{/if}}
</fieldset>
<fieldset>
<h2>Destination</h2>
<label data-test-destination-element class="type-select{{if api.data.error.DestinationName ' has-error'}}">
<span>Destination Service</span>
<PowerSelectWithCreate
@options={{services}}
@searchField="Name"
@selected={{DestinationName}}
@searchPlaceholder="Type service name"
@buildSuggestion={{action "createNewLabel" "Use a Consul Service called '{{term}}'"}}
@showCreateWhen={{action "isUnique" services}}
@onCreate={{action api.change "DestinationName"}}
@onChange={{action api.change "DestinationName"}} as |service|>
{{#if (eq service.Name '*') }}
* (All Services)
{{else}}
{{service.Name}}
{{/if}}
</PowerSelectWithCreate>
<em>Search for an existing service, or enter any Service name.</em>
</label>
{{#if (env 'CONSUL_NSPACES_ENABLED')}}
<label data-test-destination-nspace class="type-select{{if api.data.error.DestinationNS ' has-error'}}">
<span>Destination Namespace</span>
<PowerSelectWithCreate
@options={{nspaces}}
@searchField="Name"
@selected={{DestinationNS}}
@searchPlaceholder="Type namespace name"
@buildSuggestion={{action "createNewLabel" "Use a future Consul Namespace called '{{term}}'"}}
@showCreateWhen={{action "isUnique" nspaces}}
@onCreate={{action api.change "DestinationNS"}}
@onChange={{action api.change "DestinationNS"}} as |nspace|>
{{#if (eq nspace.Name '*') }}
* (All Namespaces)
{{else}}
{{nspace.Name}}
{{/if}}
</PowerSelectWithCreate>
<em>For the destination, you may choose any namespace for which you have access.</em>
</label>
{{/if}}
</fieldset>
</div>
<div role="radiogroup" class={{if api.data.error.Action ' has-error'}}>
{{#each (array 'allow' 'deny') as |intent|}}
<label>
<span>{{capitalize intent}}</span>
<input type="radio" name="Action" value={{intent}} checked={{if (eq api.data.Action intent) 'checked'}} onchange={{action api.change}}/>
</label>
{{/each}}
</div>
<label class="type-text{{if api.data.error.Description ' has-error'}}">
<span>Description (Optional)</span>
<input type="text" name="Description" value={{api.data.Description}} placeholder="Description (Optional)" onchange={{action api.change}} />
</label>
</fieldset>
<ConsulIntentionForm::Fieldsets
@nspaces={{nspaces}}
@services={{services}}
@SourceName={{SourceName}}
@SourceNS={{SourceNS}}
@DestinationName={{DestinationName}}
@DestinationNS={{DestinationNS}}
@item={{item}}
@disabled={{api.disabled}}
@onchange={{api.change}}
/>
<div>
<button type="submit" disabled={{or api.data.isInvalid api.disabled}}>Save</button>
<button type="reset" onclick={{action oncancel api.data}} disabled={{api.disabled}}>Cancel</button>
{{#if (not api.isCreate)}}
{{#if (not-eq form.item.ID 'anonymous') }}
<button type="submit" disabled={{or item.isInvalid api.disabled}}>Save</button>
<button type="reset" onclick={{action oncancel item}} disabled={{api.disabled}}>Cancel</button>
{{#if (not api.isCreate)}}
{{#if (not-eq item.ID 'anonymous') }}
<ConfirmationDialog @message="Are you sure you want to delete this Intention?">
<BlockSlot @name="action" as |confirm|>
<button data-test-delete type="button" class="type-delete" {{action confirm api.delete}} disabled={{api.disabled}}>Delete</button>
@ -158,11 +65,15 @@
<DeleteConfirmation @message={{message}} @execute={{execute}} @cancel={{cancel}} />
</BlockSlot>
</ConfirmationDialog>
{{/if}}
{{/if}}
{{/if}}
{{/if}}
</div>
</form>
</form>
{{else}}
<ConsulIntentionView
@item={{item}}
/>
{{/if}}
{{/let}}
</BlockSlot>
</DataForm>

View File

@ -63,12 +63,6 @@ export default Component.extend({
DestinationNS: destination,
});
},
createNewLabel: function(template, term) {
return template.replace(/{{term}}/g, term);
},
isUnique: function(items, term) {
return !items.findBy('Name', term);
},
change: function(e, form, item) {
const target = e.target;

View File

@ -6,12 +6,21 @@
<BlockSlot @name="content">
{{#if (gt items.length 0)}}
<TabularCollection class="consul-intention-list" @items={{items}} as |item index|>
<TabularCollection class="consul-intention-list"
@items={{items}}
@rowHeight={{59}}
as |item index|>
<BlockSlot @name="header">
<th>Source</th>
<th>&nbsp;</th>
<th>Destination</th>
<th>Precedence</th>
<th class="source">Source</th>
<th class="intent">&nbsp;</th>
<th class="destination">Destination</th>
<th class="permissions">
Permissions
<span>
<Tooltip>Permissions intercept an Intention's traffic using L7 criteria, such as path prefixes and http headers.</Tooltip>
</span>
</th>
<th class="meta">&nbsp;</th>
</BlockSlot>
<BlockSlot @name="row">
<td class="source" data-test-intention={{item.ID}}>
@ -25,9 +34,11 @@
<em class={{concat 'nspace-' (or item.SourceNS 'default')}}>{{or item.SourceNS 'default'}}</em>
</a>
</td>
<td class="intent-{{item.Action}}" data-test-intention-action="{{item.Action}}">
<strong>{{item.Action}}</strong>
{{#let (or item.Action "L7 rules") as |intent|}}
<td class="intent intent-{{slugify intent}}" data-test-intention-action={{intent}}>
<strong>{{capitalize intent}}</strong>
</td>
{{/let}}
<td class="destination" data-test-intention-destination="{{item.DestinationName}}">
<span>
{{#if (eq item.DestinationName '*') }}
@ -39,8 +50,15 @@
<em class={{concat 'nspace-' (or item.DestinationNS 'default')}}>{{or item.DestinationNS 'default'}}</em>
</span>
</td>
<td class="precedence">
{{item.Precedence}}
<td class="permissions">
{{#if (gt item.Permissions.length 0)}}
<span>{{pluralize item.Permissions.length 'Permission'}}</span>
{{/if}}
</td>
<td class="meta">
{{#if item.IsManagedByCRD}}
<ConsulExternalSource @item={{item}} @label="Managed by CRD" />
{{/if}}
</td>
</BlockSlot>
<BlockSlot @name="actions" as |index change checked|>
@ -49,6 +67,7 @@
More
</BlockSlot>
<BlockSlot @name="menu" as |confirm send keypressClick change|>
{{#if item.IsEditable}}
<li role="none">
<a role="menuitem" tabindex="-1" href={{href-to (or routeName 'dc.intentions.edit') item.ID}}>Edit</a>
</li>
@ -75,6 +94,11 @@
</div>
</div>
</li>
{{else}}
<li role="none">
<a role="menuitem" tabindex="-1" href={{href-to (or routeName 'dc.intentions.edit') item.ID}}>View</a>
</li>
{{/if}}
</BlockSlot>
</PopoverMenu>
</BlockSlot>

View File

@ -0,0 +1,35 @@
{{#if (gt items.length 0)}}
<div class="consul-intention-permission-list">
<ul>
{{#each items as |item|}}
<li>
<strong class={{concat 'intent-' item.Action}}>{{item.Action}}</strong>
{{#if item.Http.Path}}
<dl class="route-path">
<dt>
<Tooltip>
{{item.Http.PathType}}
</Tooltip>
</dt>
<dd>
{{item.Http.Path}}
</dd>
</dl>
{{/if}}
{{#each item.Http.Header as |item|}}
<dl class="route-header">
<dt>
<Tooltip>
Header
</Tooltip>
</dt>
<dd>
{{item.Name}} {{route-match item}}
</dd>
</dl>
{{/each}}
</li>
{{/each}}
</ul>
</div>
{{/if}}

View File

@ -0,0 +1,5 @@
import Component from '@ember/component';
export default Component.extend({
tagName: '',
});

View File

@ -0,0 +1,40 @@
<div class="consul-intention-view">
<div class="definition-table">
<dl>
<dt>Destination</dt>
<dd>
{{item.DestinationName}}{{#if (env "CONSUL_NSPACES_ENABLED")}} / {{item.DestinationNS}}{{/if}}
</dd>
<dt>Source</dt>
<dd>
{{item.SourceName}}{{#if (env "CONSUL_NSPACES_ENABLED")}} / {{item.SourceNS}}{{/if}}
</dd>
{{#if item.Action}}
<dt>Action</dt>
<dd>
{{item.Action}}
</dd>
{{/if}}
<dt>Description</dt>
<dd>
{{or item.Description 'N/A'}}
</dd>
</dl>
</div>
{{#if (gt item.Permissions.length 0) }}
<h2>Permissions</h2>
<div class="notice info">
<p>
Permissions are L7 attributes. If any of the following permissions match the request, the Intention will apply. Requests that fail to match any of the provided routes will do the opposite of the allow/deny action above.
</p>
<p>
<a href="{{env 'CONSUL_DOCS_URL'}}/guides/acl-migrate-tokens.html" target="_blank" rel="noopener noreferrer">Learn more about permissions</a>
</p>
</div>
<ConsulIntentionPermissionList @items={{item.Permissions}} @readonly={{true}} />
{{/if}}
</div>

View File

@ -0,0 +1,5 @@
import Component from '@ember/component';
export default Component.extend({
tagName: '',
});

View File

@ -1,8 +1,8 @@
<DataLoader @items={{item}} @src={{concat '/' nspace '/' dc '/' type '/' src}} @onchange={{action "setData"}} @once={{true}}>
<DataLoader @items={{item}} @src={{uri nspace dc type src}} @onchange={{action "setData"}} @once={{true}}>
<BlockSlot @name="loaded">
<DataWriter
@sink={{concat '/' nspace '/' (or data.Datacenter dc) '/' type '/'}}
@sink={{uri nspace (or data.Datacenter dc) type}}
@type={{type}}
@label={{label}}
@ondelete={{action ondelete}}

View File

@ -18,14 +18,14 @@
'linkable'
}}
>
<YieldSlot @name="header"><div>{{yield cell.item cell.index}}</div></YieldSlot>
<YieldSlot @name="details"><div>{{yield cell.item cell.index}}</div></YieldSlot>
<YieldSlot @name="header"><div class="header">{{yield cell.item cell.index}}</div></YieldSlot>
<YieldSlot @name="details"><div class="detail">{{yield cell.item cell.index}}</div></YieldSlot>
<YieldSlot @name="actions"
@params={{
block-params (component 'more-popover-menu' expanded=(if (eq checked cell.index) true false) onchange=(action "change" cell.index))
}}
>
<div>
<div class="actions">
{{yield cell.item cell.index}}
</div>
</YieldSlot>

View File

@ -0,0 +1,11 @@
<label
...attributes
class="radio-card{{if checked ' checked'}}"
>
<div>
<input type="radio" name={{name}} value={{value}} checked={{checked}} onchange={{action onchange}} />
</div>
<div>
{{yield}}
</div>
</label>

View File

@ -0,0 +1,6 @@
import Component from '@ember/component';
import Slotted from 'block-slots';
export default Component.extend(Slotted, {
tagName: '',
});

View File

@ -1,18 +1,18 @@
import { helper } from '@ember/component/helper';
export default helper(function routeMatch([params] /*, hash*/) {
const keys = Object.keys(params);
export default helper(function routeMatch([item], hash) {
const keys = Object.keys(item.data || item);
switch (true) {
case keys.includes('Present'):
return `${params.Invert ? `NOT ` : ``}present`;
return `${item.Invert ? `NOT ` : ``}present`;
case keys.includes('Exact'):
return `${params.Invert ? `NOT ` : ``}exactly matching "${params.Exact}"`;
return `${item.Invert ? `NOT ` : ``}exactly matching "${item.Exact}"`;
case keys.includes('Prefix'):
return `${params.Invert ? `NOT ` : ``}prefixed by "${params.Prefix}"`;
return `${item.Invert ? `NOT ` : ``}prefixed by "${item.Prefix}"`;
case keys.includes('Suffix'):
return `${params.Invert ? `NOT ` : ``}suffixed by "${params.Suffix}"`;
return `${item.Invert ? `NOT ` : ``}suffixed by "${item.Suffix}"`;
case keys.includes('Regex'):
return `${params.Invert ? `NOT ` : ``}matching the regex "${params.Regex}"`;
return `${item.Invert ? `NOT ` : ``}matching the regex "${item.Regex}"`;
}
return '';
});

View File

@ -0,0 +1,14 @@
import attr from 'ember-data/attr';
import Fragment from 'ember-data-model-fragments/fragment';
export default Fragment.extend({
Name: attr('string'),
Exact: attr('string'),
Prefix: attr('string'),
Suffix: attr('string'),
Regex: attr('string'),
Present: attr('boolean'),
Invert: attr('boolean'),
});

View File

@ -0,0 +1,21 @@
import attr from 'ember-data/attr';
import { computed } from '@ember/object';
import { or } from '@ember/object/computed';
import Fragment from 'ember-data-model-fragments/fragment';
import { fragmentArray, array } from 'ember-data-model-fragments/attributes';
const pathProps = ['PathPrefix', 'PathExact', 'PathRegex'];
export default Fragment.extend({
PathExact: attr('string'),
PathPrefix: attr('string'),
PathRegex: attr('string'),
Header: fragmentArray('intention-permission-http-header'),
Methods: array('string'),
Path: or(...pathProps),
PathType: computed(...pathProps, function() {
return pathProps.find(prop => typeof this[prop] === 'string');
}),
});

View File

@ -0,0 +1,9 @@
import attr from 'ember-data/attr';
import Fragment from 'ember-data-model-fragments/fragment';
import { fragment } from 'ember-data-model-fragments/attributes';
export default Fragment.extend({
Action: attr('string', { defaultValue: 'allow' }),
Http: fragment('intention-permission-http'),
});

View File

@ -1,5 +1,8 @@
import Model from 'ember-data/model';
import attr from 'ember-data/attr';
import { computed } from '@ember/object';
import { fragmentArray } from 'ember-data-model-fragments/attributes';
export const PRIMARY_KEY = 'uid';
export const SLUG_KEY = 'ID';
@ -12,9 +15,21 @@ export default Model.extend({
DestinationName: attr('string', { defaultValue: '*' }),
DestinationNS: attr('string'),
Precedence: attr('number'),
Permissions: fragmentArray('intention-permission'),
SourceType: attr('string', { defaultValue: 'consul' }),
Action: attr('string', { defaultValue: 'allow' }),
Action: attr('string'),
Meta: attr(),
Legacy: attr('boolean', { defaultValue: true }),
IsManagedByCRD: computed('Meta', function() {
const meta = Object.entries(this.Meta || {}).find(
([key, value]) => key === 'external-source' && value === 'kubernetes'
);
return typeof meta !== 'undefined';
}),
IsEditable: computed('Legacy', 'IsManagedByCRD', function() {
return this.Legacy && !this.IsManagedByCRD;
}),
SyncTime: attr('number'),
Datacenter: attr('string'),
CreatedAt: attr('date'),

View File

@ -19,7 +19,7 @@ export const routes = {
intentions: {
_options: { path: '/intentions' },
edit: {
_options: { path: '/:intention' },
_options: { path: '/:intention_id' },
},
create: {
_options: { path: '/create' },
@ -90,7 +90,7 @@ export const routes = {
intentions: {
_options: { path: '/intentions' },
edit: {
_options: { path: '/:id' },
_options: { path: '/:intention_id' },
},
create: {
_options: { path: '/create' },

View File

@ -4,15 +4,18 @@ import { hash } from 'rsvp';
export default Route.extend({
repo: service('repository/intention'),
model: function(params, transition) {
model: function({ intention_id }, transition) {
const dc = this.modelFor('dc').dc.Name;
const nspace = '*';
return hash({
isLoading: false,
dc: dc,
nspace: nspace,
item:
typeof params.id !== 'undefined' ? this.repo.findBySlug(params.id, dc, nspace) : undefined,
typeof intention_id !== 'undefined'
? this.repo.findBySlug(intention_id, dc, nspace)
: this.repo.create({
Datacenter: dc,
}),
});
},
setupController: function(controller, model) {

View File

@ -1,7 +1,45 @@
import Serializer from './application';
import { inject as service } from '@ember/service';
import { PRIMARY_KEY, SLUG_KEY } from 'consul-ui/models/intention';
export default Serializer.extend({
primaryKey: PRIMARY_KEY,
slugKey: SLUG_KEY,
encoder: service('encoder'),
init: function() {
this._super();
this.uri = this.encoder.uriTag();
},
ensureID: function(item) {
if (typeof item.ID !== 'string') {
item.ID = this
.uri`${item.SourceNS}:${item.SourceName}:${item.DestinationNS}:${item.DestinationName}`;
item.Legacy = false;
} else {
item.Legacy = true;
}
return item;
},
respondForQuery: function(respond, query) {
return this._super(
cb =>
respond((headers, body) => {
return cb(
headers,
body.map(item => this.ensureID(item))
);
}),
query
);
},
respondForQueryRecord: function(respond, query) {
return this._super(
cb =>
respond((headers, body) => {
body = this.ensureID(body);
return cb(headers, body);
}),
query
);
},
});

View File

@ -10,7 +10,10 @@ export default RepositoryService.extend({
},
create: function(obj) {
delete obj.Namespace;
return this._super(obj);
return this._super({
Action: 'allow',
...obj,
});
},
findByService: function(slug, dc, nspace, configuration = {}) {
const query = {

View File

@ -11,6 +11,11 @@
margin-right: 4px;
font-size: 0;
}
%increased-pill {
@extend %pill;
padding: 5px 10px;
min-width: 87px;
}
%reduced-pill {
background-color: $gray-100;
padding: 0 8px;

View File

@ -7,6 +7,12 @@
mask-position: center;
background-color: currentColor;
}
%with-glyph-icon {
font-weight: $typo-weight-normal;
background-color: $gray-100;
visibility: visible;
padding: 0 4px;
}
%as-pseudo {
display: inline-block;
content: '';

View File

@ -79,6 +79,7 @@ $info-circle-fill-svg: url('data:image/svg+xml;charset=UTF-8,<svg viewBox="0 0 2
$info-circle-outline-svg: url('data:image/svg+xml;charset=UTF-8,<svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" clip-rule="evenodd" d="M12 2c5.514 0 10 4.486 10 10s-4.486 10-10 10S2 17.543 2 12 6.486 2 12 2zm0 1.886c-4.486 0-8.143 3.628-8.143 8.114 0 4.486 3.657 8.143 8.143 8.143 4.486 0 8.143-3.643 8.143-8.143 0-4.5-3.657-8.129-8.143-8.129v.015zm1.429 8.128a1.555 1.555 0 0 0-.443-.985c-.286-.272-.6-.429-.986-.443h-1.429c-.385.028-.685.185-.985.443a1.456 1.456 0 0 0-.443.985h1.428V16.3c.029.386.158.714.443.986.286.285.6.443.986.443h1.429c.385 0 .685-.158.985-.443.286-.272.429-.6.443-.986H13.43V12v.014zM11 8.73a1.345 1.345 0 0 1-.4-1c0-.4.129-.743.4-1 .271-.258.6-.4 1-.4s.743.128 1 .4c.257.271.4.6.4 1s-.129.742-.4 1a1.433 1.433 0 0 1-1 .428c-.4 0-.743-.157-1-.428z" fill="%23000"/></svg>');
$key-svg: url('data:image/svg+xml;charset=UTF-8,<svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M21 18v3h-2.969L17 20v-2h-2v-2h-2l-4-4 3.052-3L21 18zM10 6L8 4 5.003 5 4 8l2 2 4-4zm-4.217 7.839L1.132 9.188l1.702-6.354 6.354-1.702 4.65 4.65-1.702 6.354-6.353 1.703z" fill="%23000"/></svg>');
$kubernetes-logo-color-svg: url('data:image/svg+xml;charset=UTF-8,<svg width="21" height="20" xmlns="http://www.w3.org/2000/svg"><g stroke="%23FFF" fill="none"><path d="M10.21 1.002a1.241 1.241 0 0 0-.472.12L3.29 4.201a1.225 1.225 0 0 0-.667.83l-1.591 6.922a1.215 1.215 0 0 0 .238 1.035l4.463 5.55c.234.29.59.46.964.46l7.159-.002c.375 0 .73-.168.964-.459l4.462-5.55c.234-.292.322-.673.238-1.036L17.927 5.03a1.225 1.225 0 0 0-.667-.83l-6.45-3.08a1.242 1.242 0 0 0-.598-.12z" fill="%23326CE5"/><path d="M10.275 3.357c-.213 0-.386.192-.386.429v.11c.005.136.035.24.052.367.033.27.06.492.043.7a.421.421 0 0 1-.125.2l-.01.163a4.965 4.965 0 0 0-3.22 1.548 6.47 6.47 0 0 1-.138-.099c-.07.01-.139.03-.23-.022-.172-.117-.33-.277-.52-.47-.087-.093-.15-.181-.254-.27L5.4 5.944a.46.46 0 0 0-.269-.101.372.372 0 0 0-.307.136c-.133.167-.09.422.094.57l.006.003.08.065c.11.08.21.122.32.187.231.142.422.26.574.403.06.063.07.175.078.223l.123.11a4.995 4.995 0 0 0-.787 3.483l-.162.047c-.042.055-.103.141-.166.167-.198.063-.422.086-.692.114-.126.01-.236.004-.37.03-.03.005-.07.016-.103.023l-.003.001-.006.002c-.228.055-.374.264-.327.47.047.206.27.331.498.282h.006c.003-.001.005-.003.008-.003l.1-.022c.131-.036.227-.088.346-.133.255-.092.467-.168.673-.198.086-.007.177.053.222.078l.168-.029a5.023 5.023 0 0 0 2.226 2.78l-.07.168c.025.065.053.154.034.218-.075.195-.203.4-.35.628-.07.106-.142.188-.206.309l-.05.104c-.099.212-.026.456.165.548.191.092.43-.005.532-.218h.001v-.001c.015-.03.036-.07.048-.098.055-.126.073-.233.111-.354.102-.257.159-.526.3-.694.038-.046.1-.063.166-.08l.087-.159a4.987 4.987 0 0 0 3.562.01l.083.148c.066.021.138.032.197.12.105.179.177.391.265.648.038.121.057.229.112.354.012.029.033.069.048.099.102.213.341.311.533.219.19-.092.264-.337.164-.549l-.05-.104c-.064-.12-.136-.202-.207-.307-.146-.23-.267-.419-.342-.613-.032-.1.005-.163.03-.228-.015-.017-.047-.111-.065-.156a5.023 5.023 0 0 0 2.225-2.8l.165.03c.058-.039.112-.088.216-.08.206.03.418.106.673.198.12.045.215.098.347.133.028.008.068.015.1.022l.007.002.006.001c.229.05.45-.076.498-.282.047-.206-.1-.415-.327-.47l-.112-.027c-.134-.025-.243-.019-.37-.03-.27-.027-.494-.05-.692-.113-.081-.031-.139-.128-.167-.167l-.156-.046a4.997 4.997 0 0 0-.804-3.474l.137-.123c.006-.069.001-.142.073-.218.151-.143.343-.261.574-.404.11-.064.21-.106.32-.187.025-.018.06-.047.086-.068.185-.148.227-.403.094-.57-.133-.166-.39-.182-.575-.034-.027.02-.062.048-.086.068-.104.09-.168.178-.255.27-.19.194-.348.355-.52.471-.075.044-.185.029-.235.026l-.146.104A5.059 5.059 0 0 0 10.7 5.328a9.325 9.325 0 0 1-.009-.172c-.05-.048-.11-.09-.126-.193-.017-.208.011-.43.044-.7.018-.126.047-.23.053-.367l-.001-.11c0-.237-.173-.429-.386-.429zM9.79 6.351l-.114 2.025-.009.004a.34.34 0 0 1-.54.26l-.003.002-1.66-1.177A3.976 3.976 0 0 1 9.79 6.351zm.968 0a4.01 4.01 0 0 1 2.313 1.115l-1.65 1.17-.006-.003a.34.34 0 0 1-.54-.26h-.003L10.76 6.35zm-3.896 1.87l1.516 1.357-.002.008a.34.34 0 0 1-.134.585l-.001.006-1.944.561a3.975 3.975 0 0 1 .565-2.516zm6.813.001a4.025 4.025 0 0 1 .582 2.51l-1.954-.563-.001-.008a.34.34 0 0 1-.134-.585v-.004l1.507-1.35zm-3.712 1.46h.62l.387.483-.139.602-.557.268-.56-.269-.138-.602.387-.482zm1.99 1.652a.339.339 0 0 1 .08.005l.002-.004 2.01.34a3.98 3.98 0 0 1-1.609 2.022l-.78-1.885.002-.003a.34.34 0 0 1 .296-.475zm-3.375.008a.34.34 0 0 1 .308.474l.005.007-.772 1.866a3.997 3.997 0 0 1-1.604-2.007l1.993-.339.003.005a.345.345 0 0 1 .067-.006zm1.683.817a.338.338 0 0 1 .312.179h.008l.982 1.775a3.991 3.991 0 0 1-2.57-.002l.979-1.772h.001a.34.34 0 0 1 .288-.18z" stroke-width=".25" fill="%23FFF"/></g></svg>');
$layers-svg: url('data:image/svg+xml;charset=UTF-8,<svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" clip-rule="evenodd" d="M13.14 20.131l-.12.035a2.501 2.501 0 01-.613.077h-.119l-.107-.009a2.095 2.095 0 01-.383-.065l-.074-.011-.196-.07c-.13-.052-4.6-2-8.009-3.49-1.614.838-2.88 1.495-3.07 1.596a.507.507 0 00-.223.177.394.394 0 00-.052.308l.001.013c.012.05.035.095.065.139.007.01.007.021.016.032l.008.008c.022.025.05.046.08.068.029.024.058.049.093.067l.009.006c.153.071 11.554 5.047 11.711 5.11.012.006.025.005.037.009a.61.61 0 00.16.034.672.672 0 00.216-.02l.028-.01c.038-.012.075-.018.11-.037L23.89 18.3c.018-.008.027-.022.043-.032a.542.542 0 00.15-.137c.01-.014.024-.022.032-.037.007-.013.006-.027.013-.04a.446.446 0 00.035-.181.417.417 0 00-.051-.178c-.007-.014-.007-.027-.016-.04-.01-.014-.024-.022-.035-.034a.557.557 0 00-.074-.072.58.58 0 00-.088-.055c-.017-.01-.028-.022-.044-.03l-2.975-1.297-7.353 3.813c-.13.076-.292.125-.386.151z" fill="%23000"/><path fill-rule="evenodd" clip-rule="evenodd" d="M13.146 14.415l-.114.033c-.201.053-.418.08-.637.08h-.088l-.127-.01a2.145 2.145 0 01-.41-.071l-.068-.012-.174-.061c-.14-.057-4.603-2.003-8.009-3.49C1.905 11.722.64 12.38.45 12.48a.507.507 0 00-.223.177.397.397 0 00-.052.309l.001.012c.012.05.035.095.065.139.007.01.007.021.016.032l.008.008c.022.025.05.046.08.068.029.024.058.05.093.068.003 0 .006.004.009.005.153.071 11.554 5.048 11.711 5.111.012.005.025.004.037.008a.61.61 0 00.16.034c.014.002.028.001.04.001a.65.65 0 00.204-.031c.038-.012.075-.017.11-.037l11.182-5.797c.018-.01.027-.023.043-.032a.482.482 0 00.15-.138c.01-.014.024-.022.032-.036.007-.013.006-.027.013-.041a.435.435 0 00.035-.18.373.373 0 00-.015-.088.405.405 0 00-.036-.09c-.007-.014-.007-.028-.016-.04-.01-.014-.024-.023-.035-.035a.515.515 0 00-.162-.128c-.017-.008-.027-.02-.044-.029l-2.974-1.298-7.354 3.814c-.137.076-.291.124-.381.149z" fill="%23000"/><path fill-rule="evenodd" clip-rule="evenodd" d="M12.198.22c-.021-.01-.043-.01-.064-.017a.541.541 0 00-.222-.036.529.529 0 00-.218.048c-.012.006-.027.005-.04.012C11.506.304 1.03 6.07.448 6.397a.52.52 0 00-.222.187.444.444 0 00-.052.328l.001.013c.012.053.035.1.065.148.007.01.007.023.016.034l.008.008c.022.028.05.049.08.073.029.025.058.052.093.07a.023.023 0 00.009.007c.153.076 11.554 5.359 11.711 5.427.012.005.025.005.037.009a.575.575 0 00.2.037c.06 0 .118-.007.177-.023l.027-.01c.038-.012.075-.018.11-.039L23.89 6.51c.018-.01.027-.025.043-.035a.549.549 0 00.15-.146c.01-.014.024-.023.032-.039.007-.013.006-.028.013-.042a.524.524 0 00.035-.193.411.411 0 00-.015-.091.444.444 0 00-.036-.098c-.007-.014-.007-.028-.016-.041-.01-.015-.024-.024-.035-.037a.56.56 0 00-.162-.136c-.017-.01-.027-.023-.044-.03L12.198.221z" fill="%23000"/></svg>');
$learn-svg: url('data:image/svg+xml;charset=UTF-8,<svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M12.409 5.273l8.915 3.958c.46.204.676.681.676 1.108 0 .427-.216.904-.676 1.108l-3.111 1.381v3.767c0 .145-.05.279-.134.385-.157.35-.434.633-.743.858-.377.274-.855.502-1.39.684-1.073.365-2.462.578-3.963.578-1.5 0-2.89-.213-3.962-.578-.536-.182-1.014-.41-1.39-.684-.31-.225-.586-.509-.744-.858a.618.618 0 0 1-.133-.385v-2.824l.029-.945L5.5 12.5c-.38.525-.897 1.436-1.023 2.536a1.122 1.122 0 0 1 .007 1.912 3.343 3.343 0 0 1-.039.813h.028c0 .004.003.028.016.074.015.052.04.119.077.196.074.156.186.333.327.497.3.35.628.533.9.533L5.014 20c-.346 0-.726-.252-1.14-.756-.583.504-1.04.756-1.374.756l-.404-.987c.37 0 .703-.266.938-.812.112-.26.181-.546.207-.806.02-.165.014-.332-.017-.496a1.121 1.121 0 0 1 .329-1.976c.134-1.173.522-2.041.942-2.668l-1.819-.808C2.216 11.243 2 10.766 2 10.34c0-.427.216-.904.676-1.108l8.915-3.958c.262-.116.556-.116.818 0v-.001zm-.432 3.745l-5.52 2.749L12 14.227l8.758-3.888L12 6.45l-8.758 3.89 2.11.937L11 8.5l.977.518zm4.994 4.362l-4.562 2.025a1.003 1.003 0 0 1-.818 0L7.01 13.371l-.013.429v2.6a.531.531 0 0 1 .008.027c.022.079.107.224.358.407.244.178.6.356 1.059.512.917.313 2.167.512 3.562.512s2.645-.2 3.563-.512c.46-.156.814-.334 1.058-.512.251-.183.336-.328.358-.407a.61.61 0 0 1 .009-.027v-3.02h-.001zM17 2.5V1h6v6h-1.5V3.429L18.25 6.75 17 6l3.5-3.5H17z" fill="%23000"/></svg>');
$link-svg: url('data:image/svg+xml;charset=UTF-8,<svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" clip-rule="evenodd" d="M20.073 10.015l-2.294 2.294a3.063 3.063 0 0 1-2.25.926c-.897 0-1.661-.323-2.294-.97l-.97.97c.647.633.97 1.401.97 2.305 0 .883-.305 1.63-.915 2.24l-2.272 2.282c-.61.625-1.36.938-2.25.938-.883 0-1.629-.305-2.24-.915l-1.62-1.61C3.312 17.863 3 17.117 3 16.234c0-.882.309-1.632.926-2.25l2.295-2.294a3.063 3.063 0 0 1 2.25-.926c.897 0 1.661.323 2.294.97l.97-.97a3.102 3.102 0 0 1-.97-2.305c0-.883.305-1.63.915-2.24l2.272-2.282c.61-.626 1.36-.938 2.25-.938.883 0 1.629.305 2.24.915l1.62 1.61c.625.611.938 1.357.938 2.24 0 .882-.309 1.632-.927 2.25zm-9.436 4.83l-.204.21a6.67 6.67 0 0 1-.237.238c-.044.04-.113.096-.209.166a.886.886 0 0 1-.583.182c-.294 0-.543-.103-.749-.31a1.025 1.025 0 0 1-.308-.75.89.89 0 0 1 .182-.586c.07-.096.124-.166.165-.21.04-.045.119-.124.236-.238l.21-.205A1.062 1.062 0 0 0 8.346 13c-.301 0-.55.1-.749.298l-2.29 2.299a1.025 1.025 0 0 0-.308.751c0 .287.103.534.308.74l1.619 1.614c.212.199.462.298.748.298.294 0 .543-.103.749-.31l2.268-2.287c.205-.206.308-.456.308-.751 0-.31-.121-.578-.363-.807zm8.055-7.944l-1.619-1.614A1.058 1.058 0 0 0 16.325 5c-.301 0-.55.1-.749.298l-2.268 2.288a1.025 1.025 0 0 0-.308.751c0 .31.121.578.363.807l.204-.21c.114-.118.193-.197.237-.238a2.61 2.61 0 0 1 .209-.166.885.885 0 0 1 .583-.182c.294 0 .543.103.749.31.205.206.308.456.308.75a.89.89 0 0 1-.182.586c-.07.096-.124.166-.165.21-.04.045-.119.124-.236.238l-.21.204c.22.236.485.354.793.354.294 0 .543-.103.749-.31l2.29-2.298c.205-.206.308-.456.308-.751 0-.287-.103-.534-.308-.74z" fill="%23000"/></svg>');
$loading-svg: url('data:image/svg+xml;charset=UTF-8,<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="24" height="24" class="structure-icon-loading"><style>.structure-icon-loading-base{opacity:.1}.structure-icon-loading-progress{animation:structure-icon-loading-fancy-spin 3s infinite linear;opacity:.25;stroke-dasharray:0 44;stroke-dashoffset:0;stroke-linecap:round;transform-origin:50% 50%}@keyframes structure-icon-loading-fancy-spin{0%{stroke-dasharray:0 44;stroke-dashoffset:0}25%{stroke-dasharray:33 11;stroke-dashoffset:-40}50%{stroke-dasharray:0 44;stroke-dashoffset:-110}75%{stroke-dasharray:33 11;stroke-dashoffset:-150}to{stroke-dasharray:0 44;stroke-dashoffset:-220}}@keyframes structure-icon-loading-simple-spin{0%{transform:rotate(0deg)}to{transform:rotate(360deg)}}</style><defs><path stroke="%23000" stroke-width="3" fill="none" id="a" d="M12 5l6 3v8l-6 3-6-3V8z"/></defs><use xlink:href="%23a" class="structure-icon-loading-base"/><use xlink:href="%23a" class="structure-icon-loading-progress"/></svg>');

View File

@ -808,6 +808,16 @@
mask-image: $learn-svg;
}
%with-layers-icon {
@extend %with-icon;
background-image: $layers-svg;
}
%with-layers-mask {
@extend %with-mask;
-webkit-mask-image: $layers-svg;
mask-image: $layers-svg;
}
%with-link-icon {
@extend %with-icon;
background-image: $link-svg;

View File

@ -8,6 +8,7 @@
@import './components/anchors';
@import './components/progress';
@import './components/buttons';
@import './components/list-row';
@import './components/composite-row';
@import './components/secret-button';
@import './components/tabs';
@ -38,6 +39,7 @@
@import './components/more-popover-menu';
@import './components/confirmation-alert';
@import './components/definition-table';
@import './components/radio-card';
/**/
@ -47,3 +49,8 @@
@import './components/main-nav-horizontal';
@import './components/app-view';
@import './components/footer';
/**/
@import './components/consul-intention-list';
@import './components/consul-intention-permission-list';
@import './components/consul-intention-fieldsets';

View File

@ -29,6 +29,7 @@
.consul-service-list li > div:first-child > dl:first-child dd {
margin-top: 1px;
}
.consul-intention-permission-list > ul,
.proxy-exposed-paths > ul,
.proxy-upstreams > ul {
border-top: 1px solid $gray-200;

View File

@ -1,19 +1,47 @@
@import './layout';
@import './skin';
%composite-row {
@extend %list-row;
}
%composite-row > .header {
@extend %composite-row-header, %list-row-header;
}
%composite-row > .detail {
@extend %composite-row-detail, %list-row-detail;
}
%composite-row > .actions {
@extend %composite-row-actions;
}
%with-composite-row-intent:hover,
%with-composite-row-intent:focus,
%with-composite-row-intent:active {
@extend %composite-row-intent;
@extend %list-row-intent;
}
%composite-row > :first-child {
@extend %composite-row-header;
%list-row-header > dl:first-child {
@extend %list-row-header-icon;
}
%composite-row-header > dl:first-child {
@extend %composite-row-icon;
// TODO: %defined-by-icon
// Copy Button
%composite-row .copy-button {
display: inline-flex;
}
%composite-row > :nth-child(2) {
@extend %composite-row-detail;
%composite-row .copy-button button {
padding: 0 !important;
margin: 0 !important;
}
%composite-row > :nth-child(3) {
@extend %composite-row-actions;
%composite-row-detail .copy-button {
margin-right: 4px;
margin-top: 2px;
}
%composite-row-header .copy-button {
margin-left: 4px;
}
/* buttons need to be displayed in order for the tooltip */
/* to track them */
%composite-row-header .copy-button button {
opacity: 0;
}
%composite-row-header:hover .copy-button button {
opacity: 1;
}

View File

@ -6,24 +6,10 @@
grid-template-areas:
'header actions'
'detail actions';
padding-top: 10px;
padding-bottom: 10px;
/* whilst this isn't in the designs this makes our temporary rollover look better */
padding-left: 12px;
}
%with-one-action-row {
display: grid;
@extend %composite-row;
grid-template-columns: 1fr auto;
grid-template-rows: 50% 50%;
// only one action applies to these rows
grid-template-areas:
'header actions'
'detail actions';
padding-top: 10px;
padding-bottom: 10px;
padding-right: 12px;
}
%composite-row-header {
@ -34,73 +20,8 @@
grid-area: detail;
align-self: end;
}
%composite-row-detail:not(:last-child) {
overflow-x: hidden;
}
%composite-row-actions {
grid-area: actions;
justify-self: center;
align-self: center;
}
%composite-row-icon {
margin-right: 6px;
margin-left: -2px;
}
%composite-row-icon dt {
display: none;
}
%composite-row-icon dd::before {
font-size: 0.9em;
}
/* TODO Currently only here due to dl's in %form-row */
%composite-row dl {
margin: 0;
padding: 0;
}
%composite-row-detail,
%composite-row-detail ul,
%composite-row-detail dl,
%composite-row-header,
%composite-row-header dl {
display: inline-flex;
flex-wrap: nowrap;
}
%composite-row-header *,
%composite-row-detail * {
white-space: nowrap;
flex-wrap: nowrap;
}
%composite-row-detail dl,
%composite-row-detail > span {
margin-right: 18px;
}
%composite-row-detail dl.node dt::before {
margin-top: 3px;
}
%composite-row-detail dl dt::before {
margin-right: 4px;
margin-top: 2px;
}
// Copy Button
%composite-row .copy-button button {
padding: 0 !important;
margin: 0 !important;
}
%composite-row-detail .copy-button {
margin-right: 4px;
margin-top: 2px;
}
%composite-row-header .copy-button {
margin-left: 4px;
}
%composite-row .copy-button {
display: inline-flex;
}
/* buttons need to be displayed in order for the tooltip */
/* to track them */
%composite-row-header .copy-button button {
opacity: 0;
}
%composite-row-header:hover .copy-button button {
opacity: 1;
}

View File

@ -1,26 +1,4 @@
%composite-row {
list-style-type: none;
border: 1px solid;
border-top-color: $transparent;
border-bottom-color: $gray-200;
border-right-color: $transparent;
border-left-color: $transparent;
}
%composite-row-intent {
border-color: $gray-200;
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
border-top-color: $transparent;
cursor: pointer;
}
%composite-row-header {
color: $black;
}
%composite-row-header * {
color: inherit;
}
%composite-row-detail {
color: $gray-500;
}
// TODO: %defined-by-icon
%composite-row-detail .policy::before {
@extend %with-file-fill-mask, %as-pseudo;

View File

@ -0,0 +1,4 @@
@import './consul-intention-fieldsets/index';
.consul-intention-fieldsets {
@extend %consul-intention-fieldsets;
}

View File

@ -0,0 +1,2 @@
@import './skin';
@import './layout';

View File

@ -0,0 +1,22 @@
%consul-intention-fieldsets [role='radiogroup'] {
overflow: visible !important;
display: grid;
grid-gap: 12px;
grid-template-columns: repeat(auto-fill, minmax(270px, 370px));
}
%consul-intention-fieldsets .radio-card {
@extend %radio-card-with-icon;
}
%consul-intention-fieldsets .radio-card header > * {
display: inline;
}
%consul-intention-fieldsets .value-allow > :last-child::before {
@extend %with-arrow-right-color-icon, %as-pseudo;
}
%consul-intention-fieldsets .value-deny > :last-child::before {
@extend %with-deny-color-icon, %as-pseudo;
}
%consul-intention-fieldsets .radio-card header span.code::before {
@extend %with-deny-color-icon, %as-pseudo;
margin-right: 5px;
}

View File

@ -0,0 +1,2 @@
%consul-intention-fieldsets {
}

View File

@ -0,0 +1,4 @@
@import './consul-intention-list/index';
.consul-intention-list {
@extend %consul-intention-list;
}

View File

@ -0,0 +1,16 @@
@import './skin';
@import './layout';
%consul-intention-list td.source,
%consul-intention-list td.destination {
@extend %tbody-th;
}
%consul-intention-list td.intent-allow strong {
@extend %increased-pill, %pill-allow;
}
%consul-intention-list td.intent-deny strong {
@extend %increased-pill, %pill-deny;
}
%consul-intention-list td.intent-l7-rules strong {
@extend %increased-pill, %pill-l7;
}

View File

@ -0,0 +1,27 @@
%consul-intention-list td {
height: 59px;
}
%consul-intention-list tr > *:nth-child(1) {
width: calc(30% - 50px);
}
%consul-intention-list tr > *:nth-child(2) {
width: 100px;
}
%consul-intention-list tr > *:nth-child(3) {
width: calc(30% - 50px);
}
%consul-intention-list tr > *:nth-child(4) {
width: calc(40% - 220px);
}
%consul-intention-list tr > *:nth-child(5) {
width: 160px;
}
%consul-intention-list tr > *:last-child {
width: 60px;
}
@media #{$--lt-horizontal-nav} {
%consul-intention-list tr > :not(.source):not(.destination):not(.intent) {
display: none;
}
}

View File

@ -0,0 +1,3 @@
%consul-intention-list td.permissions {
color: $blue-500;
}

View File

@ -0,0 +1,4 @@
@import './consul-intention-permission-list/index';
.consul-intention-permission-list {
@extend %consul-intention-permission-list;
}

View File

@ -0,0 +1,11 @@
@import './skin';
@import './layout';
%consul-intention-permission-list > ul > li {
@extend %list-row, %list-row-detail;
}
%consul-intention-permission-list .intent-allow {
@extend %pill, %pill-allow;
}
%consul-intention-permission-list .intent-deny {
@extend %pill, %pill-deny;
}

View File

@ -0,0 +1,3 @@
%consul-intention-permission-list strong {
margin-right: 8px;
}

View File

@ -0,0 +1,9 @@
%consul-intention-permission-list dt::before {
@extend %with-glyph-icon;
}
%consul-intention-permission-list dl.route-path dt::before {
content: 'P';
}
%consul-intention-permission-list dl.route-header dt::before {
content: 'H';
}

View File

@ -104,9 +104,6 @@
display: block;
width: 33px;
}
%route-card section header > *::before {
padding: 0 8px;
}
/**/
/* resolver */
%resolver-card a {

View File

@ -92,8 +92,7 @@
}
%resolver-card dt,
%route-card section header > *::before {
background-color: $gray-100;
visibility: visible;
@extend %with-glyph-icon;
}
%route-card .match-headers header *::before {
content: 'H';

View File

@ -13,6 +13,9 @@ label span {
%main-content form {
@extend %form;
}
%form span.label {
@extend %form-element-label;
}
%form table,
%radio-group,
%checkbox-group,

View File

@ -0,0 +1,4 @@
@import './list-row/index';
.list-row {
@extend %list-row;
}

View File

@ -0,0 +1,2 @@
@import './skin';
@import './layout';

View File

@ -0,0 +1,48 @@
%list-row {
padding-top: 10px;
padding-bottom: 10px;
/* whilst this isn't in the designs this makes our temporary rollover look better */
padding-left: 12px;
}
%list-row dl {
margin: 0;
padding: 0;
}
%list-row-detail,
%list-row-header {
display: flex;
flex-wrap: nowrap;
overflow-x: hidden;
}
%list-row-detail ul,
%list-row-detail dl,
%list-row-header dl {
display: inline-flex;
}
%list-row-header *,
%list-row-detail * {
white-space: nowrap;
flex-wrap: nowrap;
}
%list-row-detail dl,
%list-row-detail > span {
margin-right: 18px;
}
%list-row-detail dl.node dt::before {
margin-top: 3px;
}
%list-row-detail dl dt::before {
margin-right: 4px;
margin-top: 2px;
}
%list-row-header-icon {
margin-right: 6px;
margin-left: -2px;
}
%list-row-header dt {
display: none;
}
%list-row-header dd::before {
font-size: 0.9em;
}

View File

@ -0,0 +1,23 @@
%list-row {
list-style-type: none;
border: $decor-border-100;
border-top-color: $transparent;
border-bottom-color: $gray-200;
border-right-color: $transparent;
border-left-color: $transparent;
}
%list-row-intent {
border-color: $gray-200;
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
border-top-color: $transparent;
cursor: pointer;
}
%list-row-header {
color: $black;
}
%list-row-header * {
color: inherit;
}
%list-row-detail {
color: $gray-500;
}

View File

@ -1,3 +1,30 @@
%pill-allow:before,
%pill-deny:before,
%pill-l7:before {
@extend %as-pseudo;
margin-right: 5px;
font-size: 0.9em;
}
%pill-allow {
color: $green-800;
background-color: $green-100;
}
%pill-allow::before {
@extend %with-arrow-right-color-mask;
}
%pill-deny {
color: $red-800;
background-color: $red-100;
}
%pill-deny::before {
@extend %with-deny-color-mask;
}
%pill-l7 {
@extend %frame-gray-900;
}
%pill-l7::before {
@extend %with-layers-mask;
}
td strong {
@extend %pill, %frame-gray-900;
margin-right: 3px;

View File

@ -0,0 +1,4 @@
@import './radio-card/index';
.radio-card {
@extend %radio-card;
}

View File

@ -0,0 +1,2 @@
@import './skin';
@import './layout';

View File

@ -0,0 +1,16 @@
%radio-card {
float: none !important;
margin-right: 0 !important;
}
%radio-card {
display: flex !important;
}
%radio-card > :first-child {
padding: 10px;
display: grid;
align-items: center;
justify-items: center;
}
%radio-card > :last-child {
padding: 18px;
}

View File

@ -0,0 +1,32 @@
%radio-card {
border: $decor-border-100;
border-radius: $decor-radius-100;
border-color: $gray-200;
box-shadow: $decor-elevation-400;
color: $gray-500;
cursor: pointer;
}
%radio-card.checked {
border-color: $blue-500;
}
%radio-card > :first-child {
background-color: $gray-050;
}
%radio-card.checked > :first-child {
background-color: $blue-050;
}
%radio-card header {
margin-bottom: 0.5em;
}
%radio-card header {
color: $black;
}
%radio-card-with-icon > :last-child {
padding-left: 47px;
position: relative;
}
%radio-card-with-icon > :last-child::before {
position: absolute;
left: 14px;
font-size: 1rem;
}

View File

@ -23,72 +23,41 @@
--consul-icon: #{$consul-logo-color-svg};
--aws-icon: #{$aws-logo-color-svg};
}
td.folder::before {
@extend %with-folder-outline-mask, %as-pseudo;
background-color: $gray-300;
margin-top: 1px;
margin-right: 5px;
}
td.destination {
@extend %tbody-th;
}
td.intent-allow strong,
td.intent-deny strong {
visibility: hidden;
}
td.intent-allow strong::before {
@extend %with-arrow-right-color-icon, %as-pseudo;
background-size: 24px;
}
td.intent-deny strong::before {
@extend %with-deny-color-icon, %as-pseudo;
}
table:not(.sessions) tbody tr {
cursor: pointer;
}
table:not(.sessions) td:first-child {
padding: 0;
}
table:not(.sessions) tbody tr:hover {
box-shadow: $decor-elevation-300;
}
table.consul-metadata-list tbody tr {
cursor: default;
}
table.consul-metadata-list tbody tr:hover {
box-shadow: none;
}
/* Header Tooltips/Icon*/
th {
overflow: visible;
%table th span::after {
@extend %with-info-circle-outline-mask, %as-pseudo;
color: $gray-500;
margin-left: 4px;
}
th span::after {
@extend %with-info-circle-outline-icon, %as-pseudo;
opacity: 0.6;
%table tbody tr {
cursor: pointer;
}
th span {
@extend %with-tooltip;
margin-left: 2px;
%table td:first-child {
padding: 0;
}
th span em {
width: 250px;
font-style: normal;
white-space: normal !important;
%table tbody tr:hover {
box-shadow: $decor-elevation-300;
}
%table td.folder::before {
@extend %with-folder-outline-mask, %as-pseudo;
background-color: $gray-300;
margin-top: 1px;
margin-right: 5px;
}
/**/
@media #{$--lt-wide-table} {
/* hide actions on narrow screens, you can always click in do everything from there */
tr > .actions {
%table tr > .actions {
display: none;
}
html.template-node.template-show #lock-sessions tr > :not(:first-child):not(:last-child) {
display: none;
}
html.template-node.template-show #lock-sessions td:last-child {
padding: 0;
}
.consul-intention-list tr > :nth-last-child(2) {
display: none;
}

View File

@ -52,7 +52,7 @@ $ideal-content-padding: 33px;
padding-right: $ideal-viewport-padding;
}
}
form > fieldset [role='group'] {
fieldset [role='group'] {
display: flex;
flex-wrap: wrap;
flex-direction: row;

View File

@ -14,6 +14,7 @@ h3 {
@extend %h3;
font-size: $typo-header-300;
}
%radio-card header,
fieldset > header,
%main-nav-horizontal-action,
%app-view-content div > dl > dt,

View File

@ -11,20 +11,17 @@
</BlockSlot>
<BlockSlot @name="header">
<h1>
{{#if item.ID }}
Edit Intention
{{#if item.IsEditable}}
{{#if item.ID}}
Edit Intention
{{else}}
New Intention
{{/if}}
{{else}}
New Intention
View Intention
{{/if}}
</h1>
</BlockSlot>
<BlockSlot @name="actions">
{{#if item.ID}}
<CopyButton @value={{item.ID}} @name="UUID">
Copy UUID
</CopyButton>
{{/if}}
</BlockSlot>
<BlockSlot @name="content">
<ConsulIntentionForm
@item={{item}}

View File

@ -1,4 +1,4 @@
<DataLoader @src={{concat '/' nspace '/' dc '/intentions/for-service/' slug}} as |api|>
<DataLoader @src={{uri nspace dc 'intentions' 'for-service' slug}} as |api|>
<BlockSlot @name="error">
<ErrorState @error={{api.error}} />
</BlockSlot>

View File

@ -55,7 +55,7 @@
"@ember/optional-features": "^1.3.0",
"@glimmer/component": "^1.0.0",
"@glimmer/tracking": "^1.0.0",
"@hashicorp/consul-api-double": "^3.0.0",
"@hashicorp/consul-api-double": "^5.0.0",
"@hashicorp/ember-cli-api-double": "^3.1.0",
"@xstate/fsm": "^1.4.0",
"babel-eslint": "^10.0.3",
@ -90,6 +90,7 @@
"ember-composable-helpers": "~4.0.0",
"ember-computed-style": "^0.3.0",
"ember-data": "~3.16.0",
"ember-data-model-fragments": "5.0.0-beta.0",
"ember-exam": "^4.0.0",
"ember-export-application-global": "^2.0.1",
"ember-href-to": "^3.1.0",

View File

@ -7,6 +7,7 @@ Feature: dc / intentions / deleting: Deleting items with confirmations, success
---
SourceName: name
ID: ee52203d-989f-4f7a-ab5a-2bef004164ca
Meta: ~
---
When I visit the intentions page for yaml
---

View File

@ -1,30 +1,44 @@
@setupApplicationTest
Feature: dc / intentions / navigation
Scenario: Clicking a intention in the listing and back again
Given 1 datacenter model with the value "dc-1"
And 3 intention models
When I visit the intentions page for yaml
---
dc: dc-1
---
Then the url should be /dc-1/intentions
And the title should be "Intentions - Consul"
Then I see 3 intention models
When I click intention on the intentions
Then a GET request was made to "/v1/internal/ui/services?dc=dc-1&ns=*"
And I click "[data-test-back]"
Then the url should be /dc-1/intentions
Scenario: Clicking the create button and back again
Given 1 datacenter model with the value "dc-1"
And 3 intention models
When I visit the intentions page for yaml
---
dc: dc-1
---
Then the url should be /dc-1/intentions
And the title should be "Intentions - Consul"
Then I see 3 intention models
When I click create
Then the url should be /dc-1/intentions/create
And I click "[data-test-back]"
Then the url should be /dc-1/intentions
@setupApplicationTest
Feature: dc / intentions / navigation
Background:
Given 1 datacenter model with the value "dc-1"
And 3 intention models from yaml
---
- ID: 755b72bd-f5ab-4c92-90cc-bed0e7d8e9f0
Action: allow
Meta: ~
- ID: 755b72bd-f5ab-4c92-90cc-bed0e7d8e9f1
Action: deny
Meta: ~
- ID: 0755b72bd-f5ab-4c92-90cc-bed0e7d8e9f2
Action: deny
Meta: ~
---
Scenario: Clicking a intention in the listing and back again
When I visit the intentions page for yaml
---
dc: dc-1
---
Then the url should be /dc-1/intentions
And the title should be "Intentions - Consul"
Then I see 3 intention models
Given 1 intention model from yaml
---
ID: 755b72bd-f5ab-4c92-90cc-bed0e7d8e9f0
---
When I click intention on the intentions
Then a GET request was made to "/v1/internal/ui/services?dc=dc-1&ns=*"
And I click "[data-test-back]"
Then the url should be /dc-1/intentions
Scenario: Clicking the create button and back again
When I visit the intentions page for yaml
---
dc: dc-1
---
Then the url should be /dc-1/intentions
And the title should be "Intentions - Consul"
Then I see 3 intention models
When I click create
Then the url should be /dc-1/intentions/create
And I click "[data-test-back]"
Then the url should be /dc-1/intentions

View File

@ -10,7 +10,18 @@ Feature: dc / services / show / intentions: Intentions per service
Name: service-0
ID: service-0-with-id
---
And 3 intention models
And 3 intention models from yaml
---
- ID: 755b72bd-f5ab-4c92-90cc-bed0e7d8e9f0
Action: allow
Meta: ~
- ID: 755b72bd-f5ab-4c92-90cc-bed0e7d8e9f1
Action: deny
Meta: ~
- ID: 0755b72bd-f5ab-4c92-90cc-bed0e7d8e9f2
Action: deny
Meta: ~
---
When I visit the service page for yaml
---
dc: dc1

View File

@ -36,7 +36,9 @@ module('Integration | Serializer | intention', function(hooks) {
dc: dc,
}
);
assert.deepEqual(actual, expected);
assert.equal(actual[0].Namespace, expected[0].Namespace);
assert.equal(actual[0].Datacenter, expected[0].Datacenter);
assert.equal(actual[0].uid, expected[0].uid);
});
});
test('respondForQueryRecord returns the correct data for item endpoint', function(assert) {
@ -66,7 +68,9 @@ module('Integration | Serializer | intention', function(hooks) {
dc: dc,
}
);
assert.deepEqual(actual, expected);
assert.equal(actual.Namespace, expected.Namespace);
assert.equal(actual.Datacenter, expected.Datacenter);
assert.equal(actual.uid, expected.uid);
});
});
});

View File

@ -20,7 +20,7 @@ test('findAllByDatacenter returns the correct data for list endpoint', function(
this.subject(),
function retrieveStub(stub) {
return stub(`/v1/connect/intentions?dc=${dc}`, {
CONSUL_INTENTION_COUNT: '100',
CONSUL_INTENTION_COUNT: '1',
});
},
function performTest(service) {
@ -28,19 +28,20 @@ test('findAllByDatacenter returns the correct data for list endpoint', function(
},
function performAssertion(actual, expected) {
assert.deepEqual(
actual,
actual[0],
expected(function(payload) {
return payload.map(item =>
Object.assign({}, item, {
CreatedAt: new Date(item.CreatedAt),
UpdatedAt: new Date(item.UpdatedAt),
SyncTime: now,
Datacenter: dc,
// TODO: nspace isn't required here, once we've
// refactored out our Serializer this can go
uid: `["${nspace}","${dc}","${item.ID}"]`,
})
);
const item = payload[0];
return {
...item,
CreatedAt: new Date(item.CreatedAt),
UpdatedAt: new Date(item.UpdatedAt),
Legacy: true,
SyncTime: now,
Datacenter: dc,
// TODO: nspace isn't required here, once we've
// refactored out our Serializer this can go
uid: `["${nspace}","${dc}","${item.ID}"]`,
};
})
);
}
@ -63,6 +64,7 @@ test('findBySlug returns the correct data for item endpoint', function(assert) {
expected(function(payload) {
const item = payload;
return Object.assign({}, item, {
Legacy: true,
CreatedAt: new Date(item.CreatedAt),
UpdatedAt: new Date(item.UpdatedAt),
Datacenter: dc,

View File

@ -18,6 +18,15 @@
invariant "^2.2.4"
semver "^5.5.0"
"@babel/compat-data@^7.11.0":
version "7.11.0"
resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.11.0.tgz#e9f73efe09af1355b723a7f39b11bad637d7c99c"
integrity sha512-TPSvJfv73ng0pfnEOh17bYMPQbI95+nGWc71Ss4vZdRBHTDqmM9Z8ZV4rYz8Ks7sfzc95n30k6ODIq5UGnXcYQ==
dependencies:
browserslist "^4.12.0"
invariant "^2.2.4"
semver "^5.5.0"
"@babel/core@^7.0.0", "@babel/core@^7.1.6", "@babel/core@^7.10.2", "@babel/core@^7.2.2", "@babel/core@^7.3.4", "@babel/core@^7.7.7":
version "7.10.4"
resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.10.4.tgz#780e8b83e496152f8dd7df63892b2e052bf1d51d"
@ -40,6 +49,28 @@
semver "^5.4.1"
source-map "^0.5.0"
"@babel/core@^7.11.0":
version "7.11.5"
resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.11.5.tgz#6ad96e2f71899ea3f9b651f0a911e85205d1ff6d"
integrity sha512-fsEANVOcZHzrsV6dMVWqpSeXClq3lNbYrfFGme6DE25FQWe7pyeYpXyx9guqUnpy466JLzZ8z4uwSr2iv60V5Q==
dependencies:
"@babel/code-frame" "^7.10.4"
"@babel/generator" "^7.11.5"
"@babel/helper-module-transforms" "^7.11.0"
"@babel/helpers" "^7.10.4"
"@babel/parser" "^7.11.5"
"@babel/template" "^7.10.4"
"@babel/traverse" "^7.11.5"
"@babel/types" "^7.11.5"
convert-source-map "^1.7.0"
debug "^4.1.0"
gensync "^1.0.0-beta.1"
json5 "^2.1.2"
lodash "^4.17.19"
resolve "^1.3.2"
semver "^5.4.1"
source-map "^0.6.1"
"@babel/generator@^7.10.4", "@babel/generator@^7.4.0":
version "7.10.4"
resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.10.4.tgz#e49eeed9fe114b62fa5b181856a43a5e32f5f243"
@ -50,6 +81,15 @@
lodash "^4.17.13"
source-map "^0.5.0"
"@babel/generator@^7.11.5":
version "7.11.5"
resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.11.5.tgz#a5582773425a468e4ba269d9a1f701fbca6a7a82"
integrity sha512-9UqHWJ4IwRTy4l0o8gq2ef8ws8UPzvtMkVKjTLAiRmza9p9V6Z+OfuNd9fB1j5Q67F+dVJtPC2sZXI8NM9br4g==
dependencies:
"@babel/types" "^7.11.5"
jsesc "^2.5.1"
source-map "^0.6.1"
"@babel/helper-annotate-as-pure@^7.10.4":
version "7.10.4"
resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.10.4.tgz#5bf0d495a3f757ac3bda48b5bf3b3ba309c72ba3"
@ -97,6 +137,18 @@
"@babel/helper-replace-supers" "^7.10.4"
"@babel/helper-split-export-declaration" "^7.10.4"
"@babel/helper-create-class-features-plugin@^7.10.5":
version "7.10.5"
resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.10.5.tgz#9f61446ba80e8240b0a5c85c6fdac8459d6f259d"
integrity sha512-0nkdeijB7VlZoLT3r/mY3bUkw3T8WG/hNw+FATs/6+pG2039IJWjTYL0VTISqsNHMUTEnwbVnc89WIJX9Qed0A==
dependencies:
"@babel/helper-function-name" "^7.10.4"
"@babel/helper-member-expression-to-functions" "^7.10.5"
"@babel/helper-optimise-call-expression" "^7.10.4"
"@babel/helper-plugin-utils" "^7.10.4"
"@babel/helper-replace-supers" "^7.10.4"
"@babel/helper-split-export-declaration" "^7.10.4"
"@babel/helper-create-regexp-features-plugin@^7.10.4":
version "7.10.4"
resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.10.4.tgz#fdd60d88524659a0b6959c0579925e425714f3b8"
@ -153,6 +205,13 @@
dependencies:
"@babel/types" "^7.10.4"
"@babel/helper-member-expression-to-functions@^7.10.5":
version "7.11.0"
resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.11.0.tgz#ae69c83d84ee82f4b42f96e2a09410935a8f26df"
integrity sha512-JbFlKHFntRV5qKw3YC0CvQnDZ4XMwgzzBbld7Ly4Mj4cbFy3KywcR8NtNctRToMWJOVvLINJv525Gd6wwVEx/Q==
dependencies:
"@babel/types" "^7.11.0"
"@babel/helper-module-imports@^7.10.4", "@babel/helper-module-imports@^7.8.3":
version "7.10.4"
resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.10.4.tgz#4c5c54be04bd31670a7382797d75b9fa2e5b5620"
@ -173,6 +232,19 @@
"@babel/types" "^7.10.4"
lodash "^4.17.13"
"@babel/helper-module-transforms@^7.10.5", "@babel/helper-module-transforms@^7.11.0":
version "7.11.0"
resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.11.0.tgz#b16f250229e47211abdd84b34b64737c2ab2d359"
integrity sha512-02EVu8COMuTRO1TAzdMtpBPbe6aQ1w/8fePD2YgQmxZU4gpNWaL9gK3Jp7dxlkUlUCJOTaSeA+Hrm1BRQwqIhg==
dependencies:
"@babel/helper-module-imports" "^7.10.4"
"@babel/helper-replace-supers" "^7.10.4"
"@babel/helper-simple-access" "^7.10.4"
"@babel/helper-split-export-declaration" "^7.11.0"
"@babel/template" "^7.10.4"
"@babel/types" "^7.11.0"
lodash "^4.17.19"
"@babel/helper-optimise-call-expression@^7.10.4":
version "7.10.4"
resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.4.tgz#50dc96413d594f995a77905905b05893cd779673"
@ -221,6 +293,13 @@
"@babel/template" "^7.10.4"
"@babel/types" "^7.10.4"
"@babel/helper-skip-transparent-expression-wrappers@^7.11.0":
version "7.11.0"
resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.11.0.tgz#eec162f112c2f58d3af0af125e3bb57665146729"
integrity sha512-0XIdiQln4Elglgjbwo9wuJpL/K7AGCY26kmEt0+pRP0TAj4jjyNq1MjoRvikrTVqKcx4Gysxt4cXvVFXP/JO2Q==
dependencies:
"@babel/types" "^7.11.0"
"@babel/helper-split-export-declaration@^7.10.4":
version "7.10.4"
resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.10.4.tgz#2c70576eaa3b5609b24cb99db2888cc3fc4251d1"
@ -228,6 +307,13 @@
dependencies:
"@babel/types" "^7.10.4"
"@babel/helper-split-export-declaration@^7.11.0":
version "7.11.0"
resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz#f8a491244acf6a676158ac42072911ba83ad099f"
integrity sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg==
dependencies:
"@babel/types" "^7.11.0"
"@babel/helper-validator-identifier@^7.10.4":
version "7.10.4"
resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz#a78c7a7251e01f616512d31b10adcf52ada5e0d2"
@ -266,6 +352,11 @@
resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.10.4.tgz#9eedf27e1998d87739fb5028a5120557c06a1a64"
integrity sha512-8jHII4hf+YVDsskTF6WuMB3X4Eh+PsUkC2ljq22so5rHvH+T8BzyL94VOdyFLNR8tBSVXOTbNHOKpR4TfRxVtA==
"@babel/parser@^7.11.5":
version "7.11.5"
resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.11.5.tgz#c7ff6303df71080ec7a4f5b8c003c58f1cf51037"
integrity sha512-X9rD8qqm695vgmeaQ4fvz/o3+Wk4ZzQvSHkDBgpYKxpD4qTAUm88ZKtHkVqIOsYFFbIQ6wQYhC6q7pjqVK0E0Q==
"@babel/plugin-proposal-async-generator-functions@^7.10.4":
version "7.10.4"
resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.10.4.tgz#4b65abb3d9bacc6c657aaa413e56696f9f170fc6"
@ -292,6 +383,15 @@
"@babel/helper-plugin-utils" "^7.10.4"
"@babel/plugin-syntax-decorators" "^7.10.4"
"@babel/plugin-proposal-decorators@^7.10.5":
version "7.10.5"
resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.10.5.tgz#42898bba478bc4b1ae242a703a953a7ad350ffb4"
integrity sha512-Sc5TAQSZuLzgY0664mMDn24Vw2P8g/VhyLyGPaWiHahhgLqeZvcGeyBZOrJW0oSKIK2mvQ22a1ENXBIQLhrEiQ==
dependencies:
"@babel/helper-create-class-features-plugin" "^7.10.5"
"@babel/helper-plugin-utils" "^7.10.4"
"@babel/plugin-syntax-decorators" "^7.10.4"
"@babel/plugin-proposal-dynamic-import@^7.10.4":
version "7.10.4"
resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.10.4.tgz#ba57a26cb98b37741e9d5bca1b8b0ddf8291f17e"
@ -300,6 +400,14 @@
"@babel/helper-plugin-utils" "^7.10.4"
"@babel/plugin-syntax-dynamic-import" "^7.8.0"
"@babel/plugin-proposal-export-namespace-from@^7.10.4":
version "7.10.4"
resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.10.4.tgz#570d883b91031637b3e2958eea3c438e62c05f54"
integrity sha512-aNdf0LY6/3WXkhh0Fdb6Zk9j1NMD8ovj3F6r0+3j837Pn1S1PdNtcwJ5EG9WkVPNHPxyJDaxMaAOVq4eki0qbg==
dependencies:
"@babel/helper-plugin-utils" "^7.10.4"
"@babel/plugin-syntax-export-namespace-from" "^7.8.3"
"@babel/plugin-proposal-json-strings@^7.10.4":
version "7.10.4"
resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.10.4.tgz#593e59c63528160233bd321b1aebe0820c2341db"
@ -308,6 +416,14 @@
"@babel/helper-plugin-utils" "^7.10.4"
"@babel/plugin-syntax-json-strings" "^7.8.0"
"@babel/plugin-proposal-logical-assignment-operators@^7.11.0":
version "7.11.0"
resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.11.0.tgz#9f80e482c03083c87125dee10026b58527ea20c8"
integrity sha512-/f8p4z+Auz0Uaf+i8Ekf1iM7wUNLcViFUGiPxKeXvxTSl63B875YPiVdUDdem7hREcI0E0kSpEhS8tF5RphK7Q==
dependencies:
"@babel/helper-plugin-utils" "^7.10.4"
"@babel/plugin-syntax-logical-assignment-operators" "^7.10.4"
"@babel/plugin-proposal-nullish-coalescing-operator@^7.10.4", "@babel/plugin-proposal-nullish-coalescing-operator@^7.4.4":
version "7.10.4"
resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.10.4.tgz#02a7e961fc32e6d5b2db0649e01bf80ddee7e04a"
@ -333,6 +449,15 @@
"@babel/plugin-syntax-object-rest-spread" "^7.8.0"
"@babel/plugin-transform-parameters" "^7.10.4"
"@babel/plugin-proposal-object-rest-spread@^7.11.0":
version "7.11.0"
resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.11.0.tgz#bd81f95a1f746760ea43b6c2d3d62b11790ad0af"
integrity sha512-wzch41N4yztwoRw0ak+37wxwJM2oiIiy6huGCoqkvSTA9acYWcPfn9Y4aJqmFFJ70KTJUu29f3DQ43uJ9HXzEA==
dependencies:
"@babel/helper-plugin-utils" "^7.10.4"
"@babel/plugin-syntax-object-rest-spread" "^7.8.0"
"@babel/plugin-transform-parameters" "^7.10.4"
"@babel/plugin-proposal-optional-catch-binding@^7.10.4":
version "7.10.4"
resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.10.4.tgz#31c938309d24a78a49d68fdabffaa863758554dd"
@ -349,6 +474,15 @@
"@babel/helper-plugin-utils" "^7.10.4"
"@babel/plugin-syntax-optional-chaining" "^7.8.0"
"@babel/plugin-proposal-optional-chaining@^7.11.0":
version "7.11.0"
resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.11.0.tgz#de5866d0646f6afdaab8a566382fe3a221755076"
integrity sha512-v9fZIu3Y8562RRwhm1BbMRxtqZNFmFA2EG+pT2diuU8PT3H6T/KXoZ54KgYisfOFZHV6PfvAiBIZ9Rcz+/JCxA==
dependencies:
"@babel/helper-plugin-utils" "^7.10.4"
"@babel/helper-skip-transparent-expression-wrappers" "^7.11.0"
"@babel/plugin-syntax-optional-chaining" "^7.8.0"
"@babel/plugin-proposal-private-methods@^7.10.4":
version "7.10.4"
resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.10.4.tgz#b160d972b8fdba5c7d111a145fc8c421fc2a6909"
@ -393,6 +527,13 @@
dependencies:
"@babel/helper-plugin-utils" "^7.8.0"
"@babel/plugin-syntax-export-namespace-from@^7.8.3":
version "7.8.3"
resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz#028964a9ba80dbc094c915c487ad7c4e7a66465a"
integrity sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==
dependencies:
"@babel/helper-plugin-utils" "^7.8.3"
"@babel/plugin-syntax-json-strings@^7.8.0":
version "7.8.3"
resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a"
@ -400,6 +541,13 @@
dependencies:
"@babel/helper-plugin-utils" "^7.8.0"
"@babel/plugin-syntax-logical-assignment-operators@^7.10.4":
version "7.10.4"
resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699"
integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==
dependencies:
"@babel/helper-plugin-utils" "^7.10.4"
"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.0":
version "7.8.3"
resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9"
@ -569,6 +717,15 @@
"@babel/helper-plugin-utils" "^7.10.4"
babel-plugin-dynamic-import-node "^2.3.3"
"@babel/plugin-transform-modules-amd@^7.10.5":
version "7.10.5"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.10.5.tgz#1b9cddaf05d9e88b3aad339cb3e445c4f020a9b1"
integrity sha512-elm5uruNio7CTLFItVC/rIzKLfQ17+fX7EVz5W0TMgIHFo1zY0Ozzx+lgwhL4plzl8OzVn6Qasx5DeEFyoNiRw==
dependencies:
"@babel/helper-module-transforms" "^7.10.5"
"@babel/helper-plugin-utils" "^7.10.4"
babel-plugin-dynamic-import-node "^2.3.3"
"@babel/plugin-transform-modules-commonjs@^7.10.4":
version "7.10.4"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.10.4.tgz#66667c3eeda1ebf7896d41f1f16b17105a2fbca0"
@ -665,6 +822,16 @@
resolve "^1.8.1"
semver "^5.5.1"
"@babel/plugin-transform-runtime@^7.11.0":
version "7.11.5"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.11.5.tgz#f108bc8e0cf33c37da031c097d1df470b3a293fc"
integrity sha512-9aIoee+EhjySZ6vY5hnLjigHzunBlscx9ANKutkeWTJTx6m5Rbq6Ic01tLvO54lSusR+BxV7u4UDdCmXv5aagg==
dependencies:
"@babel/helper-module-imports" "^7.10.4"
"@babel/helper-plugin-utils" "^7.10.4"
resolve "^1.8.1"
semver "^5.5.1"
"@babel/plugin-transform-shorthand-properties@^7.10.4":
version "7.10.4"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.10.4.tgz#9fd25ec5cdd555bb7f473e5e6ee1c971eede4dd6"
@ -679,6 +846,14 @@
dependencies:
"@babel/helper-plugin-utils" "^7.10.4"
"@babel/plugin-transform-spread@^7.11.0":
version "7.11.0"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.11.0.tgz#fa84d300f5e4f57752fe41a6d1b3c554f13f17cc"
integrity sha512-UwQYGOqIdQJe4aWNyS7noqAnN2VbaczPLiEtln+zPowRNlD+79w3oi2TWfYe0eZgd+gjZCbsydN7lzWysDt+gw==
dependencies:
"@babel/helper-plugin-utils" "^7.10.4"
"@babel/helper-skip-transparent-expression-wrappers" "^7.11.0"
"@babel/plugin-transform-sticky-regex@^7.10.4":
version "7.10.4"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.10.4.tgz#8f3889ee8657581130a29d9cc91d7c73b7c4a28d"
@ -711,6 +886,15 @@
"@babel/helper-plugin-utils" "^7.10.4"
"@babel/plugin-syntax-typescript" "^7.10.4"
"@babel/plugin-transform-typescript@^7.11.0":
version "7.11.0"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.11.0.tgz#2b4879676af37342ebb278216dd090ac67f13abb"
integrity sha512-edJsNzTtvb3MaXQwj8403B7mZoGu9ElDJQZOKjGUnvilquxBA3IQoEIOvkX/1O8xfAsnHS/oQhe2w/IXrr+w0w==
dependencies:
"@babel/helper-create-class-features-plugin" "^7.10.5"
"@babel/helper-plugin-utils" "^7.10.4"
"@babel/plugin-syntax-typescript" "^7.10.4"
"@babel/plugin-transform-typescript@~7.4.0":
version "7.4.5"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.4.5.tgz#ab3351ba35307b79981993536c93ff8be050ba28"
@ -760,6 +944,14 @@
core-js "^2.6.5"
regenerator-runtime "^0.13.4"
"@babel/polyfill@^7.10.4":
version "7.11.5"
resolved "https://registry.yarnpkg.com/@babel/polyfill/-/polyfill-7.11.5.tgz#df550b2ec53abbc2ed599367ec59e64c7a707bb5"
integrity sha512-FunXnE0Sgpd61pKSj2OSOs1D44rKTD3pGOfGilZ6LGrrIH0QEtJlTjqOqdF8Bs98JmjfGhni2BBkTfv9KcKJ9g==
dependencies:
core-js "^2.6.5"
regenerator-runtime "^0.13.4"
"@babel/preset-env@^7.10.2":
version "7.10.4"
resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.10.4.tgz#fbf57f9a803afd97f4f32e4f798bb62e4b2bef5f"
@ -830,6 +1022,80 @@
levenary "^1.1.1"
semver "^5.5.0"
"@babel/preset-env@^7.11.0":
version "7.11.5"
resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.11.5.tgz#18cb4b9379e3e92ffea92c07471a99a2914e4272"
integrity sha512-kXqmW1jVcnB2cdueV+fyBM8estd5mlNfaQi6lwLgRwCby4edpavgbFhiBNjmWA3JpB/yZGSISa7Srf+TwxDQoA==
dependencies:
"@babel/compat-data" "^7.11.0"
"@babel/helper-compilation-targets" "^7.10.4"
"@babel/helper-module-imports" "^7.10.4"
"@babel/helper-plugin-utils" "^7.10.4"
"@babel/plugin-proposal-async-generator-functions" "^7.10.4"
"@babel/plugin-proposal-class-properties" "^7.10.4"
"@babel/plugin-proposal-dynamic-import" "^7.10.4"
"@babel/plugin-proposal-export-namespace-from" "^7.10.4"
"@babel/plugin-proposal-json-strings" "^7.10.4"
"@babel/plugin-proposal-logical-assignment-operators" "^7.11.0"
"@babel/plugin-proposal-nullish-coalescing-operator" "^7.10.4"
"@babel/plugin-proposal-numeric-separator" "^7.10.4"
"@babel/plugin-proposal-object-rest-spread" "^7.11.0"
"@babel/plugin-proposal-optional-catch-binding" "^7.10.4"
"@babel/plugin-proposal-optional-chaining" "^7.11.0"
"@babel/plugin-proposal-private-methods" "^7.10.4"
"@babel/plugin-proposal-unicode-property-regex" "^7.10.4"
"@babel/plugin-syntax-async-generators" "^7.8.0"
"@babel/plugin-syntax-class-properties" "^7.10.4"
"@babel/plugin-syntax-dynamic-import" "^7.8.0"
"@babel/plugin-syntax-export-namespace-from" "^7.8.3"
"@babel/plugin-syntax-json-strings" "^7.8.0"
"@babel/plugin-syntax-logical-assignment-operators" "^7.10.4"
"@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.0"
"@babel/plugin-syntax-numeric-separator" "^7.10.4"
"@babel/plugin-syntax-object-rest-spread" "^7.8.0"
"@babel/plugin-syntax-optional-catch-binding" "^7.8.0"
"@babel/plugin-syntax-optional-chaining" "^7.8.0"
"@babel/plugin-syntax-top-level-await" "^7.10.4"
"@babel/plugin-transform-arrow-functions" "^7.10.4"
"@babel/plugin-transform-async-to-generator" "^7.10.4"
"@babel/plugin-transform-block-scoped-functions" "^7.10.4"
"@babel/plugin-transform-block-scoping" "^7.10.4"
"@babel/plugin-transform-classes" "^7.10.4"
"@babel/plugin-transform-computed-properties" "^7.10.4"
"@babel/plugin-transform-destructuring" "^7.10.4"
"@babel/plugin-transform-dotall-regex" "^7.10.4"
"@babel/plugin-transform-duplicate-keys" "^7.10.4"
"@babel/plugin-transform-exponentiation-operator" "^7.10.4"
"@babel/plugin-transform-for-of" "^7.10.4"
"@babel/plugin-transform-function-name" "^7.10.4"
"@babel/plugin-transform-literals" "^7.10.4"
"@babel/plugin-transform-member-expression-literals" "^7.10.4"
"@babel/plugin-transform-modules-amd" "^7.10.4"
"@babel/plugin-transform-modules-commonjs" "^7.10.4"
"@babel/plugin-transform-modules-systemjs" "^7.10.4"
"@babel/plugin-transform-modules-umd" "^7.10.4"
"@babel/plugin-transform-named-capturing-groups-regex" "^7.10.4"
"@babel/plugin-transform-new-target" "^7.10.4"
"@babel/plugin-transform-object-super" "^7.10.4"
"@babel/plugin-transform-parameters" "^7.10.4"
"@babel/plugin-transform-property-literals" "^7.10.4"
"@babel/plugin-transform-regenerator" "^7.10.4"
"@babel/plugin-transform-reserved-words" "^7.10.4"
"@babel/plugin-transform-shorthand-properties" "^7.10.4"
"@babel/plugin-transform-spread" "^7.11.0"
"@babel/plugin-transform-sticky-regex" "^7.10.4"
"@babel/plugin-transform-template-literals" "^7.10.4"
"@babel/plugin-transform-typeof-symbol" "^7.10.4"
"@babel/plugin-transform-unicode-escapes" "^7.10.4"
"@babel/plugin-transform-unicode-regex" "^7.10.4"
"@babel/preset-modules" "^0.1.3"
"@babel/types" "^7.11.5"
browserslist "^4.12.0"
core-js-compat "^3.6.2"
invariant "^2.2.2"
levenary "^1.1.1"
semver "^5.5.0"
"@babel/preset-modules@^0.1.3":
version "0.1.3"
resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.3.tgz#13242b53b5ef8c883c3cf7dddd55b36ce80fbc72"
@ -867,6 +1133,13 @@
dependencies:
regenerator-runtime "^0.13.4"
"@babel/runtime@^7.11.0":
version "7.11.2"
resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.11.2.tgz#f549c13c754cc40b87644b9fa9f09a6a95fe0736"
integrity sha512-TeWkU52so0mPtDcaCTxNBI/IHiz0pZgr8VEFqXFtZWpYD08ZB6FaSwVAS8MKRQAP3bYKiVjwysOJgMFY28o6Tw==
dependencies:
regenerator-runtime "^0.13.4"
"@babel/template@^7.10.4", "@babel/template@^7.4.0":
version "7.10.4"
resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.10.4.tgz#3251996c4200ebc71d1a8fc405fba940f36ba278"
@ -891,6 +1164,21 @@
globals "^11.1.0"
lodash "^4.17.13"
"@babel/traverse@^7.11.5":
version "7.11.5"
resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.11.5.tgz#be777b93b518eb6d76ee2e1ea1d143daa11e61c3"
integrity sha512-EjiPXt+r7LiCZXEfRpSJd+jUMnBd4/9OUv7Nx3+0u9+eimMwJmG0Q98lw4/289JCoxSE8OolDMNZaaF/JZ69WQ==
dependencies:
"@babel/code-frame" "^7.10.4"
"@babel/generator" "^7.11.5"
"@babel/helper-function-name" "^7.10.4"
"@babel/helper-split-export-declaration" "^7.11.0"
"@babel/parser" "^7.11.5"
"@babel/types" "^7.11.5"
debug "^4.1.0"
globals "^11.1.0"
lodash "^4.17.19"
"@babel/types@^7.1.6", "@babel/types@^7.10.4", "@babel/types@^7.3.2", "@babel/types@^7.3.4", "@babel/types@^7.4.0", "@babel/types@^7.4.4", "@babel/types@^7.7.0", "@babel/types@^7.7.2":
version "7.10.4"
resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.10.4.tgz#369517188352e18219981efd156bfdb199fff1ee"
@ -900,6 +1188,15 @@
lodash "^4.17.13"
to-fast-properties "^2.0.0"
"@babel/types@^7.11.0", "@babel/types@^7.11.5":
version "7.11.5"
resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.11.5.tgz#d9de577d01252d77c6800cee039ee64faf75662d"
integrity sha512-bvM7Qz6eKnJVFIn+1LPtjlBFPVN5jNDc1XmN15vWe7Q3DPBufWWsLiIvUu7xW87uTG6QoggpIDnUgLQvPheU+Q==
dependencies:
"@babel/helper-validator-identifier" "^7.10.4"
lodash "^4.17.19"
to-fast-properties "^2.0.0"
"@cnakazawa/watch@^1.0.3":
version "1.0.4"
resolved "https://registry.yarnpkg.com/@cnakazawa/watch/-/watch-1.0.4.tgz#f864ae85004d0fcab6f50be9141c4da368d1656a"
@ -1222,15 +1519,15 @@
faker "^4.1.0"
js-yaml "^3.13.1"
"@hashicorp/consul-api-double@^3.0.0":
version "3.1.6"
resolved "https://registry.yarnpkg.com/@hashicorp/consul-api-double/-/consul-api-double-3.1.6.tgz#46095438b6989a12cab382a88fdb7b227d834794"
integrity sha512-mRH7X7k1zSu/Aq+rs5VoJYrIhD3pO57d+j98dicfs+3KaMO1mQYFYKgyugY/g0kY9FQH3+vySeZ0W5nQs45V1Q==
"@hashicorp/consul-api-double@^5.0.0":
version "5.0.0"
resolved "https://registry.yarnpkg.com/@hashicorp/consul-api-double/-/consul-api-double-5.0.0.tgz#099e56ded356421cdfa5e63b4a07c9a2232ffb88"
integrity sha512-2+Rg4mfxTTUrJiYeRWV5mEWVZTYUK1udFNMb79ygNdC/HScDvU8sTVwPrf6GuRve6oLakk1lB/D4d6AsMmtS4w==
"@hashicorp/ember-cli-api-double@^3.1.0":
version "3.1.0"
resolved "https://registry.yarnpkg.com/@hashicorp/ember-cli-api-double/-/ember-cli-api-double-3.1.0.tgz#ce228ac5c8a46c7a10112f5bc0fb782c47775b60"
integrity sha512-G8dDSewInFZOeD5sprdZPw7ZKUYlkJ9bJxPkEaMRPbC6ZN4ZHqeFWB1xXeq2ROtR07J6Xbs+BrFIE6GHTshpEg==
version "3.1.1"
resolved "https://registry.yarnpkg.com/@hashicorp/ember-cli-api-double/-/ember-cli-api-double-3.1.1.tgz#ba16a514131ce409054d1ae1a71483941d937d37"
integrity sha512-VLvV/m+Sx+vG+tHK1FeVjiBXwt8KcIWqgFavglrEBTkVTA2o7uP0xN9nKOJjos49KK+h1K3fCwMK5ltz7Kt97w==
dependencies:
"@hashicorp/api-double" "^1.6.1"
array-range "^1.0.1"
@ -2298,6 +2595,13 @@ babel-plugin-ember-modules-api-polyfill@^2.13.4, babel-plugin-ember-modules-api-
dependencies:
ember-rfc176-data "^0.3.13"
babel-plugin-ember-modules-api-polyfill@^3.1.1:
version "3.1.1"
resolved "https://registry.yarnpkg.com/babel-plugin-ember-modules-api-polyfill/-/babel-plugin-ember-modules-api-polyfill-3.1.1.tgz#c6e9ede43b64c4e36512f260e42e829b071d9b4f"
integrity sha512-hRTnr59fJ6cIiSiSgQLM9QRiVv/RrBAYRYggCPQDj4dvYhOWZeoX6e+1jFY1qC3tJnSDuMWu3OrDciSIi1MJ0A==
dependencies:
ember-rfc176-data "^0.3.15"
babel-plugin-filter-imports@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/babel-plugin-filter-imports/-/babel-plugin-filter-imports-3.0.0.tgz#a849683837ad29960da17492fb32789ab6b09a11"
@ -2995,6 +3299,24 @@ broccoli-babel-transpiler@^7.3.0, broccoli-babel-transpiler@^7.5.0:
rsvp "^4.8.4"
workerpool "^3.1.1"
broccoli-babel-transpiler@^7.7.0:
version "7.7.0"
resolved "https://registry.yarnpkg.com/broccoli-babel-transpiler/-/broccoli-babel-transpiler-7.7.0.tgz#271d401e713bfd338d5ef0435d3c4c68f6eddd2a"
integrity sha512-U8Cmnv0/AcQKehiIVi6UDzqq3jqhAEbY9CvOW5vdeNRmYhFpK6bXPmVczS/nUz5g4KsPc/FdnC3zbU6yVf4e7w==
dependencies:
"@babel/core" "^7.11.0"
"@babel/polyfill" "^7.10.4"
broccoli-funnel "^2.0.2"
broccoli-merge-trees "^3.0.2"
broccoli-persistent-filter "^2.2.1"
clone "^2.1.2"
hash-for-dep "^1.4.7"
heimdalljs "^0.2.1"
heimdalljs-logger "^0.1.9"
json-stable-stringify "^1.0.1"
rsvp "^4.8.4"
workerpool "^3.1.1"
broccoli-builder@^0.18.14:
version "0.18.14"
resolved "https://registry.yarnpkg.com/broccoli-builder/-/broccoli-builder-0.18.14.tgz#4b79e2f844de11a4e1b816c3f49c6df4776c312d"
@ -3807,6 +4129,13 @@ cacheable-request@^2.1.1:
normalize-url "2.0.1"
responselike "1.0.2"
calculate-cache-key-for-tree@^1.1.0:
version "1.2.3"
resolved "https://registry.yarnpkg.com/calculate-cache-key-for-tree/-/calculate-cache-key-for-tree-1.2.3.tgz#5a5e4fcfa2d374a63e47fe967593f179e8282825"
integrity sha512-PPQorvdNw8K8k7UftCeradwOmKDSDJs8wcqYTtJPEt3fHbZyK8QsorybJA+lOmk0dgE61vX6R+5Kd3W9h4EMGg==
dependencies:
json-stable-stringify "^1.0.1"
calculate-cache-key-for-tree@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/calculate-cache-key-for-tree/-/calculate-cache-key-for-tree-2.0.0.tgz#7ac57f149a4188eacb0a45b210689215d3fef8d6"
@ -3849,11 +4178,16 @@ can-symlink@^1.0.0:
dependencies:
tmp "0.0.28"
caniuse-lite@^1.0.30000792, caniuse-lite@^1.0.30000805, caniuse-lite@^1.0.30000844, caniuse-lite@^1.0.30001093:
caniuse-lite@^1.0.30000792, caniuse-lite@^1.0.30000805, caniuse-lite@^1.0.30001093:
version "1.0.30001096"
resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001096.tgz#5a4541af5317dc21f91f5b24d453030a35f919c0"
integrity sha512-PFTw9UyVfbkcMEFs82q8XVlRayj7HKvnhu5BLcmjGpv+SNyiWasCcWXPGJuO0rK0dhLRDJmtZcJ+LHUfypbw1w==
caniuse-lite@^1.0.30000844:
version "1.0.30001125"
resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001125.tgz#2a1a51ee045a0a2207474b086f628c34725e997b"
integrity sha512-9f+r7BW8Qli917mU3j0fUaTweT3f3vnX/Lcs+1C73V+RADmFme+Ih0Br8vONQi3X0lseOe6ZHfsZLCA8MSjxUA==
capture-exit@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/capture-exit/-/capture-exit-2.0.0.tgz#fb953bfaebeb781f62898239dabb426d08a509a4"
@ -4897,11 +5231,16 @@ ee-first@1.1.1:
resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d"
integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=
electron-to-chromium@^1.3.30, electron-to-chromium@^1.3.47, electron-to-chromium@^1.3.488:
electron-to-chromium@^1.3.30, electron-to-chromium@^1.3.488:
version "1.3.494"
resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.494.tgz#0d2dba65b69d696c5b71abb37552ff055fb32a5c"
integrity sha512-EOZuaDT3L1sCIMAVN5J0nGuGWVq5dThrdl0d8XeDYf4MOzbXqZ19OLKesN8TZj0RxtpYjqHpiw/fR6BKWdMwYA==
electron-to-chromium@^1.3.47:
version "1.3.565"
resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.565.tgz#8511797ab2b66b767e1aef4eb17d636bf01a2c72"
integrity sha512-me5dGlHFd8Q7mKhqbWRLIYnKjw4i0fO6hmW0JBxa7tM87fBfNEjWokRnDF7V+Qme/9IYpwhfMn+soWs40tXWqg==
elliptic@^6.0.0, elliptic@^6.5.2:
version "6.5.3"
resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.3.tgz#cb59eb2efdaf73a0bd78ccd7015a62ad6e0f93d6"
@ -5022,6 +5361,38 @@ 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"
integrity sha512-Zr4my8Xn+CzO0gIuFNXji0eTRml5AxZUTDQz/wsNJ5AJAtyFWCY4QtKdoELNNbiCVGt1lq5yLiwTm4scGKu6xA==
ember-cli-babel@7:
version "7.22.1"
resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-7.22.1.tgz#cad28b89cf0e184c93b863d09bc5ba4ce1d2e453"
integrity sha512-kCT8WbC1AYFtyOpU23ESm22a+gL6fWv8Nzwe8QFQ5u0piJzM9MEudfbjADEaoyKTrjMQTDsrWwEf3yjggDsOng==
dependencies:
"@babel/core" "^7.11.0"
"@babel/helper-compilation-targets" "^7.10.4"
"@babel/plugin-proposal-class-properties" "^7.10.4"
"@babel/plugin-proposal-decorators" "^7.10.5"
"@babel/plugin-transform-modules-amd" "^7.10.5"
"@babel/plugin-transform-runtime" "^7.11.0"
"@babel/plugin-transform-typescript" "^7.11.0"
"@babel/polyfill" "^7.10.4"
"@babel/preset-env" "^7.11.0"
"@babel/runtime" "^7.11.0"
amd-name-resolver "^1.2.1"
babel-plugin-debug-macros "^0.3.3"
babel-plugin-ember-data-packages-polyfill "^0.1.2"
babel-plugin-ember-modules-api-polyfill "^3.1.1"
babel-plugin-module-resolver "^3.1.1"
broccoli-babel-transpiler "^7.7.0"
broccoli-debug "^0.6.4"
broccoli-funnel "^2.0.1"
broccoli-source "^1.1.0"
clone "^2.1.2"
ember-cli-babel-plugin-helpers "^1.1.0"
ember-cli-version-checker "^4.1.0"
ensure-posix-path "^1.0.2"
fixturify-project "^1.10.0"
rimraf "^3.0.1"
semver "^5.5.0"
ember-cli-babel@^6.0.0, ember-cli-babel@^6.0.0-beta.4, 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"
resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-6.18.0.tgz#3f6435fd275172edeff2b634ee7b29ce74318957"
@ -5549,7 +5920,7 @@ ember-collection@^1.0.0-alpha.9:
ember-cli-htmlbars "^3.0.1"
layout-bin-packer "^1.4.0"
ember-compatibility-helpers@^1.1.1, ember-compatibility-helpers@^1.1.2, ember-compatibility-helpers@^1.2.0:
ember-compatibility-helpers@^1.1.1, ember-compatibility-helpers@^1.1.2, ember-compatibility-helpers@^1.2.0, ember-compatibility-helpers@^1.2.1:
version "1.2.1"
resolved "https://registry.yarnpkg.com/ember-compatibility-helpers/-/ember-compatibility-helpers-1.2.1.tgz#87c92c4303f990ff455c28ca39fb3ee11441aa16"
integrity sha512-6wzYvnhg1ihQUT5yGqnLtleq3Nv5KNv79WhrEuNU9SwR4uIxCO+KpyC7r3d5VI0EM7/Nmv9Nd0yTkzmTMdVG1A==
@ -5594,13 +5965,27 @@ ember-concurrency@^1.2.1:
ember-compatibility-helpers "^1.2.0"
ember-maybe-import-regenerator "^0.1.6"
ember-copy@^1.0.0:
ember-copy@1.0.0, 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-model-fragments@5.0.0-beta.0:
version "5.0.0-beta.0"
resolved "https://registry.yarnpkg.com/ember-data-model-fragments/-/ember-data-model-fragments-5.0.0-beta.0.tgz#da90799970317ca852f96b2ea1548ca70094a5bb"
integrity sha512-vjApz3ZWSiLyUUU2IRi/ArKVBJe+iW+BvKkiQ6an/e7ln4Jt06P9xXm1Fu3hfqkQOQlfn7QkUnlzm4XxRtlMfg==
dependencies:
broccoli-file-creator "^2.1.1"
broccoli-merge-trees "^3.0.0"
calculate-cache-key-for-tree "^1.1.0"
ember-cli-babel "7"
ember-compatibility-helpers "^1.2.1"
ember-copy "1.0.0"
git-repo-info "^2.0.0"
npm-git-info "^1.0.3"
ember-data@~3.16.0:
version "3.16.8"
resolved "https://registry.yarnpkg.com/ember-data/-/ember-data-3.16.8.tgz#2d25a2cd37f4952ea92df464a5b10c70cd0b20e1"
@ -5824,11 +6209,16 @@ ember-resolver@^8.0.0:
ember-cli-version-checker "^5.0.2"
resolve "^1.15.1"
ember-rfc176-data@^0.3.12, ember-rfc176-data@^0.3.13:
ember-rfc176-data@^0.3.12:
version "0.3.13"
resolved "https://registry.yarnpkg.com/ember-rfc176-data/-/ember-rfc176-data-0.3.13.tgz#ed1712a26e65fec703655f35410414aa1982cf3b"
integrity sha512-m9JbwQlT6PjY7x/T8HslnXP7Sz9bx/pz3FrNfNi2NesJnbNISly0Lix6NV1fhfo46572cpq4jrM+/6yYlMefTQ==
ember-rfc176-data@^0.3.13, ember-rfc176-data@^0.3.15:
version "0.3.15"
resolved "https://registry.yarnpkg.com/ember-rfc176-data/-/ember-rfc176-data-0.3.15.tgz#af3f1da5a0339b6feda380edc2f7190e0f416c2d"
integrity sha512-GPKa7zRDBblRy0orxTXt5yrpp/Pf5CkuRFSIR8qMFDww0CqCKjCRwdZnWYzCM4kAEfZnXRIDDefe1tBaFw7v7w==
ember-router-generator@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/ember-router-generator/-/ember-router-generator-2.0.0.tgz#d04abfed4ba8b42d166477bbce47fccc672dbde0"
@ -7175,7 +7565,7 @@ git-repo-info@^1.4.1:
resolved "https://registry.yarnpkg.com/git-repo-info/-/git-repo-info-1.4.1.tgz#2a072823254aaf62fcf0766007d7b6651bd41943"
integrity sha1-KgcoIyVKr2L88HZgB9e2ZRvUGUM=
git-repo-info@^2.1.1:
git-repo-info@^2.0.0, git-repo-info@^2.1.1:
version "2.1.1"
resolved "https://registry.yarnpkg.com/git-repo-info/-/git-repo-info-2.1.1.tgz#220ffed8cbae74ef8a80e3052f2ccb5179aed058"
integrity sha512-8aCohiDo4jwjOwma4FmYFd3i97urZulL8XL24nIPxuE+GZnfsAyy/g2Shqx6OjUiFKUXZM+Yy+KHnOmmA3FVcg==
@ -8851,11 +9241,16 @@ lodash.uniqby@^4.7.0:
resolved "https://registry.yarnpkg.com/lodash.uniqby/-/lodash.uniqby-4.7.0.tgz#d99c07a669e9e6d24e1362dfe266c67616af1302"
integrity sha1-2ZwHpmnp5tJOE2Lf4mbGdhavEwI=
lodash@^4.0.0, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.12, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.4, lodash@^4.5.1, lodash@~4.17.10:
lodash@^4.0.0, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.12, lodash@^4.17.13, lodash@^4.17.15, lodash@^4.5.1, lodash@~4.17.10:
version "4.17.19"
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.19.tgz#e48ddedbe30b3321783c5b4301fbd353bc1e4a4b"
integrity sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==
lodash@^4.17.14, lodash@^4.17.19, lodash@^4.17.4:
version "4.17.20"
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.20.tgz#b44a9b6297bcb698f1c51a3545a2b3b368d59c52"
integrity sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==
log-symbols@^2.2.0:
version "2.2.0"
resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-2.2.0.tgz#5740e1c5d6f0dfda4ad9323b5332107ef6b4c40a"