{"version":3,"sources":["../src/utils.ts","../src/mergeClassNames.ts"],"names":[],"mappings":"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","file":"index.mjs","sourcesContent":["import {\r\n    Classified,\r\n    ClassifiedInvalidWarn,\r\n    ClassifiedInvalidReason,\r\n    ClassifiedClassName,\r\n    UserArgument,\r\n} from \"./types\";\r\n\r\n// classifies input arguments\r\nexport const classify = (value: UserArgument): Classified => {\r\n    // FP pattern of mapping values with extra information.\r\n    // The core computes data.\r\n    // because TS types disappear in JS runtime\r\n\r\n    // valid but ignored\r\n    if (\r\n        value === false ||\r\n        value === undefined ||\r\n        value === null ||\r\n        value === \"\"\r\n    ) {\r\n        return {\r\n            status: \"ignore\",\r\n            value,\r\n        };\r\n    }\r\n\r\n    // invalid\r\n    if (typeof value !== \"string\") {\r\n        return {\r\n            status: \"invalid\",\r\n            value,\r\n            reason: ClassifiedInvalidReason.NotAString,\r\n        };\r\n    }\r\n\r\n    // it's a string\r\n\r\n    const trimmed = value.trim();\r\n\r\n    // invalid\r\n    if (trimmed === \"\") {\r\n        return {\r\n            status: \"invalid\",\r\n            value,\r\n            reason: ClassifiedInvalidReason.Whitespace,\r\n        };\r\n    }\r\n\r\n    // valid\r\n    return {\r\n        status: \"class-name\",\r\n        value: trimmed,\r\n    };\r\n};\r\n\r\n// get only valid objects\r\nexport const getClassNames = (values: Classified[]): ClassifiedClassName[] => {\r\n    return values.filter((obj) => obj.status === \"class-name\");\r\n};\r\n\r\n// get only valid objects\r\nexport const getInvalid = (values: Classified[]): ClassifiedInvalidWarn[] => {\r\n    return values.filter((obj) => obj.status === \"invalid\");\r\n};\r\n\r\nexport const warningMessage = (\r\n    { value, reason }: ClassifiedInvalidWarn,\r\n    functionName: string,\r\n): string => {\r\n    const format = (message: string) => `[${functionName}] ${message}`;\r\n\r\n    if (reason === ClassifiedInvalidReason.NotAString) {\r\n        // null, undefined\r\n        if (value === null || value === undefined) {\r\n            return format(`Ignored non-string argument: ${value}`);\r\n        }\r\n\r\n        // true (because false was filtered out)\r\n        if (value === true) {\r\n            return format(`Ignored non-string argument: ${value} (boolean)`);\r\n        }\r\n\r\n        // array\r\n        if (Array.isArray(value)) {\r\n            const sub = value.slice(0, 3);\r\n            const string = JSON.stringify(sub).slice(1, -1);\r\n            const ellipsisPart = value.length > sub.length ? \", ...\" : \"\";\r\n\r\n            return format(\r\n                `Ignored non-string argument: array ([${string}${ellipsisPart}])`,\r\n            );\r\n        }\r\n    }\r\n\r\n    // empty string\r\n    if (reason === ClassifiedInvalidReason.EmptyString) {\r\n        return format(`Ignored empty string argument.`);\r\n    }\r\n\r\n    // whitespace\r\n    if (reason === ClassifiedInvalidReason.Whitespace) {\r\n        return format(`Ignored whitespace string argument: \"${value}\"`);\r\n    }\r\n\r\n    // object, symbol, etc.\r\n    return format(`Ignored non-string argument: ${value} (${typeof value})`);\r\n};\r\n\r\n// console.warn\r\nexport const warn = (invalid: ClassifiedInvalidWarn, functionName: string) => {\r\n    const warning = warningMessage(invalid, functionName);\r\n\r\n    console.warn(warning);\r\n};\r\n\r\n// activates debugger\r\nexport const activateDebugger = (_invalid: ClassifiedInvalidWarn) => {\r\n    debugger;\r\n};\r\n","/**\r\n * mergeClassNames - A class names merger for TypeScript, JavaScript, TSX / JSX (React).\r\n *\r\n * @license AGPL-3.0\r\n * Copyright (C) 2026 Abdullah Fatota\r\n *\r\n *\r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU Affero General Public License as published by\r\n * the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n *\r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\r\n * GNU Affero General Public License for more details.\r\n *\r\n * You should have received a copy of the GNU Affero General Public License\r\n * along with this program. If not, see <https://www.gnu.org/licenses/>.\r\n \r\n\r\nOnly Valid Arguments:\r\n    1) valid strings: non-empty, non-whitespace\r\n    2) value `false`\r\n\r\nInvalid arguments: anything else e.g.\r\n    - empty strings\r\n    - whitespace strings\r\n    - arrays\r\n    - numbers\r\n    - objects\r\n    - value true\r\n    - etc.\r\n*/\r\n\r\nimport {\r\n    ClassifiedInvalidFunction,\r\n    ClassifiedInvalidWarn,\r\n    CustomOptions,\r\n    UserArgument,\r\n} from \"./types\";\r\n\r\nimport {\r\n    classify,\r\n    getInvalid,\r\n    warn,\r\n    activateDebugger,\r\n    getClassNames,\r\n} from \"./utils\";\r\n\r\n// joins valid strings into final className\r\nconst mergeClassNamesCore = (\r\n    values: UserArgument[],\r\n    onClassifiedInvalid?: ClassifiedInvalidFunction,\r\n) => {\r\n    // classify arguments\r\n    const classified = values.map(classify);\r\n\r\n    // optional call invalid arguments handlers: warn and/or activate debugger\r\n    if (onClassifiedInvalid) {\r\n        getInvalid(classified).forEach(onClassifiedInvalid);\r\n    }\r\n\r\n    // valid strings only\r\n    const classNames: string[] = getClassNames(classified).map(\r\n        ({ value }) => value,\r\n    );\r\n\r\n    const finalClassName = classNames.join(\" \");\r\n    return finalClassName;\r\n};\r\n\r\n// creates custom mergeClassNames e.g. warn = false, activate debugger = true\r\n/**\r\n * type UserArgument = string | undefined | null | false;\r\n */\r\nexport const createCustomMergeClassNames = (options: CustomOptions) => {\r\n    const invalidHandlers: ClassifiedInvalidFunction[] = [];\r\n\r\n    // default: Custom mergeClassNames.  will be logged in console\r\n    const functionName = options.name ?? \"Custom mergeClassNames\";\r\n\r\n    // default: falsey\r\n    if (options[\"warnings\"]) {\r\n        invalidHandlers.push((arg) => warn(arg, functionName));\r\n    }\r\n\r\n    // default: falsy\r\n    if (options[\"activate-debugger\"]) {\r\n        invalidHandlers.push(activateDebugger);\r\n    }\r\n\r\n    const combinedInvalidHandler = (value: ClassifiedInvalidWarn) => {\r\n        invalidHandlers.forEach((func) => func(value));\r\n    };\r\n\r\n    // construct the mergeClassNames function\r\n    return (...input: UserArgument[]) =>\r\n        mergeClassNamesCore(\r\n            input,\r\n            invalidHandlers.length > 0 ? combinedInvalidHandler : undefined,\r\n        );\r\n};\r\n\r\n/**\r\n * type UserArgument = string | undefined | null | false;\r\n */\r\nexport const mergeClassNames = createCustomMergeClassNames({\r\n    warnings: true,\r\n    \"activate-debugger\": false,\r\n    name: \"mergeClassNames\",\r\n});\r\n\r\n/**\r\n * type UserArgument = string | undefined | null | false;\r\n */\r\nexport const mergeClassNamesDebugger = createCustomMergeClassNames({\r\n    warnings: true,\r\n    \"activate-debugger\": true,\r\n    name: \"mergeClassNamesDebugger\",\r\n});\r\n"]}