Finish strict mode: the last 11 core-web projects, then flip tsconfig.base.json
Nobody has claimed this yet.
- Dominant language
- Java
- Stars
- 970
- Forks
- 486
- Avg merge
- 3d 33m
- Merged PRs (30d)
- 170
Description
Task
Bring the last 11 core-web projects onto the six strict-mode flags, then retire the workspace-level opt-out.
The strict-mode rollout (#35932) is complete for the 44 projects it tracks — dotcms-ui, the last one, landed in #36957. These 11 were never in that epic's scope: one is excluded on purpose, five were created after the epic was written, and five are one or two flags short.
Current state (measured at 72f10fe5ac)
| Project | Missing flags |
|---|---|
libs/image-editor |
forceConsistentCasingInFileNames |
libs/portlets/dot-agents |
forceConsistentCasingInFileNames |
libs/portlets/dot-publishing-queue |
strict, noPropertyAccessFromIndexSignature |
libs/portlets/dot-users |
strict, noPropertyAccessFromIndexSignature |
libs/portlets/dot-velocity-playground |
strict, noPropertyAccessFromIndexSignature |
libs/sdk/vue |
5 of 6 |
apps/mcp-server |
5 of 6 — explicitly excluded from #35932's scope |
apps/ai-evals |
all six |
libs/ai-ui |
all six |
libs/dot-layout-grid |
all six |
libs/sdk/ai |
all six |
The two projects missing only forceConsistentCasingInFileNames and the three missing strict are the cheapest wins and should go first.
Why tsconfig.base.json still has "strict": false
Deliberate, and documented in both #35932 and core-web/CLAUDE.md: the rollout never flips it globally, so each project opts in via its own tsconfig.json and each PR stays small.
But its meaning has changed. When the epic started, that false was the global policy. Now that 44 projects opt in, it only shields these 11. Once they are done, flipping the base to "strict": true makes the per-project "strict": true redundant and removes the last place where a new project can be created non-strict by default — which is how five of the eleven above came to exist.
Acceptance Criteria
- All six flags in each of the 10 in-scope projects' own
tsconfig.json(nottsconfig.spec.json, not the base) - Each project's
tsconfig.lib.jsonandtsconfig.spec.jsonat 0 errors, verified by exit status - A decision recorded for
apps/mcp-server: bring it in, or document why it stays excluded -
tsconfig.base.jsonflipped to"strict": trueonce the above is green - The now-redundant per-project
"strict": truelines either removed or deliberately kept, with the choice noted -
nx run-many -t build test lintno worse than baseline
Watch out for
The measurement traps in core-web/CLAUDE.md → TypeScript Strict Mode all apply. The two most likely to bite here:
libs/sdk/vueandlibs/sdk/aiare Vite projects. Their builds use esbuild and skip type checking, so thebuildtarget is not the gate — use the inferredtypechecktarget.- A duplicate key wins silently. Read the whole
compilerOptionsblock after adding flags; two projects on this branch were closed as strict while a later"strict": falsein the same object made them nothing of the kind.
Notes
Related: #35932 (rollout, complete), #36957 (final PR), #37120 (strictTemplates, separate gate).
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Read core-web/CLAUDE.md's TypeScript Strict Mode guidance, then inspect each listed project's own tsconfig.json along with tsconfig.lib.json and tsconfig.spec.json. Start with the two casing-only projects and the three missing strict, checking compilerOptions for duplicate keys; use the inferred typecheck target for libs/sdk/vue and libs/sdk/ai. Done means the ten in-scope projects pass their checks, apps/mcp-server has a recorded decision, and nx run-many -t build test lint is no worse than baseline before updating tsconfig.base.json.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- typescript, vite
- Domain
- build-system, testing-qa, tooling
- Issue type
- Refactor
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Quiet
- Clarity
- Clearly specified
- Newbie friendliness
- 52/100