@mgcrea/react-native-tailwind 0.6.1 → 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (100) hide show
  1. package/README.md +406 -1
  2. package/dist/babel/config-loader.ts +1 -23
  3. package/dist/babel/index.cjs +516 -211
  4. package/dist/babel/index.d.ts +4 -15
  5. package/dist/babel/index.test.ts +481 -0
  6. package/dist/babel/index.ts +4 -861
  7. package/dist/babel/plugin.d.ts +42 -0
  8. package/dist/babel/plugin.test.ts +482 -0
  9. package/dist/babel/plugin.ts +491 -0
  10. package/dist/babel/utils/attributeMatchers.d.ts +23 -0
  11. package/dist/babel/utils/attributeMatchers.ts +71 -0
  12. package/dist/babel/utils/componentSupport.d.ts +18 -0
  13. package/dist/babel/utils/componentSupport.ts +68 -0
  14. package/dist/babel/utils/dynamicProcessing.d.ts +32 -0
  15. package/dist/babel/utils/dynamicProcessing.ts +223 -0
  16. package/dist/babel/utils/modifierProcessing.d.ts +26 -0
  17. package/dist/babel/utils/modifierProcessing.ts +118 -0
  18. package/dist/babel/utils/styleInjection.d.ts +15 -0
  19. package/dist/babel/utils/styleInjection.ts +80 -0
  20. package/dist/babel/utils/styleTransforms.d.ts +39 -0
  21. package/dist/babel/utils/styleTransforms.test.ts +349 -0
  22. package/dist/babel/utils/styleTransforms.ts +258 -0
  23. package/dist/babel/utils/twProcessing.d.ts +28 -0
  24. package/dist/babel/utils/twProcessing.ts +124 -0
  25. package/dist/components/TextInput.d.ts +171 -14
  26. package/dist/config/tailwind.d.ts +302 -0
  27. package/dist/config/tailwind.js +1 -0
  28. package/dist/index.d.ts +6 -2
  29. package/dist/index.js +1 -1
  30. package/dist/parser/__snapshots__/colors.test.js.snap +242 -90
  31. package/dist/parser/__snapshots__/transforms.test.js.snap +58 -0
  32. package/dist/parser/colors.js +1 -1
  33. package/dist/parser/index.d.ts +1 -0
  34. package/dist/parser/index.js +1 -1
  35. package/dist/parser/modifiers.d.ts +2 -2
  36. package/dist/parser/modifiers.js +1 -1
  37. package/dist/parser/placeholder.d.ts +36 -0
  38. package/dist/parser/placeholder.js +1 -0
  39. package/dist/parser/placeholder.test.js +1 -0
  40. package/dist/parser/typography.d.ts +1 -0
  41. package/dist/parser/typography.js +1 -1
  42. package/dist/parser/typography.test.js +1 -1
  43. package/dist/runtime.cjs +2 -0
  44. package/dist/runtime.cjs.map +7 -0
  45. package/dist/runtime.d.ts +126 -0
  46. package/dist/runtime.js +2 -0
  47. package/dist/runtime.js.map +7 -0
  48. package/dist/runtime.test.js +1 -0
  49. package/dist/stubs/tw.d.ts +47 -0
  50. package/dist/stubs/tw.js +1 -0
  51. package/dist/types/core.d.ts +40 -0
  52. package/dist/types/core.js +0 -0
  53. package/dist/types/index.d.ts +2 -0
  54. package/dist/types/index.js +1 -0
  55. package/dist/types/runtime.d.ts +15 -0
  56. package/dist/types/runtime.js +1 -0
  57. package/dist/types/util.d.ts +3 -0
  58. package/dist/types/util.js +0 -0
  59. package/dist/utils/flattenColors.d.ts +16 -0
  60. package/dist/utils/flattenColors.js +1 -0
  61. package/dist/utils/flattenColors.test.js +1 -0
  62. package/dist/utils/modifiers.d.ts +29 -0
  63. package/dist/utils/modifiers.js +1 -0
  64. package/dist/utils/modifiers.test.js +1 -0
  65. package/dist/utils/styleKey.test.js +1 -0
  66. package/package.json +15 -3
  67. package/src/babel/config-loader.ts +1 -23
  68. package/src/babel/index.ts +4 -861
  69. package/src/babel/plugin.test.ts +482 -0
  70. package/src/babel/plugin.ts +491 -0
  71. package/src/babel/utils/attributeMatchers.ts +71 -0
  72. package/src/babel/utils/componentSupport.ts +68 -0
  73. package/src/babel/utils/dynamicProcessing.ts +223 -0
  74. package/src/babel/utils/modifierProcessing.ts +118 -0
  75. package/src/babel/utils/styleInjection.ts +80 -0
  76. package/src/babel/utils/styleTransforms.test.ts +349 -0
  77. package/src/babel/utils/styleTransforms.ts +258 -0
  78. package/src/babel/utils/twProcessing.ts +124 -0
  79. package/src/components/TextInput.tsx +17 -14
  80. package/src/config/{palettes.ts → tailwind.ts} +2 -2
  81. package/src/index.ts +9 -1
  82. package/src/parser/colors.ts +9 -23
  83. package/src/parser/index.ts +1 -0
  84. package/src/parser/modifiers.ts +10 -4
  85. package/src/parser/placeholder.test.ts +105 -0
  86. package/src/parser/placeholder.ts +78 -0
  87. package/src/parser/typography.test.ts +11 -0
  88. package/src/parser/typography.ts +20 -2
  89. package/src/runtime.test.ts +325 -0
  90. package/src/runtime.ts +265 -0
  91. package/src/stubs/tw.ts +65 -0
  92. package/src/{types.ts → types/core.ts} +0 -4
  93. package/src/types/index.ts +2 -0
  94. package/src/types/runtime.ts +17 -0
  95. package/src/types/util.ts +1 -0
  96. package/src/utils/flattenColors.test.ts +361 -0
  97. package/src/utils/flattenColors.ts +32 -0
  98. package/src/utils/modifiers.test.ts +286 -0
  99. package/src/utils/modifiers.ts +63 -0
  100. package/src/utils/styleKey.test.ts +168 -0
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Shared utilities for parsing state modifiers (active:, focus:, disabled:)
3
+ * Used by both runtime parser and Babel plugin
4
+ */
5
+ export declare const SUPPORTED_MODIFIERS: readonly ["active", "focus", "disabled"];
6
+ export type SupportedModifier = (typeof SUPPORTED_MODIFIERS)[number];
7
+ /**
8
+ * Detect if a className contains any state modifiers (active:, focus:, disabled:)
9
+ */
10
+ export declare function hasModifiers(className: string): boolean;
11
+ /**
12
+ * Split className into base classes and modifier-specific classes
13
+ * Returns: { base: string[], modifiers: Map<modifier, string[]> }
14
+ *
15
+ * @example
16
+ * splitModifierClasses('bg-blue-500 active:bg-blue-700 disabled:bg-gray-300')
17
+ * // Returns:
18
+ * // {
19
+ * // base: ['bg-blue-500'],
20
+ * // modifiers: Map {
21
+ * // 'active' => ['bg-blue-700'],
22
+ * // 'disabled' => ['bg-gray-300']
23
+ * // }
24
+ * // }
25
+ */
26
+ export declare function splitModifierClasses(className: string): {
27
+ base: string[];
28
+ modifiers: Map<SupportedModifier, string[]>;
29
+ };
@@ -0,0 +1 @@
1
+ Object.defineProperty(exports,"__esModule",{value:true});exports.SUPPORTED_MODIFIERS=void 0;exports.hasModifiers=hasModifiers;exports.splitModifierClasses=splitModifierClasses;var SUPPORTED_MODIFIERS=exports.SUPPORTED_MODIFIERS=["active","focus","disabled"];function hasModifiers(className){return SUPPORTED_MODIFIERS.some(function(modifier){return className.includes(`${modifier}:`);});}function splitModifierClasses(className){var classes=className.split(/\s+/).filter(Boolean);var base=[];var modifiers=new Map();for(var cls of classes){var matched=false;for(var modifier of SUPPORTED_MODIFIERS){var prefix=`${modifier}:`;if(cls.startsWith(prefix)){var cleanClass=cls.slice(prefix.length);if(!modifiers.has(modifier)){modifiers.set(modifier,[]);}var modifierClasses=modifiers.get(modifier);if(modifierClasses){modifierClasses.push(cleanClass);}matched=true;break;}}if(!matched){base.push(cls);}}return{base:base,modifiers:modifiers};}
@@ -0,0 +1 @@
1
+ var _vitest=require("vitest");var _modifiers=require("./modifiers");(0,_vitest.describe)("SUPPORTED_MODIFIERS",function(){(0,_vitest.it)("should export list of supported modifiers",function(){(0,_vitest.expect)(_modifiers.SUPPORTED_MODIFIERS).toEqual(["active","focus","disabled"]);});(0,_vitest.it)("should be readonly",function(){(0,_vitest.expect)(Array.isArray(_modifiers.SUPPORTED_MODIFIERS)).toBe(true);});});(0,_vitest.describe)("hasModifiers",function(){(0,_vitest.it)("should return true for active modifier",function(){(0,_vitest.expect)((0,_modifiers.hasModifiers)("active:bg-blue-500")).toBe(true);(0,_vitest.expect)((0,_modifiers.hasModifiers)("m-4 active:bg-blue-500")).toBe(true);(0,_vitest.expect)((0,_modifiers.hasModifiers)("active:bg-blue-500 active:text-white")).toBe(true);});(0,_vitest.it)("should return true for focus modifier",function(){(0,_vitest.expect)((0,_modifiers.hasModifiers)("focus:border-blue-500")).toBe(true);(0,_vitest.expect)((0,_modifiers.hasModifiers)("p-2 focus:border-blue-500")).toBe(true);(0,_vitest.expect)((0,_modifiers.hasModifiers)("focus:bg-blue-500 focus:text-white")).toBe(true);});(0,_vitest.it)("should return true for disabled modifier",function(){(0,_vitest.expect)((0,_modifiers.hasModifiers)("disabled:opacity-50")).toBe(true);(0,_vitest.expect)((0,_modifiers.hasModifiers)("bg-blue-500 disabled:opacity-50")).toBe(true);(0,_vitest.expect)((0,_modifiers.hasModifiers)("disabled:bg-gray-300 disabled:text-gray-500")).toBe(true);});(0,_vitest.it)("should return true for multiple different modifiers",function(){(0,_vitest.expect)((0,_modifiers.hasModifiers)("active:bg-blue-700 focus:border-blue-500")).toBe(true);(0,_vitest.expect)((0,_modifiers.hasModifiers)("bg-blue-500 active:bg-blue-700 disabled:opacity-50")).toBe(true);(0,_vitest.expect)((0,_modifiers.hasModifiers)("focus:border-blue-500 disabled:bg-gray-300")).toBe(true);});(0,_vitest.it)("should return false for no modifiers",function(){(0,_vitest.expect)((0,_modifiers.hasModifiers)("bg-blue-500")).toBe(false);(0,_vitest.expect)((0,_modifiers.hasModifiers)("m-4 p-2 text-white")).toBe(false);(0,_vitest.expect)((0,_modifiers.hasModifiers)("flex items-center justify-center")).toBe(false);});(0,_vitest.it)("should return false for empty string",function(){(0,_vitest.expect)((0,_modifiers.hasModifiers)("")).toBe(false);});(0,_vitest.it)("should return false for partial matches",function(){(0,_vitest.expect)((0,_modifiers.hasModifiers)("active")).toBe(false);(0,_vitest.expect)((0,_modifiers.hasModifiers)("focus")).toBe(false);(0,_vitest.expect)((0,_modifiers.hasModifiers)("disabled")).toBe(false);(0,_vitest.expect)((0,_modifiers.hasModifiers)("active-bg-blue-500")).toBe(false);(0,_vitest.expect)((0,_modifiers.hasModifiers)("focusborder-blue-500")).toBe(false);});(0,_vitest.it)("should detect modifiers anywhere in the string",function(){(0,_vitest.expect)((0,_modifiers.hasModifiers)("bg-blue-500 active:bg-blue-700 text-white")).toBe(true);(0,_vitest.expect)((0,_modifiers.hasModifiers)("flex items-center focus:border-blue-500 p-4")).toBe(true);});(0,_vitest.it)("should handle whitespace variations",function(){(0,_vitest.expect)((0,_modifiers.hasModifiers)(" active:bg-blue-500 ")).toBe(true);(0,_vitest.expect)((0,_modifiers.hasModifiers)("\tactive:bg-blue-500\n")).toBe(true);(0,_vitest.expect)((0,_modifiers.hasModifiers)("m-4 active:bg-blue-500 p-2")).toBe(true);});(0,_vitest.it)("should be case-sensitive",function(){(0,_vitest.expect)((0,_modifiers.hasModifiers)("Active:bg-blue-500")).toBe(false);(0,_vitest.expect)((0,_modifiers.hasModifiers)("ACTIVE:bg-blue-500")).toBe(false);(0,_vitest.expect)((0,_modifiers.hasModifiers)("Focus:border-blue-500")).toBe(false);});});(0,_vitest.describe)("splitModifierClasses",function(){(0,_vitest.it)("should split base classes without modifiers",function(){var result=(0,_modifiers.splitModifierClasses)("m-4 p-2 bg-blue-500");(0,_vitest.expect)(result.base).toEqual(["m-4","p-2","bg-blue-500"]);(0,_vitest.expect)(result.modifiers.size).toBe(0);});(0,_vitest.it)("should split active modifier classes",function(){var result=(0,_modifiers.splitModifierClasses)("bg-blue-500 active:bg-blue-700");(0,_vitest.expect)(result.base).toEqual(["bg-blue-500"]);(0,_vitest.expect)(result.modifiers.get("active")).toEqual(["bg-blue-700"]);});(0,_vitest.it)("should split focus modifier classes",function(){var result=(0,_modifiers.splitModifierClasses)("border-gray-300 focus:border-blue-500");(0,_vitest.expect)(result.base).toEqual(["border-gray-300"]);(0,_vitest.expect)(result.modifiers.get("focus")).toEqual(["border-blue-500"]);});(0,_vitest.it)("should split disabled modifier classes",function(){var result=(0,_modifiers.splitModifierClasses)("bg-blue-500 disabled:bg-gray-300");(0,_vitest.expect)(result.base).toEqual(["bg-blue-500"]);(0,_vitest.expect)(result.modifiers.get("disabled")).toEqual(["bg-gray-300"]);});(0,_vitest.it)("should split multiple classes with same modifier",function(){var result=(0,_modifiers.splitModifierClasses)("bg-blue-500 active:bg-blue-700 active:text-white active:border-blue-900");(0,_vitest.expect)(result.base).toEqual(["bg-blue-500"]);(0,_vitest.expect)(result.modifiers.get("active")).toEqual(["bg-blue-700","text-white","border-blue-900"]);});(0,_vitest.it)("should split multiple different modifiers",function(){var result=(0,_modifiers.splitModifierClasses)("bg-blue-500 active:bg-blue-700 focus:border-blue-500 disabled:opacity-50");(0,_vitest.expect)(result.base).toEqual(["bg-blue-500"]);(0,_vitest.expect)(result.modifiers.get("active")).toEqual(["bg-blue-700"]);(0,_vitest.expect)(result.modifiers.get("focus")).toEqual(["border-blue-500"]);(0,_vitest.expect)(result.modifiers.get("disabled")).toEqual(["opacity-50"]);});(0,_vitest.it)("should handle complex combination of base and modifier classes",function(){var result=(0,_modifiers.splitModifierClasses)("m-4 p-2 bg-blue-500 text-white rounded-lg active:bg-blue-700 active:text-gray-100 focus:border-blue-500 disabled:opacity-50 disabled:bg-gray-300");(0,_vitest.expect)(result.base).toEqual(["m-4","p-2","bg-blue-500","text-white","rounded-lg"]);(0,_vitest.expect)(result.modifiers.get("active")).toEqual(["bg-blue-700","text-gray-100"]);(0,_vitest.expect)(result.modifiers.get("focus")).toEqual(["border-blue-500"]);(0,_vitest.expect)(result.modifiers.get("disabled")).toEqual(["opacity-50","bg-gray-300"]);});(0,_vitest.it)("should handle empty string",function(){var result=(0,_modifiers.splitModifierClasses)("");(0,_vitest.expect)(result.base).toEqual([]);(0,_vitest.expect)(result.modifiers.size).toBe(0);});(0,_vitest.it)("should handle whitespace-only string",function(){var result=(0,_modifiers.splitModifierClasses)(" ");(0,_vitest.expect)(result.base).toEqual([]);(0,_vitest.expect)(result.modifiers.size).toBe(0);});(0,_vitest.it)("should handle only modifier classes",function(){var result=(0,_modifiers.splitModifierClasses)("active:bg-blue-700 focus:border-blue-500");(0,_vitest.expect)(result.base).toEqual([]);(0,_vitest.expect)(result.modifiers.get("active")).toEqual(["bg-blue-700"]);(0,_vitest.expect)(result.modifiers.get("focus")).toEqual(["border-blue-500"]);});(0,_vitest.it)("should filter out empty strings from split",function(){var result=(0,_modifiers.splitModifierClasses)("m-4 p-2 bg-blue-500");(0,_vitest.expect)(result.base).toEqual(["m-4","p-2","bg-blue-500"]);(0,_vitest.expect)(result.modifiers.size).toBe(0);});(0,_vitest.it)("should handle leading and trailing whitespace",function(){var result=(0,_modifiers.splitModifierClasses)(" m-4 active:bg-blue-700 ");(0,_vitest.expect)(result.base).toEqual(["m-4"]);(0,_vitest.expect)(result.modifiers.get("active")).toEqual(["bg-blue-700"]);});(0,_vitest.it)("should handle arbitrary values with modifiers",function(){var result=(0,_modifiers.splitModifierClasses)("bg-[#ff0000] active:bg-[#00ff00] text-[14px]");(0,_vitest.expect)(result.base).toEqual(["bg-[#ff0000]","text-[14px]"]);(0,_vitest.expect)(result.modifiers.get("active")).toEqual(["bg-[#00ff00]"]);});(0,_vitest.it)("should handle opacity modifiers with state modifiers",function(){var result=(0,_modifiers.splitModifierClasses)("bg-black/50 active:bg-black/80 text-white/90");(0,_vitest.expect)(result.base).toEqual(["bg-black/50","text-white/90"]);(0,_vitest.expect)(result.modifiers.get("active")).toEqual(["bg-black/80"]);});(0,_vitest.it)("should preserve order of base classes",function(){var result=(0,_modifiers.splitModifierClasses)("z-10 m-4 a-1 p-2");(0,_vitest.expect)(result.base).toEqual(["z-10","m-4","a-1","p-2"]);});(0,_vitest.it)("should preserve order of modifier classes",function(){var result=(0,_modifiers.splitModifierClasses)("active:z-10 active:m-4 active:a-1 active:p-2");(0,_vitest.expect)(result.modifiers.get("active")).toEqual(["z-10","m-4","a-1","p-2"]);});(0,_vitest.it)("should not match modifiers without colon",function(){var result=(0,_modifiers.splitModifierClasses)("active bg-blue-500 focus border-blue-500");(0,_vitest.expect)(result.base).toEqual(["active","bg-blue-500","focus","border-blue-500"]);(0,_vitest.expect)(result.modifiers.size).toBe(0);});(0,_vitest.it)("should not match partial modifier names",function(){var result=(0,_modifiers.splitModifierClasses)("reactive:bg-blue-500 prefocus:border-blue-500");(0,_vitest.expect)(result.base).toEqual(["reactive:bg-blue-500","prefocus:border-blue-500"]);(0,_vitest.expect)(result.modifiers.size).toBe(0);});(0,_vitest.it)("should handle modifiers at different positions",function(){var result=(0,_modifiers.splitModifierClasses)("active:bg-blue-700 m-4 focus:border-blue-500 p-2 disabled:opacity-50");(0,_vitest.expect)(result.base).toEqual(["m-4","p-2"]);(0,_vitest.expect)(result.modifiers.get("active")).toEqual(["bg-blue-700"]);(0,_vitest.expect)(result.modifiers.get("focus")).toEqual(["border-blue-500"]);(0,_vitest.expect)(result.modifiers.get("disabled")).toEqual(["opacity-50"]);});(0,_vitest.it)("should return empty Map when no modifiers present",function(){var result=(0,_modifiers.splitModifierClasses)("m-4 p-2 bg-blue-500");(0,_vitest.expect)(result.modifiers).toBeInstanceOf(Map);(0,_vitest.expect)(result.modifiers.size).toBe(0);(0,_vitest.expect)(result.modifiers.get("active")).toBeUndefined();(0,_vitest.expect)(result.modifiers.get("focus")).toBeUndefined();(0,_vitest.expect)(result.modifiers.get("disabled")).toBeUndefined();});(0,_vitest.it)("should return Map with only present modifiers",function(){var result=(0,_modifiers.splitModifierClasses)("bg-blue-500 active:bg-blue-700");(0,_vitest.expect)(result.modifiers.has("active")).toBe(true);(0,_vitest.expect)(result.modifiers.has("focus")).toBe(false);(0,_vitest.expect)(result.modifiers.has("disabled")).toBe(false);});(0,_vitest.it)("should handle real-world button example",function(){var result=(0,_modifiers.splitModifierClasses)("px-4 py-2 bg-blue-500 text-white rounded-lg active:bg-blue-700 disabled:bg-gray-300 disabled:text-gray-500");(0,_vitest.expect)(result.base).toEqual(["px-4","py-2","bg-blue-500","text-white","rounded-lg"]);(0,_vitest.expect)(result.modifiers.get("active")).toEqual(["bg-blue-700"]);(0,_vitest.expect)(result.modifiers.get("disabled")).toEqual(["bg-gray-300","text-gray-500"]);(0,_vitest.expect)(result.modifiers.get("focus")).toBeUndefined();});(0,_vitest.it)("should handle real-world input example",function(){var result=(0,_modifiers.splitModifierClasses)("border border-gray-300 rounded p-2 focus:border-blue-500 focus:outline-none disabled:bg-gray-100 disabled:text-gray-400");(0,_vitest.expect)(result.base).toEqual(["border","border-gray-300","rounded","p-2"]);(0,_vitest.expect)(result.modifiers.get("focus")).toEqual(["border-blue-500","outline-none"]);(0,_vitest.expect)(result.modifiers.get("disabled")).toEqual(["bg-gray-100","text-gray-400"]);(0,_vitest.expect)(result.modifiers.get("active")).toBeUndefined();});(0,_vitest.it)("should be consistent across multiple calls",function(){var className="m-4 active:bg-blue-700 focus:border-blue-500";var result1=(0,_modifiers.splitModifierClasses)(className);var result2=(0,_modifiers.splitModifierClasses)(className);(0,_vitest.expect)(result1.base).toEqual(result2.base);(0,_vitest.expect)(result1.modifiers.get("active")).toEqual(result2.modifiers.get("active"));(0,_vitest.expect)(result1.modifiers.get("focus")).toEqual(result2.modifiers.get("focus"));});(0,_vitest.it)("should handle negative values with modifiers",function(){var result=(0,_modifiers.splitModifierClasses)("-m-4 active:-m-8 -translate-x-2");(0,_vitest.expect)(result.base).toEqual(["-m-4","-translate-x-2"]);(0,_vitest.expect)(result.modifiers.get("active")).toEqual(["-m-8"]);});(0,_vitest.it)("should handle transform classes with modifiers",function(){var result=(0,_modifiers.splitModifierClasses)("scale-100 active:scale-110 rotate-0 active:rotate-45");(0,_vitest.expect)(result.base).toEqual(["scale-100","rotate-0"]);(0,_vitest.expect)(result.modifiers.get("active")).toEqual(["scale-110","rotate-45"]);});});
@@ -0,0 +1 @@
1
+ var _vitest=require("vitest");var _styleKey=require("./styleKey");(0,_vitest.describe)("generateStyleKey",function(){(0,_vitest.it)("should generate key with leading underscore",function(){(0,_vitest.expect)((0,_styleKey.generateStyleKey)("m-4")).toBe("_m_4");(0,_vitest.expect)((0,_styleKey.generateStyleKey)("p-2")).toBe("_p_2");(0,_vitest.expect)((0,_styleKey.generateStyleKey)("bg-blue-500")).toBe("_bg_blue_500");});(0,_vitest.it)("should sort classes alphabetically for consistency",function(){(0,_vitest.expect)((0,_styleKey.generateStyleKey)("m-4 p-2")).toBe((0,_styleKey.generateStyleKey)("p-2 m-4"));(0,_vitest.expect)((0,_styleKey.generateStyleKey)("bg-blue-500 text-white")).toBe((0,_styleKey.generateStyleKey)("text-white bg-blue-500"));(0,_vitest.expect)((0,_styleKey.generateStyleKey)("flex items-center justify-center")).toBe((0,_styleKey.generateStyleKey)("justify-center flex items-center"));});(0,_vitest.it)("should handle single class",function(){(0,_vitest.expect)((0,_styleKey.generateStyleKey)("flex")).toBe("_flex");(0,_vitest.expect)((0,_styleKey.generateStyleKey)("hidden")).toBe("_hidden");(0,_vitest.expect)((0,_styleKey.generateStyleKey)("absolute")).toBe("_absolute");});(0,_vitest.it)("should handle multiple classes",function(){(0,_vitest.expect)((0,_styleKey.generateStyleKey)("m-4 p-2 bg-blue-500")).toBe("_bg_blue_500_m_4_p_2");(0,_vitest.expect)((0,_styleKey.generateStyleKey)("flex items-center justify-center")).toBe("_flex_items_center_justify_center");});(0,_vitest.it)("should replace special characters with underscores",function(){(0,_vitest.expect)((0,_styleKey.generateStyleKey)("bg-[#ff0000]")).toBe("_bg_ff0000_");(0,_vitest.expect)((0,_styleKey.generateStyleKey)("text-[14px]")).toBe("_text_14px_");(0,_vitest.expect)((0,_styleKey.generateStyleKey)("m-[16px]")).toBe("_m_16px_");});(0,_vitest.it)("should collapse multiple underscores",function(){(0,_vitest.expect)((0,_styleKey.generateStyleKey)("bg-[#ff0000]")).toBe("_bg_ff0000_");(0,_vitest.expect)((0,_styleKey.generateStyleKey)("w-[100%]")).toBe("_w_100_");});(0,_vitest.it)("should handle classes with hyphens",function(){(0,_vitest.expect)((0,_styleKey.generateStyleKey)("bg-blue-500")).toBe("_bg_blue_500");(0,_vitest.expect)((0,_styleKey.generateStyleKey)("text-gray-700")).toBe("_text_gray_700");(0,_vitest.expect)((0,_styleKey.generateStyleKey)("border-red-300")).toBe("_border_red_300");});(0,_vitest.it)("should handle classes with numbers",function(){(0,_vitest.expect)((0,_styleKey.generateStyleKey)("m-4")).toBe("_m_4");(0,_vitest.expect)((0,_styleKey.generateStyleKey)("p-8")).toBe("_p_8");(0,_vitest.expect)((0,_styleKey.generateStyleKey)("gap-96")).toBe("_gap_96");(0,_vitest.expect)((0,_styleKey.generateStyleKey)("text-2xl")).toBe("_text_2xl");});(0,_vitest.it)("should handle classes with decimals",function(){(0,_vitest.expect)((0,_styleKey.generateStyleKey)("m-0.5")).toBe("_m_0_5");(0,_vitest.expect)((0,_styleKey.generateStyleKey)("p-1.5")).toBe("_p_1_5");(0,_vitest.expect)((0,_styleKey.generateStyleKey)("gap-2.5")).toBe("_gap_2_5");});(0,_vitest.it)("should handle empty string",function(){(0,_vitest.expect)((0,_styleKey.generateStyleKey)("")).toBe("_");});(0,_vitest.it)("should handle whitespace-only string",function(){(0,_vitest.expect)((0,_styleKey.generateStyleKey)(" ")).toBe("_");(0,_vitest.expect)((0,_styleKey.generateStyleKey)("\t\n")).toBe("_");});(0,_vitest.it)("should handle multiple consecutive spaces",function(){(0,_vitest.expect)((0,_styleKey.generateStyleKey)("m-4 p-2 bg-blue-500")).toBe("_bg_blue_500_m_4_p_2");(0,_vitest.expect)((0,_styleKey.generateStyleKey)("flex items-center")).toBe("_flex_items_center");});(0,_vitest.it)("should handle leading and trailing spaces",function(){(0,_vitest.expect)((0,_styleKey.generateStyleKey)(" m-4 p-2 ")).toBe("_m_4_p_2");(0,_vitest.expect)((0,_styleKey.generateStyleKey)("\tflex items-center\n")).toBe("_flex_items_center");});(0,_vitest.it)("should handle opacity modifiers",function(){(0,_vitest.expect)((0,_styleKey.generateStyleKey)("bg-black/50")).toBe("_bg_black_50");(0,_vitest.expect)((0,_styleKey.generateStyleKey)("text-white/80")).toBe("_text_white_80");(0,_vitest.expect)((0,_styleKey.generateStyleKey)("border-blue-500/30")).toBe("_border_blue_500_30");});(0,_vitest.it)("should handle state modifiers",function(){(0,_vitest.expect)((0,_styleKey.generateStyleKey)("active:bg-blue-700")).toBe("_active_bg_blue_700");(0,_vitest.expect)((0,_styleKey.generateStyleKey)("focus:border-blue-500")).toBe("_focus_border_blue_500");(0,_vitest.expect)((0,_styleKey.generateStyleKey)("disabled:opacity-50")).toBe("_disabled_opacity_50");});(0,_vitest.it)("should handle complex combinations",function(){(0,_vitest.expect)((0,_styleKey.generateStyleKey)("m-4 p-2 bg-blue-500 text-white rounded-lg")).toBe("_bg_blue_500_m_4_p_2_rounded_lg_text_white");(0,_vitest.expect)((0,_styleKey.generateStyleKey)("flex items-center justify-between p-4 bg-gray-100 border-b-2")).toBe("_bg_gray_100_border_b_2_flex_items_center_justify_between_p_4");});(0,_vitest.it)("should handle arbitrary values in complex scenarios",function(){(0,_vitest.expect)((0,_styleKey.generateStyleKey)("m-[16px] p-[8px] bg-[#ff0000]")).toBe("_bg_ff0000_m_16px_p_8px_");(0,_vitest.expect)((0,_styleKey.generateStyleKey)("w-[100%] h-[50px] text-[14px]")).toBe("_h_50px_text_14px_w_100_");});(0,_vitest.it)("should produce consistent keys regardless of class order",function(){var combinations=["m-4 p-2 bg-blue-500","p-2 m-4 bg-blue-500","bg-blue-500 m-4 p-2","bg-blue-500 p-2 m-4","m-4 bg-blue-500 p-2","p-2 bg-blue-500 m-4"];var keys=combinations.map(_styleKey.generateStyleKey);var firstKey=keys[0];keys.forEach(function(key){(0,_vitest.expect)(key).toBe(firstKey);});});(0,_vitest.it)("should handle duplicate classes",function(){(0,_vitest.expect)((0,_styleKey.generateStyleKey)("m-4 m-4")).toBe("_m_4_m_4");(0,_vitest.expect)((0,_styleKey.generateStyleKey)("flex flex flex")).toBe("_flex_flex_flex");});(0,_vitest.it)("should handle transform classes",function(){(0,_vitest.expect)((0,_styleKey.generateStyleKey)("scale-110")).toBe("_scale_110");(0,_vitest.expect)((0,_styleKey.generateStyleKey)("rotate-45")).toBe("_rotate_45");(0,_vitest.expect)((0,_styleKey.generateStyleKey)("translate-x-4")).toBe("_translate_x_4");(0,_vitest.expect)((0,_styleKey.generateStyleKey)("-rotate-90")).toBe("__rotate_90");});(0,_vitest.it)("should handle negative values",function(){(0,_vitest.expect)((0,_styleKey.generateStyleKey)("-m-4")).toBe("__m_4");(0,_vitest.expect)((0,_styleKey.generateStyleKey)("-translate-x-8")).toBe("__translate_x_8");(0,_vitest.expect)((0,_styleKey.generateStyleKey)("-rotate-180")).toBe("__rotate_180");});(0,_vitest.it)("should be deterministic",function(){var className="m-4 p-2 bg-blue-500 text-white rounded-lg flex items-center";var key1=(0,_styleKey.generateStyleKey)(className);var key2=(0,_styleKey.generateStyleKey)(className);var key3=(0,_styleKey.generateStyleKey)(className);(0,_vitest.expect)(key1).toBe(key2);(0,_vitest.expect)(key2).toBe(key3);});(0,_vitest.it)("should create valid JavaScript identifiers",function(){var keys=[(0,_styleKey.generateStyleKey)("m-4"),(0,_styleKey.generateStyleKey)("bg-blue-500"),(0,_styleKey.generateStyleKey)("text-[14px]"),(0,_styleKey.generateStyleKey)("flex items-center"),(0,_styleKey.generateStyleKey)("active:bg-red-500")];keys.forEach(function(key){(0,_vitest.expect)(key).toMatch(/^_/);(0,_vitest.expect)(key).toMatch(/^[_a-zA-Z0-9]+$/);});});});
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mgcrea/react-native-tailwind",
3
- "version": "0.6.1",
3
+ "version": "0.8.0",
4
4
  "description": "Compile-time Tailwind CSS for React Native with zero runtime overhead",
5
5
  "author": "Olivier Louvignes <olivier@mgcrea.io> (https://github.com/mgcrea)",
6
6
  "homepage": "https://github.com/mgcrea/react-native-tailwind#readme",
@@ -19,6 +19,11 @@
19
19
  "import": "./dist/babel/index.cjs",
20
20
  "require": "./dist/babel/index.cjs"
21
21
  },
22
+ "./runtime": {
23
+ "types": "./dist/runtime.d.ts",
24
+ "import": "./dist/runtime.js",
25
+ "require": "./dist/runtime.cjs"
26
+ },
22
27
  "./react-native": {
23
28
  "types": "./dist/react-native.d.ts"
24
29
  }
@@ -31,16 +36,17 @@
31
36
  ],
32
37
  "scripts": {
33
38
  "dev": "cd example; npm run dev",
34
- "build": "npm run build:babel && npm run build:babel-plugin && npm run build:types",
39
+ "build": "npm run build:babel && npm run build:babel-plugin && npm run build:runtime && npm run build:types",
35
40
  "build:babel": "babel src --out-dir dist --extensions \".ts,.tsx,.js,.jsx\" --copy-files --ignore 'src/babel/**' --ignore '**/*.d.ts'",
36
41
  "build:babel-plugin": "node --experimental-strip-types scripts/bundle-babel-plugin.ts",
42
+ "build:runtime": "node --experimental-strip-types scripts/bundle-runtime.ts",
37
43
  "build:types": "tsc --project tsconfig.build.json --emitDeclarationOnly && node --experimental-strip-types scripts/post-build-types.ts",
38
44
  "install:ios": "cd example; npm run install:ios",
39
45
  "open:ios": "cd example; npm run open:ios",
40
46
  "lint": "eslint src/",
41
47
  "prettify": "prettier --write src/",
42
48
  "check": "tsc --noEmit",
43
- "spec": "vitest",
49
+ "spec": "vitest --run",
44
50
  "test": "npm run lint && npm run check && npm run spec",
45
51
  "prepare": "npm run build"
46
52
  },
@@ -52,6 +58,7 @@
52
58
  "@babel/cli": "^7.28.3",
53
59
  "@babel/core": "^7.28.5",
54
60
  "@babel/plugin-transform-modules-commonjs": "^7.27.1",
61
+ "@babel/preset-react": "^7.28.5",
55
62
  "@babel/preset-typescript": "^7.28.5",
56
63
  "@babel/runtime": "^7.28.4",
57
64
  "@babel/types": "^7.28.5",
@@ -80,5 +87,10 @@
80
87
  "packageManager": "pnpm@10.22.0",
81
88
  "publishConfig": {
82
89
  "access": "public"
90
+ },
91
+ "pnpm": {
92
+ "onlyBuiltDependencies": [
93
+ "esbuild"
94
+ ]
83
95
  }
84
96
  }
@@ -7,6 +7,7 @@
7
7
 
8
8
  import * as fs from "fs";
9
9
  import * as path from "path";
10
+ import { flattenColors } from "../utils/flattenColors";
10
11
 
11
12
  export type TailwindConfig = {
12
13
  theme?: {
@@ -79,29 +80,6 @@ export function loadTailwindConfig(configPath: string): TailwindConfig | null {
79
80
  }
80
81
  }
81
82
 
82
- /**
83
- * Flatten nested color objects into dot notation
84
- * Example: { brand: { light: '#fff', dark: '#000' } } -> { 'brand-light': '#fff', 'brand-dark': '#000' }
85
- */
86
- function flattenColors(
87
- colors: Record<string, string | Record<string, string>>,
88
- prefix = "",
89
- ): Record<string, string> {
90
- const result: Record<string, string> = {};
91
-
92
- for (const [key, value] of Object.entries(colors)) {
93
- const newKey = prefix ? `${prefix}-${key}` : key;
94
-
95
- if (typeof value === "string") {
96
- result[newKey] = value;
97
- } else if (typeof value === "object" && value !== null) {
98
- Object.assign(result, flattenColors(value, newKey));
99
- }
100
- }
101
-
102
- return result;
103
- }
104
-
105
83
  /**
106
84
  * Extract custom colors from tailwind config
107
85
  * Prefers theme.extend.colors over theme.colors to avoid overriding defaults