Skip to content

Fix tab_size validation to fall back to default indentation#228

Merged
bartveneman merged 2 commits into
mainfrom
claude/fix-tab-size-validation
Jul 11, 2026
Merged

Fix tab_size validation to fall back to default indentation#228
bartveneman merged 2 commits into
mainfrom
claude/fix-tab-size-validation

Conversation

@bartveneman

@bartveneman bartveneman commented Jul 11, 2026

Copy link
Copy Markdown
Member

Summary

  • The tab_size guard checked Number(tab_size) < 1, but the raw tab_size value (not the coerced number) was used later in SPACE.repeat(tab_size * size).
  • A non-numeric tab_size (a JS caller bypassing the TS type, e.g. a value read from user config) coerced to NaN, which passed the old guard (NaN < 1 is false) and silently produced zero-indented output instead of falling back sensibly.
  • Fractional tab_size values were silently truncated by String.prototype.repeat instead of being normalized.
  • tab_size is now coerced once; any invalid value (non-numeric, fractional, NaN, Infinity, < 1) is silently ignored and the default tab indentation is used instead. This does not throw — it's a fix, not a breaking change.

Test plan

  • vitest run — all 259 tests pass (added cases for fractional/NaN/Infinity/non-numeric tab_size, each asserting fallback to default indentation and that no error is thrown)
  • tsc --noEmit — no type errors
  • oxlint / oxfmt --check — clean

The guard checked Number(tab_size) < 1, but the raw tab_size value
was used directly in the indentation math (SPACE.repeat(tab_size *
size)). A non-numeric tab_size (e.g. a JS caller passing a string,
bypassing the TS type) coerced to NaN, which passed the old guard
(NaN < 1 is false) and silently produced zero-indented output
instead of throwing. Fractional values were silently truncated by
String.prototype.repeat.

Now tab_size is coerced once and validated as a finite integer >= 1;
non-numeric, fractional, NaN and Infinity values all throw.
@github-actions

github-actions Bot commented Jul 11, 2026

Copy link
Copy Markdown
Contributor

⚠️ Duplicate Dependencies (found: 22, threshold: 1)

📦 Package 📋 Versions
@babel/parser
2 versions
  • root@
    • @vitest/coverage-v8@4.1.9
      • magicast@0.5.3
        • @babel/parser@7.29.7

  • root@
    • tsdown@0.22.3
      • rolldown-plugin-dts@0.26.0
        • @babel/generator@8.0.0
          • @babel/parser@8.0.0

@babel/types
2 versions
  • root@
    • @vitest/coverage-v8@4.1.9
      • magicast@0.5.3
        • @babel/parser@7.29.7
          • @babel/types@7.29.7

  • root@
    • tsdown@0.22.3
      • rolldown-plugin-dts@0.26.0
        • @babel/generator@8.0.0
          • @babel/parser@8.0.0
            • @babel/types@8.0.0

@babel/helper-string-parser
2 versions
  • root@
    • @vitest/coverage-v8@4.1.9
      • magicast@0.5.3
        • @babel/parser@7.29.7
          • @babel/types@7.29.7
            • @babel/helper-string-parser@7.29.7

  • root@
    • tsdown@0.22.3
      • ...
        • @babel/parser@8.0.0
          • @babel/types@8.0.0
            • @babel/helper-string-parser@8.0.0

@babel/helper-validator-identifier
2 versions
  • root@
    • @vitest/coverage-v8@4.1.9
      • magicast@0.5.3
        • @babel/parser@7.29.7
          • @babel/types@7.29.7
            • @babel/helper-validator-identifier@7.29.7

  • root@
    • tsdown@0.22.3
      • ...
        • @babel/parser@8.0.0
          • @babel/types@8.0.0
            • @babel/helper-validator-identifier@8.0.2

@rolldown/binding-wasm32-wasi
2 versions
  • root@
    • tsdown@0.22.3
      • rolldown@1.1.3
        • @rolldown/binding-wasm32-wasi@1.1.3

  • root@
    • @vitest/coverage-v8@4.1.9
      • ...
        • vite@8.1.4
          • rolldown@1.1.5
            • @rolldown/binding-wasm32-wasi@1.1.5

picomatch
2 versions
  • root@
    • @vitest/coverage-v8@4.1.9
      • ...
        • tinyglobby@0.2.17
          • fdir@6.5.0
            • picomatch@4.0.4

  • root@
    • @vitest/coverage-v8@4.1.9
      • vitest@4.1.9
        • @vitest/mocker@4.1.9
          • vite@8.1.4
            • picomatch@4.0.5

rolldown
2 versions
  • root@
    • tsdown@0.22.3
      • rolldown@1.1.3

  • root@
    • @vitest/coverage-v8@4.1.9
      • vitest@4.1.9
        • @vitest/mocker@4.1.9
          • vite@8.1.4
            • rolldown@1.1.5

@oxc-project/types
2 versions
  • root@
    • tsdown@0.22.3
      • rolldown@1.1.3
        • @oxc-project/types@0.137.0

  • root@
    • @vitest/coverage-v8@4.1.9
      • ...
        • vite@8.1.4
          • rolldown@1.1.5
            • @oxc-project/types@0.139.0

@rolldown/binding-android-arm64
2 versions
  • root@
    • tsdown@0.22.3
      • rolldown@1.1.3
        • @rolldown/binding-android-arm64@1.1.3

  • root@
    • @vitest/coverage-v8@4.1.9
      • ...
        • vite@8.1.4
          • rolldown@1.1.5
            • @rolldown/binding-android-arm64@1.1.5

@rolldown/binding-darwin-arm64
2 versions
  • root@
    • tsdown@0.22.3
      • rolldown@1.1.3
        • @rolldown/binding-darwin-arm64@1.1.3

  • root@
    • @vitest/coverage-v8@4.1.9
      • ...
        • vite@8.1.4
          • rolldown@1.1.5
            • @rolldown/binding-darwin-arm64@1.1.5

@rolldown/binding-darwin-x64
2 versions
  • root@
    • tsdown@0.22.3
      • rolldown@1.1.3
        • @rolldown/binding-darwin-x64@1.1.3

  • root@
    • @vitest/coverage-v8@4.1.9
      • ...
        • vite@8.1.4
          • rolldown@1.1.5
            • @rolldown/binding-darwin-x64@1.1.5

@rolldown/binding-freebsd-x64
2 versions
  • root@
    • tsdown@0.22.3
      • rolldown@1.1.3
        • @rolldown/binding-freebsd-x64@1.1.3

  • root@
    • @vitest/coverage-v8@4.1.9
      • ...
        • vite@8.1.4
          • rolldown@1.1.5
            • @rolldown/binding-freebsd-x64@1.1.5

@rolldown/binding-linux-arm-gnueabihf
2 versions
  • root@
    • tsdown@0.22.3
      • rolldown@1.1.3
        • @rolldown/binding-linux-arm-gnueabihf@1.1.3

  • root@
    • @vitest/coverage-v8@4.1.9
      • ...
        • vite@8.1.4
          • rolldown@1.1.5
            • @rolldown/binding-linux-arm-gnueabihf@1.1.5

@rolldown/binding-linux-arm64-gnu
2 versions
  • root@
    • tsdown@0.22.3
      • rolldown@1.1.3
        • @rolldown/binding-linux-arm64-gnu@1.1.3

  • root@
    • @vitest/coverage-v8@4.1.9
      • ...
        • vite@8.1.4
          • rolldown@1.1.5
            • @rolldown/binding-linux-arm64-gnu@1.1.5

@rolldown/binding-linux-arm64-musl
2 versions
  • root@
    • tsdown@0.22.3
      • rolldown@1.1.3
        • @rolldown/binding-linux-arm64-musl@1.1.3

  • root@
    • @vitest/coverage-v8@4.1.9
      • ...
        • vite@8.1.4
          • rolldown@1.1.5
            • @rolldown/binding-linux-arm64-musl@1.1.5

@rolldown/binding-linux-ppc64-gnu
2 versions
  • root@
    • tsdown@0.22.3
      • rolldown@1.1.3
        • @rolldown/binding-linux-ppc64-gnu@1.1.3

  • root@
    • @vitest/coverage-v8@4.1.9
      • ...
        • vite@8.1.4
          • rolldown@1.1.5
            • @rolldown/binding-linux-ppc64-gnu@1.1.5

@rolldown/binding-linux-s390x-gnu
2 versions
  • root@
    • tsdown@0.22.3
      • rolldown@1.1.3
        • @rolldown/binding-linux-s390x-gnu@1.1.3

  • root@
    • @vitest/coverage-v8@4.1.9
      • ...
        • vite@8.1.4
          • rolldown@1.1.5
            • @rolldown/binding-linux-s390x-gnu@1.1.5

@rolldown/binding-linux-x64-gnu
2 versions
  • root@
    • tsdown@0.22.3
      • rolldown@1.1.3
        • @rolldown/binding-linux-x64-gnu@1.1.3

  • root@
    • @vitest/coverage-v8@4.1.9
      • ...
        • vite@8.1.4
          • rolldown@1.1.5
            • @rolldown/binding-linux-x64-gnu@1.1.5

@rolldown/binding-linux-x64-musl
2 versions
  • root@
    • tsdown@0.22.3
      • rolldown@1.1.3
        • @rolldown/binding-linux-x64-musl@1.1.3

  • root@
    • @vitest/coverage-v8@4.1.9
      • ...
        • vite@8.1.4
          • rolldown@1.1.5
            • @rolldown/binding-linux-x64-musl@1.1.5

@rolldown/binding-openharmony-arm64
2 versions
  • root@
    • tsdown@0.22.3
      • rolldown@1.1.3
        • @rolldown/binding-openharmony-arm64@1.1.3

  • root@
    • @vitest/coverage-v8@4.1.9
      • ...
        • vite@8.1.4
          • rolldown@1.1.5
            • @rolldown/binding-openharmony-arm64@1.1.5

@rolldown/binding-win32-arm64-msvc
2 versions
  • root@
    • tsdown@0.22.3
      • rolldown@1.1.3
        • @rolldown/binding-win32-arm64-msvc@1.1.3

  • root@
    • @vitest/coverage-v8@4.1.9
      • ...
        • vite@8.1.4
          • rolldown@1.1.5
            • @rolldown/binding-win32-arm64-msvc@1.1.5

@rolldown/binding-win32-x64-msvc
2 versions
  • root@
    • tsdown@0.22.3
      • rolldown@1.1.3
        • @rolldown/binding-win32-x64-msvc@1.1.3

  • root@
    • @vitest/coverage-v8@4.1.9
      • ...
        • vite@8.1.4
          • rolldown@1.1.5
            • @rolldown/binding-win32-x64-msvc@1.1.5

💡 To find out what depends on a specific package, run: pnpm -r why example-package

📦 Package Bundle Size

No bundle size changes.

…rowing

An invalid tab_size (0, negative, fractional, NaN, Infinity, or a
non-numeric value from a JS caller bypassing the TS type) is now
silently ignored, falling back to the default tab indentation,
rather than throwing a TypeError.
@bartveneman bartveneman changed the title Fix tab_size validation to match runtime usage Fix tab_size validation to fall back to default indentation Jul 11, 2026
@bartveneman bartveneman merged commit a199b4d into main Jul 11, 2026
8 checks passed
@bartveneman bartveneman deleted the claude/fix-tab-size-validation branch July 11, 2026 15:02
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants