diff --git a/.gitignore b/.gitignore index 80cb94003..95852e8ad 100644 --- a/.gitignore +++ b/.gitignore @@ -22,6 +22,7 @@ testem.log yarn-error.log storybook-static **/.storybook/*.html +.watchman-cookie* # ember-try .node_modules.ember-try diff --git a/addons/api/addon/generated/models/credential-library.js b/addons/api/addon/generated/models/credential-library.js new file mode 100644 index 000000000..895c467f9 --- /dev/null +++ b/addons/api/addon/generated/models/credential-library.js @@ -0,0 +1,42 @@ +import BaseModel from '../../models/base'; +import { attr } from '@ember-data/model'; + +/** + * A credential library is a resource that can generate and retrieve + * credentials. + */ +export default class GeneratedCredentialLibraryModel extends BaseModel { + // =attributes + + @attr('string', { + description: 'The owning credential store ID.', + }) + credential_store_id; + + @attr('string', { + description: 'Optional name for identification purposes', + }) + name; + + @attr('string', { + description: 'Optional user-set description for identification purposes', + }) + description; + + @attr('date', { + description: 'The time this resource was created\nOutput only.', + readOnly: true, + }) + created_time; + + @attr('date', { + description: 'The time this resource was last updated\nOutput only.', + readOnly: true, + }) + updated_time; + + @attr('number', { + description: 'Current version number of this resource.', + }) + version; +} diff --git a/addons/api/addon/generated/models/credential-store.js b/addons/api/addon/generated/models/credential-store.js index 78834dc51..51dd4af87 100644 --- a/addons/api/addon/generated/models/credential-store.js +++ b/addons/api/addon/generated/models/credential-store.js @@ -5,7 +5,7 @@ import { attr } from '@ember-data/model'; * A credential store is a resource that can retrieve, store, and potentially * generate credentials. */ -export default class GeneratedAccountModel extends BaseModel { +export default class GeneratedCredentialStoreModel extends BaseModel { // =attributes @attr('string', { diff --git a/addons/api/addon/models/credential-library.js b/addons/api/addon/models/credential-library.js new file mode 100644 index 000000000..c95b9f73e --- /dev/null +++ b/addons/api/addon/models/credential-library.js @@ -0,0 +1,23 @@ +import GeneratedCredentialLibraryModel from '../generated/models/credential-library'; +import { attr } from '@ember-data/model'; +import { fragment } from 'ember-data-model-fragments/attributes'; + +export default class CredentialLibraryModel extends GeneratedCredentialLibraryModel { + // =error attributes + // These attributes exist solely to capture errors on nested fields. + // See the application adapter's error normalization method for + // more information. + + @attr('string', { readOnly: true }) attributes_http_method; + @attr('string', { readOnly: true }) attributes_http_request_body; + @attr('string', { readOnly: true }) attributes_path; + + // =attributes + + /** + * Attributes of this resource, if any, represented as a JSON fragment. + * @type {FragmentCredentialLibraryAttributesModel} + */ + @fragment('fragment-credential-library-attributes', { defaultValue: {} }) + attributes; +} diff --git a/addons/api/addon/models/fragment-credential-library-attributes.js b/addons/api/addon/models/fragment-credential-library-attributes.js new file mode 100644 index 000000000..dd6138199 --- /dev/null +++ b/addons/api/addon/models/fragment-credential-library-attributes.js @@ -0,0 +1,23 @@ +import Fragment from 'ember-data-model-fragments/fragment'; +import { attr } from '@ember-data/model'; + +export default class FragmentCredentialLibraryAttributesModel extends Fragment { + //= attributes (vault) + + @attr('string', { + description: + 'The HTTP method the library uses when requesting credentials from Vault.', + }) + http_method; + + @attr('string', { + description: + 'The body of the HTTP request the library sends to Vault when requesting credentials. Only valid if `http_method` is set to `POST`.', + }) + http_request_body; + + @attr('string', { + description: 'The path in Vault to request credentials from.', + }) + path; +} diff --git a/addons/api/addon/serializers/credential-library.js b/addons/api/addon/serializers/credential-library.js new file mode 100644 index 000000000..d1ced9a2b --- /dev/null +++ b/addons/api/addon/serializers/credential-library.js @@ -0,0 +1,3 @@ +import ApplicationSerializer from './application'; + +export default class CredentialLibrarySerializer extends ApplicationSerializer {} diff --git a/addons/api/addon/serializers/fragment-credential-library-attributes.js b/addons/api/addon/serializers/fragment-credential-library-attributes.js new file mode 100644 index 000000000..8d52b101f --- /dev/null +++ b/addons/api/addon/serializers/fragment-credential-library-attributes.js @@ -0,0 +1,27 @@ +import JSONSerializer from '@ember-data/serializer/json'; + +export default class FragmentCredentialLibraryAttributesSerializer extends JSONSerializer { + /** + * If an attribute is annotated as readOnly in the model, don't serialize it. + * Otherwise delegate to default attribute serializer. + * Only serialize http_request_body when `http_method` is set to `POST`. + * @override + * @method serializeAttribute + * @param {Snapshot} snapshot + * @param {Object} json + * @param {String} key + * @param {Object} attribute + */ + serializeAttribute(snapshot, json, key, attribute) { + const { type, options } = attribute; + let value = super.serializeAttribute(...arguments); + // Convert empty strings to null. + if (type === 'string' && json[key] === '') json[key] = null; + // Do not serialize read-only attributes. + if (options.readOnly) delete json[key]; + // Do not serialize http_request_body unless http_method is POST + if (key === 'http_request_body' && !json['http_method']?.match(/post/i)) + delete json[key]; + return value; + } +} diff --git a/addons/api/app/models/credential-library.js b/addons/api/app/models/credential-library.js new file mode 100644 index 000000000..b9f39e29d --- /dev/null +++ b/addons/api/app/models/credential-library.js @@ -0,0 +1 @@ +export { default } from 'api/models/credential-library'; diff --git a/addons/api/app/models/fragment-credential-library-attributes.js b/addons/api/app/models/fragment-credential-library-attributes.js new file mode 100644 index 000000000..04d8f2597 --- /dev/null +++ b/addons/api/app/models/fragment-credential-library-attributes.js @@ -0,0 +1 @@ +export { default } from 'api/models/fragment-credential-library-attributes'; diff --git a/addons/api/app/serializers/credential-library.js b/addons/api/app/serializers/credential-library.js new file mode 100644 index 000000000..2a76b7b03 --- /dev/null +++ b/addons/api/app/serializers/credential-library.js @@ -0,0 +1 @@ +export { default } from 'api/serializers/credential-library'; diff --git a/addons/api/app/serializers/fragment-credential-library-attributes.js b/addons/api/app/serializers/fragment-credential-library-attributes.js new file mode 100644 index 000000000..d16c81e21 --- /dev/null +++ b/addons/api/app/serializers/fragment-credential-library-attributes.js @@ -0,0 +1 @@ +export { default } from 'api/serializers/fragment-credential-library-attributes'; diff --git a/addons/api/mirage/config.js b/addons/api/mirage/config.js index 1b495c0b2..1fd364182 100644 --- a/addons/api/mirage/config.js +++ b/addons/api/mirage/config.js @@ -464,6 +464,24 @@ export default function () { credentialStores.where({ scopeId }) ); + this.get('/credential-stores/:id'); + this.post('/credential-stores'); + this.patch('/credential-stores/:id'); + + // credential-libraries + + this.get( + '/credential-libraries', + ( + { credentialLibraries }, + { queryParams: { credential_store_id: credentialStoreId } } + ) => credentialLibraries.where({ credentialStoreId }) + ); + this.get('/credential-libraries/:id'); + this.post('/credential-libraries/:id'); + this.del('/credential-libraries/:id'); + this.patch('/credential-libraries/:id'); + /* Uncomment the following line and the Response import above * Then change the response code to simulate error responses. * this.get('/scopes', () => new Response(505)); diff --git a/addons/api/mirage/factories/credential-library.js b/addons/api/mirage/factories/credential-library.js new file mode 100644 index 000000000..f1127d5ef --- /dev/null +++ b/addons/api/mirage/factories/credential-library.js @@ -0,0 +1,14 @@ +import factory from '../generated/factories/credential-library'; +import { random, system } from 'faker'; + +export default factory.extend({ + id: (i) => `credential-library-id-${i}`, + + attributes() { + return { + http_method: 'GET', + http_request_body: random.word(), + path: system.directoryPath(), + }; + }, +}); diff --git a/addons/api/mirage/factories/credential-store.js b/addons/api/mirage/factories/credential-store.js index e143b5906..d1b037c7d 100644 --- a/addons/api/mirage/factories/credential-store.js +++ b/addons/api/mirage/factories/credential-store.js @@ -1,5 +1,6 @@ import factory from '../generated/factories/credential-store'; import { random, internet, datatype } from 'faker'; +import { trait } from 'ember-cli-mirage'; const types = ['vault']; @@ -22,4 +23,14 @@ export default factory.extend({ }; } }, + + withAssociations: trait({ + afterCreate(credentialStore, server) { + const { scope } = credentialStore; + server.createList('credential-library', 2, { + scope, + credentialStore, + }); + }, + }), }); diff --git a/addons/api/mirage/generated/factories/credential-library.js b/addons/api/mirage/generated/factories/credential-library.js new file mode 100644 index 000000000..b2e001493 --- /dev/null +++ b/addons/api/mirage/generated/factories/credential-library.js @@ -0,0 +1,12 @@ +import { Factory } from 'ember-cli-mirage'; +import { random, date } from 'faker'; + +/** + * GeneratedCredentialLibraryModelFactory + */ +export default Factory.extend({ + name: () => random.words(), + description: () => random.words(), + created_time: () => date.recent(), + updated_time: () => date.recent(), +}); diff --git a/addons/api/mirage/generated/factories/credential-store.js b/addons/api/mirage/generated/factories/credential-store.js index 1fb24e39e..2b8a86dd2 100644 --- a/addons/api/mirage/generated/factories/credential-store.js +++ b/addons/api/mirage/generated/factories/credential-store.js @@ -2,7 +2,7 @@ import { Factory } from 'ember-cli-mirage'; import { random, date } from 'faker'; /** - * GeneratedAuthMethodModelFactory + * GeneratedCredentialStoreModelFactory */ export default Factory.extend({ name: () => random.words(), diff --git a/addons/api/mirage/models/credential-library.js b/addons/api/mirage/models/credential-library.js new file mode 100644 index 000000000..921a63182 --- /dev/null +++ b/addons/api/mirage/models/credential-library.js @@ -0,0 +1,6 @@ +import { Model, belongsTo } from 'ember-cli-mirage'; + +export default Model.extend({ + scope: belongsTo(), + credentialStore: belongsTo(), +}); diff --git a/addons/api/mirage/scenarios/default.js b/addons/api/mirage/scenarios/default.js index 12adb6c5d..fc5931908 100644 --- a/addons/api/mirage/scenarios/default.js +++ b/addons/api/mirage/scenarios/default.js @@ -49,6 +49,6 @@ export default function (server) { server.createList('host-catalog', 2, { scope }, 'withChildren'); server.createList('target', 2, { scope }, 'withRandomHostSets'); server.createList('session', 4, { scope }, 'withAssociations'); - server.createList('credential-store', 3, { scope }); + server.createList('credential-store', 3, { scope }, 'withAssociations'); }); } diff --git a/addons/api/mirage/serializers/credential-library.js b/addons/api/mirage/serializers/credential-library.js new file mode 100644 index 000000000..fd65fc743 --- /dev/null +++ b/addons/api/mirage/serializers/credential-library.js @@ -0,0 +1,14 @@ +import ApplicationSerializer from './application'; + +export default ApplicationSerializer.extend({ + modelName: 'credential-library', + + _hashForModel(model) { + const json = ApplicationSerializer.prototype._hashForModel.apply( + this, + arguments + ); + json.credential_store_id = model.credentialStoreId; + return json; + }, +}); diff --git a/addons/api/package.json b/addons/api/package.json index 52ebe6aab..1bf61697c 100644 --- a/addons/api/package.json +++ b/addons/api/package.json @@ -40,7 +40,7 @@ "broccoli-asset-rev": "^3.0.0", "doctoc": "^2.0.0", "ember-auto-import": "^1.10.1", - "ember-cli": "~3.24.0", + "ember-cli": "~3.27.0", "ember-cli-dependency-checker": "^3.2.0", "ember-cli-inject-live-reload": "^2.1.0", "ember-cli-sri": "^2.1.1", diff --git a/addons/api/tests/unit/models/credential-library-test.js b/addons/api/tests/unit/models/credential-library-test.js new file mode 100644 index 000000000..4cd00ab05 --- /dev/null +++ b/addons/api/tests/unit/models/credential-library-test.js @@ -0,0 +1,13 @@ +import { module, test } from 'qunit'; +import { setupTest } from 'ember-qunit'; + +module('Unit | Model | credential library', function (hooks) { + setupTest(hooks); + + // Replace this with your real tests. + test('it exists', function (assert) { + let store = this.owner.lookup('service:store'); + let model = store.createRecord('credential-library', {}); + assert.ok(model); + }); +}); diff --git a/addons/api/tests/unit/models/fragment-credential-library-attributes-test.js b/addons/api/tests/unit/models/fragment-credential-library-attributes-test.js new file mode 100644 index 000000000..01f649c1e --- /dev/null +++ b/addons/api/tests/unit/models/fragment-credential-library-attributes-test.js @@ -0,0 +1,19 @@ +import { module, test } from 'qunit'; +import { setupTest } from 'ember-qunit'; + +module( + 'Unit | Model | fragment credential library attributes', + function (hooks) { + setupTest(hooks); + + // Replace this with your real tests. + test('it exists', function (assert) { + let store = this.owner.lookup('service:store'); + let model = store.createRecord( + 'fragment-credential-library-attributes', + {} + ); + assert.ok(model); + }); + } +); diff --git a/addons/api/tests/unit/serializers/credential-library-test.js b/addons/api/tests/unit/serializers/credential-library-test.js new file mode 100644 index 000000000..4be3c76f2 --- /dev/null +++ b/addons/api/tests/unit/serializers/credential-library-test.js @@ -0,0 +1,67 @@ +import { module, test } from 'qunit'; +import { setupTest } from 'ember-qunit'; + +module('Unit | Serializer | credential library', function (hooks) { + setupTest(hooks); + + test('it serializes correctly on create', function (assert) { + assert.expect(1); + const store = this.owner.lookup('service:store'); + const serializer = store.serializerFor('credential-library'); + const record = store.createRecord('credential-library', { + name: 'Name', + description: 'Description', + attributes: { + path: '/vault/path', + http_method: 'GET', + }, + version: 1, + }); + const snapshot = record._createSnapshot(); + const serializedRecord = serializer.serialize(snapshot); + assert.deepEqual(serializedRecord, { + credential_store_id: null, + name: 'Name', + description: 'Description', + version: 1, + attributes: { + path: '/vault/path', + http_method: 'GET', + }, + }); + }); + + test('it serializes correctly on update', function (assert) { + assert.expect(1); + const store = this.owner.lookup('service:store'); + const serializer = store.serializerFor('credential-library'); + store.push({ + data: { + id: '1', + type: 'credential-library', + attributes: { + name: 'Name', + description: 'Description', + attributes: { + path: '/vault/path', + http_method: 'GET', + }, + version: 1, + }, + }, + }); + const record = store.peekRecord('credential-library', '1'); + const snapshot = record._createSnapshot(); + const serializedRecord = serializer.serialize(snapshot); + assert.deepEqual(serializedRecord, { + credential_store_id: null, + name: 'Name', + description: 'Description', + attributes: { + path: '/vault/path', + http_method: 'GET', + }, + version: 1, + }); + }); +}); diff --git a/addons/api/tests/unit/serializers/fragment-credential-library-attributes-test.js b/addons/api/tests/unit/serializers/fragment-credential-library-attributes-test.js new file mode 100644 index 000000000..72818936c --- /dev/null +++ b/addons/api/tests/unit/serializers/fragment-credential-library-attributes-test.js @@ -0,0 +1,59 @@ +import { module, test } from 'qunit'; +import { setupTest } from 'ember-qunit'; + +module( + 'Unit | Serializer | fragment credential library attributes', + function (hooks) { + setupTest(hooks); + + test('it serializes empty strings to null', function (assert) { + assert.expect(1); + const store = this.owner.lookup('service:store'); + const record = store.createRecord( + 'fragment-credential-library-attributes', + { + http_method: '', + path: null, + } + ); + let serializedRecord = record.serialize(); + assert.deepEqual(serializedRecord, { + http_method: null, + path: null, + }); + }); + + test('it does not serialize http_request_body unless http_method is set to POST', function (assert) { + assert.expect(2); + const store = this.owner.lookup('service:store'); + const record = store.createRecord( + 'fragment-credential-library-attributes', + { + http_method: 'GET', + http_request_body: 'body', + } + ); + let serializedRecord = record.serialize(); + assert.deepEqual( + serializedRecord, + { + http_method: 'GET', + path: null, + }, + 'http_request_body attribute is not expected' + ); + + record.http_method = 'POST'; + serializedRecord = record.serialize(); + assert.deepEqual( + serializedRecord, + { + http_method: 'POST', + http_request_body: 'body', + path: null, + }, + 'http_request_body attribute is expected' + ); + }); + } +); diff --git a/addons/auth/package.json b/addons/auth/package.json index 9e892171d..9d27bee7c 100644 --- a/addons/auth/package.json +++ b/addons/auth/package.json @@ -35,7 +35,7 @@ "core": "*", "doctoc": "^2.0.0", "ember-auto-import": "^1.10.1", - "ember-cli": "~3.24.0", + "ember-cli": "~3.27.0", "ember-cli-dependency-checker": "^3.2.0", "ember-cli-inject-live-reload": "^2.1.0", "ember-cli-sri": "^2.1.1", diff --git a/addons/core/package.json b/addons/core/package.json index 652ab7130..1e3f3ef9a 100644 --- a/addons/core/package.json +++ b/addons/core/package.json @@ -50,7 +50,7 @@ "broccoli-asset-rev": "^3.0.0", "doctoc": "^2.0.0", "ember-auto-import": "^1.10.1", - "ember-cli": "~3.24.0", + "ember-cli": "~3.27.0", "ember-cli-dependency-checker": "^3.2.0", "ember-cli-inject-live-reload": "^2.1.0", "ember-cli-sri": "^2.1.1", diff --git a/addons/rose/package.json b/addons/rose/package.json index d42a683c7..dad7f51cb 100644 --- a/addons/rose/package.json +++ b/addons/rose/package.json @@ -53,7 +53,7 @@ "broccoli-asset-rev": "^3.0.0", "doctoc": "^2.0.0", "ember-auto-import": "^1.10.1", - "ember-cli": "~3.24.0", + "ember-cli": "~3.27.0", "ember-cli-dependency-checker": "^3.2.0", "ember-cli-inject-live-reload": "^2.1.0", "ember-cli-sass": "^10.0.1", diff --git a/ui/admin/app/components/form/credential-store/index.hbs b/ui/admin/app/components/form/credential-store/index.hbs new file mode 100644 index 000000000..f972854c1 --- /dev/null +++ b/ui/admin/app/components/form/credential-store/index.hbs @@ -0,0 +1,38 @@ + + + + + + + + + \ No newline at end of file diff --git a/ui/admin/app/controllers/scopes/scope/credential-stores/credential-store.js b/ui/admin/app/controllers/scopes/scope/credential-stores/credential-store.js new file mode 100644 index 000000000..67b0b2c33 --- /dev/null +++ b/ui/admin/app/controllers/scopes/scope/credential-stores/credential-store.js @@ -0,0 +1,13 @@ +import Controller from '@ember/controller'; + +export default class ScopesScopeCredentialStoresCredentialStoreController extends Controller { + // =attributes + + /** + * A credential store breadcrumb + * @type {string} + */ + get breadCrumb() { + return this.model.displayName; + } +} diff --git a/ui/admin/app/router.js b/ui/admin/app/router.js index 4d723cab8..665582957 100644 --- a/ui/admin/app/router.js +++ b/ui/admin/app/router.js @@ -87,7 +87,12 @@ Router.map(function () { }); }); this.route('credential-stores', function () { - this.route('credential-store', { path: ':credential_store_id' }); + this.route( + 'credential-store', + { path: ':credential_store_id' }, + function () {} + ); + this.route('new'); }); }); }); diff --git a/ui/admin/app/routes/scopes/scope/credential-stores.js b/ui/admin/app/routes/scopes/scope/credential-stores.js index 7f75dd4fa..4bac020b1 100644 --- a/ui/admin/app/routes/scopes/scope/credential-stores.js +++ b/ui/admin/app/routes/scopes/scope/credential-stores.js @@ -1,6 +1,11 @@ import Route from '@ember/routing/route'; +import { action } from '@ember/object'; +import loading from 'ember-loading/decorator'; +import { notifySuccess, notifyError } from 'core/decorators/notify'; export default class ScopesScopeCredentialStoresRoute extends Route { + // =methods + /** * Load all credential stores under current scope * @returns {Promise[CredentialStoreModel]} @@ -9,4 +14,34 @@ export default class ScopesScopeCredentialStoresRoute extends Route { const { id: scope_id } = this.modelFor('scopes.scope'); return this.store.query('credential-store', { scope_id }); } + + // =actions + + /** + * Handle save + * @param {CredentialStoreModel} credentialStore + */ + @action + @loading + @notifyError(({ message }) => message) + @notifySuccess('notifications.save-success') + async save(credentialStore) { + await credentialStore.save(); + await this.transitionTo( + 'scopes.scope.credential-stores.credential-store', + credentialStore + ); + this.refresh(); + } + + /** + * Rollback changes on credential stores. + * @param {CredentialStoreModel} credentialStore + */ + @action + cancel(credentialStore) { + const { isNew } = credentialStore; + credentialStore.rollbackAttributes(); + if (isNew) this.transitionTo('scopes.scope.credential-stores'); + } } diff --git a/ui/admin/app/routes/scopes/scope/credential-stores/credential-store.js b/ui/admin/app/routes/scopes/scope/credential-stores/credential-store.js index 82fa9d62c..307c11079 100644 --- a/ui/admin/app/routes/scopes/scope/credential-stores/credential-store.js +++ b/ui/admin/app/routes/scopes/scope/credential-stores/credential-store.js @@ -6,6 +6,24 @@ export default class ScopesScopeCredentialStoresCredentialStoreRoute extends Rou * @return {Promise[CredentialStoreModel]} */ async model({ credential_store_id }) { - return this.route.findRecord('credential-store', credential_store_id); + return this.store.findRecord('credential-store', credential_store_id); + } + + /** + * Render credential store header and navigation page sections. + * @override + */ + renderTemplate() { + super.renderTemplate(...arguments); + + this.render('scopes/scope/credential-stores/credential-store/-header', { + into: 'scopes/scope/credential-stores/credential-store', + outlet: 'header', + }); + + this.render('scopes/scope/credential-stores/credential-store/-navigation', { + into: 'scopes/scope/credential-stores/credential-store', + outlet: 'navigation', + }); } } diff --git a/ui/admin/app/routes/scopes/scope/credential-stores/credential-store/index.js b/ui/admin/app/routes/scopes/scope/credential-stores/credential-store/index.js new file mode 100644 index 000000000..7e61beb34 --- /dev/null +++ b/ui/admin/app/routes/scopes/scope/credential-stores/credential-store/index.js @@ -0,0 +1,3 @@ +import Route from '@ember/routing/route'; + +export default class ScopesScopeCredentialStoresCredentialStoreIndexRoute extends Route {} diff --git a/ui/admin/app/routes/scopes/scope/credential-stores/new.js b/ui/admin/app/routes/scopes/scope/credential-stores/new.js new file mode 100644 index 000000000..e8bc7e431 --- /dev/null +++ b/ui/admin/app/routes/scopes/scope/credential-stores/new.js @@ -0,0 +1,15 @@ +import Route from '@ember/routing/route'; + +export default class ScopesScopeCredentialStoresNewRoute extends Route { + // =methods + /** + * Creates a new unsaved credential-store + */ + model() { + const scopeModel = this.modelFor('scopes.scope'); + return this.store.createRecord('credential-store', { + type: 'vault', + scopeModel, + }); + } +} diff --git a/ui/admin/app/templates/scopes/scope/credential-stores/credential-store.hbs b/ui/admin/app/templates/scopes/scope/credential-stores/credential-store.hbs index 637b45528..a6ecd7f81 100644 --- a/ui/admin/app/templates/scopes/scope/credential-stores/credential-store.hbs +++ b/ui/admin/app/templates/scopes/scope/credential-stores/credential-store.hbs @@ -1,2 +1,24 @@ -{{page-title 'CredentialStore'}} -{{outlet}} \ No newline at end of file +{{page-title @model.displayName}} + + + + + + + + + {{outlet 'header'}} + + + + {{outlet 'navigation'}} + + + + {{!-- {{outlet 'actions'}} --}} + + + + {{outlet}} + + \ No newline at end of file diff --git a/ui/admin/app/templates/scopes/scope/credential-stores/credential-store/-header.hbs b/ui/admin/app/templates/scopes/scope/credential-stores/credential-store/-header.hbs new file mode 100644 index 000000000..0ff5c81bc --- /dev/null +++ b/ui/admin/app/templates/scopes/scope/credential-stores/credential-store/-header.hbs @@ -0,0 +1,9 @@ +

{{t 'resources.credential-store.title'}}

+

{{t 'resources.credential-store.description'}}

+ + {{@model.id}} + \ No newline at end of file diff --git a/ui/admin/app/templates/scopes/scope/credential-stores/credential-store/-navigation.hbs b/ui/admin/app/templates/scopes/scope/credential-stores/credential-store/-navigation.hbs new file mode 100644 index 000000000..86b9cf585 --- /dev/null +++ b/ui/admin/app/templates/scopes/scope/credential-stores/credential-store/-navigation.hbs @@ -0,0 +1,5 @@ + + + {{t 'titles.details'}} + + \ No newline at end of file diff --git a/ui/admin/app/templates/scopes/scope/credential-stores/credential-store/index.hbs b/ui/admin/app/templates/scopes/scope/credential-stores/credential-store/index.hbs new file mode 100644 index 000000000..aaa14a18c --- /dev/null +++ b/ui/admin/app/templates/scopes/scope/credential-stores/credential-store/index.hbs @@ -0,0 +1,5 @@ + \ No newline at end of file diff --git a/ui/admin/app/templates/scopes/scope/credential-stores/index.hbs b/ui/admin/app/templates/scopes/scope/credential-stores/index.hbs index 585e076c2..c8ff3b098 100644 --- a/ui/admin/app/templates/scopes/scope/credential-stores/index.hbs +++ b/ui/admin/app/templates/scopes/scope/credential-stores/index.hbs @@ -6,11 +6,12 @@

{{t 'resources.credential-store.title_plural'}} +

- {{t 'resources.credential-store.description'}} +

{{t 'resources.credential-store.description'}}

- {{!-- + {{#if @model}} {{/if}} - --}} + {{#if @model}} diff --git a/ui/admin/app/templates/scopes/scope/credential-stores/new.hbs b/ui/admin/app/templates/scopes/scope/credential-stores/new.hbs new file mode 100644 index 000000000..cb38701d9 --- /dev/null +++ b/ui/admin/app/templates/scopes/scope/credential-stores/new.hbs @@ -0,0 +1,20 @@ +{{page-title (t 'titles.new')}} + + + + + + + +

{{t 'titles.new'}}

+
+ + + + + +
\ No newline at end of file diff --git a/ui/admin/config/environment.js b/ui/admin/config/environment.js index 7464ea022..fca0dab92 100644 --- a/ui/admin/config/environment.js +++ b/ui/admin/config/environment.js @@ -55,6 +55,7 @@ module.exports = function (environment) { 'host-set': '/host-sets', 'host-set.new': '/host-sets/new', 'host-set.add-hosts': '/host-sets/add-hosts', + 'credential-stores': '/credential-stores', host: '/hosts', 'host.new': '/hosts/new', role: '/roles', diff --git a/ui/admin/package.json b/ui/admin/package.json index 258a8f748..0f7e95b19 100644 --- a/ui/admin/package.json +++ b/ui/admin/package.json @@ -50,7 +50,7 @@ "ember-a11y-testing": "^4.0.7", "ember-auto-import": "^1.10.1", "ember-breadcrumbs": "^0.2.3", - "ember-cli": "~3.24.0", + "ember-cli": "~3.27.0", "ember-cli-app-version": "^4.0.0", "ember-cli-babel": "^7.23.0", "ember-cli-code-coverage": "^1.0.2", diff --git a/ui/admin/tests/unit/controllers/scopes/scope/credential-stores/credential-store-test.js b/ui/admin/tests/unit/controllers/scopes/scope/credential-stores/credential-store-test.js new file mode 100644 index 000000000..5736858ff --- /dev/null +++ b/ui/admin/tests/unit/controllers/scopes/scope/credential-stores/credential-store-test.js @@ -0,0 +1,17 @@ +import { module, test } from 'qunit'; +import { setupTest } from 'ember-qunit'; + +module( + 'Unit | Controller | scopes/scope/credential-stores/credential-store', + function (hooks) { + setupTest(hooks); + + // TODO: Replace this with your real tests. + test('it exists', function (assert) { + let controller = this.owner.lookup( + 'controller:scopes/scope/credential-stores/credential-store' + ); + assert.ok(controller); + }); + } +); diff --git a/ui/admin/tests/unit/routes/scopes/scope/credential-stores/credential-store/index-test.js b/ui/admin/tests/unit/routes/scopes/scope/credential-stores/credential-store/index-test.js new file mode 100644 index 000000000..a08a9fff6 --- /dev/null +++ b/ui/admin/tests/unit/routes/scopes/scope/credential-stores/credential-store/index-test.js @@ -0,0 +1,16 @@ +import { module, test } from 'qunit'; +import { setupTest } from 'ember-qunit'; + +module( + 'Unit | Route | scopes/scope/credential-stores/credential-store/index', + function (hooks) { + setupTest(hooks); + + test('it exists', function (assert) { + let route = this.owner.lookup( + 'route:scopes/scope/credential-stores/credential-store/index' + ); + assert.ok(route); + }); + } +); diff --git a/ui/admin/tests/unit/routes/scopes/scope/credential-stores/new-test.js b/ui/admin/tests/unit/routes/scopes/scope/credential-stores/new-test.js new file mode 100644 index 000000000..ea136c333 --- /dev/null +++ b/ui/admin/tests/unit/routes/scopes/scope/credential-stores/new-test.js @@ -0,0 +1,11 @@ +import { module, test } from 'qunit'; +import { setupTest } from 'ember-qunit'; + +module('Unit | Route | scopes/scope/credential-stores/new', function (hooks) { + setupTest(hooks); + + test('it exists', function (assert) { + let route = this.owner.lookup('route:scopes/scope/credential-stores/new'); + assert.ok(route); + }); +}); diff --git a/ui/desktop/package.json b/ui/desktop/package.json index c458ba6c8..c22ee5143 100755 --- a/ui/desktop/package.json +++ b/ui/desktop/package.json @@ -66,7 +66,7 @@ "ember-a11y-testing": "^4.0.7", "ember-auto-import": "^1.10.1", "ember-autofocus-modifier": "^1.1.0", - "ember-cli": "~3.24.0", + "ember-cli": "~3.27.0", "ember-cli-app-version": "^4.0.0", "ember-cli-babel": "^7.23.0", "ember-cli-code-coverage": "^1.0.2", diff --git a/yarn.lock b/yarn.lock index f16109b70..eeeb32795 100644 --- a/yarn.lock +++ b/yarn.lock @@ -35,6 +35,11 @@ resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.14.4.tgz#45720fe0cecf3fd42019e1d12cc3d27fadc98d58" integrity sha512-i2wXrWQNkH6JplJQGn3Rd2I4Pij8GdHkXwHMxm+zV5YG/Jci+bCNrWZEWC4o+umiDkRrRs4dVzH3X4GP7vyjQQ== +"@babel/compat-data@^7.14.5": + version "7.14.7" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.14.7.tgz#7b047d7a3a89a67d2258dc61f604f098f1bc7e08" + integrity sha512-nS6dZaISCXJ3+518CWiBfEr//gHyMO02uDxBkXTKZDN5POruCnOZ1N4YBRZDCabwF8nZMWBpRxIicmXtBs+fvw== + "@babel/core@7.12.9": version "7.12.9" resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.12.9.tgz#fd450c4ec10cdbb980e2928b7aa7a28484593fc8" @@ -57,7 +62,7 @@ semver "^5.4.1" source-map "^0.5.0" -"@babel/core@>=7.9.0", "@babel/core@^7.1.0", "@babel/core@^7.1.6", "@babel/core@^7.12.0", "@babel/core@^7.12.10", "@babel/core@^7.12.3", "@babel/core@^7.12.9", "@babel/core@^7.3.4", "@babel/core@^7.7.5", "@babel/core@^7.9.6": +"@babel/core@>=7.9.0", "@babel/core@^7.1.0", "@babel/core@^7.1.6", "@babel/core@^7.12.0", "@babel/core@^7.12.10", "@babel/core@^7.12.3", "@babel/core@^7.3.4", "@babel/core@^7.7.5", "@babel/core@^7.9.6": version "7.14.3" resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.14.3.tgz#5395e30405f0776067fbd9cf0884f15bfb770a38" integrity sha512-jB5AmTKOCSJIZ72sd78ECEhuPiDMKlQdDI/4QRI6lzYATx5SSogS1oQA2AoPecRCknm30gHi2l+QVvNUu3wZAg== @@ -78,6 +83,27 @@ semver "^6.3.0" source-map "^0.5.0" +"@babel/core@^7.13.8": + version "7.14.6" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.14.6.tgz#e0814ec1a950032ff16c13a2721de39a8416fcab" + integrity sha512-gJnOEWSqTk96qG5BoIrl5bVtc23DCycmIePPYnamY9RboYdI4nFy5vAQMSl81O5K/W0sLDWfGysnOECC+KUUCA== + dependencies: + "@babel/code-frame" "^7.14.5" + "@babel/generator" "^7.14.5" + "@babel/helper-compilation-targets" "^7.14.5" + "@babel/helper-module-transforms" "^7.14.5" + "@babel/helpers" "^7.14.6" + "@babel/parser" "^7.14.6" + "@babel/template" "^7.14.5" + "@babel/traverse" "^7.14.5" + "@babel/types" "^7.14.5" + convert-source-map "^1.7.0" + debug "^4.1.0" + gensync "^1.0.0-beta.2" + json5 "^2.1.2" + semver "^6.3.0" + source-map "^0.5.0" + "@babel/generator@^7.12.11", "@babel/generator@^7.12.5", "@babel/generator@^7.14.2", "@babel/generator@^7.14.3": version "7.14.3" resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.14.3.tgz#0c2652d91f7bddab7cccc6ba8157e4f40dcedb91" @@ -121,6 +147,16 @@ browserslist "^4.16.6" semver "^6.3.0" +"@babel/helper-compilation-targets@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.14.5.tgz#7a99c5d0967911e972fe2c3411f7d5b498498ecf" + integrity sha512-v+QtZqXEiOnpO6EYvlImB6zCD2Lel06RzOPzmkz/D/XgQiUu3C/Jb1LOqSt/AIA34TYi/Q+KlT8vTQrgdxkbLw== + dependencies: + "@babel/compat-data" "^7.14.5" + "@babel/helper-validator-option" "^7.14.5" + browserslist "^4.16.6" + semver "^6.3.0" + "@babel/helper-create-class-features-plugin@^7.13.0", "@babel/helper-create-class-features-plugin@^7.14.0", "@babel/helper-create-class-features-plugin@^7.14.2", "@babel/helper-create-class-features-plugin@^7.14.3", "@babel/helper-create-class-features-plugin@^7.14.4", "@babel/helper-create-class-features-plugin@^7.5.5", "@babel/helper-create-class-features-plugin@^7.8.3": version "7.14.4" resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.14.4.tgz#abf888d836a441abee783c75229279748705dc42" @@ -230,6 +266,13 @@ dependencies: "@babel/types" "^7.13.12" +"@babel/helper-member-expression-to-functions@^7.14.5": + version "7.14.7" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.14.7.tgz#97e56244beb94211fe277bd818e3a329c66f7970" + integrity sha512-TMUt4xKxJn6ccjcOW7c4hlwyJArizskAhoSTOCkA0uZ+KghIaci0Qg9R043kUMWI9mtQfgny+NQ5QATnZ+paaA== + dependencies: + "@babel/types" "^7.14.5" + "@babel/helper-module-imports@^7.0.0", "@babel/helper-module-imports@^7.12.13", "@babel/helper-module-imports@^7.13.12", "@babel/helper-module-imports@^7.8.3": version "7.13.12" resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.13.12.tgz#c6a369a6f3621cb25da014078684da9196b61977" @@ -237,6 +280,13 @@ dependencies: "@babel/types" "^7.13.12" +"@babel/helper-module-imports@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.14.5.tgz#6d1a44df6a38c957aa7c312da076429f11b422f3" + integrity sha512-SwrNHu5QWS84XlHwGYPDtCxcA0hrSlL2yhWYLgeOc0w7ccOl2qv4s/nARI0aYZW+bSwAL5CukeXA47B/1NKcnQ== + dependencies: + "@babel/types" "^7.14.5" + "@babel/helper-module-transforms@^7.12.1", "@babel/helper-module-transforms@^7.13.0", "@babel/helper-module-transforms@^7.14.0", "@babel/helper-module-transforms@^7.14.2": version "7.14.2" resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.14.2.tgz#ac1cc30ee47b945e3e0c4db12fa0c5389509dfe5" @@ -251,6 +301,20 @@ "@babel/traverse" "^7.14.2" "@babel/types" "^7.14.2" +"@babel/helper-module-transforms@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.14.5.tgz#7de42f10d789b423eb902ebd24031ca77cb1e10e" + integrity sha512-iXpX4KW8LVODuAieD7MzhNjmM6dzYY5tfRqT+R9HDXWl0jPn/djKmA+G9s/2C2T9zggw5tK1QNqZ70USfedOwA== + dependencies: + "@babel/helper-module-imports" "^7.14.5" + "@babel/helper-replace-supers" "^7.14.5" + "@babel/helper-simple-access" "^7.14.5" + "@babel/helper-split-export-declaration" "^7.14.5" + "@babel/helper-validator-identifier" "^7.14.5" + "@babel/template" "^7.14.5" + "@babel/traverse" "^7.14.5" + "@babel/types" "^7.14.5" + "@babel/helper-optimise-call-expression@^7.12.13": version "7.12.13" resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.13.tgz#5c02d171b4c8615b1e7163f888c1c81c30a2aaea" @@ -258,6 +322,13 @@ dependencies: "@babel/types" "^7.12.13" +"@babel/helper-optimise-call-expression@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.14.5.tgz#f27395a8619e0665b3f0364cddb41c25d71b499c" + integrity sha512-IqiLIrODUOdnPU9/F8ib1Fx2ohlgDhxnIDU7OEVi+kAbEZcyiF7BLU8W6PfvPi9LzztjS7kcbzbmL7oG8kD6VA== + dependencies: + "@babel/types" "^7.14.5" + "@babel/helper-plugin-utils@7.10.4": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz#2f75a831269d4f677de49986dff59927533cf375" @@ -287,6 +358,16 @@ "@babel/traverse" "^7.14.2" "@babel/types" "^7.14.4" +"@babel/helper-replace-supers@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.14.5.tgz#0ecc0b03c41cd567b4024ea016134c28414abb94" + integrity sha512-3i1Qe9/8x/hCHINujn+iuHy+mMRLoc77b2nI9TB0zjH1hvn9qGlXjWlggdwUcju36PkPCy/lpM7LLUdcTyH4Ow== + dependencies: + "@babel/helper-member-expression-to-functions" "^7.14.5" + "@babel/helper-optimise-call-expression" "^7.14.5" + "@babel/traverse" "^7.14.5" + "@babel/types" "^7.14.5" + "@babel/helper-simple-access@^7.13.12": version "7.13.12" resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.13.12.tgz#dd6c538afb61819d205a012c31792a39c7a5eaf6" @@ -294,6 +375,13 @@ dependencies: "@babel/types" "^7.13.12" +"@babel/helper-simple-access@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.14.5.tgz#66ea85cf53ba0b4e588ba77fc813f53abcaa41c4" + integrity sha512-nfBN9xvmCt6nrMZjfhkl7i0oTV3yxR4/FztsbOASyTvVcoYd0TRHh7eMLdlEcCqobydC0LAF3LtC92Iwxo0wyw== + dependencies: + "@babel/types" "^7.14.5" + "@babel/helper-skip-transparent-expression-wrappers@^7.12.1": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.12.1.tgz#462dc63a7e435ade8468385c63d2b84cce4b3cbf" @@ -330,6 +418,11 @@ resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.12.17.tgz#d1fbf012e1a79b7eebbfdc6d270baaf8d9eb9831" integrity sha512-TopkMDmLzq8ngChwRlyjR6raKD6gMSae4JdYDB8bByKreQgG0RBTuKe9LRxW3wFtUnjxOPRKBDwEH6Mg5KeDfw== +"@babel/helper-validator-option@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.14.5.tgz#6e72a1fff18d5dfcb878e1e62f1a021c4b72d5a3" + integrity sha512-OX8D5eeX4XwcroVW45NMvoYaIuFI+GQpA2a8Gi+X/U/cDUIRsV37qQfF905F0htTRCREQIB4KqPeaveRJUl3Ow== + "@babel/helper-wrap-function@^7.13.0": version "7.13.0" resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.13.0.tgz#bdb5c66fda8526ec235ab894ad53a1235c79fcc4" @@ -349,6 +442,15 @@ "@babel/traverse" "^7.14.0" "@babel/types" "^7.14.0" +"@babel/helpers@^7.14.6": + version "7.14.6" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.14.6.tgz#5b58306b95f1b47e2a0199434fa8658fa6c21635" + integrity sha512-yesp1ENQBiLI+iYHSJdoZKUtRpfTlL1grDIX9NRlAVppljLw/4tTyYupIB7uIYmC3stW/imAv8EqaKaS/ibmeA== + dependencies: + "@babel/template" "^7.14.5" + "@babel/traverse" "^7.14.5" + "@babel/types" "^7.14.5" + "@babel/highlight@^7.10.4", "@babel/highlight@^7.12.13": version "7.14.0" resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.14.0.tgz#3197e375711ef6bf834e67d0daec88e4f46113cf" @@ -372,7 +474,7 @@ resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.14.4.tgz#a5c560d6db6cd8e6ed342368dea8039232cbab18" integrity sha512-ArliyUsWDUqEGfWcmzpGUzNfLxTdTp6WU4IuP6QFSp9gGfWS6boxFCkJSJ/L4+RG8z/FnIU3WxCk6hPL9SSWeA== -"@babel/parser@^7.14.5", "@babel/parser@^7.14.7": +"@babel/parser@^7.14.5", "@babel/parser@^7.14.6", "@babel/parser@^7.14.7": version "7.14.7" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.14.7.tgz#6099720c8839ca865a2637e6c85852ead0bdb595" integrity sha512-X67Z5y+VBJuHB/RjwECp8kSl5uYi0BvRbNeWqkaJCVh+LiTPl19WBUfG627psSgp9rSf6ojuXghQM3ha6qHHdA== @@ -1184,7 +1286,7 @@ debug "^4.1.0" globals "^11.1.0" -"@babel/traverse@^7.12.11": +"@babel/traverse@^7.12.11", "@babel/traverse@^7.14.5": version "7.14.7" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.14.7.tgz#64007c9774cfdc3abd23b0780bc18a3ce3631753" integrity sha512-9vDr5NzHu27wgwejuKL7kIOm4bwEtaPQ4Z6cpCmjSuaRqpH/7xc4qcGEscwMqlkwgcXl6MvqoAjZkQ24uSdIZQ== @@ -4743,7 +4845,7 @@ babel-plugin-module-resolver@^3.2.0: reselect "^3.0.1" resolve "^1.4.0" -babel-plugin-module-resolver@^4.0.0: +babel-plugin-module-resolver@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/babel-plugin-module-resolver/-/babel-plugin-module-resolver-4.1.0.tgz#22a4f32f7441727ec1fbf4967b863e1e3e9f33e2" integrity sha512-MlX10UDheRr3lb3P0WcaIdtCSRlxdQsB1sBqL7W0raF070bGl1HQQq5K3T2vf2XAYie+ww+5AKC/WrkjRO2knA== @@ -6069,7 +6171,7 @@ broccoli-terser-sourcemap@^4.1.0: walk-sync "^2.2.0" workerpool "^6.0.0" -broccoli@^3.5.0: +broccoli@^3.5.1: version "3.5.2" resolved "https://registry.yarnpkg.com/broccoli/-/broccoli-3.5.2.tgz#60921167d57b43fb5bad527420d62fe532595ef4" integrity sha512-sWi3b3fTUSVPDsz5KsQ5eCQNVAtLgkIE/HYFkEZXR/07clqmd4E/gFiuwSaqa9b+QTXc1Uemfb7TVWbEIURWDg== @@ -8000,11 +8102,6 @@ diff@5.0.0, diff@^5.0.0: resolved "https://registry.yarnpkg.com/diff/-/diff-5.0.0.tgz#7ed6ad76d859d030787ec35855f5b1daf31d852b" integrity sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w== -diff@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" - integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== - diffie-hellman@^5.0.0: version "5.0.3" resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875" @@ -8859,22 +8956,22 @@ ember-cli-version-checker@^5.0.1, ember-cli-version-checker@^5.1.1, ember-cli-ve semver "^7.3.4" silent-error "^1.1.1" -ember-cli@~3.24.0: - version "3.24.0" - resolved "https://registry.yarnpkg.com/ember-cli/-/ember-cli-3.24.0.tgz#dbda4938e74fdafe4da1c42b49356f9d14c10697" - integrity sha512-dLurYpluRcE+XjCHy/JzUBcW4dBKhjmXH3zUjyof89gFjj+8EFjB0b2tqyS6buKqBasinVaX8lZZVIXYCdFtNA== +ember-cli@~3.27.0: + version "3.27.0" + resolved "https://registry.yarnpkg.com/ember-cli/-/ember-cli-3.27.0.tgz#8ccf9db51d7b462f86210b853d086a4543605c34" + integrity sha512-vFLPFkplXn5v005fattHdOcs5AbSp7RG4w1wpHDWHzOSYpl2Dr+5zzZtqLS7V5IVaLf3XK4l24XwhSW9HpMfsQ== dependencies: - "@babel/core" "^7.12.9" + "@babel/core" "^7.13.8" "@babel/plugin-transform-modules-amd" "^7.12.1" amd-name-resolver "^1.3.1" - babel-plugin-module-resolver "^4.0.0" + babel-plugin-module-resolver "^4.1.0" bower-config "^1.4.3" bower-endpoint-parser "0.2.2" - broccoli "^3.5.0" + broccoli "^3.5.1" broccoli-amd-funnel "^2.0.1" broccoli-babel-transpiler "^7.8.0" broccoli-builder "^0.18.14" - broccoli-concat "^4.2.4" + broccoli-concat "^4.2.5" broccoli-config-loader "^1.0.1" broccoli-config-replace "^1.1.2" broccoli-debug "^0.6.5" @@ -8895,7 +8992,7 @@ ember-cli@~3.24.0: console-ui "^3.1.2" core-object "^3.1.5" dag-map "^2.0.2" - diff "^4.0.2" + diff "^5.0.0" ember-cli-is-package-missing "^1.0.0" ember-cli-lodash-subset "^2.0.1" ember-cli-normalize-entity-name "^1.0.0" @@ -8903,14 +9000,14 @@ ember-cli@~3.24.0: ember-cli-string-utils "^1.1.0" ember-source-channel-url "^3.0.0" ensure-posix-path "^1.1.1" - execa "^4.1.0" + execa "^5.0.0" exit "^0.1.2" express "^4.17.1" filesize "^6.1.0" find-up "^5.0.0" find-yarn-workspace-root "^2.0.0" - fixturify-project "^2.1.0" - fs-extra "^9.0.1" + fixturify-project "^2.1.1" + fs-extra "^9.1.0" fs-tree-diff "^2.0.1" get-caller-file "^2.0.5" git-repo-info "^2.1.1" @@ -8928,21 +9025,21 @@ ember-cli@~3.24.0: json-stable-stringify "^1.0.1" leek "0.0.24" lodash.template "^4.5.0" - markdown-it "^12.0.2" + markdown-it "^12.0.4" markdown-it-terminal "0.2.1" minimatch "^3.0.4" morgan "^1.10.0" nopt "^3.0.6" - npm-package-arg "^8.1.0" + npm-package-arg "^8.1.1" p-defer "^3.0.0" portfinder "^1.0.28" promise-map-series "^0.3.0" promise.hash.helper "^1.0.7" quick-temp "^0.1.8" - resolve "^1.19.0" + resolve "^1.20.0" resolve-package-path "^3.1.0" sane "^4.1.0" - semver "^7.3.2" + semver "^7.3.4" silent-error "^1.1.1" sort-package-json "^1.48.0" symlink-or-copy "^1.3.1" @@ -8950,7 +9047,7 @@ ember-cli@~3.24.0: testem "^3.2.0" tiny-lr "^2.0.0" tree-sync "^2.1.0" - uuid "^8.3.1" + uuid "^8.3.2" walk-sync "^2.2.0" watch-detector "^1.0.0" workerpool "^6.0.3" @@ -10216,7 +10313,7 @@ execa@^3.0.0, execa@^3.4.0: signal-exit "^3.0.2" strip-final-newline "^2.0.0" -execa@^4.0.0, execa@^4.0.3, execa@^4.1.0: +execa@^4.0.0, execa@^4.0.3: version "4.1.0" resolved "https://registry.yarnpkg.com/execa/-/execa-4.1.0.tgz#4e5491ad1572f2f17a77d388c6c857135b22847a" integrity sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA== @@ -10798,7 +10895,7 @@ fixturify-project@^1.10.0: fixturify "^1.2.0" tmp "^0.0.33" -fixturify-project@^2.1.0: +fixturify-project@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/fixturify-project/-/fixturify-project-2.1.1.tgz#a511dd26700c6b64ac271ef4393e7124f153c81f" integrity sha512-sP0gGMTr4iQ8Kdq5Ez0CVJOZOGWqzP5dv/veOTdFNywioKjkNWCHBi1q65DMpcNGUGeoOUWehyji274Q2wRgxA== @@ -14683,10 +14780,10 @@ markdown-it-terminal@0.2.1: lodash.merge "^4.6.2" markdown-it "^8.3.1" -markdown-it@^12.0.2: - version "12.0.6" - resolved "https://registry.yarnpkg.com/markdown-it/-/markdown-it-12.0.6.tgz#adcc8e5fe020af292ccbdf161fe84f1961516138" - integrity sha512-qv3sVLl4lMT96LLtR7xeRJX11OUFjsaD5oVat2/SNBIb21bJXwal2+SklcRbTwGwqWpWH/HRtYavOoJE+seL8w== +markdown-it@^12.0.4: + version "12.1.0" + resolved "https://registry.yarnpkg.com/markdown-it/-/markdown-it-12.1.0.tgz#7ad572caddd336bd27a68d20e86bac1fafe8fb20" + integrity sha512-7temG6IFOOxfU0SgzhqR+vr2diuMhyO5uUIEZ3C5NbXhqC9uFUHoU41USYuDFoZRsaY7BEIEei874Z20VMLF6A== dependencies: argparse "^2.0.1" entities "~2.1.0" @@ -15789,7 +15886,7 @@ npm-package-arg@^7.0.0: semver "^5.6.0" validate-npm-package-name "^3.0.0" -npm-package-arg@^8.0.0: +npm-package-arg@^8.0.0, npm-package-arg@^8.1.1: version "8.1.5" resolved "https://registry.yarnpkg.com/npm-package-arg/-/npm-package-arg-8.1.5.tgz#3369b2d5fe8fdc674baa7f1786514ddc15466e44" integrity sha512-LhgZrg0n0VgvzVdSm1oiZworPbTxYHUJCgtsJW8mGvlDpxTM1vSJc3m5QZeUkhAHIzbz3VCHd/R4osi1L1Tg/Q== @@ -15798,15 +15895,6 @@ npm-package-arg@^8.0.0: semver "^7.3.4" validate-npm-package-name "^3.0.0" -npm-package-arg@^8.1.0: - version "8.1.4" - resolved "https://registry.yarnpkg.com/npm-package-arg/-/npm-package-arg-8.1.4.tgz#8001cdbc4363997b8ef6c6cf7aaf543c5805879d" - integrity sha512-xLokoCFqj/rPdr3LvcdDL6Kj6ipXGEDHD/QGpzwU6/pibYUOXmp5DBmg76yukFyx4ZDbrXNOTn+BPyd8TD4Jlw== - dependencies: - hosted-git-info "^4.0.1" - semver "^7.3.4" - validate-npm-package-name "^3.0.0" - npm-packlist@^1.1.12, npm-packlist@^1.1.6, npm-packlist@^1.4.6, npm-packlist@^1.4.8: version "1.4.8" resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.4.8.tgz#56ee6cc135b9f98ad3d51c1c95da22bbb9b2ef3e" @@ -21210,7 +21298,7 @@ uuid@^3.1.0, uuid@^3.3.2, uuid@^3.3.3: resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== -uuid@^8.3.0, uuid@^8.3.1: +uuid@^8.3.0, uuid@^8.3.2: version "8.3.2" resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==