Skip to content

Commit

Permalink
feat: enhance performance
Browse files Browse the repository at this point in the history
  • Loading branch information
xobotyi committed Dec 27, 2021
1 parent 7d237c8 commit 7aefefd
Show file tree
Hide file tree
Showing 3 changed files with 57 additions and 29 deletions.
18 changes: 9 additions & 9 deletions benchmark/src/common.js
Original file line number Diff line number Diff line change
@@ -1,23 +1,23 @@
const classnames = require('classnames');
// const classcat = require('classcat');
const classcat = require('classcat');
// classcat somewhy uses ES6 export for browser
const clsx = require('clsx');
const cnbuilderNpm = require('cnbuilder/dist').cnb;
const cnbuilderLocal = require('../../esnext').cnb;
// const cnbuilderNpm = require('cnbuilder/cjs').cnb;
const cnbuilderLocal = require('../../cjs').cnb;
const runTests = require('./run');

const libraries = {
'classnames ': (args) => classnames.apply(classnames, args),
// 'classcat ': args => classcat.call(classcat, args),
'clsx ': (args) => clsx.apply(clsx, args),
'cnbuilder (local)': (args) => cnbuilderLocal.apply(cnbuilderLocal, args),
'cnbuilder (npm) ': (args) => cnbuilderNpm.apply(cnbuilderNpm, args),
// 'cnbuilder (npm)': (args) => cnbuilderNpm.apply(cnbuilderNpm, args),
cnbuilder: (args) => cnbuilderLocal.apply(cnbuilderLocal, args),
classnames: (args) => classnames.apply(classnames, args),
clsx: (args) => clsx.apply(clsx, args),
classcat: (args) => classcat.call(classcat, args),
};

const testData = [
{
name: 'strings',
data: ['foo', '', 'bar', 'baz', 'bax', 'bux'],
data: ['foo', '', 'bar', 'baz', '', 'bax', 'bux'],
},
{
name: 'objects',
Expand Down
56 changes: 38 additions & 18 deletions src/cnb.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
/* eslint-disable no-cond-assign */
export type ClassValue =
| string
| null
Expand All @@ -15,24 +16,33 @@ export interface IClassListDictionary {
const { isArray } = Array;

const toClassName = (val: any): string => {
if (typeof val === 'string') return val;

if (typeof val !== 'object') return '';

let str = '';
let tmp;

if (isArray(val)) {
let i = 0;
if (typeof val === 'string') str += val;
else if (typeof val === 'object') {
let tmp;

while (i < val.length) {
tmp = toClassName(val[i++]);
if (tmp) str += (str && ' ') + tmp;
}
} else {
for (tmp in val) {
if (val[tmp] && tmp) {
str += (str && ' ') + tmp;
if (isArray(val)) {
let i = 0;
const l = val.length;
while (i < l) {
tmp = toClassName(val[i++]);
if (tmp) {
if (str) {
str += ' ';
}
str += tmp;
}
}
} else {
// eslint-disable-next-line guard-for-in
for (tmp in val) {
if (tmp && val[tmp]) {
if (str) {
str += ' ';
}
str += tmp;
}
}
}
}
Expand All @@ -42,13 +52,23 @@ const toClassName = (val: any): string => {

export function cnb(...args: ClassListArray): string;
export function cnb(): string {
const l = arguments.length;
let i = 0;
let n;
let tmp;
let str = '';

while (i < arguments.length) {
tmp = toClassName(arguments[i++]);
if (tmp) str += (str && ' ') + tmp;
while (i < l) {
n = arguments[i++];
if (n) {
tmp = toClassName(n);
if (tmp) {
if (str) {
str += ' ';
}
str += tmp;
}
}
}

return str;
Expand Down
12 changes: 10 additions & 2 deletions src/dcnb.ts
Original file line number Diff line number Diff line change
Expand Up @@ -46,14 +46,22 @@ export function dcnb(...args: ClassListArray): string;
export function dcnb(): string {
const storage = new Storage();
let i: number | string = 0;
const l = arguments.length;

while (i < arguments.length) {
while (i < l) {
addVal(arguments[i++], storage);
}

let str = '';

for (i in storage) if (storage[i] && i) str += (str && ' ') + i;
for (i in storage) {
if (storage[i] && i) {
if (str) {
str += ' ';
}
str += i;
}
}

return str;
}

0 comments on commit 7aefefd

Please sign in to comment.