Skip to content

build(eslint-config-fluid): consolidate custom rules into config package - #27943

Merged
Alex Villarreal (alexvy86) merged 8 commits into
microsoft:mainfrom
alexvy86:alexvy86-merge-eslint-packages
Aug 18, 2026
Merged

build(eslint-config-fluid): consolidate custom rules into config package#27943
Alex Villarreal (alexvy86) merged 8 commits into
microsoft:mainfrom
alexvy86:alexvy86-merge-eslint-packages

Conversation

@alexvy86

@alexvy86 Alex Villarreal (alexvy86) commented Aug 12, 2026

Copy link
Copy Markdown
Contributor

Description

Moves the custom Fluid ESLint rules into @fluidframework/eslint-config-fluid, removing the separate @fluid-internal/eslint-plugin-fluid package and release pipeline. Existing @fluid-internal/fluid/* rule names are preserved, so consumers of the shared config do not need to migrate rule overrides or suppression comments.

The config package is updated to 14.1.0 and now owns the rule dependencies, documentation, and ESLint 8/9 test coverage. Repository package metadata and pipeline-trigger guidance no longer reference the removed plugin.

Implements AB#79903.

Reviewer Guidance

The review process is outlined on this wiki page.

The npm deprecation of @fluid-internal/eslint-plugin-fluid should happen after @fluidframework/eslint-config-fluid 14.1.0 is published.

Move the custom Fluid ESLint rules and their tests into eslint-config-fluid, then remove the standalone plugin package and release metadata.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

Copilot-Session: dd9688d7-f485-461a-9a13-1c3ef9f2322a
Copilot AI lite review requested due to automatic review settings August 12, 2026 20:41
@github-actions github-actions Bot added area: tools area: build Build related issues area: repo Repo related work area: website base: main PRs targeted against main branch labels Aug 12, 2026
@github-actions

github-actions Bot commented Aug 12, 2026

Copy link
Copy Markdown
Contributor

Hi! Thank you for opening this PR. Want me to review it?

Based on the diff (6832 lines, 64 files), I've queued these reviewers:

  • Correctness — logic errors, race conditions, lifecycle issues
  • Security — vulnerabilities, secret exposure, injection
  • API Compatibility — breaking changes, release tags, type design
  • Performance — algorithmic regressions, memory leaks
  • Testing — coverage gaps, hollow tests

How this works

  • Adjust the reviewer set by ticking/unticking boxes above. Reviewer toggles alone don't trigger anything.

  • Tick Start review below to dispatch the review fleet.

  • After review finishes, tick Start review again to request another run — it auto-resets after each dispatch.

  • This comment updates as new commits land; your reviewer selections are preserved.

  • Start review

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

This PR consolidates the custom Fluid ESLint rules into @fluidframework/eslint-config-fluid, removing the separate @fluid-internal/eslint-plugin-fluid package and its release pipeline while preserving the existing @fluid-internal/fluid/* rule namespace for consumers.

Changes:

  • Removes the @fluid-internal/eslint-plugin-fluid package, build pipeline, and related repo metadata references.
  • Adds the custom rules (and supporting utilities) directly under common/build/eslint-config-fluid/rules/ with a fluidPlugin.cjs registration shim.
  • Expands ESLint 8/9 test coverage in eslint-config-fluid with rule fixtures and mocha tests.

Reviewed changes

Copilot reviewed 28 out of 64 changed files in this pull request and generated 1 comment.

Show a summary per file
File Description
tools/pipelines/build-eslint-plugin-fluid.yml Removes the ADO pipeline for the deleted eslint plugin package.
PACKAGES.md Removes the plugin package from the documented package list.
layerInfo.json Removes the plugin from layer/package metadata.
fluidBuild.config.cjs Removes plugin package path and related config references.
common/build/eslint-plugin-fluid/README.md Deletes removed plugin package documentation.
common/build/eslint-plugin-fluid/prettier.config.cjs Deletes removed plugin package prettier config.
common/build/eslint-plugin-fluid/pnpm-workspace.yaml Deletes removed plugin package workspace workaround file.
common/build/eslint-plugin-fluid/package.json Deletes removed plugin package manifest.
common/build/eslint-plugin-fluid/mocha-multi-reporter-config.json Deletes removed plugin package mocha reporter config.
common/build/eslint-plugin-fluid/LICENSE Deletes removed plugin package license file.
common/build/eslint-plugin-fluid/index.js Deletes removed plugin package entrypoint.
common/build/eslint-plugin-fluid/DEV.md Deletes removed plugin package dev/publishing guide.
common/build/eslint-plugin-fluid/CHANGELOG.md Deletes removed plugin package changelog.
common/build/eslint-plugin-fluid/.npmignore Deletes removed plugin package npm ignore file.
common/build/eslint-plugin-fluid/.mocharc.json Deletes removed plugin package mocha config.
common/build/eslint-config-fluid/src/test/rules/test-cases/tsconfig.json Adds TS config for compiling rule test fixtures.
common/build/eslint-config-fluid/src/test/rules/test-cases/no-unchecked-record-access/undefinableIndexedRecord.ts Adds fixture coverage for no-unchecked-record-access “ok” cases.
common/build/eslint-config-fluid/src/test/rules/test-cases/no-unchecked-record-access/staticTypes.ts Adds fixture coverage for static-type cases.
common/build/eslint-config-fluid/src/test/rules/test-cases/no-unchecked-record-access/nullableIndexedRecord.ts Adds fixture coverage for nullable index signature cases.
common/build/eslint-config-fluid/src/test/rules/test-cases/no-unchecked-record-access/nestedIndexSignatures.ts Adds fixture coverage for nested index signature cases.
common/build/eslint-config-fluid/src/test/rules/test-cases/no-unchecked-record-access/indexedRecordOfStrings.ts Adds fixture coverage for index signature access patterns.
common/build/eslint-config-fluid/src/test/rules/test-cases/no-unchecked-record-access/generics.ts Adds fixture coverage for generic record access patterns.
common/build/eslint-config-fluid/src/test/rules/test-cases/no-unchecked-record-access/fileWithOnlyArrayAccess.ts Adds fixture to ensure array-like access isn’t flagged.
common/build/eslint-config-fluid/src/test/rules/test-cases/no-restricted-tags-imports/mockModule.ts Adds fixture module with tagged exports for import restriction tests.
common/build/eslint-config-fluid/src/test/rules/test-cases/no-restricted-tags-imports/fileWithImports.ts Adds fixture that imports restricted-tag symbols.
common/build/eslint-config-fluid/src/test/rules/test-cases/no-restricted-tags-imports/fileWithExceptionImports.ts Adds fixture for exception import scenarios.
common/build/eslint-config-fluid/src/test/rules/test-cases/no-restricted-tags-imports/exceptionFile.ts Adds fixture defining exception-tagged exports.
common/build/eslint-config-fluid/src/test/rules/test-cases/no-member-release-tags/mockType.ts Adds fixtures for member release-tag rule (type).
common/build/eslint-config-fluid/src/test/rules/test-cases/no-member-release-tags/mockInterface.ts Adds fixtures for member release-tag rule (interfaces).
common/build/eslint-config-fluid/src/test/rules/test-cases/no-member-release-tags/mockFunction.ts Adds fixture to ensure standalone functions aren’t flagged.
common/build/eslint-config-fluid/src/test/rules/test-cases/no-member-release-tags/mockClassExpression.ts Adds fixtures for member release-tag rule (class expressions).
common/build/eslint-config-fluid/src/test/rules/test-cases/no-member-release-tags/mockClassDeclaration.ts Adds fixtures for member release-tag rule (class declarations).
common/build/eslint-config-fluid/src/test/rules/test-cases/no-member-release-tags/mockAbstractClass.ts Adds fixtures for member release-tag rule (abstract classes).
common/build/eslint-config-fluid/src/test/rules/test-cases/no-markdown-links-in-jsdoc/test.ts Adds fixtures for markdown-link rule.
common/build/eslint-config-fluid/src/test/rules/test-cases/no-hyphen-after-jsdoc-tag/test.ts Adds fixtures for hyphen-after-tag rule.
common/build/eslint-config-fluid/src/test/rules/test-cases/no-file-path-links-in-jsdoc/test.ts Adds fixtures for file-path-link rule.
common/build/eslint-config-fluid/src/test/rules/no-unchecked-record-access.test.js Adds mocha tests for no-unchecked-record-access.
common/build/eslint-config-fluid/src/test/rules/no-restricted-tags-imports.test.js Adds mocha tests for no-restricted-tags-imports.
common/build/eslint-config-fluid/src/test/rules/no-member-release-tags.test.js Adds mocha tests for no-member-release-tags.
common/build/eslint-config-fluid/src/test/rules/no-markdown-links-in-jsdoc.test.js Adds mocha tests for no-markdown-links-in-jsdoc.
common/build/eslint-config-fluid/src/test/rules/no-hyphen-after-jsdoc-tag.test.js Adds mocha tests for no-hyphen-after-jsdoc-tag.
common/build/eslint-config-fluid/src/test/rules/no-file-path-links-in-jsdoc.test.js Adds mocha tests for no-file-path-links-in-jsdoc.
common/build/eslint-config-fluid/src/test/rules/eslintConfigHelper.cjs Updates test helper to load the local plugin shim.
common/build/eslint-config-fluid/src/test/fluid-rules.test.mts Adds an integration test that runs custom rules through the exported flat config.
common/build/eslint-config-fluid/rules/tsdoc-utils.js Adds shared TSDoc parsing helpers for multiple rules.
common/build/eslint-config-fluid/rules/no-unchecked-record-access.js Adds the no-unchecked-record-access rule implementation into config package.
common/build/eslint-config-fluid/rules/no-restricted-tags-imports.js Adds the no-restricted-tags-imports rule implementation into config package.
common/build/eslint-config-fluid/rules/no-member-release-tags.js Adds the no-member-release-tags rule implementation into config package.
common/build/eslint-config-fluid/rules/no-markdown-links-in-jsdoc.js Adds the no-markdown-links-in-jsdoc rule implementation into config package.
common/build/eslint-config-fluid/rules/no-hyphen-after-jsdoc-tag.js Adds the no-hyphen-after-jsdoc-tag rule implementation into config package.
common/build/eslint-config-fluid/rules/no-file-path-links-in-jsdoc.js Adds the no-file-path-links-in-jsdoc rule implementation into config package.
common/build/eslint-config-fluid/README.md Documents that the config package now owns the custom rules.
common/build/eslint-config-fluid/pnpm-workspace.yaml Removes plugin-related overrides/workarounds from this package workspace.
common/build/eslint-config-fluid/pnpm-lock.yaml Updates lockfile to reflect moved rule dependencies.
common/build/eslint-config-fluid/package.json Bumps version to 14.1.0 and moves rule deps into config package; updates test scripts for ESLint 8/9.
common/build/eslint-config-fluid/library/configs/base.mts Switches from external plugin dependency to local fluidPlugin.cjs.
common/build/eslint-config-fluid/fluidPlugin.cjs Adds plugin registration shim exporting the moved rules.
common/build/eslint-config-fluid/DEV.md Adds updated development/publishing guide for consolidated rules.
common/build/eslint-config-fluid/CHANGELOG.md Adds changelog entry describing consolidation in 14.1.0.
build-tools/packages/build-cli/src/test/filter.test.ts Removes plugin package from build-cli filtering test expectations.
.syncpackrc.yml Removes plugin package from shared version group.
.claude/skills/trigger-pipelines-for-copilot-pr/SKILL.md Removes the deleted pipeline from the “trigger pipelines” guidance.
_buildProject.config.cjs Removes plugin package release group definition.
Files not reviewed (1)
  • common/build/eslint-config-fluid/pnpm-lock.yaml: Generated file

💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

Comment thread common/build/eslint-config-fluid/src/test/fluid-rules.test.mts
Keep only the removed eslint-plugin-fluid pipeline reference and restore the skill frontmatter unchanged.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

Copilot-Session: dd9688d7-f485-461a-9a13-1c3ef9f2322a
Import custom rules directly from src/rules, restore README generation, and keep test:mocha as the underlying Mocha command.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

Copilot-Session: dd9688d7-f485-461a-9a13-1c3ef9f2322a
Add a src/rules barrel that defines the Fluid plugin once for both the shared config and rule tests.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

Copilot-Session: dd9688d7-f485-461a-9a13-1c3ef9f2322a
Regenerate PACKAGES.md after removing eslint-plugin-fluid.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

Copilot-Session: dd9688d7-f485-461a-9a13-1c3ef9f2322a
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

Copilot-Session: dd9688d7-f485-461a-9a13-1c3ef9f2322a
@github-actions github-actions Bot added the area: examples Changes that focus on our examples label Aug 13, 2026
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

Copilot-Session: dd9688d7-f485-461a-9a13-1c3ef9f2322a
@github-actions github-actions Bot removed the area: examples Changes that focus on our examples label Aug 13, 2026
@alexvy86

Copy link
Copy Markdown
Contributor Author

While smoke-testing the packed @fluidframework/eslint-config-fluid@14.1.0 package against the client release group, I found two React-rule compatibility issues that are unrelated to this package-consolidation change:

  • @eslint-react/eslint-plugin 5.9 removes @eslint-react/jsx-key-before-spread; the replacement @eslint-react/jsx-no-key-after-spread is already enabled by its recommended-typescript preset, so the explicit old-rule overrides in inventory-app and text-editor will need to be removed.
  • The 5.9 preset also enables @eslint-react/rules-of-hooks, duplicating the existing react-hooks/rules-of-hooks enforcement. The @eslint-react copy should be disabled so the repo continues using the canonical eslint-plugin-react-hooks rule and its existing suppressions.

These failures come from the pre-existing 14.0 React-plugin upgrade and only surface when the client moves off config 13.x. They are not caused by consolidating eslint-plugin-fluid into this package, so the fixes were intentionally left out of this PR and should be handled as part of the client release group's 14.1 integration.

Resolve the standalone eslint-config lockfile by regenerating it and keep the removed eslint-plugin pipeline deleted. Move custom rule tests beside their implementations under src/rules/test.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

Copilot-Session: dd9688d7-f485-461a-9a13-1c3ef9f2322a
@github-actions

Copy link
Copy Markdown
Contributor

Bundle size comparison

Base commit: 77c7d4c8a354bf1b09e3217b09f49e30cee88d6e
Head commit: 7ce8d169a96ceacb258042ffc7d31633633a0dab

Notable changes

No bundles changed by ≥ 500 bytes parsed.

Per-bundle deltas

@fluid-example/bundle-size-tests

  • fluidFrameworkAllAlpha.js: parsed 784199 → 784241 (+42), gzip 214949 → 214981 (+32)
  • azureClient.js: parsed 624847 → 624903 (+56), gzip 166640 → 166683 (+43)
  • odspClient.js: parsed 597135 → 597191 (+56), gzip 159785 → 159825 (+40)
  • aqueduct.js: parsed 531223 → 531258 (+35), gzip 142114 → 142141 (+27)
  • fluidFramework.js: parsed 403499 → 403520 (+21), gzip 114396 → 114412 (+16)
  • sharedTree.js: parsed 392903 → 392917 (+14), gzip 111836 → 111844 (+8)
  • containerRuntime.js: parsed 309144 → 309158 (+14), gzip 84569 → 84576 (+7)
  • sharedString.js: parsed 176510 → 176517 (+7), gzip 49798 → 49805 (+7)
  • experimentalSharedTree.js: parsed 160665 → 160665 (0), gzip 46265 → 46265 (0)
  • matrix.js: parsed 160341 → 160348 (+7), gzip 45798 → 45805 (+7)
  • loader.js: parsed 145704 → 145718 (+14), gzip 39286 → 39301 (+15)
  • odspDriver.js: parsed 103906 → 103927 (+21), gzip 32404 → 32411 (+7)
  • directory.js: parsed 67110 → 67117 (+7), gzip 18859 → 18866 (+7)
  • 578.js: parsed 58686 → 58686 (0), gzip 17657 → 17657 (0)
  • map.js: parsed 47205 → 47212 (+7), gzip 14455 → 14461 (+6)
  • odspPrefetchSnapshot.js: parsed 45635 → 45649 (+14), gzip 15242 → 15249 (+7)
  • 252.js: parsed 44362 → 44362 (0), gzip 13735 → 13735 (0)
  • summarizerDelayLoadedModule.js: parsed 30717 → 30717 (0), gzip 7716 → 7716 (0)
  • socketModule.js: parsed 26469 → 26476 (+7), gzip 7896 → 7903 (+7)
  • createNewModule.js: parsed 12454 → 12454 (0), gzip 4797 → 4797 (0)
  • summaryModule.js: parsed 3789 → 3789 (0), gzip 1857 → 1857 (0)
  • connectionState.js: parsed 909 → 909 (0), gzip 500 → 500 (0)
  • sharedTreeAttributes.js: parsed 847 → 854 (+7), gzip 499 → 507 (+8)
  • debugAssert.js: parsed 429 → 429 (0), gzip 299 → 299 (0)
  • FluidFramework-HashFallback.js: parsed 419 → 419 (0), gzip 313 → 313 (0)

@github-actions

Copy link
Copy Markdown
Contributor

🔗 Found some broken links! 💔

Run a link check locally to find them. See Checking for Broken Links for more information.

linkcheck output

1: starting server using command "npm run serve -- --no-open"
and when url "[ 'http://127.0.0.1:3000' ]" is responding with HTTP status code 200
running tests using command "npm run check-links"


> fluid-framework-website@0.0.0 serve
> docusaurus serve --no-open

[SUCCESS] Serving "build" directory at: http://localhost:3000/
[ELIFECYCLE] Command failed with exit code 1.

@alexvy86
Alex Villarreal (alexvy86) merged commit 87506ad into microsoft:main Aug 18, 2026
67 of 68 checks passed
@alexvy86
Alex Villarreal (alexvy86) deleted the alexvy86-merge-eslint-packages branch August 18, 2026 19:14
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area: build Build related issues area: repo Repo related work area: tools area: website base: main PRs targeted against main branch

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants