-
Notifications
You must be signed in to change notification settings - Fork 166
LG-9208: Confirm password #8220
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Merged
Merged
Changes from all commits
Commits
Show all changes
131 commits
Select commit
Hold shift + click to select a range
1f2b804
Add draft confirmation component
jc-gsa c0c69e0
Add translations
jc-gsa 314de59
Add various notices
jc-gsa a229005
Add stash WIP password-confirmation package
jc-gsa 4f1af11
Add spec
jc-gsa 71f861a
Add initial back-end validation
jc-gsa 43b42fa
Add tests
jc-gsa aea8907
Add refactor
jc-gsa 52099ad
Add PasswordConfirmationForm
jc-gsa 2251943
Update FormPasswordValidator
jc-gsa ef475a3
Add tests
jc-gsa 43eb800
Update session_helper
jc-gsa ccc7b11
Add WIP
jc-gsa f723aa8
Update tests, refactor
jc-gsa ab97289
Update tests
jc-gsa 5cbf908
Add refactor
jc-gsa 96f726d
Consolidate translation keys
jc-gsa 715baba
Add name changes
jc-gsa acffb17
Use ActiveSupport cache version 7.0 (#8126)
f9d5922
LG-8908: Add USPS document check to ProofingComponent when enrollment…
14b151a
add/lock in saml_2023 references, remove saml_2021 ones (#8122)
bleachbyte 3ace4b0
LG-9026: Additional cleanup (#8127)
matthinz c1d173e
Combine two versions of `confirm_document_capture_complete` before ac…
soniaconnolly 7cd847b
LG-8932: Fix check for state vs residential address; update test (#8124)
NavaTim c15a5ca
LG-9146 Fix intermittent infinity loop (#8133)
ThatSpaceGuy 7e36baa
re-add saml2021* files to AppArtifacts.setup, for now (#8129)
bleachbyte 7563cb6
Do not prompt for re-authentication on backup code refresh prompt (#8…
88f1da0
Use Rack::Session methods when calling redis-session-store (#8132)
7696d76
LG-9345 Maintain material consistency in IPP pages (#8104)
jack-ryan-nava-pbc 6ac93bd
Ignore unhandled HTTP Verb errors (#8139)
zachmargolis 7826f89
LG-9411 fraud review script fix (#8141)
theabrad 5b329d6
Remove DocumentCaptureController 404 before action (#8128)
soniaconnolly 478dff0
LG-8710: New IDV unavailable screen (#8106)
matthinz 6f4fbd6
LG-9272: Record in-person enrollment status check completion time (#8…
NavaTim 0216ebc
Stop writing data to reports.log (LG-9415) (#8143)
zachmargolis 079c4b4
Remove unused StoreSpMetadataInSession#event_attributes (#8140)
aduth 3c6407d
Update knapsack report (#8144)
zachmargolis 2aa2eeb
LG-9398 Add Fraud Review / Rejection Timestamp Columns (#8142)
eric-gade a5ee170
Friday test hacking/fix phone rate limiting test (#8116)
jmax-gsa 4bb3302
LG-9237: Collect issuing state on state id page (#8121)
eileen-nava 05e77c8
LG-9237: Send USPS the state instead of jurisdiction from state ID (#…
NavaTim 94eaf45
Add a total users across all SPs to user count reports (LG-9408) (#8135)
zachmargolis b3c9a60
LG-9238: Test that state id jurisdiction is sent to aamva (#8138)
eileen-nava 3fa583a
Fix error when verifying nil backup code (#8148)
64ab4a1
Avoid writing .irb_history on deployed boxes (#8147)
zachmargolis 41c1576
LG-9237: Clean up state id translations and legend text (#8150)
eileen-nava c169da2
Fix 500 error on phone verification warning screen (#8152)
matthinz b1f7204
LG-9065 Write an exception result when TMx has an invalid review stat…
jmhooper 2123ed5
Return an empty hash from `#flow_session` if it has not been created …
jmhooper f2ec4de
Maintain request ID in password reset (#8145)
aduth 67cbb1a
Store passed AAL as text to preserve all AAL details (#8012)
Jeremy1026 521d3a1
Link to idv_address_url from verify_info show template (#8157)
soniaconnolly aaa38db
LG-9065 Make the DDP result class and proofer responsible for buildin…
jmhooper 3374a05
LG-9426: Update mock DDP proofer results to match the real one (#8155)
matthinz 18e3bbd
LG-9141 Skip address page if same address as ID is true (#8151)
jack-ryan-nava-pbc 4e24dde
Remove unused EmailSent step (#8158)
soniaconnolly 7bd6e2e
Update documentation to remove references to design.login.gov (#8159)
aduth e77a974
Fix flaky IdV outage spec (#8168)
matthinz 30881a6
LG-9103: capture error when ArcGIS service is not returning a token (…
racingspider d4878be
Add safer parsing of dynamic SAML urls (LG-8837) (#8166)
zachmargolis cb34484
LG-9216: A/B test for tabbed Sign In view (#8112)
aduth 0cb8651
Remove request_id parameters from Sign In view links (#8137)
aduth 28435ea
Refactor implicit calculation of two-factor authentication methods (#…
e6f85fd
Remove phone_confirmed column from profiles table (#8175)
d6ff2e3
Revert "Add safer parsing of dynamic SAML urls (LG-8837) (#8166)" (#8…
70ff038
Remove implicit two_factor_authentication_method in favor of explicit…
ac1cbd5
Remove unused RedoAddressAction (#8165)
soniaconnolly 8f34e11
Update nokogiri to patch reported vulnerability (#8184)
9cee22f
Temporarily skip IdV outage spec (#8185)
matthinz 5f391d8
Lg 9399 light refactor of profile and spec (#8170)
0274dfd
LG-9362 Please call page after personal key page in GPO flow (#8156)
theabrad 58fbb63
Add files for Acuant SDK upgrade to v 11.8.1 (#8169)
jskinne3 a97da7a
Remove saml_internal_post feature flag (#8180)
aduth 4decfc6
LG-9232: Improve the usability of the password page (#8085)
jmdembe 02e1d06
Use the instant verify product instead of the parsed errors for get-t…
jmhooper bb099e1
LG-9209 Use the ExecutedStepName to group LexisNexis errors (#8177)
jmhooper 4a5bc0a
LG-9065 Include TMx response in the resoltuion result adjudicator log…
jmhooper d5f25de
LG-9065 Add the ThreatMetrix review status to the result of the resol…
jmhooper 80a16bc
Move `phone_confirmed` removal migration to correct location (#8187)
586238c
LG-8500: Minor copy update for French and Spanish language selection …
olatifflexion 73b2300
Write to the ThreatMetrix proofing component even if ThreatMetrix is …
jmhooper e3edafe
Update schema timestamp (#8193)
fb8eb65
LG-9214: mfa selection priority (#8130)
mdiarra3 95f320e
Fix incorrect SAML path being called in SAML POST authentication (#8182)
5dfae0d
Optimize user_fully_authenticated to defer database query (#8194)
aduth c503653
LG-9463 Add an explicit redirect from personal key controller for GPO…
jmhooper bb96519
Remove a leftover SSN template from FSM removal (#8196)
jmhooper 94188d1
LG-9161 Remove drivers license verification from instant verify (#8167)
amirbey dc3c2a9
LG-9431 new CaptureComplete controller (feature flagged) (#8186)
soniaconnolly 893598c
Remove reference to embedded images in LICENSE (#8202)
aduth 3de2a44
Turn README.md into an index of the docs dir (#8198)
zachmargolis 65b2390
Avoid caching for webpack dev server resources (#8205)
aduth cfe0c08
Re-enable IDV outage feature spec 🤞 (#8188)
matthinz 06dc1dd
Turn SAML year into a path parameter (LG-7554) (#7153)
zachmargolis 8860087
Fix 500 due to undefined two_factor_authentication_method method (#8208)
ebeda90
Refactor fraud specs (#8201)
5179986
Refactor fraud specs (#8201)
0284794
Remove unused configuration redis_throttle_alternate_url and redis_th…
8406b9b
Override tag style to leave case unchanged and make text bold (#8212)
soniaconnolly c18273a
LG-9333 Preserve the SSN when returning to the SSN controller (#8197)
jmhooper 7c7e66c
LG-8714 Remove UserDecorator (#8204)
eric-gade e157d63
Jskinne3 lg 9361 mobile local md (#8217)
jskinne3 e370cb4
Configure the DDP mock client to respond with a failed result on `no_…
jmhooper cb5350c
LG-9034 Log TrueID decision product status (#8195)
amirbey 7397f1b
LG-9488: Entry controller for hybrid mobile document capture flow (#8…
matthinz cc4c0a2
Fix email confirmation 500 (#8224)
bf471cb
LG-9321: New field on Enrollment Outcomes for GetUspsProofingResultsJ…
gina-yamada e3f8306
Rename translation tags from combined_upload to upload (#8219)
soniaconnolly e893a20
LG-9391: Improve accessibility for phone dropdown (#8210)
aduth fa106df
Upgrade Stylelint to v15, prepare new config publish (#8228)
aduth 2a1e413
LG-9358 Phone Verification Content Changes (#8222)
eric-gade f779087
Create return_to_sp url directly rather than through FSM for Document…
soniaconnolly 004790e
Jmax/lg 9147 show extra guidance for puerto rico addresses (#8088)
jmax-gsa 7a9331d
refactor to reduce in-person feature test flakes (#8215)
2732b56
Update package.json
jc-gsa 94c68ad
Merge branch 'main' into LG-9208-confirm-password
jc-gsa 665f564
Add post-merge
jc-gsa 017b3c2
Clear validations
jc-gsa b3774fc
Add refactor
jc-gsa ee6881d
Update app/components/password_confirmation_component.html.erb
jc-gsa a7f58db
Update app/components/password_confirmation_component.html.erb
jc-gsa 8a15d37
Add refactor
jc-gsa b260d4e
Merge branch 'LG-9208-confirm-password' of github.com:18F/identity-id…
jc-gsa 7974fd7
Add feature flag password_confirmation_enabled
jc-gsa 28098e9
Merge branch 'main' into LG-9208-confirm-password
jc-gsa 079938f
Change flag to confirmation_enabled
jc-gsa cb00c49
Update app/components/password_confirmation_component.html.erb
jc-gsa 9a1998a
Add refactor
jc-gsa 84f21ad
Merge branch 'LG-9208-confirm-password' of github.com:18F/identity-id…
jc-gsa 622efe8
Yaml
jc-gsa a798714
Merge branch 'LG-9208-confirm-password' of github.com:18F/identity-id…
jc-gsa File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,46 @@ | ||
| <%= content_tag(:'lg-password-confirmation', **tag_options) do %> | ||
| <%= render ValidatedFieldComponent.new( | ||
| form: form, | ||
| name: :password, | ||
| type: :password, | ||
| label: default_label, | ||
| required: true, | ||
| **field_options, | ||
| input_html: field_options[:input_html].to_h.merge( | ||
| id: input_id, | ||
| class: ['password-confirmation__input', *field_options.dig(:input_html, :class)], | ||
| ), | ||
| ) %> | ||
| <%= render ValidatedFieldComponent.new( | ||
| form: form, | ||
| name: :password_confirmation, | ||
| type: :password_confirmation, | ||
| label: confirmation_label, | ||
| required: true, | ||
| **field_options, | ||
| input_html: field_options[:input_html].to_h.merge( | ||
| id: input_confirmation_id, | ||
| class: ['password-confirmation__input-confirmation', *field_options.dig(:input_html, :class)], | ||
| ), | ||
| wrapper_html: field_options[:wrapper_html].to_h.merge( | ||
| class: ['margin-bottom-0', *field_options.dig(:wrapper_html, :class)], | ||
| ), | ||
| error_messages: { | ||
| valueMissing: t('components.password_confirmation.errors.empty'), | ||
| }, | ||
| ) %> | ||
| <input | ||
| id="<%= toggle_id %>" | ||
| type="checkbox" | ||
| class="usa-checkbox__input password-confirmation__toggle" | ||
| aria-controls="<%= input_id %> <%= input_confirmation_id %>" | ||
| > | ||
| <label | ||
| for="<%= toggle_id %>" | ||
| class="usa-checkbox__label password-confirmation__toggle-label" | ||
| > | ||
| <%= toggle_label %> | ||
| </label> | ||
|
|
||
| <%= form.hidden_field :confirmation_enabled, value: true %> | ||
| <% end %> | ||
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,35 @@ | ||
| class PasswordConfirmationComponent < BaseComponent | ||
| attr_reader :form, :toggle_label, :field_options, :tag_options | ||
|
|
||
| def initialize( | ||
| form:, | ||
| toggle_label: t('components.password_confirmation.toggle_label'), | ||
| field_options: {}, | ||
| **tag_options | ||
| ) | ||
| @form = form | ||
| @toggle_label = toggle_label | ||
| @field_options = field_options | ||
| @tag_options = tag_options | ||
| end | ||
|
|
||
| def default_label | ||
| t('forms.password') | ||
| end | ||
|
|
||
| def confirmation_label | ||
| t('components.password_confirmation.confirm_label') | ||
| end | ||
|
|
||
| def toggle_id | ||
| "password-confirmation-toggle-#{unique_id}" | ||
| end | ||
|
|
||
| def input_id | ||
| "password-confirmation-input-#{unique_id}" | ||
| end | ||
|
|
||
| def input_confirmation_id | ||
| "password-confirmation-input-confirmation-#{unique_id}" | ||
| end | ||
| end |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1 @@ | ||
| import '@18f/identity-password-confirmation/password-confirmation-element'; |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,33 @@ | ||
| # `@18f/password-confirmation` | ||
|
|
||
| Custom element implementation that adds password inputs with validation for confirmation. | ||
|
|
||
| ## Usage | ||
|
|
||
| Importing the element will register the `<lg-password-confirmation>` custom element: | ||
|
|
||
| ```ts | ||
| import '@18f/password-confirmation/password-confirmation-element'; | ||
| ``` | ||
|
|
||
| The custom element will implement the behavior for validation, but all markup must already exist. | ||
|
|
||
| ```html | ||
| <lg-password-confirmation> | ||
| <label for="input-1">Password</label> | ||
| <input id="input-1" class="password-confirmation__input"> | ||
| <label for="input-1b">Confirm password</label> | ||
| <input id="input-1b" class="password-confirmation__input-confirmation"> | ||
| <div class="password-confirmation__toggle-wrapper"> | ||
| <input | ||
| id="toggle-1" | ||
| type="checkbox" | ||
| class="password-confirmation__toggle" | ||
| aria-controls="input-1" | ||
| > | ||
| <label for="toggle-1" class="usa-checkbox__label password-confirmation__toggle-label"> | ||
| Show password | ||
| </label> | ||
| </div>`; | ||
| </lg-password-confirmation> | ||
| ``` |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,5 @@ | ||
| { | ||
| "name": "@18f/identity-password-confirmation", | ||
| "private": true, | ||
| "version": "1.0.0" | ||
| } |
94 changes: 94 additions & 0 deletions
94
app/javascript/packages/password-confirmation/password-confirmation-element.spec.ts
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,94 @@ | ||
| import userEvent from '@testing-library/user-event'; | ||
| import { getByLabelText, waitFor } from '@testing-library/dom'; | ||
| import { useSandbox } from '@18f/identity-test-helpers'; | ||
| import * as analytics from '@18f/identity-analytics'; | ||
| import './password-confirmation-element'; | ||
| import type PasswordConfirmationElement from './password-confirmation-element'; | ||
|
|
||
| describe('PasswordConfirmationElement', () => { | ||
| let element: PasswordConfirmationElement; | ||
| let input1: HTMLInputElement; | ||
| let input2: HTMLInputElement; | ||
| let idCounter = 0; | ||
| const sandbox = useSandbox(); | ||
|
|
||
| function createElement() { | ||
| element = document.createElement('lg-password-confirmation') as PasswordConfirmationElement; | ||
| const idSuffix = ++idCounter; | ||
| element.innerHTML = ` | ||
| <label for="input-${idSuffix}">Password</label> | ||
| <input id="input-${idSuffix}" class="password-confirmation__input"> | ||
| <label for="input-${idSuffix}b">Confirm password</label> | ||
| <input id="input-${idSuffix}b" class="password-confirmation__input-confirmation"> | ||
| <div class="password-confirmation__toggle-wrapper"> | ||
| <input | ||
| id="toggle-${idSuffix}" | ||
| type="checkbox" | ||
| class="password-confirmation__toggle" | ||
| aria-controls="input-${idSuffix}" | ||
| > | ||
| <label for="toggle-${idSuffix}" class="usa-checkbox__label password-confirmation__toggle-label"> | ||
| Show password | ||
| </label> | ||
| </div>`; | ||
| document.body.appendChild(element); | ||
| return element; | ||
| } | ||
|
|
||
| beforeEach(() => { | ||
| element = createElement(); | ||
| input1 = getByLabelText(element, 'Password') as HTMLInputElement; | ||
| input2 = getByLabelText(element, 'Confirm password') as HTMLInputElement; | ||
| }); | ||
|
|
||
| it('initializes input type', () => { | ||
| expect(input1.type).to.equal('password'); | ||
| }); | ||
|
|
||
| it('changes input type on toggle', async () => { | ||
| const toggle = getByLabelText(element, 'Show password') as HTMLInputElement; | ||
|
|
||
| await userEvent.click(toggle); | ||
|
|
||
| expect(input1.type).to.equal('text'); | ||
| }); | ||
|
|
||
| it('logs an event when clicking the Show Password button', async () => { | ||
| sandbox.stub(analytics, 'trackEvent'); | ||
| const toggle = getByLabelText(element, 'Show password') as HTMLInputElement; | ||
|
|
||
| await userEvent.click(toggle); | ||
|
|
||
| expect(analytics.trackEvent).to.have.been.calledWith('Show Password button clicked', { | ||
| path: window.location.pathname, | ||
| }); | ||
| }); | ||
|
|
||
| describe('Password validation', () => { | ||
| it('validates passwords in both directions', async () => { | ||
| await userEvent.type(input1, 'salty pickles'); | ||
| await userEvent.type(input2, 'salty pickles2'); | ||
| await waitFor(() => { | ||
| expect(input2.checkValidity()).to.be.false(); | ||
| }); | ||
|
|
||
| await userEvent.clear(input1); | ||
| await userEvent.type(input1, 'salty pickles2'); | ||
| await waitFor(() => { | ||
| expect(input2.checkValidity()).to.be.true(); | ||
| }); | ||
|
|
||
| await userEvent.clear(input1); | ||
| await userEvent.type(input1, 'salty pickles3'); | ||
| await waitFor(() => { | ||
| expect(input2.checkValidity()).to.be.false(); | ||
| }); | ||
|
|
||
| await userEvent.clear(input2); | ||
| await userEvent.type(input2, 'salty pickles3'); | ||
| await waitFor(() => { | ||
| expect(input2.checkValidity()).to.be.true(); | ||
| }); | ||
| }); | ||
| }); | ||
| }); |
67 changes: 67 additions & 0 deletions
67
app/javascript/packages/password-confirmation/password-confirmation-element.ts
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,67 @@ | ||
| import { trackEvent } from '@18f/identity-analytics'; | ||
| import { t } from '@18f/identity-i18n'; | ||
|
|
||
| class PasswordConfirmationElement extends HTMLElement { | ||
| connectedCallback() { | ||
| this.toggle.addEventListener('change', () => this.setInputType()); | ||
| this.toggle.addEventListener('click', () => this.trackToggleEvent()); | ||
| this.input.addEventListener('input', () => this.validatePassword()); | ||
| this.inputConfirmation.addEventListener('input', () => this.validatePassword()); | ||
| this.setInputType(); | ||
| } | ||
|
|
||
| /** | ||
| * Checkbox toggle for visibility. | ||
| */ | ||
| get toggle(): HTMLInputElement { | ||
| return this.querySelector('.password-confirmation__toggle')! as HTMLInputElement; | ||
| } | ||
|
|
||
| /** | ||
| * Password input. | ||
| */ | ||
| get input(): HTMLInputElement { | ||
| return this.querySelector('.password-confirmation__input')! as HTMLInputElement; | ||
| } | ||
|
|
||
| /** | ||
| * Password confirmation input. | ||
| */ | ||
| get inputConfirmation(): HTMLInputElement { | ||
| return this.querySelector('.password-confirmation__input-confirmation')! as HTMLInputElement; | ||
| } | ||
|
|
||
| setInputType() { | ||
| const checked = this.toggle.checked ? 'text' : 'password'; | ||
| this.input.type = checked; | ||
| this.inputConfirmation.type = checked; | ||
| } | ||
aduth marked this conversation as resolved.
Show resolved
Hide resolved
|
||
|
|
||
| trackToggleEvent() { | ||
| trackEvent('Show Password button clicked', { path: window.location.pathname }); | ||
| } | ||
|
|
||
| validatePassword() { | ||
| const password = this.input.value; | ||
| const confirmation = this.inputConfirmation.value; | ||
|
|
||
| if (password && password !== confirmation) { | ||
| const errorMsg = t('components.password_confirmation.errors.mismatch'); | ||
| this.inputConfirmation.setCustomValidity(errorMsg); | ||
| } else { | ||
| this.inputConfirmation.setCustomValidity(''); | ||
| } | ||
| } | ||
| } | ||
|
|
||
| declare global { | ||
| interface HTMLElementTagNameMap { | ||
| 'lg-password-confirmation': PasswordConfirmationElement; | ||
| } | ||
| } | ||
|
|
||
| if (!customElements.get('lg-password-confirmation')) { | ||
| customElements.define('lg-password-confirmation', PasswordConfirmationElement); | ||
| } | ||
|
|
||
| export default PasswordConfirmationElement; | ||
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -1,13 +1,5 @@ | ||
| { | ||
| "name": "@18f/identity-password-toggle", | ||
| "private": true, | ||
| "version": "1.0.0", | ||
| "peerDependencies": { | ||
| "react": "^17.0.2" | ||
| }, | ||
| "peerDependenciesMeta": { | ||
| "react": { | ||
| "optional": true | ||
| } | ||
| } | ||
| "version": "1.0.0" | ||
| } |
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Uh oh!
There was an error while loading. Please reload this page.