Compare commits

..
19 Commits
Author SHA1 Message Date
Dharini Jeeva c21b8fdb64 chore: 🤖 update changelog (#1170)
* chore: 🤖 update changelog and bump up the binary version to 0.9.1
2022-07-06 13:13:57 -07:00
Carlos Alcaide CorvoandRandall Morey 60005f0233 chore: 🤖 Update @babel/plugin-proposal-decorators (#1157)
Update @babel/plugin-proposal-decorators

Co-authored-by: Randall Morey <randall@randallmorey.com>
2022-06-30 08:52:07 -04:00
Randall Morey da89e2f82e fix: 🐛 unable to filter for terminated sessions (#1169)
* fix: 🐛 unable to filter for terminated sessions

* fix: 🐛 reenable sessions mocks
2022-06-29 20:42:12 -04:00
Carlos Alcaide CorvoandRandall Morey c9d6f37343 chore: 🤖 Update @ember/test-helpers (#1159)
Update @ember/test-helpers

Co-authored-by: Randall Morey <randall@randallmorey.com>
2022-06-29 17:35:17 -04:00
Carlos Alcaide CorvoandRandall Morey 85e4b46821 Chore update doctoc (#1165)
* chore: 🤖 Update doc toc

Update doc toc

* chore: 🤖 Fix doctoc within core

Co-authored-by: Randall Morey <randall@randallmorey.com>
2022-06-29 16:26:36 -04:00
Carlos Alcaide CorvoandRandall Morey d464419e47 chore: 🤖 Update Cross OS (#1164)
Update Cross OS

Co-authored-by: Randall Morey <randall@randallmorey.com>
2022-06-29 15:28:46 -04:00
Carlos Alcaide CorvoandRandall Morey 021803942f chore: 🤖 Update babel-loader (#1163)
Update babel-loader

Co-authored-by: Randall Morey <randall@randallmorey.com>
2022-06-29 15:10:41 -04:00
Randall Morey eeba8dceb6 fix: 🐛 merge conflict in yarn.lock (#1168) 2022-06-29 14:10:59 -04:00
Carlos Alcaide CorvoandRandall Morey 8764633111 chore: 🤖 Update @hashicorp/flight-icons (#1162)
Update @hashicorp/flight-icons

Co-authored-by: Randall Morey <randall@randallmorey.com>
2022-06-29 13:00:27 -04:00
Carlos Alcaide CorvoandRandall Morey 9becadd3f1 chore: 🤖 Update @glimmer (#1161)
Update @glimmer

Co-authored-by: Randall Morey <randall@randallmorey.com>
2022-06-29 12:08:00 -04:00
Carlos Alcaide CorvoandRandall Morey 9f45a9a955 chore: 🤖 Update @ember/render-modifiers (#1158)
Update @ember/render-modifiers

Co-authored-by: Randall Morey <randall@randallmorey.com>
2022-06-29 11:34:31 -04:00
Carlos Alcaide CorvoandRandall Morey 51b94f7ac8 Chore update babel eslint parser (#1155)
* chore: 🤖 Fix merging conflicts

* chore: 🤖 Fix merging conflicts

Co-authored-by: Randall Morey <randall@randallmorey.com>
2022-06-29 10:51:41 -04:00
Randall Morey 890cfe5168 Refactor attributes fragments (#1156)
* refactor: 💡 migrate managed-group off fragments

* refactor: 💡 migrate credential-store off fragments

* refactor: 💡 migrate credential-library off fragments

* refactor: 💡 migrate account off fragments
2022-06-28 19:30:26 -04:00
Dharini Jeeva fe225653ec fix: 🐛 overflow dropdown ui issue (#1160) 2022-06-28 13:13:09 -07:00
Carlos Alcaide Corvo dce7447880 chore: 🤖 Upgrade @babel/core (#1153)
Upgrade @babel/core
2022-06-28 11:08:16 -07:00
Carlos Alcaide Corvo 330c3de256 Chore upgrade desktop dependencies 2 (#1152) 2022-06-28 10:27:47 -07:00
Carlos Alcaide Corvo 2d15a62990 fix: 🐛 Lock file discrepancy (#1154)
Lock file discrepancy
2022-06-27 14:38:51 -07:00
Zhihe Li 62af6e2f6e Use precommit hooks (#1150)
* chore: 🤖 Add husky and hooks

* chore: 🤖 Add lint staged for fixing lint issues

* chore: 🤖 Use prettier and disable conflicting prettier rules

* docs: ✏️ Update commit documentation in README
2022-06-27 14:35:52 -04:00
Carlos Alcaide Corvo f50acc9913 Chore upgrade desktop dependencies (#1151) 2022-06-27 09:33:10 -07:00
71 changed files with 2668 additions and 1776 deletions

No files matched your search

+6
View File
@@ -0,0 +1,6 @@
#!/usr/bin/env sh
. "$(dirname -- "$0")/_/husky.sh"
yarn compliance:licenses
npx lint-staged
yarn test
+5
View File
@@ -0,0 +1,5 @@
#!/usr/bin/env sh
. "$(dirname -- "$0")/_/husky.sh"
# This is to allow interaction with the terminal for commitizen
exec < /dev/tty && npx git-cz --hook || true
+6 -6
View File
@@ -66,7 +66,6 @@ List of available project commands. `yarn run <command-name>`
|---------------------|---|
| build | Builds Admin UI. |
| test | Runs tests in CI mode. |
| commit | Replaces `git commit`, ensures compliance, audit, lint, and test checks pass before commit is allowed and normalizes commit messages across authors. |
| lint | Runs ember-template-lint on all of the hbs, js, and sass files. |
| compliance:audit | Checks for issues using `yarn audit` with moderate and above criticality.|
| compliance:licenses | Checks that all dependencies have OSS-compatible licenses. |
@@ -164,11 +163,12 @@ Enter the origin of your Boundary dev instance, by default is: `http://localhost
### Committing
Instead of the default `git commit`, we prescribe a custom command that ensures
linting and other checks pass before a commit may be completed. It also ensures
that all contributors author consistent commit messages. To get started with a
commit, stage your files as usual. Then run `yarn commit` and follow the
on-screen instructions to author your message.
We use `husky` and `lint-staged` to ensure linting and other checks pass before a
commit is completed. Simply do a `yarn install` to make sure the hooks are installed.
Use a normal `git commit` to go through the checks, if you need to skip these checks,
use `git commit --no-verify` to bypass them. However, a consistent commit message will
still be enforced even if you use `--no-verify`.
#### License Checking
+1 -5
View File
@@ -14,11 +14,7 @@ module.exports = {
// end of babel-config
},
plugins: ['ember'],
extends: [
'eslint:recommended',
'plugin:ember/recommended',
'plugin:prettier/recommended',
],
extends: ['eslint:recommended', 'plugin:ember/recommended', 'prettier'],
env: {
browser: true,
},
@@ -43,4 +43,20 @@ export default class GeneratedAccountModel extends BaseModel {
description: 'Current version number of this resource.',
})
version;
// =attributes (password)
@attr('string', {
for: 'password',
isNestedAttribute: true,
description: 'The account login name',
})
login_name;
// =attributes (OIDC)
@attr('string', { for: 'oidc', isNestedAttribute: true }) subject;
@attr('string', { for: 'oidc', isNestedAttribute: true }) issuer;
@attr('string', { for: 'oidc', isNestedAttribute: true, readOnly: true })
email;
@attr('string', { for: 'oidc', isNestedAttribute: true, readOnly: true })
full_name;
}
@@ -44,4 +44,27 @@ export default class GeneratedCredentialLibraryModel extends BaseModel {
description: 'Current version number of this resource.',
})
version;
//= attributes (vault)
@attr('string', {
isNestedAttribute: true,
description:
'The HTTP method the library uses when requesting credentials from Vault.',
defaultValue: () => 'GET',
})
http_method;
@attr('string', {
isNestedAttribute: true,
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', {
isNestedAttribute: true,
description: 'The path in Vault to request credentials from.',
})
path;
}
@@ -39,4 +39,82 @@ export default class GeneratedCredentialStoreModel extends BaseModel {
description: 'Current version number of this resource.',
})
version;
// =attributes (vault)
@attr('string', {
for: 'vault',
isNestedAttribute: true,
description:
"The address to Vault server. This should be a complete URL such as 'https://127.0.0.1:8200'",
})
address;
@attr('string', {
for: 'vault',
isNestedAttribute: true,
description: 'The namespace within Vault to use.',
})
namespace;
@attr('string', {
for: 'vault',
isNestedAttribute: true,
description:
"A PEM-encoded CA certificate to verify the Vault server's TLS certificate.",
})
ca_cert;
@attr('string', {
for: 'vault',
isNestedAttribute: true,
description:
'Name to use as the SNI host when connecting to Vault via TLS.',
})
tls_server_name;
@attr('boolean', {
for: 'vault',
isNestedAttribute: true,
description: 'Whether or not to skip TLS verification.',
})
tls_skip_verify;
@attr('string', {
for: 'vault',
isNestedAttribute: true,
description: 'A token used for accessing Vault.',
})
token;
@attr('string', {
for: 'vault',
isNestedAttribute: true,
description: 'The Vault token hmac.',
readOnly: true,
})
token_hmac;
@attr('string', {
for: 'vault',
isNestedAttribute: true,
description:
'A PEM-encoded client certificate to use for TLS authentication to the Vault server.',
})
client_certificate;
@attr('string', {
for: 'vault',
isNestedAttribute: true,
description:
"A PEM-encoded private key matching the client certificate from 'client_certificate'.",
})
client_certificate_key;
@attr('string', {
for: 'vault',
isNestedAttribute: true,
description: 'The Vault client certificate key hmac.',
readOnly: true,
})
client_certificate_key_hmac;
}
@@ -44,4 +44,13 @@ export default class GeneratedManagedGroupModel extends BaseModel {
'The ID of the Auth Method that is associated with this ManagedGroup',
})
auth_method_id;
// =attributes (OIDC)
@attr('string', {
isNestedAttribute: true,
description:
'The boolean expression filter to use to determine membership.',
})
filter;
}
+2 -9
View File
@@ -1,17 +1,10 @@
import GeneratedAccountModel from '../generated/models/account';
import { fragment } from 'ember-data-model-fragments/attributes';
import { computed } from '@ember/object';
import { equal } from '@ember/object/computed';
export default class AccountModel extends GeneratedAccountModel {
// =attributes
/**
* Attributes of this resource, if any, represented as a JSON fragment.
* @type {FragmentAccountAttributesModel}
*/
@fragment('fragment-account-attributes', { defaultValue: {} }) attributes;
/**
* @type {boolean}
*/
@@ -26,9 +19,9 @@ export default class AccountModel extends GeneratedAccountModel {
* Convenience for getting username in account.
* @type {string}
*/
@computed('attributes.{email,full_name,login_name}')
@computed('{email,full_name,login_name}')
get accountName() {
const { email, full_name, login_name } = this.attributes;
const { email, full_name, login_name } = this;
return email || full_name || login_name;
}
+1 -21
View File
@@ -1,6 +1,4 @@
import GeneratedCredentialLibraryModel from '../generated/models/credential-library';
import { attr } from '@ember-data/model';
import { fragment } from 'ember-data-model-fragments/attributes';
/**
* Enum options for credential library.
@@ -9,22 +7,4 @@ export const options = {
http_method: ['GET', 'POST'],
};
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;
}
export default class CredentialLibraryModel extends GeneratedCredentialLibraryModel {}
@@ -1,32 +1,9 @@
import GeneratedCredentialStoreModel from '../generated/models/credential-store';
import { attr } from '@ember-data/model';
import { fragment } from 'ember-data-model-fragments/attributes';
import { equal } from '@ember/object/computed';
export default class CredentialStoreModel extends GeneratedCredentialStoreModel {
// =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_address;
@attr('string', { readOnly: true }) attributes_namespace;
@attr('string', { readOnly: true }) attributes_ca_cert;
@attr('string', { readOnly: true }) attributes_tls_server_name;
@attr('string', { readOnly: true }) attributes_tls_skip_verify;
@attr('string', { readOnly: true }) attributes_token;
@attr('string', { readOnly: true }) attributes_client_certificate;
@attr('string', { readOnly: true }) attributes_client_certificate_key;
// =attributes
/**
* Attributes of this resource, if any, represented as a JSON fragment.
* @type {FragmentAuthMethodAttributesModel}
*/
@fragment('fragment-credential-store-attributes', { defaultValue: {} })
attributes;
/**
* @type {boolean}
*/
@@ -1,17 +0,0 @@
import Fragment from 'ember-data-model-fragments/fragment';
import { attr } from '@ember-data/model';
export default class FragmentAccountAttributesModel extends Fragment {
// =attributes (password)
@attr('string', {
for: 'password',
description: 'The account login name',
})
login_name;
// =attributes (OIDC)
@attr('string', { for: 'oidc' }) subject;
@attr('string', { for: 'oidc' }) issuer;
@attr('string', { for: 'oidc', readOnly: true }) email;
@attr('string', { for: 'oidc', readOnly: true }) full_name;
}
@@ -1,25 +0,0 @@
import Fragment from 'ember-data-model-fragments/fragment';
import { attr } from '@ember-data/model';
import { options } from './credential-library';
export default class FragmentCredentialLibraryAttributesModel extends Fragment {
//= attributes (vault)
@attr('string', {
description:
'The HTTP method the library uses when requesting credentials from Vault.',
defaultValue: () => options.http_method[0],
})
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;
}
@@ -1,72 +0,0 @@
import Fragment from 'ember-data-model-fragments/fragment';
import { attr } from '@ember-data/model';
export default class FragmentCredentialStoreAttributesModel extends Fragment {
// =attributes (vault)
@attr('string', {
for: 'vault',
description:
"The address to Vault server. This should be a complete URL such as 'https://127.0.0.1:8200'",
})
address;
@attr('string', {
for: 'vault',
description: 'The namespace within Vault to use.',
})
namespace;
@attr('string', {
for: 'vault',
description:
"A PEM-encoded CA certificate to verify the Vault server's TLS certificate.",
})
ca_cert;
@attr('string', {
for: 'vault',
description:
'Name to use as the SNI host when connecting to Vault via TLS.',
})
tls_server_name;
@attr('boolean', {
for: 'vault',
description: 'Whether or not to skip TLS verification.',
})
tls_skip_verify;
@attr('string', {
for: 'vault',
description: 'A token used for accessing Vault.',
})
token;
@attr('string', {
for: 'vault',
description: 'The Vault token hmac.',
readOnly: true,
})
token_hmac;
@attr('string', {
for: 'vault',
description:
'A PEM-encoded client certificate to use for TLS authentication to the Vault server.',
})
client_certificate;
@attr('string', {
for: 'vault',
description:
"A PEM-encoded private key matching the client certificate from 'client_certificate'.",
})
client_certificate_key;
@attr('string', {
for: 'vault',
description: 'The Vault client certificate key hmac.',
readOnly: true,
})
client_certificate_key_hmac;
}
@@ -1,12 +0,0 @@
import Fragment from 'ember-data-model-fragments/fragment';
import { attr } from '@ember-data/model';
export default class FragmentManagedGroupAttributesModel extends Fragment {
// =attributes (OIDC)
@attr('string', {
description:
'The boolean expression filter to use to determine membership.',
})
filter;
}
-11
View File
@@ -1,18 +1,10 @@
import GeneratedManagedGroupModel from '../generated/models/managed-group';
import { attr } from '@ember-data/model';
import { fragment } from 'ember-data-model-fragments/attributes';
import { A } from '@ember/array';
export default class ManagedGroupModel extends GeneratedManagedGroupModel {
// =attributes
// =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_filter;
/**
* Members is read-only under normal circumstances. But members can
* be persisted via calls to `addMembers()` or `removeMembers()`.
@@ -23,7 +15,4 @@ export default class ManagedGroupModel extends GeneratedManagedGroupModel {
emptyArrayIfMissing: true,
})
member_ids;
@fragment('fragment-managed-group-attributes', { defaultValue: {} })
attributes;
}
+1 -1
View File
@@ -38,7 +38,7 @@ export default class AccountSerializer extends ApplicationSerializer {
delete serialized.attributes;
if (isNew) {
serialized.attributes = {};
const { issuer, subject } = snapshot.attr('attributes').record;
const { issuer, subject } = snapshot.record;
if (issuer) serialized.attributes.issuer = issuer;
if (subject) serialized.attributes.subject = subject;
}
@@ -1,3 +1,18 @@
import ApplicationSerializer from './application';
export default class CredentialLibrarySerializer extends ApplicationSerializer {}
export default class CredentialLibrarySerializer extends ApplicationSerializer {
/**
* @override
* @method serialize
* @param {Snapshot} snapshot
*/
serialize() {
const serialized = super.serialize(...arguments);
if (serialized.attributes) {
// Serialize `http_request_body` only if `http_method` is POST
if (!serialized.attributes?.http_method?.match(/post/i))
delete serialized.attributes.http_request_body;
}
return serialized;
}
}
@@ -1,3 +1,24 @@
import ApplicationSerializer from './application';
export default class CredentialStoreSerializer extends ApplicationSerializer {}
export default class CredentialStoreSerializer extends ApplicationSerializer {
/**
* @override
* @method serialize
* @param {Snapshot} snapshot
*/
serialize() {
const serialized = super.serialize(...arguments);
if (serialized.attributes) {
// Token cannot be unset. If it's falsy, it must be removed.
if (!serialized.attributes?.token) delete serialized.attributes.token;
// Client certificate key cannot be unset when certificate is set.
// If it's falsy, it must be removed.
if (
!serialized.attributes?.client_certificate_key &&
serialized.attributes?.client_certificate
)
delete serialized.attributes.client_certificate_key;
}
return serialized;
}
}
@@ -1,26 +0,0 @@
import JSONSerializer from '@ember-data/serializer/json';
export default class FragmentAccountAttributesSerializer extends JSONSerializer {
/**
* If an attribute is annotated as readOnly in the model, don't serialize it.
* Otherwise delegate to default attribute serializer.
*
* @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];
// Client secret cannot be unset. If it's falsy, it must be removed.
if (key === 'client_secret' && !json[key]) delete json[key];
return value;
}
}
@@ -1,27 +0,0 @@
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;
}
}
@@ -1,34 +0,0 @@
import JSONSerializer from '@ember-data/serializer/json';
export default class FragmentCredentialStoreAttributesSerializer extends JSONSerializer {
/**
* If an attribute is annotated as readOnly in the model, don't serialize it.
* Otherwise delegate to default attribute serializer.
*
* @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];
// Token cannot be unset. If it's falsy, it must be removed.
if (key === 'token' && !json[key]) delete json[key];
// Client certificate key cannot be unset when certificate is set.
// If it's falsy, it must be removed.
if (
key === 'client_certificate_key' &&
!json[key] &&
json['client_certificate']
)
delete json[key];
return value;
}
}
@@ -1,27 +0,0 @@
import JSONSerializer from '@ember-data/serializer/json';
export default class FragmentManagedGroupAttributesSerializer extends JSONSerializer {
/**
* If an attribute is annotated as readOnly in the model, don't serialize it.
* Otherwise delegate to default attribute serializer.
* @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 string to null.
if (type === 'string' && json[key] === '') json[key] = null;
// Do not serialize read-only attributes.
if (options.readOnly) delete json[key];
// Version is sent only if it has a non-nullish value
if (key === 'version') {
if (json[key] === null || json[key] === undefined) delete json[key];
}
return value;
}
}
@@ -1 +0,0 @@
export { default } from 'api/models/fragment-account-attributes';
@@ -1 +0,0 @@
export { default } from 'api/models/fragment-credential-library-attributes';
@@ -1 +0,0 @@
export { default } from 'api/models/fragment-credential-store-attributes';
@@ -1 +0,0 @@
export { default } from 'api/models/fragment-managed-group-attributes';
@@ -1 +0,0 @@
export { default } from 'api/serializers/fragment-account-attributes';
@@ -1 +0,0 @@
export { default } from 'api/serializers/fragment-credential-library-attributes';
@@ -1 +0,0 @@
export { default } from 'api/serializers/fragment-credential-store-attributes';
@@ -1 +0,0 @@
export { default } from 'api/serializers/fragment-managed-group-attributes';
+12 -8
View File
@@ -34,15 +34,15 @@
"ember-fetch": "^8.1.1"
},
"devDependencies": {
"@babel/core": "^7.16.5",
"@babel/eslint-parser": "^7.17.0",
"@babel/plugin-proposal-decorators": "^7.17.8",
"@babel/core": "^7.18.5",
"@babel/eslint-parser": "^7.18.2",
"@babel/plugin-proposal-decorators": "^7.18.6",
"@ember/optional-features": "^2.0.0",
"@ember/test-helpers": "^2.6.0",
"@glimmer/component": "^1.0.4",
"@glimmer/tracking": "^1.0.4",
"@ember/test-helpers": "^2.8.1",
"@glimmer/component": "^1.1.2",
"@glimmer/tracking": "^1.1.2",
"broccoli-asset-rev": "^3.0.0",
"doctoc": "^2.1.0",
"doctoc": "^2.2.0",
"ember-auto-import": "^1.12.0",
"ember-cli": "~4.1.0",
"ember-cli-dependency-checker": "^3.2.0",
@@ -63,7 +63,6 @@
"eslint-config-prettier": "^8.3.0",
"eslint-plugin-ember": "^10.5.9",
"eslint-plugin-node": "^11.1.0",
"eslint-plugin-prettier": "^4.0.0",
"eslint-plugin-qunit": "^6.2.0",
"js-bexpr": "hashicorp/js-bexpr#9b4a4b54d85eba67fdfc0990133d1518d890b1e1",
"loader.js": "^4.7.0",
@@ -80,5 +79,10 @@
},
"ember-addon": {
"configPath": "tests/dummy/config"
},
"lint-staged": {
"*.js": "eslint --fix",
"*.hbs": "ember-template-lint --fix",
"*.{js,scss}": "prettier --write"
}
}
+1 -1
View File
@@ -17,7 +17,7 @@ module('Unit | Model | account', function (hooks) {
type: 'password',
});
assert.notOk(model.accountName);
model.attributes.login_name = 'foobar';
model.login_name = 'foobar';
assert.equal(model.accountName, 'foobar');
});
});
@@ -1,19 +0,0 @@
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);
});
}
);
@@ -1,13 +0,0 @@
import { module, test } from 'qunit';
import { setupTest } from 'ember-qunit';
module('Unit | Model | fragment credential store 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-store-attributes', {});
assert.ok(model);
});
});
@@ -1,13 +0,0 @@
import { module, test } from 'qunit';
import { setupTest } from 'ember-qunit';
module('Unit | Model | fragment managed group 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-managed-group-attributes', {});
assert.ok(model);
});
});
@@ -13,12 +13,10 @@ module('Unit | Serializer | account', function (hooks) {
name: 'Name',
auth_method_id: '1',
description: 'Description',
attributes: {
issuer: 'issuer',
subject: 'sub',
full_name: 'full_name',
email: 'email',
},
issuer: 'issuer',
subject: 'sub',
full_name: 'full_name',
email: 'email',
version: 1,
});
const snapshot = record._createSnapshot();
@@ -49,12 +47,10 @@ module('Unit | Serializer | account', function (hooks) {
name: 'Name',
auth_method_id: '1',
description: 'Description',
attributes: {
issuer: 'issuer',
subject: 'sub',
full_name: 'full_name',
email: 'email',
},
issuer: 'issuer',
subject: 'sub',
full_name: 'full_name',
email: 'email',
version: 1,
},
},
@@ -81,9 +77,7 @@ module('Unit | Serializer | account', function (hooks) {
name: 'Name',
auth_method_id: '1',
description: 'Description',
attributes: {
login_name: 'Login Name',
},
login_name: 'Login Name',
version: 1,
});
const snapshot = record._createSnapshot();
@@ -109,9 +103,7 @@ module('Unit | Serializer | account', function (hooks) {
name: 'Name',
auth_method_id: '1',
description: 'Description',
attributes: {
login_name: 'Login Name',
},
login_name: 'Login Name',
version: 1,
});
const snapshot = record._createSnapshot();
@@ -144,9 +136,7 @@ module('Unit | Serializer | account', function (hooks) {
type: 'password',
name: 'Name',
description: 'Description',
attributes: {
login_name: 'Login Name',
},
login_name: 'Login Name',
auth_method_id: '1',
version: 1,
});
@@ -170,9 +160,7 @@ module('Unit | Serializer | account', function (hooks) {
type: 'password',
name: 'Name',
description: 'Description',
attributes: {
login_name: 'Login Name',
},
login_name: 'Login Name',
auth_method_id: '1',
version: 1,
});
@@ -12,10 +12,8 @@ module('Unit | Serializer | credential library', function (hooks) {
type: 'vault',
name: 'Name',
description: 'Description',
attributes: {
path: '/vault/path',
http_method: 'GET',
},
path: '/vault/path',
http_method: 'GET',
version: 1,
});
const snapshot = record._createSnapshot();
@@ -45,10 +43,8 @@ module('Unit | Serializer | credential library', function (hooks) {
type: 'vault',
name: 'Name',
description: 'Description',
attributes: {
path: '/vault/path',
http_method: 'GET',
},
path: '/vault/path',
http_method: 'GET',
version: 1,
},
},
@@ -68,4 +64,66 @@ module('Unit | Serializer | credential library', function (hooks) {
version: 1,
});
});
test('it serializes empty strings to null', function (assert) {
assert.expect(1);
const store = this.owner.lookup('service:store');
const record = store.createRecord('credential-library', {
http_method: '',
path: null,
});
let serializedRecord = record.serialize();
assert.deepEqual(serializedRecord, {
attributes: {
http_method: null,
path: null,
},
credential_store_id: null,
description: null,
name: null,
type: 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('credential-library', {
http_method: 'GET',
http_request_body: 'body',
});
let serializedRecord = record.serialize();
assert.deepEqual(
serializedRecord,
{
attributes: {
http_method: 'GET',
path: null,
},
credential_store_id: null,
description: null,
name: null,
type: null,
},
'http_request_body attribute is not expected'
);
record.http_method = 'POST';
serializedRecord = record.serialize();
assert.deepEqual(
serializedRecord,
{
attributes: {
http_method: 'POST',
http_request_body: 'body',
path: null,
},
credential_store_id: null,
description: null,
name: null,
type: null,
},
'http_request_body attribute is expected'
);
});
});
@@ -12,16 +12,14 @@ module('Unit | Serializer | credential store', function (hooks) {
type: 'vault',
name: 'Name',
description: 'Description',
attributes: {
address: 'http://localhost:5000',
ca_cert: 'ca-cert-123',
client_certificate: 'client-cert-123',
client_certificate_key: 'client-cert-key-456',
namespace: 'foobar',
tls_server_name: 'yes',
tls_skip_verify: false,
token: 'foo',
},
address: 'http://localhost:5000',
ca_cert: 'ca-cert-123',
client_certificate: 'client-cert-123',
client_certificate_key: 'client-cert-key-456',
namespace: 'foobar',
tls_server_name: 'yes',
tls_skip_verify: false,
token: 'foo',
version: 1,
});
const snapshot = record._createSnapshot();
@@ -56,16 +54,14 @@ module('Unit | Serializer | credential store', function (hooks) {
type: 'vault',
name: 'Name',
description: 'Description',
attributes: {
address: 'http://localhost:5000',
ca_cert: 'ca-cert-123',
client_certificate: 'client-cert-123',
client_certificate_key: 'client-cert-key-456',
namespace: 'foobar',
tls_server_name: 'yes',
tls_skip_verify: false,
token: 'foo',
},
address: 'http://localhost:5000',
ca_cert: 'ca-cert-123',
client_certificate: 'client-cert-123',
client_certificate_key: 'client-cert-key-456',
namespace: 'foobar',
tls_server_name: 'yes',
tls_skip_verify: false,
token: 'foo',
version: 1,
},
},
@@ -90,4 +86,123 @@ module('Unit | Serializer | credential store', function (hooks) {
version: 1,
});
});
test('it serializes empty strings to null', function (assert) {
assert.expect(1);
const store = this.owner.lookup('service:store');
const record = store.createRecord('credential-store', {
address: '',
ca_cert: '',
client_certificate: '',
client_certificate_key: '',
namespace: '',
tls_server_name: '',
tls_skip_verify: false,
});
let serializedRecord = record.serialize();
assert.deepEqual(serializedRecord, {
attributes: {
address: null,
ca_cert: null,
client_certificate: null,
client_certificate_key: null,
namespace: null,
tls_server_name: null,
tls_skip_verify: false,
},
description: null,
name: null,
type: null,
});
});
test('it does not serialize token if present but falsy', function (assert) {
assert.expect(1);
const store = this.owner.lookup('service:store');
const record = store.createRecord('credential-store', {
token: null,
address: 'http://localhost:5000',
ca_cert: 'ca-cert-123',
client_certificate: 'client-cert-123',
client_certificate_key: 'client-cert-key-456',
namespace: 'foobar',
tls_server_name: 'yes',
tls_skip_verify: false,
});
let serializedRecord = record.serialize();
assert.deepEqual(
serializedRecord,
{
attributes: {
address: 'http://localhost:5000',
ca_cert: 'ca-cert-123',
client_certificate: 'client-cert-123',
client_certificate_key: 'client-cert-key-456',
namespace: 'foobar',
tls_server_name: 'yes',
tls_skip_verify: false,
},
description: null,
name: null,
type: null,
},
'token attribute is not expected'
);
});
test('it does not serialize client certificate key if present but falsy when client certificate is present', function (assert) {
assert.expect(2);
const store = this.owner.lookup('service:store');
const record = store.createRecord('credential-store', {
client_certificate: 'client-cert-123',
client_certificate_key: '',
address: 'http://localhost:5000',
token: 'foo',
ca_cert: 'ca-cert-123',
namespace: 'foobar',
tls_server_name: 'yes',
tls_skip_verify: false,
});
let serializedRecord = record.serialize();
assert.deepEqual(
serializedRecord,
{
attributes: {
client_certificate: 'client-cert-123',
address: 'http://localhost:5000',
token: 'foo',
ca_cert: 'ca-cert-123',
namespace: 'foobar',
tls_server_name: 'yes',
tls_skip_verify: false,
},
description: null,
name: null,
type: null,
},
'client certificate key attribute is not expected'
);
record.client_certificate_key = 'client-cert-key-456';
serializedRecord = record.serialize();
assert.deepEqual(
serializedRecord,
{
attributes: {
client_certificate: 'client-cert-123',
client_certificate_key: 'client-cert-key-456',
address: 'http://localhost:5000',
token: 'foo',
ca_cert: 'ca-cert-123',
namespace: 'foobar',
tls_server_name: 'yes',
tls_skip_verify: false,
},
description: null,
name: null,
type: null,
},
'client certificate key attribute is expected'
);
});
});
@@ -1,23 +0,0 @@
import { module, test } from 'qunit';
import { setupTest } from 'ember-qunit';
module('Unit | Serializer | fragment account attributes', function (hooks) {
setupTest(hooks);
// Replace this with your real tests.
test('it exists', function (assert) {
let store = this.owner.lookup('service:store');
let serializer = store.serializerFor('fragment-account-attributes');
assert.ok(serializer);
});
test('it serializes records', function (assert) {
let store = this.owner.lookup('service:store');
let record = store.createRecord('fragment-account-attributes', {});
let serializedRecord = record.serialize();
assert.ok(serializedRecord);
});
});
@@ -1,59 +0,0 @@
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'
);
});
}
);
@@ -1,117 +0,0 @@
import { module, test } from 'qunit';
import { setupTest } from 'ember-qunit';
module(
'Unit | Serializer | fragment credential store 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-store-attributes',
{
address: '',
ca_cert: '',
client_certificate: '',
client_certificate_key: '',
namespace: '',
tls_server_name: '',
tls_skip_verify: false,
}
);
let serializedRecord = record.serialize();
assert.deepEqual(serializedRecord, {
address: null,
ca_cert: null,
client_certificate: null,
client_certificate_key: null,
namespace: null,
tls_server_name: null,
tls_skip_verify: false,
});
});
test('it does not serialize token if present but falsy', function (assert) {
assert.expect(1);
const store = this.owner.lookup('service:store');
const record = store.createRecord(
'fragment-credential-store-attributes',
{
token: null,
address: 'http://localhost:5000',
ca_cert: 'ca-cert-123',
client_certificate: 'client-cert-123',
client_certificate_key: 'client-cert-key-456',
namespace: 'foobar',
tls_server_name: 'yes',
tls_skip_verify: false,
}
);
let serializedRecord = record.serialize();
assert.deepEqual(
serializedRecord,
{
address: 'http://localhost:5000',
ca_cert: 'ca-cert-123',
client_certificate: 'client-cert-123',
client_certificate_key: 'client-cert-key-456',
namespace: 'foobar',
tls_server_name: 'yes',
tls_skip_verify: false,
},
'token attribute is not expected'
);
});
test('it does not serialize client certificate key if present but falsy when client certificate is present', function (assert) {
assert.expect(2);
const store = this.owner.lookup('service:store');
const record = store.createRecord(
'fragment-credential-store-attributes',
{
client_certificate: 'client-cert-123',
client_certificate_key: '',
address: 'http://localhost:5000',
token: 'foo',
ca_cert: 'ca-cert-123',
namespace: 'foobar',
tls_server_name: 'yes',
tls_skip_verify: false,
}
);
let serializedRecord = record.serialize();
assert.deepEqual(
serializedRecord,
{
client_certificate: 'client-cert-123',
address: 'http://localhost:5000',
token: 'foo',
ca_cert: 'ca-cert-123',
namespace: 'foobar',
tls_server_name: 'yes',
tls_skip_verify: false,
},
'client certificate key attribute is not expected'
);
record.client_certificate_key = 'client-cert-key-456';
serializedRecord = record.serialize();
assert.deepEqual(
serializedRecord,
{
client_certificate: 'client-cert-123',
client_certificate_key: 'client-cert-key-456',
address: 'http://localhost:5000',
token: 'foo',
ca_cert: 'ca-cert-123',
namespace: 'foobar',
tls_server_name: 'yes',
tls_skip_verify: false,
},
'client certificate key attribute is expected'
);
});
}
);
@@ -1,21 +0,0 @@
import { module, test } from 'qunit';
import { setupTest } from 'ember-qunit';
module(
'Unit | Serializer | fragment managed groups attributes',
function (hooks) {
setupTest(hooks);
test('it serializes empty string to null', function (assert) {
assert.expect(1);
const store = this.owner.lookup('service:store');
const record = store.createRecord('fragment-managed-group-attributes', {
filter: '',
});
const serializedRecord = record.serialize();
assert.deepEqual(serializedRecord, {
filter: null,
});
});
}
);
@@ -41,9 +41,7 @@ module('Unit | Serializer | Managed group', function (hooks) {
version: 1,
auth_method_id: '1234',
type: 'oidc',
attributes: {
filter: 'key=value',
},
filter: 'key=value',
});
const snapshot = record._createSnapshot();
snapshot.adapterOptions = {};
@@ -75,9 +73,7 @@ module('Unit | Serializer | Managed group', function (hooks) {
version: undefined,
auth_method_id: '1234',
type: 'oidc',
attributes: {
filter: 'key=value',
},
filter: 'key=value',
},
},
});
@@ -138,9 +134,7 @@ module('Unit | Serializer | Managed group', function (hooks) {
version: 1,
auth_method_id: '1234',
type: 'oidc',
attributes: {
filter: 'key=value',
},
filter: 'key=value',
},
},
});
+1 -5
View File
@@ -14,11 +14,7 @@ module.exports = {
// end of babel-config
},
plugins: ['ember'],
extends: [
'eslint:recommended',
'plugin:ember/recommended',
'plugin:prettier/recommended',
],
extends: ['eslint:recommended', 'plugin:ember/recommended', 'prettier'],
env: {
browser: true,
},
+11 -7
View File
@@ -27,15 +27,15 @@
"ember-simple-auth": "^4.0.0"
},
"devDependencies": {
"@babel/eslint-parser": "^7.17.0",
"@babel/plugin-proposal-decorators": "^7.17.8",
"@babel/eslint-parser": "^7.18.2",
"@babel/plugin-proposal-decorators": "^7.18.6",
"@ember/optional-features": "^2.0.0",
"@ember/test-helpers": "^2.6.0",
"@glimmer/component": "^1.0.4",
"@glimmer/tracking": "^1.0.4",
"@ember/test-helpers": "^2.8.1",
"@glimmer/component": "^1.1.2",
"@glimmer/tracking": "^1.1.2",
"broccoli-asset-rev": "^3.0.0",
"core": "*",
"doctoc": "^2.1.0",
"doctoc": "^2.2.0",
"ember-auto-import": "^1.12.0",
"ember-cli": "~4.1.0",
"ember-cli-dependency-checker": "^3.2.0",
@@ -56,7 +56,6 @@
"eslint-config-prettier": "^8.3.0",
"eslint-plugin-ember": "^10.5.9",
"eslint-plugin-node": "^11.1.0",
"eslint-plugin-prettier": "^4.0.0",
"eslint-plugin-qunit": "^6.2.0",
"loader.js": "^4.7.0",
"npm-run-all": "^4.1.5",
@@ -72,5 +71,10 @@
},
"ember-addon": {
"configPath": "tests/dummy/config"
},
"lint-staged": {
"*.js": "eslint --fix",
"*.hbs": "ember-template-lint --fix",
"*.{js,scss}": "prettier --write"
}
}
+1 -5
View File
@@ -14,11 +14,7 @@ module.exports = {
// end of babel-config
},
plugins: ['ember'],
extends: [
'eslint:recommended',
'plugin:ember/recommended',
'plugin:prettier/recommended',
],
extends: ['eslint:recommended', 'plugin:ember/recommended', 'prettier'],
env: {
browser: true,
},
-13
View File
@@ -5,7 +5,6 @@ helpers.
<!-- START doctoc generated TOC please keep comment here to allow auto update -->
<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->
<!-- END doctoc generated TOC please keep comment here to allow auto update -->
- [Add core to an App](#add-core-to-an-app)
- [Installation](#installation)
@@ -26,18 +25,6 @@ helpers.
<!-- END doctoc generated TOC please keep comment here to allow auto update -->
- [Add core to an App](#add-core-to-an-app)
- [Installation](#installation)
- [Yarn Commands](#yarn-commands)
- [Linting](#linting)
- [Formatting](#formatting)
- [Running tests](#running-tests)
- [Running the dummy application](#running-the-dummy-application)
- [Contributing](#contributing)
- [Building ToC](#building-toc)
<!-- END doctoc generated TOC please keep comment here to allow auto update -->
## Add core to an App
Add this addon to an Ember application's `devDependencies` as:
+11 -7
View File
@@ -44,14 +44,14 @@
"rose": "*"
},
"devDependencies": {
"@babel/eslint-parser": "^7.17.0",
"@babel/plugin-proposal-decorators": "^7.17.8",
"@babel/eslint-parser": "^7.18.2",
"@babel/plugin-proposal-decorators": "^7.18.6",
"@ember/optional-features": "^2.0.0",
"@ember/test-helpers": "^2.6.0",
"@glimmer/component": "^1.0.4",
"@glimmer/tracking": "^1.0.4",
"@ember/test-helpers": "^2.8.1",
"@glimmer/component": "^1.1.2",
"@glimmer/tracking": "^1.1.2",
"broccoli-asset-rev": "^3.0.0",
"doctoc": "^2.1.0",
"doctoc": "^2.2.0",
"ember-auto-import": "^1.12.0",
"ember-cli": "~4.1.0",
"ember-cli-dependency-checker": "^3.2.0",
@@ -72,7 +72,6 @@
"eslint-config-prettier": "^8.3.0",
"eslint-plugin-ember": "^10.5.9",
"eslint-plugin-node": "^11.1.0",
"eslint-plugin-prettier": "^4.0.0",
"eslint-plugin-qunit": "^6.2.0",
"faker": "^5.5.3",
"js-bexpr": "hashicorp/js-bexpr#9b4a4b54d85eba67fdfc0990133d1518d890b1e1",
@@ -90,5 +89,10 @@
},
"ember-addon": {
"configPath": "tests/dummy/config"
},
"lint-staged": {
"*.js": "eslint --fix",
"*.hbs": "ember-template-lint --fix",
"*.{js,scss}": "prettier --write"
}
}
+1 -5
View File
@@ -14,11 +14,7 @@ module.exports = {
// end of babel-config
},
plugins: ['ember'],
extends: [
'eslint:recommended',
'plugin:ember/recommended',
'plugin:prettier/recommended',
],
extends: ['eslint:recommended', 'plugin:ember/recommended', 'prettier'],
env: {
browser: true,
},
+14 -10
View File
@@ -41,14 +41,14 @@
"emberx-select": "github:adopted-ember-addons/emberx-select#bc5f774"
},
"devDependencies": {
"@babel/core": "^7.16.5",
"@babel/eslint-parser": "^7.17.0",
"@babel/plugin-proposal-decorators": "^7.17.8",
"@babel/core": "^7.18.5",
"@babel/eslint-parser": "^7.18.2",
"@babel/plugin-proposal-decorators": "^7.18.6",
"@ember/optional-features": "^2.0.0",
"@ember/test-helpers": "^2.6.0",
"@glimmer/component": "^1.0.4",
"@glimmer/tracking": "^1.0.4",
"@hashicorp/flight-icons": "^2.1.0",
"@ember/test-helpers": "^2.8.1",
"@glimmer/component": "^1.1.2",
"@glimmer/tracking": "^1.1.2",
"@hashicorp/flight-icons": "^2.6.0",
"@storybook/addon-a11y": "^6.3.12",
"@storybook/addon-actions": "^6.3.10",
"@storybook/addon-docs": "^6.3.8",
@@ -61,10 +61,10 @@
"@storybook/ember": "^6.3.8",
"@storybook/ember-cli-storybook": "^0.5.0",
"@storybook/theming": "^6.3.0",
"babel-loader": "^8.2.2",
"babel-loader": "^8.2.5",
"babel-plugin-ember-modules-api-polyfill": "^2.12.0",
"broccoli-asset-rev": "^3.0.0",
"doctoc": "^2.1.0",
"doctoc": "^2.2.0",
"ember-auto-import": "^1.12.0",
"ember-cli": "~4.1.0",
"ember-cli-dependency-checker": "^3.2.0",
@@ -87,7 +87,6 @@
"eslint-config-prettier": "^8.3.0",
"eslint-plugin-ember": "^10.5.9",
"eslint-plugin-node": "^11.1.0",
"eslint-plugin-prettier": "^4.0.0",
"eslint-plugin-qunit": "^6.2.0",
"jest": "^27.4.7",
"loader.js": "^4.7.0",
@@ -109,5 +108,10 @@
},
"ember-addon": {
"configPath": "tests/dummy/config"
},
"lint-staged": {
"*.js": "eslint --fix",
"*.hbs": "ember-template-lint --fix",
"*.{js,scss}": "prettier --write"
}
}
+6 -5
View File
@@ -35,16 +35,17 @@
"test:addons-rose": "cd addons/rose && yarn test",
"test:ui-admin": "cd ui/admin && yarn test",
"test:ui-desktop": "cd ui/desktop && yarn test",
"precommit": "yarn compliance:licenses && yarn lint && yarn test",
"commit": "git-cz",
"compliance:licenses": "license-checker --onlyAllow 'Apache*;Apache License, Version 2.0;Apache-2.0;Apache 2.0;Artistic-2.0;BSD;BSD-3-Clause;CC-BY-3.0;CC-BY-4.0;CC0-1.0;ISC;MIT;MPL-2.0;Public Domain;Python-2.0;Unicode-TOU;Unlicense;WTFPL' --excludePackages 'boundary-ui;admin@0.0.0;desktop@0.0.0;base64-js@0.0.2;cycle@1.0.3'",
"doc:toc": "doctoc README.md"
"doc:toc": "doctoc README.md",
"prepare": "husky install"
},
"devDependencies": {
"cz-conventional-changelog": "^3.1.0",
"doctoc": "^2.1.0",
"doctoc": "^2.2.0",
"git-cz": "^4.8.0",
"license-checker": "^25.0.1"
"husky": "^8.0.0",
"license-checker": "^25.0.1",
"lint-staged": "^13.0.2"
},
"resolutions": {
"bl": "~1.2.3",
+1 -5
View File
@@ -14,11 +14,7 @@ module.exports = {
// end of babel-config
},
plugins: ['ember'],
extends: [
'eslint:recommended',
'plugin:ember/recommended',
'plugin:prettier/recommended',
],
extends: ['eslint:recommended', 'plugin:ember/recommended', 'prettier'],
env: {
browser: true,
},
@@ -15,25 +15,25 @@
{{#unless @model.isNew}}
<form.input
@value={{@model.attributes.issuer}}
@value={{@model.issuer}}
@label={{t 'form.issuer.label'}}
readonly={{true}}
@disabled={{true}}
/>
<form.input
@value={{@model.attributes.subject}}
@value={{@model.subject}}
@label={{t 'form.subject.label'}}
readonly={{true}}
@disabled={{true}}
/>
<form.input
@value={{@model.attributes.email}}
@value={{@model.email}}
@label={{t 'form.email.label'}}
readonly={{true}}
@disabled={{true}}
/>
<form.input
@value={{@model.attributes.full_name}}
@value={{@model.full_name}}
@label={{t 'form.full_name.label'}}
readonly={{true}}
@disabled={{true}}
@@ -83,7 +83,7 @@
<form.input
@name='issuer'
@type='text'
@value={{@model.attributes.issuer}}
@value={{@model.issuer}}
@label={{t 'form.issuer.label'}}
@error={{@model.errors.issuer}}
readonly={{false}}
@@ -101,7 +101,7 @@
<form.input
@name='subject'
@type='text'
@value={{@model.attributes.subject}}
@value={{@model.subject}}
@label={{t 'form.subject.label'}}
@error={{@model.errors.subject}}
readonly={{false}}
@@ -55,7 +55,7 @@
<form.input
@name='login_name'
@type='text'
@value={{@model.attributes.login_name}}
@value={{@model.login_name}}
@label={{t 'form.login_name.label'}}
@error={{@model.errors.login_name}}
readonly={{false}}
@@ -56,17 +56,17 @@
<form.input
@name='vault_path'
@type='text'
@value={{@model.attributes.path}}
@value={{@model.path}}
@label={{t 'resources.credential-library.form.vault_path.label'}}
@error={{@model.errors.attributes_path}}
@error={{@model.errors.path}}
@helperText={{t 'resources.credential-library.form.vault_path.help'}}
disabled={{@model.isSaving}}
readonly={{false}}
as |field|
>
{{#if @model.errors.attributes_path}}
{{#if @model.errors.path}}
<field.errors as |errors|>
{{#each @model.errors.attributes_path as |error|}}
{{#each @model.errors.path as |error|}}
<errors.message>{{error.message}}</errors.message>
{{/each}}
</field.errors>
@@ -81,8 +81,8 @@
<:body>
<form.radioGroup
@name='http_method'
@selectedValue={{@model.attributes.http_method}}
@changed={{fn (mut @model.attributes.http_method)}}
@selectedValue={{@model.http_method}}
@changed={{fn (mut @model.http_method)}}
@inline={{true}}
disabled={{@model.isSaving}}
as |radioGroup|
@@ -98,9 +98,9 @@
<form.textarea
@name='http_request_body'
@type='text'
@value={{@model.attributes.http_request_body}}
@value={{@model.http_request_body}}
@label={{t 'resources.credential-library.form.http_request_body.label'}}
@error={{@model.errors.attributes_http_request_body}}
@error={{@model.errors.http_request_body}}
@helperText={{t
'resources.credential-library.form.http_request_body.help'
}}
@@ -108,9 +108,9 @@
readonly={{false}}
as |field|
>
{{#if @model.errors.attributes_http_request_body}}
{{#if @model.errors.http_request_body}}
<field.errors as |errors|>
{{#each @model.errors.attributes_http_request_body as |error|}}
{{#each @model.errors.http_request_body as |error|}}
<errors.message>{{error.message}}</errors.message>
{{/each}}
</field.errors>
@@ -13,8 +13,8 @@ export default class FormCredentialLibraryIndexComponent extends Component {
* Only allow HTTP request body field if http_method is set to POST.
* @type {boolean}
*/
@computed('args.model.attributes.http_method')
@computed('args.model.http_method')
get isHttpRequestBodyAllowed() {
return this.args.model.attributes.http_method?.match(/post/i);
return this.args.model.http_method?.match(/post/i);
}
}
@@ -55,17 +55,17 @@
<form.input
@name='address'
@type='text'
@value={{@model.attributes.address}}
@value={{@model.address}}
@label={{t 'resources.credential-store.form.address.label'}}
@error={{@model.errors.attributes_address}}
@error={{@model.errors.address}}
@helperText={{t 'resources.credential-store.form.address.help'}}
disabled={{@model.isSaving}}
readonly={{false}}
as |field|
>
{{#if @model.errors.attributes_address}}
{{#if @model.errors.address}}
<field.errors as |errors|>
{{#each @model.errors.attributes_address as |error|}}
{{#each @model.errors.address as |error|}}
<errors.message>{{error.message}}</errors.message>
{{/each}}
</field.errors>
@@ -75,17 +75,17 @@
<form.input
@name='token'
@type='text'
@value={{@model.attributes.token}}
@value={{@model.token}}
@label={{t 'resources.credential-store.form.token.label'}}
@error={{@model.errors.attributes_token}}
@error={{@model.errors.token}}
@helperText={{t 'resources.credential-store.form.token.help'}}
disabled={{@model.isSaving}}
readonly={{false}}
as |field|
>
{{#if @model.errors.attributes_token}}
{{#if @model.errors.token}}
<field.errors as |errors|>
{{#each @model.errors.attributes_token as |error|}}
{{#each @model.errors.token as |error|}}
<errors.message>{{error.message}}</errors.message>
{{/each}}
</field.errors>
@@ -94,7 +94,7 @@
{{#unless @model.isNew}}
<form.input
@value={{@model.attributes.token_hmac}}
@value={{@model.token_hmac}}
@label={{t 'resources.credential-store.form.token_hmac.label'}}
readonly={{true}}
@disabled={{true}}
@@ -104,17 +104,17 @@
<form.input
@name='namespace'
@type='text'
@value={{@model.attributes.namespace}}
@value={{@model.namespace}}
@label={{t 'resources.credential-store.form.namespace.label'}}
@error={{@model.errors.attributes_namespace}}
@error={{@model.errors.namespace}}
@helperText={{t 'resources.credential-store.form.namespace.help'}}
disabled={{@model.isSaving}}
readonly={{false}}
as |field|
>
{{#if @model.errors.attributes_namespace}}
{{#if @model.errors.namespace}}
<field.errors as |errors|>
{{#each @model.errors.attributes_namespace as |error|}}
{{#each @model.errors.namespace as |error|}}
<errors.message>{{error.message}}</errors.message>
{{/each}}
</field.errors>
@@ -124,17 +124,17 @@
<form.input
@name='tls_server_name'
@type='text'
@value={{@model.attributes.tls_server_name}}
@value={{@model.tls_server_name}}
@label={{t 'resources.credential-store.form.tls_server_name.label'}}
@error={{@model.errors.attributes_tls_server_name}}
@error={{@model.errors.tls_server_name}}
@helperText={{t 'resources.credential-store.form.tls_server_name.help'}}
disabled={{@model.isSaving}}
readonly={{false}}
as |field|
>
{{#if @model.errors.attributes_tls_server_name}}
{{#if @model.errors.tls_server_name}}
<field.errors as |errors|>
{{#each @model.errors.attributes_tls_server_name as |error|}}
{{#each @model.errors.tls_server_name as |error|}}
<errors.message>{{error.message}}</errors.message>
{{/each}}
</field.errors>
@@ -144,17 +144,17 @@
<form.checkbox
@label={{t 'resources.credential-store.form.tls_skip_verify.label'}}
@helperText={{t 'resources.credential-store.form.tls_skip_verify.help'}}
@checked={{@model.attributes.tls_skip_verify}}
@checked={{@model.tls_skip_verify}}
@onChange={{fn
(mut @model.attributes.tls_skip_verify)
(if @model.attributes.tls_skip_verify false true)
(mut @model.tls_skip_verify)
(if @model.tls_skip_verify false true)
}}
@error={{@model.errors.attributes_tls_skip_verify}}
@error={{@model.errors.tls_skip_verify}}
as |field|
>
{{#if @model.errors.attributes_tls_skip_verify}}
{{#if @model.errors.tls_skip_verify}}
<field.errors as |errors|>
{{#each @model.errors.attributes_tls_skip_verify as |error|}}
{{#each @model.errors.tls_skip_verify as |error|}}
<errors.message>{{error.message}}</errors.message>
{{/each}}
</field.errors>
@@ -164,17 +164,17 @@
<form.textarea
@name='client_certificate'
@type='text'
@value={{@model.attributes.client_certificate}}
@value={{@model.client_certificate}}
@label={{t 'resources.credential-store.form.client_certificate.label'}}
@error={{@model.errors.attributes_client_certificate}}
@error={{@model.errors.client_certificate}}
@helperText={{t 'resources.credential-store.form.client_certificate.help'}}
disabled={{@model.isSaving}}
readonly={{false}}
as |field|
>
{{#if @model.errors.attributes_client_certificate}}
{{#if @model.errors.client_certificate}}
<field.errors as |errors|>
{{#each @model.errors.attributes_client_certificate as |error|}}
{{#each @model.errors.client_certificate as |error|}}
<errors.message>{{error.message}}</errors.message>
{{/each}}
</field.errors>
@@ -184,9 +184,9 @@
<form.textarea
@name='client_certificate_key'
@type='text'
@value={{@model.attributes.client_certificate_key}}
@value={{@model.client_certificate_key}}
@label={{t 'resources.credential-store.form.client_certificate_key.label'}}
@error={{@model.errors.attributes_client_certificate_key}}
@error={{@model.errors.client_certificate_key}}
@helperText={{t
'resources.credential-store.form.client_certificate_key.help'
}}
@@ -194,9 +194,9 @@
readonly={{false}}
as |field|
>
{{#if @model.errors.attributes_client_certificate_key}}
{{#if @model.errors.client_certificate_key}}
<field.errors as |errors|>
{{#each @model.errors.attributes_client_certificate_key as |error|}}
{{#each @model.errors.client_certificate_key as |error|}}
<errors.message>{{error.message}}</errors.message>
{{/each}}
</field.errors>
@@ -205,7 +205,7 @@
{{#unless @model.isNew}}
<form.input
@value={{@model.attributes.client_certificate_key_hmac}}
@value={{@model.client_certificate_key_hmac}}
@label={{t
'resources.credential-store.form.client_certificate_key_hmac.label'
}}
@@ -217,17 +217,17 @@
<form.textarea
@name='ca_cert'
@type='text'
@value={{@model.attributes.ca_cert}}
@value={{@model.ca_cert}}
@label={{t 'resources.credential-store.form.ca_cert.label'}}
@error={{@model.errors.attributes_ca_cert}}
@error={{@model.errors.ca_cert}}
@helperText={{t 'resources.credential-store.form.ca_cert.help'}}
disabled={{@model.isSaving}}
readonly={{false}}
as |field|
>
{{#if @model.errors.attributes_ca_cert}}
{{#if @model.errors.ca_cert}}
<field.errors as |errors|>
{{#each @model.errors.attributes_ca_cert as |error|}}
{{#each @model.errors.ca_cert as |error|}}
<errors.message>{{error.message}}</errors.message>
{{/each}}
</field.errors>
@@ -14,65 +14,57 @@
<page.body>
{{#if (feature-flag 'filter')}}
{{#if
(or
@model
(has-resource-filter-selections 'scopes.scope.sessions' 'status')
)
}}
<Rose::Toolbar as |toolbar|>
<toolbar.primary>
<Rose::Form as |form|>
{{#with
(resource-filter 'scopes.scope.sessions' 'status')
as |filter|
}}
<Rose::Dropdown
@text={{t (concat 'form.' filter.name '.label')}}
@count={{filter.selectedValue.length}}
@ignoreClickInside={{true}}
as |dropdown|
<Rose::Toolbar as |toolbar|>
<toolbar.primary>
<Rose::Form as |form|>
{{#with
(resource-filter 'scopes.scope.sessions' 'status')
as |filter|
}}
<Rose::Dropdown
@text={{t (concat 'form.' filter.name '.label')}}
@count={{filter.selectedValue.length}}
@ignoreClickInside={{true}}
as |dropdown|
>
<form.checkboxGroup
@name={{filter.name}}
@items={{filter.allowedValues}}
@selectedItems={{filter.selectedValue}}
@onChange={{route-action 'filterBy' filter.name}}
as |group|
>
<form.checkboxGroup
@name={{filter.name}}
@items={{filter.allowedValues}}
@selectedItems={{filter.selectedValue}}
@onChange={{route-action 'filterBy' filter.name}}
as |group|
>
<dropdown.item>
<group.checkbox
@label={{t
(concat 'resources.session.status.' group.item)
}}
value={{group.item}}
/>
</dropdown.item>
</form.checkboxGroup>
</Rose::Dropdown>
{{/with}}
<dropdown.item>
<group.checkbox
@label={{t
(concat 'resources.session.status.' group.item)
}}
value={{group.item}}
/>
</dropdown.item>
</form.checkboxGroup>
</Rose::Dropdown>
{{/with}}
{{#if
(has-resource-filter-selections
'scopes.scope.sessions' 'status'
)
}}
<Rose::Button
@style='inline-link-action'
@iconLeft='flight-icons/svg/x-16'
{{on 'click' (route-action 'clearAllFilters')}}
>{{t 'actions.clear-all-filters'}}
</Rose::Button>
{{/if}}
</Rose::Form>
</toolbar.primary>
{{#if
(has-resource-filter-selections 'scopes.scope.sessions' 'status')
}}
<Rose::Button
@style='inline-link-action'
@iconLeft='flight-icons/svg/x-16'
{{on 'click' (route-action 'clearAllFilters')}}
>{{t 'actions.clear-all-filters'}}
</Rose::Button>
{{/if}}
</Rose::Form>
</toolbar.primary>
<toolbar.secondary>
<ToolbarRefresher @onClick={{route-action 'refreshSessions'}} />
</toolbar.secondary>
<toolbar.secondary>
<ToolbarRefresher @onClick={{route-action 'refreshSessions'}} />
</toolbar.secondary>
</Rose::Toolbar>
</Rose::Toolbar>
{{/if}}
{{/if}}
{{#if @model}}
<Rose::Table as |table|>
+14 -10
View File
@@ -37,19 +37,19 @@
"ember-named-blocks-polyfill": "^0.2.5"
},
"devDependencies": {
"@babel/core": "^7.16.5",
"@babel/eslint-parser": "^7.17.0",
"@babel/plugin-proposal-decorators": "^7.17.8",
"@babel/core": "^7.18.5",
"@babel/eslint-parser": "^7.18.2",
"@babel/plugin-proposal-decorators": "^7.18.6",
"@ember/optional-features": "^2.0.0",
"@ember/render-modifiers": "^2.0.2",
"@ember/test-helpers": "^2.6.0",
"@glimmer/component": "^1.0.4",
"@glimmer/tracking": "^1.0.4",
"babel-loader": "^8.2.2",
"@ember/render-modifiers": "^2.0.4",
"@ember/test-helpers": "^2.8.1",
"@glimmer/component": "^1.1.2",
"@glimmer/tracking": "^1.1.2",
"babel-loader": "^8.2.5",
"broccoli-asset-rev": "^3.0.0",
"clipboard": "^2.0.8",
"core": "*",
"doctoc": "^2.1.0",
"doctoc": "^2.2.0",
"ember-a11y-testing": "^4.2.0",
"ember-auto-import": "^1.12.0",
"ember-cli": "~4.1.0",
@@ -82,7 +82,6 @@
"eslint-config-prettier": "^8.3.0",
"eslint-plugin-ember": "^10.5.9",
"eslint-plugin-node": "^11.1.0",
"eslint-plugin-prettier": "^4.0.0",
"eslint-plugin-qunit": "^6.2.0",
"faker": "^5.5.3",
"js-bexpr": "hashicorp/js-bexpr#9b4a4b54d85eba67fdfc0990133d1518d890b1e1",
@@ -101,5 +100,10 @@
},
"ember": {
"edition": "octane"
},
"lint-staged": {
"*.js": "eslint --fix",
"*.hbs": "ember-template-lint --fix",
"*.{js,scss}": "prettier --write"
}
}
@@ -48,6 +48,7 @@ module('Acceptance | credential-libraries | create', function (hooks) {
instances.credentialLibrary = this.server.create('credential-library', {
scope: instances.scopes.project,
credentialStore: instances.credentialStore,
http_method: 'GET',
});
// Generate route URLs for resources
urls.globalScope = `/scopes/global/scopes`;
+1 -5
View File
@@ -14,11 +14,7 @@ module.exports = {
// end of babel-config
},
plugins: ['ember'],
extends: [
'eslint:recommended',
'plugin:ember/recommended',
'plugin:prettier/recommended',
],
extends: ['eslint:recommended', 'plugin:ember/recommended', 'prettier'],
env: {
browser: true,
},
+1 -1
View File
@@ -1,5 +1,5 @@
{
"extends": "stylelint-config-sass-guidelines",
"extends": ["stylelint-config-sass-guidelines", "stylelint-config-prettier"],
"rules": {
"max-nesting-depth": 4,
"selector-max-compound-selectors": 4,
+8
View File
@@ -2,6 +2,14 @@
Canonical reference for changes, improvements, and bugfixes for Boundary Desktop.
## v1.4.5 [CLI 0.9.1] (2022.07.06)
### Bug Fixes
- Enable filtering terminated sessions ([PR](https://github.com/hashicorp/boundary-ui/pull/1169))
- Fix dropdown overflow issue ([PR](https://github.com/hashicorp/boundary-ui/pull/1160))
## v1.4.4 [CLI 0.9.0] (2022.06.20)
### New
-1
View File
@@ -33,7 +33,6 @@
main {
flex-grow: 1;
overflow: auto;
}
}
@@ -10,116 +10,107 @@
<page.body>
{{#if (feature-flag 'filter')}}
{{#if
(or
@model
(has-resource-filter-selections
'scopes.scope.projects.sessions' 'status' 'project'
)
)
}}
<Rose::Toolbar as |toolbar|>
<toolbar.primary>
<Rose::Form as |form|>
{{#with
(resource-filter 'scopes.scope.projects.sessions' 'status')
as |filter|
}}
<Rose::Dropdown
@text={{t (concat 'form.' filter.name '.label')}}
@count={{filter.selectedValue.length}}
@ignoreClickInside={{true}}
as |dropdown|
<Rose::Toolbar as |toolbar|>
<toolbar.primary>
<Rose::Form as |form|>
{{#with
(resource-filter 'scopes.scope.projects.sessions' 'status')
as |filter|
}}
<Rose::Dropdown
@text={{t (concat 'form.' filter.name '.label')}}
@count={{filter.selectedValue.length}}
@ignoreClickInside={{true}}
as |dropdown|
>
<form.checkboxGroup
@name={{filter.name}}
@items={{filter.allowedValues}}
@selectedItems={{filter.selectedValue}}
@onChange={{route-action 'filterBy' filter.name}}
as |group|
>
<form.checkboxGroup
@name={{filter.name}}
@items={{filter.allowedValues}}
@selectedItems={{filter.selectedValue}}
@onChange={{route-action 'filterBy' filter.name}}
as |group|
>
<dropdown.item>
<group.checkbox
@label={{t
(concat 'resources.session.status.' group.item)
}}
value={{group.item}}
/>
</dropdown.item>
</form.checkboxGroup>
</Rose::Dropdown>
{{/with}}
<dropdown.item>
<group.checkbox
@label={{t
(concat 'resources.session.status.' group.item)
}}
value={{group.item}}
/>
</dropdown.item>
</form.checkboxGroup>
</Rose::Dropdown>
{{/with}}
{{#with
(resource-filter 'scopes.scope.projects.sessions' 'project')
as |filter|
}}
<Rose::Dropdown
@text={{t (concat 'resources.' filter.name '.title')}}
@count={{filter.selectedValue.length}}
@ignoreClickInside={{true}}
as |dropdown|
>
<ul>
{{#with
(group-by filter.allowedValues 'scopeModel')
as |groups|
}}
{{#each groups as |groupedItems|}}
<li>
<dropdown.item>
<Rose::Icon
@name='flight-icons/svg/org-16'
@size='medium'
/>
{{groupedItems.key.displayName}}
</dropdown.item>
<ul class='indent-label-2'>
<form.checkboxGroup
@name={{filter.name}}
@items={{groupedItems.items}}
@selectedItems={{filter.selectedValue}}
@onChange={{route-action 'filterBy' filter.name}}
as |group|
>
<li>
<dropdown.item>
<group.checkbox
@label={{group.item.displayName}}
value={{group.item}}
/>
</dropdown.item>
</li>
</form.checkboxGroup>
</ul>
</li>
{{/each}}
{{/with}}
</ul>
</Rose::Dropdown>
{{/with}}
{{#with
(resource-filter 'scopes.scope.projects.sessions' 'project')
as |filter|
}}
<Rose::Dropdown
@text={{t (concat 'resources.' filter.name '.title')}}
@count={{filter.selectedValue.length}}
@ignoreClickInside={{true}}
as |dropdown|
>
<ul>
{{#with
(group-by filter.allowedValues 'scopeModel')
as |groups|
}}
{{#each groups as |groupedItems|}}
<li>
<dropdown.item>
<Rose::Icon
@name='flight-icons/svg/org-16'
@size='medium'
/>
{{groupedItems.key.displayName}}
</dropdown.item>
<ul class='indent-label-2'>
<form.checkboxGroup
@name={{filter.name}}
@items={{groupedItems.items}}
@selectedItems={{filter.selectedValue}}
@onChange={{route-action 'filterBy' filter.name}}
as |group|
>
<li>
<dropdown.item>
<group.checkbox
@label={{group.item.displayName}}
value={{group.item}}
/>
</dropdown.item>
</li>
</form.checkboxGroup>
</ul>
</li>
{{/each}}
{{/with}}
</ul>
</Rose::Dropdown>
{{/with}}
{{#if
(has-resource-filter-selections
'scopes.scope.projects.sessions' 'status' 'project'
)
}}
<Rose::Button
@style='inline-link-action'
@iconLeft='flight-icons/svg/x-16'
{{on 'click' (route-action 'clearAllFilters')}}
>{{t 'actions.clear-all-filters'}}
</Rose::Button>
{{/if}}
</Rose::Form>
</toolbar.primary>
{{#if
(has-resource-filter-selections
'scopes.scope.projects.sessions' 'status' 'project'
)
}}
<Rose::Button
@style='inline-link-action'
@iconLeft='flight-icons/svg/x-16'
{{on 'click' (route-action 'clearAllFilters')}}
>{{t 'actions.clear-all-filters'}}
</Rose::Button>
{{/if}}
</Rose::Form>
</toolbar.primary>
<toolbar.secondary>
<ToolbarRefresher @onClick={{route-action 'refreshSessions'}} />
</toolbar.secondary>
<toolbar.secondary>
<ToolbarRefresher @onClick={{route-action 'refreshSessions'}} />
</toolbar.secondary>
</Rose::Toolbar>
{{/if}}
</Rose::Toolbar>
{{/if}}
{{#if this.sorted}}
+1 -1
View File
@@ -1 +1 @@
0.9.0
0.9.1
+10 -11
View File
@@ -22,21 +22,20 @@
"forge": "config/forge.config.js"
},
"dependencies": {
"electron-devtools-installer": "^3.1.1",
"electron-is-dev": "^1.2.0",
"electron-devtools-installer": "^3.2.0",
"electron-is-dev": "^2.0.0",
"electron-squirrel-startup": "^1.0.0",
"lookpath": "^1.1.0",
"node-html-parser": "^3.3.5",
"semver": "^7.3.5",
"shell-quote": "^1.7.2",
"node-html-parser": "^5.3.3",
"semver": "^7.3.7",
"shell-quote": "^1.7.3",
"tree-kill": "^1.2.2"
},
"devDependencies": {
"@electron-forge/cli": "6.0.0-beta.54",
"@electron-forge/maker-deb": "6.0.0-beta.54",
"@electron-forge/maker-dmg": "^6.0.0-beta.54",
"@electron-forge/maker-squirrel": "^6.0.0-beta.55",
"@electron-forge/maker-zip": "^6.0.0-beta.54",
"@electron-forge/cli": "6.0.0-beta.64",
"@electron-forge/maker-deb": "6.0.0-beta.64",
"@electron-forge/maker-dmg": "^6.0.0-beta.64",
"@electron-forge/maker-squirrel": "^6.0.0-beta.64",
"@electron-forge/maker-zip": "^6.0.0-beta.64",
"decompress": "^4.2.1",
"devtron": "^1.4.0",
"electron": "14.2.9"
File diff suppressed because it is too large. Load diff
+16 -11
View File
@@ -35,7 +35,7 @@
"start:desktop": "ember electron",
"clean:coverage": "rm -rf coverage_*",
"pretest": "yarn clean:coverage",
"test": "npm-run-all lint test:*",
"test": "npm-run-all test:*",
"test:ember": "cross-env COVERAGE=true ember exam --random",
"e2e": "yarn run build && yarn run e2e:dev",
"e2e:dev": "npx playwright test --headed",
@@ -53,22 +53,22 @@
"ember-named-blocks-polyfill": "^0.2.5"
},
"devDependencies": {
"@babel/eslint-parser": "^7.17.0",
"@babel/plugin-proposal-decorators": "^7.17.8",
"@babel/eslint-parser": "^7.18.2",
"@babel/plugin-proposal-decorators": "^7.18.6",
"@doyensec/electronegativity": "^1.9.1",
"@ember/optional-features": "^2.0.0",
"@ember/render-modifiers": "^2.0.2",
"@ember/test-helpers": "^2.6.0",
"@glimmer/component": "^1.0.4",
"@glimmer/tracking": "^1.0.4",
"@ember/render-modifiers": "^2.0.4",
"@ember/test-helpers": "^2.8.1",
"@glimmer/component": "^1.1.2",
"@glimmer/tracking": "^1.1.2",
"@playwright/test": "^1.15.0",
"babel-loader": "^8.2.2",
"babel-loader": "^8.2.5",
"broccoli-asset-rev": "^3.0.0",
"clipboard": "^2.0.8",
"core": "*",
"cross-env": "^7.0.3",
"cross-os": "^1.4.0",
"doctoc": "^2.1.0",
"cross-os": "^1.5.0",
"doctoc": "^2.2.0",
"ember-a11y-testing": "^4.2.0",
"ember-auto-import": "^1.12.0",
"ember-autofocus-modifier": "^2.0.0",
@@ -103,7 +103,6 @@
"eslint-config-prettier": "^8.3.0",
"eslint-plugin-ember": "^10.5.9",
"eslint-plugin-node": "^11.1.0",
"eslint-plugin-prettier": "^4.0.0",
"eslint-plugin-qunit": "^6.2.0",
"faker": "^5.5.3",
"js-bexpr": "hashicorp/js-bexpr#9b4a4b54d85eba67fdfc0990133d1518d890b1e1",
@@ -117,6 +116,7 @@
"sass": "^1.41.0",
"sinon": "^11.1.2",
"stylelint": "^13.13.1",
"stylelint-config-prettier": "^9.0.3",
"stylelint-config-sass-guidelines": "^8.0.0"
},
"engines": {
@@ -124,5 +124,10 @@
},
"ember": {
"edition": "octane"
},
"lint-staged": {
"*.js": "eslint --fix",
"*.hbs": "ember-template-lint --fix",
"*.{js,scss}": "prettier --write"
}
}
+1018 -389
View File
File diff suppressed because it is too large. Load diff