New Research: Supply Chain Attack on Axios Pulls Malicious Dependency from npm.Details
Socket
Book a DemoSign in
Socket

@gentleduck/variants

Package Overview
Dependencies
Maintainers
1
Versions
11
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@gentleduck/variants - npm Package Compare versions

Comparing version
0.1.20
to
0.1.21
+23
-7
dist/index.d.ts

@@ -92,9 +92,5 @@ //#region src/variants.types.d.ts

* Used to exclude `class` and `className` from `VariantProps`.
*
* @internal
* @template T - A union type.
* @example
* ```ts
* type Props = { class?: string; className?: string }
* type PropsWithoutArray = RemoveArray<Props>
* // => { class?: string; className?: string }
* ```
*/

@@ -145,2 +141,22 @@ type RemoveArray<T> = T extends unknown[] ? never : T;

type ClassValue = string | number | boolean | ClassDictionary | ClassArray;
/**
* Infers the variant configuration type from a `VariantsOptions` object.
* Useful for deriving variant types from a config without manually duplicating them.
*
* @template T - A `VariantsOptions` object.
*
* @example
* ```ts
* const config = {
* variants: {
* size: { sm: 'text-sm', lg: 'text-lg' },
* intent: { primary: 'bg-blue-500', danger: 'bg-red-500' },
* },
* } satisfies VariantsOptions<{ size: { sm: string; lg: string }; intent: { primary: string; danger: string } }>
*
* type MyVariants = InferVariants<typeof config>
* // => { size: { sm: string; lg: string }; intent: { primary: string; danger: string } }
* ```
*/
type InferVariants<T extends VariantsOptions<Record<string, Record<string, string | string[]>>>> = T['variants'];
//#endregion

@@ -198,3 +214,3 @@ //#region src/variants.d.ts

//#endregion
export { ClassArray, ClassDictionary, ClassValue, CvaProps, VariantParams, VariantProps, VariantsOptions, cva };
export { ClassArray, ClassDictionary, ClassValue, CvaProps, InferVariants, VariantParams, VariantProps, VariantsOptions, cva };
//# sourceMappingURL=index.d.ts.map

@@ -1,1 +0,1 @@

{"version":3,"file":"index.d.ts","names":[],"sources":["../src/variants.types.ts","../src/variants.ts"],"sourcesContent":[],"mappings":";;AAkBA;;;;;;;;;;AA0CA;;;;;;;AAII,KA9CQ,aA8CR,CAAA,kBA9CwC,MA8CxC,CAAA,MAAA,EA9CuD,MA8CvD,CAAA,MAAA,EAAA,MAAA,GAAA,MAAA,EAAA,CAAA,CAAA,CAAA,GAAA,QACU,MA9CA,SA8CA,IAAA,MA9CmB,SA8CnB,CA9C6B,CA8C7B,CAAA,GA9CkC,KA8ClC,CAAA,MA9C8C,SA8C9C,CA9CwD,CA8CxD,CAAA,CAAA,EACI;;;AAuBlB;;;;;;;;AAGC;AAiCD;;;;;;;;;AAUA;AAGA;AAkBA;;;;ACdA;;;;;;;;;;;;UDlFiB,kCAAkC,eAAe;YACtD;oBACQ,cAAc;qBACb,MACjB,cAAc;YACJ;gBACI;;;;;;;;;;;;;;;;;;;;;KAuBN,2BAA2B,eAAe,sCAAsC,cAAc;cAC5F;UACJ;;;;;;;;;;;;;KAcL,iBAAiB,8BAA8B;;;;;;;;;;;;;;;;;;;KAoBxC,kBAAkB,wDAEZ,KAAK,0CAA0C,IAAI,YAAY,EAAE;;;;;KAQvE,eAAA,GAAkB;;KAGlB,UAAA,GAAa;;;;;;;;;;;;;;;;;KAkBb,UAAA,+BAAyC,kBAAkB;;;AA1IvE;;;;;;;;;;AA0CA;;;;;;;;;;;;AA6BA;;;;;;;;AAGC;AAiCD;;;;;;;;;AAUA;AAGA;AAkBA;;;;ACdgB,iBAAA,GAAG,CAAA,kBAAmB,MAAnB,CAAA,MAAA,EAAkC,MAAlC,CAAA,MAAA,EAAA,MAAA,GAAA,MAAA,EAAA,CAAA,CAAA,CAAA,CAAA,aAAA,EAAA,MAAA,GAAA,CACQ,eADR,CACwB,SADxB,CAAA,GAAA;EAAkC,IAAA,CAAA,EAAA,MAAA;CAAf,CAAA,EAAA,YAAA,CAAA,EAErB,eAFqB,CAEL,SAFK,CAAA,CAAA,EAAA,CAAA,KAAA,CAAA,EAG1B,QAH0B,CAGjB,SAHiB,CAAA,EAAA,GAAA,MAAA"}
{"version":3,"file":"index.d.ts","names":[],"sources":["../src/variants.types.ts","../src/variants.ts"],"mappings":";;AAkBA;;;;;;;;;;;;;;;;;KAAY,aAAA,mBAAgC,MAAA,SAAe,MAAA,8CAC7C,SAAA,UAAmB,SAAA,CAAU,CAAA,IAAK,KAAA,OAAY,SAAA,CAAU,CAAA;;;;;;AAyCtE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;UAAiB,eAAA,mBAAkC,MAAA,SAAe,MAAA;EAChE,QAAA,EAAU,SAAA;EACV,eAAA,GAAkB,aAAA,CAAc,SAAA;EAChC,gBAAA,GAAmB,KAAA,CACjB,aAAA,CAAc,SAAA;IACZ,KAAA,GAAQ,UAAA;IACR,SAAA,GAAY,UAAA;EAAA;AAAA;;;;;;;;;;;;;;;AA0BjB;;;;KAHW,QAAA,mBAA2B,MAAA,SAAe,MAAA,gCAAsC,aAAA,CAAc,SAAA;EACxG,SAAA,GAAY,UAAA;EACZ,KAAA,GAAQ,UAAA;AAAA;;AA8BV;;;;;;KApBK,WAAA,MAAiB,CAAA,6BAA8B,CAAA;;;;;;;;;;;;;;;;;;;KAoBxC,YAAA,MAAkB,CAAA,WAAW,KAAA,uCAEvB,CAAA,IAAK,CAAA,yCAA0C,CAAA,GAAI,WAAA,CAAY,CAAA,CAAE,CAAA;;;AAWnF;;KAHY,eAAA,GAAkB,MAAA;;KAGlB,UAAA,GAAa,UAAA;AAkBzB;;;;;AAqBA;;;;;;;;;;;AArBA,KAAY,UAAA,+BAAyC,eAAA,GAAkB,UAAA;;;;;;;;AC1BvE;;;;;;;;;;;;KD+CY,aAAA,WAAwB,eAAA,CAAgB,MAAA,SAAe,MAAA,iCAAuC,CAAA;;;AA3J1G;;;;;;;;;;;;;;;;;;;;;;;;;AA0CA;;;;;;;;;;;;;;;;;;;;;AA1CA,iBC4GgB,GAAA,mBAAsB,MAAA,SAAe,MAAA,6BAAA,CACnD,aAAA,YAAyB,eAAA,CAAgB,SAAA;EAAe,IAAA;AAAA,IACxD,YAAA,GAAe,eAAA,CAAgB,SAAA,KAC7B,KAAA,GAAQ,QAAA,CAAS,SAAA"}

@@ -1,1 +0,1 @@

{"version":3,"file":"index.js","names":["getCacheKey","props","entries","Object","key","i","length","entry","k","v","Array","isArray","map","String","join","flattenClasses","input","tokens","undefined","parts","split","part","push","hasOwn","cva","baseOrOptions","maybeOptions","config","base","variants","defaultVariants","compoundVariants","cache","Map","cacheKey","memo","get","seen","Set","merged","variantName","cls","cv","match","cond","actual","includes","toString","class","className","token","add","result","from","set"],"sources":["../src/variants.ts"],"sourcesContent":["import type { ClassValue, CvaProps, VariantsOptions } from './variants.types'\n\n/**\n * Build a stable cache key by serializing props entries in sorted order.\n *\n * @template TVariants\n * The mapping of variant names to their allowed string/string[] classes.\n *\n * @param {CvaProps<TVariants>} props\n * The props object passed into the CVA function (variant selections + class/className).\n *\n * @returns {string}\n * A deterministic string key used for memoization.\n *\n * @example\n * ```ts\n * getCacheKey({ intent: 'primary', size: ['sm', 'md'], className: 'mt-4' })\n * // => \"className:mt-4|intent:primary|size:[sm,md]\"\n * ```\n */\nfunction getCacheKey<TVariants extends Record<string, Record<string, string | string[]>>>(\n props: CvaProps<TVariants>,\n): string {\n const entries = Object.entries(props) as [string, ClassValue][]\n\n let key = ''\n for (let i = 0; i < entries.length; i++) {\n const entry = entries[i]\n if (!entry) continue\n const [k, v] = entry\n if (Array.isArray(v)) {\n key += `${k}:[${v.map(String).join(',')}]`\n } else {\n key += `${k}:${String(v)}`\n }\n if (i < entries.length - 1) key += '|'\n }\n return key\n}\n\n/**\n * Recursively flattens any supported `ClassValue` into individual CSS tokens.\n *\n * Supports:\n * - primitive strings/numbers/booleans (whitespace-split)\n * - nested arrays of `ClassValue`\n * - dictionaries `{ className: boolean }` for conditional classes\n *\n * @param {ClassValue | undefined} input\n * The value to flatten into tokens.\n * @param {string[]} tokens\n * The accumulator array receiving each CSS token.\n *\n * @example\n * ```ts\n * const out: string[] = []\n * flattenClasses(\n * [\n * 'px-4 py-2',\n * { 'text-bold': true, invisible: false },\n * ['hover:bg-red-500', ['active:scale-95']],\n * ],\n * out\n * )\n * // out => ['px-4','py-2','text-bold','hover:bg-red-500','active:scale-95']\n * ```\n */\nfunction flattenClasses(input: ClassValue | undefined, tokens: string[]): void {\n if (input === undefined || input === null) return\n\n // primitive values\n if (typeof input === 'string' || typeof input === 'number' || typeof input === 'boolean') {\n const parts = String(input).split(/\\s+/)\n for (let i = 0; i < parts.length; i++) {\n const part = parts[i]\n if (part) tokens.push(part)\n }\n return\n }\n\n // arrays of ClassValue\n if (Array.isArray(input)) {\n for (let i = 0; i < input.length; i++) {\n flattenClasses(input[i], tokens)\n }\n return\n }\n\n // object dictionary `{ className: true }`\n for (const key in input) {\n if (Object.hasOwn(input, key) && input[key]) {\n tokens.push(key)\n }\n }\n}\n\n/**\n * Creates a Class Variance Authority (CVA) function for composing class names\n * based on a base string, variants, defaultVariants, and compoundVariants.\n *\n * Supports two call signatures:\n * - `cva(base: string, options: VariantsOptions<TVariants>)`\n * - `cva(options: VariantsOptions<TVariants> & { base: string })`\n *\n * @template TVariants\n * A record mapping variant keys to a record of allowed values and their classes.\n *\n * @param {string | (VariantsOptions<TVariants> & { base?: string })} baseOrOptions\n * Either the base class string, or an options object including `base`.\n * @param {VariantsOptions<TVariants>} [maybeOptions]\n * The options object when using the two-arg signature.\n *\n * @returns {(props?: CvaProps<TVariants>) => string}\n * A function that, given variant props and optional `class`/`className`, returns\n * the deduplicated, memoized className string.\n *\n * @example\n * ```ts\n * const button = cva('btn px-4 py-2', {\n * variants: {\n * intent: { primary: 'bg-blue-500 text-white', danger: 'bg-red-500' },\n * size: { sm: 'text-sm', lg: 'text-lg' },\n * },\n * defaultVariants: { intent: 'primary', size: 'sm' },\n * compoundVariants: [\n * {\n * intent: ['primary','danger'],\n * size: 'lg',\n * className: 'uppercase',\n * },\n * ],\n * })\n *\n * // uses defaults + compound match\n * button()\n * // => 'btn px-4 py-2 bg-blue-500 text-white text-sm uppercase'\n *\n * // overrides size + adds custom classes\n * button({ size: 'lg', class: ['mt-4','shadow'] })\n * // => 'btn px-4 py-2 bg-blue-500 text-white text-lg uppercase mt-4 shadow'\n * ```\n */\nexport function cva<TVariants extends Record<string, Record<string, string | string[]>>>(\n baseOrOptions: string | (VariantsOptions<TVariants> & { base?: string }),\n maybeOptions?: VariantsOptions<TVariants>,\n): (props?: CvaProps<TVariants>) => string {\n // Normalize the two possible call signatures\n const config = typeof baseOrOptions === 'string' ? { base: baseOrOptions, ...maybeOptions } : baseOrOptions\n\n const { base = '', variants, defaultVariants = {}, compoundVariants = [] } = config\n\n // Memoization cache keyed by serialized props\n const cache = new Map<string, string>()\n\n return (props: CvaProps<TVariants> = {} as CvaProps<TVariants>): string => {\n // 1) Memo lookup\n const cacheKey = getCacheKey(props)\n const memo = cache.get(cacheKey)\n if (memo) return memo\n\n const tokens: string[] = []\n const seen = new Set<string>()\n\n // 2) Base classes\n flattenClasses(base, tokens)\n\n // 3) Merge defaults + incoming props\n const merged = { ...defaultVariants, ...props } as Record<keyof TVariants, ClassValue>\n\n // 4) Apply variant-specific classes\n for (const variantName in variants) {\n const v = merged[variantName]\n if (v == null || v === 'unset') continue\n const cls = variants[variantName]?.[String(v)]\n flattenClasses(cls, tokens)\n }\n\n // 5) Apply compoundVariants when all conditions match\n for (let i = 0; i < compoundVariants.length; i++) {\n const cv = compoundVariants[i as number]\n if (!cv) continue\n let match = true\n\n for (const key in cv) {\n if (key === 'class' || key === 'className') continue\n\n const cond = cv[key as keyof typeof cv]\n const actual = merged[key as keyof typeof merged]\n\n // array- or single-value condition\n if (Array.isArray(cond) && actual) {\n if (!cond.includes(actual.toString())) {\n match = false\n break\n }\n } else if (actual !== cond) {\n match = false\n break\n }\n }\n if (!match) continue\n\n flattenClasses(cv.class, tokens)\n flattenClasses(cv.className, tokens)\n }\n\n // 6) Finally append any `className` or `class` from props\n flattenClasses(props.className, tokens)\n flattenClasses(props.class, tokens)\n\n // 7) Deduplicate & join\n for (let i = 0; i < tokens.length; i++) {\n const token = tokens[i as number]\n if (token) seen.add(token)\n }\n const result = Array.from(seen).join(' ')\n\n cache.set(cacheKey, result)\n return result\n }\n}\n"],"mappings":"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"}
{"version":3,"file":"index.js","names":["getCacheKey","props","entries","Object","key","i","length","entry","k","v","Array","isArray","map","String","join","flattenClasses","input","tokens","undefined","parts","split","part","push","hasOwn","cva","baseOrOptions","maybeOptions","config","base","variants","defaultVariants","compoundVariants","cache","Map","cacheKey","memo","get","seen","Set","merged","variantName","cls","cv","match","cond","actual","includes","toString","class","className","token","add","result","from","set"],"sources":["../src/variants.ts"],"sourcesContent":["import type { ClassValue, CvaProps, VariantsOptions } from './variants.types'\n\n/**\n * Build a stable cache key by serializing props entries in sorted order.\n *\n * @internal\n *\n * @template TVariants\n * The mapping of variant names to their allowed string/string[] classes.\n *\n * @param {CvaProps<TVariants>} props\n * The props object passed into the CVA function (variant selections + class/className).\n *\n * @returns {string}\n * A deterministic string key used for memoization.\n */\nfunction getCacheKey<TVariants extends Record<string, Record<string, string | string[]>>>(\n props: CvaProps<TVariants>,\n): string {\n const entries = Object.entries(props) as [string, ClassValue][]\n\n let key = ''\n for (let i = 0; i < entries.length; i++) {\n const entry = entries[i]\n if (!entry) continue\n const [k, v] = entry\n if (Array.isArray(v)) {\n key += `${k}:[${v.map(String).join(',')}]`\n } else {\n key += `${k}:${String(v)}`\n }\n if (i < entries.length - 1) key += '|'\n }\n return key\n}\n\n/**\n * Recursively flattens any supported `ClassValue` into individual CSS tokens.\n *\n * @internal\n *\n * Supports:\n * - primitive strings/numbers/booleans (whitespace-split)\n * - nested arrays of `ClassValue`\n * - dictionaries `{ className: boolean }` for conditional classes\n *\n * @param {ClassValue | undefined} input\n * The value to flatten into tokens.\n * @param {string[]} tokens\n * The accumulator array receiving each CSS token.\n */\nfunction flattenClasses(input: ClassValue | undefined, tokens: string[]): void {\n if (input === undefined || input === null) return\n\n // primitive values\n if (typeof input === 'string' || typeof input === 'number' || typeof input === 'boolean') {\n const parts = String(input).split(/\\s+/)\n for (let i = 0; i < parts.length; i++) {\n const part = parts[i]\n if (part) tokens.push(part)\n }\n return\n }\n\n // arrays of ClassValue\n if (Array.isArray(input)) {\n for (let i = 0; i < input.length; i++) {\n flattenClasses(input[i], tokens)\n }\n return\n }\n\n // object dictionary `{ className: true }`\n for (const key in input) {\n if (Object.hasOwn(input, key) && input[key]) {\n tokens.push(key)\n }\n }\n}\n\n/**\n * Creates a Class Variance Authority (CVA) function for composing class names\n * based on a base string, variants, defaultVariants, and compoundVariants.\n *\n * Supports two call signatures:\n * - `cva(base: string, options: VariantsOptions<TVariants>)`\n * - `cva(options: VariantsOptions<TVariants> & { base: string })`\n *\n * @template TVariants\n * A record mapping variant keys to a record of allowed values and their classes.\n *\n * @param {string | (VariantsOptions<TVariants> & { base?: string })} baseOrOptions\n * Either the base class string, or an options object including `base`.\n * @param {VariantsOptions<TVariants>} [maybeOptions]\n * The options object when using the two-arg signature.\n *\n * @returns {(props?: CvaProps<TVariants>) => string}\n * A function that, given variant props and optional `class`/`className`, returns\n * the deduplicated, memoized className string.\n *\n * @example\n * ```ts\n * const button = cva('btn px-4 py-2', {\n * variants: {\n * intent: { primary: 'bg-blue-500 text-white', danger: 'bg-red-500' },\n * size: { sm: 'text-sm', lg: 'text-lg' },\n * },\n * defaultVariants: { intent: 'primary', size: 'sm' },\n * compoundVariants: [\n * {\n * intent: ['primary','danger'],\n * size: 'lg',\n * className: 'uppercase',\n * },\n * ],\n * })\n *\n * // uses defaults + compound match\n * button()\n * // => 'btn px-4 py-2 bg-blue-500 text-white text-sm uppercase'\n *\n * // overrides size + adds custom classes\n * button({ size: 'lg', class: ['mt-4','shadow'] })\n * // => 'btn px-4 py-2 bg-blue-500 text-white text-lg uppercase mt-4 shadow'\n * ```\n */\nexport function cva<TVariants extends Record<string, Record<string, string | string[]>>>(\n baseOrOptions: string | (VariantsOptions<TVariants> & { base?: string }),\n maybeOptions?: VariantsOptions<TVariants>,\n): (props?: CvaProps<TVariants>) => string {\n // Normalize the two possible call signatures\n const config = typeof baseOrOptions === 'string' ? { base: baseOrOptions, ...maybeOptions } : baseOrOptions\n\n const { base = '', variants, defaultVariants = {}, compoundVariants = [] } = config\n\n // Memoization cache keyed by serialized props\n const cache = new Map<string, string>()\n\n return (props: CvaProps<TVariants> = {} as CvaProps<TVariants>): string => {\n // 1) Memo lookup\n const cacheKey = getCacheKey(props)\n const memo = cache.get(cacheKey)\n if (memo) return memo\n\n const tokens: string[] = []\n const seen = new Set<string>()\n\n // 2) Base classes\n flattenClasses(base, tokens)\n\n // 3) Merge defaults + incoming props\n const merged = { ...defaultVariants, ...props } as Record<keyof TVariants, ClassValue>\n\n // 4) Apply variant-specific classes\n for (const variantName in variants) {\n const v = merged[variantName]\n if (v == null || v === 'unset') continue\n const cls = variants[variantName]?.[String(v)]\n flattenClasses(cls, tokens)\n }\n\n // 5) Apply compoundVariants when all conditions match\n for (let i = 0; i < compoundVariants.length; i++) {\n const cv = compoundVariants[i as number]\n if (!cv) continue\n let match = true\n\n for (const key in cv) {\n if (key === 'class' || key === 'className') continue\n\n const cond = cv[key as keyof typeof cv]\n const actual = merged[key as keyof typeof merged]\n\n // array- or single-value condition\n if (Array.isArray(cond) && actual) {\n if (!cond.includes(actual.toString())) {\n match = false\n break\n }\n } else if (actual !== cond) {\n match = false\n break\n }\n }\n if (!match) continue\n\n flattenClasses(cv.class, tokens)\n flattenClasses(cv.className, tokens)\n }\n\n // 6) Finally append any `className` or `class` from props\n flattenClasses(props.className, tokens)\n flattenClasses(props.class, tokens)\n\n // 7) Deduplicate & join\n for (let i = 0; i < tokens.length; i++) {\n const token = tokens[i as number]\n if (token) seen.add(token)\n }\n const result = Array.from(seen).join(' ')\n\n cache.set(cacheKey, result)\n return result\n }\n}\n"],"mappings":"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"}

@@ -16,3 +16,3 @@ {

"cva": "1.0.0-beta.3",
"tsdown": "0.18.3",
"tsdown": "0.21.1",
"typescript": "5.9.3",

@@ -22,3 +22,6 @@ "vitest": "^4.0.18"

"exports": {
".": "./dist/index.js"
".": {
"types": "./dist/index.d.ts",
"default": "./dist/index.js"
}
},

@@ -50,2 +53,3 @@ "files": [

],
"sideEffects": false,
"license": "MIT",

@@ -71,3 +75,3 @@ "main": "./dist/index.js",

"types": "./dist/index.d.ts",
"version": "0.1.20"
"version": "0.1.21"
}