ui: Read-only CRD/Centralized Config Intentions (#8659)
This commit is contained in:
parent
c6fa758d6f
commit
65f2cd891b
|
@ -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}}
|
||||
|
|
|
@ -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>
|
|
@ -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);
|
||||
},
|
||||
},
|
||||
});
|
|
@ -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>
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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> </th>
|
||||
<th>Destination</th>
|
||||
<th>Precedence</th>
|
||||
<th class="source">Source</th>
|
||||
<th class="intent"> </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"> </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>
|
||||
|
|
|
@ -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}}
|
|
@ -0,0 +1,5 @@
|
|||
import Component from '@ember/component';
|
||||
|
||||
export default Component.extend({
|
||||
tagName: '',
|
||||
});
|
|
@ -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>
|
|
@ -0,0 +1,5 @@
|
|||
import Component from '@ember/component';
|
||||
|
||||
export default Component.extend({
|
||||
tagName: '',
|
||||
});
|
|
@ -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}}
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
|
@ -0,0 +1,6 @@
|
|||
import Component from '@ember/component';
|
||||
import Slotted from 'block-slots';
|
||||
|
||||
export default Component.extend(Slotted, {
|
||||
tagName: '',
|
||||
});
|
|
@ -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 '';
|
||||
});
|
||||
|
|
|
@ -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'),
|
||||
});
|
|
@ -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');
|
||||
}),
|
||||
});
|
|
@ -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'),
|
||||
});
|
|
@ -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'),
|
||||
|
|
|
@ -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' },
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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
|
||||
);
|
||||
},
|
||||
});
|
||||
|
|
|
@ -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 = {
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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: '';
|
||||
|
|
|
@ -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>');
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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';
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -0,0 +1,4 @@
|
|||
@import './consul-intention-fieldsets/index';
|
||||
.consul-intention-fieldsets {
|
||||
@extend %consul-intention-fieldsets;
|
||||
}
|
|
@ -0,0 +1,2 @@
|
|||
@import './skin';
|
||||
@import './layout';
|
|
@ -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;
|
||||
}
|
|
@ -0,0 +1,2 @@
|
|||
%consul-intention-fieldsets {
|
||||
}
|
|
@ -0,0 +1,4 @@
|
|||
@import './consul-intention-list/index';
|
||||
.consul-intention-list {
|
||||
@extend %consul-intention-list;
|
||||
}
|
|
@ -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;
|
||||
}
|
|
@ -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;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,3 @@
|
|||
%consul-intention-list td.permissions {
|
||||
color: $blue-500;
|
||||
}
|
|
@ -0,0 +1,4 @@
|
|||
@import './consul-intention-permission-list/index';
|
||||
.consul-intention-permission-list {
|
||||
@extend %consul-intention-permission-list;
|
||||
}
|
|
@ -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;
|
||||
}
|
|
@ -0,0 +1,3 @@
|
|||
%consul-intention-permission-list strong {
|
||||
margin-right: 8px;
|
||||
}
|
|
@ -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';
|
||||
}
|
|
@ -104,9 +104,6 @@
|
|||
display: block;
|
||||
width: 33px;
|
||||
}
|
||||
%route-card section header > *::before {
|
||||
padding: 0 8px;
|
||||
}
|
||||
/**/
|
||||
/* resolver */
|
||||
%resolver-card a {
|
||||
|
|
|
@ -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';
|
||||
|
|
|
@ -13,6 +13,9 @@ label span {
|
|||
%main-content form {
|
||||
@extend %form;
|
||||
}
|
||||
%form span.label {
|
||||
@extend %form-element-label;
|
||||
}
|
||||
%form table,
|
||||
%radio-group,
|
||||
%checkbox-group,
|
||||
|
|
|
@ -0,0 +1,4 @@
|
|||
@import './list-row/index';
|
||||
.list-row {
|
||||
@extend %list-row;
|
||||
}
|
|
@ -0,0 +1,2 @@
|
|||
@import './skin';
|
||||
@import './layout';
|
|
@ -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;
|
||||
}
|
|
@ -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;
|
||||
}
|
|
@ -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;
|
||||
|
|
|
@ -0,0 +1,4 @@
|
|||
@import './radio-card/index';
|
||||
.radio-card {
|
||||
@extend %radio-card;
|
||||
}
|
|
@ -0,0 +1,2 @@
|
|||
@import './skin';
|
||||
@import './layout';
|
|
@ -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;
|
||||
}
|
|
@ -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;
|
||||
}
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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}}
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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",
|
||||
|
|
|
@ -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
|
||||
---
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
});
|
||||
});
|
||||
});
|
||||
|
|
|
@ -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,
|
||||
|
|
423
ui-v2/yarn.lock
423
ui-v2/yarn.lock
|
@ -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"
|
||||
|
|
Loading…
Reference in New Issue