Skip to content

Releases: lukeed/clsx

v2.1.1

23 Apr 05:29
Compare
Choose a tag to compare

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: v2.1.0...v2.1.1

v2.1.0

29 Dec 20:48
Compare
Choose a tag to compare

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: v2.0.1...v2.1.0

v2.0.1

29 Dec 19:34
Compare
Choose a tag to compare

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


Full Changelog: v2.0.0...v2.0.1

v2.0.0

16 Jul 00:03
Compare
Choose a tag to compare

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


Full Changelog: v1.2.1...v2.0.0

v1.2.1

06 Jul 00:12
Compare
Choose a tag to compare

Patches

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

Chores


Full Changelog: v1.2.0...v1.2.1

v1.2.0

02 Jul 23:13
Compare
Choose a tag to compare

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


Full Changelog: v1.1.1...v1.2.0

v1.1.1

30 May 06:40
Compare
Choose a tag to compare

Note: This is a performance-related patch only!
Across all benchmarks, this version of clsx is ~1M ops/sec faster than clsx@1.1.0.
...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

Benchmarks

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

The snippet below is comparing clsx@1.1.1 (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)
  clsx@1.1.0    x 11,253,372 ops/sec ±0.35% (96 runs sampled)
  clsx@1.1.1    x 12,784,134 ops/sec ±0.42% (97 runs sampled)

# Objects
  classnames    x 3,772,978 ops/sec ±0.46% (96 runs sampled)
  clsx@1.1.0    x 7,288,178 ops/sec ±0.31% (96 runs sampled)
  clsx@1.1.1    x 9,412,010 ops/sec ±0.42% (95 runs sampled)

# Arrays
  classnames    x 1,665,275 ops/sec ±1.83% (93 runs sampled)
  clsx@1.1.0    x 8,340,174 ops/sec ±0.53% (96 runs sampled)
  clsx@1.1.1    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)
  clsx@1.1.0    x 6,284,485 ops/sec ±0.58% (90 runs sampled)
  clsx@1.1.1    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)
  clsx@1.1.0    x 6,345,248 ops/sec ±0.21% (95 runs sampled)
  clsx@1.1.1    x 7,651,411 ops/sec ±0.56% (95 runs sampled)

# Mixed
  classnames    x 2,129,199 ops/sec ±1.46% (94 runs sampled)
  clsx@1.1.0    x 6,557,515 ops/sec ±0.73% (91 runs sampled)
  clsx@1.1.1    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)
  clsx@1.1.0    x 2,018,654 ops/sec ±0.15% (98 runs sampled)
  clsx@1.1.1    x 2,238,939 ops/sec ±0.34% (95 runs sampled)

v1.1.0

03 Feb 20:11
Compare
Choose a tag to compare

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 clsx@1.0.4 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)
    

v1.0.4

06 Apr 23:33
Compare
Choose a tag to compare

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 clsx@1.0.3 and clsx@1.0.4 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

v1.0.3

18 Feb 20:07
Compare
Choose a tag to compare

Patches

  • Changed "module" entry file to .js extension (#7): 29b2fce

    Unfortunately, webpack changed how they treat .mjs files somewhat recently. This is a huge step backwards and hopefully they revert this change soon. See mui/material-ui-pickers#894