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

feat: jsx migration script #869

Merged
merged 19 commits into from
Aug 29, 2024
Merged

feat: jsx migration script #869

merged 19 commits into from
Aug 29, 2024

Conversation

KaiVandivier
Copy link
Contributor

@KaiVandivier KaiVandivier commented Aug 7, 2024

LIBS-657

The script:

  1. Scans .js files in /src for JSX syntax, then renames them to .jsx
    1. Question: do any other dirs need scanning? I added the option to add a custom glob string (not exactly a normal shell glob)
    2. .ts files aren't handled; it's assumed that TS enforces using .tsx extensions for files with JSX syntax... although it would be easy to add
  2. Updates import paths to renamed files in src
  3. Updates entryPoints values in d2.config.js, if needed

I started this trying to use regexes to detect JSX syntax and import statements, but it ended up being best to use an AST parser. It's a bit slower, but still only took a few seconds for the thousands of JS files in the capture app, for example

Looking for input:

  1. Is this the right place/repo for this script?
  2. Is there a better name for it than jsx-migration?

Recommended testing

You can test this out in an app (or more) of your choice -- here are a few that I've tried:

  1. Data Visualizer -- has exports
  2. Scheduler -- uses imports without file extensions; can test out the skipUpdatingImportsWithoutExtension flag. Somewhere there's a file that has two imports from the same file (separated to group the objects conceptually) -- this is a test of the import replacement logic
  3. Capture -- uses Flow & loads of files

Steps:

  1. Checkout this branch in app-platform
  2. In your app(s) of choice, install the @dhis2/cli-app-scripts alpha & deduplicate app-runtime: yarn add @dhis2/cli-app-scripts@alpha && npx yarn-deduplicate yarn.lock && yarn
    3. Watch out for any other resolutions on relevant libs: cli-app-scripts, app-runtime
  3. Since a lot of files may be changed, it's nice to take advantage of version control to undo this step if it doesn't go as intended. In VSCode, I like to stage files that I want to keep around like package.json and yarn.lock before running the script. Then, if I want to undo the results of the script, I can click the "Discard All Changes" undo arrow in the Source Control tab on the Unstaged Changes section and go back to the beginning (see video below)
  4. Use a path to the CLI bin to run the local version of the script, e.g. ../app-platform/cli/bin/d2-app-scripts jsx-migration
  5. You can test out some flags:
    7. --debug to get detailed logs
    8. --globString "..." to test out a custom glob (the default is src/**/*.js)
    9. --skipUpdatingImportsWithoutExtension -- maybe self-explanatory (I figure some repos will want to leave the imports without file extensions. Functionally, this works fine with Vite. In some repos though, this creates linting complaints, but I'm sure the linting rules can be updated)
  6. Run yarn start to make sure the app works

VSCode Source control:

source-control.mov

@KaiVandivier KaiVandivier marked this pull request as ready for review August 15, 2024 12:50
@KaiVandivier KaiVandivier requested review from amcgee and kabaros August 15, 2024 13:31
@amcgee
Copy link
Member

amcgee commented Aug 15, 2024

What do you think about creating a new codemod command namespace? So something like....

d2-app-scripts migrate <name-of-migration>
d2-app-scripts migrate js-to-jsx

@kabaros kabaros requested a review from a team August 27, 2024 11:33
Copy link
Contributor

@kabaros kabaros left a comment

Choose a reason for hiding this comment

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

💯 tested this on few apps (login, data-entry and app-management) and it works as expected. I wonder if the docs here are a good place to document the caveats (i.e. failure for some import *...) and any other things that might need to be checked manually.

@KaiVandivier
Copy link
Contributor Author

Thanks for the review!

The import * from ... quirk is related to Vite's module resolution I think, rather than the filename migration -- since that's a node module, it'd be out of the scope this script, which is just renaming files and updating local imports

That said, it'll definitely be documented in the larger Vite migration documentation 👍

@KaiVandivier KaiVandivier merged commit 7764f49 into alpha Aug 29, 2024
6 checks passed
@KaiVandivier KaiVandivier deleted the jsx-migration-script branch August 29, 2024 14:35
dhis2-bot added a commit that referenced this pull request Aug 29, 2024
# [12.0.0-alpha.11](v12.0.0-alpha.10...v12.0.0-alpha.11) (2024-08-29)

### Features

* jsx migration script ([#869](#869)) ([7764f49](7764f49))
@dhis2-bot
Copy link
Contributor

🎉 This PR is included in version 12.0.0-alpha.11 🎉

The release is available on:

Your semantic-release bot 📦🚀

dhis2-bot added a commit that referenced this pull request Dec 13, 2024
# [12.0.0](v11.7.5...v12.0.0) (2024-12-13)

### Bug Fixes

* **deps:** upgrade app-runtime and ui ([#895](#895)) ([8ed0ec3](8ed0ec3))
* **deps:** upgrade react to 18 in example apps ([#900](#900)) ([7fd16d7](7fd16d7))
* **deps:** use npm v6 before publishing ([01ad502](01ad502))
* **init:** update bootstrap script branch ([#896](#896)) ([33c261a](33c261a))
* **plugin:** clean up resize observer and handle sonarqube warnings ([#898](#898)) ([f113dd5](f113dd5))
* alerts from plugins [LIBS-695] ([#881](#881)) ([21be0d2](21be0d2))
* allow serving files from cwd node_modules ([0233949](0233949))
* base url env & refactor [LIBS-635] ([#872](#872)) ([7f19259](7f19259))
* bump ui library ([#882](#882)) ([1ae9569](1ae9569))
* clear only required build dirs ([#894](#894)) ([179305f](179305f))
* env refactor for Vite wrap-up [LIBS-690] ([#889](#889)) ([84da4e6](84da4e6))
* injectPrecacheManifest warning logging ([a0d266e](a0d266e))
* normalize to .js extensions when compiling libraries ([#893](#893)) ([58b33a8](58b33a8))
* **service-worker:** handle undefined config vars in injectPrecacheManifest ([a90a4e0](a90a4e0))
* correct app shell paths ([#883](#883)) ([a1af71c](a1af71c))
* handle jsx in js support [LIBS-633] ([#871](#871)) ([595a35d](595a35d))
* increase precache max file size to 3 MB ([b20ed22](b20ed22))
* remove custom eslint from TS template ([71cef4b](71cef4b))
* update deps ([1e7ce93](1e7ce93))
* update workbox deps to avoid deprecation warnings ([9a81c4a](9a81c4a))
* use strings for 'boolean' env vars ([eaf5e66](eaf5e66))

### Features

* create initial TS template ([#868](#868)) ([2795f79](2795f79))
* enable HMR for .js files ([5f4683c](5f4683c))
* handle plugins with Vite [LIBS-610] ([#863](#863)) ([ca5be0d](ca5be0d))
* jsx migration script ([#869](#869)) ([7764f49](7764f49))
* migrate snap files too ([#878](#878)) ([521f483](521f483))
* replace CRA with Vite [LIBS-598] ([#847](#847)) ([3dd0e59](3dd0e59))
* upgrade react to v18 ([#876](#876)) ([77ecf10](77ecf10))
* **init:** set direction: 'auto' and import locales for new apps [LIBS-645] ([#867](#867)) ([4eda4a9](4eda4a9))

### BREAKING CHANGES

* require react version 18

* fix: pin react version to 18

* test: update test and test libraries for react 18
* Supported Node versions are 18.x or 20+

* ci: upgrade Node version

* fix: always add PWA_ENABLED to app env for better static analysis

* chore: pause precache manifest injection

* fix: building SW without CRA

* chore: comment update

* fix: group moment locales in their own dir

* refactor: clean up precache injection

* fix: locale utils and handling moment in jest

* fix: compile correctly after merging changes

* chore: comment in compile.js

* chore: some clean-up

* chore: comments

* fix: use port 3000 for the dev server

* fix: improve moment locale chunk naming

* chore: remove CRA

* fix: use mjs build of Vite

* fix: bump cli-style for CRA fix

* feat: use interactive dev server output from Vite

* fix: make dev server port configurable

* chore: remove old index.html

* fix: env tweaks
@dhis2-bot
Copy link
Contributor

🎉 This PR is included in version 12.0.0 🎉

The release is available on:

Your semantic-release bot 📦🚀

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants