|
1 | 1 | import { LangConfig } from './extension';
|
| 2 | +import { TAILWIND_MODIFIERS } from './tailwindModifiers'; |
2 | 3 |
|
3 | 4 | export interface Options {
|
4 | 5 | shouldRemoveDuplicates: boolean;
|
@@ -43,21 +44,51 @@ export const sortClassString = (
|
43 | 44 | return classArray.join(options.replacement || ' ').trim();
|
44 | 45 | };
|
45 | 46 |
|
| 47 | +const isTailwindClass = (el: string, sortOrder: string[]) => sortOrder.indexOf(el) !== -1 |
| 48 | +const isTailwindModifierClass = (el: string, sortOrder: string[]) => el.includes(':') && TAILWIND_MODIFIERS.indexOf(el.split(':')[0]) !== -1 && sortOrder.indexOf(el.split(':')[1]) !== -1 |
| 49 | + |
46 | 50 | const sortClassArray = (
|
47 | 51 | classArray: string[],
|
48 | 52 | sortOrder: string[],
|
49 | 53 | shouldPrependCustomClasses: boolean
|
50 |
| -): string[] => [ |
51 |
| - ...classArray.filter( |
52 |
| - (el) => shouldPrependCustomClasses && sortOrder.indexOf(el) === -1 |
53 |
| - ), // append the classes that were not in the sort order if configured this way |
54 |
| - ...classArray |
55 |
| - .filter((el) => sortOrder.indexOf(el) !== -1) // take the classes that are in the sort order |
56 |
| - .sort((a, b) => sortOrder.indexOf(a) - sortOrder.indexOf(b)), // and sort them |
57 |
| - ...classArray.filter( |
58 |
| - (el) => !shouldPrependCustomClasses && sortOrder.indexOf(el) === -1 |
59 |
| - ), // prepend the classes that were not in the sort order if configured this way |
60 |
| -]; |
| 54 | +): string[] => { |
| 55 | + const [tailwindClasses, allTailwindModifiersClasses, customClasses] = [ |
| 56 | + classArray.filter( |
| 57 | + (el) => isTailwindClass(el, sortOrder) |
| 58 | + ), |
| 59 | + classArray.filter( |
| 60 | + (el) => isTailwindModifierClass(el, sortOrder) |
| 61 | + ), |
| 62 | + classArray.filter( |
| 63 | + (el) => !isTailwindClass(el, sortOrder) && !isTailwindModifierClass(el, sortOrder) |
| 64 | + ), |
| 65 | + ] |
| 66 | + |
| 67 | + /** |
| 68 | + * This array contains the classes with tailwind modifiers, sorted first by modifiers |
| 69 | + * and then by the sort in sortOrder: |
| 70 | + * |
| 71 | + * input: "xl:mx-6 lg:mx-4 sm:bg-gray-200 hover:bg-blue-100 lg:bg-gray-400 hover:text-blue-100 xl:bg-gray-600 sm:mx-2" |
| 72 | + * output: "hover:text-blue-100 hover:bg-blue-100 sm:mx-2 sm:bg-gray-200 lg:mx-4 lg:bg-gray-400 xl:mx-6 xl:bg-gray-600" |
| 73 | + * |
| 74 | + * The Tailwind modifier order is defined in ./tailwindModifiers.ts |
| 75 | + */ |
| 76 | + const allSortedTailwindModifiersClasses = TAILWIND_MODIFIERS |
| 77 | + .map((modifier) => |
| 78 | + allTailwindModifiersClasses.filter((el) => el.split(':')[0] === modifier) |
| 79 | + ) |
| 80 | + .map((tailwindModifierClass) => tailwindModifierClass.sort((a, b) => sortOrder.indexOf(a.split(':')[1]) - sortOrder.indexOf(b.split(':')[1]))) |
| 81 | + .reduce((allSortedTailwindModifiersClasses, sortedTailwindModifiersClasses) => { |
| 82 | + return allSortedTailwindModifiersClasses.concat(sortedTailwindModifiersClasses) |
| 83 | + }, []) |
| 84 | + |
| 85 | + return [ |
| 86 | + ...(shouldPrependCustomClasses ? customClasses : []), |
| 87 | + ...tailwindClasses.sort((a, b) => sortOrder.indexOf(a) - sortOrder.indexOf(b)), |
| 88 | + ...allSortedTailwindModifiersClasses, |
| 89 | + ...(!shouldPrependCustomClasses ? customClasses : []), |
| 90 | + ] |
| 91 | +}; |
61 | 92 |
|
62 | 93 | const removeDuplicates = (classArray: string[]): string[] => [
|
63 | 94 | ...new Set(classArray),
|
@@ -94,8 +125,8 @@ function buildMatcher(value: LangConfig): Matcher {
|
94 | 125 | typeof value.regex === 'string'
|
95 | 126 | ? [new RegExp(value.regex, 'gi')]
|
96 | 127 | : isArrayOfStrings(value.regex)
|
97 |
| - ? value.regex.map((v) => new RegExp(v, 'gi')) |
98 |
| - : [], |
| 128 | + ? value.regex.map((v) => new RegExp(v, 'gi')) |
| 129 | + : [], |
99 | 130 | separator:
|
100 | 131 | typeof value.separator === 'string'
|
101 | 132 | ? new RegExp(value.separator, 'g')
|
|
0 commit comments