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

Codemod: Only remove types when they are unused #30644

Merged
merged 1 commit into from
Feb 26, 2025

Conversation

yannbf
Copy link
Member

@yannbf yannbf commented Feb 24, 2025

Closes #

What I did

This PR adds extra logic to type removal so that the AST is traversed first to check whether the types are being used.
Additionally it adds unit tests to functions which didn't have tests before.

Checklist for Contributors

Testing

The changes in this PR are covered in the following automated tests:

  • stories
  • unit tests
  • integration tests
  • end-to-end tests

Manual testing

This section is mandatory for all contributions. If you believe no manual test is necessary, please state so explicitly. Thanks!

Documentation

  • Add or update documentation reflecting your changes
  • If you are deprecating/removing a feature, make sure to update
    MIGRATION.MD

Checklist for Maintainers

  • When this PR is ready for testing, make sure to add ci:normal, ci:merged or ci:daily GH label to it to run a specific set of sandboxes. The particular set of sandboxes can be found in code/lib/cli-storybook/src/sandbox-templates.ts

  • Make sure this PR contains one of the labels below:

    Available labels
    • bug: Internal changes that fixes incorrect behavior.
    • maintenance: User-facing maintenance tasks.
    • dependencies: Upgrading (sometimes downgrading) dependencies.
    • build: Internal-facing build tooling & test updates. Will not show up in release changelog.
    • cleanup: Minor cleanup style change. Will not show up in release changelog.
    • documentation: Documentation only changes. Will not show up in release changelog.
    • feature request: Introducing a new feature.
    • BREAKING CHANGE: Changes that break compatibility in some way with current major version.
    • other: Changes that don't fit in the above categories.

🦋 Canary release

This PR does not have a canary release associated. You can request a canary release of this pull request by mentioning the @storybookjs/core team here.

core team members can create a canary release here or locally with gh workflow run --repo storybookjs/storybook canary-release-pr.yml --field pr=<PR_NUMBER>

name before after diff z %
createSize 0 B 0 B 0 B - -
generateSize 80.6 MB 80.6 MB 0 B 1.45 0%
initSize 80.6 MB 80.6 MB 0 B 1.45 0%
diffSize 97 B 97 B 0 B - 0%
buildSize 7.32 MB 7.32 MB 0 B 2.98 0%
buildSbAddonsSize 1.9 MB 1.9 MB 0 B -0.06 0%
buildSbCommonSize 195 kB 195 kB 0 B - 0%
buildSbManagerSize 1.88 MB 1.88 MB 0 B 2.97 0%
buildSbPreviewSize 0 B 0 B 0 B - -
buildStaticSize 0 B 0 B 0 B - -
buildPrebuildSize 3.97 MB 3.97 MB 0 B 2.99 0%
buildPreviewSize 3.34 MB 3.34 MB 0 B 0.5 0%
testBuildSize 0 B 0 B 0 B - -
testBuildSbAddonsSize 0 B 0 B 0 B - -
testBuildSbCommonSize 0 B 0 B 0 B - -
testBuildSbManagerSize 0 B 0 B 0 B - -
testBuildSbPreviewSize 0 B 0 B 0 B - -
testBuildStaticSize 0 B 0 B 0 B - -
testBuildPrebuildSize 0 B 0 B 0 B - -
testBuildPreviewSize 0 B 0 B 0 B - -
name before after diff z %
createTime 10.1s 8.5s -1s -560ms -0.57 -18.2%
generateTime 20.4s 17.5s -2s -835ms -1.2 -16.1%
initTime 4.5s 4.6s 174ms -0.03 3.7%
buildTime 9.1s 8.3s -760ms -1.04 -9.1%
testBuildTime 0ms 0ms 0ms - -
devPreviewResponsive 5.4s 5.7s 301ms 0.24 5.3%
devManagerResponsive 5.2s 5.4s 259ms 0.43 4.7%
devManagerHeaderVisible 756ms 852ms 96ms 0.83 11.3%
devManagerIndexVisible 764ms 939ms 175ms 1.47 🔺18.6%
devStoryVisibleUncached 1.8s 2.1s 285ms 0 13.4%
devStoryVisible 851ms 941ms 90ms 1.29 🔺9.6%
devAutodocsVisible 756ms 868ms 112ms 1.21 12.9%
devMDXVisible 697ms 821ms 124ms 1 15.1%
buildManagerHeaderVisible 760ms 753ms -7ms -0.16 -0.9%
buildManagerIndexVisible 831ms 756ms -75ms -0.31 -9.9%
buildStoryVisible 745ms 737ms -8ms -0.06 -1.1%
buildAutodocsVisible 558ms 667ms 109ms 0.6 16.3%
buildMDXVisible 616ms 656ms 40ms 0.57 6.1%

Greptile Summary

Based on the provided information, I'll create a concise summary of this PR's changes focusing on the type management improvements in Storybook's codemod utilities.

Improved type import management in Storybook's codemod utilities by adding AST traversal to only remove unused type imports.

  • Added csf-factories-utils.test.ts with comprehensive test coverage for type import cleanup and export declarations
  • Modified cleanupTypeImports in csf-factories-utils.ts to track used identifiers before removing imports
  • Reordered type cleanup operations in story-to-csf-factory.ts to check type usage before removal
  • Added error handling for unsupported TypeScript syntax patterns in AST traversal

Copy link
Contributor

@greptile-apps greptile-apps bot left a comment

Choose a reason for hiding this comment

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

4 file(s) reviewed, 3 comment(s)
Edit PR Review Bot Settings | Greptile

Comment on lines +12 to +23
expect.addSnapshotSerializer({
serialize: (val: any) => {
if (typeof val === 'string') {
return val;
}
if (typeof val === 'object' && val !== null) {
return JSON.stringify(val, null, 2);
}
return String(val);
},
test: (_val) => true,
});
Copy link
Contributor

Choose a reason for hiding this comment

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

style: Custom serializer always returns true for test() which may cause unexpected serialization of values. Consider adding more specific type checking.

Comment on lines +78 to +80
const programNode = parseCodeToProgramNode(code);
const cleanedNodes = cleanupTypeImports(programNode, ['Preview']);

Copy link
Contributor

Choose a reason for hiding this comment

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

logic: Test case uses 'Preview' in disallowList but the import is a namespace import which wouldn't contain 'Preview' directly. Consider using a more relevant test case.

return !disallowList.includes(specifier.imported.name);
const name = specifier.imported.name;
// Only remove if disallowed AND unused
return !disallowList.includes(name) || usedIdentifiers.has(name);
Copy link
Contributor

Choose a reason for hiding this comment

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

logic: The OR condition here means a type will be kept if it's used, even if disallowed. Verify this is the intended behavior.

Copy link

nx-cloud bot commented Feb 24, 2025

View your CI Pipeline Execution ↗ for commit 694948c.

Command Status Duration Result
nx run-many -t build --parallel=3 ✅ Succeeded 2m 2s View ↗

☁️ Nx Cloud last updated this comment at 2025-02-24 09:44:40 UTC

@yannbf yannbf added the patch:yes Bugfix & documentation PR that need to be picked to main branch label Feb 26, 2025
@yannbf yannbf merged commit d5c5962 into next Feb 26, 2025
65 of 70 checks passed
@yannbf yannbf deleted the yann/only-remove-types-when-unused branch February 26, 2025 15:46
kasperpeulen pushed a commit that referenced this pull request Feb 27, 2025
…n-unused

Codemod: Only remove types when they are unused
(cherry picked from commit d5c5962)
@github-actions github-actions bot mentioned this pull request Feb 27, 2025
7 tasks
@github-actions github-actions bot added the patch:done Patch/release PRs already cherry-picked to main/release branch label Feb 27, 2025
@github-actions github-actions bot mentioned this pull request Feb 27, 2025
37 tasks
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug ci:normal codemods patch:done Patch/release PRs already cherry-picked to main/release branch patch:yes Bugfix & documentation PR that need to be picked to main branch
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants