dotCMS / dotCMS/core

Finish strict mode: the last 11 core-web projects, then flip tsconfig.base.json

Open
#37,121 0 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

dotCMS : Technical Debt Team : Falcon Type : Task
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 tracksdotcms-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 (not tsconfig.spec.json, not the base)
  • Each project's tsconfig.lib.json and tsconfig.spec.json at 0 errors, verified by exit status
  • A decision recorded for apps/mcp-server: bring it in, or document why it stays excluded
  • tsconfig.base.json flipped to "strict": true once the above is green
  • The now-redundant per-project "strict": true lines either removed or deliberately kept, with the choice noted
  • nx run-many -t build test lint no worse than baseline

Watch out for

The measurement traps in core-web/CLAUDE.mdTypeScript Strict Mode all apply. The two most likely to bite here:

  • libs/sdk/vue and libs/sdk/ai are Vite projects. Their builds use esbuild and skip type checking, so the build target is not the gate — use the inferred typecheck target.
  • A duplicate key wins silently. Read the whole compilerOptions block after adding flags; two projects on this branch were closed as strict while a later "strict": false in the same object made them nothing of the kind.

Notes

Related: #35932 (rollout, complete), #36957 (final PR), #37120 (strictTemplates, separate gate).

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. 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

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.