JavaScript Data Grid / Data Table with a Spreadsheet Look & Feel. Works with React, Angular, and Vue. Supported by the Handsontable team ⚡
This report summarizes scanner evidence for handsontable/handsontable, a TypeScript project with 22,074 GitHub stars. SynthScan examined 1,424,157 lines of code across 7983 source files, recording 1502 pattern matches distributed across 15 syntactic categories. The legacy adjusted pattern signal is 1.7 (Low pattern signal); it is not an authorship estimate.
Use the findings to ask whether maintainers can explain intent, verify dependencies, simplify unnecessary scaffolding, and focus review effort. Risk Payload v1 adds ownership, supply-chain, over-engineering, and review-effort vectors when available. These are prompts for human verification, not probabilities, security findings, or measured maintenance costs.
Use each vector to guide manual verification of the underlying findings.
Payload schema: 1.0.0 · Engine: 2.0.0 · Scoring: heuristic-density-v1 · Scan date: 2026-10-31.
Can maintainers explain intent, assumptions, and trade-offs? 1295 finding(s).
Are imports declared and package/API names verified? 144 finding(s).
Are wrappers, guards, and repeated structures necessary? 480 finding(s).
Which changes need focused human review? 1502 finding(s).
This chart tracks the legacy adjusted pattern score across scan runs. Changes can reflect source changes, scan coverage, or detector/scoring versions; they do not measure AI adoption or prove that a team refactored code. Compare runs only when their scoring versions are compatible. The dashed line tracks the raw pattern-hit count.
Groups findings by configured severity weight. Severity is not a confidence estimate, security rating, or proof that a package is missing. Verify imports against the project's manifests and inspect each finding in its local design context.
This horizontal bar chart shows where configured pattern scores accumulate across directories. Treat the bars as locations to inspect, not as evidence of authorship or code quality. Use the file-level findings to decide whether a directory needs a focused ownership, dependency, complexity, or review check.
The scanner identified 1502 distinct pattern matches across 15 syntactic categories. Each entry below represents a discrete location in the source code where the engine recorded a detector match to inspect in context. Expand any category row to inspect the individual file paths, line numbers, code snippets, and the lexical context (CODE, COMMENT, or STRING) in which each match was detected.
Reading the findings table: The Severity column indicates the configured finding weight (CRITICAL / HIGH / MEDIUM / LOW). The Context column identifies whether the match occurred inside executable code, an inline comment, or a string literal — legacy comment-context matches receive a ×1.5 score weight. The ⚡ bolt icon marks clustered matches: three or more patterns within a 10-line window, each receiving an additional ×1.5 density multiplier under the legacy scoring model.
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | handsontable/.ai/TESTING.md | 39 | # Step 1: rebuild the test bundle with the pattern (skips full UMD build): | COMMENT |
| LOW | handsontable/.ai/TESTING.md | 41 | # Step 2: run puppeteer against the filtered bundle: | COMMENT |
| LOW⚡ | …/columnSummary/__tests__/moveAndPhysicalCoords.unit.js | 110 | // Step 1: an edit before any move works. | COMMENT |
| LOW⚡ | …/columnSummary/__tests__/moveAndPhysicalCoords.unit.js | 115 | // Step 2: move column A after column B. The result travels with its column. | COMMENT |
| LOW⚡ | …/columnSummary/__tests__/moveAndPhysicalCoords.unit.js | 120 | // Step 3: editing the moved column (now B) must update its summary. It stayed at 9 before the fix. | COMMENT |
| LOW⚡ | …/columnSummary/__tests__/moveAndPhysicalCoords.unit.js | 125 | // Step 4: editing the column that moved into A's old place must not write a summary there. Before the fix | COMMENT |
| LOW⚡ | …columnSummary/__tests__/reversedRowCoordsAlter.unit.js | 243 | // Step 1: shrink the table so B re-derives to 4 - 4 - 1 = -1 and parks (with a warning), while A | COMMENT |
| LOW⚡ | …columnSummary/__tests__/reversedRowCoordsAlter.unit.js | 250 | // Step 2: append. A re-anchors from `aRowBefore` to the new last row; its old cell must be cleared. | COMMENT |
| LOW⚡ | .claude/skills/handsontable-demo-page/SKILL.md | 19 | ## Step 1: Analyze the PR context | COMMENT |
| LOW⚡ | .claude/skills/handsontable-demo-page/SKILL.md | 23 | ## Step 2: Build Handsontable | COMMENT |
| LOW⚡ | .claude/skills/handsontable-demo-page/SKILL.md | 31 | ## Step 3: Generate the two files | COMMENT |
| LOW | .claude/skills/handsontable-demo-page/SKILL.md | 138 | ## Step 4: Serve and verify | COMMENT |
| LOW | .claude/skills/browserstack-live/SKILL.md | 10 | ## Step 1: Prepare something to test | COMMENT |
| LOW | .claude/skills/browserstack-live/SKILL.md | 47 | ## Step 2: Start the Cloudflare tunnel | COMMENT |
| LOW | .claude/skills/browserstack-live/SKILL.md | 60 | ## Step 3: Launch the BrowserStack session | COMMENT |
| LOW | .claude/skills/browserstack-live/SKILL.md | 98 | ## Step 4: Cleanup | COMMENT |
| LOW⚡ | …ering-styling/frozen-summary-row/frozen-summary-row.md | 80 | ## Step 1: Include the summary row in your data | COMMENT |
| LOW⚡ | …ering-styling/frozen-summary-row/frozen-summary-row.md | 84 | ## Step 2: Freeze the bottom row | COMMENT |
| LOW⚡ | …ering-styling/frozen-summary-row/frozen-summary-row.md | 88 | ## Step 3: Compute sum, average, and count | COMMENT |
| LOW | …ering-styling/frozen-summary-row/frozen-summary-row.md | 102 | ## Step 4: Recalculate on load and on edits | COMMENT |
| LOW | …ering-styling/frozen-summary-row/frozen-summary-row.md | 109 | ## Step 5: Make the summary row read-only and styled | COMMENT |
| LOW⚡ | …ing/sparkline-cell-renderer/sparkline-cell-renderer.md | 78 | ## Step 1: Run `baseRenderer` before the SVG | COMMENT |
| LOW⚡ | …ing/sparkline-cell-renderer/sparkline-cell-renderer.md | 84 | ## Step 2: Map cell values to slots | COMMENT |
| LOW⚡ | …ing/sparkline-cell-renderer/sparkline-cell-renderer.md | 88 | ## Step 3: Compute a global scale | COMMENT |
| LOW⚡ | …ing/sparkline-cell-renderer/sparkline-cell-renderer.md | 92 | ## Step 4: Build the SVG | COMMENT |
| LOW⚡ | …ing/sparkline-cell-renderer/sparkline-cell-renderer.md | 96 | ## Step 5: Register the renderer and cell type | COMMENT |
| LOW | …g/conditional-row-coloring/conditional-row-coloring.md | 79 | ## Step 1: Define the status-to-class mapping | COMMENT |
| LOW | …g/conditional-row-coloring/conditional-row-coloring.md | 107 | ## Step 2: Wire up the `cells` callback | COMMENT |
| LOW | …g/conditional-row-coloring/conditional-row-coloring.md | 147 | ## Step 3: Configure columns and data | COMMENT |
| LOW | …g/conditional-row-coloring/conditional-row-coloring.md | 184 | ## Step 4: Write scoped CSS for each status | COMMENT |
| LOW | …g/conditional-row-coloring/conditional-row-coloring.md | 226 | ## Step 5: Flash feedback for rejected edits | COMMENT |
| LOW | …ent/recipes/platforms/web-components/web-components.md | 47 | ## Step 1: Define the element and its styles | COMMENT |
| LOW | …ent/recipes/platforms/web-components/web-components.md | 110 | ## Step 2: Create the grid and emit its edits | COMMENT |
| LOW | …ent/recipes/platforms/web-components/web-components.md | 212 | ## Step 3: Expose the grid through methods | COMMENT |
| LOW | …ent/recipes/platforms/web-components/web-components.md | 344 | ## Step 4: Clean up on disconnect | COMMENT |
| LOW | …ent/recipes/platforms/web-components/web-components.md | 379 | ## Step 5: Use the element | COMMENT |
| LOW | …ent/recipes/platforms/salesforce-lwc/salesforce-lwc.md | 72 | ## Step 1: Add Handsontable DataGrid as a static resource | COMMENT |
| LOW | …ent/recipes/platforms/salesforce-lwc/salesforce-lwc.md | 115 | ## Step 2: Create the grid wrapper component | COMMENT |
| LOW | …ent/recipes/platforms/salesforce-lwc/salesforce-lwc.md | 256 | ## Step 3: Understand which shadow DOM mode you are in | COMMENT |
| LOW | …ent/recipes/platforms/salesforce-lwc/salesforce-lwc.md | 324 | ## Step 4: Expose the grid's settings and hooks | COMMENT |
| LOW | …ent/recipes/platforms/salesforce-lwc/salesforce-lwc.md | 394 | ## Step 5: Build the columns from Salesforce field metadata | COMMENT |
| LOW | …ent/recipes/platforms/salesforce-lwc/salesforce-lwc.md | 656 | ## Step 6: Save changes back to Salesforce | COMMENT |
| LOW | …ent/recipes/platforms/salesforce-lwc/salesforce-lwc.md | 795 | ## Step 7: Deploy and open the grid | COMMENT |
| LOW | …multi-column-filter-panel/multi-column-filter-panel.md | 77 | ## Step 1 - Enable filtering and create the grid | COMMENT |
| LOW | …multi-column-filter-panel/multi-column-filter-panel.md | 99 | ## Step 2 - Get the plugin and apply conditions | COMMENT |
| LOW | …multi-column-filter-panel/multi-column-filter-panel.md | 132 | ## Step 3 - Add clear-all behavior | COMMENT |
| LOW | …pes/column-management/freeze-columns/freeze-columns.md | 81 | ## Step 1: Set up the grid with fixedColumnsStart and manualColumnMove | COMMENT |
| LOW | …pes/column-management/freeze-columns/freeze-columns.md | 111 | ## Step 2: Track state and apply the freeze boundary | COMMENT |
| LOW | …pes/column-management/freeze-columns/freeze-columns.md | 131 | ## Step 3: Generate freeze buttons from the column headers | COMMENT |
| LOW | …pes/column-management/freeze-columns/freeze-columns.md | 155 | ## Step 4: Add the Unfreeze all button | COMMENT |
| LOW | …pes/column-management/freeze-columns/freeze-columns.md | 167 | ## Step 5: Show a frozen column count indicator | COMMENT |
| LOW | …lumn-management/column-visibility/column-visibility.md | 77 | ## Step 1: Define the full columns config | COMMENT |
| LOW | …lumn-management/column-visibility/column-visibility.md | 108 | ## Step 2: Track visible column indices | COMMENT |
| LOW | …lumn-management/column-visibility/column-visibility.md | 130 | ## Step 3: Initialize Handsontable DataGrid | COMMENT |
| LOW | …lumn-management/column-visibility/column-visibility.md | 147 | ## Step 4: Generate the checkbox list | COMMENT |
| LOW | …lumn-management/column-visibility/column-visibility.md | 170 | ## Step 5: Implement the toggle handler | COMMENT |
| LOW | …anagement/server-side-supabase/server-side-supabase.md | 62 | ## Step 1: Create the database table | COMMENT |
| LOW | …anagement/server-side-supabase/server-side-supabase.md | 119 | ## Step 2: Configure environment variables | COMMENT |
| LOW | …anagement/server-side-supabase/server-side-supabase.md | 134 | ## Step 3: Create the Supabase client | COMMENT |
| LOW | …anagement/server-side-supabase/server-side-supabase.md | 148 | ## Step 4: Map filter conditions to PostgREST | COMMENT |
| 443 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| CRITICAL | handsontable/test/lib/jquery.min.js | 4 | },cur:function(){var a=Zb.propHooks[this.prop];return a&&a.get?a.get(this):Zb.propHooks._default.get(this)},run:function | CODE |
| CRITICAL | …lugins/formulaBuilder/__tests__/formulaBuilder.unit.ts | 564 | const addedHooks = stub.hot.addHook.mock.calls.map(call => call[0]); | CODE |
| CRITICAL | …lugins/formulaBuilder/__tests__/formulaBuilder.unit.ts | 578 | const removedHooks = stub.hot.removeHook.mock.calls.map(call => call[0]); | CODE |
| CRITICAL | …lugins/formulaBuilder/__tests__/formulaBuilder.unit.ts | 589 | const callOf = (name: string) => stub.hot.addHook.mock.calls.find(call => call[0] === name); | CODE |
| CRITICAL | …lugins/formulaBuilder/__tests__/formulaBuilder.unit.ts | 662 | const hooksAfterEnable = stub.hot.addHook.mock.calls.map(call => call[0]); | CODE |
| CRITICAL | …lugins/formulaBuilder/__tests__/formulaBuilder.unit.ts | 1023 | const removedHooks = stub.hot.removeHook.mock.calls.map(call => call[0]); | CODE |
| CRITICAL | …lugins/formulaBuilder/__tests__/formulaBuilder.unit.ts | 1683 | rendererRemoved: stub.hot.removeHook.mock.calls.some(call => call[0] === 'afterRenderer'), | CODE |
| CRITICAL | handsontable/src/plugins/mergeCells/mergeCells.ts | 655 | this.hot.view._wt.wtOverlays.getOverlays(true).map( | CODE |
| CRITICAL | …s/nestedHeaders/__tests__/generalFunctionality.spec.js | 504 | const headerRows = hot.view._wt.wtTable.THEAD.querySelectorAll('tr'); | CODE |
| CRITICAL | …e/src/plugins/nestedHeaders/__tests__/helpers/index.js | 30 | const headerRows = hot.view._wt.wtTable.THEAD.querySelectorAll('tr'); | CODE |
| CRITICAL | …e/src/plugins/manualColumnResize/manualColumnResize.ts | 582 | this.hot.view._wt.wtViewport.resetHasOversizedColumnHeadersMarked(); | CODE |
| CRITICAL | handsontable/src/plugins/manualRowMove/manualRowMove.ts | 471 | tdStartPixel += this.hot.view._wt.wtOverlays.topOverlay.getOverlayOffset(); | CODE |
| CRITICAL | handsontable/src/plugins/manualRowMove/manualRowMove.ts | 716 | const headerWidth = this.hot.view._wt.wtViewport.getRowHeaderWidth(); | CODE |
| CRITICAL | …table/src/plugins/manualColumnMove/manualColumnMove.ts | 442 | columnsWidth += this.hot.view._wt.wtViewport.getRowHeaderWidth() || 0; | CODE |
| CRITICAL | …table/src/plugins/manualColumnMove/manualColumnMove.ts | 445 | columnsWidth += this.hot.view._wt.wtTable.getColumnWidth(renderableIndex) || 0; | CODE |
| CRITICAL | …table/src/plugins/manualColumnMove/manualColumnMove.ts | 851 | const horizontalScrollPosition = this.hot.view._wt.wtOverlays.inlineStartOverlay.getOverlayOffset(); | CODE |
| CRITICAL | …ins/manualColumnMove/__tests__/fixedColumnsEnd.unit.js | 109 | const cells = hot.view._wt.wtOverlays.inlineEndOverlay.clone.wtTable.TBODY.querySelector('tr').children; | CODE |
| CRITICAL | …e/src/editors/autocompleteEditor/autocompleteEditor.ts | 159 | addClass(this.htContainer, this.hot.rootWindow.navigator.platform.indexOf('Mac') === -1 ? '' : 'htMacScroll'); | CODE |
| CRITICAL | …e/src/editors/autocompleteEditor/autocompleteEditor.ts | 819 | this.htEditor.view._wt.wtTable.alignOverlaysWithTrimmingContainer(); | CODE |
| CRITICAL | …e/src/editors/autocompleteEditor/autocompleteEditor.ts | 844 | this.htEditor.view._wt.wtTable.alignOverlaysWithTrimmingContainer(); | CODE |
| CRITICAL | handsontable/src/__tests__/settings/validator.spec.js | 1501 | const mostRecentRendererCallArgs = tableView()._wt.wtSettings.settings.cellRenderer.calls.mostRecent().args; | CODE |
| CRITICAL | handsontable/src/__tests__/settings/width.spec.js | 565 | expect(hot.view._wt.wtOverlays.inlineStartOverlay.getScrollPosition()).toBe(holder.scrollLeft); | CODE |
| CRITICAL | …cuts/__tests__/keyboardShortcuts/tabNavigation.spec.js | 1221 | expect(hot1.view._wt.wtOverlays.topOverlay.getScrollPosition()).toBe(0); | CODE |
| CRITICAL | …cuts/__tests__/keyboardShortcuts/tabNavigation.spec.js | 1222 | expect(hot1.view._wt.wtOverlays.inlineStartOverlay.getScrollPosition()).toBe(0); | CODE |
| CRITICAL⚡ | …cuts/__tests__/keyboardShortcuts/tabNavigation.spec.js | 1353 | expect(hot1.view._wt.wtOverlays.topOverlay.getScrollPosition()).toBe(0); | CODE |
| CRITICAL⚡ | …cuts/__tests__/keyboardShortcuts/tabNavigation.spec.js | 1354 | expect(hot1.view._wt.wtOverlays.inlineStartOverlay.getScrollPosition()).toBe(0); | CODE |
| CRITICAL⚡ | …cuts/__tests__/keyboardShortcuts/tabNavigation.spec.js | 1362 | expect(hot1.view._wt.wtOverlays.topOverlay.getScrollPosition()).toBe(0); | CODE |
| CRITICAL⚡ | …cuts/__tests__/keyboardShortcuts/tabNavigation.spec.js | 1363 | expect(hot1.view._wt.wtOverlays.inlineStartOverlay.getScrollPosition()).toBe(0); | CODE |
| CRITICAL⚡ | …cuts/__tests__/keyboardShortcuts/tabNavigation.spec.js | 1371 | expect(hot1.view._wt.wtOverlays.topOverlay.getScrollPosition()).toBe(0); | CODE |
| CRITICAL⚡ | …cuts/__tests__/keyboardShortcuts/tabNavigation.spec.js | 1372 | expect(hot1.view._wt.wtOverlays.inlineStartOverlay.getScrollPosition()).toBe(0); | CODE |
| CRITICAL | …rty/walkontable/test/spec/table/drawCycleHooks.spec.js | 195 | expect(wt.wtTable.holder.parentNode.classList.contains('innerBorderTop')).toBe(true); | CODE |
| CRITICAL | …e/test/spec/selection/frozenBoundarySeamHeader.spec.js | 89 | const lastFrozen = wt.wtOverlays.inlineStartOverlay.clone.wtTable.getColumnHeader(1); | CODE |
| CRITICAL | …e/test/spec/selection/frozenBoundarySeamHeader.spec.js | 100 | const lastFrozen = wt.wtOverlays.inlineStartOverlay.clone.wtTable.getColumnHeader(1); | CODE |
| CRITICAL | …e/test/spec/selection/frozenBoundarySeamHeader.spec.js | 162 | const lastFrozenRowHeader = wt.wtOverlays.topInlineStartCornerOverlay.clone.wtTable.getRowHeader(1); | CODE |
| CRITICAL | …e/test/spec/selection/frozenBoundarySeamHeader.spec.js | 203 | const firstFrozenRowHeader = wt.wtOverlays.bottomInlineStartCornerOverlay.clone.wtTable.getRowHeader(6); | CODE |
| CRITICAL⚡ | …ontent/recipes/cell-types/color-picker/color-picker.md | 300 | editor.pickr._root.app.classList.remove('visible'); | CODE |
| CRITICAL | …ontent/recipes/cell-types/color-picker/color-picker.md | 425 | editor.pickr._root.app.classList.remove('visible'); | CODE |
| CRITICAL | …recipes/cell-types/color-picker/javascript/example1.js | 270 | editor.pickr._root.app.classList.remove('visible'); | CODE |
| CRITICAL | …recipes/cell-types/color-picker/javascript/example1.ts | 275 | editor.pickr._root.app.classList.remove('visible'); | CODE |
| CRITICAL | …ent/recipes/cell-types/color-picker/react/example1.jsx | 78 | editor.pickr._root.app.classList.remove('visible'); | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | handsontable/.config/themes-umd-development.js | 33 | function createHandsontableExternals() { | CODE |
| LOW | handsontable/.config/themes-umd-development.js | 117 | function createRuleForVariablesRegistration(variableName, namespacePath) { | CODE |
| LOW | handsontable/test/jsdomThemeCssFilter.js | 31 | function isThemeStylesheetParseError(args) { | CODE |
| LOW | handsontable/test/jsdomThemeCssFilter.js | 44 | function withoutThemeStylesheetParseError(error) { | CODE |
| LOW | handsontable/test/helpers/jasmine-bridge-reporter.js | 32 | function toSerializableExpectation(expectation) { | CODE |
| LOW | handsontable/test/helpers/focusNavigator.js | 92 | function findFirstFocusableElement(elements) { | CODE |
| LOW | handsontable/test/helpers/common.js | 104 | export function waitForNextAnimationFrames(framesToWait = 1) { | CODE |
| LOW | handsontable/test/helpers/common.js | 204 | function normalizeLegacyFrameCount(framesToWait) { | CODE |
| LOW | handsontable/test/helpers/common.js | 311 | export function handsontableMethodFactory(method) { | CODE |
| LOW | handsontable/test/helpers/common.js | 483 | export function getFirstRenderedRowDefaultHeight() { | CODE |
| LOW | handsontable/test/helpers/common.js | 497 | export function getDefaultColumnHeaderHeight() { | CODE |
| LOW | handsontable/test/helpers/common.js | 509 | export function getColumnHeaderBandHeight(levels = 1) { | CODE |
| LOW | handsontable/test/helpers/common.js | 543 | export function expectedLastFullyVisibleRow(containerHeight, colHeaderRows = 1) { | CODE |
| LOW | handsontable/test/helpers/common.js | 771 | export function topInlineStartCornerOverlay() { | CODE |
| LOW | handsontable/test/helpers/common.js | 785 | export function bottomInlineStartCornerOverlay() { | CODE |
| LOW | handsontable/test/helpers/common.js | 819 | export async function scrollViewportHorizontally(x) { | CODE |
| LOW | handsontable/test/helpers/common.js | 951 | export function getBottomInlineStartClone() { | CODE |
| LOW | handsontable/test/helpers/common.js | 1114 | export async function selectContextSubmenuOption(submenuName, optionName, cell) { | CODE |
| LOW | handsontable/test/helpers/common.js | 1192 | export function openDropdownSubmenuOption(submenuName, cell) { | CODE |
| LOW | handsontable/test/helpers/common.js | 1209 | export async function selectDropdownSubmenuOption(submenuName, optionName, cell) { | CODE |
| LOW | handsontable/test/helpers/common.js | 1242 | export function openDropdownByConditionMenu(menuName = 'first') { | CODE |
| LOW | handsontable/test/helpers/common.js | 1257 | export function selectDropdownByConditionMenuOption(optionName, menuName = 'first') { | CODE |
| LOW | handsontable/test/helpers/common.js | 1289 | export function serveImmediatePropagation(event) { | CODE |
| LOW | handsontable/test/helpers/common.js | 1492 | export function createAccessorForProperty(name) { | CODE |
| LOW | handsontable/test/helpers/common.js | 1556 | export function moveSecondDisplayedRowBeforeFirstRow(container, secondDisplayedRowIndex) { | CODE |
| LOW | handsontable/test/helpers/common.js | 1583 | export function moveFirstDisplayedRowAfterSecondRow(container, firstDisplayedRowIndex) { | CODE |
| LOW | handsontable/test/helpers/common.js | 1731 | function getFillHandleDragEventArgs(targetElement, options = {}) { | CODE |
| LOW | handsontable/test/helpers/common.js | 1785 | export function simulateFillHandleDragStart(targetElement, options = {}) { | CODE |
| LOW | handsontable/test/helpers/common.js | 1810 | export function simulateFillHandleDragMove(targetElement, options = {}) { | CODE |
| LOW | handsontable/test/helpers/common.js | 1861 | export function simulateFillHandleDragFinish(targetElement, options = {}) { | CODE |
| LOW | handsontable/test/helpers/common.js | 1908 | export function simulateModernThemeStylesheet(container) { | CODE |
| LOW | handsontable/test/helpers/common.js | 1920 | export function clearModernThemeStylesheetMock(container) { | CODE |
| LOW | handsontable/test/helpers/common.js | 1945 | export function createEmptySpreadsheetData(...args) { | CODE |
| LOW | handsontable/test/helpers/common.js | 1956 | export function createSpreadsheetObjectData(...args) { | CODE |
| LOW | handsontable/test/helpers/common.js | 2007 | export function spyOnConsoleDeprecatedWarn() { | CODE |
| LOW | handsontable/test/helpers/mouseEvents.js | 28 | export function handsontableMouseTriggerFactory(type, defaultButtonKey = getMouseButton('LMB')) { | CODE |
| LOW | handsontable/src/core.ts | 2933 | function refreshAfterFontsLoadOnceShown() { | CODE |
| LOW | handsontable/src/core.ts | 3108 | function doesChangeAffectOpenedEditor(changes: CellChange[], activeEditor: BaseEditor | undefined) { | CODE |
| LOW | handsontable/src/core.ts | 3125 | function doesSourceChangeAffectOpenedEditor( | CODE |
| LOW | handsontable/src/core.ts | 3185 | function discardResultsOfUncreatedRows(pendingRowMetas: Array<{ row?: number, valid?: boolean }>) { | CODE |
| LOW | handsontable/src/core.ts | 4061 | function validateAndApplyChanges(changes: CellChange[], source: string | undefined) { | CODE |
| LOW | handsontable/src/core.ts | 5145 | function runWithGridTrackingFitsSuspended(action: () => void) { | CODE |
| LOW | handsontable/src/core.ts | 6055 | function warnAboutInvalidCellOption(settings: SettingsUpdate, isCellOptionRestated: boolean): void { | CODE |
| LOW | handsontable/src/core.ts | 6213 | function applyColumnMetaBeforeLoad( | CODE |
| LOW | handsontable/src/tableView.ts | 147 | function isResolvedHeaderSizeEntry(entry: unknown): entry is number | null | undefined { | CODE |
| LOW | handsontable/src/tableView.ts | 209 | function hookHeightOmitsBottomBorder(hot: HotInstance, hookHeight: unknown): boolean { | CODE |
| LOW | handsontable/src/dataMap/replaceData.ts | 92 | function warnAboutUndetectableColumns(hotInstance: HotInstance, data: unknown[], loadedRowsCount: number) { | CODE |
| LOW | handsontable/src/dataMap/sourceDataValidator.ts | 332 | function canStoredMetaAddValidator(hotInstance: HotInstance, settings: GridSettings): boolean { | CODE |
| LOW | handsontable/src/dataMap/metaManager/lazyFactoryMap.ts | 44 | function assertUnsignedKeyOrNullish(key: unknown): asserts key is number | null | undefined { | CODE |
| LOW | …table/src/dataMap/metaManager/metaLayers/globalMeta.ts | 11 | function createTableMetaEmptyClass() { | CODE |
| LOW | …table/src/renderers/multiSelectRenderer/utils/utils.ts | 161 | export function registerDropdownIndicatorEvents(hotInstance: HotInstance): void { | CODE |
| LOW | …table/src/renderers/multiSelectRenderer/utils/utils.ts | 222 | export function registerChipRemovingEvents( | CODE |
| LOW | …table/src/renderers/multiSelectRenderer/utils/utils.ts | 277 | export function cacheColumnWidthAndRegisterResizeHook( | CODE |
| LOW | …table/src/renderers/multiSelectRenderer/utils/utils.ts | 324 | function getDropdownIndicatorReserve(chipsContainer: HTMLElement, rootDocument: Document): number { | CODE |
| LOW | …table/src/renderers/multiSelectRenderer/utils/utils.ts | 341 | function recalculateChipsVisibility( | CODE |
| LOW | …ble/src/renderers/checkboxRenderer/checkboxRenderer.ts | 316 | function changeSelectedCheckboxesState(uncheckCheckbox = false, consumesKey = false) { | CODE |
| LOW | handsontable/src/core/minimumSizes.ts | 75 | export function countSurplusTrailingItems({ | CODE |
| LOW | handsontable/src/core/viewportScroll/utils.ts | 122 | function scrollWindowToCellKeepingGridScroll(hot: HotInstance, element: HTMLElement | null) { | CODE |
| LOW | handsontable/src/core/viewportScroll/utils.ts | 174 | export function createScrollTargetCalculator(hotInstance: HotInstance) { | CODE |
| LOW | …viewportScroll/scrollStrategies/noncontiguousScroll.ts | 11 | export function noncontiguousScrollStrategy(hot: HotInstance) { | CODE |
| 357 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | lefthook.yml | 1 | # Local git hooks (lefthook) — the enforcement FLOOR for everyone (Claude Code's | COMMENT |
| LOW | handsontable/.eslintrc.js | 21 | // does not resolve prototype methods on non-literal receivers, which is how `toSorted` and | COMMENT |
| LOW | handsontable/.eslintrc.js | 301 | // A NEW occurrence on a line a branch adds is already blocked: the | COMMENT |
| LOW | …e/test/helpers/__tests__/themeLayoutFromTokens.unit.js | 181 | it('defaults to main when theme name is falsy', () => { | COMMENT |
| LOW | handsontable/src/core.ts | 1081 | // by RENDER index, while the sizes behind them resolve per PHYSICAL index - `modifyRowHeight` | COMMENT |
| LOW | handsontable/src/core.ts | 1121 | // Restored BEFORE `commit()`, which is the only order that works: the restore puts every layer | COMMENT |
| LOW | handsontable/src/core.ts | 6141 | const invalidCellMetas = metaManager.getInvalidCellMetas(); | COMMENT |
| LOW | handsontable/src/tableView.ts | 2621 | * @private | COMMENT |
| LOW | handsontable/src/tableView.ts | 2641 | // listener does not fire at all while such a surface is set), so the edit ends on the `mouseup` | COMMENT |
| LOW | handsontable/src/editorManager.ts | 681 | COMMENT | |
| LOW | handsontable/src/renderSizeProbe.ts | 61 | COMMENT | |
| LOW | …ontable/src/dataMap/metaManager/metaLayers/cellMeta.ts | 481 | COMMENT | |
| LOW | …renderers/autocompleteRenderer/autocompleteRenderer.ts | 61 | COMMENT | |
| LOW | handsontable/src/core/settings.ts | 421 | // Returning a `TrustedHTML` is supported for pages enforcing Trusted Types; see `TrustedHTMLLike`. | COMMENT |
| LOW | handsontable/src/plugins/filters/filters.ts | 2081 | } else { | COMMENT |
| LOW | handsontable/src/plugins/filters/ui/multipleSelect.ts | 281 | */ | COMMENT |
| LOW | handsontable/src/plugins/comments/comments.ts | 501 | // second binding, the dedupe and the point reader all inert - the grid then behaves | COMMENT |
| LOW | handsontable/src/plugins/comments/comments.ts | 1121 | const target = eventTargetEl(event)!; | COMMENT |
| LOW | handsontable/src/plugins/customBorders/customBorders.ts | 741 | this.#modelVersion += 1; | COMMENT |
| LOW | handsontable/src/plugins/copyPaste/copyPaste.ts | 421 | }; | COMMENT |
| LOW | handsontable/src/plugins/copyPaste/copyPaste.ts | 1221 | // `DOMParser`), so a sanitizer may pass this payload through without reopening an injection | COMMENT |
| LOW | …ble/src/plugins/exportFile/types/xlsx/numeric-utils.ts | 101 | const intPart = integerPart(integerDigits, useGrouping !== false); | COMMENT |
| LOW | handsontable/src/plugins/dropdownMenu/dropdownMenu.ts | 601 | * @param {*} params Additional parameters passed to the command executor. | COMMENT |
| LOW | handsontable/src/plugins/autoRowSize/autoRowSize.ts | 1021 | // first, and the last chunk of the sweep renders once it ends. | COMMENT |
| LOW | …ns/autoRowSize/__tests__/rowHeightsInteraction.unit.ts | 281 | window.requestAnimationFrame = originalRequestAnimationFrame; | COMMENT |
| LOW | handsontable/src/plugins/nestedHeaders/nestedHeaders.ts | 261 | COMMENT | |
| LOW | handsontable/src/plugins/nestedHeaders/nestedHeaders.ts | 281 | // Only release the captured move state once it has been consumed here. A move that splits a | COMMENT |
| LOW | …le/src/plugins/contextMenu/predefinedItems/readOnly.ts | 121 | // "At least one", unlike the mark: a partly read-only selection is made writable as a whole. | COMMENT |
| LOW | …/src/plugins/contextMenu/__tests__/positioning.spec.js | 81 | // keyboard events cross-realm that confuse the recorder's listener cleanup logic. | COMMENT |
| LOW | handsontable/src/plugins/contextMenu/menu/menu.ts | 341 | this.eventManager.addEventListener(frame.document, 'touchstart', event => this.onDocumentMouseDown(event)); | COMMENT |
| LOW | handsontable/src/plugins/columnSorting/columnSorting.ts | 861 | * @returns {number} | COMMENT |
| LOW | handsontable/src/plugins/columnSorting/columnSorting.ts | 921 | // upper bound. | COMMENT |
| LOW | …gins/columnSorting/__tests__/guardedColumnRead.unit.js | 1 | import Handsontable from '../../../base'; | COMMENT |
| LOW | …s/columnSorting/__tests__/comparatorCrossCheck.unit.ts | 1 | // The barrel first, exactly as `columnSorting.ts` does. `sortService` sits in a module cycle, and a | COMMENT |
| LOW | handsontable/src/plugins/sheetsBar/sheetsBar.ts | 4161 | selectFirstItem: fromKeyboard, | COMMENT |
| LOW | handsontable/src/plugins/sheetsBar/ui/menus.ts | 301 | // A 4px gap on both sides of the anchor. Below, the positioner adds one pixel of its own. | COMMENT |
| LOW | …tiColumnSorting/__tests__/comparatorCrossCheck.unit.ts | 1 | // The barrel first. `sortService` sits in a module cycle, and a deep import that reaches `registry` or | COMMENT |
| LOW | …dsontable/src/plugins/autoColumnSize/autoColumnSize.ts | 581 | if (newSettings !== undefined && newSettings[PLUGIN_KEY] === undefined) { | COMMENT |
| LOW | …dsontable/src/plugins/autoColumnSize/autoColumnSize.ts | 601 | // view. This mirrors `#onAfterLoadData`, the other "everything is stale" path. On a grid that | COMMENT |
| LOW | handsontable/src/plugins/columnSummary/endpoints.ts | 501 | COMMENT | |
| LOW | handsontable/src/plugins/hiddenColumns/hiddenColumns.ts | 681 | // its own content: on a `columnHeaderHeight` taller than one line a caret anchored to it sat | COMMENT |
| LOW | handsontable/src/plugins/nestedRows/ui/collapsing.ts | 581 | const isCollapse = action === 'collapse'; | COMMENT |
| LOW | handsontable/src/plugins/nestedRows/data/dataManager.ts | 941 | } else { | COMMENT |
| LOW | handsontable/src/plugins/formulas/formulas.ts | 2961 | * If the value is an object, utilize the valueGetter for that cell, otherwise return the value as is. | COMMENT |
| LOW | …ntable/src/plugins/formulas/__tests__/formulas.spec.js | 4261 | const p = getPlugin('formulas'); | COMMENT |
| LOW | handsontable/src/editors/baseEditor/baseEditor.ts | 501 | // Ctrl/Meta + Enter over a real range copies the edited value into every other cell of the | COMMENT |
| LOW | …e/src/editors/handsontableEditor/handsontableEditor.ts | 701 | COMMENT | |
| LOW | …ble/src/editors/multiSelectEditor/multiSelectEditor.ts | 521 | * listener before the event manager releases it - and `getEditedCell()` throws on a destroyed | COMMENT |
| LOW | …e/src/editors/autocompleteEditor/autocompleteEditor.ts | 241 | const { filteringCaseSensitive, allowHtml } = this.cellProperties; | COMMENT |
| LOW | …e/src/editors/autocompleteEditor/autocompleteEditor.ts | 501 | */ | COMMENT |
| LOW | …e/src/editors/autocompleteEditor/autocompleteEditor.ts | 621 | * | COMMENT |
| LOW | …e/src/editors/autocompleteEditor/autocompleteEditor.ts | 741 | // `getDropdownHeight()` reports the trimmed size once the clamp below has run, so a cell that | COMMENT |
| LOW | …e/src/editors/autocompleteEditor/autocompleteEditor.ts | 761 | // every choice - the flexbox-squeezed grids reported in #8872. The MultiSelect editor's | COMMENT |
| LOW | …e/src/editors/autocompleteEditor/autocompleteEditor.ts | 781 | // `style.top` by hand, for the flipped case only. Re-applying the flip rather than | COMMENT |
| LOW | handsontable/src/utils/stylesHandler.ts | 361 | // the cell outgrows its declared box on every row (issue #6280). Every other case keeps the | COMMENT |
| LOW | handsontable/src/utils/parseTable.ts | 541 | // it down the element branch instead, where it matched no table and the paste silently produced | COMMENT |
| LOW | handsontable/src/utils/xlsxEngine/capabilities.ts | 81 | // model holds worksheets and nothing else, so the sheet is skipped and the others keep their | COMMENT |
| LOW | handsontable/src/utils/xlsxEngine/capabilities.ts | 101 | // Raised by the native reader only: a `t="s"` cell whose shared-string index resolves to nothing | COMMENT |
| LOW | …le/src/utils/xlsxEngine/adapters/native/xml/escapes.ts | 21 | const TEXT_ESCAPED_CHARS = /[\u0000-\u0008\u000B-\u001F\u007F\uFFFE\uFFFF]/g; | COMMENT |
| LOW | …ble/src/utils/xlsxEngine/__tests__/nativeParts.unit.js | 1321 | // whole-column range, so a reader that walks every range does ~200M cell writes for a file of a | COMMENT |
| 232 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | …e/src/plugins/exportFile/__tests__/exportFile.types.ts | 44 | // ─── CSV — synchronous ─────────────────────────────── | COMMENT |
| MEDIUM | …e/src/plugins/exportFile/__tests__/exportFile.types.ts | 71 | // ─── XLSX — asynchronous ─────────────────────────────────────────────────── | COMMENT |
| MEDIUM | …e/src/plugins/exportFile/__tests__/exportFile.types.ts | 90 | // ─── Conditional formatting ──────────────────────────────────────────────── | COMMENT |
| MEDIUM | …e/src/plugins/exportFile/__tests__/exportFile.types.ts | 106 | // ─── Multi-sheet export ──────────────────────────────────────────────────── | COMMENT |
| MEDIUM⚡ | …e/src/plugins/exportFile/__tests__/exportFile.types.ts | 128 | // ─── SheetOptions: name is optional ─────────────────────────────────────── | COMMENT |
| MEDIUM⚡ | …e/src/plugins/exportFile/__tests__/exportFile.types.ts | 135 | // ─── ExportOptions: headerStyle (XLSX) ──────────────────────────────────── | COMMENT |
| MEDIUM⚡ | …e/src/plugins/exportFile/__tests__/exportFile.types.ts | 141 | // ─── ExportOptions: engine (per-call override) ──────────────────────────── | COMMENT |
| MEDIUM | …e/src/plugins/exportFile/__tests__/exportFile.types.ts | 162 | // ─── sanitizeValues variants ─────────────────────────────────────────────── | COMMENT |
| MEDIUM | …e/src/plugins/exportFile/__tests__/exportFile.types.ts | 168 | // ─── downloadFileAsync ──────────────────────────────────────────────────── | COMMENT |
| MEDIUM | …e/src/plugins/exportFile/__tests__/exportFile.types.ts | 186 | // ─── supportsExportFormat ───────────────────────────────────────────────── | COMMENT |
| MEDIUM | …e/src/plugins/exportFile/__tests__/exportFile.types.ts | 191 | // ─── exportAsBlobAsync ──────────────────────────────────────────────────── | COMMENT |
| MEDIUM | …nagement/server-side-rails/server/orders_controller.rb | 18 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | …nagement/server-side-rails/server/orders_controller.rb | 32 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | …nagement/server-side-rails/server/orders_controller.rb | 45 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | …nagement/server-side-rails/server/orders_controller.rb | 51 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | …nagement/server-side-rails/server/orders_controller.rb | 67 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | …nagement/server-side-rails/server/orders_controller.rb | 72 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | …nagement/server-side-rails/server/orders_controller.rb | 93 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | …nagement/server-side-rails/server/orders_controller.rb | 99 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | …pes/data-management/server-side-django/server/views.py | 138 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | …pes/data-management/server-side-django/server/views.py | 140 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | docs/public/example-tabs.js | 10 | // ── Hot-example code assembly (Expressive Code blocks) ─────────────────── | COMMENT |
| MEDIUM | docs/public/example-tabs.js | 238 | // ── Source code toggle ──────────────────────────────────────────────────── | COMMENT |
| MEDIUM | docs/public/example-tabs.js | 254 | // ── Code group tabs (npm / Yarn / pnpm etc.) ──────────────────────────── | COMMENT |
| MEDIUM⚡ | docs/src/scripts/example-runner.ts | 24 | // ── Glob maps resolved by Vite at build time ────────────────────────────── | COMMENT |
| MEDIUM⚡ | docs/src/scripts/example-runner.ts | 33 | // ── Zone.js load-once guard ─────────────────────────────────────────────── | COMMENT |
| MEDIUM⚡ | docs/src/scripts/example-runner.ts | 43 | // ── Angular bootstrap helper (NgModule + standalone) ───────────────────── | COMMENT |
| MEDIUM | docs/src/scripts/example-runner.ts | 69 | // ── Helpers ─────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | docs/src/scripts/example-runner.ts | 239 | // ── Main runner ─────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | docs/src/scripts/example-runner.ts | 242 | // ── Inject example CSS files ────────────────────────────────────────── | COMMENT |
| MEDIUM | docs/src/scripts/example-runner.ts | 262 | // ── Vanilla JS examples ──────────────────────────────────────────────── | COMMENT |
| MEDIUM | docs/src/scripts/example-runner.ts | 284 | // ── React JSX examples ───────────────────────────────────────────────── | COMMENT |
| MEDIUM | docs/src/scripts/example-runner.ts | 332 | // ── Vue 3 examples ──────────────────────────────────────────────────── | COMMENT |
| MEDIUM | docs/src/scripts/example-runner.ts | 391 | // ── Angular examples ─────────────────────────────────────────────────── | COMMENT |
| MEDIUM | docs/src/scripts/a11y-utils.ts | 11 | // ── Focus trap ────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | docs/src/scripts/a11y-utils.ts | 53 | // ── Dropdown keyboard navigation ──────────────────────────────────────── | COMMENT |
| MEDIUM | docs/src/scripts/a11y-utils.ts | 172 | // ── Table of contents keyboard navigation ──────────────────────────────── | COMMENT |
| MEDIUM | .github/workflows/publish.yml | 45 | # ============================================================ | COMMENT |
| MEDIUM | .github/workflows/publish.yml | 48 | # ============================================================ | COMMENT |
| MEDIUM | .github/workflows/publish.yml | 176 | # ============================================================ | COMMENT |
| MEDIUM | .github/workflows/publish.yml | 178 | # ============================================================ | COMMENT |
| MEDIUM | .github/workflows/publish.yml | 485 | # ============================================================ | COMMENT |
| MEDIUM | .github/workflows/publish.yml | 487 | # ============================================================ | COMMENT |
| MEDIUM | .github/workflows/publish.yml | 659 | # ============================================================ | COMMENT |
| MEDIUM | .github/workflows/publish.yml | 661 | # ============================================================ | COMMENT |
| MEDIUM | .github/workflows/publish.yml | 961 | # ============================================================ | COMMENT |
| MEDIUM | .github/workflows/publish.yml | 963 | # ============================================================ | COMMENT |
| MEDIUM | .github/workflows/publish.yml | 1180 | # ============================================================ | COMMENT |
| MEDIUM | .github/workflows/publish.yml | 1182 | # ============================================================ | COMMENT |
| MEDIUM | .github/workflows/publish.yml | 1646 | # ============================================================ | COMMENT |
| MEDIUM | .github/workflows/publish.yml | 1648 | # ============================================================ | COMMENT |
| MEDIUM | .github/workflows/publish.yml | 2107 | # ============================================================ | COMMENT |
| MEDIUM | .github/workflows/publish.yml | 2109 | # ============================================================ | COMMENT |
| MEDIUM | .github/workflows/publish.yml | 2135 | # ============================================================ | COMMENT |
| MEDIUM | .github/workflows/publish.yml | 2137 | # ============================================================ | COMMENT |
| MEDIUM | .github/workflows/publish.yml | 2156 | # ============================================================ | COMMENT |
| MEDIUM | .github/workflows/publish.yml | 2158 | # ============================================================ | COMMENT |
| MEDIUM | .github/workflows/test.yml | 3 | # ── PR pipeline ORCHESTRATOR ──────────────────────────────────────────────── | COMMENT |
| MEDIUM | .github/workflows/test.yml | 247 | # ── Single merge gate ────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | .github/workflows/develop.yml | 3 | # ── Post-merge (develop) pipeline ORCHESTRATOR ────────────────────────────── | COMMENT |
| 2 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | …/renderers/baseRenderer/__tests__/baseRenderer.unit.ts | 177 | placeholderCellClassName: 'placeholder' | CODE |
| LOW⚡ | …/renderers/baseRenderer/__tests__/baseRenderer.unit.ts | 180 | expect(TD.outerHTML).toMatchHTML('<td class="placeholder"></td>', toMatchHTMLConfig); | CODE |
| LOW⚡ | …/renderers/baseRenderer/__tests__/baseRenderer.unit.ts | 188 | placeholderCellClassName: 'placeholder' | CODE |
| LOW | …/renderers/baseRenderer/__tests__/baseRenderer.unit.ts | 199 | placeholderCellClassName: 'placeholder' | CODE |
| LOW | …tiSelectRenderer/__tests__/multiSelectRenderer.unit.js | 134 | ['placeholder', { placeholder: 'Select items' }, []], | CODE |
| LOW | …gins/manualRowResize/__tests__/manualRowResize.spec.js | 1320 | data[0][4] = 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas hendrerit elit sed quam porta ' + | CODE |
| LOW | …gins/manualRowResize/__tests__/manualRowResize.spec.js | 1320 | data[0][4] = 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas hendrerit elit sed quam porta ' + | CODE |
| LOW | …ns/dialog/__tests__/keyboardShortcuts/shiftTab.spec.js | 63 | <h6>Hello world</h6><p>Lorem ipsum</p> | CODE |
| LOW | …ns/dialog/__tests__/keyboardShortcuts/shiftTab.spec.js | 109 | <h6>Hello world</h6><p>Lorem ipsum</p> | CODE |
| LOW | …plugins/dialog/__tests__/keyboardShortcuts/tab.spec.js | 63 | <h6>Hello world</h6><p>Lorem ipsum</p> | CODE |
| LOW | …plugins/dialog/__tests__/keyboardShortcuts/tab.spec.js | 109 | <h6>Hello world</h6><p>Lorem ipsum</p> | CODE |
| LOW | handsontable/src/plugins/sheetsBar/sheetsBar.ts | 534 | * { name: 'Q1 2025', data: [['Acme Corp', 4200000]] }, | COMMENT |
| LOW | handsontable/src/plugins/sheetsBar/sheetsBar.ts | 535 | * { name: 'Q2 2025', data: [['Acme Corp', 4700000]] }, | COMMENT |
| LOW | handsontable/src/plugins/sheetsBar/sheetsBar.ts | 553 | * { name: 'Q1 2025', data: [['Acme Corp', 4200000]] }, | COMMENT |
| LOW | handsontable/src/plugins/sheetsBar/sheetsBar.ts | 554 | * { name: 'Q2 2025', data: [['Acme Corp', 4700000]] }, | COMMENT |
| LOW | handsontable/src/plugins/sheetsBar/sheetsBar.ts | 570 | * { name: 'Q1 2025', data: [['Acme Corp', 4200000]] }, | COMMENT |
| LOW | handsontable/src/plugins/sheetsBar/sheetsBar.ts | 571 | * { name: 'Q2 2025', data: [['Acme Corp', 4700000]] }, | COMMENT |
| LOW | …c/plugins/columnSummary/__tests__/readOnlyLock.unit.js | 87 | hot.setCellMeta(2, 0, 'placeholder', 'total'); | CODE |
| LOW | …c/plugins/columnSummary/__tests__/readOnlyLock.unit.js | 88 | hot.setCellMeta(2, 0, 'placeholder', ''); | CODE |
| LOW | …c/plugins/columnSummary/__tests__/readOnlyLock.unit.js | 104 | hot.setCellMeta(2, 0, 'placeholder', 'total'); | CODE |
| LOW | …c/plugins/columnSummary/__tests__/readOnlyLock.unit.js | 105 | hot.removeCellMeta(2, 0, 'placeholder'); | CODE |
| LOW | …ble/src/plugins/nestedRows/__tests__/dataHooks.unit.js | 29 | data: [['flat', 'placeholder']], | CODE |
| LOW⚡ | …ntable/src/plugins/formulas/__tests__/formulas.spec.js | 3075 | hfInstance.renameSheet(0, 'Lorem Ipsum'); | CODE |
| LOW⚡ | …ntable/src/plugins/formulas/__tests__/formulas.spec.js | 3077 | expect(getPlugin('formulas').sheetName).toBe('Lorem Ipsum'); | CODE |
| LOW⚡ | …ntable/src/plugins/formulas/__tests__/formulas.spec.js | 3078 | expect(sheetNameInsideHook).toBe('Lorem Ipsum'); | CODE |
| LOW | …ntable/src/plugins/formulas/__tests__/formulas.spec.js | 3099 | hfInstance.renameSheet(0, 'Lorem Ipsum'); | CODE |
| LOW | …/multiSelectEditor/__tests__/multiSelectEditor.spec.js | 727 | expect($searchInput.attr('placeholder')).toBe('Search...'); | CODE |
| LOW | …ble/src/editors/multiSelectEditor/controllers/utils.ts | 109 | ['placeholder', SEARCH_INPUT_PLACEHOLDER], | CODE |
| LOW | handsontable/src/helpers/dom/__tests__/element.spec.js | 103 | .fill('Lorem ipsum dolor sit amet, consectetur adipiscing elit.').join(' '); | CODE |
| LOW | handsontable/src/helpers/dom/__tests__/element.spec.js | 103 | .fill('Lorem ipsum dolor sit amet, consectetur adipiscing elit.').join(' '); | CODE |
| LOW | handsontable/src/helpers/dom/__tests__/element.spec.js | 130 | .fill('Lorem ipsum dolor sit amet, consectetur adipiscing elit.').join(' '); | CODE |
| LOW | handsontable/src/helpers/dom/__tests__/element.spec.js | 130 | .fill('Lorem ipsum dolor sit amet, consectetur adipiscing elit.').join(' '); | CODE |
| LOW | handsontable/src/helpers/dom/__tests__/element.spec.js | 155 | .fill('Lorem ipsum dolor sit amet, consectetur adipiscing elit.').join(' '); | CODE |
| LOW | handsontable/src/helpers/dom/__tests__/element.spec.js | 155 | .fill('Lorem ipsum dolor sit amet, consectetur adipiscing elit.').join(' '); | CODE |
| LOW | handsontable/src/helpers/dom/__tests__/element.spec.js | 174 | .fill('Lorem ipsum dolor sit amet, consectetur adipiscing elit.').join(' '); | CODE |
| LOW | handsontable/src/helpers/dom/__tests__/element.spec.js | 174 | .fill('Lorem ipsum dolor sit amet, consectetur adipiscing elit.').join(' '); | CODE |
| LOW | handsontable/src/helpers/dom/__tests__/element.spec.js | 198 | .fill('Lorem ipsum dolor sit amet, consectetur adipiscing elit.').join(' '); | CODE |
| LOW | handsontable/src/helpers/dom/__tests__/element.spec.js | 198 | .fill('Lorem ipsum dolor sit amet, consectetur adipiscing elit.').join(' '); | CODE |
| LOW | handsontable/src/helpers/dom/__tests__/element.spec.js | 226 | .fill('Lorem ipsum dolor sit amet, consectetur adipiscing elit.').join(' '); | CODE |
| LOW | handsontable/src/helpers/dom/__tests__/element.spec.js | 226 | .fill('Lorem ipsum dolor sit amet, consectetur adipiscing elit.').join(' '); | CODE |
| LOW | tests/e2e/trusted-types.spec.ts | 239 | data: [['R&D', 'Budget'], ['Acme Corp', 4200]], | CODE |
| LOW | .claude/skills/creating-docs-examples/SKILL.md | 130 | ['Acme Corp', 'Q1 2025', '$4.2M'], | CODE |
| LOW | …ipes/data-management/server-side-rails/server/seeds.rb | 12 | "Acme Corp", "Vertex Industries", "Harbor Goods", "Alpine Supply Co.", | CODE |
| LOW | …erformance/expensive-cell-renderer/angular/example1.ts | 14 | const CUSTOMERS = ['Acme Corp', 'Vertex Industries', 'Harbor Goods', 'Alpine Supply Co.', 'Northwind Traders', 'Lumen Re | CODE |
| LOW | …ormance/expensive-cell-renderer/javascript/example1.js | 8 | const CUSTOMERS = ['Acme Corp', 'Vertex Industries', 'Harbor Goods', 'Alpine Supply Co.', 'Northwind Traders', 'Lumen Re | CODE |
| LOW | …ormance/expensive-cell-renderer/javascript/example1.ts | 15 | const CUSTOMERS = ['Acme Corp', 'Vertex Industries', 'Harbor Goods', 'Alpine Supply Co.', 'Northwind Traders', 'Lumen Re | CODE |
| LOW | …performance/expensive-cell-renderer/react/example1.tsx | 17 | const CUSTOMERS = ['Acme Corp', 'Vertex Industries', 'Harbor Goods', 'Alpine Supply Co.', 'Northwind Traders', 'Lumen Re | CODE |
| LOW | …performance/expensive-cell-renderer/react/example1.jsx | 9 | const CUSTOMERS = ['Acme Corp', 'Vertex Industries', 'Harbor Goods', 'Alpine Supply Co.', 'Northwind Traders', 'Lumen Re | CODE |
| LOW | …uration/configuration-option-levels/option-levels.json | 1222 | "name": "placeholder", | CODE |
| LOW | …iguration-option-levels/configuration-option-levels.md | 236 | | <span data-option="placeholder" data-levels="grid columns cells cell"></span>[`placeholder`](@/api/options.md#placehol | CODE |
| LOW | …nt/guides/cell-functions/custom-cells/vue/example3.vue | 15 | this.TEXTAREA.setAttribute('placeholder', 'Type a book title...'); | CODE |
| LOW | …t/guides/cell-functions/cell-renderer/vue/example2.vue | 44 | ['Acme Corp', 'Q1 2025', '42000'], | CODE |
| LOW | …/guides/cell-functions/cell-editor/angular/example2.ts | 11 | this.TEXTAREA.setAttribute('placeholder', 'Custom placeholder'); | CODE |
| LOW | …t/guides/cell-functions/cell-editor/react/example2.tsx | 13 | this.TEXTAREA.setAttribute('placeholder', 'Custom placeholder'); | CODE |
| LOW | …t/guides/cell-functions/cell-editor/react/example2.jsx | 12 | this.TEXTAREA.setAttribute('placeholder', 'Custom placeholder'); | CODE |
| LOW | …ating-from-15.3-to-16.0/migrating-from-15.3-to-16.0.md | 314 | this.TEXTAREA.setAttribute('placeholder', 'Custom placeholder'); | CODE |
| LOW | …uides/getting-started/vue3-hot-column/vue/example3.vue | 15 | this.TEXTAREA.setAttribute('placeholder', 'Custom placeholder'); | CODE |
| LOW | …nt/guides/styling/theme-customization/vue/example1.vue | 13 | ['John Doe', 'johndoe@example.com', 'New York', 32, 'Engineer'], | CODE |
| LOW | …nt/guides/styling/theme-customization/vue/example2.vue | 28 | ['John Doe', 'johndoe@example.com', 'New York', 32, 'Engineer'], | CODE |
| LOW | …guides/styling/theme-customization/angular/example2.ts | 41 | ['John Doe', 'johndoe@example.com', 'New York', 32, 'Engineer'], | CODE |
| 44 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | …/columnSummary/__tests__/moveAndPhysicalCoords.unit.js | 110 | // Step 1: an edit before any move works. | COMMENT |
| LOW⚡ | …/columnSummary/__tests__/moveAndPhysicalCoords.unit.js | 115 | // Step 2: move column A after column B. The result travels with its column. | COMMENT |
| LOW⚡ | …/columnSummary/__tests__/moveAndPhysicalCoords.unit.js | 120 | // Step 3: editing the moved column (now B) must update its summary. It stayed at 9 before the fix. | COMMENT |
| LOW⚡ | …/columnSummary/__tests__/moveAndPhysicalCoords.unit.js | 125 | // Step 4: editing the column that moved into A's old place must not write a summary there. Before the fix | COMMENT |
| LOW⚡ | …columnSummary/__tests__/reversedRowCoordsAlter.unit.js | 243 | // Step 1: shrink the table so B re-derives to 4 - 4 - 1 = -1 and parks (with a warning), while A | COMMENT |
| LOW⚡ | …columnSummary/__tests__/reversedRowCoordsAlter.unit.js | 250 | // Step 2: append. A re-anchors from `aRowBefore` to the new last row; its old cell must be cleared. | COMMENT |
| LOW | …a-management/server-side-django/javascript/example1.js | 28 | // Step 1: Read Django's CSRF token from the cookie. | COMMENT |
| LOW | …a-management/server-side-django/javascript/example1.js | 42 | // Step 2: Build the request URL for fetchRows. | COMMENT |
| LOW | …a-management/server-side-django/javascript/example1.js | 79 | // Step 3: Initialize Handsontable with the dataProvider plugin. | COMMENT |
| LOW | …a-management/server-side-django/javascript/example1.ts | 34 | // Step 1: Read Django's CSRF token from the cookie. | COMMENT |
| LOW | …a-management/server-side-django/javascript/example1.ts | 48 | // Step 2: Build the request URL for fetchRows. | COMMENT |
| LOW | …a-management/server-side-django/javascript/example1.ts | 77 | // Step 3: Initialize Handsontable with the dataProvider plugin. | COMMENT |
| LOW⚡ | …/data-management/server-side-django/react/example1.tsx | 15 | // Step 1: Read Django's CSRF token from the cookie. | COMMENT |
| LOW⚡ | …/data-management/server-side-django/react/example1.tsx | 25 | // Step 2: Build the request URL for fetchRows. | COMMENT |
| LOW | …/data-management/server-side-django/react/example1.tsx | 51 | // Step 3: React component with the dataProvider plugin. | COMMENT |
| LOW | …/data-management/server-side-django/react/example1.jsx | 8 | // Step 1: Read Django's CSRF token from the cookie. | COMMENT |
| LOW | …/data-management/server-side-django/react/example1.jsx | 22 | // Step 2: Build the request URL for fetchRows. | COMMENT |
| LOW | …/data-management/server-side-django/react/example1.jsx | 51 | // Step 3: React component with the dataProvider plugin. | COMMENT |
| LOW | …a-management/load-data-rest-api/javascript/example2.ts | 50 | // Step 1: Initialize the grid with columnSorting enabled and an empty dataset. | COMMENT |
| LOW | …a-management/load-data-rest-api/javascript/example2.ts | 72 | // Step 2: A helper that keeps the toolbar consistent with the current request state. | COMMENT |
| LOW | …a-management/load-data-rest-api/javascript/example2.ts | 92 | // Step 3: Map the API response to flat row objects that match the column definitions. | COMMENT |
| LOW | …a-management/load-data-rest-api/javascript/example2.ts | 104 | // Step 4: Shared fetch helper used by both initialLoad() and refreshUsers(). | COMMENT |
| LOW | …a-management/load-data-rest-api/javascript/example2.ts | 115 | // Step 5: Initial load uses loadData(), which resets all grid states. | COMMENT |
| LOW | …a-management/load-data-rest-api/javascript/example2.ts | 131 | // Step 6: Subsequent refreshes use updateData(), which replaces the data | COMMENT |
| LOW | …a-management/load-data-rest-api/javascript/example3.ts | 20 | // Step 1: Cache the full response after the first request. | COMMENT |
| LOW⚡ | …a-management/load-data-rest-api/javascript/example3.ts | 72 | // Step 2: Use dataProvider instead of a static data array. | COMMENT |
| LOW⚡ | …a-management/load-data-rest-api/javascript/example3.ts | 79 | // Step 3: fetchRows receives current query parameters and an AbortSignal. | COMMENT |
| LOW⚡ | …a-management/load-data-rest-api/javascript/example3.ts | 87 | // Step 4: Apply server-side sort from query parameters. | COMMENT |
| LOW⚡ | …a-management/load-data-rest-api/javascript/example3.ts | 99 | // Step 5: Apply server-side pagination from query parameters. | COMMENT |
| LOW⚡ | …a-management/load-data-rest-api/javascript/example3.ts | 109 | // Step 6: CRUD callbacks. jsonplaceholder is read-only, so these are no-ops. | COMMENT |
| LOW | …a-management/load-data-rest-api/javascript/example3.ts | 126 | // Step 7: Enable the Pagination plugin and pass pageSize so the plugin knows | COMMENT |
| LOW | …a-management/load-data-rest-api/javascript/example3.ts | 140 | // Step 8: Use fetch hooks to update the status label. | COMMENT |
| LOW | …a-management/load-data-rest-api/javascript/example3.js | 6 | // Step 1: Cache the full response after the first request. | COMMENT |
| LOW⚡ | …a-management/load-data-rest-api/javascript/example3.js | 55 | // Step 2: Use dataProvider instead of a static data array. | COMMENT |
| LOW⚡ | …a-management/load-data-rest-api/javascript/example3.js | 62 | // Step 3: fetchRows receives current query parameters and an AbortSignal. | COMMENT |
| LOW⚡ | …a-management/load-data-rest-api/javascript/example3.js | 67 | // Step 4: Apply server-side sort from query parameters. | COMMENT |
| LOW⚡ | …a-management/load-data-rest-api/javascript/example3.js | 79 | // Step 5: Apply server-side pagination from query parameters. | COMMENT |
| LOW⚡ | …a-management/load-data-rest-api/javascript/example3.js | 89 | // Step 6: CRUD callbacks. jsonplaceholder is read-only, so these are no-ops. | COMMENT |
| LOW | …a-management/load-data-rest-api/javascript/example3.js | 106 | // Step 7: Enable the Pagination plugin and pass pageSize so the plugin knows | COMMENT |
| LOW | …a-management/load-data-rest-api/javascript/example3.js | 120 | // Step 8: Use fetch hooks to update the status label. | COMMENT |
| LOW | …a-management/load-data-rest-api/javascript/example2.js | 45 | // Step 1: Initialize the grid with columnSorting enabled and an empty dataset. | COMMENT |
| LOW | …a-management/load-data-rest-api/javascript/example2.js | 67 | // Step 2: A helper that keeps the toolbar consistent with the current request state. | COMMENT |
| LOW | …a-management/load-data-rest-api/javascript/example2.js | 79 | // Step 3: Map the API response to flat row objects that match the column definitions. | COMMENT |
| LOW | …a-management/load-data-rest-api/javascript/example2.js | 91 | // Step 4: Shared fetch helper used by both initialLoad() and refreshUsers(). | COMMENT |
| LOW | …a-management/load-data-rest-api/javascript/example2.js | 102 | // Step 5: Initial load uses loadData(), which resets all grid states. | COMMENT |
| LOW | …a-management/load-data-rest-api/javascript/example2.js | 118 | // Step 6: Subsequent refreshes use updateData(), which replaces the data | COMMENT |
| LOW | …/data-management/load-data-graphql/angular/example2.ts | 93 | // Step 5: Initial load uses loadData() directly on the hot instance, which resets all grid states. | COMMENT |
| LOW | …/data-management/load-data-graphql/angular/example2.ts | 117 | // Step 6: Subsequent refreshes use updateData(), which replaces the data | COMMENT |
| LOW | …ta-management/load-data-graphql/javascript/example2.ts | 73 | // Step 1: Initialize the grid with columnSorting enabled and an empty dataset. | COMMENT |
| LOW | …ta-management/load-data-graphql/javascript/example2.ts | 95 | // Step 2: A helper that keeps the toolbar consistent with the current request state. | COMMENT |
| LOW | …ta-management/load-data-graphql/javascript/example2.ts | 115 | // Step 3: Map the API response to flat row objects that match the column definitions. | COMMENT |
| LOW | …ta-management/load-data-graphql/javascript/example2.ts | 127 | // Step 4: Shared GraphQL helper used by both initialLoad() and refreshUsers(). | COMMENT |
| LOW | …ta-management/load-data-graphql/javascript/example2.ts | 156 | // Step 5: Initial load uses loadData(), which resets all grid states. | COMMENT |
| LOW | …ta-management/load-data-graphql/javascript/example2.ts | 172 | // Step 6: Subsequent refreshes use updateData(), which replaces the data | COMMENT |
| LOW | …ta-management/load-data-graphql/javascript/example2.js | 64 | // Step 1: Initialize the grid with columnSorting enabled and an empty dataset. | COMMENT |
| LOW | …ta-management/load-data-graphql/javascript/example2.js | 86 | // Step 2: A helper that keeps the toolbar consistent with the current request state. | COMMENT |
| LOW | …ta-management/load-data-graphql/javascript/example2.js | 98 | // Step 3: Map the API response to flat row objects that match the column definitions. | COMMENT |
| LOW | …ta-management/load-data-graphql/javascript/example2.js | 110 | // Step 4: Shared fetch helper used by both initialLoad() and refreshUsers(). | COMMENT |
| LOW | …ta-management/load-data-graphql/javascript/example2.js | 132 | // Step 5: Initial load uses loadData(), which resets all grid states. | COMMENT |
| LOW | …ta-management/load-data-graphql/javascript/example2.js | 148 | // Step 6: Subsequent refreshes use updateData(), which replaces the data | COMMENT |
| 4 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | …dataMap/metaManager/__tests__/cellMetaEviction.spec.js | 186 | // `type` is always a resolved string, so it is the robust correctness lock. | COMMENT |
| MEDIUM | …s/nestedHeaders/__tests__/generalFunctionality.spec.js | 583 | // range (mapped from renderable to visual so the check is robust to any | COMMENT |
| MEDIUM | handsontable/src/plugins/formulas/formulas.ts | 1106 | // The `updateData` hooks utilize the same logic as the `loadData` hooks. | COMMENT |
| MEDIUM | …le/src/editors/textEditor/__tests__/textEditor.spec.js | 763 | // this robust across themes whose font metrics make AutoColumnSize grow columns past the | COMMENT |
| MEDIUM | handsontable/src/utils/manualResize/axis.ts | 178 | // TODO: this should utilize `hot.getRowHeight` after it's fixed and working properly. | COMMENT |
| MEDIUM | tests/e2e/icon-elements.spec.ts | 104 | // Absolutely positioned inside the `.htCheckboxRendererBox` wrapper, over the input. | COMMENT |
| MEDIUM | .github/workflows/performance-tests.yml | 136 | # same Chromium build, platform, and harness version). Compare mode only: in golden mode | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | …ntable/src/3rdparty/walkontable/src/table/drawCycle.ts | 73 | * (never `#deps`), exactly like the `cellAccess`/`domScaffold` mixins — so the draw orchestration | COMMENT |
| MEDIUM | .github/workflows/develop.yml | 18 | # orchestration differs. master / release/** keep their existing workflows | COMMENT |
| MEDIUM | .ai/BUILD.md | 25 | ### Core build orchestration | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | …pes/data-management/server-side-django/server/views.py | 133 | except (json.JSONDecodeError, TypeError, KeyError): | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | docs/content/guides/dialog/loading/angular/example4.ts | 43 | <p style="padding: 0; font-size: var(--sl-text-xs, 0.75rem); color: var(--sl-color-gray-3, #777777);">This is a de | CODE |
| MEDIUM | …content/guides/dialog/loading/javascript/example4.html | 9 | <p style="padding: 0; font-size: var(--sl-text-xs, 0.75rem); color: var(--sl-color-gray-3, #777777);">This is a demons | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | …ntable/src/3rdparty/walkontable/test/helpers/common.js | 176 | export function getData(row, col) { | CODE |
| LOW | …les/next/visual-tests/vue3/demo/src/utils/constants.ts | 1204 | export function getData() { | CODE |
| LOW | …/angular-wrapper/demo/src/data-grid/utils/constants.ts | 1204 | export function getData() { | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | .github/workflows/test.yml | 4 | # This file is the DAG only: it wires the module reusable workflows (one per | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | .github/workflows/publish.yml | 1423 | # Check if a merge PR already exists before pushing (idempotent for workflow re-runs) | COMMENT |
| LOW | .github/workflows/publish.yml | 1547 | # Check if LTS branch already exists | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | …pes/data-management/server-side-django/server/views.py | 47 | CODE |