Feature/security#231
Conversation
…packageManager in package.json - Install Yarn 4 in the project - Update .gitignore - Update README
- Upgrade direct deps for security baseline: - @dhis2/app-runtime to 3.12.0 - @eyeseetea/d2-api to 1.16.0 - @eyeseetea/feedback-component to 0.2.0 - Update lockfile after dependency changes - Untrack .yarn/install-state.gz and keep it ignored - Add safe fallback for zip name in build script to avoid unbound npm_package_zipName
… clients - Upgrade direct dependencies with available security fixes: - file-type -> 21.3.2 - jszip -> 3.8.0 - postcss-rtl -> 2.0.0 - Add/adjust resolutions for vulnerable transitive deps: - axios 1.13.5 - qs 6.14.2 - lodash 4.17.23 - glob-parent 5.1.2 - node-fetch 2.6.7 - Add @types/qs for TypeScript compatibility - Migrate file-type usage to the new API (fileTypeFromBuffer) - Keep styled-jsx on 4.0.1 to stay compatible with @dhis2/ui 7.4.3 - Remove unused dead code: - src/data/clients/http/AxiosHttpClient.ts - src/data/clients/storage/ConstantStorageClient.ts
| }, | ||
| "/api": { | ||
| ...shared, | ||
| rewrite: (p: string) => p.replace(/^\/api/, "/api"), |
Check warning
Code scanning / CodeQL
Replacement of a substring with itself Medium
Show autofix suggestion
Hide autofix suggestion
Copilot Autofix
AI about 1 month ago
In general, the way to fix this problem is to avoid performing a replacement that produces exactly the same string; instead, either (a) adjust the replacement so it transforms the string as intended, or (b) remove the replacement entirely if no transformation is required. This eliminates both the useless operation and the risk that the code is hiding a logic error.
Here, we want the best fix that does not change existing behavior. Right now, for any path p starting with /api, the expression p.replace(/^\/api/, "/api") returns p unchanged. Removing the rewrite function for the /api entry will preserve that behavior: by default Vite’s proxy will forward the path as-is when no rewrite is specified. This also clearly communicates that /api is intended to be proxied without alteration, and it removes the specific pattern that CodeQL is warning about.
Concretely, in vite.config.ts, within getProxy, in the returned object at lines 96–109, we will edit the /api section. We will delete the rewrite property so that the block only contains the spread of shared. No new methods or imports are required, and no other sections of the file need to be changed.
| @@ -104,7 +104,6 @@ | ||
| }, | ||
| "/api": { | ||
| ...shared, | ||
| rewrite: (p: string) => p.replace(/^\/api/, "/api"), | ||
| }, | ||
| }; | ||
| } |
BundleMonNo change in files bundle size Groups updated (1)
Final result: ✅ View report in BundleMon website ➡️ |
📌 References
📝 Implementation
🛡️ Vulnerabilities fixed
High
1.13.5(+@eyeseetea/d2-apiupgraded to1.16.0)6.14.216.5.3and new issue in21.3.1-> upgraded to21.3.2@eyeseetea/d2-apiupgradeMedium (resolutions / upgrades)
4.17.235.1.22.6.73.8.0postcss-rtl1.x): ReDoS / Input Validation -> upgradedpostcss-rtlto2.0.0Direct upgrade
@dhis2/app-runtime:3.2.4->3.12.0@eyeseetea/d2-api:1.9.2->1.16.0@eyeseetea/feedback-component:0.1.3-beta.3->0.2.0These issues still appear as no direct upgrade or patch in the current dependency tree.
6.26.0(SNYK-JS-BABELTRAVERSE-5962463)@dhis2/d2-ui-forms -> d2 -> babel-jest -> babel-plugin-istanbul -> istanbul-lib-instrument -> babel-traverse.1.8.5(SNYK-JS-BRACES-6838727/npm:braces:20180219)d2-ui-forms/d2/.../micromatch).10.6.0(SNYK-JS-I18NEXT-1065979/575536/585930)19.x), but no direct upgrade path with current@dhis2/d2-i18n@1.1.3chain.1.0.6(SNYK-JS-INFLIGHT-6095116)@dhis2/d2-i18n-generate -> rimraf -> glob -> inflight.12.3.2(SNYK-JS-MARKDOWNIT-6483324)13.0.2), but no direct upgrade path from current chain (d2-ui-forms -> d2 -> jsdoc -> markdown-it).2.3.11(SNYK-JS-MICROMATCH-6838728)4.0.8), but blocked by legacy dependency chain.2.1.0(SNYK-JS-NODEGETTEXT-6100943)@dhis2/d2-i18n-extract -> i18next-conv -> node-gettext.2.6.2(SNYK-JS-TAFFYDB-2992450)d2-ui-forms -> d2 -> jsdoc -> taffydb).Used plan: Migrate to Yarn 4 with coexistence in other projects
Current situation (example for this repo)
.yarnrcor.npmrc; there is nopackageManagerorenginesin package.json."$": "link:./src"in package.json; thelink:protocol is compatible with Yarn 4.How coexistence works
Corepack (included in Node 16.10+) allows you to pin the Yarn version per project using the
packageManagerfield inpackage.json. You don’t need to change the global Yarn installation on your machine.Typical setup when you work with multiple projects:
yarninstalled withnpm -g, uninstall it withnpm uninstall -g yarn).packageManager:Result:
yarnuses Yarn 4.12.0 (as specified inpackageManager).packageManager,yarnuses Yarn 1.22.22 (or whatever you activated with Corepack).flowchart LR subgraph proyecto_yarn4 [This project] A[packageManager: yarn@4.x] end subgraph otros [Other projects] C[No packageManager or yarn@1] end Corepack[Corepack] Corepack --> A Corepack --> Cyarnwill use the version declared inpackageManager(Yarn 4) via Corepack, without needing to vendor Yarn into.yarn/releases.packageManageror have a different version, they will keep using your global Yarn (1.x or whatever they use).Requirement: have Corepack enabled once on the machine (
corepack enable). There is no need to install Yarn 4 globally.Implementation steps
1. One-time machine setup (per developer)
Run this once on your machine (not per project), to let Corepack manage Yarn versions and keep Yarn 1.x as the default for old projects:
After this, any project without
packageManagerwill use Yarn 1.22.22, and projects withpackageManager: "yarn@4.x.x"will use Yarn 4 via Corepack.2. Migrate this project to Yarn 4
Recommended order:
packageManagerin package.json with an exact version (for example"yarn@4.12.0"). This way Corepack already knows which version to use before.yarn/releasesexists.yarn set versionruns with the right major):corepack use yarn@4.12.0 yarn --version # should print 4.12.0.yarnrc.ymland updates Yarn metadata for the project via Corepack):yarn set version 4.12.0node_modules(as now) and avoid large changes in tooling (Vite, etc.), in .yarnrc.yml (created withset version) keep or add:The lockfile will be converted to Yarn 4 format (yarn.lock with a
__metadataheader).There is no need to touch the
"$": "link:./src"dependency; thelink:protocol is still supported.3. Update .gitignore
Add typical Yarn 4 entries so cache and installation state are not committed:
.yarn/cache(package cache).yarn/install-state.gz.yarn/unplugged.yarn/build-state.yml.pnp.*(if PnP is used in the future)4. Scripts and lifecycle
yarn localize): Still supported in Yarn 4; no changes required.pre/posthooks that need to be rewritten according to the migration guide.5. Documentation
In README.md you can add a short section under Setup to explain that the project uses Yarn 4 + Corepack and how to fix conflicts with a global Yarn 1. For example:
This project uses Yarn 4 managed by Corepack and declares:
If you have Yarn 1 globally and see a packageManager error
If running
yarnshows an error like:do the following once on your machine:
Then, in this project (normal case, once Corepack is enabled):
If for some reason
yarn --versionstill shows1.xinside this repo, you can force Yarn 4 explicitly:corepack use yarn@4.12.0 yarn --version # should now print 4.12.0 yarn install📹 Screenshots/Screen capture
🔥 Testing