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

Components: Add support for TypeScript unit tests #39436

Merged
merged 15 commits into from
Apr 20, 2022

Conversation

ciampo
Copy link
Contributor

@ciampo ciampo commented Mar 14, 2022

What?

Following the exploratory work in #39341, this PR adds the necessary configuration in order to add unit tests written in TypeScript to the repo.

Why?

Having unit tests in TypeScript is a way to ensure that we type-check a component from the point of view of a consumer (and not just internally).

This PR will allow us to refactor to TypeScript unit tests in the @wordpress/components package, in the context of the wider package refactor (#35744).

How?

  • added a new TypeScript project specific for unit tests (tsconfig.test.json)
  • added type defs for custom TypeScript matchers (toMatchStyleDiffSnapshot)
  • edited eslint config to include TypeScript tests in the "development files" glob matcher
  • refactored unit tests for the <Text /> component to make sure that the above changes work for TypeScript unit tests

Testing Instructions

  • Project build
  • All unit tests pass
  • Running npm run build && npx tsc -p packages/components/tsconfig.json doesn't output any errors to console.
  • Open packages/components/src/text/test/index.tsx in an IDE supporting TypeScript:
    • make sure that type defs and autocomplete is working as expected.
    • introduce a TypeScript error, make sure it gets flagged in your IDE and when running npx tsc -p packages/components/tsconfig.json

@ciampo ciampo added Framework Issues related to broader framework topics, especially as it relates to javascript [Type] Build Tooling Issues or PRs related to build tooling [Type] Automated Testing Testing infrastructure changes impacting the execution of end-to-end (E2E) and/or unit tests. labels Mar 14, 2022
@ciampo ciampo requested a review from ajitbohra as a code owner March 14, 2022 18:34
@ciampo ciampo self-assigned this Mar 14, 2022
@ciampo ciampo force-pushed the feat/typescript-unit-tests branch from b6dbe4e to dd0c989 Compare March 14, 2022 18:40
@ciampo ciampo marked this pull request as draft March 14, 2022 20:06
@ciampo
Copy link
Contributor Author

ciampo commented Mar 14, 2022

Hey @sirreal — sorry for the ping again.

I opened this PR to introduce some of the changes discussed in #39341.

But the fact that I chose to refactor to TypeScript another test (packages/components/src/text/test/index.tsx) seems to cause errors when running npm run build:package-types . Do you have any ideas on why this may be happening?

Maybe it's related to the fact that the new project for tests only includes files under **/test/** folders, and therefore types defined outside of these files can't be parsed?

@ciampo ciampo force-pushed the feat/typescript-unit-tests branch from d58fce7 to 9ffcfb1 Compare March 23, 2022 09:05
@github-actions
Copy link

github-actions bot commented Mar 23, 2022

Size Change: 0 B

Total Size: 1.23 MB

ℹ️ View Unchanged
Filename Size
build/a11y/index.min.js 993 B
build/admin-manifest/index.min.js 1.24 kB
build/annotations/index.min.js 2.77 kB
build/api-fetch/index.min.js 2.27 kB
build/autop/index.min.js 2.15 kB
build/blob/index.min.js 487 B
build/block-directory/index.min.js 6.51 kB
build/block-directory/style-rtl.css 1.01 kB
build/block-directory/style.css 1.01 kB
build/block-editor/default-editor-styles-rtl.css 378 B
build/block-editor/default-editor-styles.css 378 B
build/block-editor/index.min.js 150 kB
build/block-editor/style-rtl.css 15.2 kB
build/block-editor/style.css 15.2 kB
build/block-library/blocks/archives/editor-rtl.css 61 B
build/block-library/blocks/archives/editor.css 60 B
build/block-library/blocks/archives/style-rtl.css 65 B
build/block-library/blocks/archives/style.css 65 B
build/block-library/blocks/audio/editor-rtl.css 150 B
build/block-library/blocks/audio/editor.css 150 B
build/block-library/blocks/audio/style-rtl.css 111 B
build/block-library/blocks/audio/style.css 111 B
build/block-library/blocks/audio/theme-rtl.css 125 B
build/block-library/blocks/audio/theme.css 125 B
build/block-library/blocks/avatar/editor-rtl.css 116 B
build/block-library/blocks/avatar/editor.css 116 B
build/block-library/blocks/avatar/style-rtl.css 59 B
build/block-library/blocks/avatar/style.css 59 B
build/block-library/blocks/block/editor-rtl.css 161 B
build/block-library/blocks/block/editor.css 161 B
build/block-library/blocks/button/editor-rtl.css 445 B
build/block-library/blocks/button/editor.css 445 B
build/block-library/blocks/button/style-rtl.css 560 B
build/block-library/blocks/button/style.css 560 B
build/block-library/blocks/buttons/editor-rtl.css 292 B
build/block-library/blocks/buttons/editor.css 292 B
build/block-library/blocks/buttons/style-rtl.css 275 B
build/block-library/blocks/buttons/style.css 275 B
build/block-library/blocks/calendar/style-rtl.css 207 B
build/block-library/blocks/calendar/style.css 207 B
build/block-library/blocks/categories/editor-rtl.css 84 B
build/block-library/blocks/categories/editor.css 83 B
build/block-library/blocks/categories/style-rtl.css 79 B
build/block-library/blocks/categories/style.css 79 B
build/block-library/blocks/code/style-rtl.css 103 B
build/block-library/blocks/code/style.css 103 B
build/block-library/blocks/code/theme-rtl.css 124 B
build/block-library/blocks/code/theme.css 124 B
build/block-library/blocks/columns/editor-rtl.css 108 B
build/block-library/blocks/columns/editor.css 108 B
build/block-library/blocks/columns/style-rtl.css 406 B
build/block-library/blocks/columns/style.css 406 B
build/block-library/blocks/comment-author-avatar/editor-rtl.css 125 B
build/block-library/blocks/comment-author-avatar/editor.css 125 B
build/block-library/blocks/comment-template/style-rtl.css 127 B
build/block-library/blocks/comment-template/style.css 127 B
build/block-library/blocks/comments-pagination-numbers/editor-rtl.css 123 B
build/block-library/blocks/comments-pagination-numbers/editor.css 121 B
build/block-library/blocks/comments-pagination/editor-rtl.css 222 B
build/block-library/blocks/comments-pagination/editor.css 209 B
build/block-library/blocks/comments-pagination/style-rtl.css 235 B
build/block-library/blocks/comments-pagination/style.css 231 B
build/block-library/blocks/comments-query-loop/editor-rtl.css 95 B
build/block-library/blocks/comments-query-loop/editor.css 95 B
build/block-library/blocks/comments-title/editor-rtl.css 75 B
build/block-library/blocks/comments-title/editor.css 75 B
build/block-library/blocks/cover/editor-rtl.css 546 B
build/block-library/blocks/cover/editor.css 547 B
build/block-library/blocks/cover/style-rtl.css 1.56 kB
build/block-library/blocks/cover/style.css 1.56 kB
build/block-library/blocks/embed/editor-rtl.css 293 B
build/block-library/blocks/embed/editor.css 293 B
build/block-library/blocks/embed/style-rtl.css 417 B
build/block-library/blocks/embed/style.css 417 B
build/block-library/blocks/embed/theme-rtl.css 124 B
build/block-library/blocks/embed/theme.css 124 B
build/block-library/blocks/file/editor-rtl.css 300 B
build/block-library/blocks/file/editor.css 300 B
build/block-library/blocks/file/style-rtl.css 255 B
build/block-library/blocks/file/style.css 255 B
build/block-library/blocks/file/view.min.js 353 B
build/block-library/blocks/freeform/editor-rtl.css 2.44 kB
build/block-library/blocks/freeform/editor.css 2.44 kB
build/block-library/blocks/gallery/editor-rtl.css 961 B
build/block-library/blocks/gallery/editor.css 964 B
build/block-library/blocks/gallery/style-rtl.css 1.51 kB
build/block-library/blocks/gallery/style.css 1.51 kB
build/block-library/blocks/gallery/theme-rtl.css 122 B
build/block-library/blocks/gallery/theme.css 122 B
build/block-library/blocks/group/editor-rtl.css 333 B
build/block-library/blocks/group/editor.css 333 B
build/block-library/blocks/group/style-rtl.css 57 B
build/block-library/blocks/group/style.css 57 B
build/block-library/blocks/group/theme-rtl.css 78 B
build/block-library/blocks/group/theme.css 78 B
build/block-library/blocks/heading/style-rtl.css 76 B
build/block-library/blocks/heading/style.css 76 B
build/block-library/blocks/html/editor-rtl.css 332 B
build/block-library/blocks/html/editor.css 333 B
build/block-library/blocks/image/editor-rtl.css 731 B
build/block-library/blocks/image/editor.css 730 B
build/block-library/blocks/image/style-rtl.css 529 B
build/block-library/blocks/image/style.css 535 B
build/block-library/blocks/image/theme-rtl.css 124 B
build/block-library/blocks/image/theme.css 124 B
build/block-library/blocks/latest-comments/style-rtl.css 284 B
build/block-library/blocks/latest-comments/style.css 284 B
build/block-library/blocks/latest-posts/editor-rtl.css 199 B
build/block-library/blocks/latest-posts/editor.css 198 B
build/block-library/blocks/latest-posts/style-rtl.css 447 B
build/block-library/blocks/latest-posts/style.css 446 B
build/block-library/blocks/list/style-rtl.css 88 B
build/block-library/blocks/list/style.css 88 B
build/block-library/blocks/media-text/editor-rtl.css 266 B
build/block-library/blocks/media-text/editor.css 263 B
build/block-library/blocks/media-text/style-rtl.css 493 B
build/block-library/blocks/media-text/style.css 490 B
build/block-library/blocks/more/editor-rtl.css 431 B
build/block-library/blocks/more/editor.css 431 B
build/block-library/blocks/navigation-link/editor-rtl.css 708 B
build/block-library/blocks/navigation-link/editor.css 706 B
build/block-library/blocks/navigation-link/style-rtl.css 115 B
build/block-library/blocks/navigation-link/style.css 115 B
build/block-library/blocks/navigation-submenu/editor-rtl.css 299 B
build/block-library/blocks/navigation-submenu/editor.css 299 B
build/block-library/blocks/navigation-submenu/view.min.js 375 B
build/block-library/blocks/navigation/editor-rtl.css 2.03 kB
build/block-library/blocks/navigation/editor.css 2.04 kB
build/block-library/blocks/navigation/style-rtl.css 1.93 kB
build/block-library/blocks/navigation/style.css 1.92 kB
build/block-library/blocks/navigation/view-modal.min.js 2.65 kB
build/block-library/blocks/navigation/view.min.js 395 B
build/block-library/blocks/nextpage/editor-rtl.css 395 B
build/block-library/blocks/nextpage/editor.css 395 B
build/block-library/blocks/page-list/editor-rtl.css 363 B
build/block-library/blocks/page-list/editor.css 363 B
build/block-library/blocks/page-list/style-rtl.css 175 B
build/block-library/blocks/page-list/style.css 175 B
build/block-library/blocks/paragraph/editor-rtl.css 157 B
build/block-library/blocks/paragraph/editor.css 157 B
build/block-library/blocks/paragraph/style-rtl.css 260 B
build/block-library/blocks/paragraph/style.css 260 B
build/block-library/blocks/post-author/style-rtl.css 175 B
build/block-library/blocks/post-author/style.css 176 B
build/block-library/blocks/post-comments-form/style-rtl.css 521 B
build/block-library/blocks/post-comments-form/style.css 521 B
build/block-library/blocks/post-comments/style-rtl.css 521 B
build/block-library/blocks/post-comments/style.css 521 B
build/block-library/blocks/post-excerpt/editor-rtl.css 73 B
build/block-library/blocks/post-excerpt/editor.css 73 B
build/block-library/blocks/post-excerpt/style-rtl.css 69 B
build/block-library/blocks/post-excerpt/style.css 69 B
build/block-library/blocks/post-featured-image/editor-rtl.css 721 B
build/block-library/blocks/post-featured-image/editor.css 721 B
build/block-library/blocks/post-featured-image/style-rtl.css 153 B
build/block-library/blocks/post-featured-image/style.css 153 B
build/block-library/blocks/post-template/editor-rtl.css 99 B
build/block-library/blocks/post-template/editor.css 98 B
build/block-library/blocks/post-template/style-rtl.css 323 B
build/block-library/blocks/post-template/style.css 323 B
build/block-library/blocks/post-terms/style-rtl.css 73 B
build/block-library/blocks/post-terms/style.css 73 B
build/block-library/blocks/post-title/style-rtl.css 80 B
build/block-library/blocks/post-title/style.css 80 B
build/block-library/blocks/preformatted/style-rtl.css 103 B
build/block-library/blocks/preformatted/style.css 103 B
build/block-library/blocks/pullquote/editor-rtl.css 198 B
build/block-library/blocks/pullquote/editor.css 198 B
build/block-library/blocks/pullquote/style-rtl.css 370 B
build/block-library/blocks/pullquote/style.css 370 B
build/block-library/blocks/pullquote/theme-rtl.css 167 B
build/block-library/blocks/pullquote/theme.css 167 B
build/block-library/blocks/query-pagination-numbers/editor-rtl.css 122 B
build/block-library/blocks/query-pagination-numbers/editor.css 121 B
build/block-library/blocks/query-pagination/editor-rtl.css 221 B
build/block-library/blocks/query-pagination/editor.css 211 B
build/block-library/blocks/query-pagination/style-rtl.css 234 B
build/block-library/blocks/query-pagination/style.css 231 B
build/block-library/blocks/query/editor-rtl.css 369 B
build/block-library/blocks/query/editor.css 369 B
build/block-library/blocks/quote/style-rtl.css 213 B
build/block-library/blocks/quote/style.css 213 B
build/block-library/blocks/quote/theme-rtl.css 223 B
build/block-library/blocks/quote/theme.css 226 B
build/block-library/blocks/read-more/style-rtl.css 132 B
build/block-library/blocks/read-more/style.css 132 B
build/block-library/blocks/rss/editor-rtl.css 202 B
build/block-library/blocks/rss/editor.css 204 B
build/block-library/blocks/rss/style-rtl.css 289 B
build/block-library/blocks/rss/style.css 288 B
build/block-library/blocks/search/editor-rtl.css 165 B
build/block-library/blocks/search/editor.css 165 B
build/block-library/blocks/search/style-rtl.css 397 B
build/block-library/blocks/search/style.css 398 B
build/block-library/blocks/search/theme-rtl.css 64 B
build/block-library/blocks/search/theme.css 64 B
build/block-library/blocks/separator/editor-rtl.css 140 B
build/block-library/blocks/separator/editor.css 140 B
build/block-library/blocks/separator/style-rtl.css 233 B
build/block-library/blocks/separator/style.css 233 B
build/block-library/blocks/separator/theme-rtl.css 194 B
build/block-library/blocks/separator/theme.css 194 B
build/block-library/blocks/shortcode/editor-rtl.css 474 B
build/block-library/blocks/shortcode/editor.css 474 B
build/block-library/blocks/site-logo/editor-rtl.css 759 B
build/block-library/blocks/site-logo/editor.css 759 B
build/block-library/blocks/site-logo/style-rtl.css 181 B
build/block-library/blocks/site-logo/style.css 181 B
build/block-library/blocks/site-tagline/editor-rtl.css 86 B
build/block-library/blocks/site-tagline/editor.css 86 B
build/block-library/blocks/site-title/editor-rtl.css 84 B
build/block-library/blocks/site-title/editor.css 84 B
build/block-library/blocks/social-link/editor-rtl.css 177 B
build/block-library/blocks/social-link/editor.css 177 B
build/block-library/blocks/social-links/editor-rtl.css 674 B
build/block-library/blocks/social-links/editor.css 673 B
build/block-library/blocks/social-links/style-rtl.css 1.37 kB
build/block-library/blocks/social-links/style.css 1.36 kB
build/block-library/blocks/spacer/editor-rtl.css 332 B
build/block-library/blocks/spacer/editor.css 332 B
build/block-library/blocks/spacer/style-rtl.css 48 B
build/block-library/blocks/spacer/style.css 48 B
build/block-library/blocks/table/editor-rtl.css 504 B
build/block-library/blocks/table/editor.css 504 B
build/block-library/blocks/table/style-rtl.css 625 B
build/block-library/blocks/table/style.css 625 B
build/block-library/blocks/table/theme-rtl.css 188 B
build/block-library/blocks/table/theme.css 188 B
build/block-library/blocks/tag-cloud/style-rtl.css 226 B
build/block-library/blocks/tag-cloud/style.css 227 B
build/block-library/blocks/template-part/editor-rtl.css 149 B
build/block-library/blocks/template-part/editor.css 149 B
build/block-library/blocks/template-part/theme-rtl.css 101 B
build/block-library/blocks/template-part/theme.css 101 B
build/block-library/blocks/text-columns/editor-rtl.css 95 B
build/block-library/blocks/text-columns/editor.css 95 B
build/block-library/blocks/text-columns/style-rtl.css 166 B
build/block-library/blocks/text-columns/style.css 166 B
build/block-library/blocks/verse/style-rtl.css 87 B
build/block-library/blocks/verse/style.css 87 B
build/block-library/blocks/video/editor-rtl.css 571 B
build/block-library/blocks/video/editor.css 572 B
build/block-library/blocks/video/style-rtl.css 173 B
build/block-library/blocks/video/style.css 173 B
build/block-library/blocks/video/theme-rtl.css 124 B
build/block-library/blocks/video/theme.css 124 B
build/block-library/common-rtl.css 993 B
build/block-library/common.css 990 B
build/block-library/editor-rtl.css 10.2 kB
build/block-library/editor.css 10.2 kB
build/block-library/index.min.js 176 kB
build/block-library/reset-rtl.css 478 B
build/block-library/reset.css 478 B
build/block-library/style-rtl.css 11.5 kB
build/block-library/style.css 11.5 kB
build/block-library/theme-rtl.css 689 B
build/block-library/theme.css 694 B
build/block-serialization-default-parser/index.min.js 1.12 kB
build/block-serialization-spec-parser/index.min.js 2.83 kB
build/blocks/index.min.js 47 kB
build/components/index.min.js 223 kB
build/components/style-rtl.css 15 kB
build/components/style.css 15 kB
build/compose/index.min.js 11.2 kB
build/core-data/index.min.js 14.5 kB
build/customize-widgets/index.min.js 11 kB
build/customize-widgets/style-rtl.css 1.39 kB
build/customize-widgets/style.css 1.39 kB
build/data-controls/index.min.js 663 B
build/data/index.min.js 8.66 kB
build/date/index.min.js 32 kB
build/deprecated/index.min.js 518 B
build/dom-ready/index.min.js 336 B
build/dom/index.min.js 4.58 kB
build/edit-navigation/index.min.js 15.8 kB
build/edit-navigation/style-rtl.css 4.04 kB
build/edit-navigation/style.css 4.05 kB
build/edit-post/classic-rtl.css 546 B
build/edit-post/classic.css 547 B
build/edit-post/index.min.js 30.1 kB
build/edit-post/style-rtl.css 7.18 kB
build/edit-post/style.css 7.18 kB
build/edit-site/index.min.js 47.4 kB
build/edit-site/style-rtl.css 8.02 kB
build/edit-site/style.css 8.01 kB
build/edit-widgets/index.min.js 16.3 kB
build/edit-widgets/style-rtl.css 4.4 kB
build/edit-widgets/style.css 4.39 kB
build/editor/index.min.js 38.5 kB
build/editor/style-rtl.css 3.71 kB
build/editor/style.css 3.71 kB
build/element/index.min.js 4.29 kB
build/escape-html/index.min.js 548 B
build/format-library/index.min.js 6.62 kB
build/format-library/style-rtl.css 571 B
build/format-library/style.css 571 B
build/hooks/index.min.js 1.66 kB
build/html-entities/index.min.js 454 B
build/i18n/index.min.js 3.79 kB
build/is-shallow-equal/index.min.js 535 B
build/keyboard-shortcuts/index.min.js 1.83 kB
build/keycodes/index.min.js 1.41 kB
build/list-reusable-blocks/index.min.js 1.75 kB
build/list-reusable-blocks/style-rtl.css 838 B
build/list-reusable-blocks/style.css 838 B
build/media-utils/index.min.js 2.94 kB
build/notices/index.min.js 957 B
build/nux/index.min.js 2.12 kB
build/nux/style-rtl.css 751 B
build/nux/style.css 749 B
build/plugins/index.min.js 1.98 kB
build/preferences/index.min.js 1.2 kB
build/primitives/index.min.js 949 B
build/priority-queue/index.min.js 611 B
build/react-i18n/index.min.js 704 B
build/react-refresh-entry/index.min.js 8.44 kB
build/react-refresh-runtime/index.min.js 7.31 kB
build/redux-routine/index.min.js 2.69 kB
build/reusable-blocks/index.min.js 2.24 kB
build/reusable-blocks/style-rtl.css 256 B
build/reusable-blocks/style.css 256 B
build/rich-text/index.min.js 11.2 kB
build/server-side-render/index.min.js 1.61 kB
build/shortcode/index.min.js 1.52 kB
build/token-list/index.min.js 668 B
build/url/index.min.js 1.99 kB
build/vendors/react-dom.min.js 38.5 kB
build/vendors/react.min.js 4.34 kB
build/viewport/index.min.js 1.08 kB
build/warning/index.min.js 280 B
build/widgets/index.min.js 7.21 kB
build/widgets/style-rtl.css 1.16 kB
build/widgets/style.css 1.16 kB
build/wordcount/index.min.js 1.07 kB

compressed-size-action

@ciampo
Copy link
Contributor Author

ciampo commented Mar 23, 2022

Quick update:

But the fact that I chose to refactor to TypeScript another test (packages/components/src/text/test/index.tsx) seems to cause errors when running npm run build:package-types . Do you have any ideas on why this may be happening?

I spent some time looking into these errors — it turns out that they are not caused by this PR, they were only surfaced by it.

This can be observed by checking out trunk, running npm run build:packages and inspecting the files that were causing errors earlier in this PR:

  • packages/components/build-types/utils/config-values.d.ts: on trunk this file actually contains a couple of circular dependency errors:
See screenshot

Screenshot 2022-03-23 at 10 17 23

  • packages/components/build-types/utils/colors-values.d.ts: in this file, we can observe that effectively the type of the COLORS object doesn't include the white key.

In both cases, I was finally able to solve the issue by using Object.assign instead of the { ...spread } syntax.

This should unlock further work on this PR (the CI checks should be able to build the project!). I will also look into addressing the feedback from this #39436 (comment)


Nonetheless, how can we make sure that the types that we generate when building our packages are error-free? The error that was surfaced by this PR is currently on trunk but it's not being caught.

@ciampo
Copy link
Contributor Author

ciampo commented Mar 31, 2022

Update:

I believe that this PR is ready for a final round of review if we think that this approach is good enough to move forward.

Here's a summary of the other approach that was discussed (click to explan)

To recap, the main alternative approach that was discussed was to rewrite all of the jest config to TypeScript (as also suggested previously in #39341 (comment)).

This wouldn't be a trivial task (for the best results, ts-jest should be used over Babel), but it would likely enable us to use most "first-party" types without having to explicitly get from definitely-typed and/or defining them in tsconfig.test.json.

It would also allow us to rewrite the custom toMatchStyleDiffSnapshot matcher in TypeScript and follow a similar approach to what is described in this article to define its type.

@ciampo ciampo marked this pull request as ready for review March 31, 2022 12:28
@dmsnell
Copy link
Member

dmsnell commented Mar 31, 2022

Thanks for engaging with my feedback. I don't feel like there's anything else I can contribute review-wise because I don't understand the implications fully of the changes to the main tsconfig.json config. It seems like it'll be worth a try if nobody else has any objections.

Copy link
Member

@mirka mirka left a comment

Choose a reason for hiding this comment

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

It took some futzing around for VS Code to acknowledge the toMatchStyleDiffSnapshot typing for me, but once it did, everything is working as expected 💥

I'm very happy about this, thanks for working hard on it!

Copy link
Member

@sirreal sirreal left a comment

Choose a reason for hiding this comment

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

I'll push changes with these suggestions.

typings/testing-library/index.d.ts Outdated Show resolved Hide resolved
typings/testing-library/index.d.ts Outdated Show resolved Hide resolved
Copy link
Member

@sirreal sirreal left a comment

Choose a reason for hiding this comment

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

I discovered a wrinkle while testing this out now. First, apply this patch:

diff --git a/tsconfig.test.json b/tsconfig.test.json
index 85ff605e1d..433b1274d4 100644
--- a/tsconfig.test.json
+++ b/tsconfig.test.json
@@ -1,6 +1,8 @@
 {
 	"extends": "./tsconfig.base.json",
 	"compilerOptions": {
+		"allowJs": false,
+		"checkJs": false,
 		"noEmit": true,
 		"emitDeclarationOnly": false,
 		"types": [

This seems straightforward. We only want to typecheck TypeScript test files so we change this from the settings in the extended config. Now let's compile the test project: node_modules/.bin/tsc --build tsconfig.test.json:

packages/components/src/text/test/index.tsx:10:24 - error TS7016: Could not find a declaration file for module '../../utils'. 'packages/components/src/utils/index.js' implicitly has an 'any' type.

10 import { COLORS } from '../../utils';
                          ~~~~~~~~~~~~~

packages/components/src/text/test/index.tsx:11:22 - error TS7016: Could not find a declaration file for module '../'. 'packages/components/src/text/index.js' implicitly has an 'any' type.

11 import { Text } from '../';
                        ~~~~~


Found 2 errors.

Oops 🙂

What's happening?

We expected to compile all the application code, that's why we added references to every single project. Then, the tests should discover and use the declarations that were generated.

What happened instead? The short version is that we're accessing files from tests like import { Text } from '../. No declaration file exists for the file, so tsc tries to build it. Even though we configured our project to only include files immediately under test directories, the compiler finds that import so it becomes part of the project and we try to build it.

As-is, this PR compiles all the projects in a first pass, then recompiles just a couple files (including application code) of the files that are part of the test dependency graph. That isn't what we intended at all!

I was hoping that this problem was limited to @wordpress/components because it's missing the types field in package.json that points to the build-types directory. Unfortunately that does not seem to be the case 😞 Because we're importing relative modules (../…) from inside the same package, TypeScript doesn't have a chance to resolve these files from the package's type declarations 😬

I'm not sure what the best way forward is right now, I need to think about it a bit and do some testing. I'd be happy to chat about the problem and discuss possible solutions.

@ciampo
Copy link
Contributor Author

ciampo commented Apr 5, 2022

Does it mean that, basically, a test written in TypeScript should have all of its local dependencies also written in TypeScript? Would adding // @ts-ignore at the start of these non-TS files help?

@sirreal
Copy link
Member

sirreal commented Apr 5, 2022

Does it mean that, basically, a test written in TypeScript should have all of its local dependencies also written in TypeScript?

No. The problem I'm highlighting is that:

  • We're compiling non-test source files twice (once for the project, and again as part of the test project).
  • We're not compiling the non-test source files according to their projects, but as part of the test project.

We expect to import .js files, but we'd like to use the declarations that were generated for them.

Would adding // @ts-ignore at the start of these non-TS files help?

No. It's possible it could make errors go away, but I think we'd just lose type information for those files (imports from those modules would become any) which is not desirable.

@sirreal
Copy link
Member

sirreal commented Apr 6, 2022

using the existing package's tsconfig.json and including the tests file to it?

I think that makes sense at this point. The main drawback is that we pollute the application code with test types (jest globals) but in practice that doesn't usually cause problems.

@ciampo
Copy link
Contributor Author

ciampo commented Apr 6, 2022

Alright, I'll proceed an implement this idea in the next days — of course feel free to propose other approaches if they come to mind!

@ciampo ciampo force-pushed the feat/typescript-unit-tests branch from e3fae6f to e0c3506 Compare April 19, 2022 21:27
@ciampo
Copy link
Contributor Author

ciampo commented Apr 19, 2022

Rebased, and pushed changes to move away from a dedicated tsconfig.test.json and re-use the existing components package's tsconfig.json.

@sirreal and @mirka , could you have another look?

@ciampo ciampo requested review from sirreal and mirka April 19, 2022 21:29
Copy link
Member

@sirreal sirreal left a comment

Choose a reason for hiding this comment

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

This looks good to me, thanks @ciampo!

@ciampo ciampo merged commit 1ef4733 into trunk Apr 20, 2022
@ciampo ciampo deleted the feat/typescript-unit-tests branch April 20, 2022 13:16
@github-actions github-actions bot added this to the Gutenberg 13.1 milestone Apr 20, 2022
@ciampo ciampo changed the title Add new TypeScript project for unit tests Components: Add support for TypeScript unit tests Apr 21, 2022
@ciampo ciampo added the [Package] Components /packages/components label Apr 21, 2022
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Framework Issues related to broader framework topics, especially as it relates to javascript [Package] Components /packages/components [Type] Automated Testing Testing infrastructure changes impacting the execution of end-to-end (E2E) and/or unit tests. [Type] Build Tooling Issues or PRs related to build tooling
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants