clsx

A tiny (239B) utility for constructing `className` strings conditionally.

MIT License

Downloads
94.7M
Stars
7.3K
Committers
14

Bot releases are hidden (Show)

clsx - v2.1.1 Latest Release

Published by lukeed 6 months ago

Patches

  • (types) Include bigint in ClassValue type: (#96): 3d960ab
    Accommodates recent @types/react changes to ReactNode.
    Thank you @ViliamKopecky~!

Chores

  • Add licenses.dev badge: 684509c
    This service recursively analyzes entire dependency graphs to ensure that a package (or your project) is using permissive licenses. For example, here's a results table for polka@next and a larger astro example.

Full Changelog: https://github.com/lukeed/clsx/compare/v2.1.0...v2.1.1

clsx - v2.1.0

Published by lukeed 10 months ago

Features

  • Add new clsx/lite submodule for string-only usage: 1a49142

    This is a 140b version of clsx that is ideal for Tailwind and/or React contexts, which typically follow this clsx usage pattern:

    clsx('foo bar', props.maybe && 'conditional classes', props.className);
    

    Important: This clsx/lite module ignores all non-string arguments and is therefore not a 1:1 replacement for clsx itself!

    import { clsx } from 'clsx';
    import { clsx as lite } from 'clsx/lite';
    
    // strings-only usage is identical
    clsx('foo', null, 'bar', true && 'baz'); //=> "foo bar baz"
    lite('foo', null, 'bar', true && 'baz'); //=> "foo bar baz"
    
    // clsx/lite ignores all non-strings
    clsx('foo', { a: true, b: false, c: true }); //=> "foo a c"
    lite('foo', { a: true, b: false, c: true }); //=> "foo"
    

Full Changelog: https://github.com/lukeed/clsx/compare/v2.0.1...v2.1.0

clsx - v2.0.1

Published by lukeed 10 months ago

Patches

  • (perf) Cache arguments.length & array.length for 6% performance gain (#26): deff09b
    Adds 5 bytes (+2%) for ~3% avg performance gain
    Thank you @jalalazimi

Chores

  • Update module size: bf64e71
  • Update benchmark results: 855eec2, 6e3b2b9,
  • Replace nyc with c8 in CI: 6e2468e
  • Update Node CI matrix: 308a238
  • Fix readme typos (#76, #82): 42354d3, 4c9a55d
    Thank you @andipaetzold and @acusti

Full Changelog: https://github.com/lukeed/clsx/compare/v2.0.0...v2.0.1

clsx - v2.0.0

Published by lukeed over 1 year ago

Breaking

  • Add "exports" map for native ESM support (#57): 3ec8e9f, 0949868
    Also supports TypeScript's node16/nodenext module resolution
    Maintains CommonJS support (with fixed TS definitions)
    Thank you @remcohaszing~!

Chores

  • Add Tailwind Support section to README (#65, #68): 496db1d, 4a4eadd
    Thank you @kevinlowe0x3F7 & @kevinlowe0x3F7
  • Add tests for numbers & variadic number arguments: c520353
  • Update package module size: 03e1cf9

Full Changelog: https://github.com/lukeed/clsx/compare/v1.2.1...v2.0.0

clsx - v1.2.1

Published by lukeed over 2 years ago

Patches

  • Ensure CommonJS and UMD entrypoints have the named clsx export too

Chores

  • Build CJS & UMD files manually (#50): 3712966, 2114f5b

Full Changelog: https://github.com/lukeed/clsx/compare/v1.2.0...v1.2.1

clsx - v1.2.0

Published by lukeed over 2 years ago

Features

  • Add named clsx export alias (#43, #44): 56ab81f
    Thank you @danikaze~!
    This is purely an alias for the default export so that TypeScript users can avoid the esModuleInterop setting. In other words, the follow import statements are effectively identical, but the latter is preferred by TypeScript:

    import clsx from 'clsx';
    // or
    import { clsx } from 'clsx';
    

    Important: Just to reiterate, both still work!

Chores

  • Migrate from tape to uvu for tests: 1c36d10
  • Add Node 14 and Node 16 to CI test matrix: bc4f827
  • Update "string variadic" tests (#30): 74cefa6
    Thank you @gingerrific~!
  • Enable GitHub Sponsors button: 400b848

Full Changelog: https://github.com/lukeed/clsx/compare/v1.1.1...v1.2.0

clsx -

Published by lukeed over 4 years ago

Note: This is a performance-related patch only!Across all benchmarks, this version of clsx is ~1M ops/sec faster than [email protected]....It also happens to be 1 byte (gzip) smaller 😅🎉

Patches

  • fix: Remove needless spacer on string/number condition: ff11464
  • fix: Remove unnecessary recursive caller for object keys: f43dd23
  • perf: Guard all toVal calls with truthy assertions: 4fa8811, 019ec02
  • perf: Reorder typeof checks for common case: 08a5a7f

Chores

  • Run CI via GitHub Actions: 64af363, 883363b, 866620d, 768ffab, 5e92fdf
  • Report code coverage within CI script: 0fb6d98
  • Use esm hook with tests: 0287e40
  • Update module size (-1 byte): 7e8c75e
  • Update benchmark results: 75053c0
  • Lock all dev-deps: 3c6aa3f
  • Update badges: fd1533f

Benchmarks

Run on Node.js v10.13.0.You may find updated browser benchmarks here.

The snippet below is comparing [email protected] (this version) to the previous version, and to classnames for ballpark comparison. All candidates are functionally identical!

# Strings
  classnames    x  3,992,284 ops/sec ±1.64% (94 runs sampled)
  [email protected]    x 11,253,372 ops/sec ±0.35% (96 runs sampled)
  [email protected]    x 12,784,134 ops/sec ±0.42% (97 runs sampled)

# Objects
  classnames    x 3,772,978 ops/sec ±0.46% (96 runs sampled)
  [email protected]    x 7,288,178 ops/sec ±0.31% (96 runs sampled)
  [email protected]    x 9,412,010 ops/sec ±0.42% (95 runs sampled)

# Arrays
  classnames    x 1,665,275 ops/sec ±1.83% (93 runs sampled)
  [email protected]    x 8,340,174 ops/sec ±0.53% (96 runs sampled)
  [email protected]    x 9,141,916 ops/sec ±0.42% (95 runs sampled)

# Nested Arrays
  classnames    x 1,164,706 ops/sec ±1.60% (95 runs sampled)
  [email protected]    x 6,284,485 ops/sec ±0.58% (90 runs sampled)
  [email protected]    x 7,165,151 ops/sec ±0.47% (91 runs sampled)

# Nested Arrays w/ Objects
  classnames    x 1,597,180 ops/sec ±1.49% (93 runs sampled)
  [email protected]    x 6,345,248 ops/sec ±0.21% (95 runs sampled)
  [email protected]    x 7,651,411 ops/sec ±0.56% (95 runs sampled)

# Mixed
  classnames    x 2,129,199 ops/sec ±1.46% (94 runs sampled)
  [email protected]    x 6,557,515 ops/sec ±0.73% (91 runs sampled)
  [email protected]    x 8,119,210 ops/sec ±0.42% (93 runs sampled)

# Mixed (Bad Data)
  classnames    x 1,166,577 ops/sec ±0.84% (94 runs sampled)
  [email protected]    x 2,018,654 ops/sec ±0.15% (98 runs sampled)
  [email protected]    x 2,238,939 ops/sec ±0.34% (95 runs sampled)
clsx -

Published by lukeed over 4 years ago

Minor / Patch

  • Use Array.isArray for proper Array type-checking (#17): 0d6023a

    This prevents an object with a truthy push key from being treated as an Array. While (likely) rare, this produced an incorrect result.

    Important: Because of this change, Internet Explorer 8 (and older) are no longer supported.If you happen to require support for these browsers, please continue to use the 1.0.x version range.

Chores

  • Updated benchmark results: 3cfb6c3

    Because Array.isArray is highly optimized in all modern JS engines, we received a bit of a speed boost!

    Below is [email protected] versus this release, running in Node.js 10.13.0

    # Strings
      clsx (prev)  x 10,336,101 ops/sec ±1.45% (90 runs sampled)
      clsx         x 11,191,101 ops/sec ±0.51% (97 runs sampled)
    
    # Objects
      clsx (prev)  x 7,195,049 ops/sec ±0.35% (92 runs sampled)
      clsx         x 7,133,215 ops/sec ±0.31% (93 runs sampled)
    
    # Arrays
      clsx (prev)  x 8,265,223 ops/sec ±0.32% (94 runs sampled)
      clsx         x 8,346,704 ops/sec ±0.29% (98 runs sampled)
    
    # Nested Arrays
      clsx (prev)  x 6,244,513 ops/sec ±1.41% (94 runs sampled)
      clsx         x 6,324,445 ops/sec ±0.38% (95 runs sampled)
    
    # Nested Arrays w/ Objects
      clsx (prev)  x 5,157,630 ops/sec ±0.34% (92 runs sampled)
      clsx         x 6,349,877 ops/sec ±0.26% (97 runs sampled)
    
    # Mixed
      clsx (prev)  x 5,751,180 ops/sec ±0.38% (95 runs sampled)
      clsx         x 6,722,160 ops/sec ±0.36% (98 runs sampled)
    
    # Mixed (Bad Data)
      clsx (prev)  x 1,935,973 ops/sec ±0.19% (97 runs sampled)
      clsx         x 2,053,230 ops/sec ±0.27% (95 runs sampled)
    
clsx -

Published by lukeed over 5 years ago

Patches

  • Ignore function arguments: 4aff569

  • Separate Array and Object loops: 91f5e68

    While this did add ~20 bytes to the package (which is a 10% size increase), it made any Array interactions 200% to 600% faster! 🎉 Below is a performance comparison between [email protected] and [email protected] running on Node v10.13.0:

    # Strings
      clsx (prev)  x 10,661,038 ops/sec ±0.46% (92 runs sampled)
      clsx         x 11,066,632 ops/sec ±0.23% (96 runs sampled)
    
    # Objects
      clsx (prev)  x 6,934,269 ops/sec ±0.23% (94 runs sampled)
      clsx         x 7,147,168 ops/sec ±0.30% (95 runs sampled)
    
    # Arrays
      clsx (prev)  x 1,681,568 ops/sec ±0.32% (97 runs sampled)
      clsx         x 7,922,225 ops/sec ±0.18% (95 runs sampled)
    
    # Nested Arrays
      clsx (prev)  x   940,741 ops/sec ±0.33% (96 runs sampled)
      clsx         x 6,132,222 ops/sec ±0.49% (95 runs sampled)
    
    # Nested Arrays w/ Objects
      clsx (prev)  x 1,428,975 ops/sec ±0.15% (95 runs sampled)
      clsx         x 5,156,844 ops/sec ±0.22% (95 runs sampled)
    
    # Mixed
      clsx (prev)  x 2,198,907 ops/sec ±0.34% (98 runs sampled)
      clsx         x 5,577,715 ops/sec ±0.20% (93 runs sampled)
    
    # Mixed (Bad Data)
      clsx (prev)  x 1,038,752 ops/sec ±0.32% (94 runs sampled)
      clsx         x 1,887,010 ops/sec ±0.14% (96 runs sampled)
    

Chores

  • Include Node.js benchmarks: b7c3973
  • Update benchmark results: 8d5a2f7, e85c5be
  • Fix README typos: ead41a3, 4a4413d
  • Update size: a0fd98a
clsx -

Published by lukeed over 5 years ago

Patches

clsx -

Published by lukeed over 5 years ago

Patches

  • Allow undefined in TypeScript definitions (#6): af56fa4
    Thank you @chulanovskyi!
clsx -

Published by lukeed almost 6 years ago

Patches

  • Added TypeScript definitions (#3, #5) : 08d028f, 4526f76
    Thank you @maraisr 🙌

Chores

  • Update package sizes: 2047ec9
  • Import builder: 4ee554a