test(ci): batch real Oxlint fixtures per performance plugin (#29801)

* fix: remove redundant chat callback alias to restore lint

* test(ci): batch real Oxlint performance fixtures per plugin

---------

Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
This commit is contained in:
OrcaWin
2026-10-16 11:58:36 -07:00
committed by GitHub
co-authored by OrcaWin
parent e65e0bd1e6
commit 2ccc2ac4b4
2 changed files with 116 additions and 86 deletions
@@ -1,14 +1,14 @@
import path from 'node:path'
import { describe, expect, it } from 'vitest'
import { runOxlintPluginOnSource } from './oxlint-plugin-test-runner.mjs'
import { beforeAll, describe, expect, it } from 'vitest'
import { runOxlintPluginOnSources } from './oxlint-plugin-test-runner.mjs'
const pluginPath = path.resolve('config/oxlint-plugins/app-store-performance.mjs')
function lintSource(source) {
return runOxlintPluginOnSource({
function lintSources(sources) {
return runOxlintPluginOnSources({
pluginName: 'app-store-performance',
pluginPath,
source,
sources,
rules: {
'app-store-performance/require-selector': 'warn',
'app-store-performance/no-identity-selector': 'warn',
@@ -18,9 +18,8 @@ function lintSource(source) {
})
}
describe('app store performance Oxlint plugin', () => {
it('reports whole-store and fresh-reference subscriptions', () => {
const diagnostics = lintSource(`
const sources = {
subscriptions: `
import { useAppStore as useStore } from '@/store'
const WholeStore = () => useStore()
const Identity = () => useStore((state) => state)
@@ -30,7 +29,75 @@ describe('app store performance Oxlint plugin', () => {
if (state.active) return state.items.filter(Boolean)
return state.items
})
`)
`,
focusedSelectors: `
import { useAppStore } from '@/store'
import { useShallow as shallow } from 'zustand/react/shallow'
const selectActive = (state) => state.active
const Focused = () => useAppStore(selectActive)
const Cached = () => useAppStore((state) => state.cachedProjection)
const Shallow = () => useAppStore(shallow((state) => ({ active: state.active })))
`,
namedSelectors: `
import { useAppStore } from '@/store'
const EarlyFresh = () => useAppStore(selectFreshRows)
const selectFreshRows = (state) => state.rows.filter(Boolean)
const Stable = () => useAppStore(selectActiveId)
const selectActiveId = (state) => state.activeId
`,
importedSelector: `
import { useAppStore } from '@/store'
import { selectRows } from './selectors'
const Other = () => {
const selectRows = (state) => state.rows.map((row) => row.id)
return selectRows
}
const Imported = () => useAppStore(selectRows)
`,
siblingStores: `
import { usePluginPanelsStore } from '@/store/plugin-panels'
import { useSyncExternalStore } from 'react'
const WholePanels = () => usePluginPanelsStore()
const FreshPanels = () => usePluginPanelsStore((state) => ({ open: state.open }))
const External = () => useSyncExternalStore(subscribe, () => ({ open: true }))
`,
nestedShallow: `
import { useAppStore } from '@/store'
import { useShallow } from 'zustand/react/shallow'
const NestedObject = () => useAppStore(useShallow((state) => ({ ids: state.rows.map((row) => row.id) })))
const NestedArray = () => useAppStore(useShallow((state) => [state.activeId, state.rows.filter(Boolean)]))
const Flat = () => useAppStore(useShallow((state) => ({ activeId: state.activeId, rows: state.rows })))
`,
delegatingSelectors: `
import { useAppStore } from '@/store'
import { useShallow } from 'zustand/react/shallow'
const buildRows = (state) => state.rows.map((row) => row.id)
const Delegating = () => useAppStore((state) => buildRows(state))
const NestedDelegating = () => useAppStore(useShallow((state) => ({ ids: buildRows(state) })))
`,
cachedHelpers: `
import { useAppStore } from '@/store'
import { useShallow } from 'zustand/react/shallow'
// The identity-caching shape: fresh only on a miss, cached otherwise.
const selectCachedRows = (state) => cache.get(state.key) ?? state.rows.filter(Boolean)
const Cached = () => useAppStore((state) => selectCachedRows(state))
const CachedNested = () => useAppStore(useShallow((state) => ({ rows: selectCachedRows(state) })))
// An unknown helper cannot be resolved, so it must not be guessed at.
const External = () => useAppStore((state) => externalBuild(state))
`
}
const diagnosticsBySource = new Map()
beforeAll(() => {
const fixtures = Object.values(sources)
lintSources(fixtures).forEach((diagnostics, index) => {
diagnosticsBySource.set(fixtures[index], diagnostics)
})
})
describe('app store performance Oxlint plugin', () => {
it('reports whole-store and fresh-reference subscriptions', () => {
const diagnostics = diagnosticsBySource.get(sources.subscriptions)
expect(diagnostics.map((diagnostic) => diagnostic.code)).toEqual([
'app-store-performance(require-selector)',
@@ -42,26 +109,13 @@ describe('app store performance Oxlint plugin', () => {
})
it('allows focused, cached, and useShallow selectors', () => {
const diagnostics = lintSource(`
import { useAppStore } from '@/store'
import { useShallow as shallow } from 'zustand/react/shallow'
const selectActive = (state) => state.active
const Focused = () => useAppStore(selectActive)
const Cached = () => useAppStore((state) => state.cachedProjection)
const Shallow = () => useAppStore(shallow((state) => ({ active: state.active })))
`)
const diagnostics = diagnosticsBySource.get(sources.focusedSelectors)
expect(diagnostics).toEqual([])
})
it('resolves selectors referenced by name, including ones hoisted below the call', () => {
const diagnostics = lintSource(`
import { useAppStore } from '@/store'
const EarlyFresh = () => useAppStore(selectFreshRows)
const selectFreshRows = (state) => state.rows.filter(Boolean)
const Stable = () => useAppStore(selectActiveId)
const selectActiveId = (state) => state.activeId
`)
const diagnostics = diagnosticsBySource.get(sources.namedSelectors)
expect(diagnostics.map((diagnostic) => diagnostic.code)).toEqual([
'app-store-performance(no-fresh-selector-result)'
@@ -69,27 +123,13 @@ describe('app store performance Oxlint plugin', () => {
})
it('does not let a component-local helper resolve a same-named imported selector', () => {
const diagnostics = lintSource(`
import { useAppStore } from '@/store'
import { selectRows } from './selectors'
const Other = () => {
const selectRows = (state) => state.rows.map((row) => row.id)
return selectRows
}
const Imported = () => useAppStore(selectRows)
`)
const diagnostics = diagnosticsBySource.get(sources.importedSelector)
expect(diagnostics).toEqual([])
})
it('covers sibling store hooks but not useSyncExternalStore', () => {
const diagnostics = lintSource(`
import { usePluginPanelsStore } from '@/store/plugin-panels'
import { useSyncExternalStore } from 'react'
const WholePanels = () => usePluginPanelsStore()
const FreshPanels = () => usePluginPanelsStore((state) => ({ open: state.open }))
const External = () => useSyncExternalStore(subscribe, () => ({ open: true }))
`)
const diagnostics = diagnosticsBySource.get(sources.siblingStores)
expect(diagnostics.map((diagnostic) => diagnostic.code)).toEqual([
'app-store-performance(require-selector)',
@@ -98,13 +138,7 @@ describe('app store performance Oxlint plugin', () => {
})
it('reports fresh references nested inside a useShallow projection', () => {
const diagnostics = lintSource(`
import { useAppStore } from '@/store'
import { useShallow } from 'zustand/react/shallow'
const NestedObject = () => useAppStore(useShallow((state) => ({ ids: state.rows.map((row) => row.id) })))
const NestedArray = () => useAppStore(useShallow((state) => [state.activeId, state.rows.filter(Boolean)]))
const Flat = () => useAppStore(useShallow((state) => ({ activeId: state.activeId, rows: state.rows })))
`)
const diagnostics = diagnosticsBySource.get(sources.nestedShallow)
expect(diagnostics.map((diagnostic) => diagnostic.code)).toEqual([
'app-store-performance(no-nested-fresh-under-shallow)',
@@ -113,13 +147,7 @@ describe('app store performance Oxlint plugin', () => {
})
it('follows a selector one hop into a module-scope helper', () => {
const diagnostics = lintSource(`
import { useAppStore } from '@/store'
import { useShallow } from 'zustand/react/shallow'
const buildRows = (state) => state.rows.map((row) => row.id)
const Delegating = () => useAppStore((state) => buildRows(state))
const NestedDelegating = () => useAppStore(useShallow((state) => ({ ids: buildRows(state) })))
`)
const diagnostics = diagnosticsBySource.get(sources.delegatingSelectors)
expect(diagnostics.map((diagnostic) => diagnostic.code)).toEqual([
'app-store-performance(no-fresh-selector-result)',
@@ -128,16 +156,7 @@ describe('app store performance Oxlint plugin', () => {
})
it('does not flag a helper that returns a cached reference on some branch', () => {
const diagnostics = lintSource(`
import { useAppStore } from '@/store'
import { useShallow } from 'zustand/react/shallow'
// The identity-caching shape: fresh only on a miss, cached otherwise.
const selectCachedRows = (state) => cache.get(state.key) ?? state.rows.filter(Boolean)
const Cached = () => useAppStore((state) => selectCachedRows(state))
const CachedNested = () => useAppStore(useShallow((state) => ({ rows: selectCachedRows(state) })))
// An unknown helper cannot be resolved, so it must not be guessed at.
const External = () => useAppStore((state) => externalBuild(state))
`)
const diagnostics = diagnosticsBySource.get(sources.cachedHelpers)
expect(diagnostics).toEqual([])
})
@@ -1,35 +1,24 @@
import path from 'node:path'
import { describe, expect, it } from 'vitest'
import { runOxlintPluginOnSource } from './oxlint-plugin-test-runner.mjs'
import { beforeAll, describe, expect, it } from 'vitest'
import { runOxlintPluginOnSources } from './oxlint-plugin-test-runner.mjs'
function lint(source) {
return runOxlintPluginOnSource({
function lintSources(sources) {
return runOxlintPluginOnSources({
pluginName: 'sort-comparator-performance',
pluginPath: path.resolve('config/oxlint-plugins/sort-comparator-performance.mjs'),
rules: { 'sort-comparator-performance/no-repeated-collator': 'warn' },
source
sources
})
}
describe('sort comparator performance', () => {
it('reports repeated collation setup in inline sort and toSorted callbacks', () => {
const findings = lint(`
const sources = {
repeatedCollation: `
rows.sort((a, b) => a.name.localeCompare(b.name, locale, { sensitivity: 'base' }))
rows.toSorted(function (a, b) { return new Intl.Collator('sv').compare(a, b) })
rows['sort']((a, b) => Intl.Collator('en', { numeric: true }).compare(a, b))
rows.sort((a, b) => a['localeCompare'](b, undefined, options))
`)
expect(findings).toHaveLength(4)
expect(
findings.every(
(finding) => finding.code === 'sort-comparator-performance(no-repeated-collator)'
)
).toBe(true)
})
it('allows one collator per sort, bare comparisons, and unrelated callbacks', () => {
expect(
lint(`
`,
acceptedComparisons: `
const collator = new Intl.Collator(locale, options)
rows.sort((a, b) => collator.compare(a.name, b.name) || a.id.localeCompare(b.id))
rows.toSorted(collator.compare)
@@ -39,7 +28,29 @@ describe('sort comparator performance', () => {
function deferred() { return new Intl.Collator(locale) }
return a - b
})
`)
).toEqual([])
`
}
const diagnosticsBySource = new Map()
beforeAll(() => {
const fixtures = Object.values(sources)
lintSources(fixtures).forEach((diagnostics, index) => {
diagnosticsBySource.set(fixtures[index], diagnostics)
})
})
describe('sort comparator performance', () => {
it('reports repeated collation setup in inline sort and toSorted callbacks', () => {
const findings = diagnosticsBySource.get(sources.repeatedCollation)
expect(findings).toHaveLength(4)
expect(
findings.every(
(finding) => finding.code === 'sort-comparator-performance(no-repeated-collator)'
)
).toBe(true)
})
it('allows one collator per sort, bare comparisons, and unrelated callbacks', () => {
expect(diagnosticsBySource.get(sources.acceptedComparisons)).toEqual([])
})
})