tailwind-styled-v4 5.0.37 → 5.0.39

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 (123) hide show
  1. package/dist/analyzer.js +213 -161
  2. package/dist/analyzer.js.map +1 -1
  3. package/dist/analyzer.mjs +121 -83
  4. package/dist/analyzer.mjs.map +1 -1
  5. package/dist/animate.js +131 -87
  6. package/dist/animate.js.map +1 -1
  7. package/dist/animate.mjs +31 -15
  8. package/dist/animate.mjs.map +1 -1
  9. package/dist/atomic.js +107 -67
  10. package/dist/atomic.js.map +1 -1
  11. package/dist/atomic.mjs +47 -14
  12. package/dist/atomic.mjs.map +1 -1
  13. package/dist/cli.js +601 -428
  14. package/dist/cli.js.map +1 -1
  15. package/dist/cli.mjs +504 -313
  16. package/dist/cli.mjs.map +1 -1
  17. package/dist/compiler.js +833 -508
  18. package/dist/compiler.js.map +1 -1
  19. package/dist/compiler.mjs +298 -30
  20. package/dist/compiler.mjs.map +1 -1
  21. package/dist/dashboard.js +72 -41
  22. package/dist/dashboard.js.map +1 -1
  23. package/dist/dashboard.mjs +12 -6
  24. package/dist/dashboard.mjs.map +1 -1
  25. package/dist/devtools.js +335 -289
  26. package/dist/devtools.js.map +1 -1
  27. package/dist/devtools.mjs +28 -11
  28. package/dist/devtools.mjs.map +1 -1
  29. package/dist/engine.js +719 -506
  30. package/dist/engine.js.map +1 -1
  31. package/dist/engine.mjs +520 -318
  32. package/dist/engine.mjs.map +1 -1
  33. package/dist/index.d.mts +145 -319
  34. package/dist/index.d.ts +145 -319
  35. package/dist/index.js +1337 -7442
  36. package/dist/index.js.map +1 -1
  37. package/dist/index.mjs +1275 -7386
  38. package/dist/index.mjs.map +1 -1
  39. package/dist/next.js +327 -242
  40. package/dist/next.js.map +1 -1
  41. package/dist/next.mjs +272 -184
  42. package/dist/next.mjs.map +1 -1
  43. package/dist/plugin-api.js +94 -49
  44. package/dist/plugin-api.js.map +1 -1
  45. package/dist/plugin-api.mjs +26 -6
  46. package/dist/plugin-api.mjs.map +1 -1
  47. package/dist/plugin-registry.js +68 -40
  48. package/dist/plugin-registry.js.map +1 -1
  49. package/dist/plugin-registry.mjs +14 -10
  50. package/dist/plugin-registry.mjs.map +1 -1
  51. package/dist/plugin.js +102 -53
  52. package/dist/plugin.js.map +1 -1
  53. package/dist/plugin.mjs +30 -6
  54. package/dist/plugin.mjs.map +1 -1
  55. package/dist/preset.js +48 -15
  56. package/dist/preset.js.map +1 -1
  57. package/dist/preset.mjs +13 -5
  58. package/dist/preset.mjs.map +1 -1
  59. package/dist/rspack.js +108 -53
  60. package/dist/rspack.js.map +1 -1
  61. package/dist/rspack.mjs +50 -18
  62. package/dist/rspack.mjs.map +1 -1
  63. package/dist/runtime-css.js +63 -24
  64. package/dist/runtime-css.js.map +1 -1
  65. package/dist/runtime-css.mjs +15 -7
  66. package/dist/runtime-css.mjs.map +1 -1
  67. package/dist/runtime.js +98 -44
  68. package/dist/runtime.js.map +1 -1
  69. package/dist/runtime.mjs +31 -8
  70. package/dist/runtime.mjs.map +1 -1
  71. package/dist/scanner.js +164 -120
  72. package/dist/scanner.js.map +1 -1
  73. package/dist/scanner.mjs +70 -40
  74. package/dist/scanner.mjs.map +1 -1
  75. package/dist/shared.d.mts +0 -12
  76. package/dist/shared.d.ts +0 -12
  77. package/dist/shared.js +481 -299
  78. package/dist/shared.js.map +1 -1
  79. package/dist/shared.mjs +304 -133
  80. package/dist/shared.mjs.map +1 -1
  81. package/dist/storybook-addon.js +40 -10
  82. package/dist/storybook-addon.js.map +1 -1
  83. package/dist/storybook-addon.mjs +8 -3
  84. package/dist/storybook-addon.mjs.map +1 -1
  85. package/dist/svelte.js +95 -64
  86. package/dist/svelte.js.map +1 -1
  87. package/dist/svelte.mjs +37 -14
  88. package/dist/svelte.mjs.map +1 -1
  89. package/dist/syntax.js +69 -37
  90. package/dist/syntax.js.map +1 -1
  91. package/dist/syntax.mjs +8 -7
  92. package/dist/syntax.mjs.map +1 -1
  93. package/dist/testing.js +56 -18
  94. package/dist/testing.js.map +1 -1
  95. package/dist/testing.mjs +16 -3
  96. package/dist/testing.mjs.map +1 -1
  97. package/dist/theme.js +133 -74
  98. package/dist/theme.js.map +1 -1
  99. package/dist/theme.mjs +45 -14
  100. package/dist/theme.mjs.map +1 -1
  101. package/dist/turbopackLoader.js +156 -115
  102. package/dist/turbopackLoader.js.map +1 -1
  103. package/dist/turbopackLoader.mjs +135 -82
  104. package/dist/turbopackLoader.mjs.map +1 -1
  105. package/dist/tw.js +584 -423
  106. package/dist/tw.js.map +1 -1
  107. package/dist/tw.mjs +498 -311
  108. package/dist/tw.mjs.map +1 -1
  109. package/dist/vite.js +599 -450
  110. package/dist/vite.js.map +1 -1
  111. package/dist/vite.mjs +484 -332
  112. package/dist/vite.mjs.map +1 -1
  113. package/dist/vue.js +102 -70
  114. package/dist/vue.js.map +1 -1
  115. package/dist/vue.mjs +39 -15
  116. package/dist/vue.mjs.map +1 -1
  117. package/dist/webpackLoader.js +112 -77
  118. package/dist/webpackLoader.js.map +1 -1
  119. package/dist/webpackLoader.mjs +52 -18
  120. package/dist/webpackLoader.mjs.map +1 -1
  121. package/native/tailwind-styled-native.linux-x64-gnu.node +0 -0
  122. package/native/tailwind-styled-native.node +0 -0
  123. package/package.json +3 -1
package/dist/testing.js CHANGED
@@ -1,6 +1,43 @@
1
- 'use strict';
2
-
1
+ const __importMetaUrl = typeof __filename !== "undefined" ? require("node:url").pathToFileURL(__filename).href : "file://unknown";
3
2
  /* tailwind-styled-v4 v5.0.4 | MIT | https://github.com/dictionar32/tailwind-styled-v4 */
3
+ "use strict";
4
+ var __defProp = Object.defineProperty;
5
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
6
+ var __getOwnPropNames = Object.getOwnPropertyNames;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __export = (target, all) => {
9
+ for (var name in all)
10
+ __defProp(target, name, { get: all[name], enumerable: true });
11
+ };
12
+ var __copyProps = (to, from, except, desc) => {
13
+ if (from && typeof from === "object" || typeof from === "function") {
14
+ for (let key of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(to, key) && key !== except)
16
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
+ }
18
+ return to;
19
+ };
20
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
21
+
22
+ // src/umbrella/testing.ts
23
+ var testing_exports = {};
24
+ __export(testing_exports, {
25
+ expandVariantMatrix: () => expandVariantMatrix,
26
+ expectClasses: () => expectClasses,
27
+ expectClassesEqual: () => expectClassesEqual,
28
+ expectEngineMetrics: () => expectEngineMetrics,
29
+ expectNoClasses: () => expectNoClasses,
30
+ getClassList: () => getClassList,
31
+ snapshotVariants: () => snapshotVariants,
32
+ tailwindMatchers: () => tailwindMatchers,
33
+ tailwindMatchersWithMetrics: () => tailwindMatchersWithMetrics,
34
+ testAllVariants: () => testAllVariants,
35
+ toHaveClass: () => toHaveClass,
36
+ toHaveClasses: () => toHaveClasses,
37
+ toHaveEngineMetrics: () => toHaveEngineMetrics,
38
+ toNotHaveClass: () => toNotHaveClass
39
+ });
40
+ module.exports = __toCommonJS(testing_exports);
4
41
 
5
42
  // packages/domain/testing/src/index.ts
6
43
  function toHaveClass(className) {
@@ -162,20 +199,21 @@ var tailwindMatchersWithMetrics = {
162
199
  toNotHaveClass,
163
200
  toHaveEngineMetrics
164
201
  };
165
-
166
- exports.expandVariantMatrix = expandVariantMatrix;
167
- exports.expectClasses = expectClasses;
168
- exports.expectClassesEqual = expectClassesEqual;
169
- exports.expectEngineMetrics = expectEngineMetrics;
170
- exports.expectNoClasses = expectNoClasses;
171
- exports.getClassList = getClassList;
172
- exports.snapshotVariants = snapshotVariants;
173
- exports.tailwindMatchers = tailwindMatchers;
174
- exports.tailwindMatchersWithMetrics = tailwindMatchersWithMetrics;
175
- exports.testAllVariants = testAllVariants;
176
- exports.toHaveClass = toHaveClass;
177
- exports.toHaveClasses = toHaveClasses;
178
- exports.toHaveEngineMetrics = toHaveEngineMetrics;
179
- exports.toNotHaveClass = toNotHaveClass;
180
- //# sourceMappingURL=testing.js.map
202
+ // Annotate the CommonJS export names for ESM import in node:
203
+ 0 && (module.exports = {
204
+ expandVariantMatrix,
205
+ expectClasses,
206
+ expectClassesEqual,
207
+ expectEngineMetrics,
208
+ expectNoClasses,
209
+ getClassList,
210
+ snapshotVariants,
211
+ tailwindMatchers,
212
+ tailwindMatchersWithMetrics,
213
+ testAllVariants,
214
+ toHaveClass,
215
+ toHaveClasses,
216
+ toHaveEngineMetrics,
217
+ toNotHaveClass
218
+ });
181
219
  //# sourceMappingURL=testing.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../packages/domain/testing/src/index.ts"],"names":[],"mappings":"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","file":"testing.js","sourcesContent":["/**\n * tailwind-styled-v4 — Testing Utilities\n *\n * Integrasi dengan Jest / Vitest untuk test komponen tw().\n *\n * @example\n * // vitest.config.ts\n * import { tailwindStyledSetup } from '@tailwind-styled/testing'\n * export default defineConfig({ test: { setupFiles: ['@tailwind-styled/testing/setup'] } })\n *\n * // Button.test.ts\n * import { render } from '@testing-library/react'\n * import { expectClasses, getVariantClass } from '@tailwind-styled/testing'\n *\n * test('Button renders primary variant', () => {\n * const { container } = render(<Button intent=\"primary\" />)\n * expectClasses(container.firstChild, ['bg-blue-500', 'text-white'])\n * })\n */\n\n// ─── Jest/Vitest custom matchers ─────────────────────────────────────────────\n\n/**\n * Custom matcher: toHaveClass\n * Dipakai langsung atau via expect.extend(tailwindMatchers)\n *\n * @example\n * expect(element).toHaveClass('bg-blue-500')\n */\nexport function toHaveClass(className: string) {\n return (value: { classList?: { contains: (name: string) => boolean } }) => {\n const pass = Boolean(value?.classList?.contains(className))\n return {\n pass,\n message: () => `expected element ${pass ? \"not \" : \"\"}to contain class '${className}'`,\n }\n }\n}\n\n/**\n * Custom matcher: toHaveClasses\n * Cek beberapa class sekaligus\n *\n * @example\n * expect(element).toHaveClasses(['px-4', 'py-2', 'rounded'])\n */\nexport function toHaveClasses(classNames: string[]) {\n return (value: Element | null | undefined) => {\n if (!value) return { pass: false, message: () => \"element is null or undefined\" }\n const missing = classNames.filter((c) => !value.classList.contains(c))\n const pass = missing.length === 0\n return {\n pass,\n message: () =>\n pass\n ? `expected element not to have all classes: ${classNames.join(\", \")}`\n : `expected element to have classes: ${missing.join(\", \")}`,\n }\n }\n}\n\n/**\n * Custom matcher: toNotHaveClass\n *\n * @example\n * expect(element).toNotHaveClass('hidden')\n */\nexport function toNotHaveClass(className: string) {\n return (value: Element | null | undefined) => {\n if (!value) return { pass: false, message: () => \"element is null or undefined\" }\n const pass = !value.classList.contains(className)\n return {\n pass,\n message: () => `expected element ${pass ? \"\" : \"not \"}to have class '${className}'`,\n }\n }\n}\n\n/** Semua matchers — pakai dengan expect.extend(tailwindMatchers) */\nexport const tailwindMatchers = { toHaveClass, toHaveClasses, toNotHaveClass }\n\n// ─── Helper utilities ────────────────────────────────────────────────────────\n\n/**\n * Assert element punya semua class yang diharapkan.\n * Lebih ergonomis dari `expect(el).toHaveClasses([...])` untuk banyak class.\n *\n * @example\n * const { container } = render(<Button intent=\"primary\" size=\"lg\" />)\n * expectClasses(container.firstChild, ['bg-blue-500', 'text-white', 'h-12'])\n */\nexport function expectClasses(element: Element | null | undefined, classes: string[]): void {\n if (!element) throw new Error(\"expectClasses: element is null or undefined\")\n const missing = classes.filter((c) => !element.classList.contains(c))\n if (missing.length > 0) {\n throw new Error(\n `Expected element to have classes: ${missing.join(\", \")}\\n` +\n ` Actual classes: ${element.className}`\n )\n }\n}\n\n/**\n * Assert element tidak punya class tertentu.\n *\n * @example\n * expectNoClasses(container.firstChild, ['opacity-50', 'cursor-not-allowed'])\n */\nexport function expectNoClasses(element: Element | null | undefined, classes: string[]): void {\n if (!element) throw new Error(\"expectNoClasses: element is null or undefined\")\n const found = classes.filter((c) => element.classList.contains(c))\n if (found.length > 0) {\n throw new Error(\n `Expected element NOT to have classes: ${found.join(\", \")}\\n` +\n ` Actual classes: ${element.className}`\n )\n }\n}\n\n/**\n * Extract class list dari element sebagai sorted array.\n * Berguna untuk snapshot testing.\n *\n * @example\n * expect(getClassList(element)).toMatchSnapshot()\n */\nexport function getClassList(element: Element | null | undefined): string[] {\n if (!element) return []\n // classList mungkin tidak iterable di test environment (mock object)\n // Fallback ke parsing className string jika Array.from gagal atau hasilkan []\n try {\n const list = Array.from(element.classList)\n if (list.length > 0) return list.sort()\n } catch {}\n // Fallback: parse dari className string\n if (element.className && typeof element.className === \"string\") {\n return element.className.trim().split(/\\s+/).filter(Boolean).sort()\n }\n return []\n}\n\n// ─── Variant snapshot helpers ────────────────────────────────────────────────\n\n/**\n * Buat snapshot dari semua kombinasi variant.\n * Berguna untuk regression testing pada styled components.\n *\n * @example\n * const buttonVariants = snapshotVariants(\n * (props) => {\n * const { container } = render(<Button {...props} />)\n * return container.firstChild?.className ?? ''\n * },\n * [\n * { intent: 'primary', size: 'sm' },\n * { intent: 'primary', size: 'lg' },\n * { intent: 'danger', size: 'sm' },\n * ]\n * )\n * expect(buttonVariants).toMatchSnapshot()\n */\nexport function snapshotVariants<T>(render: (variant: T) => string, variants: T[]) {\n return variants.map((variant) => ({\n variant,\n output: render(variant),\n }))\n}\n\n/**\n * Generate semua kombinasi dari variant matrix.\n *\n * @example\n * const combinations = expandVariantMatrix({\n * intent: ['primary', 'danger'],\n * size: ['sm', 'md', 'lg'],\n * disabled: [true, false],\n * })\n * // → 2 × 3 × 2 = 12 kombinasi\n */\nexport function expandVariantMatrix(\n matrix: Record<string, Array<string | number | boolean>>\n): Array<Record<string, string | number | boolean>> {\n const keys = Object.keys(matrix)\n if (keys.length === 0) return [{}]\n\n const result: Array<Record<string, string | number | boolean>> = []\n\n function walk(index: number, current: Record<string, string | number | boolean>) {\n if (index >= keys.length) {\n result.push({ ...current })\n return\n }\n const key = keys[index]!\n for (const value of matrix[key] ?? []) {\n current[key] = value\n walk(index + 1, current)\n }\n }\n\n walk(0, {})\n return result\n}\n\n/**\n * Test semua kombinasi variant sekaligus — no missing coverage.\n *\n * @example\n * testAllVariants(\n * Button,\n * { intent: ['primary','danger'], size: ['sm','lg'] },\n * (el, variant) => {\n * expect(el).not.toBeNull()\n * if (variant.intent === 'primary') expectClasses(el, ['bg-blue-500'])\n * }\n * )\n */\nexport function testAllVariants(\n matrix: Record<string, Array<string | number | boolean>>,\n testFn: (variant: Record<string, string | number | boolean>) => void\n): void {\n const combinations = expandVariantMatrix(matrix)\n for (const variant of combinations) {\n testFn(variant)\n }\n}\n\n// ─── CSS-in-JS output assertions ─────────────────────────────────────────────\n\n/**\n * Bandingkan dua class string secara semantik (urutan tidak penting).\n *\n * @example\n * expectClassesEqual('px-4 py-2 bg-blue-500', 'bg-blue-500 px-4 py-2') // pass\n */\nexport function expectClassesEqual(actual: string, expected: string): void {\n const actualSet = new Set(actual.trim().split(/\\s+/).filter(Boolean))\n const expectedSet = new Set(expected.trim().split(/\\s+/).filter(Boolean))\n\n const missing = [...expectedSet].filter((c) => !actualSet.has(c))\n const extra = [...actualSet].filter((c) => !expectedSet.has(c))\n\n if (missing.length > 0 || extra.length > 0) {\n const parts: string[] = []\n if (missing.length > 0) parts.push(`Missing: ${missing.join(\", \")}`)\n if (extra.length > 0) parts.push(`Extra: ${extra.join(\", \")}`)\n throw new Error(`Class mismatch:\\n ${parts.join(\"\\n \")}`)\n }\n}\n\n// ─── Engine metrics matchers ──────────────────────────────────────────────────\n\nexport interface EngineMetricsSnapshot {\n totalFiles?: number\n uniqueClasses?: number\n buildTimeMs?: number\n cssBytes?: number\n cacheHits?: number\n cacheMisses?: number\n incrementalRuns?: number\n fullRescans?: number\n}\n\n/**\n * Assert engine metrics snapshot meets minimum thresholds.\n *\n * @example\n * const result = await engine.build()\n * expectEngineMetrics(metrics.snapshot(), {\n * totalFiles: 10,\n * buildTimeMs: 5000, // max\n * })\n */\nexport function expectEngineMetrics(\n metrics: EngineMetricsSnapshot,\n expectations: {\n minFiles?: number\n maxBuildTimeMs?: number\n minUniqueClasses?: number\n cacheHitRateMin?: number // 0–1\n }\n): void {\n if (expectations.minFiles !== undefined) {\n const actual = metrics.totalFiles ?? 0\n if (actual < expectations.minFiles) {\n throw new Error(\n `Engine metrics: expected at least ${expectations.minFiles} files, got ${actual}`\n )\n }\n }\n\n if (expectations.maxBuildTimeMs !== undefined) {\n const actual = metrics.buildTimeMs ?? 0\n if (actual > expectations.maxBuildTimeMs) {\n throw new Error(\n `Engine metrics: build took ${actual}ms, expected ≤ ${expectations.maxBuildTimeMs}ms`\n )\n }\n }\n\n if (expectations.minUniqueClasses !== undefined) {\n const actual = metrics.uniqueClasses ?? 0\n if (actual < expectations.minUniqueClasses) {\n throw new Error(\n `Engine metrics: expected at least ${expectations.minUniqueClasses} unique classes, got ${actual}`\n )\n }\n }\n\n if (expectations.cacheHitRateMin !== undefined) {\n const hits = metrics.cacheHits ?? 0\n const total = hits + (metrics.cacheMisses ?? 0)\n const rate = total > 0 ? hits / total : 0\n if (rate < expectations.cacheHitRateMin) {\n throw new Error(\n `Engine metrics: cache hit rate ${(rate * 100).toFixed(1)}%, expected ≥ ${(expectations.cacheHitRateMin * 100).toFixed(1)}%`\n )\n }\n }\n}\n\n/**\n * Custom Jest/Vitest matcher: toHaveEngineMetrics\n *\n * @example\n * expect(metrics).toHaveEngineMetrics({ minFiles: 1 })\n */\nexport function toHaveEngineMetrics(expectations: Parameters<typeof expectEngineMetrics>[1]) {\n return (metrics: EngineMetricsSnapshot) => {\n try {\n expectEngineMetrics(metrics, expectations)\n return { pass: true, message: () => \"engine metrics matched expectations\" }\n } catch (e: unknown) {\n const msg = e instanceof Error ? e.message : String(e)\n return { pass: false, message: () => msg }\n }\n }\n}\n\n/** All matchers including engine metrics */\nexport const tailwindMatchersWithMetrics = {\n toHaveClass,\n toHaveClasses,\n toNotHaveClass,\n toHaveEngineMetrics,\n}"]}
1
+ {"version":3,"sources":["../src/umbrella/testing.ts","../packages/domain/testing/src/index.ts"],"sourcesContent":["export * from \"@tailwind-styled/testing\"\n","/**\n * tailwind-styled-v4 — Testing Utilities\n *\n * Integrasi dengan Jest / Vitest untuk test komponen tw().\n *\n * @example\n * // vitest.config.ts\n * import { tailwindStyledSetup } from '@tailwind-styled/testing'\n * export default defineConfig({ test: { setupFiles: ['@tailwind-styled/testing/setup'] } })\n *\n * // Button.test.ts\n * import { render } from '@testing-library/react'\n * import { expectClasses, getVariantClass } from '@tailwind-styled/testing'\n *\n * test('Button renders primary variant', () => {\n * const { container } = render(<Button intent=\"primary\" />)\n * expectClasses(container.firstChild, ['bg-blue-500', 'text-white'])\n * })\n */\n\n// ─── Jest/Vitest custom matchers ─────────────────────────────────────────────\n\n/**\n * Custom matcher: toHaveClass\n * Dipakai langsung atau via expect.extend(tailwindMatchers)\n *\n * @example\n * expect(element).toHaveClass('bg-blue-500')\n */\nexport function toHaveClass(className: string) {\n return (value: { classList?: { contains: (name: string) => boolean } }) => {\n const pass = Boolean(value?.classList?.contains(className))\n return {\n pass,\n message: () => `expected element ${pass ? \"not \" : \"\"}to contain class '${className}'`,\n }\n }\n}\n\n/**\n * Custom matcher: toHaveClasses\n * Cek beberapa class sekaligus\n *\n * @example\n * expect(element).toHaveClasses(['px-4', 'py-2', 'rounded'])\n */\nexport function toHaveClasses(classNames: string[]) {\n return (value: Element | null | undefined) => {\n if (!value) return { pass: false, message: () => \"element is null or undefined\" }\n const missing = classNames.filter((c) => !value.classList.contains(c))\n const pass = missing.length === 0\n return {\n pass,\n message: () =>\n pass\n ? `expected element not to have all classes: ${classNames.join(\", \")}`\n : `expected element to have classes: ${missing.join(\", \")}`,\n }\n }\n}\n\n/**\n * Custom matcher: toNotHaveClass\n *\n * @example\n * expect(element).toNotHaveClass('hidden')\n */\nexport function toNotHaveClass(className: string) {\n return (value: Element | null | undefined) => {\n if (!value) return { pass: false, message: () => \"element is null or undefined\" }\n const pass = !value.classList.contains(className)\n return {\n pass,\n message: () => `expected element ${pass ? \"\" : \"not \"}to have class '${className}'`,\n }\n }\n}\n\n/** Semua matchers — pakai dengan expect.extend(tailwindMatchers) */\nexport const tailwindMatchers = { toHaveClass, toHaveClasses, toNotHaveClass }\n\n// ─── Helper utilities ────────────────────────────────────────────────────────\n\n/**\n * Assert element punya semua class yang diharapkan.\n * Lebih ergonomis dari `expect(el).toHaveClasses([...])` untuk banyak class.\n *\n * @example\n * const { container } = render(<Button intent=\"primary\" size=\"lg\" />)\n * expectClasses(container.firstChild, ['bg-blue-500', 'text-white', 'h-12'])\n */\nexport function expectClasses(element: Element | null | undefined, classes: string[]): void {\n if (!element) throw new Error(\"expectClasses: element is null or undefined\")\n const missing = classes.filter((c) => !element.classList.contains(c))\n if (missing.length > 0) {\n throw new Error(\n `Expected element to have classes: ${missing.join(\", \")}\\n` +\n ` Actual classes: ${element.className}`\n )\n }\n}\n\n/**\n * Assert element tidak punya class tertentu.\n *\n * @example\n * expectNoClasses(container.firstChild, ['opacity-50', 'cursor-not-allowed'])\n */\nexport function expectNoClasses(element: Element | null | undefined, classes: string[]): void {\n if (!element) throw new Error(\"expectNoClasses: element is null or undefined\")\n const found = classes.filter((c) => element.classList.contains(c))\n if (found.length > 0) {\n throw new Error(\n `Expected element NOT to have classes: ${found.join(\", \")}\\n` +\n ` Actual classes: ${element.className}`\n )\n }\n}\n\n/**\n * Extract class list dari element sebagai sorted array.\n * Berguna untuk snapshot testing.\n *\n * @example\n * expect(getClassList(element)).toMatchSnapshot()\n */\nexport function getClassList(element: Element | null | undefined): string[] {\n if (!element) return []\n // classList mungkin tidak iterable di test environment (mock object)\n // Fallback ke parsing className string jika Array.from gagal atau hasilkan []\n try {\n const list = Array.from(element.classList)\n if (list.length > 0) return list.sort()\n } catch {}\n // Fallback: parse dari className string\n if (element.className && typeof element.className === \"string\") {\n return element.className.trim().split(/\\s+/).filter(Boolean).sort()\n }\n return []\n}\n\n// ─── Variant snapshot helpers ────────────────────────────────────────────────\n\n/**\n * Buat snapshot dari semua kombinasi variant.\n * Berguna untuk regression testing pada styled components.\n *\n * @example\n * const buttonVariants = snapshotVariants(\n * (props) => {\n * const { container } = render(<Button {...props} />)\n * return container.firstChild?.className ?? ''\n * },\n * [\n * { intent: 'primary', size: 'sm' },\n * { intent: 'primary', size: 'lg' },\n * { intent: 'danger', size: 'sm' },\n * ]\n * )\n * expect(buttonVariants).toMatchSnapshot()\n */\nexport function snapshotVariants<T>(render: (variant: T) => string, variants: T[]) {\n return variants.map((variant) => ({\n variant,\n output: render(variant),\n }))\n}\n\n/**\n * Generate semua kombinasi dari variant matrix.\n *\n * @example\n * const combinations = expandVariantMatrix({\n * intent: ['primary', 'danger'],\n * size: ['sm', 'md', 'lg'],\n * disabled: [true, false],\n * })\n * // → 2 × 3 × 2 = 12 kombinasi\n */\nexport function expandVariantMatrix(\n matrix: Record<string, Array<string | number | boolean>>\n): Array<Record<string, string | number | boolean>> {\n const keys = Object.keys(matrix)\n if (keys.length === 0) return [{}]\n\n const result: Array<Record<string, string | number | boolean>> = []\n\n function walk(index: number, current: Record<string, string | number | boolean>) {\n if (index >= keys.length) {\n result.push({ ...current })\n return\n }\n const key = keys[index]!\n for (const value of matrix[key] ?? []) {\n current[key] = value\n walk(index + 1, current)\n }\n }\n\n walk(0, {})\n return result\n}\n\n/**\n * Test semua kombinasi variant sekaligus — no missing coverage.\n *\n * @example\n * testAllVariants(\n * Button,\n * { intent: ['primary','danger'], size: ['sm','lg'] },\n * (el, variant) => {\n * expect(el).not.toBeNull()\n * if (variant.intent === 'primary') expectClasses(el, ['bg-blue-500'])\n * }\n * )\n */\nexport function testAllVariants(\n matrix: Record<string, Array<string | number | boolean>>,\n testFn: (variant: Record<string, string | number | boolean>) => void\n): void {\n const combinations = expandVariantMatrix(matrix)\n for (const variant of combinations) {\n testFn(variant)\n }\n}\n\n// ─── CSS-in-JS output assertions ─────────────────────────────────────────────\n\n/**\n * Bandingkan dua class string secara semantik (urutan tidak penting).\n *\n * @example\n * expectClassesEqual('px-4 py-2 bg-blue-500', 'bg-blue-500 px-4 py-2') // pass\n */\nexport function expectClassesEqual(actual: string, expected: string): void {\n const actualSet = new Set(actual.trim().split(/\\s+/).filter(Boolean))\n const expectedSet = new Set(expected.trim().split(/\\s+/).filter(Boolean))\n\n const missing = [...expectedSet].filter((c) => !actualSet.has(c))\n const extra = [...actualSet].filter((c) => !expectedSet.has(c))\n\n if (missing.length > 0 || extra.length > 0) {\n const parts: string[] = []\n if (missing.length > 0) parts.push(`Missing: ${missing.join(\", \")}`)\n if (extra.length > 0) parts.push(`Extra: ${extra.join(\", \")}`)\n throw new Error(`Class mismatch:\\n ${parts.join(\"\\n \")}`)\n }\n}\n\n// ─── Engine metrics matchers ──────────────────────────────────────────────────\n\nexport interface EngineMetricsSnapshot {\n totalFiles?: number\n uniqueClasses?: number\n buildTimeMs?: number\n cssBytes?: number\n cacheHits?: number\n cacheMisses?: number\n incrementalRuns?: number\n fullRescans?: number\n}\n\n/**\n * Assert engine metrics snapshot meets minimum thresholds.\n *\n * @example\n * const result = await engine.build()\n * expectEngineMetrics(metrics.snapshot(), {\n * totalFiles: 10,\n * buildTimeMs: 5000, // max\n * })\n */\nexport function expectEngineMetrics(\n metrics: EngineMetricsSnapshot,\n expectations: {\n minFiles?: number\n maxBuildTimeMs?: number\n minUniqueClasses?: number\n cacheHitRateMin?: number // 0–1\n }\n): void {\n if (expectations.minFiles !== undefined) {\n const actual = metrics.totalFiles ?? 0\n if (actual < expectations.minFiles) {\n throw new Error(\n `Engine metrics: expected at least ${expectations.minFiles} files, got ${actual}`\n )\n }\n }\n\n if (expectations.maxBuildTimeMs !== undefined) {\n const actual = metrics.buildTimeMs ?? 0\n if (actual > expectations.maxBuildTimeMs) {\n throw new Error(\n `Engine metrics: build took ${actual}ms, expected ≤ ${expectations.maxBuildTimeMs}ms`\n )\n }\n }\n\n if (expectations.minUniqueClasses !== undefined) {\n const actual = metrics.uniqueClasses ?? 0\n if (actual < expectations.minUniqueClasses) {\n throw new Error(\n `Engine metrics: expected at least ${expectations.minUniqueClasses} unique classes, got ${actual}`\n )\n }\n }\n\n if (expectations.cacheHitRateMin !== undefined) {\n const hits = metrics.cacheHits ?? 0\n const total = hits + (metrics.cacheMisses ?? 0)\n const rate = total > 0 ? hits / total : 0\n if (rate < expectations.cacheHitRateMin) {\n throw new Error(\n `Engine metrics: cache hit rate ${(rate * 100).toFixed(1)}%, expected ≥ ${(expectations.cacheHitRateMin * 100).toFixed(1)}%`\n )\n }\n }\n}\n\n/**\n * Custom Jest/Vitest matcher: toHaveEngineMetrics\n *\n * @example\n * expect(metrics).toHaveEngineMetrics({ minFiles: 1 })\n */\nexport function toHaveEngineMetrics(expectations: Parameters<typeof expectEngineMetrics>[1]) {\n return (metrics: EngineMetricsSnapshot) => {\n try {\n expectEngineMetrics(metrics, expectations)\n return { pass: true, message: () => \"engine metrics matched expectations\" }\n } catch (e: unknown) {\n const msg = e instanceof Error ? e.message : String(e)\n return { pass: false, message: () => msg }\n }\n }\n}\n\n/** All matchers including engine metrics */\nexport const tailwindMatchersWithMetrics = {\n toHaveClass,\n toHaveClasses,\n toNotHaveClass,\n toHaveEngineMetrics,\n}"],"mappings":"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","names":[]}
package/dist/testing.mjs CHANGED
@@ -160,7 +160,20 @@ var tailwindMatchersWithMetrics = {
160
160
  toNotHaveClass,
161
161
  toHaveEngineMetrics
162
162
  };
163
-
164
- export { expandVariantMatrix, expectClasses, expectClassesEqual, expectEngineMetrics, expectNoClasses, getClassList, snapshotVariants, tailwindMatchers, tailwindMatchersWithMetrics, testAllVariants, toHaveClass, toHaveClasses, toHaveEngineMetrics, toNotHaveClass };
165
- //# sourceMappingURL=testing.mjs.map
163
+ export {
164
+ expandVariantMatrix,
165
+ expectClasses,
166
+ expectClassesEqual,
167
+ expectEngineMetrics,
168
+ expectNoClasses,
169
+ getClassList,
170
+ snapshotVariants,
171
+ tailwindMatchers,
172
+ tailwindMatchersWithMetrics,
173
+ testAllVariants,
174
+ toHaveClass,
175
+ toHaveClasses,
176
+ toHaveEngineMetrics,
177
+ toNotHaveClass
178
+ };
166
179
  //# sourceMappingURL=testing.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../packages/domain/testing/src/index.ts"],"names":[],"mappings":"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","file":"testing.mjs","sourcesContent":["/**\n * tailwind-styled-v4 — Testing Utilities\n *\n * Integrasi dengan Jest / Vitest untuk test komponen tw().\n *\n * @example\n * // vitest.config.ts\n * import { tailwindStyledSetup } from '@tailwind-styled/testing'\n * export default defineConfig({ test: { setupFiles: ['@tailwind-styled/testing/setup'] } })\n *\n * // Button.test.ts\n * import { render } from '@testing-library/react'\n * import { expectClasses, getVariantClass } from '@tailwind-styled/testing'\n *\n * test('Button renders primary variant', () => {\n * const { container } = render(<Button intent=\"primary\" />)\n * expectClasses(container.firstChild, ['bg-blue-500', 'text-white'])\n * })\n */\n\n// ─── Jest/Vitest custom matchers ─────────────────────────────────────────────\n\n/**\n * Custom matcher: toHaveClass\n * Dipakai langsung atau via expect.extend(tailwindMatchers)\n *\n * @example\n * expect(element).toHaveClass('bg-blue-500')\n */\nexport function toHaveClass(className: string) {\n return (value: { classList?: { contains: (name: string) => boolean } }) => {\n const pass = Boolean(value?.classList?.contains(className))\n return {\n pass,\n message: () => `expected element ${pass ? \"not \" : \"\"}to contain class '${className}'`,\n }\n }\n}\n\n/**\n * Custom matcher: toHaveClasses\n * Cek beberapa class sekaligus\n *\n * @example\n * expect(element).toHaveClasses(['px-4', 'py-2', 'rounded'])\n */\nexport function toHaveClasses(classNames: string[]) {\n return (value: Element | null | undefined) => {\n if (!value) return { pass: false, message: () => \"element is null or undefined\" }\n const missing = classNames.filter((c) => !value.classList.contains(c))\n const pass = missing.length === 0\n return {\n pass,\n message: () =>\n pass\n ? `expected element not to have all classes: ${classNames.join(\", \")}`\n : `expected element to have classes: ${missing.join(\", \")}`,\n }\n }\n}\n\n/**\n * Custom matcher: toNotHaveClass\n *\n * @example\n * expect(element).toNotHaveClass('hidden')\n */\nexport function toNotHaveClass(className: string) {\n return (value: Element | null | undefined) => {\n if (!value) return { pass: false, message: () => \"element is null or undefined\" }\n const pass = !value.classList.contains(className)\n return {\n pass,\n message: () => `expected element ${pass ? \"\" : \"not \"}to have class '${className}'`,\n }\n }\n}\n\n/** Semua matchers — pakai dengan expect.extend(tailwindMatchers) */\nexport const tailwindMatchers = { toHaveClass, toHaveClasses, toNotHaveClass }\n\n// ─── Helper utilities ────────────────────────────────────────────────────────\n\n/**\n * Assert element punya semua class yang diharapkan.\n * Lebih ergonomis dari `expect(el).toHaveClasses([...])` untuk banyak class.\n *\n * @example\n * const { container } = render(<Button intent=\"primary\" size=\"lg\" />)\n * expectClasses(container.firstChild, ['bg-blue-500', 'text-white', 'h-12'])\n */\nexport function expectClasses(element: Element | null | undefined, classes: string[]): void {\n if (!element) throw new Error(\"expectClasses: element is null or undefined\")\n const missing = classes.filter((c) => !element.classList.contains(c))\n if (missing.length > 0) {\n throw new Error(\n `Expected element to have classes: ${missing.join(\", \")}\\n` +\n ` Actual classes: ${element.className}`\n )\n }\n}\n\n/**\n * Assert element tidak punya class tertentu.\n *\n * @example\n * expectNoClasses(container.firstChild, ['opacity-50', 'cursor-not-allowed'])\n */\nexport function expectNoClasses(element: Element | null | undefined, classes: string[]): void {\n if (!element) throw new Error(\"expectNoClasses: element is null or undefined\")\n const found = classes.filter((c) => element.classList.contains(c))\n if (found.length > 0) {\n throw new Error(\n `Expected element NOT to have classes: ${found.join(\", \")}\\n` +\n ` Actual classes: ${element.className}`\n )\n }\n}\n\n/**\n * Extract class list dari element sebagai sorted array.\n * Berguna untuk snapshot testing.\n *\n * @example\n * expect(getClassList(element)).toMatchSnapshot()\n */\nexport function getClassList(element: Element | null | undefined): string[] {\n if (!element) return []\n // classList mungkin tidak iterable di test environment (mock object)\n // Fallback ke parsing className string jika Array.from gagal atau hasilkan []\n try {\n const list = Array.from(element.classList)\n if (list.length > 0) return list.sort()\n } catch {}\n // Fallback: parse dari className string\n if (element.className && typeof element.className === \"string\") {\n return element.className.trim().split(/\\s+/).filter(Boolean).sort()\n }\n return []\n}\n\n// ─── Variant snapshot helpers ────────────────────────────────────────────────\n\n/**\n * Buat snapshot dari semua kombinasi variant.\n * Berguna untuk regression testing pada styled components.\n *\n * @example\n * const buttonVariants = snapshotVariants(\n * (props) => {\n * const { container } = render(<Button {...props} />)\n * return container.firstChild?.className ?? ''\n * },\n * [\n * { intent: 'primary', size: 'sm' },\n * { intent: 'primary', size: 'lg' },\n * { intent: 'danger', size: 'sm' },\n * ]\n * )\n * expect(buttonVariants).toMatchSnapshot()\n */\nexport function snapshotVariants<T>(render: (variant: T) => string, variants: T[]) {\n return variants.map((variant) => ({\n variant,\n output: render(variant),\n }))\n}\n\n/**\n * Generate semua kombinasi dari variant matrix.\n *\n * @example\n * const combinations = expandVariantMatrix({\n * intent: ['primary', 'danger'],\n * size: ['sm', 'md', 'lg'],\n * disabled: [true, false],\n * })\n * // → 2 × 3 × 2 = 12 kombinasi\n */\nexport function expandVariantMatrix(\n matrix: Record<string, Array<string | number | boolean>>\n): Array<Record<string, string | number | boolean>> {\n const keys = Object.keys(matrix)\n if (keys.length === 0) return [{}]\n\n const result: Array<Record<string, string | number | boolean>> = []\n\n function walk(index: number, current: Record<string, string | number | boolean>) {\n if (index >= keys.length) {\n result.push({ ...current })\n return\n }\n const key = keys[index]!\n for (const value of matrix[key] ?? []) {\n current[key] = value\n walk(index + 1, current)\n }\n }\n\n walk(0, {})\n return result\n}\n\n/**\n * Test semua kombinasi variant sekaligus — no missing coverage.\n *\n * @example\n * testAllVariants(\n * Button,\n * { intent: ['primary','danger'], size: ['sm','lg'] },\n * (el, variant) => {\n * expect(el).not.toBeNull()\n * if (variant.intent === 'primary') expectClasses(el, ['bg-blue-500'])\n * }\n * )\n */\nexport function testAllVariants(\n matrix: Record<string, Array<string | number | boolean>>,\n testFn: (variant: Record<string, string | number | boolean>) => void\n): void {\n const combinations = expandVariantMatrix(matrix)\n for (const variant of combinations) {\n testFn(variant)\n }\n}\n\n// ─── CSS-in-JS output assertions ─────────────────────────────────────────────\n\n/**\n * Bandingkan dua class string secara semantik (urutan tidak penting).\n *\n * @example\n * expectClassesEqual('px-4 py-2 bg-blue-500', 'bg-blue-500 px-4 py-2') // pass\n */\nexport function expectClassesEqual(actual: string, expected: string): void {\n const actualSet = new Set(actual.trim().split(/\\s+/).filter(Boolean))\n const expectedSet = new Set(expected.trim().split(/\\s+/).filter(Boolean))\n\n const missing = [...expectedSet].filter((c) => !actualSet.has(c))\n const extra = [...actualSet].filter((c) => !expectedSet.has(c))\n\n if (missing.length > 0 || extra.length > 0) {\n const parts: string[] = []\n if (missing.length > 0) parts.push(`Missing: ${missing.join(\", \")}`)\n if (extra.length > 0) parts.push(`Extra: ${extra.join(\", \")}`)\n throw new Error(`Class mismatch:\\n ${parts.join(\"\\n \")}`)\n }\n}\n\n// ─── Engine metrics matchers ──────────────────────────────────────────────────\n\nexport interface EngineMetricsSnapshot {\n totalFiles?: number\n uniqueClasses?: number\n buildTimeMs?: number\n cssBytes?: number\n cacheHits?: number\n cacheMisses?: number\n incrementalRuns?: number\n fullRescans?: number\n}\n\n/**\n * Assert engine metrics snapshot meets minimum thresholds.\n *\n * @example\n * const result = await engine.build()\n * expectEngineMetrics(metrics.snapshot(), {\n * totalFiles: 10,\n * buildTimeMs: 5000, // max\n * })\n */\nexport function expectEngineMetrics(\n metrics: EngineMetricsSnapshot,\n expectations: {\n minFiles?: number\n maxBuildTimeMs?: number\n minUniqueClasses?: number\n cacheHitRateMin?: number // 0–1\n }\n): void {\n if (expectations.minFiles !== undefined) {\n const actual = metrics.totalFiles ?? 0\n if (actual < expectations.minFiles) {\n throw new Error(\n `Engine metrics: expected at least ${expectations.minFiles} files, got ${actual}`\n )\n }\n }\n\n if (expectations.maxBuildTimeMs !== undefined) {\n const actual = metrics.buildTimeMs ?? 0\n if (actual > expectations.maxBuildTimeMs) {\n throw new Error(\n `Engine metrics: build took ${actual}ms, expected ≤ ${expectations.maxBuildTimeMs}ms`\n )\n }\n }\n\n if (expectations.minUniqueClasses !== undefined) {\n const actual = metrics.uniqueClasses ?? 0\n if (actual < expectations.minUniqueClasses) {\n throw new Error(\n `Engine metrics: expected at least ${expectations.minUniqueClasses} unique classes, got ${actual}`\n )\n }\n }\n\n if (expectations.cacheHitRateMin !== undefined) {\n const hits = metrics.cacheHits ?? 0\n const total = hits + (metrics.cacheMisses ?? 0)\n const rate = total > 0 ? hits / total : 0\n if (rate < expectations.cacheHitRateMin) {\n throw new Error(\n `Engine metrics: cache hit rate ${(rate * 100).toFixed(1)}%, expected ≥ ${(expectations.cacheHitRateMin * 100).toFixed(1)}%`\n )\n }\n }\n}\n\n/**\n * Custom Jest/Vitest matcher: toHaveEngineMetrics\n *\n * @example\n * expect(metrics).toHaveEngineMetrics({ minFiles: 1 })\n */\nexport function toHaveEngineMetrics(expectations: Parameters<typeof expectEngineMetrics>[1]) {\n return (metrics: EngineMetricsSnapshot) => {\n try {\n expectEngineMetrics(metrics, expectations)\n return { pass: true, message: () => \"engine metrics matched expectations\" }\n } catch (e: unknown) {\n const msg = e instanceof Error ? e.message : String(e)\n return { pass: false, message: () => msg }\n }\n }\n}\n\n/** All matchers including engine metrics */\nexport const tailwindMatchersWithMetrics = {\n toHaveClass,\n toHaveClasses,\n toNotHaveClass,\n toHaveEngineMetrics,\n}"]}
1
+ {"version":3,"sources":["../packages/domain/testing/src/index.ts"],"sourcesContent":["/**\n * tailwind-styled-v4 — Testing Utilities\n *\n * Integrasi dengan Jest / Vitest untuk test komponen tw().\n *\n * @example\n * // vitest.config.ts\n * import { tailwindStyledSetup } from '@tailwind-styled/testing'\n * export default defineConfig({ test: { setupFiles: ['@tailwind-styled/testing/setup'] } })\n *\n * // Button.test.ts\n * import { render } from '@testing-library/react'\n * import { expectClasses, getVariantClass } from '@tailwind-styled/testing'\n *\n * test('Button renders primary variant', () => {\n * const { container } = render(<Button intent=\"primary\" />)\n * expectClasses(container.firstChild, ['bg-blue-500', 'text-white'])\n * })\n */\n\n// ─── Jest/Vitest custom matchers ─────────────────────────────────────────────\n\n/**\n * Custom matcher: toHaveClass\n * Dipakai langsung atau via expect.extend(tailwindMatchers)\n *\n * @example\n * expect(element).toHaveClass('bg-blue-500')\n */\nexport function toHaveClass(className: string) {\n return (value: { classList?: { contains: (name: string) => boolean } }) => {\n const pass = Boolean(value?.classList?.contains(className))\n return {\n pass,\n message: () => `expected element ${pass ? \"not \" : \"\"}to contain class '${className}'`,\n }\n }\n}\n\n/**\n * Custom matcher: toHaveClasses\n * Cek beberapa class sekaligus\n *\n * @example\n * expect(element).toHaveClasses(['px-4', 'py-2', 'rounded'])\n */\nexport function toHaveClasses(classNames: string[]) {\n return (value: Element | null | undefined) => {\n if (!value) return { pass: false, message: () => \"element is null or undefined\" }\n const missing = classNames.filter((c) => !value.classList.contains(c))\n const pass = missing.length === 0\n return {\n pass,\n message: () =>\n pass\n ? `expected element not to have all classes: ${classNames.join(\", \")}`\n : `expected element to have classes: ${missing.join(\", \")}`,\n }\n }\n}\n\n/**\n * Custom matcher: toNotHaveClass\n *\n * @example\n * expect(element).toNotHaveClass('hidden')\n */\nexport function toNotHaveClass(className: string) {\n return (value: Element | null | undefined) => {\n if (!value) return { pass: false, message: () => \"element is null or undefined\" }\n const pass = !value.classList.contains(className)\n return {\n pass,\n message: () => `expected element ${pass ? \"\" : \"not \"}to have class '${className}'`,\n }\n }\n}\n\n/** Semua matchers — pakai dengan expect.extend(tailwindMatchers) */\nexport const tailwindMatchers = { toHaveClass, toHaveClasses, toNotHaveClass }\n\n// ─── Helper utilities ────────────────────────────────────────────────────────\n\n/**\n * Assert element punya semua class yang diharapkan.\n * Lebih ergonomis dari `expect(el).toHaveClasses([...])` untuk banyak class.\n *\n * @example\n * const { container } = render(<Button intent=\"primary\" size=\"lg\" />)\n * expectClasses(container.firstChild, ['bg-blue-500', 'text-white', 'h-12'])\n */\nexport function expectClasses(element: Element | null | undefined, classes: string[]): void {\n if (!element) throw new Error(\"expectClasses: element is null or undefined\")\n const missing = classes.filter((c) => !element.classList.contains(c))\n if (missing.length > 0) {\n throw new Error(\n `Expected element to have classes: ${missing.join(\", \")}\\n` +\n ` Actual classes: ${element.className}`\n )\n }\n}\n\n/**\n * Assert element tidak punya class tertentu.\n *\n * @example\n * expectNoClasses(container.firstChild, ['opacity-50', 'cursor-not-allowed'])\n */\nexport function expectNoClasses(element: Element | null | undefined, classes: string[]): void {\n if (!element) throw new Error(\"expectNoClasses: element is null or undefined\")\n const found = classes.filter((c) => element.classList.contains(c))\n if (found.length > 0) {\n throw new Error(\n `Expected element NOT to have classes: ${found.join(\", \")}\\n` +\n ` Actual classes: ${element.className}`\n )\n }\n}\n\n/**\n * Extract class list dari element sebagai sorted array.\n * Berguna untuk snapshot testing.\n *\n * @example\n * expect(getClassList(element)).toMatchSnapshot()\n */\nexport function getClassList(element: Element | null | undefined): string[] {\n if (!element) return []\n // classList mungkin tidak iterable di test environment (mock object)\n // Fallback ke parsing className string jika Array.from gagal atau hasilkan []\n try {\n const list = Array.from(element.classList)\n if (list.length > 0) return list.sort()\n } catch {}\n // Fallback: parse dari className string\n if (element.className && typeof element.className === \"string\") {\n return element.className.trim().split(/\\s+/).filter(Boolean).sort()\n }\n return []\n}\n\n// ─── Variant snapshot helpers ────────────────────────────────────────────────\n\n/**\n * Buat snapshot dari semua kombinasi variant.\n * Berguna untuk regression testing pada styled components.\n *\n * @example\n * const buttonVariants = snapshotVariants(\n * (props) => {\n * const { container } = render(<Button {...props} />)\n * return container.firstChild?.className ?? ''\n * },\n * [\n * { intent: 'primary', size: 'sm' },\n * { intent: 'primary', size: 'lg' },\n * { intent: 'danger', size: 'sm' },\n * ]\n * )\n * expect(buttonVariants).toMatchSnapshot()\n */\nexport function snapshotVariants<T>(render: (variant: T) => string, variants: T[]) {\n return variants.map((variant) => ({\n variant,\n output: render(variant),\n }))\n}\n\n/**\n * Generate semua kombinasi dari variant matrix.\n *\n * @example\n * const combinations = expandVariantMatrix({\n * intent: ['primary', 'danger'],\n * size: ['sm', 'md', 'lg'],\n * disabled: [true, false],\n * })\n * // → 2 × 3 × 2 = 12 kombinasi\n */\nexport function expandVariantMatrix(\n matrix: Record<string, Array<string | number | boolean>>\n): Array<Record<string, string | number | boolean>> {\n const keys = Object.keys(matrix)\n if (keys.length === 0) return [{}]\n\n const result: Array<Record<string, string | number | boolean>> = []\n\n function walk(index: number, current: Record<string, string | number | boolean>) {\n if (index >= keys.length) {\n result.push({ ...current })\n return\n }\n const key = keys[index]!\n for (const value of matrix[key] ?? []) {\n current[key] = value\n walk(index + 1, current)\n }\n }\n\n walk(0, {})\n return result\n}\n\n/**\n * Test semua kombinasi variant sekaligus — no missing coverage.\n *\n * @example\n * testAllVariants(\n * Button,\n * { intent: ['primary','danger'], size: ['sm','lg'] },\n * (el, variant) => {\n * expect(el).not.toBeNull()\n * if (variant.intent === 'primary') expectClasses(el, ['bg-blue-500'])\n * }\n * )\n */\nexport function testAllVariants(\n matrix: Record<string, Array<string | number | boolean>>,\n testFn: (variant: Record<string, string | number | boolean>) => void\n): void {\n const combinations = expandVariantMatrix(matrix)\n for (const variant of combinations) {\n testFn(variant)\n }\n}\n\n// ─── CSS-in-JS output assertions ─────────────────────────────────────────────\n\n/**\n * Bandingkan dua class string secara semantik (urutan tidak penting).\n *\n * @example\n * expectClassesEqual('px-4 py-2 bg-blue-500', 'bg-blue-500 px-4 py-2') // pass\n */\nexport function expectClassesEqual(actual: string, expected: string): void {\n const actualSet = new Set(actual.trim().split(/\\s+/).filter(Boolean))\n const expectedSet = new Set(expected.trim().split(/\\s+/).filter(Boolean))\n\n const missing = [...expectedSet].filter((c) => !actualSet.has(c))\n const extra = [...actualSet].filter((c) => !expectedSet.has(c))\n\n if (missing.length > 0 || extra.length > 0) {\n const parts: string[] = []\n if (missing.length > 0) parts.push(`Missing: ${missing.join(\", \")}`)\n if (extra.length > 0) parts.push(`Extra: ${extra.join(\", \")}`)\n throw new Error(`Class mismatch:\\n ${parts.join(\"\\n \")}`)\n }\n}\n\n// ─── Engine metrics matchers ──────────────────────────────────────────────────\n\nexport interface EngineMetricsSnapshot {\n totalFiles?: number\n uniqueClasses?: number\n buildTimeMs?: number\n cssBytes?: number\n cacheHits?: number\n cacheMisses?: number\n incrementalRuns?: number\n fullRescans?: number\n}\n\n/**\n * Assert engine metrics snapshot meets minimum thresholds.\n *\n * @example\n * const result = await engine.build()\n * expectEngineMetrics(metrics.snapshot(), {\n * totalFiles: 10,\n * buildTimeMs: 5000, // max\n * })\n */\nexport function expectEngineMetrics(\n metrics: EngineMetricsSnapshot,\n expectations: {\n minFiles?: number\n maxBuildTimeMs?: number\n minUniqueClasses?: number\n cacheHitRateMin?: number // 0–1\n }\n): void {\n if (expectations.minFiles !== undefined) {\n const actual = metrics.totalFiles ?? 0\n if (actual < expectations.minFiles) {\n throw new Error(\n `Engine metrics: expected at least ${expectations.minFiles} files, got ${actual}`\n )\n }\n }\n\n if (expectations.maxBuildTimeMs !== undefined) {\n const actual = metrics.buildTimeMs ?? 0\n if (actual > expectations.maxBuildTimeMs) {\n throw new Error(\n `Engine metrics: build took ${actual}ms, expected ≤ ${expectations.maxBuildTimeMs}ms`\n )\n }\n }\n\n if (expectations.minUniqueClasses !== undefined) {\n const actual = metrics.uniqueClasses ?? 0\n if (actual < expectations.minUniqueClasses) {\n throw new Error(\n `Engine metrics: expected at least ${expectations.minUniqueClasses} unique classes, got ${actual}`\n )\n }\n }\n\n if (expectations.cacheHitRateMin !== undefined) {\n const hits = metrics.cacheHits ?? 0\n const total = hits + (metrics.cacheMisses ?? 0)\n const rate = total > 0 ? hits / total : 0\n if (rate < expectations.cacheHitRateMin) {\n throw new Error(\n `Engine metrics: cache hit rate ${(rate * 100).toFixed(1)}%, expected ≥ ${(expectations.cacheHitRateMin * 100).toFixed(1)}%`\n )\n }\n }\n}\n\n/**\n * Custom Jest/Vitest matcher: toHaveEngineMetrics\n *\n * @example\n * expect(metrics).toHaveEngineMetrics({ minFiles: 1 })\n */\nexport function toHaveEngineMetrics(expectations: Parameters<typeof expectEngineMetrics>[1]) {\n return (metrics: EngineMetricsSnapshot) => {\n try {\n expectEngineMetrics(metrics, expectations)\n return { pass: true, message: () => \"engine metrics matched expectations\" }\n } catch (e: unknown) {\n const msg = e instanceof Error ? e.message : String(e)\n return { pass: false, message: () => msg }\n }\n }\n}\n\n/** All matchers including engine metrics */\nexport const tailwindMatchersWithMetrics = {\n toHaveClass,\n toHaveClasses,\n toNotHaveClass,\n toHaveEngineMetrics,\n}"],"mappings":"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","names":[]}
package/dist/theme.js CHANGED
@@ -1,27 +1,40 @@
1
- 'use strict';
2
-
3
- require('crypto');
4
- var fs = require('fs');
5
- var path = require('path');
6
- var url = require('url');
7
- var module$1 = require('module');
8
- var React = require('react');
9
- var zod = require('zod');
10
-
11
- var _documentCurrentScript = typeof document !== 'undefined' ? document.currentScript : null;
12
- function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
13
-
14
- var fs__default = /*#__PURE__*/_interopDefault(fs);
15
- var path__default = /*#__PURE__*/_interopDefault(path);
16
- var React__default = /*#__PURE__*/_interopDefault(React);
17
-
1
+ const __importMetaUrl = typeof __filename !== "undefined" ? require("node:url").pathToFileURL(__filename).href : "file://unknown";
18
2
  /* tailwind-styled-v4 v5.0.4 | MIT | https://github.com/dictionar32/tailwind-styled-v4 */
3
+ "use strict";
4
+ var __create = Object.create;
5
+ var __defProp = Object.defineProperty;
6
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
19
7
  var __getOwnPropNames = Object.getOwnPropertyNames;
8
+ var __getProtoOf = Object.getPrototypeOf;
9
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
20
10
  var __esm = (fn, res) => function __init() {
21
11
  return fn && (res = (0, fn[__getOwnPropNames(fn)[0]])(fn = 0)), res;
22
12
  };
13
+ var __export = (target, all) => {
14
+ for (var name in all)
15
+ __defProp(target, name, { get: all[name], enumerable: true });
16
+ };
17
+ var __copyProps = (to, from, except, desc) => {
18
+ if (from && typeof from === "object" || typeof from === "function") {
19
+ for (let key of __getOwnPropNames(from))
20
+ if (!__hasOwnProp.call(to, key) && key !== except)
21
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
22
+ }
23
+ return to;
24
+ };
25
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
26
+ // If the importer is in node compatibility mode or this is not an ESM
27
+ // file that has been converted to a CommonJS file using a Babel-
28
+ // compatible transform (i.e. "__esModule" has not been set), then set
29
+ // "default" to the CommonJS "module.exports" for node compatibility.
30
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
31
+ mod
32
+ ));
33
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
34
+
35
+ // packages/domain/shared/src/index.ts
23
36
  function createDebugLogger(namespace, label) {
24
- const prefix = `[${namespace}]`;
37
+ const prefix = label ? `[${namespace}:${label}]` : `[${namespace}]`;
25
38
  return (msg) => {
26
39
  if (process.env.DEBUG?.includes(namespace) || process.env.TW_DEBUG) {
27
40
  console.debug(prefix, msg);
@@ -32,9 +45,9 @@ function loadNativeBinding(options) {
32
45
  const { runtimeDir, candidates, isValid } = options;
33
46
  const loadErrors = [];
34
47
  for (const candidate of candidates) {
35
- const candidatePath = path__default.default.resolve(runtimeDir, candidate);
48
+ const candidatePath = import_node_path.default.resolve(runtimeDir, candidate);
36
49
  try {
37
- if (!fs__default.default.existsSync(candidatePath) && !fs__default.default.existsSync(candidatePath + ".node")) {
50
+ if (!import_node_fs.default.existsSync(candidatePath) && !import_node_fs.default.existsSync(candidatePath + ".node")) {
38
51
  continue;
39
52
  }
40
53
  const mod = requireNativeModule(candidatePath);
@@ -66,9 +79,9 @@ function resolveNativeBindingCandidates(options) {
66
79
  }
67
80
  }
68
81
  if (!includeDefaultCandidates) return candidates;
69
- if (fs__default.default.existsSync(runtimeDir)) {
82
+ if (import_node_fs.default.existsSync(runtimeDir)) {
70
83
  try {
71
- for (const entry of fs__default.default.readdirSync(runtimeDir)) {
84
+ for (const entry of import_node_fs.default.readdirSync(runtimeDir)) {
72
85
  if (entry.endsWith(".node")) candidates.push(entry);
73
86
  }
74
87
  } catch {
@@ -77,24 +90,63 @@ function resolveNativeBindingCandidates(options) {
77
90
  const BINARY_NAMES = ["tailwind-styled-native", "tailwind_styled_parser"];
78
91
  const napiPlatform = process.platform === "linux" && process.arch === "x64" ? "linux-x64-gnu" : process.platform === "linux" && process.arch === "arm64" ? "linux-arm64-gnu" : `${process.platform}-${process.arch}`;
79
92
  for (const bin of BINARY_NAMES) {
80
- candidates.push(path__default.default.resolve(runtimeDir, `${bin}.node`));
81
- candidates.push(path__default.default.resolve(runtimeDir, `${bin}.${napiPlatform}.node`));
82
- candidates.push(path__default.default.resolve(runtimeDir, "..", "native", `${bin}.node`));
83
- candidates.push(path__default.default.resolve(runtimeDir, "..", "native", `${bin}.${napiPlatform}.node`));
84
- candidates.push(path__default.default.resolve(process.cwd(), "native", `${bin}.node`));
85
- candidates.push(path__default.default.resolve(process.cwd(), "native", `${bin}.${napiPlatform}.node`));
86
- candidates.push(path__default.default.resolve(runtimeDir, "..", "..", "..", "..", "native", `${bin}.node`));
87
- candidates.push(path__default.default.resolve(runtimeDir, "..", "..", "..", "..", "native", `${bin}.${napiPlatform}.node`));
88
- candidates.push(path__default.default.resolve(runtimeDir, "..", "..", "..", "native", `${bin}.node`));
93
+ candidates.push(import_node_path.default.resolve(runtimeDir, `${bin}.node`));
94
+ candidates.push(import_node_path.default.resolve(runtimeDir, `${bin}.${napiPlatform}.node`));
95
+ candidates.push(import_node_path.default.resolve(runtimeDir, "..", "native", `${bin}.node`));
96
+ candidates.push(import_node_path.default.resolve(runtimeDir, "..", "native", `${bin}.${napiPlatform}.node`));
97
+ candidates.push(import_node_path.default.resolve(process.cwd(), "native", `${bin}.node`));
98
+ candidates.push(import_node_path.default.resolve(process.cwd(), "native", `${bin}.${napiPlatform}.node`));
99
+ candidates.push(import_node_path.default.resolve(runtimeDir, "..", "..", "..", "..", "native", `${bin}.node`));
100
+ candidates.push(import_node_path.default.resolve(runtimeDir, "..", "..", "..", "..", "native", `${bin}.${napiPlatform}.node`));
101
+ candidates.push(import_node_path.default.resolve(runtimeDir, "..", "..", "..", "native", `${bin}.node`));
89
102
  }
90
103
  return Array.from(new Set(candidates));
91
104
  }
92
- var _require;
105
+ var import_node_crypto, import_node_fs, import_node_path, import_node_url, import_node_module, _require;
93
106
  var init_src = __esm({
94
107
  "packages/domain/shared/src/index.ts"() {
95
- _require = module$1.createRequire((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('theme.js', document.baseURI).href)));
108
+ "use strict";
109
+ import_node_crypto = require("crypto");
110
+ import_node_fs = __toESM(require("fs"));
111
+ import_node_path = __toESM(require("path"));
112
+ import_node_url = require("url");
113
+ import_node_module = require("module");
114
+ _require = (0, import_node_module.createRequire)(
115
+ typeof __filename !== "undefined" ? `file://${__filename}` : __importMetaUrl ?? "file://unknown"
116
+ );
96
117
  }
97
118
  });
119
+
120
+ // src/umbrella/theme.ts
121
+ var theme_exports = {};
122
+ __export(theme_exports, {
123
+ LiveTokenUpdateSchema: () => LiveTokenUpdateSchema,
124
+ ThemeRegistrationSchema: () => ThemeRegistrationSchema,
125
+ ThemeRegistry: () => ThemeRegistry,
126
+ TokenConfigSchema: () => TokenConfigSchema,
127
+ applyTokenSet: () => applyTokenSet,
128
+ compileDesignTokens: () => compileDesignTokens,
129
+ createMultiTheme: () => createMultiTheme,
130
+ createTheme: () => createTheme,
131
+ createUseTokens: () => createUseTokens,
132
+ defineThemeContract: () => defineThemeContract,
133
+ generateTokenCssString: () => generateTokenCssString,
134
+ getToken: () => getToken,
135
+ getTokens: () => getTokens,
136
+ liveToken: () => liveToken,
137
+ liveTokenEngine: () => liveTokenEngine,
138
+ parseLiveTokenUpdate: () => parseLiveTokenUpdate,
139
+ parseTokenConfig: () => parseTokenConfig,
140
+ setToken: () => setToken,
141
+ setTokens: () => setTokens,
142
+ subscribeTokens: () => subscribeTokens,
143
+ tokenRef: () => tokenRef,
144
+ tokenVar: () => tokenVar
145
+ });
146
+ module.exports = __toCommonJS(theme_exports);
147
+
148
+ // packages/domain/theme/src/liveTokenEngine.ts
149
+ var import_react = __toESM(require("react"), 1);
98
150
  var TOKEN_ENGINE_KEY = "__TW_TOKEN_ENGINE__";
99
151
  function tokenVar(name) {
100
152
  const normalized = name.replace(/[^a-zA-Z0-9-]/g, "-").toLowerCase();
@@ -240,8 +292,8 @@ function generateTokenCssString() {
240
292
  }
241
293
  function createUseTokens() {
242
294
  return function useTokens() {
243
- const [tokens, setTokensState] = React__default.default.useState(engine.getTokens());
244
- React__default.default.useEffect(() => {
295
+ const [tokens, setTokensState] = import_react.default.useState(engine.getTokens());
296
+ import_react.default.useEffect(() => {
245
297
  setTokensState(engine.getTokens());
246
298
  return engine.subscribe((nextTokens) => setTokensState(nextTokens));
247
299
  }, []);
@@ -264,17 +316,20 @@ if (typeof window !== "undefined") {
264
316
  }
265
317
 
266
318
  // packages/domain/theme/src/native-bridge.ts
319
+ var import_node_path2 = __toESM(require("path"), 1);
320
+ var import_node_url2 = require("url");
267
321
  init_src();
322
+ var import_meta = {};
268
323
  var log = createDebugLogger("theme:native");
269
324
  function getDirname() {
270
325
  if (typeof __dirname !== "undefined") return __dirname;
271
- if (typeof ({ url: (typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('theme.js', document.baseURI).href)) }) !== "undefined" && (typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('theme.js', document.baseURI).href))) {
272
- return path__default.default.dirname(url.fileURLToPath((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('theme.js', document.baseURI).href))));
326
+ if (typeof import_meta !== "undefined" && __importMetaUrl) {
327
+ return import_node_path2.default.dirname((0, import_node_url2.fileURLToPath)(__importMetaUrl));
273
328
  }
274
329
  return process.cwd();
275
330
  }
276
- var isValidThemeBinding = (module) => {
277
- const candidate = module;
331
+ var isValidThemeBinding = (module2) => {
332
+ const candidate = module2;
278
333
  return !!(candidate && typeof candidate.compileTheme === "function");
279
334
  };
280
335
  var createThemeBindingLoader = () => {
@@ -309,6 +364,9 @@ var themeBindingLoader = createThemeBindingLoader();
309
364
  function getNativeThemeBinding() {
310
365
  return themeBindingLoader.get();
311
366
  }
367
+
368
+ // packages/domain/theme/src/schemas.ts
369
+ var import_zod = require("zod");
312
370
  var formatIssues = (error) => error.issues.map((issue) => {
313
371
  const p = issue.path.length > 0 ? issue.path.join(".") : "<root>";
314
372
  return `${p}: ${issue.message}`;
@@ -318,19 +376,19 @@ var parseWithSchema = (schema, data, label) => {
318
376
  if (parsed.success) return parsed.data;
319
377
  throw new TypeError(`${label}: ${formatIssues(parsed.error)}`);
320
378
  };
321
- var TokenConfigSchema = zod.z.object({
322
- name: zod.z.string().min(1),
323
- values: zod.z.record(zod.z.string(), zod.z.record(zod.z.string(), zod.z.string())),
324
- asRoot: zod.z.boolean().optional()
379
+ var TokenConfigSchema = import_zod.z.object({
380
+ name: import_zod.z.string().min(1),
381
+ values: import_zod.z.record(import_zod.z.string(), import_zod.z.record(import_zod.z.string(), import_zod.z.string())),
382
+ asRoot: import_zod.z.boolean().optional()
325
383
  });
326
- var LiveTokenUpdateSchema = zod.z.object({
327
- tokens: zod.z.record(zod.z.string(), zod.z.string()),
328
- source: zod.z.string().optional()
384
+ var LiveTokenUpdateSchema = import_zod.z.object({
385
+ tokens: import_zod.z.record(import_zod.z.string(), import_zod.z.string()),
386
+ source: import_zod.z.string().optional()
329
387
  });
330
- var ThemeRegistrationSchema = zod.z.object({
331
- name: zod.z.string().min(1),
332
- tokens: zod.z.record(zod.z.string(), zod.z.record(zod.z.string(), zod.z.string())),
333
- isDefault: zod.z.boolean().optional()
388
+ var ThemeRegistrationSchema = import_zod.z.object({
389
+ name: import_zod.z.string().min(1),
390
+ tokens: import_zod.z.record(import_zod.z.string(), import_zod.z.record(import_zod.z.string(), import_zod.z.string())),
391
+ isDefault: import_zod.z.boolean().optional()
334
392
  });
335
393
  var parseTokenConfig = (data) => parseWithSchema(TokenConfigSchema, data, "token config is invalid");
336
394
  var parseLiveTokenUpdate = (data) => parseWithSchema(LiveTokenUpdateSchema, data, "live token update is invalid");
@@ -460,28 +518,29 @@ function compileDesignTokens(tokens, prefix = "") {
460
518
  "FATAL: Native binding 'compileTheme' is required but not available. Run 'npm run build:rust' to build the native module."
461
519
  );
462
520
  }
463
-
464
- exports.LiveTokenUpdateSchema = LiveTokenUpdateSchema;
465
- exports.ThemeRegistrationSchema = ThemeRegistrationSchema;
466
- exports.ThemeRegistry = ThemeRegistry;
467
- exports.TokenConfigSchema = TokenConfigSchema;
468
- exports.applyTokenSet = applyTokenSet;
469
- exports.compileDesignTokens = compileDesignTokens;
470
- exports.createMultiTheme = createMultiTheme;
471
- exports.createTheme = createTheme;
472
- exports.createUseTokens = createUseTokens;
473
- exports.defineThemeContract = defineThemeContract;
474
- exports.generateTokenCssString = generateTokenCssString;
475
- exports.getToken = getToken;
476
- exports.getTokens = getTokens;
477
- exports.liveToken = liveToken;
478
- exports.liveTokenEngine = liveTokenEngine;
479
- exports.parseLiveTokenUpdate = parseLiveTokenUpdate;
480
- exports.parseTokenConfig = parseTokenConfig;
481
- exports.setToken = setToken;
482
- exports.setTokens = setTokens;
483
- exports.subscribeTokens = subscribeTokens;
484
- exports.tokenRef = tokenRef;
485
- exports.tokenVar = tokenVar;
486
- //# sourceMappingURL=theme.js.map
521
+ // Annotate the CommonJS export names for ESM import in node:
522
+ 0 && (module.exports = {
523
+ LiveTokenUpdateSchema,
524
+ ThemeRegistrationSchema,
525
+ ThemeRegistry,
526
+ TokenConfigSchema,
527
+ applyTokenSet,
528
+ compileDesignTokens,
529
+ createMultiTheme,
530
+ createTheme,
531
+ createUseTokens,
532
+ defineThemeContract,
533
+ generateTokenCssString,
534
+ getToken,
535
+ getTokens,
536
+ liveToken,
537
+ liveTokenEngine,
538
+ parseLiveTokenUpdate,
539
+ parseTokenConfig,
540
+ setToken,
541
+ setTokens,
542
+ subscribeTokens,
543
+ tokenRef,
544
+ tokenVar
545
+ });
487
546
  //# sourceMappingURL=theme.js.map