Compare commits

..
202 Commits
Author SHA1 Message Date
Zhihe Li e1432c2750 chore: 🤖 Update changelog and version for desktop client (#1625)
Upgrade CLI version for desktop client to 0.12.0
2023-02-13 14:18:36 -05:00
Sarah Thompson deb9bba3ef update release triggers to call new GHA workflow (#1632)
* update release triggers to call new GHA workflow

* update workflow file name

* address feedback
2023-02-13 18:38:48 +00:00
Dharini Jeeva 49f2a4a08b Target form refactor (#1627)
* refactor: 💡 target form
2023-02-10 14:38:31 -08:00
Cameron Perera 3adfb08cb3 fix: 🐛 fix diagram width so explainer text stays below it (#1629) 2023-02-09 16:44:01 -06:00
Cameron Perera 540c9e2102 refactor: 💡 Update how WorkerDiagram is used in Target form (#1626)
* refactor: 💡 Update how WorkerDiagram is used in Target form

* refactor: 💡 remove extra div wrappers

Remove div wrappers for worker diagrams that were no longer needed

* refactor: 💡 rename worker diagram attributes to be more clear

* refactor: 💡 remove style changes out of scope for updates

* refactor: 💡 update logic for how HCP diagram is shown

* chore: 🤖 Add multi-hop flags to OSS block for verbosity
2023-02-09 16:00:19 -06:00
Carlos Alcaide CorvoandZhihe Li aff993b2b5 docs: ✏️ Add how to debug binary to docs (#1628)
* docs: ✏️ Add how to debug binary to docs

Co-authored-by: Zhihe Li <zhihe.li@hashicorp.com>
2023-02-09 10:57:54 -08:00
dependabot[bot]andZhihe Li 823de4f598 chore(deps): bump http-cache-semantics in /ui/desktop/electron-app (#1621)
Bumps [http-cache-semantics](https://github.com/kornelski/http-cache-semantics) from 4.1.0 to 4.1.1.
- [Release notes](https://github.com/kornelski/http-cache-semantics/releases)
- [Commits](https://github.com/kornelski/http-cache-semantics/compare/v4.1.0...v4.1.1)

---
updated-dependencies:
- dependency-name: http-cache-semantics
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Zhihe Li <zhihe.li@hashicorp.com>
2023-02-06 14:16:03 -05:00
Dharini Jeeva df4590de96 chore: 🤖 clean up isRequired/isOptional boolean (#1624) 2023-02-06 10:47:34 -08:00
dependabot[bot]andZhihe Li d0beb6eabd chore(deps): bump jszip from 3.7.1 to 3.10.1 in /ui/desktop/electron-app (#1618)
Bumps [jszip](https://github.com/Stuk/jszip) from 3.7.1 to 3.10.1.
- [Release notes](https://github.com/Stuk/jszip/releases)
- [Changelog](https://github.com/Stuk/jszip/blob/main/CHANGES.md)
- [Commits](https://github.com/Stuk/jszip/compare/v3.7.1...v3.10.1)

---
updated-dependencies:
- dependency-name: jszip
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Zhihe Li <zhihe.li@hashicorp.com>
2023-02-06 12:46:10 -05:00
Zhihe Li e6548f4d59 fix: 🐛 Fix undefined values from resource filter (#1622)
* fix: 🐛 Fix undefined values from resource filter
2023-02-06 10:28:00 -05:00
Zhihe Li 82bee42959 fix: 🐛 Fix null date time erroring out (#1623)
* fix: 🐛 Fix null date time erroring out

* style: 💄 Remove braces in if statement
2023-02-03 17:53:30 -05:00
Zhihe Li 2d6e26de84 style: 💄 Cleanup grammar of target address modal (#1620) 2023-02-03 09:49:34 -05:00
Carlos Alcaide Corvo 277e5ce197 Change the way we declare icon color (#1619) 2023-02-02 10:08:12 -08:00
Zhihe Li f0530e1f8f Vault SSH Cert Feature (#1596)
* feat: 🎸 Update models for vault ssh cert feature (#1591)

✅ Closes: ICU-7546

* feat: 🎸 Setup types in cred library forms and use HDS component (#1597)

* feat: 🎸 Setup types in cred library forms and use HDS component

✅ Closes: ICU-7673

* feat: 🎸 Add vault ssh cert type for credential library (#1608)

* feat: 🎸 Add vault ssh cert type for credential library

✅ Closes: ICU-7678

* feat: 🎸 Enable feature flag for vault ssh cert work (#1614)

* fix: 🐛 Change fields to optional as they get default by backend (#1615)

* Chore/cleanup vault ssh cert (#1616)
2023-02-01 13:46:23 -05:00
Cameron Perera e3772352ea chore: 🤖 fix broken host set links (#1613) 2023-01-31 16:02:05 -06:00
Carlos Alcaide Corvo 007fc4960b chore: 🤖 Refactor onboarding (#1586)
* chore: 🤖 Refactor onboarding

Refactor onboarding

✅ Closes: ICU-7558
2023-01-31 12:05:52 -08:00
Cameron Perera 9b998ece1b chore: 🤖 Enable Multi-hop & Network Address for Targets feature (#1607)
* chore: 🤖 Enable Multi-hop feature

* chore: 🤖 Enable target network address feature
2023-01-27 08:47:40 -06:00
Dharini Jeeva f71418732e fix: 🐛 worker section margin and reduce layout shift (#1610) 2023-01-27 08:34:51 -06:00
Dharini Jeeva d7f54af7e4 target workers UI Enterprise and HCP workflow (#1601)
adds ingress filter to target worker filter
2023-01-25 15:12:14 -08:00
Randall Morey de986c3df4 refactor: 💡 logically separate save steps for targets (#1604)
* refactor: 💡 logically separate save steps for targets

* Update ui/admin/app/routes/scopes/scope/targets.js

Oops, delete actions should catch.

* chore: 🤖 rename ids var
2023-01-25 12:48:23 -08:00
Dharini Jeeva df70c76b29 fix: 🐛 empty member ids within managed groups (#1600) 2023-01-23 15:27:23 -08:00
Dharini Jeeva 57fcab4c53 Tests target update create (#1594)
* test: 💍 add test cases for create and update target
2023-01-23 14:48:29 -08:00
Dharini Jeeva b41b6ee3e3 Icu 7301 UI target oss workflow (#1589)
Icu 7301 UI target OSS workflow (#1589)
2023-01-23 14:28:37 -08:00
Zhihe Li da59684f25 refactor: 💡 Move save back to route to unblock other work (#1598) 2023-01-23 14:32:31 -05:00
Devon AndersonandCameron Perera cf16bf8e33 chore: 🤖 fix incorrect url (#1599)
* chore: 🤖 fix incorrect url

Fix incorrect hcp worker ui download instructions that still referenced
old version.

* Update ui/admin/app/components/form/worker/create-worker-led/index.js

Co-authored-by: Cameron Perera <cameron.perera@hashicorp.com>

Co-authored-by: Cameron Perera <cameron.perera@hashicorp.com>
2023-01-23 11:29:31 -05:00
Devon Anderson 67219d07eb refactor: 💡 update hcp worker instructions (#1587)
Update HCP binary download instructions to reflect 0.12.0 version

✅ Closes: ICU-7603
2023-01-23 10:25:13 -05:00
Devon Anderson 812e509003 chore: 🤖 create target worker explainer element (#1595)
* chore: 🤖 create target worker explainer element

Create a element that will explain what the filters and diagrams mean
when toggled and on screen.

* refactor: 💡 add logic directly to worker-diagram

* refactor: 💡 added logic to all worker diagrams

Added logic to all worker diagrams
2023-01-20 12:44:48 -06:00
Randall Morey 54d5d34981 test: 💍 fixes flaky theme selection test (#1592)
✅ Closes: icu-7597
2023-01-19 16:53:02 -08:00
Cameron Pereraanddvonanderson ee85497182 feat: 🎸 Add HCP logic to Worker Diagram component (#1585)
* feat: 🎸 create Worker Diagram for OSS

✅ Closes: ICU-7579

* refactor: 💡 change ordered series icon to have white background

* feat: 🎸 Create Worker Diagram for egress and ingress filters

✅ Closes: ICU-7592

* feat: 🎸 Add HCP logic to Worker Diagram component

✅ Closes: ICU-7594

* refactor: 💡 remove wrapping divs and update data-test attrs

* refactor: 💡 revert HDS icon background color change

* refactor: 💡 make data-test attr more verbose

* test: 💍 fix data-test selectors for dual filter tests

* refactor: 💡 refactor test for worker-diagram dual-filter

Seperate test for `worker-diagram/dual-filter` into tow seperate test.
One for HCP and one for Enterprise.

✅ Closes: ICU-7594

* chore: 🤖 actual test for last commit

actual test for last commit

* chore: 🤖 split woker-diagram dual-filter into two components

Split worker-diagram-dual-filter component into two seperate component
and fixed test to reflect changes.

✅ Closes: ICU-7594

* refactor: 💡 quick test refactor

Refactor test for `worker-diagram-dual-filter`

* refactor: 💡 refactor dual-filter test

Refactor worker-diagram-dual-filter test to better align with if the
diagram exist, rather than what the text inside of the diagram states.

✅ Closes: ICU-7594

Co-authored-by: dvonanderson <devon.anderson@hashicorp.com>
2023-01-19 14:46:40 -06:00
Dharini Jeeva a6b2acc14d Oss workflow target egress filter (#1590)
* chore: 🤖 add egress filters to target
2023-01-18 20:26:28 -08:00
Devon Anderson 06b96c0315 chore: 🤖 enable feature flag (#1588)
Enable json-credential feature-flag for 0.12 release

✅ Closes: ICU-6832
2023-01-18 12:18:06 -05:00
Zhihe Li 3d0be5ef48 refactor: 💡 Simplify template for confirmation dialog (#1580) 2023-01-17 17:08:08 -05:00
Cameron Perera 07cf9fc533 Create Worker Diagram for egress and ingress filters (#1584)
* feat: 🎸 create Worker Diagram for OSS

✅ Closes: ICU-7579

* refactor: 💡 change ordered series icon to have white background

* feat: 🎸 Create Worker Diagram for egress and ingress filters

✅ Closes: ICU-7592

* refactor: 💡 remove wrapping divs and update data-test attrs

* refactor: 💡 revert HDS icon background color change

* refactor: 💡 make data-test attr more verbose
2023-01-17 14:39:54 -06:00
Zhihe Li 0cecb0d856 Icu 7490 UI add new address field to target (#1579)
* feat: 🎸 Add network address field to targets

✅ Closes: ICU-7490
2023-01-17 15:00:43 -05:00
Cameron Perera bfc275e0f6 feat: 🎸 create Worker Diagram for OSS (#1583)
* feat: 🎸 create Worker Diagram for OSS

✅ Closes: ICU-7579

* refactor: 💡 remove wrapping divs and update data-test attrs
2023-01-17 12:44:24 -06:00
Zhihe Li 1f229fb444 feat: 🎸 Add feature flag for vault ssh certificate (#1581)
* feat: 🎸 Add feature flag for vault ssh certificate

✅ Closes: ICU-7547
2023-01-13 15:15:44 -08:00
Carlos Alcaide Corvo 583d6de49b chore: 🤖 Deprecate ember-test-selectors usage (#1578)
Deprecate ember-test-selectors usage.

✅ Closes: ICU-7572
2023-01-13 13:17:20 -08:00
Devon AndersonandRandall Morey cf66235948 feat: 🎸 OrderedSeriesDiagram component (#1573)
* feat: 🎸 OrderedSeriesDiagram component

Created `orderd-series-diagram` component to look a the state of the
ingress and egress filters and determine which diagram should be
displayed.

✅ Closes: ICU-6459

* refactor: 💡 sass lint fix

Fixed sass lint errors

✅ Closes: ICU-7347

* Update app.scss

added closing tag

* refactor: 💡 refactor of styling and test

Refactored styling for `ordered-series-diagram` to match mocks, and
fixed indent errors in test.

✅ Closes: ICU-7347

* refactor: 💡 clean up testing errors

Clean up testing errors for `ordered-series-diagram`

* refactor: 💡 refactor series diagram (#1577)

* refactor: 💡 merge refactor changes and fix test

Merged refactor changes to ordered series diagram and fix tests

✅ Closes: ICU-7347

Co-authored-by: Randall Morey <randall@randallmorey.com>
2023-01-13 13:22:16 -05:00
Cameron Perera b02dc0aa43 fix: 🐛 Remove json_object from payload for non-json credentials (#1576)
* fix: 🐛 Remove json_object from payload for non-json credentials

* refactor: 💡 update new route logic for type specific attributes

* test: 💍 remove typeIn and use fillIn for json credential test
2023-01-12 16:28:43 -06:00
Cameron Perera f7c80c8869 UI target worker filter deprecation message (#1574)
* feat: 🎸 Add worker_filter deprecation message to target form

* test: 💍 fix test selectors for worker_filter message
2023-01-11 15:46:47 -06:00
Carlos Alcaide Corvo c31f9e98be refactor: 💡 Clean up prettier config files (#1571)
Clean up prettier config files

✅ Closes: ICU-6851
2023-01-11 10:04:03 -08:00
Carlos Alcaide Corvo b58eda1122 refactor: 💡 Deprecate htmlbars-inline-precompile within addons (#1563)
* refactor: 💡 Deprecate htmlbars-inline-precompile within addons
2023-01-11 08:55:35 -08:00
Zhihe Li 7509fa345b Chore/parallelize tests (#1556) 2023-01-10 18:25:09 -05:00
Cameron Perera ad37b489b7 refactor: 💡 Migrate Target form to use HDS components (#1562)
* refactor: 💡 Migrate Target form to use HDS components

* chore: 🤖 add ember-test-selectors to remove data-test attribute

Removes data-test attributes in production builds

* refactor: 💡 Default Port marked requried or optional by type
2023-01-10 16:18:28 -06:00
Cameron Perera 63f619b1ff Add egress and ingress worker filters to target model (#1554)
* feat: 🎸 add egress and ingress worker filter to target model

✅ Closes: ICU-7300

* chore: 🤖 update mirage to include ingress/egress worker filter

* refactor: 💡 update target mirage config for worker filters

* refactor: 💡 update how target id is set in mirage factory

* refactor: 💡 update target id and default_port mirage setup

* test: 💍 fix missing address attribute in new tests
2023-01-10 15:28:20 -06:00
Dharini Jeeva f41631c745 chore: 🤖 disable csp meta for prod (#1560) 2023-01-10 13:07:22 -08:00
Devon AndersonandCameron Perera 1bd057bb4c refactor: 💡 desktop display of complex nested secrets (#1551)
* refactor: 💡 desktop display of complex nested secrets

A quick solution for displaying JSON secret objects in connection modal.

✅ Closes: ICU-7409

* refactor: 💡 refactor hidden-secret.js and test

Guard against null for in `typeof` return.

✅ Closes: ICU-7409

* Update ui/desktop/app/styles/app.scss

Co-authored-by: Cameron Perera <cameron.perera@hashicorp.com>

* refactor: 💡 test

Changed test to check for secret output after clicking on reveal

* refactor: 💡 fix style for hidden-secret and test

Refactor hidden-secret span styling to have content centered and
refactored testing for assert.dom instead of find

Co-authored-by: Cameron Perera <cameron.perera@hashicorp.com>
2023-01-10 12:56:52 -05:00
Cameron Perera 6a8d563e06 chore: 🤖 add json credential to desktop mirage scenario (#1561)
Now when connecting to a target a JSON credential will be included as
one of the credential sources via mirage
2023-01-10 09:46:43 -06:00
Dharini Jeeva 2c72f85da1 Add support for managed groups in add-principals list (#1548)
chore: 🤖 add managed groups to add-principals view
2023-01-09 11:32:37 -08:00
Zhihe Li 73be8268a6 chore: 🤖 Add feature flag for target network address feature (#1558)
✅ Closes: ICU-7493
2023-01-09 13:41:20 -05:00
Zhihe Li 6d048d8e10 feat: 🎸 Update target model for address (#1557)
✅ Closes: ICU-7489
2023-01-09 12:35:42 -05:00
c21f011bb2 Refactor upgrade ember 4 (#1501)
Upgrade Ember 4

Co-authored-by: Randall Morey <randall@randallmorey.com>
Co-authored-by: Zhihe Li <zhihe.li@hashicorp.com>
2023-01-09 08:48:49 -08:00
Zhihe Li ed91b26861 chore: 🤖 Update dependencies to fix minimatch vulnerability (#1553) 2023-01-06 11:50:34 -05:00
Zhihe Li 044bd14e21 chore: 🤖 Remove yarn test from commit hook (#1555) 2023-01-05 15:32:35 -05:00
Cameron Perera d8d1c797f5 chore: 🤖 add target multi-hop flags to environment config (#1546)
* chore: 🤖 add target multi-hop flags to environment config

✅ Closes: ICU-7299

* chore: 🤖 rename feature flag to target-dual-worker

* chore: 🤖 update multi-hop flags to target-worker-filters-v2
2023-01-03 15:39:27 -06:00
Carlos Alcaide Corvo 49ce67b69e Update latest dependency changes (#1552) 2023-01-03 11:42:47 -08:00
Zhihe Li 5612abce4a chore: 🤖 Update electron deps (#1547) 2023-01-03 14:14:55 -05:00
Zhihe Li 07e64a7406 chore: 🤖 Pin request to latest version to fix qs vulnerability (#1550) 2022-12-23 15:11:40 -05:00
Zhihe Li 2393698d0d chore: 🤖 Update engine.io version to fix security vuln (#1549) 2022-12-23 11:33:54 -05:00
Dharini Jeeva f3dbd7cdab Add links to role principals with ability (#1545)
chore: 🤖 add links to role/principals
2022-12-22 14:41:00 -08:00
Dharini Jeeva f2c0458fb5 Add model support for managed groups (#1544)
* chore: 🤖 streamline managed groups getter on role
2022-12-22 14:09:56 -08:00
Dharini Jeeva 392da009d0 Add mirage support principal managed groups (#1542)
* chore: 🤖 mocks for principals/managed-groups & roles
2022-12-22 10:23:49 -08:00
Zhihe Li 1006680060 chore: 🤖 Update xmldom to patch security vulnerability (#1541) 2022-12-22 11:05:31 -05:00
Dharini Jeeva e9f1de91a1 chore: 🤖 update role form fields to hds (#1539) 2022-12-21 09:42:13 -08:00
Randall Morey 7dd9fb80d5 chore: 🤖 add role readPrincipal ability (#1540) 2022-12-20 16:31:39 -05:00
Randall Morey 69dfc7c784 refactor: 💡 use constants for target types (#1538)
* refactor: 💡 use constants for target types

* chore: 🤖 import types rather than *

* chore: 🤖 use capitalized TYPES_TARGET constant name
2022-12-20 12:07:52 -05:00
Zhihe Li 473ebcc397 chore: 🤖 Bump loader-utils to 2.0.4 (#1537) 2022-12-20 11:29:13 -05:00
Randall Moreyanddvonanderson 54c5c7fdc5 Chore tweak target type content (#1529)
* fix: 🐛 refactor info-field component

Overall context of how the `<InfoField/>` was changed to the correct
order.  Corrected css grid to have the order of
`label,input-field,helper-text`. Also refactored all component instances
affected by the change.

* refactor: 💡 refactor styling for icon to be center

refactor will get the icon as close to center as possible.

* chore: 🤖 ssh type first; update names and descriptions

* chore: 🤖 tweak info field styles

* chore: 🤖 fix formatting/linting issue

* refactor: 💡 credential stylistic changes per PR feedback

* chore: 🤖 reuse configPath

* fix: 🐛 fix lint error

* chore: 🤖 add target type field helper text

Co-authored-by: dvonanderson <devon.anderson@hashicorp.com>
2022-12-19 16:59:51 -05:00
Randall Morey 51c1aba794 chore: 🤖 cleanup json creds code / tests (#1535) 2022-12-16 15:06:19 -05:00
Michele Degges f1b7a9cd84 OSS->ENT merge trigger (#1520) 2022-12-16 09:42:40 -08:00
Cameron Perera d542acfc15 test: 💍 add tests for updating JSON credentials (#1531)
* test: 💍 add tests for updating JSON credentials

✅ Closes: ICU-6805

* refactor: 💡 update click selector for discard dialog tests
2022-12-15 13:24:48 -06:00
Dharini Jeeva 92db4d4947 chore: 🤖 remove rose radiocard and styles (#1521)
chore: 🤖 remove rose radio card and styles
2022-12-15 09:11:01 -08:00
Randall Moreyanddvonanderson ed9e674823 Refactor info field component (#1527)
* fix: 🐛 refactor info-field component

Overall context of how the `<InfoField/>` was changed to the correct
order.  Corrected css grid to have the order of
`label,input-field,helper-text`. Also refactored all component instances
affected by the change.

* refactor: 💡 refactor styling for icon to be center

refactor will get the icon as close to center as possible.

* chore: 🤖 tweak info field styles

Co-authored-by: dvonanderson <devon.anderson@hashicorp.com>
2022-12-14 18:55:11 -05:00
Cameron Perera c933aa8840 test: 💍 Add delete tests for JSON Credentials (#1526)
* test: 💍 Add delete tests for JSON Credentials

✅ Closes: ICU-6806

* refactor: 💡 update JSON variable names
2022-12-14 13:36:30 -06:00
Carlos Alcaide Corvo f6cad6a9ee chore: 🤖 Upgrade ember-focus-trap (#1530)
Upgrade ember-focus-trap (need for Ember 4 work)
2022-12-14 10:28:54 -08:00
c4a70e9e9e Icu 7083 add stylelint to admin (#1519)
* Added styelint to `ui/admin'

* refactor: 💡 quick refactor

Refactor attribute name back to original

✅ Closes: ICU-7083

* Update _notify.scss

for got to set the calling of the animation back in the selector

* refactor: 💡 quick refactor for stylelintrc file

possible pattern selector settings

* refactor: 💡 added rule for selector class pattern

Added rule for kebab-case, HDS, and CodeMirror

✅ Closes: ICU-7083

* Update app.scss

fixed linting errors.

* refactor: 💡 refactor stylelintrc

Simplify regex for `stylelintrc` and added
comments that details what
the regex is doing.

✅ Closes: ICU-7083

* Update ui/admin/.stylelintrc.js

Co-authored-by: Zhihe Li <zhihe.li@hashicorp.com>

Co-authored-by: Randall Morey <randall@randallmorey.com>
Co-authored-by: Zhihe Li <zhihe.li@hashicorp.com>
2022-12-14 12:22:44 -05:00
Cameron Perera 8a61c28254 test: 💍 Create read tests for JSON credentials (#1524)
* test: 💍 Create read tests for JSON credentials

✅ Closes: ICU-6804

* refactor: 💡 use HDS color token to skeleton message color

* refactor: 💡 update JSON variable names
2022-12-14 09:53:34 -06:00
3c2d5e6c7a chore(deps): bump express from 4.17.1 to 4.18.2 (#1514)
Bumps [express](https://github.com/expressjs/express) from 4.17.1 to 4.18.2.
- [Release notes](https://github.com/expressjs/express/releases)
- [Changelog](https://github.com/expressjs/express/blob/master/History.md)
- [Commits](https://github.com/expressjs/express/compare/4.17.1...4.18.2)

---
updated-dependencies:
- dependency-name: express
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Carlos Alcaide Corvo <ccorvo@hashicorp.com>
Co-authored-by: Randall Morey <randall@randallmorey.com>
2022-12-14 03:16:16 -05:00
88f195d02d chore(deps): bump qs from 6.5.2 to 6.5.3 in /ui/desktop/electron-app (#1513)
Bumps [qs](https://github.com/ljharb/qs) from 6.5.2 to 6.5.3.
- [Release notes](https://github.com/ljharb/qs/releases)
- [Changelog](https://github.com/ljharb/qs/blob/main/CHANGELOG.md)
- [Commits](https://github.com/ljharb/qs/compare/v6.5.2...v6.5.3)

---
updated-dependencies:
- dependency-name: qs
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Carlos Alcaide Corvo <ccorvo@hashicorp.com>
Co-authored-by: Randall Morey <randall@randallmorey.com>
2022-12-14 01:04:54 -05:00
Dharini Jeeva 7d3727dc34 Radio card migration - hostcatalog hosts host sets (#1503)
* chore: 🤖 radio card migration
2022-12-13 17:45:26 -08:00
Cameron Perera d98a85e2f4 test: 💍 update list credential tests (#1528)
* test: 💍 update list credential tests

✅ Closes: ICU-6807

* refactor: 💡 fix JSON variable naming
2022-12-13 15:56:03 -06:00
Devon Anderson fb89cbb4cf fix: 🐛 refactor info-field component (#1525)
* fix: 🐛 refactor info-field component

Overall context of how the `<InfoField/>` was changed to the correct
order.  Corrected css grid to have the order of
`label,input-field,helper-text`. Also refactored all component instances
affected by the change.

* refactor: 💡 refactor styling for icon to be center

refactor will get the icon as close to center as possible.
2022-12-13 15:49:22 -05:00
dependabot[bot]andCarlos Alcaide Corvo 2192794089 chore(deps): bump decode-uri-component from 0.2.0 to 0.2.2 (#1510)
Bumps [decode-uri-component](https://github.com/SamVerschueren/decode-uri-component) from 0.2.0 to 0.2.2.
- [Release notes](https://github.com/SamVerschueren/decode-uri-component/releases)
- [Commits](https://github.com/SamVerschueren/decode-uri-component/compare/v0.2.0...v0.2.2)

---
updated-dependencies:
- dependency-name: decode-uri-component
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Carlos Alcaide Corvo <ccorvo@hashicorp.com>
2022-12-13 11:57:36 -08:00
Cameron Perera 66ae9eb5b0 feat: 🎸 Update byow install boundary command for hcp edition (#1522)
* feat: 🎸 Update byow install boundary command for hcp edition

* refactor: 💡 update version in download url for boundary worker
2022-12-12 18:55:28 -06:00
lisbet-alvarezandCameron Perera e418017bc2 feat: 🎸 create form for json credentials (#1498)
* feat: 🎸 create form for json credentials

✅ Closes: ICU-6682

* refactor: 💡 add new info field

* refactor: 💡 add feature flag

* refactor: 💡 add hds radio cards to json cred

* Update ui/admin/tests/acceptance/credential-store/credentials/create-test.js

* test: 💍 add test for json cred

* chore: 🤖 Remove ember-data-model-fragments package

* fix: 🐛 Update how json is added as a known credential type

* refactor: 💡 update credentialTypes if statement to ternary

* chore: 🤖 add ember-data back to addon/api project

* chore: 🤖 remove ember-feature-flag from addon/api

* refactor: 💡 remove if statement in cred form

* refactor: 💡 update selectors for json cred. tests

* refactor: 💡 Update Credential Form to use form.disabled

* test: 💍 Fix test selectors for radio card credential tests

* refactor: 💡 update credential types declaration to const

* style: 💄 Fix style issue with SecretEditor in edit mode

* refactor: 💡 remove disabled and readonly attributes in form

* refactor: 💡 Create credential ability canRead override

* test: 💍 add credential ability override tests

* test: 💍 Fix brokered credential test with json support added

* refactor: 💡 add attributes comment back to credential model

Co-authored-by: Cameron Perera <cameron.perera@hashicorp.com>
2022-12-12 18:37:01 -06:00
Dharini Jeeva e18b30a54e chore: 🤖 radio card migration - target and Credentials (#1502)
chore: 🤖 radio card migration - target and Credentials
2022-12-08 11:17:44 -08:00
Dharini Jeeva 28a43251ac migrate credential store radio card component (#1492)
chore: 🤖 cred store radio card migration
2022-12-07 13:52:49 -08:00
lisbet-alvarez 5474465463 refactor: 💡 acceptance tests in scopes folder (#1509)
✅ Closes: ICU-7126
2022-12-07 10:32:08 -08:00
Zhihe Li 8ae6506abf Icu 6896 upgrade ember data (#1511)
* chore: 🤖 Upgrade ember data to 3.28.12

✅ Closes: ICU-6896
2022-12-06 14:29:58 -05:00
Devon AndersonandRandall Morey 764f4703e0 chore: 🤖 brokered and injected credential associations (#1512)
* chore: 🤖 brokered and injected credential associations

Verified JSON credentials show up as a source that can be added to a
target as `brokered`, and not show up as a source that can be added to a
target as `injected`.

✅ Closes: ICU-6833, ICU-6834, ICU-6835, ICU-6836

* Update ui/admin/app/controllers/scopes/scope/targets/target/add-injected-application-credential-sources.js

Co-authored-by: Randall Morey <randall@randallmorey.com>

Co-authored-by: Randall Morey <randall@randallmorey.com>
2022-12-06 13:37:55 -05:00
Cameron Perera c62eb751e4 Icu 6680 UI code editor for secrets (#1499)
* feat: 🎸 initial secret editor

* feat: 🎸 Create Secret Editor for JSON Credentials

✅ Closes: ICU-6680

* style: 💄 Fix sass lint errors

* style: 💄 Appease sass-lint rule for using --size in stylesheet

* refactor: 💡 Set Icon size via component attribute

* refactor: 💡 remove computed decorators for Secret Editor

* refactor: 💡 update editor styles to using sizing variables

* refactor: 💡 update styles and add comments

* refactor: 💡 clean up styling for secret editor

* refactor: 💡 update class names to be more verbose

* chore: 🤖 move jsonlint import to rose index.js

* refactor: 💡 remove duplicate margin style for skeleton body

* refactor: 💡 add comments to SecretEditor component class

* refactor: 💡 large updates to secret json editor

* refactor: 💡 Move JSON Secret to form/field/ directory

* style: 💄 fix padding for Secret Editor line numbers

* chore: 🤖 disable property-sort-oder in .sasslintrc

* refactor: 💡 reorder app.scss styles

* test: 💍 Add integration tests for JSON Secret and Skeleton
2022-12-02 13:58:04 -06:00
Zhihe Li c3d9fd8fc5 Icu 6657 auth method model fragments refactor (#1507)
* refactor: 💡 Remove fragment usage for arrays in auth method
* chore: 🤖 Remove ember-data-model-fragments

✅ Closes: ICU-6657
2022-12-02 14:29:53 -05:00
Zhihe Li f8429b15e9 Chore/cleanup filter attribute (#1500)
* refactor: 💡 Rename attributes called filter

* refactor: 💡 Remove adapter handling of old attribute errors

* refactor: 💡 Check for undefined in serializer instead of falsy
2022-12-02 13:44:11 -05:00
lisbet-alvarez b1f14e5c62 refactor: 💡 acceptance tests in targets folder (#1505)
* refactor: 💡 acceptance tests in targets folder

✅ Closes: ICU-6974

* refactor: 💡 update a few test cases
2022-11-30 14:01:23 -08:00
Dharini Jeeva caeb6f9008 Host catalog infofield (#1508)
* chore: 🤖 use infofield in host catalog
2022-11-30 13:13:36 -08:00
Devon AndersonandRandall Morey 0015745d41 feat: 🎸 Custom information field (#1493)
* feat: 🎸 Custom information field

Create custom information component for views that need read-only
information listed.

✅ Closes: ICU-6957 ICU-6981

* refactor: 💡 fix setup for info-field component

Added conditional icon as a yield to `Hds::Form::TextInput::Field` to
avoid over complicating the css for `info-field` component.

✅ Closes: ICU-6957

* refactor `username_password` index.hbs

`@value` on `<InfoField>` was pointing to wrong variable.

* fix: 🐛 fixed lint

Lint errors

* fix: 🐛 linting errors fixed

linting errors fixed

* chore: 🤖 tweak info field styles and layout for icons

* refactor: 💡 switched `grid-area` in css to match design

Switched `grid-area`'s to match Design

* refactor: 💡 removed grid attribute from field wrapper

Removed display grid from `vertical` wrapper

Co-authored-by: Randall Morey <randall@randallmorey.com>
2022-11-30 14:38:12 -05:00
lisbet-alvarez fbc023da65 refactor: 💡 acceptance tests in create-test.js for users (#1476)
* refactor: 💡 acceptance tests in create-test.js for users

✅ Closes: ICU-6965

* refactor: 💡 use this.server.schema instead of this.server.db
2022-11-30 10:06:04 -08:00
lisbet-alvarez 6cc5f43b48 refactor: 💡 acceptance tests in update-test.js for user (#1475)
* refactor: 💡 acceptance tests in update-test.js for user

✅ Closes: ICU-6969

* refactor: 💡 use this.server.schema instead of this.server.db
2022-11-28 16:08:56 -08:00
lisbet-alvarez 2cef6ebe44 refactor: 💡 acceptance tests in delete-test.js for users (#1474)
✅ Closes: ICU-6895
2022-11-28 15:04:18 -08:00
lisbet-alvarezandCameron Perera e8a3650fbe refactor: 💡 adjust css selector for specific asserts (#1468)
* refactor: 💡 adjust css selector for specific asserts

✅ Closes: ICU-6889

* refactor: 💡 small update

* refactor: 💡 selectors for .doesNotExist()

* Update addons/core/tests/integration/helpers/relative-datetime-live-test.js

Co-authored-by: Cameron Perera <cameron.perera@hashicorp.com>
2022-11-28 14:44:34 -08:00
Zhihe Li ff7a1fedea Icu 6794 refactor attributes using the newer is nested attribute annotation (#1481) 2022-11-23 14:40:07 -05:00
Zhihe Li ff6e2bb4cf fix: 🐛 Fix claims map dropdown not having a default value (#1497) 2022-11-23 12:50:46 -05:00
Dharini Jeeva cd8a627c46 chore: 🤖 quick setup layout (#1496) 2022-11-23 09:00:21 -08:00
Dharini Jeeva 2b3f9b3cf0 fix: 🐛 add state to oidc form (#1491) 2022-11-22 12:06:49 -08:00
Dharini Jeeva 7120a5c54e chore: 🤖 deprecate warning to rose radiocard (#1486)
* chore: 🤖 add deprecation warning message to rose radiocard component
2022-11-22 08:37:54 -08:00
Randall MoreyandZhihe Li f7c1523adb Refactor host set fragment arrays (#1464)
* refactor: 💡 change host_ids to a simple attribute

* refactor: 💡 manually manage host set array model attributes

* refactor: 💡 Fix host set IDs usage

* style: 💄 Fix comment and add braces for if statements

* refactor: 💡 Add back in empty array for normalizer

* refactor: 💡 Move attributes to generated model

* refactor: 💡 Update array actions when creating new host sets

* test: 💍 Add a few create tests for azure and aws host sets

* test: 💍 Add update tests for azure and aws host sets

Co-authored-by: Zhihe Li <zhihe.li@hashicorp.com>
2022-11-21 19:07:46 -05:00
Devon AndersonandCameron Perera e3d44eb813 chore: 🤖 JSON credential data modeling (#1485)
* chore: 🤖 JSON credential data modeling

Added json type to credential model, created `json_object` attribute for
`json` type, updated credential serializer to handle `json_object`
attribute data being sent to backend and updated normalizer to handlle
secret untracked 'json_object'.

✅ Closes: ICU-6653, ICU-6684, ICU-6685, ICU-6802, ICU-6803

* Update en-us.yaml

fixed spelling

* Update addons/api/addon/models/credential.js

Co-authored-by: Cameron Perera <cameron.perera@hashicorp.com>

* refactor: 💡 refactor credential serializer and .yaml

Refactored credential serializer to check for `json_object` existence
before serializing and changed help variable in `.yaml` file for
credentials.

* refactor: 💡 refactor for credential serializer

Refactor credential serializer removed redundant code,

Co-authored-by: Cameron Perera <cameron.perera@hashicorp.com>
2022-11-21 16:28:10 -05:00
Carlos Alcaide Corvo 6b166401a1 chore: 🤖 Upgrade ember-browser-services (#1478)
Upgrade ember-browser-services
2022-11-18 10:52:48 -08:00
Dharini Jeeva 65efe58481 fix: 🐛 hds select field width (#1479) 2022-11-17 13:38:51 -08:00
Dharini Jeeva c9254b4463 Remove rose badge styles (#1473)
* chore: 🤖 remove rose badge stylesheets
2022-11-17 10:44:04 -08:00
Zhihe Li fa7b5bd00b fix: 🐛 Fix accounts not displaying correctly in auth methods (#1477) 2022-11-17 11:52:53 -05:00
lisbet-alvarez 232699cad0 refactor: 💡 acceptance tests in read-test.js for users (#1467)
* refactor: 💡 acceptance tests in read-test.js for users

✅ Closes: ICU-6892

* Update ui/admin/tests/acceptance/users/read-test.js
2022-11-16 12:10:38 -08:00
lisbet-alvarezandRandall Morey 37ad4b6a32 refactor: 💡 acceptance tests in list-test.js for users (#1466)
* refactor: 💡 acceptance tests in list-test.js for users

✅ Closes: ICU-6893

Co-authored-by: Randall Morey <randall@randallmorey.com>
2022-11-16 11:39:45 -08:00
Dharini Jeeva 42169b070c Remove rose badge (#1465)
chore: 🤖 delete rose badge component
2022-11-16 10:07:40 -08:00
dependabot[bot] 5e48fdaaf8 chore(deps): bump loader-utils from 1.4.1 to 1.4.2 (#1470)
Bumps [loader-utils](https://github.com/webpack/loader-utils) from 1.4.1 to 1.4.2.
- [Release notes](https://github.com/webpack/loader-utils/releases)
- [Changelog](https://github.com/webpack/loader-utils/blob/v1.4.2/CHANGELOG.md)
- [Commits](https://github.com/webpack/loader-utils/compare/v1.4.1...v1.4.2)

---
updated-dependencies:
- dependency-name: loader-utils
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-11-16 08:35:43 -08:00
Devon AndersonandRandall Morey cf3acad084 feat: 🎸 Credential type selector refactor (#1452)
* feat: 🎸 Credential type selector refactor

When editing a credential or viewing the details screeen, the credential
type should be displayed as a readonly text field

✅ Closes: ICU-6839

* refactor: 💡 refactored disabled argument for credential type

BREAKING CHANGE: 🧨 ICU-6839

✅ Closes: ICU-6839

* refactor: 💡 Refactored credential-type-field

Refactored credential type card ui to look more like a message element
than a disabled input

✅ Closes: ICU-6839

Co-authored-by: Randall Morey <randall@randallmorey.com>
2022-11-15 19:57:39 -08:00
Dharini Jeeva b8cbbceff6 chore: 🤖 deprecation workflow (#1462)
* chore: 🤖 rebase main

* test: 💍 rebase

* test: 💍 rebase

* test: 💍 rebase

* test: 💍 rebase
2022-11-15 19:36:30 -08:00
Dharini Jeeva 58a47c8375 chore: 🤖 remove console log (#1463)
* chore: 🤖 remove console log
2022-11-15 10:41:43 -08:00
Randall Morey 9875899875 refactor: 💡 migrate set-password form to HDS text input (#1461)
* refactor: 💡 update scope form to use HDS input and textarea

* chore: 🤖 tweak "optional" label text color in dark mode

* fix: 🐛 add HDS field margins and fix form tests

* fix: 🐛 fix acceptance tests and add TextInput event handlers

* refactor: 💡 migrate change-password form to HDS inputs

* fix: 🐛 use input event and fix set-from-event to handle empty

* chore: 🤖 reverse order of isRequired and isOptional

* fix: 🐛 use @type as required by HDS

* chore: 🤖 fix linting

* refactor: 💡 migrate set-password form to HDS text input

✅ Closes: icu-6918
2022-11-15 10:14:05 -08:00
Randall Morey aae85c44d2 Migrate change-password form to HDS input fields. (#1460)
* refactor: 💡 update scope form to use HDS input and textarea

* chore: 🤖 tweak "optional" label text color in dark mode

* fix: 🐛 add HDS field margins and fix form tests

* fix: 🐛 fix acceptance tests and add TextInput event handlers

* refactor: 💡 migrate change-password form to HDS inputs

* fix: 🐛 use input event and fix set-from-event to handle empty

* chore: 🤖 reverse order of isRequired and isOptional

* fix: 🐛 use @type as required by HDS

* chore: 🤖 fix linting
2022-11-15 09:34:25 -08:00
Randall Morey b08d3affe4 refactor: 💡 update scope form to use HDS input and textarea (#1459)
* refactor: 💡 update scope form to use HDS input and textarea

* chore: 🤖 tweak "optional" label text color in dark mode

* fix: 🐛 add HDS field margins and fix form tests

* fix: 🐛 fix acceptance tests and add TextInput event handlers

* fix: 🐛 use input event and fix set-from-event to handle empty

* fix: 🐛 fix linting and add @type='text' on HDS text input

* fix: 🐛 fix HDS field margin overrides

* chore: 🤖 simplify selector
2022-11-15 08:53:10 -08:00
Randall Morey bdc36b1e59 fix: 🐛 fix broken relative datetime live render tests (#1469) 2022-11-15 07:53:01 -08:00
Dharini Jeeva e0f9b8723b Migrate rest of the badges in admin UI (#1454)
* chore: 🤖 migrate rest of the badges in admin ui
2022-11-14 17:14:33 -08:00
lisbet-alvarezandZhihe Li b3a02a3d6e refactor: 💡 update acceptance tests for host-catalogs (#1451)
* refactor: 💡 refactor update acceptance tests for host-catalogs

✅ Closes: ICU-6648

Co-authored-by: Zhihe Li <zhihe.li@hashicorp.com>
2022-11-14 16:07:12 -08:00
Dharini Jeeva 9bb9edc36b Storybook badge updates (#1453)
* chore: 🤖 storybook updates for badge
2022-11-14 13:52:23 -08:00
lisbet-alvarez 0aa7a5f494 Icu 6647 acceptance host catalogs list (#1450)
* refactor: 💡 list acceptance tests for host catalogs

✅ Closes: ICU-6647

* refactor: 💡 adjust selector for asserts that use .doesNotExist

✅ Closes: ICU-6647
2022-11-14 13:24:09 -08:00
Cameron PereraandRandall Morey 84077b5d8a Icu 6800 api is secret data modeling (#1448)
* refactor: 💡 Add isSecret option for model attributes

Move secret attribute logic to application serializer that will remove
the key/value pair if the value is null or empty

✅ Closes: ICU-6800

* refactor: 💡 Add isSecret option to credential store token

* Update addons/api/addon/serializers/credential.js

Remove unneeded serialize method for credentials

Co-authored-by: Randall Morey <randall@randallmorey.com>

* refactor: 💡 add type check for serializing secret attributes

Co-authored-by: Randall Morey <randall@randallmorey.com>
2022-11-14 14:45:53 -06:00
lisbet-alvarez faec9aad73 refactor: 💡 delete acceptance tests for host catalogs (#1449)
✅ Closes: ICU-6649
2022-11-14 10:53:43 -08:00
Dharini Jeeva 399aeb1790 chore: 🤖 badge migrations in admin ui part 1 (#1439)
* chore: 🤖 badge migrations in admin ui part 1
2022-11-11 18:19:07 -08:00
Dharini Jeeva a1e35cdc99 chore: 🤖 badge migration in desktop (#1438)
* chore: 🤖 badge migration in desktop
2022-11-11 17:15:52 -08:00
Randall Morey 2709ce925f fix: 🐛 inlcude "addon" folder in rose style formatting command (#1458) 2022-11-11 15:24:14 -08:00
Dharini Jeeva ee8182e262 feat: 🎸 badge migration in sessions admin ui (#1437)
* chore: badge migration in sessions admin ui
2022-11-11 14:14:31 -08:00
Randall MoreyandDharini Jeeva 02b6afa5e7 refactor: migrate to HDS select form fields (#1447)
* chore: 🤖 install HDS and associated assets

* chore: 🤖 bump HDS version

* refactor: 💡 optimize hds/icon addon content build

* test: 💍 fix intermittent test failure

* refactor: 💡 replace auth method selects with HDS select

* refactor: 💡 update storybook and tests to reflect HDS selects

* style: 💄 fix style linting issue

* fix: 🐛 fix bad scss syntax

* fix: 🐛 fix scss syntax again

* refactor: 💡 remove references to rose/form/select

* chore: 🤖 experimental HDS dark mode

* refactor: 💡 add custom set helper to replace action helper

* chore: 🤖 remove HDS dark mode, to be implemented in another pr

* refactor: 💡 apply custom dark mode for HDS

* chore: 🤖 add tier 2 color tweaks for better dark mode contrast

* chore: 🤖 tweak HDS form borders in dark mode

* docs: ✏️ add set function comment

Co-authored-by: Dharini Jeeva <dharini@hashicorp.com>
2022-11-11 13:45:35 -08:00
Randall MoreyandDharini Jeeva 87b1fb1c5c refactor: 💡 apply custom dark mode for HDS (#1456)
* chore: 🤖 install HDS and associated assets

* chore: 🤖 bump HDS version

* refactor: 💡 optimize hds/icon addon content build

* test: 💍 fix intermittent test failure

* refactor: 💡 apply custom dark mode for HDS

* chore: 🤖 add tier 2 color tweaks for better dark mode contrast

Co-authored-by: Dharini Jeeva <dharini@hashicorp.com>
2022-11-11 11:31:46 -08:00
Randall MoreyandDharini Jeeva 9fa982d6d1 chore: 🤖 install HDS and associated assets (#1436)
* chore: 🤖 install HDS and associated assets

* chore: 🤖 bump HDS version

* refactor: 💡 optimize hds/icon addon content build

* test: 💍 fix intermittent test failure

Co-authored-by: Dharini Jeeva <dharini@hashicorp.com>
2022-11-10 20:52:12 -08:00
dependabot[bot] d7b7b014d4 chore(deps): bump socket.io-parser from 4.0.4 to 4.0.5 (#1446)
Bumps [socket.io-parser](https://github.com/socketio/socket.io-parser) from 4.0.4 to 4.0.5.
- [Release notes](https://github.com/socketio/socket.io-parser/releases)
- [Changelog](https://github.com/socketio/socket.io-parser/blob/main/CHANGELOG.md)
- [Commits](https://github.com/socketio/socket.io-parser/compare/4.0.4...4.0.5)

---
updated-dependencies:
- dependency-name: socket.io-parser
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-11-10 16:53:33 -08:00
Carlos Alcaide Corvo 3810c281d3 chore: 🤖 Forgot addon upgrade to Ember 3.x (#1430)
Forgot addon upgrade to Ember 3.x
2022-11-10 11:32:08 -08:00
Devon Anderson fce82c6d9f chore: 🤖 Added json-credential feature flag (#1440)
Added JSON credential flag to help manage access to ui changess for
credential-store/credentials view and actions.

✅ Closes: ICU-6798
2022-11-09 16:36:04 -05:00
Cameron Perera 5e7e11fc6b feat: 🎸 Add links to Host Sets assigned to targets (#1434)
* feat: 🎸 Add links to Host Sets assigned to targets

The target host sources view can now link to the host sets associated
with that target

✅ Closes: ICU-6525

* test: 💍 Improve test assert for host sources links
2022-11-09 14:22:28 -06:00
lisbet-alvarez dfe3aee450 refactor: 💡 one acceptance test in scopes-test.js (#1406)
✅ Closes: ICU-6624
2022-11-09 11:02:57 -08:00
lisbet-alvarez 0b8f1aea17 refactor: 💡 targets read acceptance tests (#1405)
✅ Closes: ICU-6547
2022-11-09 10:13:17 -08:00
lisbet-alvarez 247be9b467 refactor: 💡 acceptance tests for sessions for admin ui (#1404)
✅ Closes: ICU-6623
2022-11-09 09:24:36 -08:00
Zhihe Li a9f6821a3a fix: 🐛 Fix styling for header icon CSS (#1431) 2022-11-08 15:25:53 -05:00
dependabot[bot]andRandall Morey 6b27d67122 chore(deps): bump loader-utils from 1.4.0 to 1.4.1 (#1428)
Bumps [loader-utils](https://github.com/webpack/loader-utils) from 1.4.0 to 1.4.1.
- [Release notes](https://github.com/webpack/loader-utils/releases)
- [Changelog](https://github.com/webpack/loader-utils/blob/v1.4.1/CHANGELOG.md)
- [Commits](https://github.com/webpack/loader-utils/compare/v1.4.0...v1.4.1)

---
updated-dependencies:
- dependency-name: loader-utils
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Randall Morey <randall@randallmorey.com>
2022-11-08 10:48:36 -08:00
Randall Morey 561ed0b2e1 Refactor route action helper - icu-6773 (#1427)
* refactor: 💡 explicitly inject the store service - icu-6770

✅ Closes: icu-6770

* refactor: 💡 upgrade to ember-intl 6.0.1

includes locale initialization and smoke tests

* refactor: 💡 migrate admin and desktop to ember-intl 6.x

✅ Closes: icu-6771

* chore: 🤖 exclude cldr-core@38.1.0 from license checking

this license was manually checked

* fix: 🐛 fix text naming and linting

* refactor: 💡 pull route-action local and update for ember 4

✅ Closes: icu-6773
2022-11-08 09:14:04 -08:00
Randall Morey 0c819d6d12 Chore upgrade ember intl (#1425)
* refactor: 💡 explicitly inject the store service - icu-6770

✅ Closes: icu-6770

* refactor: 💡 upgrade to ember-intl 6.0.1

includes locale initialization and smoke tests

* refactor: 💡 migrate admin and desktop to ember-intl 6.x

✅ Closes: icu-6771

* chore: 🤖 exclude cldr-core@38.1.0 from license checking

this license was manually checked

* fix: 🐛 fix text naming and linting

* chore: 🤖 update to ember-intl beta
2022-11-07 16:18:02 -08:00
Randall MoreyandDharini Jeeva c107fa872c refactor: 💡 explicitly inject the store service - icu-6770 (#1424)
✅ Closes: icu-6770

Co-authored-by: Dharini Jeeva <dharini@hashicorp.com>
2022-11-07 15:17:23 -08:00
Randall MoreyandDharini Jeeva e538200720 chore: 🤖 improve credentials/new titling - icu-6724 (#1423)
✅ Closes: icu-6724

Co-authored-by: Dharini Jeeva <dharini@hashicorp.com>
2022-11-07 14:59:15 -08:00
Randall Morey e13aaaa4d6 chore: 🤖 improve credential-libraries/new titling - icu-6724 (#1422)
✅ Closes: icu-6724
2022-11-07 14:37:10 -08:00
Randall Morey b4dbefb79b chore: 🤖 improve credential-stores/new titling - icu-6723 (#1421)
✅ Closes: icu-6723
2022-11-07 13:27:43 -08:00
Randall Morey a7694bdd7f chore: 🤖 improve hosts/new titling - icu-6722 (#1419)
✅ Closes: icu-6722
2022-11-07 13:05:40 -08:00
Randall Morey a24f5b4107 chore: 🤖 improve host-sets/new titling - icu-6721 (#1418)
✅ Closes: icu-6721
2022-11-07 12:46:32 -08:00
Zhihe Li 2ec2c2934c Icu 6705 add stylelint to rose (#1410)
* chore: 🤖 Add stylelint packages

* style: 💄 Initial stylelint fixes

* style: 💄 Use suggested module

* style: 💄 Fix comment whitespace and remove unneeded ones

* style: 💄 Fix few more styles

* style: 💄 Ignore a few styles and fix the rest

* style: 💄 Fix scss/dollar-variable-pattern rule

* chore: 🤖 Remove stylelint order package

* style: 💄 Fix custom-property-pattern rule

* chore: 🤖 Add stylelintrc file to eslintrc

* refactor: 💡 Remove duplicated css selector
2022-11-07 15:23:06 -05:00
Carlos Alcaide Corvo 4481ec7f2a fix: 🐛 Fix missing yarn lock (#1426)
Fix missing yarn lock update
2022-11-07 11:53:02 -08:00
Randall Morey 2360c4124c chore: 🤖 improve host-catalogs/new titling - icu-6720 (#1417)
✅ Closes: icu-6720
2022-11-06 18:12:38 -08:00
Randall Morey ee3c550809 chore: 🤖 improve targets/new titling - icu-6719 (#1416)
✅ Closes: icu-6719
2022-11-06 17:44:06 -08:00
Randall Morey 063c047792 chore: 🤖 improve accounts/new titling - icu-6718 (#1415)
✅ Closes: icu-6718
2022-11-06 17:23:26 -08:00
Randall Morey 3c1a46c9ef chore: 🤖 improve auth-methods/new titling - icu-6717 (#1413)
✅ Closes: icu-6717
2022-11-04 20:08:25 -07:00
Randall Morey 579ebbe9fe chore: 🤖 improve roles/new title - icu-6716 (#1412)
✅ Closes: icu-6716
2022-11-04 19:27:11 -07:00
Randall Morey 5947c6e08a chore: improve titling for new groups - icu-6715 (#1411) 2022-11-04 19:09:07 -07:00
Carlos Alcaide Corvo 40346f2f09 Chore update ember to latest 3.x (#1409)
Update ember to latest 3.x patch
2022-11-04 14:15:31 -07:00
Randall Morey 5e3f693113 chore: 🤖 improve users/new title - icu-6713 (#1408)
✅ Closes: icu-6713
2022-11-03 18:52:43 -07:00
Randall Morey d32a854a94 chore: 🤖 improve scopes/new titling - icu-6714 (#1407)
* chore: 🤖 improve scopes/new titling - icu-6714

✅ Closes: icu-6714

* chore: 🤖 improve new scope link text
2022-11-03 18:37:42 -07:00
Zhihe Li e8af948dc1 feat: 🎸 Auto-populate hcp cluster id (#1389)
✅ Closes: ICU-6200
2022-11-02 14:30:10 -04:00
lisbet-alvarez a91cbaf231 refactor: 💡 host set read acceptance tests (#1402)
* refactor: 💡 host set read acceptance tests

✅ Closes: ICU-6546
2022-11-02 11:11:02 -07:00
lisbet-alvarezandZhihe Li c18fb48637 refactor: 💡 hosts read acceptance tests (#1401)
* refactor: 💡 hosts read acceptance tests

✅ Closes: ICU-6545

Co-authored-by: Zhihe Li <zhihe.li@hashicorp.com>
2022-11-02 09:49:21 -07:00
4b231f64f3 refactor: 💡 host-catalogs read acceptance test (#1400)
* refactor: 💡 host-catalogs read acceptance test

✅ Closes: ICU-6544

Co-authored-by: Zhihe Li <zhihe.li@hashicorp.com>
Co-authored-by: Cameron Perera <cameron.perera@hashicorp.com>
2022-11-02 09:27:01 -07:00
Zhihe Li 1111cbd6a2 chore: 🤖 Update electron to latest version (#1399) 2022-11-02 11:51:26 -04:00
Devon AndersonandRandall Morey fa9f5476b5 feat: 🎸 Re-enabling footer for Boundary Admin UI (#1390)
* feat: 🎸 Re-enabling footer for Boundary `admin-ui`

Re-enable global footer and fix styling

✅ Closes: ICU-6454

* refactor: 💡 added media-query code

Added media-query code for footer to expand on smaller screens.

* refactor: 💡 refactor footer to exist in sidebar-layout

Improved overall layout of content with footer by moving it to the
sidebar-layout

* refactor: 💡 continuous refactor of admin ui footer

Refactored sidebar layout to include grid footer with layout,

* refactor: 💡 collapse sidebar when absent

* refactor: improve css grid column collapse approach

Co-authored-by: Randall Morey <randall@randallmorey.com>
2022-11-01 19:17:19 -04:00
Zhihe Li cc42de52a2 fix: 🐛 Fix electron appearance for desktop with mirage locally (#1394) 2022-11-01 18:50:40 -04:00
lisbet-alvarezandCameron Perera 0598be5df9 refactor: 💡 existing read credential store acceptance tests (#1396)
* refactor: 💡 existing credential store acceptance tests

✅ Closes: ICU-5517

Co-authored-by: Cameron Perera <cameron.perera@hashicorp.com>
2022-10-31 13:07:58 -07:00
Randall Morey 0625d3b8a1 Refactor scss (#1397)
* refactor: 💡 upgrade sass and ember-cli-sass

* refactor: 💡 rose becomes dev dep of core

* refactor: 💡 migrate rose styles to rose/app/styles

* chore: 🤖 disable sass linting until stylelint can be installed
2022-10-27 15:32:44 -07:00
Carlos Alcaide Corvo 7d46215aa4 refactor: 💡 Delete ember-cli-template-lint (#1393)
Delete ember-cli-template-lint
2022-10-27 12:13:32 +02:00
bfc212440d chore: 🤖 auto-dismiss auth error notifications (#1384)
* chore: 🤖 auto-dismiss auth error notifications

* chore: 🤖 apply login error auto-dismiss to desktop

* Update addons/core/addon/decorators/notify.js

Co-authored-by: Cameron Perera <cameron.perera@hashicorp.com>

* chore: 🤖 explain sticky defaulting

Co-authored-by: Cameron Perera <cameron.perera@hashicorp.com>
Co-authored-by: Carlos Alcaide Corvo <ccorvo@hashicorp.com>
2022-10-25 16:09:33 -07:00
Zhihe Li 3c05337832 Icu 6424 deprecate @storybook/addon knobs (#1386)
✅ Closes: ICU-6424
2022-10-25 11:41:20 -04:00
Carlos Alcaide Corvo 744a732f05 refactor: 💡 Deprecate renderTemplate in header-nav (#1385)
Deprecate the usage of renderTemplate in the application header-nav
2022-10-25 11:13:19 +02:00
Carlos Alcaide Corvo d5ad161dcf Refactor deprecate rendertemplate (#1382)
Refactor deprecate rendertemplate for host-catalogs
2022-10-19 13:18:31 +02:00
Carlos Alcaide Corvo f7a778b9af fix: 🐛 Forgotten session setup method in core (#1380)
Forgotten ember auth session setup method
2022-10-19 12:52:45 +02:00
Randall Morey 977469f30c Revert "feat: 🎸 remove animation when user specifies reduced motion (#1381)" (#1383)
This reverts commit 6cb587eccf.
2022-10-18 13:15:37 -07:00
lisbet-alvarez 6cb587eccf feat: 🎸 remove animation when user specifies reduced motion (#1381)
✅ Closes: ICU-4330
2022-10-17 11:32:14 -07:00
Carlos Alcaide Corvo 18325e5126 fix: 🐛 Session setup method deprecation message (#1374)
* fix: 🐛 Session setup method deprecation message
2022-10-17 14:57:30 +02:00
Dharini Jeeva 57dd1ac4d3 fix: 🐛 csp fix (#1369)
* fix: 🐛 csp fix
2022-10-14 10:45:37 -07:00
Zhihe Li 8571951548 * feat: 🎸 Add handlebars registration for syntax highlighting (#1378)
* feat: 🎸 Add handlebars registration for syntax highlighting

* style: 💄 Use handlebars format

* style: 💄 Reformat mdx files

* style: 💄 Fix broken formatting from merge
2022-10-14 11:25:27 -04:00
Zhihe Li 4fd9e41cc6 fix: 🐛 Disable add worker tag if there's no key (#1379) 2022-10-14 10:52:21 -04:00
Carlos Alcaide Corvo e02177f5b6 Chore rose storybook deprecations (#1371)
* Deprecate correct blobs in main.js, postcss usage, hierarchy separators in styleguide and scoped blocks import
2022-10-14 16:18:47 +02:00
Carlos Alcaide Corvo be1b16361d chore: 🤖 Upgrade ember-autofocus-modifier (#1377)
Upgrade ember-autofocus-modifier
2022-10-14 12:26:35 +02:00
Carlos Alcaide Corvo c9dd39ff3e Chore upgrate ember qunit (#1376)
* Upgrade ember-qunit and ember-exam
2022-10-14 12:07:26 +02:00
Dharini Jeeva 0ee997716f Icu 5602 clean up form actions (#1358)
* chore: 🤖 remove unused disabled attr
2022-10-13 12:41:15 -07:00
Carlos Alcaide Corvo 15e20c008f refactor: 💡 Clean old mirage code (#1373)
Clean from addon old mirage code that it is not used
2022-10-13 09:31:22 +02:00
Carlos Alcaide Corvo 5386aaad7f Chore update ember modifier (#1370)
* chore: 🤖 Update ember-modifier
2022-10-13 09:02:06 +02:00
Zhihe Li 1f1b064ee9 fix: 🐛 Fix mac intel cli download (#1375) 2022-10-12 18:52:36 -04:00
Zhihe Li 4dda7ee3ba refactor: 💡 Update how we use ENABLE_MIRAGE to be consistent (#1362)
✅ Closes: ICU-6038
2022-10-12 11:44:10 -04:00
hashicorp-copywrite[bot]andCalebAlbers afe1e3ba3e Add or update MPL 2.0 license (#1372)
Co-authored-by: CalebAlbers <CalebAlbers@users.noreply.github.com>
2022-10-12 10:39:10 +02:00
Dharini Jeeva 32c9becea7 chore: 🤖 clean form errors (#1363) 2022-10-07 09:31:51 -07:00
mcollao-hc 7661a77824 [ICU-6448] Update CSP to add frame-ancestors: self (#1367)
* update csp

* add csp for ui
2022-10-06 14:23:14 -05:00
Zhihe Li b55c50cf64 Chore/update linter (#1355)
* chore: 🤖 Update editor config settings

* chore: 🤖 Add back ember-template-lint-plugin-prettier

* style: 💄 Format admin

* style: 💄 Format desktop

* style: 💄 Format rose

* style: 💄 Format core

* style: 💄 Format api
2022-10-06 11:41:12 -04:00
Cameron PereraandDharini Jeeva ebb172c46a chore: 🤖 update mout resolution to 1.2.4 for security issue (#1341)
Co-authored-by: Dharini Jeeva <dharini@hashicorp.com>
2022-10-06 10:08:34 -05:00
Carlos Alcaide Corvo 67015346c6 Chore update ember cli dependency checker addon (#1365)
* Update ember-cli-dependency-checker.
2022-10-06 09:28:09 +02:00
Carlos Alcaide Corvo 4d8d42e80e docs: ✏️ Add debug desktop client documentation (#1359)
Add how to debug desktop client documentation.
2022-10-06 09:11:04 +02:00
Zhihe Li f46168f8de chore: 🤖 Allow retrieval of arm64 cli (#1356) 2022-10-05 15:07:04 -04:00
Cameron Perera b6b93c9cd8 style: 💄 Fix 2 translation typos (#1357) 2022-10-05 10:23:18 +02:00
Carlos Alcaide Corvo 4d6a878325 fix: 🐛 Fix SCSS lint issues (#1364)
Fix SCSS lint issues
2022-10-05 08:18:26 +02:00
1033 changed files with 17950 additions and 11591 deletions

No files matched your search

@@ -0,0 +1,25 @@
name: Trigger OSS to Enterprise Merge
on:
pull_request_target:
types:
- closed
branches:
- main
jobs:
trigger-oss-merge:
# Run this only on merge events in OSS repo
if: ${{ github.event.pull_request.merged && github.repository == 'hashicorp/boundary-ui' }}
runs-on: ubuntu-latest
steps:
- name: Trigger Merge
env:
GIT_REF: ${{ github.ref_name }}
GIT_SHA: ${{ github.sha }}
GH_PAT: ${{ secrets.ELEVATED_GITHUB_TOKEN }}
GIT_ACTOR: ${{ github.actor }}
run: |
curl -H "Authorization: token $GH_PAT" \
-H 'Accept: application/json' \
-d "{\"event_type\": \"oss-merge\", \"client_payload\": {\"git-ref\": \"${GIT_REF}\", \"git-sha\": \"${GIT_SHA}\", \"git-actor\": \"${GIT_ACTOR}\" }}" \
"https://api.github.com/repos/hashicorp/boundary-ui-enterprise/dispatches"
+9 -7
View File
@@ -1,6 +1,5 @@
name: "Trigger Test Boundary UI release"
on:
workflow_dispatch:
inputs:
@@ -9,15 +8,18 @@ on:
required: true
jobs:
trigger-circleci-release:
trigger-gha-release:
runs-on: ubuntu-latest
steps:
- name: Trigger Release job
- name: Release description
if: github.event_name == 'workflow_dispatch'
run: |
echo "Triggering Test release using BRANCH and TEST_TAG ${{ github.event.inputs.branch }}"
- name: Trigger Release workflow in boundary-ui-releases
run: |
export GITHUB_TOKEN="${{ secrets.ELEVATED_GITHUB_TOKEN }}"
gh workflow run release.yml \
--repo hashicorp/boundary-ui-releases \
--ref main \
-f TAG="${{ github.event.inputs.branch }}"
curl -u ${{ secrets.CIRCLE_TOKEN }}: -X POST --header "Content-Type: application/json" \
-d '{ "branch": "main", "parameters": {"TAG": "'${{ github.event.inputs.branch }}'" }}' \
https://circleci.com/api/v2/project/github/hashicorp/boundary-ui-releases/pipeline
+9 -6
View File
@@ -6,14 +6,17 @@ on:
- '*'
jobs:
trigger-circleci-release:
trigger-gha-release:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Trigger Release job
- name: Release description
run: |
echo "Triggering release with a TAG ${GITHUB_REF#refs/tags/}"
curl -u ${{ secrets.CIRCLE_TOKEN }}: -X POST --header "Content-Type: application/json" \
-d '{ "branch": "main", "parameters": {"TAG": "'${GITHUB_REF#refs/tags/}'" }}' \
https://circleci.com/api/v2/project/github/hashicorp/boundary-ui-releases/pipeline
- name: Trigger Release workflow in boundary-ui-releases
run: |
export GITHUB_TOKEN="${{ secrets.ELEVATED_GITHUB_TOKEN }}"
gh workflow run release.yml \
--repo hashicorp/boundary-ui-releases \
--ref main \
-f TAG="${GITHUB_REF#refs/tags/}"
-1
View File
@@ -3,4 +3,3 @@
yarn compliance:licenses
npx lint-staged
yarn test
+2
View File
@@ -1,3 +1,5 @@
Copyright (c) 2020 HashiCorp, Inc.
Mozilla Public License, version 2.0
1. Definitions
+3
View File
@@ -14,3 +14,6 @@ indent_size = 2
[*.{diff,md}]
trim_trailing_whitespace = false
[*.hbs]
insert_final_newline = false
+7 -1
View File
@@ -5,5 +5,11 @@
Setting `disableAnalytics` to true will prevent any data from being sent.
*/
"disableAnalytics": false
"disableAnalytics": false,
/**
Setting `isTypeScriptProject` to true will force the blueprint generators to generate TypeScript
rather than JavaScript by default, when a TypeScript version of a given blueprint is available.
*/
"isTypeScriptProject": false
}
+8
View File
@@ -13,5 +13,13 @@
# misc
/coverage/
!.*
.*/
.eslintcache
# ember-try
/.node_modules.ember-try/
/bower.json.ember-try
/npm-shrinkwrap.json.ember-try
/package.json.ember-try
/package-lock.json.ember-try
/yarn.lock.ember-try
+9 -15
View File
@@ -29,21 +29,15 @@ module.exports = {
// node files
{
files: [
'.eslintrc.js',
'.prettierrc.js',
'.template-lintrc.js',
'ember-cli-build.js',
'index.js',
'testem.js',
'blueprints/*/index.js',
'config/**/*.js',
'tests/dummy/config/**/*.js',
],
excludedFiles: [
'addon/**',
'addon-test-support/**',
'app/**',
'tests/dummy/app/**',
'./.eslintrc.js',
'./.prettierrc.js',
'./.template-lintrc.js',
'./ember-cli-build.js',
'./index.js',
'./testem.js',
'./blueprints/*/index.js',
'./config/**/*.js',
'./tests/dummy/config/**/*.js',
],
parserOptions: {
sourceType: 'script',
+13
View File
@@ -14,14 +14,27 @@
/.eslintignore
/.eslintrc.js
/.git/
/.github/
/.gitignore
/.prettierignore
/.prettierrc.js
/.template-lintrc.js
/.travis.yml
/.watchmanconfig
/bower.json
/config/ember-try.js
/CONTRIBUTING.md
/ember-cli-build.js
/testem.js
/tests/
/yarn-error.log
/yarn.lock
.gitkeep
# ember-try
/.node_modules.ember-try/
/bower.json.ember-try
/npm-shrinkwrap.json.ember-try
/package.json.ember-try
/package-lock.json.ember-try
/yarn.lock.ember-try
+9
View File
@@ -14,3 +14,12 @@
/coverage/
!.*
.eslintcache
.lint-todo/
# ember-try
/.node_modules.ember-try/
/bower.json.ember-try
/npm-shrinkwrap.json.ember-try
/package.json.ember-try
/package-lock.json.ember-try
/yarn.lock.ember-try
-4
View File
@@ -1,4 +0,0 @@
{
"singleQuote": true,
"printWidth": 80
}
-2
View File
@@ -1,5 +1,3 @@
'use strict';
module.exports = {
singleQuote: true,
};
@@ -2,11 +2,11 @@ import ModelAbility from './model';
/**
* Provides abilities for credential.
*/
export default class CredentialLibaryAbility extends ModelAbility {
export default class CredentialLibraryAbility extends ModelAbility {
// =permissions
/**
* Only "known" credential libary types may be read.
* Only "known" credential library types may be read.
* @type {boolean}
*/
get canRead() {
+2 -2
View File
@@ -1,4 +1,4 @@
import ModelAbility from "./model";
import ModelAbility from './model';
/**
* Provides abilities for credential.
*/
@@ -12,4 +12,4 @@ export default class CredentialAbility extends ModelAbility {
get canRead() {
return !this.model.isUnknown && this.hasAuthorizedAction('read');
}
}
}
+8 -1
View File
@@ -3,7 +3,7 @@ import ModelAbility from './model';
/**
* Provides abilities for host sets.
*/
export default class UserAbility extends ModelAbility {
export default class HostSetAbility extends ModelAbility {
// =permissions
/**
@@ -19,4 +19,11 @@ export default class UserAbility extends ModelAbility {
get canRemoveHosts() {
return this.hasAuthorizedAction('remove-hosts');
}
/**
* @type {boolean}
*/
get canRead() {
return !this.model.isUnknown && this.hasAuthorizedAction('read');
}
}
@@ -0,0 +1,8 @@
import ModelAbility from './model';
/**
* Provides abilities for managed groups.
*/
export default class ManagedGroupAbility extends ModelAbility {
// no op
}
+27
View File
@@ -1,9 +1,18 @@
import ModelAbility from './model';
import { inject as service } from '@ember/service';
class InvalidRolePrincipalTypeError extends Error {
name = 'InvalidRolePrincipalTypeError';
}
/**
* Provides abilities for roles.
*/
export default class RoleAbility extends ModelAbility {
// =services
@service can;
// =permissions
/**
@@ -26,4 +35,22 @@ export default class RoleAbility extends ModelAbility {
get canRemovePrincipals() {
return this.hasAuthorizedAction('remove-principals');
}
/**
* Returns the ability check for a principal model instance.
* Valid role principal models are: User, Group, and ManagedGroup.
* Throws an error if the principal type is invalid.
* @type {boolean}
* @throws {InvalidRolePrincipalTypeError}
*/
get canReadPrincipal() {
const type = this.model.constructor.modelName;
const typeIsValid =
type === 'user' || type === 'group' || type === 'managed-group';
if (!typeIsValid)
throw new InvalidRolePrincipalTypeError(
`Expected a role principal of type 'user', 'group', or 'managed-group'. Got '${type}'.`
);
return this.can.can(`read ${type}`, this.model);
}
}
+11 -30
View File
@@ -263,36 +263,17 @@ export default class ApplicationAdapter extends RESTAdapter.extend(
source: { pointer: '/data' },
};
// Normalize field-specific errors, if any.
const errors = fieldErrors.flatMap((error) => {
const newValue = [
{
detail: error.description,
// Ember Data cannot handle errors on nested attributes, so these are
// flattened (e.g. `attributes.foobar` becomes `attributes_foobar`).
// To capture these errors, add read-only fields on the model
// corresponding to the underscored field name.
source: {
pointer: `/data/attributes/${error.name.replace('.', '_')}`,
},
},
];
if (error.name.includes('attributes.')) {
newValue.push({
detail: error.description,
// Going forward, nested attributes will be hoisted. Thus "attributes."
// must be stripped from the error name key. Until all models are
// transitioned away from model fragments, however, both this and the
// prior error key mappings are necessary.
source: {
pointer: `/data/attributes/${error.name.replace(
'attributes.',
''
)}`,
},
});
}
return newValue;
});
const errors = fieldErrors.map((error) => ({
detail: error.description,
// Going forward, nested attributes will be hoisted. Thus "attributes."
// must be stripped from the error name key. Until all models are
// transitioned away from model fragments, however, both this and the
// prior error key mappings are necessary.
source: {
pointer: `/data/attributes/${error.name.replace('attributes.', '')}`,
},
}));
// Return a list of JSON API errors rooted under the `errors` key.
return {
errors: [baseError, ...errors],
@@ -49,4 +49,56 @@ export default class GeneratedAuthMethodModel extends BaseModel {
description: 'Current version number of this resource.',
})
version;
@attr('string', { readOnly: true, isNestedAttribute: true }) state;
@attr('string', { isNestedAttribute: true }) issuer;
@attr('string', { isNestedAttribute: true }) client_id;
@attr('string', { isNestedAttribute: true }) client_secret;
@attr('string', { readOnly: true, isNestedAttribute: true })
client_secret_hmac;
@attr('number', { isNestedAttribute: true }) max_age;
@attr('string', { isNestedAttribute: true }) api_url_prefix;
@attr('string', { readOnly: true, isNestedAttribute: true }) callback_url;
@attr('boolean', { isNestedAttribute: true })
disable_discovered_config_validation;
@attr('boolean', { isNestedAttribute: true }) dry_run;
@attr('string-array', {
emptyArrayIfMissing: true,
isNestedAttribute: true,
})
claims_scopes;
@attr('string-array', {
emptyArrayIfMissing: true,
isNestedAttribute: true,
})
signing_algorithms;
@attr('string-array', {
emptyArrayIfMissing: true,
isNestedAttribute: true,
})
allowed_audiences;
@attr('string-array', {
emptyArrayIfMissing: true,
isNestedAttribute: true,
})
idp_ca_certs;
@attr('account-claim-map-array', {
emptyArrayIfMissing: true,
isNestedAttribute: true,
})
account_claim_maps;
}
@@ -67,4 +67,50 @@ export default class GeneratedCredentialLibraryModel extends BaseModel {
description: 'The path in Vault to request credentials from.',
})
path;
@attr('string', {
isNestedAttribute: true,
description: 'The username to use when making an SSH connection.',
})
username;
@attr('string', {
isNestedAttribute: true,
description: 'The desired key type to use when generating a private key.',
})
key_type;
@attr('number', {
isNestedAttribute: true,
description:
'Specifies the number of bits used when generating the private key. Not used if key type is ed25519',
})
key_bits;
@attr('string', {
isNestedAttribute: true,
description: 'Specifies the requested time to live for the certificate.',
})
ttl;
@attr('string', {
isNestedAttribute: true,
description:
'Specifies the key id that the created certificate should have.',
})
key_id;
@attr('object-as-array', {
isNestedAttribute: true,
description:
'Specifies a map of the critical options that the certificate should be signed for.',
})
critical_options;
@attr('object-as-array', {
isNestedAttribute: true,
description:
'Specifies a map of the extensions that the certificate should be signed for.',
})
extensions;
}
@@ -82,6 +82,7 @@ export default class GeneratedCredentialStoreModel extends BaseModel {
@attr('string', {
for: 'vault',
isNestedAttribute: true,
isSecret: true,
description: 'A token used for accessing Vault.',
})
token;
@@ -58,6 +58,7 @@ export default class GeneratedCredentialModel extends BaseModel {
@attr('string', {
for: 'username_password',
isNestedAttribute: true,
isSecret: true,
description: 'The password for credential.',
})
password;
@@ -66,6 +67,7 @@ export default class GeneratedCredentialModel extends BaseModel {
@attr('string', {
for: 'ssh_private_key',
isNestedAttribute: true,
isSecret: true,
description: 'The private key for credential.',
})
private_key;
@@ -73,7 +75,16 @@ export default class GeneratedCredentialModel extends BaseModel {
@attr('string', {
for: 'ssh_private_key',
isNestedAttribute: true,
isSecret: true,
description: 'The private key passphrase for credential.',
})
private_key_passphrase;
@attr('string', {
for: 'json',
isNestedAttribute: true,
isSecret: true,
description: 'The secret associated with credential.',
})
json_object;
}
+24 -2
View File
@@ -63,10 +63,32 @@ export default class GeneratedHostSetModel extends BaseModel {
})
sync_interval_seconds;
// Azure specific
/**
* Host IDs are read-only under normal circumstances. But these can
* be persisted via a dedicated call to `addHosts()`.
*/
@attr({
readOnly: true,
emptyArrayIfMissing: true,
})
host_ids;
@attr('string-array', {
emptyArrayIfMissing: true,
})
preferred_endpoints;
// AWS specific
@attr('string-array', {
isNestedAttribute: true,
emptyArrayIfMissing: true,
})
filters;
// Azure specific, comes in from API as "filter". This is to avoid collisions with filter
@attr('string', {
description: '',
isNestedAttribute: true,
})
filter;
filter_string;
}
@@ -50,7 +50,7 @@ export default class GeneratedManagedGroupModel extends BaseModel {
@attr('string', {
isNestedAttribute: true,
description:
'The boolean expression filter to use to determine membership.',
'The boolean expression filter to use to determine membership. Comes in from API as "filter".',
})
filter;
filter_string;
}
@@ -39,6 +39,18 @@ export default class GeneratedTargetModel extends BaseModel {
})
worker_filter;
@attr('string', {
description:
'Optional boolean expressions to filter the egress workers that are allowed to satisfy this request.',
})
egress_worker_filter;
@attr('string', {
description:
'Optional boolean expressions to filter the ingress workers that are allowed to satisfy this request.',
})
ingress_worker_filter;
@attr('date', {
description: 'The time this resource was created\nOutput only.',
readOnly: true,
@@ -60,4 +72,10 @@ export default class GeneratedTargetModel extends BaseModel {
description: 'Current version number of this resource.',
})
version;
@attr('string', {
description:
'An IP address or DNS name for the session to connect to. Cannot be used in conjunction with host sources.',
})
address;
}
@@ -1,15 +0,0 @@
// app/initializers/fragment-serializer.js
import FragmentAuthMethodAttributesAccountClaimMapSerializer from '../serializers/fragment-auth-method-attributes-account-claim-map';
export function initialize(application) {
application.register(
'serializer:fragment-auth-method-attributes-account-claim-map',
FragmentAuthMethodAttributesAccountClaimMapSerializer
);
}
// Fragment serializers must be manually registered
export default {
name: 'fragment-auth-method-attributes-account-claim-map',
initialize: initialize,
};
@@ -1,12 +0,0 @@
// app/initializers/fragment-serializer.js
import FragmentStringSerializer from '../serializers/fragment-string';
export function initialize(application) {
application.register('serializer:fragment-string', FragmentStringSerializer);
}
// Fragment serializers must be manually registered
export default {
name: 'fragment-string',
initialize: initialize,
};
+3 -31
View File
@@ -1,6 +1,4 @@
import GeneratedAuthMethodModel from '../generated/models/auth-method';
import { attr } from '@ember-data/model';
import { fragment } from 'ember-data-model-fragments/attributes';
import { equal } from '@ember/object/computed';
/**
@@ -28,34 +26,8 @@ export const options = {
};
export default class AuthMethodModel extends GeneratedAuthMethodModel {
// =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_state;
@attr('string', { readOnly: true }) attributes_issuer;
@attr('string', { readOnly: true }) attributes_client_id;
@attr('string', { readOnly: true }) attributes_client_secret;
@attr('string', { readOnly: true }) attributes_max_age;
@attr('string', { readOnly: true }) attributes_api_url_prefix;
@attr('string', { readOnly: true })
attributes_disable_discovered_config_validation;
@attr('string', { readOnly: true }) attributes_dry_run;
@attr('string', { readOnly: true }) attributes_account_claim_maps;
@attr('string', { readOnly: true }) attributes_claims_scopes;
@attr('string', { readOnly: true }) attributes_signing_algorithms;
@attr('string', { readOnly: true }) attributes_allowed_audiences;
@attr('string', { readOnly: true }) attributes_idp_ca_certs;
// =attributes
/**
* Attributes of this resource, if any, represented as a JSON fragment.
* @type {FragmentAuthMethodAttributesModel}
*/
@fragment('fragment-auth-method-attributes', { defaultValue: {} }) attributes;
/**
* @type {boolean}
*/
@@ -81,21 +53,21 @@ export default class AuthMethodModel extends GeneratedAuthMethodModel {
* @type {boolean}
*/
get isInactive() {
return this.attributes.state === 'inactive';
return this.state === 'inactive';
}
/**
* @type {boolean}
*/
get isPrivate() {
return this.attributes.state === 'active-private';
return this.state === 'active-private';
}
/**
* @type {boolean}
*/
get isPublic() {
return this.attributes.state === 'active-public';
return this.state === 'active-public';
}
// =methods
+9 -2
View File
@@ -1,6 +1,7 @@
import Model from '@ember-data/model';
import { attr } from '@ember-data/model';
import { computed } from '@ember/object';
import { inject as service } from '@ember/service';
/**
* Base model class provides common functionality for all models.
@@ -25,6 +26,10 @@ import { computed } from '@ember/object';
* 2) Or as an ID: `record.scopeID`.
*/
export default class BaseModel extends Model {
// =services
@service store;
// =relationships
/**
@@ -49,6 +54,10 @@ export default class BaseModel extends Model {
const id = this.scopeID;
return this.store.peekRecord('scope', id);
}
// Ember seems to have a bug with its internals and can't correctly set
// the `scopeModel` when passed in as part of the `inputProperties`
// of a `createRecord` call
set scopeModel(model) {
if (model) {
const json = model.serialize();
@@ -87,7 +96,6 @@ export default class BaseModel extends Model {
/**
* @type {boolean}
*/
@computed('hasDirtyAttributes', 'isSaving')
get canSave() {
return this.hasDirtyAttributes && !this.isSaving;
}
@@ -95,7 +103,6 @@ export default class BaseModel extends Model {
/**
* @type {boolean}
*/
@computed('canSave')
get cannotSave() {
return !this.canSave;
}
+30 -3
View File
@@ -5,12 +5,20 @@ import GeneratedCredentialLibraryModel from '../generated/models/credential-libr
*/
export const options = {
http_method: ['GET', 'POST'],
key_type: ['ed25519', 'ecdsa', 'rsa'],
};
export const TYPE_CREDENTIAL_LIBRARY_VAULT_GENERIC = 'vault-generic';
export const TYPE_CREDENTIAL_LIBRARY_VAULT_SSH_CERTIFICATE =
'vault-ssh-certificate';
/**
* Supported Credential Library types.
*/
export const types = ['vault'];
export const TYPES_CREDENTIAL_LIBRARY = Object.freeze([
TYPE_CREDENTIAL_LIBRARY_VAULT_GENERIC,
TYPE_CREDENTIAL_LIBRARY_VAULT_SSH_CERTIFICATE,
]);
export default class CredentialLibraryModel extends GeneratedCredentialLibraryModel {
// =attributes
@@ -20,7 +28,7 @@ export default class CredentialLibraryModel extends GeneratedCredentialLibraryMo
* @type {boolean}
*/
get isUnknown() {
return !types.includes(this.type);
return !TYPES_CREDENTIAL_LIBRARY.includes(this.type);
}
/**
@@ -28,6 +36,25 @@ export default class CredentialLibraryModel extends GeneratedCredentialLibraryMo
* @type {boolean}
*/
get isVault() {
return this.type === 'vault';
return (
this.type === TYPE_CREDENTIAL_LIBRARY_VAULT_GENERIC ||
this.type === TYPE_CREDENTIAL_LIBRARY_VAULT_SSH_CERTIFICATE
);
}
/**
* True if credential is a generic vault type.
* @type {boolean}
*/
get isVaultGeneric() {
return this.type === TYPE_CREDENTIAL_LIBRARY_VAULT_GENERIC;
}
/**
* True if credential is a vault ssh cert type.
* @type {boolean}
*/
get isVaultSSHCertificate() {
return this.type === TYPE_CREDENTIAL_LIBRARY_VAULT_SSH_CERTIFICATE;
}
}
@@ -1,6 +1,8 @@
import GeneratedCredentialStoreModel from '../generated/models/credential-store';
import { equal } from '@ember/object/computed';
export const types = ['static', 'vault'];
export default class CredentialStoreModel extends GeneratedCredentialStoreModel {
// =attributes
+10 -2
View File
@@ -3,14 +3,14 @@ import GeneratedCredentialModel from '../generated/models/credential';
/**
* Supported Credential types.
*/
export const types = ['username_password', 'ssh_private_key'];
export const types = ['username_password', 'ssh_private_key', 'json'];
export default class CredentialModel extends GeneratedCredentialModel {
// =attributes
/**
* All Credentials are prefixed with "cred" and are considered
* static due to their relation with Static Credential Stores.
*
*
* True if credential starts with the "cred" prefix.
* @type {boolean}
*/
@@ -18,6 +18,14 @@ export default class CredentialModel extends GeneratedCredentialModel {
return this.id.startsWith('cred');
}
/**
* True if type is `json`.
* @type {boolean}
*/
get isJSON() {
return this.type === 'json';
}
/**
* True if credential is an unknown type.
* @type {boolean}
@@ -1,9 +0,0 @@
import Fragment from 'ember-data-model-fragments/fragment';
import { attr } from '@ember-data/model';
export default class FragmentAuthMethodAttributesAccountClaimMapModel extends Fragment {
// =attributes (OIDC)
@attr('string') from;
@attr('string') to;
}
@@ -1,40 +0,0 @@
import Fragment from 'ember-data-model-fragments/fragment';
import { attr } from '@ember-data/model';
import { fragmentArray } from 'ember-data-model-fragments/attributes';
export default class FragmentAuthMethodAttributesModel extends Fragment {
// =attributes (OIDC)
@attr('string', { readOnly: true }) state;
@attr('string') issuer;
@attr('string') client_id;
@attr('string') client_secret;
@attr('string', { readOnly: true }) client_secret_hmac;
@attr('number') max_age;
@attr('string') api_url_prefix;
@attr('string', { readOnly: true }) callback_url;
@attr('boolean') disable_discovered_config_validation;
@attr('boolean') dry_run;
@fragmentArray('fragment-auth-method-attributes-account-claim-map', {
emptyArrayIfMissing: true,
})
account_claim_maps;
@fragmentArray('fragment-string', {
emptyArrayIfMissing: true,
})
claims_scopes;
@fragmentArray('fragment-string', {
emptyArrayIfMissing: true,
})
signing_algorithms;
@fragmentArray('fragment-string', {
emptyArrayIfMissing: true,
})
allowed_audiences;
@fragmentArray('fragment-string', { emptyArrayIfMissing: true }) idp_ca_certs;
}
@@ -1,14 +0,0 @@
import Fragment from 'ember-data-model-fragments/fragment';
import { attr } from '@ember-data/model';
/**
* Represents an item in an array of strings.
*/
export default class FragmentStringModel extends Fragment {
// =attributes
@attr('string', {
description: 'The value of the string.',
})
value;
}
+5
View File
@@ -2,8 +2,13 @@ import GeneratedGroupModel from '../generated/models/group';
import { attr } from '@ember-data/model';
import { computed } from '@ember/object';
import { A } from '@ember/array';
import { inject as service } from '@ember/service';
export default class GroupModel extends GeneratedGroupModel {
// =services
@service store;
// =attributes
/**
+3 -2
View File
@@ -1,6 +1,7 @@
import GeneratedHostCatalogModel from '../generated/models/host-catalog';
export const types = ['aws', 'azure'];
export const types = ['static', 'plugin'];
export const pluginTypes = ['aws', 'azure'];
export default class HostCatalogModel extends GeneratedHostCatalogModel {
// =attributes
@@ -26,7 +27,7 @@ export default class HostCatalogModel extends GeneratedHostCatalogModel {
* @type {boolean}
*/
get isUnknown() {
return this.isPlugin && !types.includes(this.plugin?.name);
return this.isPlugin && !pluginTypes.includes(this.plugin?.name);
}
/**
+2 -25
View File
@@ -1,6 +1,5 @@
import GeneratedHostSetModel from '../generated/models/host-set';
import { fragmentArray } from 'ember-data-model-fragments/attributes';
import { types } from './host-catalog';
import { pluginTypes } from './host-catalog';
export default class HostSetModel extends GeneratedHostSetModel {
// =attributes
@@ -26,7 +25,7 @@ export default class HostSetModel extends GeneratedHostSetModel {
* @type {boolean}
*/
get isUnknown() {
return this.isPlugin && !types.includes(this.plugin?.name);
return this.isPlugin && !pluginTypes.includes(this.plugin?.name);
}
/**
@@ -67,28 +66,6 @@ export default class HostSetModel extends GeneratedHostSetModel {
}
}
/**
* Host IDs are read-only under normal circumstances. But these can
* be persisted via a dedicated call to `addHosts()`.
*/
@fragmentArray('fragment-string', {
readOnly: true,
emptyArrayIfMissing: true,
})
host_ids;
@fragmentArray('fragment-string', {
emptyArrayIfMissing: true,
})
preferred_endpoints;
// AWS specific
@fragmentArray('fragment-string', {
emptyArrayIfMissing: true,
isNestedAttribute: true,
})
filters;
// =methods
/**
-2
View File
@@ -5,8 +5,6 @@ import { A } from '@ember/array';
export default class ManagedGroupModel extends GeneratedManagedGroupModel {
// =attributes
@attr('string', { readOnly: true }) attributes_filter;
/**
* Members is read-only under normal circumstances. But members can
* be persisted via calls to `addMembers()` or `removeMembers()`.
+123
View File
@@ -1,7 +1,14 @@
import GeneratedRoleModel from '../generated/models/role';
import { attr } from '@ember-data/model';
import { inject as service } from '@ember/service';
import { all, resolve } from 'rsvp';
export default class RoleModel extends GeneratedRoleModel {
// =services
@service store;
@service resourceFilterStore;
// =attributes
/**
@@ -32,6 +39,122 @@ export default class RoleModel extends GeneratedRoleModel {
: null;
}
/**
* A list of IDs for principals of type `user`.
* @type {string[]}
*/
get userIDs() {
return this.principals
.filter(({ type }) => type === 'user')
.map(({ principal_id }) => principal_id);
}
/**
* A list of IDs for principals of type `group`.
* @type {string[]}
*/
get groupIDs() {
return this.principals
.filter(({ type }) => type === 'group')
.map(({ principal_id }) => principal_id);
}
/**
* A list of IDs for principals of type `managed group`.
* @type {string[]}
*/
get managedGroupIDs() {
return this.principals
.filter(({ type }) => type === 'managed group')
.map(({ principal_id }) => principal_id);
}
/**
* A promise that resolves to an array of User instances.
* When calling this getter, be sure to await resolution
* before interacting with the results.
* @type {Promise[UserModel]}
*/
get users() {
const ids = this.userIDs;
// Role has prinicipal IDs,
// return a promise which resolves model instances for those IDs
if (ids?.length) {
return this.resourceFilterStore
.queryBy('user', { id: ids }, { scope_id: 'global', recursive: true })
.then((models) => models.map((model) => model));
}
// No principal IDs,
// return a promise resolving to an empty array
return resolve([]);
}
/**
* A promise that resolves to an array of Group instances.
* When calling this getter, be sure to await resolution
* before interacting with the results.
* @type {Promise[GroupModel]}
*/
get groups() {
const ids = this.groupIDs;
// Role has prinicipal IDs,
// return a promise which resolves model instances for those IDs
if (ids?.length) {
return this.resourceFilterStore
.queryBy('group', { id: ids }, { scope_id: 'global', recursive: true })
.then((models) => models.map((model) => model));
}
// No principal IDs,
// return a promise resolving to an empty array
return resolve([]);
}
/**
* A promise that resolves to an array of ManagedGroup instances.
* When calling this getter, be sure to await resolution
* before interacting with the results.
* @type {Promise[ManagedGroupModel]}
*/
get managedGroups() {
const ids = this.managedGroupIDs;
// Role has prinicipal IDs
// return a promise which resolves model instances for those IDs
if (ids?.length) {
// Collect all auth methods.
const authMethods = this.resourceFilterStore.queryBy(
'auth-method',
{ type: 'oidc' },
{ scope_id: 'global', recursive: true }
);
// For each auth method, query all managed groups with IDs
// that match the role's manage group principal IDs.
const managedGroups = authMethods
.then((methods) =>
all(
methods.map(({ id: auth_method_id }) =>
this.resourceFilterStore
.queryBy('managed-group', { id: ids }, { auth_method_id })
.then((models) => models.map((model) => model))
)
)
)
// The result is an array of arrays of model instances (grouped by
// auth methods), so these must be flattened.
.then((grouped) => grouped.flat());
return managedGroups;
}
// No principal IDs,
// return a promise resolving to an empty array
return resolve([]);
}
// =methods
/**
+15
View File
@@ -3,6 +3,9 @@ import { computed } from '@ember/object';
import { equal } from '@ember/object/computed';
import { tracked } from '@glimmer/tracking';
import { A } from '@ember/array';
import { inject as service } from '@ember/service';
export const statusTypes = ['active', 'pending', 'canceling', 'terminated'];
/**
*
@@ -80,6 +83,10 @@ class SessionCredential {
}
export default class SessionModel extends GeneratedSessionModel {
// =services
@service store;
// =attributes
// These transient attributes are used for values that come from the CLI
@@ -94,6 +101,14 @@ export default class SessionModel extends GeneratedSessionModel {
@equal('status', 'active') isActive;
@equal('status', 'pending') isPending;
/**
* True if status is an unknown string.
* @type {boolean}
*/
get isUnknownStatus() {
return !statusTypes.includes(this.status);
}
/**
* @type {boolean}
*/
+11 -2
View File
@@ -1,7 +1,16 @@
import GeneratedTargetModel from '../generated/models/target';
import { attr } from '@ember-data/model';
import { inject as service } from '@ember/service';
export const TYPE_TARGET_TCP = 'tcp';
export const TYPE_TARGET_SSH = 'ssh';
export const TYPES_TARGET = Object.freeze([TYPE_TARGET_TCP, TYPE_TARGET_SSH]);
export default class TargetModel extends GeneratedTargetModel {
// =services
@service store;
// =attributes
@attr('number', {
@@ -314,7 +323,7 @@ export default class TargetModel extends GeneratedTargetModel {
* @type {boolean}
*/
get isTCP() {
return this.type === 'tcp';
return this.type === TYPE_TARGET_TCP;
}
/**
@@ -322,6 +331,6 @@ export default class TargetModel extends GeneratedTargetModel {
* @type {boolean}
*/
get isSSH() {
return this.type === 'ssh';
return this.type === TYPE_TARGET_SSH;
}
}
@@ -39,6 +39,10 @@ export default class ApplicationSerializer extends RESTSerializer {
serializeAttribute(snapshot, json, key, attribute) {
const { type, options } = attribute;
let value = super.serializeAttribute(...arguments);
// Remove secret attributes that are null or empty
if (options.isSecret) {
if (type === 'string' && !json[key]) delete json[key];
}
// Convert empty strings to null.
if (type === 'string' && json[key] === '') json[key] = null;
// Do not serialize read-only attributes.
@@ -1,4 +1,5 @@
import ApplicationSerializer from './application';
import { TYPE_CREDENTIAL_LIBRARY_VAULT_GENERIC } from '../models/credential-library';
export default class CredentialLibrarySerializer extends ApplicationSerializer {
// =properties
@@ -16,6 +17,10 @@ export default class CredentialLibrarySerializer extends ApplicationSerializer {
serialize() {
const serialized = super.serialize(...arguments);
if (serialized.attributes) {
if (serialized.type !== TYPE_CREDENTIAL_LIBRARY_VAULT_GENERIC) {
delete serialized.attributes.http_method;
}
// Serialize `http_request_body` only if `http_method` is POST
if (!serialized.attributes?.http_method?.match(/post/i))
delete serialized.attributes.http_request_body;
@@ -20,8 +20,6 @@ export default class CredentialStoreSerializer extends ApplicationSerializer {
serializeVault() {
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 (
+15 -36
View File
@@ -13,44 +13,22 @@ export default class CredentialSerializer extends ApplicationSerializer {
*/
serializeScopeID = false;
serialize(snapshot) {
switch (snapshot.record.type) {
case 'username_password':
return this.serializeUsernamePassword(...arguments);
case 'ssh_private_key':
default:
return this.serializeSSHPrivateKey(...arguments);
serialize() {
const serialized = super.serialize(...arguments);
if (serialized.type === 'json') {
delete serialized.attributes.username;
if (serialized?.attributes?.json_object) {
serialized.attributes.object = JSON.parse(
serialized.attributes.json_object
);
delete serialized.attributes.json_object;
}
} else {
delete serialized.attributes.json_object;
}
}
serializeUsernamePassword() {
const serialized = super.serialize(...arguments);
// Remove non-username_password type attributes
delete serialized.attributes.private_key;
delete serialized.attributes.private_key_passphrase;
// Remove password from the payload if null
// or empty string. This allows the user to only update
// the username without providing the password again.
// Users cannot unset the password, they would have
// to delete the credential entirely.
if (!serialized?.attributes?.password)
delete serialized.attributes.password;
return serialized;
}
serializeSSHPrivateKey() {
const serialized = super.serialize(...arguments);
// Remove non-ssh_private_key type attributes
delete serialized.attributes.password;
// Remove private_key and/or private_key_passphrase from the payload
// if null or empty string. This allows the user to only update
// the username without providing the private key and passphrase again.
// Users cannot unset the private key or passphrase, they would have
// to delete the credential entirely.
if (!serialized?.attributes?.private_key_passphrase)
delete serialized.attributes.private_key_passphrase;
if (!serialized?.attributes?.private_key)
delete serialized.attributes.private_key;
return serialized;
}
@@ -61,6 +39,7 @@ export default class CredentialSerializer extends ApplicationSerializer {
normalized.data.attributes.password = '';
normalized.data.attributes.private_key = '';
normalized.data.attributes.private_key_passphrase = '';
normalized.data.attributes.json_object = '';
return normalized;
}
}
@@ -1,30 +0,0 @@
import JSONSerializer from '@ember-data/serializer/json';
export default class FragmentHostSourceSerializer extends JSONSerializer {
// =methods
/**
* Serializes an account claim to string.
* @param {Snapshot} snapshot
* @return {string}
*/
serialize(snapshot) {
const from = snapshot.attr('from');
const to = snapshot.attr('to');
return `${from}=${to}`;
}
/**
* Normalizes account claim strings into JSON API objects.
* @param {Model} typeClass
* @param {string} value
* @return {object}
*/
normalize(typeClass, value) {
const normalizedHash = {
from: value.split('=')[0],
to: value.split('=')[1],
};
return super.normalize(typeClass, normalizedHash);
}
}
@@ -1,26 +0,0 @@
import JSONSerializer from '@ember-data/serializer/json';
export default class FragmentAuthMethodAttributesSerializer 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,24 +0,0 @@
import JSONSerializer from '@ember-data/serializer/json';
export default class FragmentStringSerializer extends JSONSerializer {
// =methods
/**
* Serializes a to string.
* @param {Snapshot} snapshot
* @return {string}
*/
serialize(snapshot) {
return snapshot.attr('value');
}
/**
* Normalizes from strings.
* @param {Model} typeClass
* @param {string} value
* @return {object}
*/
normalize(typeClass, value) {
return super.normalize(typeClass, { value });
}
}
+20 -3
View File
@@ -3,7 +3,7 @@ import { copy } from 'ember-copy';
const fieldByType = {
aws: ['preferred_endpoints', 'filters', 'sync_interval_seconds'],
azure: ['preferred_endpoints', 'filter', 'sync_interval_seconds'],
azure: ['preferred_endpoints', 'filter_string', 'sync_interval_seconds'],
};
export default class HostSetSerializer extends ApplicationSerializer {
// =properties
@@ -69,6 +69,15 @@ export default class HostSetSerializer extends ApplicationSerializer {
delete json.attributes[key];
}
}
if (key === 'filter_string') {
const { filter_string } = json.attributes;
if (filter_string) {
json.attributes.filter = json.attributes.filter_string;
}
delete json.attributes.filter_string;
}
return value;
}
@@ -80,10 +89,18 @@ export default class HostSetSerializer extends ApplicationSerializer {
*/
normalize(typeClass, hash, ...rest) {
const normalizedHash = copy(hash, true);
if (typeof normalizedHash?.attributes?.filters === 'string') {
normalizedHash.attributes.filters = [normalizedHash.attributes.filters];
}
const normalized = super.normalize(typeClass, normalizedHash, ...rest);
return normalized;
// Change name from filter to filter_string
if (normalizedHash?.attributes?.filter) {
normalizedHash.attributes.filter_string =
normalizedHash.attributes.filter;
delete normalizedHash.attributes.filter;
}
return super.normalize(typeClass, normalizedHash, ...rest);
}
}
@@ -1,4 +1,5 @@
import ApplicationSerializer from './application';
import { copy } from 'ember-copy';
export default class ManagedGroupSerializer extends ApplicationSerializer {
// =properties
@@ -7,4 +8,27 @@ export default class ManagedGroupSerializer extends ApplicationSerializer {
* @type {boolean}
*/
serializeScopeID = false;
serialize() {
const serialized = super.serialize(...arguments);
if (serialized.attributes.filter_string !== undefined) {
serialized.attributes.filter = serialized.attributes.filter_string;
}
delete serialized.attributes.filter_string;
return serialized;
}
normalize(typeClass, hash, ...rest) {
const normalizedHash = copy(hash, true);
if (normalizedHash?.attributes?.filter) {
normalizedHash.attributes.filter_string =
normalizedHash.attributes.filter;
delete normalizedHash.attributes.filter;
}
return super.normalize(typeClass, normalizedHash, ...rest);
}
}
@@ -0,0 +1,16 @@
import Transform from '@ember-data/serializer/transform';
export default class AccountClaimMapArrayTransform extends Transform {
deserialize(serialized) {
const accountClaims = serialized || [];
return accountClaims.map((accountClaimString) => ({
from: accountClaimString.split('=')[0],
to: accountClaimString.split('=')[1],
}));
}
serialize(deserialized) {
const accountClaims = deserialized || [];
return accountClaims.map(({ from, to }) => `${from}=${to}`);
}
}
@@ -0,0 +1,22 @@
import Transform from '@ember-data/serializer/transform';
export default class ObjectAsArrayTransform extends Transform {
deserialize(serialized) {
const obj = serialized || {};
return Object.entries(obj).map(([key, value]) => ({ key, value }));
}
serialize(deserialized) {
const array = deserialized || [];
if (!array.length) {
return null;
}
return array.reduce((result, currentValue) => {
const { key, value } = currentValue;
result[key] = value;
return result;
}, {});
}
}
+1 -1
View File
@@ -1 +1 @@
export { default } from 'api/abilities/credential';
export { default } from 'api/abilities/credential';
@@ -0,0 +1 @@
export { default } from 'api/abilities/managed-group';
@@ -1,4 +0,0 @@
export {
default,
initialize,
} from 'api/initializers/fragment-auth-method-attributes-account-claim-map-serializer';
@@ -1 +0,0 @@
export { default, initialize } from 'api/initializers/fragment-string';
@@ -1 +0,0 @@
export { default } from 'api/models/fragment-auth-method-attributes-account-claim-map';
@@ -1 +0,0 @@
export { default } from 'api/models/fragment-auth-method-attributes';
-1
View File
@@ -1 +0,0 @@
export { default } from 'api/models/fragment-string';
@@ -1 +0,0 @@
export { default } from 'api/serializers/fragment-auth-method-attributes';
@@ -1 +0,0 @@
export { default } from 'api/serializers/fragment-string';
@@ -0,0 +1 @@
export { default } from 'api/transforms/account-claim-map-array';
@@ -0,0 +1 @@
export { default } from 'api/transforms/object-as-array';
+53
View File
@@ -0,0 +1,53 @@
'use strict';
const getChannelURL = require('ember-source-channel-url');
const { embroiderSafe, embroiderOptimized } = require('@embroider/test-setup');
module.exports = async function () {
return {
scenarios: [
{
name: 'ember-lts-3.28',
npm: {
devDependencies: {
'ember-source': '~3.28.0',
},
},
},
{
name: 'ember-lts-4.4',
npm: {
devDependencies: {
'ember-source': '~4.4.0',
},
},
},
{
name: 'ember-release',
npm: {
devDependencies: {
'ember-source': await getChannelURL('release'),
},
},
},
{
name: 'ember-beta',
npm: {
devDependencies: {
'ember-source': await getChannelURL('beta'),
},
},
},
{
name: 'ember-canary',
npm: {
devDependencies: {
'ember-source': await getChannelURL('canary'),
},
},
},
embroiderSafe(),
embroiderOptimized(),
],
};
};
+8 -2
View File
@@ -1,6 +1,7 @@
'use strict';
const EmberAddon = require('ember-cli/lib/broccoli/ember-addon');
const { maybeEmbroider } = require('@embroider/test-setup');
module.exports = function (defaults) {
let app = new EmberAddon(defaults, {
@@ -13,6 +14,11 @@ module.exports = function (defaults) {
This build file does *not* influence how the addon or the app using it
behave. You most likely want to be modifying `./index.js` or app's build file
*/
return app.toTree();
return maybeEmbroider(app, {
skipBabel: [
{
package: 'qunit',
},
],
});
};
+69 -18
View File
@@ -1,28 +1,40 @@
import config from '../config/environment';
import {
discoverEmberDataModels,
applyEmberDataSerializers,
} from 'ember-cli-mirage';
import { createServer, Response } from 'miragejs';
import environmentConfig from '../config/environment';
import { authHandler, deauthHandler } from './route-handlers/auth';
import { targetHandler } from './route-handlers/target';
import { pickRandomStatusString } from './factories/session';
import { Response } from 'miragejs';
import initializeMockIPC from './scenarios/ipc';
import makeBooleanFilter from './helpers/bexpr-filter';
const isTesting = config.environment === 'test';
const isTesting = environmentConfig.environment === 'test';
export default function () {
initializeMockIPC(this, config);
// Main function
// More info about server configuration https://www.ember-cli-mirage.com/docs/advanced/server-configuration
export default function (mirageConfig) {
let finalConfig = {
...mirageConfig,
models: { ...discoverEmberDataModels(), ...mirageConfig.models },
serializers: applyEmberDataSerializers(mirageConfig.serializers),
routes,
};
return createServer(finalConfig);
}
// Only routes are defined here
function routes() {
initializeMockIPC(this, environmentConfig);
// make this `http://localhost:8080`, for example, if your API is on a different server
// this.urlPrefix = '';
// make this `/api`, for example, if your API is namespaced
this.namespace = config.api.namespace;
this.namespace = environmentConfig.api.namespace;
// delay for each request, automatically set to 0 during testing
this.timing = 1;
// Allow any configured API host to passthrough, which is useful in
// development for testing against a locally running backend.
if (config.api.host) this.passthrough(`${config.api.host}/**`);
this.passthrough();
// Scope resources
this.get(
@@ -78,9 +90,25 @@ export default function () {
return resultSet.filter(makeBooleanFilter(filter));
}
);
this.post('/auth-methods');
this.post('/auth-methods', function ({ authMethods }) {
const attrs = this.normalizedRequestAttrs();
if (attrs.type === 'oidc') {
attrs.attributes.state = 'active-public';
}
return authMethods.create(attrs);
});
this.get('/auth-methods/:id');
this.patch('/auth-methods/:id');
this.patch(
'/auth-methods/:id',
function ({ authMethods }, { params: { id } }) {
const attrs = this.normalizedRequestAttrs();
if (attrs.type === 'oidc') {
attrs.attributes.state = 'active-public';
}
return authMethods.find(id).update(attrs);
}
);
this.del('/auth-methods/:id', ({ authMethods }, { params: { id } }) => {
const authMethod = authMethods.find(id);
const scope = authMethod.scope;
@@ -256,14 +284,17 @@ export default function () {
this.del('/roles/:id');
this.post(
'/roles/:idMethod',
function ({ roles, users, groups }, { params: { idMethod } }) {
function (
{ roles, users, groups, managedGroups },
{ params: { idMethod } }
) {
const attrs = this.normalizedRequestAttrs();
const id = idMethod.split(':')[0];
const method = idMethod.split(':')[1];
const role = roles.find(id);
let updatedAttrs = {};
// Principals is a combined list of users and groups, but in Mirage we've
// Principals is a combined list of users, groups and managed groups, but in Mirage we've
// internally modelled them as separate lists. Therefore we must check
// the type by looking up the user or group first, then determine which
// list to add the principal to.
@@ -272,25 +303,31 @@ export default function () {
version: attrs.version,
userIds: role.userIds,
groupIds: role.groupIds,
managedGroupIds: role.managedGroupIds,
};
attrs.principalIds.forEach((id) => {
const isUser = users.find(id);
const isGroup = groups.find(id);
const isManagedGroup = managedGroups.find(id);
if (isUser && !updatedAttrs.userIds.includes(id)) {
updatedAttrs.userIds.push(id);
}
if (isGroup && !updatedAttrs.groupIds.includes(id)) {
updatedAttrs.groupIds.push(id);
}
if (isManagedGroup && !updatedAttrs.managedGroupIds.includes(id)) {
updatedAttrs.managedGroupIds.push(id);
}
});
}
// If deleting principals, filter them out of both users and groups,
// If deleting principals, filter the ids out of users, groups and managed group lists,
// and in this case don't care about the type
if (method === 'remove-principals') {
updatedAttrs = {
version: attrs.version,
userIds: role.userIds,
groupIds: role.groupIds,
managedGroupIds: role.managedGroupIds,
};
updatedAttrs.userIds = updatedAttrs.userIds.filter((id) => {
return !attrs.principalIds.includes(id);
@@ -298,6 +335,11 @@ export default function () {
updatedAttrs.groupIds = updatedAttrs.groupIds.filter((id) => {
return !attrs.principalIds.includes(id);
});
updatedAttrs.managedGroupIds = updatedAttrs.managedGroupIds.filter(
(id) => {
return !attrs.principalIds.includes(id);
}
);
}
if (method === 'set-grants') {
@@ -569,8 +611,17 @@ export default function () {
// managed-groups
this.get(
'/managed-groups',
({ managedGroups }, { queryParams: { auth_method_id: authMethodId } }) => {
return managedGroups.where({ authMethodId });
(
{ managedGroups },
{ queryParams: { auth_method_id: authMethodId, filter } }
) => {
let resultSet;
if (authMethodId) {
resultSet = managedGroups.where({ authMethodId });
} else {
resultSet = managedGroups.all();
}
return resultSet.filter(makeBooleanFilter(filter));
}
);
this.post('/managed-groups');
+1 -1
View File
@@ -1,5 +1,5 @@
import factory from '../generated/factories/auth-method';
import { trait } from 'ember-cli-mirage';
import { trait } from 'miragejs';
import permissions from '../helpers/permissions';
import generateId from '../helpers/id';
@@ -2,12 +2,15 @@ import factory from '../generated/factories/credential-library';
import { faker } from '@faker-js/faker';
import permissions from '../helpers/permissions';
import generateId from '../helpers/id';
const types = ['vault'];
import {
TYPE_CREDENTIAL_LIBRARY_VAULT_GENERIC,
TYPE_CREDENTIAL_LIBRARY_VAULT_SSH_CERTIFICATE,
TYPES_CREDENTIAL_LIBRARY,
} from 'api/models/credential-library';
export default factory.extend({
id: () => generateId('cl_'),
type: (i) => types[i % types.length],
type: (i) => TYPES_CREDENTIAL_LIBRARY[i % TYPES_CREDENTIAL_LIBRARY.length],
authorized_actions: () =>
permissions.authorizedActionsFor('credential-library') || [
@@ -19,12 +22,19 @@ export default factory.extend({
attributes() {
switch (this.type) {
case 'vault':
case TYPE_CREDENTIAL_LIBRARY_VAULT_GENERIC:
return {
http_method: 'GET',
http_request_body: faker.random.word(),
path: faker.system.directoryPath(),
};
case TYPE_CREDENTIAL_LIBRARY_VAULT_SSH_CERTIFICATE:
return {
username: faker.random.word(),
key_type: faker.random.word(),
key_bits: faker.datatype.number(999),
path: faker.system.directoryPath(),
};
}
},
});
@@ -1,6 +1,6 @@
import factory from '../generated/factories/credential-store';
import { faker } from '@faker-js/faker';
import { trait } from 'ember-cli-mirage';
import { trait } from 'miragejs';
import permissions from '../helpers/permissions';
import generateId from '../helpers/id';
+1 -1
View File
@@ -1,5 +1,5 @@
import factory from '../generated/factories/group';
import { trait } from 'ember-cli-mirage';
import { trait } from 'miragejs';
import permissions from '../helpers/permissions';
import generateId from '../helpers/id';
+1 -1
View File
@@ -1,5 +1,5 @@
import factory from '../generated/factories/host-catalog';
import { trait } from 'ember-cli-mirage';
import { trait } from 'miragejs';
import permissions from '../helpers/permissions';
import { faker } from '@faker-js/faker';
import generateId from '../helpers/id';
+6 -2
View File
@@ -1,5 +1,5 @@
import factory from '../generated/factories/role';
import { trait } from 'ember-cli-mirage';
import { trait } from 'miragejs';
import permissions from '../helpers/permissions';
import generateId from '../helpers/id';
@@ -28,9 +28,13 @@ export default factory.extend({
withPrincipals: trait({
afterCreate(role, server) {
const { scope } = role;
const { id: scopeId } = scope;
const users = server.createList('user', 2, { scope });
const groups = server.createList('group', 2, { scope });
role.update({ users, groups });
const managedGroups = server.schema.managedGroups.where({
scopeId,
}).models;
role.update({ users, groups, managedGroups });
},
}),
+1 -1
View File
@@ -1,5 +1,5 @@
import factory from '../generated/factories/scope';
import { trait } from 'ember-cli-mirage';
import { trait } from 'miragejs';
import permissions from '../helpers/permissions';
import generateId from '../helpers/id';
+1 -1
View File
@@ -1,5 +1,5 @@
import factory from '../generated/factories/session';
import { trait } from 'ember-cli-mirage';
import { trait } from 'miragejs';
import { faker } from '@faker-js/faker';
import generateId from '../helpers/id';
+5 -15
View File
@@ -1,12 +1,13 @@
import factory from '../generated/factories/target';
import { trait } from 'ember-cli-mirage';
import { trait } from 'miragejs';
import { faker } from '@faker-js/faker';
import permissions from '../helpers/permissions';
import generateId from '../helpers/id';
import { TYPES_TARGET } from 'api/models/target';
const randomBoolean = (chance = 0.5) => Math.random() < chance;
const hostSetChance = 0.3;
const types = ['tcp', 'ssh'];
const types = [...TYPES_TARGET];
export default factory.extend({
authorized_actions: () =>
@@ -21,7 +22,6 @@ export default factory.extend({
'add-credential-sources',
'remove-credential-sources',
],
id: () => generateId('t_'),
/**
@@ -30,19 +30,9 @@ export default factory.extend({
session_connection_limit: () =>
faker.helpers.arrayElement([-1, faker.datatype.number()]),
worker_filter: (i) => (i % 2 === 0 ? faker.random.words() : null),
egress_worker_filter: (i) => (i % 2 !== 0 ? faker.random.words() : null),
ingress_worker_filter: (i) => (i % 2 !== 0 ? faker.random.words() : null),
type: (i) => types[i % types.length],
/**
* Generates attributes fields by type.
*/
afterCreate(target) {
if (target.type === 'tcp' || target.type === 'ssh') {
target.update({
attributes: {
default_port: faker.datatype.number(),
},
});
}
},
/**
* Randomly selects existing host sets and credential libraries to assign to target.
@@ -1,4 +1,4 @@
import { Factory } from 'ember-cli-mirage';
import { Factory } from 'miragejs';
import { faker } from '@faker-js/faker';
/**
@@ -1,4 +1,4 @@
import { Factory } from 'ember-cli-mirage';
import { Factory } from 'miragejs';
import { faker } from '@faker-js/faker';
/**
@@ -1,4 +1,4 @@
import { Factory } from 'ember-cli-mirage';
import { Factory } from 'miragejs';
import { faker } from '@faker-js/faker';
/**
@@ -1,4 +1,4 @@
import { Factory } from 'ember-cli-mirage';
import { Factory } from 'miragejs';
import { faker } from '@faker-js/faker';
/**
@@ -1,4 +1,4 @@
import { Factory } from 'ember-cli-mirage';
import { Factory } from 'miragejs';
import { faker } from '@faker-js/faker';
/**
@@ -1,4 +1,4 @@
import { Factory } from 'ember-cli-mirage';
import { Factory } from 'miragejs';
import { faker } from '@faker-js/faker';
/**
@@ -1,4 +1,4 @@
import { Factory } from 'ember-cli-mirage';
import { Factory } from 'miragejs';
import { faker } from '@faker-js/faker';
/**
@@ -1,4 +1,4 @@
import { Factory } from 'ember-cli-mirage';
import { Factory } from 'miragejs';
import { faker } from '@faker-js/faker';
/**
@@ -1,4 +1,4 @@
import { Factory } from 'ember-cli-mirage';
import { Factory } from 'miragejs';
import { faker } from '@faker-js/faker';
/**
@@ -1,4 +1,4 @@
import { Factory } from 'ember-cli-mirage';
import { Factory } from 'miragejs';
import { faker } from '@faker-js/faker';
/**
+1 -1
View File
@@ -1,4 +1,4 @@
import { Factory } from 'ember-cli-mirage';
import { Factory } from 'miragejs';
import { faker } from '@faker-js/faker';
/**
@@ -1,4 +1,4 @@
import { Factory } from 'ember-cli-mirage';
import { Factory } from 'miragejs';
import { faker } from '@faker-js/faker';
/**
@@ -1,4 +1,4 @@
import { Factory } from 'ember-cli-mirage';
import { Factory } from 'miragejs';
import { faker } from '@faker-js/faker';
/**
@@ -1,4 +1,4 @@
import { Factory } from 'ember-cli-mirage';
import { Factory } from 'miragejs';
import { faker } from '@faker-js/faker';
/**
@@ -1,4 +1,4 @@
import { Factory } from 'ember-cli-mirage';
import { Factory } from 'miragejs';
import { faker } from '@faker-js/faker';
/**
@@ -1,18 +1,16 @@
import { Factory } from 'ember-cli-mirage';
import { Factory } from 'miragejs';
import { faker } from '@faker-js/faker';
/**
* GeneratedTargetModelFactory
*/
export default Factory.extend({
type: 'tcp',
name: () => faker.random.words(),
session_max_seconds: () => faker.datatype.number(),
session_connection_limit: () => faker.datatype.number(),
worker_filter: () => faker.random.words(),
description: () => faker.random.words(),
created_time: () => faker.date.recent(),
updated_time: () => faker.date.recent(),
disabled: () => faker.datatype.boolean(),
default_port: () => faker.datatype.number(),
version: () => faker.datatype.number(),
});
@@ -1,4 +1,4 @@
import { Factory } from 'ember-cli-mirage';
import { Factory } from 'miragejs';
import { faker } from '@faker-js/faker';
/**
@@ -1,4 +1,4 @@
import { Factory } from 'ember-cli-mirage';
import { Factory } from 'miragejs';
import { faker } from '@faker-js/faker';
/**
+1 -1
View File
@@ -11,7 +11,7 @@ import { copy } from 'ember-copy';
* Within a Mirage factory, pass the actions into the mock:
*
* @example
* import { Factory } from 'ember-cli-mirage';
* import { Factory } from 'miragejs';
* import permissions from '../helpers/permissions';
*
* export default Factory.extend({
+1 -1
View File
@@ -1,4 +1,4 @@
import { belongsTo } from 'ember-cli-mirage';
import { belongsTo } from 'miragejs';
import Model from './base';
export default Model.extend({
+1 -1
View File
@@ -1,4 +1,4 @@
import { belongsTo } from 'ember-cli-mirage';
import { belongsTo } from 'miragejs';
import Model from './base';
export default Model.extend({
+1 -1
View File
@@ -1,4 +1,4 @@
import { Model } from 'ember-cli-mirage';
import { Model } from 'miragejs';
export default Model.extend({
assignDefaults(defaultAttrs, attrs) {
@@ -1,4 +1,4 @@
import { belongsTo } from 'ember-cli-mirage';
import { belongsTo } from 'miragejs';
import Model from './base';
export default Model.extend({
Loaded 100 of 1033 files, more files were not shown because too many files have changed in this diff. Show more