Skip to content
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

Vitest migration #3076

Merged
merged 16 commits into from
May 22, 2024
Merged

Vitest migration #3076

merged 16 commits into from
May 22, 2024

Conversation

jeffsmohan
Copy link
Contributor

@jeffsmohan jeffsmohan commented May 20, 2024

Ticket #

Description

This PR migrates our current client-side test runner/assertions/mocking (based on vue-cli, mocha, chai, sinon) over to vitest (https://vitest.dev/). This supports our upcoming migration from vue-cli over to vite as our development server and production build utility. (See Decision #0008 for background.)

This PR is meant to be easiest to review commit by commit. The key changes are:

  1. Codemod to automate transition from mocha/chai syntax to jest syntax for expect assertions
  2. Set up vitest and vite.config.js
  3. Update coverage settings to match previous workflow
  4. Update CI/QA workflows to use the updated test/coverage commands
  5. A few manual tweaks to the tests (replace sinon usage, a few minor fixes)
  6. Remove old infrastructure (nyc config, babel config, packages no longer used)
  7. Switch from implicit globals (e.g., describe, expect, it, etc.) to explicit imports
  8. Update testing documentation

I also want to specifically call out a few design considerations that might be worthy of more discussion:

  1. Vitest supports Istanbul or V8 as coverage tool. I opted for Istanbul for consistency with the server side code, but it appears V8 is the default and more efficient option. (That didn't seem super compelling to me with our small codebase. More info here: Document some of the tradeoffs of V8 coverage (vs Babel/Istanbul coverage) jestjs/jest#11188.)
  2. Note that the coverage report itself is slightly different than it was. (Notably, some files that I think we'd want coverage for are not included in the previous reports.) If continuity in our coverage stats is important, I can try to chase down the differences and reconcile them, but my assumption is the coverage data is right now just providing helpful comments on PRs. After fixing a setting, this is no longer the case. The coverage reports match exactly.
  3. I switched from implicit globals (e.g., describe, expect, it, etc.) to explicit imports in our tests. I have a strong preference personally for explicit, since it makes code clearer and less magic-seeming for new developers. (And the minor downside of writing slightly more code should be minimized by your editor's automation.) That said, it's a meaningful change, so I wanted to check in on it.
    • Also worth mulling over: Do we want to follow up this PR with a similar PR moving the server-side tests to equivalent systems? (We wouldn't use vitest, but we could move over to jest for equivalent syntax and pleasant test-runner UX.) Do we want to move to explicit imports there too?
  4. Do we have any interest in taking this opportunity to colocate tests with the files under test? (e.g., Foo.vue and Foo.spec.vue would live in the same folder.) My personal conviction here isn't strong enough to warrant changing the status quo in this PR, but the argument is that colocated tests are easier to find, easier to work on, and perhaps make it easier for devs to write more tests.

Screenshots / Demo Video

image image

Testing

  • The unit test suite continues to pass
  • So long as CI continues passing, that should cover things

Automated and Unit Tests

  • Added Unit tests

Manual tests for Reviewer

  • Added steps to test feature/functionality manually

Checklist

  • Provided ticket and description
  • Provided screenshots/demo
  • Provided testing information
  • Provided adequate test coverage for all new code
  • Added PR reviewers

@jeffsmohan jeffsmohan requested a review from a team as a code owner May 20, 2024 19:02
@github-actions github-actions bot added dependencies Pull requests that update a dependency file documentation Improvements or additions to documentation github javascript Pull requests that update Javascript code labels May 20, 2024
Copy link

github-actions bot commented May 20, 2024

QA Summary

QA Check Result
🌐 Client Tests
🔗 Server Tests
🤝 E2E Tests
📏 ESLint
🧹 TFLint

Test Coverage

Coverage report for `packages/client`
Coverage report for `packages/server`
St File % Stmts % Branch % Funcs % Lines Uncovered Line #s
🟡 All files 54.91 46.93 48.9 55.38
🟢  src 82 33.33 60 82
🟢   configure.js 82 33.33 60 82 43,62-69,98-100
🟢  src/arpa_reporter 98.75 66.66 100 98.75
🟢   configure.js 97.36 40 100 97.36 36
🟢   environment.js 100 100 100 100
🟢   use-request.js 100 100 100 100
🔴  src/arpa_reporter/db 38.58 32.92 44.44 40.16
🔴   arpa-subrecipients.js 13.15 4.34 15.38 14.28 23-92
🔴   reporting-periods.js 37.2 46.87 40 38.09 46,77-156
🟢   settings.js 100 83.33 100 100 13
🟡   uploads.js 50 28.57 52.38 51.42 18-29,83,98-123,140-149
🔴  src/arpa_reporter/lib 23.82 19.84 23.75 24.31
🟢   arpa-ec-codes.js 100 100 100 100
🔴   audit-report.js 21.56 19.78 24.59 21.38 ...27-528,553-683,731-757
🟡   ensure-async-context.js 75 100 50 100
🔴   format.js 12.5 0 0 17.39 28-90
🟡   log.js 75 50 50 75 13,25
🟡   preconditions.js 66.66 33.33 100 66.66 3
🔴   spreadsheet.js 9.09 0 0 9.09 15-32
🟢   validation-error.js 85.71 100 50 85.71 16
🔴  src/arpa_reporter/routes 40 14.92 14.28 40.6
🔴   agencies.js 22.58 0 0 23.33 13-21,26-53
🟡   application_settings.js 75 100 0 75 10-11
🟡   audit-report.js 68.91 58.33 100 68.91 57-58,64-78,100-116
🟢   exports.js 81.42 83.33 100 81.42 61-75,98-99
🔴   reporting-periods.js 20 0 0 20.43 ...25-137,143-149,154-180
🔴   subrecipients.js 23.8 0 0 23.8 12-13,17-27,31-48,52-63
🔴   uploads.js 28.28 7.89 9.09 29.16 ...33-154,164-166,173-180
🔴   users.js 19.6 0 0 20 15-35,39-44,48-81
🔴  src/arpa_reporter/services 42.6 30.12 45.39 42.97
🔴   generate-arpa-report.js 36.86 2.79 50 37.24 ...-974,983-996,1070-1137
🔴   get-template.js 21.62 0 0 21.62 18-79
🟡   persist-upload.js 68.6 90 69.56 68.67 ...58-200,221-235,273-295
🔴   records.js 20.75 0 11.11 21.15 38-204,221-276
🔴   revalidate-uploads.js 37.5 100 0 37.5 5-14
🔴   validate-upload.js 38.19 49.41 32.14 39.11 ...20,339,361,379-668,683
🟢   validation-rules.js 98.18 90 90.9 100 157,173
🟡  src/db 74.48 71.31 68.78 74.53
🟢   connection.js 100 50 100 100 6
🟢   constants.js 100 100 100 100
🟡   helpers.js 75 83.33 50 75 5,21-22
🟢   index.js 82.6 78.36 82.35 82.56 ...51-1417,1599-1600,1607
🟢   saved_search_migration.js 92 88.23 71.42 93.61 5,69,134
🔴   tenant_creation.js 10.58 2.7 0 11.11 15-40,48-210,220
🔴  src/db/arpa_reporter_db_shims 23.68 0 0 23.68
🔴   agencies.js 22.22 100 0 22.22 11-51
🔴   users.js 25 0 0 25 12-62
🟡  src/lib 68.09 63.75 62.88 69.11
🟢   access-helpers.js 93.54 89.18 100 93.54 96-97,102-103
🟢   agencyImporter.js 90.38 88.46 100 90.19 26,29,35,93-94
🔴   batchProcessor.js 2.94 0 0 3.03 35-104
🟢   email.js 92.85 79.24 100 92.76 ...38,160-164,211,357-360
🔴   gost-aws.js 45.45 31.81 42.85 45.23 13-58,94,104,111-131
🟢   grants-ingest.js 83.33 97.5 90 83.33 ...28-131,138-140,155-159
🔴   grantsgov.js 6.25 6.52 0 6.97 12-220
🟡   logging.js 77.77 85.71 100 77.77 11,13
🟢   redirect_validation.js 100 100 100 100
🟢   userImporter.js 82.27 58.33 88.88 81.57 32,47,53,62,73-81,143-152
🔴  src/lib/annualReports 27.38 0 0 27.38
🔴   doc-builder.js 7.69 0 0 7.69 19-352
🟡   index.js 80 100 0 80 6
🟢   placeholderTextStrings.js 100 100 100 100
🔴   reportBuilder.js 17.24 0 0 17.24 21-33,50-62,86-103
🟢  src/lib/arpa_reporter_shims 100 100 100 100
🟢   email.js 100 100 100 100
🟢  src/lib/email 93.1 87.5 100 92.59
🟢   constants.js 100 100 100 100
🟢   email-nodemailer.js 88.23 83.33 100 86.66 33,64
🟢   service-email.js 100 100 100 100
🟢  src/lib/fieldConfigs 100 100 100 100
🟢   fundingActivityCategories.js 100 100 100 100
🔴  src/lib/grantscraper 11.86 0 0 12.96
🔴   index.js 11.86 0 0 12.96 11-92,98-122
🟡  src/routes 70.43 62.2 60.75 70.54
🔴   agencies.js 42.39 30 33.33 42.39 ...13-121,125-146,154-160
🔴   annualReports.js 47.05 100 0 47.05 15-27
🟢   eligibilityCodes.js 100 100 100 100
🟢   grants.js 80.43 71.02 73.52 81.25 ...80-381,396-399,412-413
🟡   grantsSavedSearch.js 80 83.33 100 80 38-39,56-57,70-72,78
🟢   health.js 100 100 100 100
🟡   interestedCodes.js 71.42 100 0 71.42 7-8
🟢   keywords.js 86.95 50 100 86.95 26-27,34
🟡   refresh.js 71.42 100 0 71.42 7-8
🟡   roles.js 75 100 0 75 8-9
🟡   searchConfig.js 58.33 100 0 58.33 9-14
🟡   sessions.js 63.93 39.39 50 63.93 ...-73,79-80,84-85,98-104
🔴   tenants.js 39.13 0 0 39.13 11-12,16-27,32-35
🟢   users.js 80.41 74.19 85.71 80.41 ...17,134-136,160,169-177
🟢  src/scripts 84.61 83.33 66.66 91.66
🟢   sendGrantDigestEmail.js 84.61 83.33 66.66 91.66 28

Pusher: @TylerHendrickson, Action: pull_request_target, Workflow: Continuous Integration

Copy link

github-actions bot commented May 20, 2024

Terraform Summary

Step Result
🖌 Terraform Format & Style
⚙️ Terraform Initialization
🤖 Terraform Validation
📖 Terraform Plan

Hint: If "Terraform Format & Style" failed, run terraform fmt -recursive from the terraform/ directory and commit the results.

Output

Validation Output
Success! The configuration is valid.


Plan Summary
CHANGE RESOURCE
add module.website.aws_s3_object.origin_dist_artifact["css/104.449d105d.css"]
module.website.aws_s3_object.origin_dist_artifact["css/142.ead7363f.css"]
module.website.aws_s3_object.origin_dist_artifact["css/164.c1d7dee6.css"]
module.website.aws_s3_object.origin_dist_artifact["css/235.5dbff5ae.css"]
module.website.aws_s3_object.origin_dist_artifact["css/411.aaf08eb2.css"]
module.website.aws_s3_object.origin_dist_artifact["css/720.823258ed.css"]
module.website.aws_s3_object.origin_dist_artifact["css/778.5dbff179.css"]
module.website.aws_s3_object.origin_dist_artifact["css/996.af01ce0c.css"]
module.website.aws_s3_object.origin_dist_artifact["css/arpaReporter.c13728da.css"]
module.website.aws_s3_object.origin_dist_artifact["css/main.58ee6b57.css"]
module.website.aws_s3_object.origin_dist_artifact["js/104.dd20ae34.js"]
module.website.aws_s3_object.origin_dist_artifact["js/104.dd20ae34.js.map"]
module.website.aws_s3_object.origin_dist_artifact["js/142.544d78a3.js"]
module.website.aws_s3_object.origin_dist_artifact["js/142.544d78a3.js.map"]
module.website.aws_s3_object.origin_dist_artifact["js/164.34befb7e.js"]
module.website.aws_s3_object.origin_dist_artifact["js/164.34befb7e.js.map"]
module.website.aws_s3_object.origin_dist_artifact["js/235.ba22cc19.js"]
module.website.aws_s3_object.origin_dist_artifact["js/235.ba22cc19.js.map"]
module.website.aws_s3_object.origin_dist_artifact["js/3.e5f48da3.js"]
module.website.aws_s3_object.origin_dist_artifact["js/3.e5f48da3.js.map"]
module.website.aws_s3_object.origin_dist_artifact["js/302.6976b4fb.js"]
module.website.aws_s3_object.origin_dist_artifact["js/302.6976b4fb.js.map"]
module.website.aws_s3_object.origin_dist_artifact["js/320.482b1dee.js"]
module.website.aws_s3_object.origin_dist_artifact["js/320.482b1dee.js.map"]
module.website.aws_s3_object.origin_dist_artifact["js/411.4f8ba1ae.js"]
module.website.aws_s3_object.origin_dist_artifact["js/411.4f8ba1ae.js.map"]
module.website.aws_s3_object.origin_dist_artifact["js/650.7e2b4ceb.js"]
module.website.aws_s3_object.origin_dist_artifact["js/650.7e2b4ceb.js.map"]
module.website.aws_s3_object.origin_dist_artifact["js/652.b2956df8.js"]
module.website.aws_s3_object.origin_dist_artifact["js/652.b2956df8.js.map"]
module.website.aws_s3_object.origin_dist_artifact["js/720.4374fc94.js"]
module.website.aws_s3_object.origin_dist_artifact["js/720.4374fc94.js.map"]
module.website.aws_s3_object.origin_dist_artifact["js/721.2138e641.js"]
module.website.aws_s3_object.origin_dist_artifact["js/721.2138e641.js.map"]
module.website.aws_s3_object.origin_dist_artifact["js/778.4d2b3af3.js"]
module.website.aws_s3_object.origin_dist_artifact["js/778.4d2b3af3.js.map"]
module.website.aws_s3_object.origin_dist_artifact["js/813.c707946d.js"]
module.website.aws_s3_object.origin_dist_artifact["js/813.c707946d.js.map"]
module.website.aws_s3_object.origin_dist_artifact["js/877.25ac5cc8.js"]
module.website.aws_s3_object.origin_dist_artifact["js/877.25ac5cc8.js.map"]
module.website.aws_s3_object.origin_dist_artifact["js/996.c6bb2d76.js"]
module.website.aws_s3_object.origin_dist_artifact["js/996.c6bb2d76.js.map"]
module.website.aws_s3_object.origin_dist_artifact["js/arpaReporter.719b9f3b.js"]
module.website.aws_s3_object.origin_dist_artifact["js/arpaReporter.719b9f3b.js.map"]
module.website.aws_s3_object.origin_dist_artifact["js/chunk-vendors.3aabd919.js"]
module.website.aws_s3_object.origin_dist_artifact["js/chunk-vendors.3aabd919.js.map"]
module.website.aws_s3_object.origin_dist_artifact["js/main.d1244711.js"]
module.website.aws_s3_object.origin_dist_artifact["js/main.d1244711.js.map"]
update module.api.aws_ecs_service.default[0]
module.api.module.grant_digest_scheduled_task.aws_iam_role_policy.default[0]
module.api.module.grant_digest_scheduled_task.aws_scheduler_schedule.default[0]
module.arpa_audit_report.aws_ecs_service.default
module.arpa_treasury_report.aws_ecs_service.default
module.consume_grants.aws_ecs_service.default
module.website.aws_s3_object.deploy-config[0]
module.website.aws_s3_object.origin_dist_artifact["arpa_reporter/index.html"]
module.website.aws_s3_object.origin_dist_artifact["css/chunk-vendors.48f83f60.css"]
module.website.aws_s3_object.origin_dist_artifact["index.html"]
recreate module.api.aws_ecs_task_definition.default[0]
module.arpa_audit_report.aws_ecs_task_definition.consumer
module.arpa_treasury_report.aws_ecs_task_definition.consumer
module.consume_grants.aws_ecs_task_definition.consume_grants
delete module.website.aws_s3_object.origin_dist_artifact["css/144.c1d7dee6.css"]
module.website.aws_s3_object.origin_dist_artifact["css/308.823258ed.css"]
module.website.aws_s3_object.origin_dist_artifact["css/360.af01ce0c.css"]
module.website.aws_s3_object.origin_dist_artifact["css/463.5dbff179.css"]
module.website.aws_s3_object.origin_dist_artifact["css/582.449d105d.css"]
module.website.aws_s3_object.origin_dist_artifact["css/775.ead7363f.css"]
module.website.aws_s3_object.origin_dist_artifact["css/860.aaf08eb2.css"]
module.website.aws_s3_object.origin_dist_artifact["css/861.5dbff5ae.css"]
module.website.aws_s3_object.origin_dist_artifact["css/arpaReporter.8c15aafa.css"]
module.website.aws_s3_object.origin_dist_artifact["css/main.c554d914.css"]
module.website.aws_s3_object.origin_dist_artifact["js/144.7c26a084.js"]
module.website.aws_s3_object.origin_dist_artifact["js/144.7c26a084.js.map"]
module.website.aws_s3_object.origin_dist_artifact["js/294.3474eac8.js"]
module.website.aws_s3_object.origin_dist_artifact["js/294.3474eac8.js.map"]
module.website.aws_s3_object.origin_dist_artifact["js/302.40d8a080.js"]
module.website.aws_s3_object.origin_dist_artifact["js/302.40d8a080.js.map"]
module.website.aws_s3_object.origin_dist_artifact["js/308.52039de7.js"]
module.website.aws_s3_object.origin_dist_artifact["js/308.52039de7.js.map"]
module.website.aws_s3_object.origin_dist_artifact["js/360.697dc071.js"]
module.website.aws_s3_object.origin_dist_artifact["js/360.697dc071.js.map"]
module.website.aws_s3_object.origin_dist_artifact["js/463.ee86e0cb.js"]
module.website.aws_s3_object.origin_dist_artifact["js/463.ee86e0cb.js.map"]
module.website.aws_s3_object.origin_dist_artifact["js/582.468268b8.js"]
module.website.aws_s3_object.origin_dist_artifact["js/582.468268b8.js.map"]
module.website.aws_s3_object.origin_dist_artifact["js/641.9d55fc95.js"]
module.website.aws_s3_object.origin_dist_artifact["js/641.9d55fc95.js.map"]
module.website.aws_s3_object.origin_dist_artifact["js/650.a42d8297.js"]
module.website.aws_s3_object.origin_dist_artifact["js/650.a42d8297.js.map"]
module.website.aws_s3_object.origin_dist_artifact["js/775.e4789226.js"]
module.website.aws_s3_object.origin_dist_artifact["js/775.e4789226.js.map"]
module.website.aws_s3_object.origin_dist_artifact["js/860.533db734.js"]
module.website.aws_s3_object.origin_dist_artifact["js/860.533db734.js.map"]
module.website.aws_s3_object.origin_dist_artifact["js/861.e97a6ad4.js"]
module.website.aws_s3_object.origin_dist_artifact["js/861.e97a6ad4.js.map"]
module.website.aws_s3_object.origin_dist_artifact["js/877.22b8ff53.js"]
module.website.aws_s3_object.origin_dist_artifact["js/877.22b8ff53.js.map"]
module.website.aws_s3_object.origin_dist_artifact["js/932.7cbfcc40.js"]
module.website.aws_s3_object.origin_dist_artifact["js/932.7cbfcc40.js.map"]
module.website.aws_s3_object.origin_dist_artifact["js/964.9782bf61.js"]
module.website.aws_s3_object.origin_dist_artifact["js/964.9782bf61.js.map"]
module.website.aws_s3_object.origin_dist_artifact["js/977.2e22313b.js"]
module.website.aws_s3_object.origin_dist_artifact["js/977.2e22313b.js.map"]
module.website.aws_s3_object.origin_dist_artifact["js/arpaReporter.74aab906.js"]
module.website.aws_s3_object.origin_dist_artifact["js/arpaReporter.74aab906.js.map"]
module.website.aws_s3_object.origin_dist_artifact["js/chunk-vendors.6b5ca4a5.js"]
module.website.aws_s3_object.origin_dist_artifact["js/chunk-vendors.6b5ca4a5.js.map"]
module.website.aws_s3_object.origin_dist_artifact["js/main.51b620f7.js"]
module.website.aws_s3_object.origin_dist_artifact["js/main.51b620f7.js.map"]

Pusher: @TylerHendrickson, Action: pull_request_target, Workflow: Continuous Integration

Copy link
Member

@TylerHendrickson TylerHendrickson left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Changes look good; marking this as "Request changes" so that the CI trigger modification is reverted. Once that happens, I'll bypass the main branch requirement and merge the PR.

Comment on lines 4 to 5
pull_request_target: {}
# pull_request_target: {}
pull_request: {} # TEST TRIGGER - DO NOT MERGE
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Adding a comment here that will be made outdated by reverting ff47a47

@TylerHendrickson
Copy link
Member

TylerHendrickson commented May 21, 2024

@jeffsmohan Responding to your points on the main PR comment:

  1. Vitest supports Istanbul or V8 as coverage tool. I opted for Istanbul for consistency with the server side code, but it appears V8 is the default and more efficient option. (That didn't seem super compelling to me with our small codebase. More info here: Document some of the tradeoffs of V8 coverage (vs Babel/Istanbul coverage) jestjs/jest#11188.)

Agree that performance arguments don't seem compelling here – GHA is spending all of 12 seconds running these tests and <1 second generating the coverage report, which doesn't feel too egregious. FWIW, I don't think that the client- and server-side coverage tools need to be the same, but I would like to retain the ability to include a coverage report in a github-actions bot comment. The fingerprintjs/action-coverage-report-md action would either need to be compatible with a different coverage tool, or we would want to find an alternative for that as well.

  1. Note that the coverage report itself is slightly different than it was. (Notably, some files that I think we'd want coverage for are not included in the previous reports.) If continuity in our coverage stats is important, I can try to chase down the differences and reconcile them, but my assumption is the coverage data is right now just providing helpful comments on PRs.

I'm not certain I'm following here – are you just saying that this PR increases coverage in files where it was previously lacking? Or would you mind elaborating a bit?

  1. I switched from implicit globals (e.g., describe, expect, it, etc.) to explicit imports in our tests. I have a strong preference personally for explicit, since it makes code clearer and less magic-seeming for new developers. (And the minor downside of writing slightly more code should be minimized by your editor's automation.) That said, it's a meaningful change, so I wanted to check in on it.
    • Also worth mulling over: Do we want to follow up this PR with a similar PR moving the server-side tests to equivalent systems? (We wouldn't use vitest, but we could move over to jest for equivalent syntax and pleasant test-runner UX.) Do we want to move to explicit imports there too?

Agree with your preference, and yes, I think that having more code that's explicit/obvious and less magical is especially useful for our codebases.

  1. Do we have any interest in taking this opportunity to colocate tests with the files under test? (e.g., Foo.vue and Foo.spec.vue would live in the same folder.) My personal conviction here isn't strong enough to warrant changing the status quo in this PR, but the argument is that colocated tests are easier to find, easier to work on, and perhaps make it easier for devs to write more tests.

There can be weird implications for doing this in Python with good reason to avoid, but colocated tests are generally my preference. Are there any caveats we should be aware of / reasons why having tests organized in a mirrored directory structure (as they are today) would be beneficial? If not, I think it's worth changing (in a separate PR).

@jeffsmohan
Copy link
Contributor Author

I'm not certain I'm following here – are you just saying that this PR increases coverage in files where it was previously lacking? Or would you mind elaborating a bit?

Scratch that, the coverage reports come out the same. I was looking at a report from before I had tweaked some settings.

There can be weird implications for doing this in Python with good reason to avoid, but colocated tests are generally my preference. Are there any caveats we should be aware of / reasons why having tests organized in a mirrored directory structure (as they are today) would be beneficial? If not, I think it's worth changing (in a separate PR).

Yeah, I think it's worth following language conventions when we don't have a good reason not to. For JS, it's well supported and most common to colocate the tests next to the code files. I'm not aware of any real downsides. I'll work up a follow-up PR to relocate the code.

@jeffsmohan
Copy link
Contributor Author

@TylerHendrickson thanks for the review! Responded to comments, reverted the workflow testing commit, and this should be ready to go.

@jeffsmohan jeffsmohan enabled auto-merge (squash) May 22, 2024 15:15
@TylerHendrickson TylerHendrickson disabled auto-merge May 22, 2024 15:24
@TylerHendrickson TylerHendrickson merged commit c7c5948 into main May 22, 2024
17 of 19 checks passed
@TylerHendrickson TylerHendrickson deleted the jmo-vitest branch May 22, 2024 15:24
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
dependencies Pull requests that update a dependency file documentation Improvements or additions to documentation github javascript Pull requests that update Javascript code
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants