@pyreon/rocketstyle 0.11.1 → 0.11.3
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.
- package/lib/index.js +23 -10
- package/package.json +8 -7
- package/src/__tests__/attrs.test.ts +190 -0
- package/src/__tests__/chaining.test.ts +86 -0
- package/src/__tests__/collection.test.ts +35 -0
- package/src/__tests__/compose.test.ts +36 -0
- package/src/__tests__/context.test.ts +200 -0
- package/src/__tests__/createLocalProvider.test.ts +248 -0
- package/src/__tests__/dimensions.test.ts +183 -0
- package/src/__tests__/e2e-styler.test.ts +291 -0
- package/src/__tests__/hooks.test.ts +207 -0
- package/src/__tests__/isRocketComponent.test.ts +48 -0
- package/src/__tests__/misc.test.ts +204 -0
- package/src/__tests__/providerConsumer.test.ts +248 -0
- package/src/__tests__/rocketstyleIntegration.test.ts +615 -0
- package/src/__tests__/themeUtils.test.ts +463 -0
- package/src/cache/LocalThemeManager.ts +14 -0
- package/src/cache/index.ts +3 -0
- package/src/constants/booleanTags.ts +32 -0
- package/src/constants/defaultDimensions.ts +23 -0
- package/src/constants/index.ts +44 -0
- package/src/context/context.ts +51 -0
- package/src/context/createLocalProvider.ts +84 -0
- package/src/context/localContext.ts +37 -0
- package/src/hoc/index.ts +3 -0
- package/src/hoc/rocketstyleAttrsHoc.ts +63 -0
- package/src/hooks/index.ts +4 -0
- package/src/hooks/usePseudoState.ts +79 -0
- package/src/hooks/useTheme.ts +51 -0
- package/src/index.ts +77 -0
- package/src/init.ts +93 -0
- package/src/isRocketComponent.ts +16 -0
- package/src/rocketstyle.ts +320 -0
- package/src/types/attrs.ts +13 -0
- package/src/types/config.ts +48 -0
- package/src/types/configuration.ts +69 -0
- package/src/types/dimensions.ts +106 -0
- package/src/types/hoc.ts +5 -0
- package/src/types/pseudo.ts +19 -0
- package/src/types/rocketComponent.ts +24 -0
- package/src/types/rocketstyle.ts +156 -0
- package/src/types/styles.ts +46 -0
- package/src/types/theme.ts +19 -0
- package/src/types/utils.ts +55 -0
- package/src/utils/attrs.ts +134 -0
- package/src/utils/chaining.ts +58 -0
- package/src/utils/collection.ts +9 -0
- package/src/utils/compose.ts +11 -0
- package/src/utils/dimensions.ts +126 -0
- package/src/utils/statics.ts +44 -0
- package/src/utils/styles.ts +18 -0
- package/src/utils/theme.ts +196 -0
|
@@ -0,0 +1,248 @@
|
|
|
1
|
+
import { provide } from "@pyreon/core"
|
|
2
|
+
import createLocalProvider from "../context/createLocalProvider"
|
|
3
|
+
|
|
4
|
+
// Mock @pyreon/core provide
|
|
5
|
+
vi.mock("@pyreon/core", async (importOriginal) => {
|
|
6
|
+
const original = await importOriginal<typeof import("@pyreon/core")>()
|
|
7
|
+
return {
|
|
8
|
+
...original,
|
|
9
|
+
provide: vi.fn(),
|
|
10
|
+
}
|
|
11
|
+
})
|
|
12
|
+
|
|
13
|
+
const mockedProvide = vi.mocked(provide)
|
|
14
|
+
|
|
15
|
+
beforeEach(() => {
|
|
16
|
+
vi.clearAllMocks()
|
|
17
|
+
})
|
|
18
|
+
|
|
19
|
+
/** Simple base component that returns its received props as a VNode for inspection. */
|
|
20
|
+
const BaseComponent: any = vi.fn((props: Record<string, unknown>) => ({
|
|
21
|
+
type: "div",
|
|
22
|
+
props,
|
|
23
|
+
children: props.children,
|
|
24
|
+
key: null,
|
|
25
|
+
}))
|
|
26
|
+
|
|
27
|
+
describe("createLocalProvider", () => {
|
|
28
|
+
it("returns a component function", () => {
|
|
29
|
+
const HOC = createLocalProvider(BaseComponent)
|
|
30
|
+
expect(typeof HOC).toBe("function")
|
|
31
|
+
})
|
|
32
|
+
|
|
33
|
+
it("calls the wrapped component with forwarded props", () => {
|
|
34
|
+
const HOC = createLocalProvider(BaseComponent)
|
|
35
|
+
|
|
36
|
+
HOC({ "data-testid": "test", title: "Hello", children: "Content" } as any)
|
|
37
|
+
|
|
38
|
+
expect(BaseComponent).toHaveBeenCalledTimes(1)
|
|
39
|
+
const callProps = BaseComponent.mock.calls[0]?.[0] as Record<string, unknown>
|
|
40
|
+
expect(callProps["data-testid"]).toBe("test")
|
|
41
|
+
expect(callProps.title).toBe("Hello")
|
|
42
|
+
expect(callProps.children).toBe("Content")
|
|
43
|
+
})
|
|
44
|
+
|
|
45
|
+
it("provides local context via provide()", () => {
|
|
46
|
+
const HOC = createLocalProvider(BaseComponent)
|
|
47
|
+
|
|
48
|
+
HOC({} as any)
|
|
49
|
+
|
|
50
|
+
expect(mockedProvide).toHaveBeenCalledTimes(1)
|
|
51
|
+
})
|
|
52
|
+
|
|
53
|
+
it("initial pseudo state is all false", () => {
|
|
54
|
+
const HOC = createLocalProvider(BaseComponent)
|
|
55
|
+
|
|
56
|
+
HOC({} as any)
|
|
57
|
+
|
|
58
|
+
const callProps = BaseComponent.mock.calls[0]?.[0] as Record<string, unknown>
|
|
59
|
+
const rocketstate = callProps.$rocketstate as Record<string, unknown>
|
|
60
|
+
const pseudo = rocketstate?.pseudo as Record<string, boolean>
|
|
61
|
+
|
|
62
|
+
expect(pseudo.hover).toBe(false)
|
|
63
|
+
expect(pseudo.focus).toBe(false)
|
|
64
|
+
expect(pseudo.pressed).toBe(false)
|
|
65
|
+
})
|
|
66
|
+
|
|
67
|
+
it("injects mouse and focus event handlers", () => {
|
|
68
|
+
const HOC = createLocalProvider(BaseComponent)
|
|
69
|
+
|
|
70
|
+
HOC({} as any)
|
|
71
|
+
|
|
72
|
+
const callProps = BaseComponent.mock.calls[0]?.[0] as Record<string, unknown>
|
|
73
|
+
expect(typeof callProps.onMouseEnter).toBe("function")
|
|
74
|
+
expect(typeof callProps.onMouseLeave).toBe("function")
|
|
75
|
+
expect(typeof callProps.onMouseDown).toBe("function")
|
|
76
|
+
expect(typeof callProps.onMouseUp).toBe("function")
|
|
77
|
+
expect(typeof callProps.onFocus).toBe("function")
|
|
78
|
+
expect(typeof callProps.onBlur).toBe("function")
|
|
79
|
+
})
|
|
80
|
+
|
|
81
|
+
it("forwards original onMouseEnter handler", () => {
|
|
82
|
+
const HOC = createLocalProvider(BaseComponent)
|
|
83
|
+
const originalHandler = vi.fn()
|
|
84
|
+
const mockEvent = new MouseEvent("mouseenter")
|
|
85
|
+
|
|
86
|
+
HOC({ onMouseEnter: originalHandler } as any)
|
|
87
|
+
|
|
88
|
+
const callProps = BaseComponent.mock.calls[0]?.[0] as Record<string, unknown>
|
|
89
|
+
;(callProps.onMouseEnter as (e: MouseEvent) => void)(mockEvent)
|
|
90
|
+
|
|
91
|
+
expect(originalHandler).toHaveBeenCalledWith(mockEvent)
|
|
92
|
+
})
|
|
93
|
+
|
|
94
|
+
it("forwards original onMouseLeave handler", () => {
|
|
95
|
+
const HOC = createLocalProvider(BaseComponent)
|
|
96
|
+
const originalHandler = vi.fn()
|
|
97
|
+
const mockEvent = new MouseEvent("mouseleave")
|
|
98
|
+
|
|
99
|
+
HOC({ onMouseLeave: originalHandler } as any)
|
|
100
|
+
|
|
101
|
+
const callProps = BaseComponent.mock.calls[0]?.[0] as Record<string, unknown>
|
|
102
|
+
;(callProps.onMouseLeave as (e: MouseEvent) => void)(mockEvent)
|
|
103
|
+
|
|
104
|
+
expect(originalHandler).toHaveBeenCalledWith(mockEvent)
|
|
105
|
+
})
|
|
106
|
+
|
|
107
|
+
it("forwards original onMouseDown handler", () => {
|
|
108
|
+
const HOC = createLocalProvider(BaseComponent)
|
|
109
|
+
const originalHandler = vi.fn()
|
|
110
|
+
const mockEvent = new MouseEvent("mousedown")
|
|
111
|
+
|
|
112
|
+
HOC({ onMouseDown: originalHandler } as any)
|
|
113
|
+
|
|
114
|
+
const callProps = BaseComponent.mock.calls[0]?.[0] as Record<string, unknown>
|
|
115
|
+
;(callProps.onMouseDown as (e: MouseEvent) => void)(mockEvent)
|
|
116
|
+
|
|
117
|
+
expect(originalHandler).toHaveBeenCalledWith(mockEvent)
|
|
118
|
+
})
|
|
119
|
+
|
|
120
|
+
it("forwards original onMouseUp handler", () => {
|
|
121
|
+
const HOC = createLocalProvider(BaseComponent)
|
|
122
|
+
const originalHandler = vi.fn()
|
|
123
|
+
const mockEvent = new MouseEvent("mouseup")
|
|
124
|
+
|
|
125
|
+
HOC({ onMouseUp: originalHandler } as any)
|
|
126
|
+
|
|
127
|
+
const callProps = BaseComponent.mock.calls[0]?.[0] as Record<string, unknown>
|
|
128
|
+
;(callProps.onMouseUp as (e: MouseEvent) => void)(mockEvent)
|
|
129
|
+
|
|
130
|
+
expect(originalHandler).toHaveBeenCalledWith(mockEvent)
|
|
131
|
+
})
|
|
132
|
+
|
|
133
|
+
it("forwards original onFocus handler", () => {
|
|
134
|
+
const HOC = createLocalProvider(BaseComponent)
|
|
135
|
+
const originalHandler = vi.fn()
|
|
136
|
+
const mockEvent = new FocusEvent("focus")
|
|
137
|
+
|
|
138
|
+
HOC({ onFocus: originalHandler } as any)
|
|
139
|
+
|
|
140
|
+
const callProps = BaseComponent.mock.calls[0]?.[0] as Record<string, unknown>
|
|
141
|
+
;(callProps.onFocus as (e: FocusEvent) => void)(mockEvent)
|
|
142
|
+
|
|
143
|
+
expect(originalHandler).toHaveBeenCalledWith(mockEvent)
|
|
144
|
+
})
|
|
145
|
+
|
|
146
|
+
it("forwards original onBlur handler", () => {
|
|
147
|
+
const HOC = createLocalProvider(BaseComponent)
|
|
148
|
+
const originalHandler = vi.fn()
|
|
149
|
+
const mockEvent = new FocusEvent("blur")
|
|
150
|
+
|
|
151
|
+
HOC({ onBlur: originalHandler } as any)
|
|
152
|
+
|
|
153
|
+
const callProps = BaseComponent.mock.calls[0]?.[0] as Record<string, unknown>
|
|
154
|
+
;(callProps.onBlur as (e: FocusEvent) => void)(mockEvent)
|
|
155
|
+
|
|
156
|
+
expect(originalHandler).toHaveBeenCalledWith(mockEvent)
|
|
157
|
+
})
|
|
158
|
+
|
|
159
|
+
it("does not forward event handlers that were not provided", () => {
|
|
160
|
+
const HOC = createLocalProvider(BaseComponent)
|
|
161
|
+
|
|
162
|
+
HOC({} as any)
|
|
163
|
+
|
|
164
|
+
const callProps = BaseComponent.mock.calls[0]?.[0] as Record<string, unknown>
|
|
165
|
+
// The HOC event handlers should not throw when no original handler exists
|
|
166
|
+
expect(() => {
|
|
167
|
+
;(callProps.onMouseEnter as (e: MouseEvent) => void)(new MouseEvent("mouseenter"))
|
|
168
|
+
;(callProps.onMouseLeave as (e: MouseEvent) => void)(new MouseEvent("mouseleave"))
|
|
169
|
+
;(callProps.onMouseDown as (e: MouseEvent) => void)(new MouseEvent("mousedown"))
|
|
170
|
+
;(callProps.onMouseUp as (e: MouseEvent) => void)(new MouseEvent("mouseup"))
|
|
171
|
+
;(callProps.onFocus as (e: FocusEvent) => void)(new FocusEvent("focus"))
|
|
172
|
+
;(callProps.onBlur as (e: FocusEvent) => void)(new FocusEvent("blur"))
|
|
173
|
+
}).not.toThrow()
|
|
174
|
+
})
|
|
175
|
+
|
|
176
|
+
it("merges existing $rocketstate with pseudo state", () => {
|
|
177
|
+
const HOC = createLocalProvider(BaseComponent)
|
|
178
|
+
|
|
179
|
+
HOC({
|
|
180
|
+
$rocketstate: { someExisting: "value", pseudo: { disabled: true } },
|
|
181
|
+
} as any)
|
|
182
|
+
|
|
183
|
+
const callProps = BaseComponent.mock.calls[0]?.[0] as Record<string, unknown>
|
|
184
|
+
const rocketstate = callProps.$rocketstate as Record<string, unknown>
|
|
185
|
+
|
|
186
|
+
expect(rocketstate.someExisting).toBe("value")
|
|
187
|
+
const pseudo = rocketstate.pseudo as Record<string, unknown>
|
|
188
|
+
expect(pseudo.disabled).toBe(true)
|
|
189
|
+
expect(pseudo.hover).toBe(false)
|
|
190
|
+
expect(pseudo.focus).toBe(false)
|
|
191
|
+
expect(pseudo.pressed).toBe(false)
|
|
192
|
+
})
|
|
193
|
+
|
|
194
|
+
it("provides updated state to local context", () => {
|
|
195
|
+
const HOC = createLocalProvider(BaseComponent)
|
|
196
|
+
|
|
197
|
+
HOC({} as any)
|
|
198
|
+
|
|
199
|
+
expect(mockedProvide).toHaveBeenCalledTimes(1)
|
|
200
|
+
const [, providedValue] = mockedProvide.mock.calls[0] as [unknown, Record<string, unknown>]
|
|
201
|
+
const pseudo = providedValue.pseudo as Record<string, boolean>
|
|
202
|
+
expect(pseudo.hover).toBe(false)
|
|
203
|
+
expect(pseudo.focus).toBe(false)
|
|
204
|
+
expect(pseudo.pressed).toBe(false)
|
|
205
|
+
})
|
|
206
|
+
|
|
207
|
+
it("does not pass event handler props to wrapped component as original handler names", () => {
|
|
208
|
+
const HOC = createLocalProvider(BaseComponent)
|
|
209
|
+
const originalMouseEnter = vi.fn()
|
|
210
|
+
|
|
211
|
+
HOC({ onMouseEnter: originalMouseEnter, customProp: "keep" } as any)
|
|
212
|
+
|
|
213
|
+
const callProps = BaseComponent.mock.calls[0]?.[0] as Record<string, unknown>
|
|
214
|
+
// The wrapped component should receive the HOC event handlers, not the original ones
|
|
215
|
+
expect(callProps.customProp).toBe("keep")
|
|
216
|
+
// The onMouseEnter on the component should be the HOC wrapper, not the original
|
|
217
|
+
expect(callProps.onMouseEnter).not.toBe(originalMouseEnter)
|
|
218
|
+
})
|
|
219
|
+
|
|
220
|
+
it("strips $rocketstate from forwarded props and passes updated version", () => {
|
|
221
|
+
const HOC = createLocalProvider(BaseComponent)
|
|
222
|
+
const originalState = { existing: true }
|
|
223
|
+
|
|
224
|
+
HOC({ $rocketstate: originalState } as any)
|
|
225
|
+
|
|
226
|
+
const callProps = BaseComponent.mock.calls[0]?.[0] as Record<string, unknown>
|
|
227
|
+
const rocketstate = callProps.$rocketstate as Record<string, unknown>
|
|
228
|
+
// Should have merged pseudo state
|
|
229
|
+
expect(rocketstate.pseudo).toBeDefined()
|
|
230
|
+
// Original state is preserved
|
|
231
|
+
expect(rocketstate.existing).toBe(true)
|
|
232
|
+
})
|
|
233
|
+
|
|
234
|
+
it("returns the result of the wrapped component", () => {
|
|
235
|
+
const expectedResult = {
|
|
236
|
+
type: "div",
|
|
237
|
+
props: { "data-result": "yes" },
|
|
238
|
+
children: ["Result"],
|
|
239
|
+
key: null,
|
|
240
|
+
}
|
|
241
|
+
const MockComponent = vi.fn(() => expectedResult)
|
|
242
|
+
const HOC = createLocalProvider(MockComponent as any)
|
|
243
|
+
|
|
244
|
+
const result = HOC({} as any)
|
|
245
|
+
|
|
246
|
+
expect(result).toBe(expectedResult)
|
|
247
|
+
})
|
|
248
|
+
})
|
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
import {
|
|
2
|
+
getDimensionsMap,
|
|
3
|
+
getDimensionsValues,
|
|
4
|
+
getKeys,
|
|
5
|
+
getMultipleDimensions,
|
|
6
|
+
getTransformDimensions,
|
|
7
|
+
getValues,
|
|
8
|
+
isMultiKey,
|
|
9
|
+
isValidKey,
|
|
10
|
+
} from "../utils/dimensions"
|
|
11
|
+
|
|
12
|
+
describe("isValidKey", () => {
|
|
13
|
+
it("returns true for truthy values", () => {
|
|
14
|
+
expect(isValidKey("a")).toBe(true)
|
|
15
|
+
expect(isValidKey(1)).toBe(true)
|
|
16
|
+
expect(isValidKey(true)).toBe(true)
|
|
17
|
+
expect(isValidKey(0)).toBe(true)
|
|
18
|
+
expect(isValidKey("")).toBe(true)
|
|
19
|
+
})
|
|
20
|
+
|
|
21
|
+
it("returns false for undefined, null, false", () => {
|
|
22
|
+
expect(isValidKey(undefined)).toBe(false)
|
|
23
|
+
expect(isValidKey(null)).toBe(false)
|
|
24
|
+
expect(isValidKey(false)).toBe(false)
|
|
25
|
+
})
|
|
26
|
+
})
|
|
27
|
+
|
|
28
|
+
describe("isMultiKey", () => {
|
|
29
|
+
it("returns [true, propName] for object with propName", () => {
|
|
30
|
+
expect(isMultiKey({ propName: "tags", multi: true })).toEqual([true, "tags"])
|
|
31
|
+
})
|
|
32
|
+
|
|
33
|
+
it("returns [false, value] for string", () => {
|
|
34
|
+
expect(isMultiKey("variant")).toEqual([false, "variant"])
|
|
35
|
+
})
|
|
36
|
+
})
|
|
37
|
+
|
|
38
|
+
describe("getKeys", () => {
|
|
39
|
+
it("returns object keys", () => {
|
|
40
|
+
expect(getKeys({ a: 1, b: 2 })).toEqual(["a", "b"])
|
|
41
|
+
})
|
|
42
|
+
|
|
43
|
+
it("returns empty array for empty object", () => {
|
|
44
|
+
expect(getKeys({})).toEqual([])
|
|
45
|
+
})
|
|
46
|
+
})
|
|
47
|
+
|
|
48
|
+
describe("getValues", () => {
|
|
49
|
+
it("returns object values", () => {
|
|
50
|
+
expect(getValues({ a: 1, b: 2 })).toEqual([1, 2])
|
|
51
|
+
})
|
|
52
|
+
})
|
|
53
|
+
|
|
54
|
+
describe("getDimensionsValues", () => {
|
|
55
|
+
it("extracts string dimension values", () => {
|
|
56
|
+
const dimensions = { size: "size", variant: "variant" }
|
|
57
|
+
expect(getDimensionsValues(dimensions)).toEqual(["size", "variant"])
|
|
58
|
+
})
|
|
59
|
+
|
|
60
|
+
it("extracts propName from object dimensions", () => {
|
|
61
|
+
const dimensions = {
|
|
62
|
+
size: "size",
|
|
63
|
+
tags: { propName: "tags", multi: true },
|
|
64
|
+
}
|
|
65
|
+
expect(getDimensionsValues(dimensions)).toEqual(["size", "tags"])
|
|
66
|
+
})
|
|
67
|
+
})
|
|
68
|
+
|
|
69
|
+
describe("getMultipleDimensions", () => {
|
|
70
|
+
it("identifies multi-key dimensions", () => {
|
|
71
|
+
const dimensions = {
|
|
72
|
+
size: "size",
|
|
73
|
+
tags: { propName: "tags", multi: true },
|
|
74
|
+
}
|
|
75
|
+
expect(getMultipleDimensions(dimensions)).toEqual({ tags: true })
|
|
76
|
+
})
|
|
77
|
+
|
|
78
|
+
it("returns empty for no multi dimensions", () => {
|
|
79
|
+
const dimensions = { size: "size", variant: "variant" }
|
|
80
|
+
expect(getMultipleDimensions(dimensions)).toEqual({})
|
|
81
|
+
})
|
|
82
|
+
|
|
83
|
+
it("skips multi=false", () => {
|
|
84
|
+
const dimensions = {
|
|
85
|
+
tags: { propName: "tags", multi: false },
|
|
86
|
+
}
|
|
87
|
+
expect(getMultipleDimensions(dimensions)).toEqual({})
|
|
88
|
+
})
|
|
89
|
+
})
|
|
90
|
+
|
|
91
|
+
describe("getDimensionsMap", () => {
|
|
92
|
+
it("builds keysMap and keywords from themes", () => {
|
|
93
|
+
const themes = {
|
|
94
|
+
size: { small: { fontSize: 12 }, large: { fontSize: 18 } },
|
|
95
|
+
}
|
|
96
|
+
const result = getDimensionsMap({ themes })
|
|
97
|
+
expect(result.keysMap).toEqual({
|
|
98
|
+
size: { small: true, large: true },
|
|
99
|
+
})
|
|
100
|
+
expect(result.keywords.size).toBe(true)
|
|
101
|
+
})
|
|
102
|
+
|
|
103
|
+
it("adds dimension keys to keywords when useBooleans", () => {
|
|
104
|
+
const themes = {
|
|
105
|
+
size: { small: { fontSize: 12 }, large: { fontSize: 18 } },
|
|
106
|
+
}
|
|
107
|
+
const result = getDimensionsMap({ themes, useBooleans: true })
|
|
108
|
+
expect(result.keywords.small).toBe(true)
|
|
109
|
+
expect(result.keywords.large).toBe(true)
|
|
110
|
+
})
|
|
111
|
+
|
|
112
|
+
it("skips invalid values (false, null, undefined)", () => {
|
|
113
|
+
const themes = {
|
|
114
|
+
size: { small: { fontSize: 12 }, disabled: false, hidden: null },
|
|
115
|
+
}
|
|
116
|
+
const result = getDimensionsMap({ themes })
|
|
117
|
+
expect(result.keysMap.size).toEqual({ small: true })
|
|
118
|
+
})
|
|
119
|
+
|
|
120
|
+
it("returns empty for empty themes", () => {
|
|
121
|
+
const result = getDimensionsMap({ themes: {} })
|
|
122
|
+
expect(result.keysMap).toEqual({})
|
|
123
|
+
expect(result.keywords).toEqual({})
|
|
124
|
+
})
|
|
125
|
+
|
|
126
|
+
it("includes function values (transform modifiers) as valid keys", () => {
|
|
127
|
+
const themes = {
|
|
128
|
+
modifier: {
|
|
129
|
+
outlined: (theme: any) => ({ color: theme.bg }),
|
|
130
|
+
ghost: () => ({ bg: "transparent" }),
|
|
131
|
+
},
|
|
132
|
+
}
|
|
133
|
+
const result = getDimensionsMap({ themes })
|
|
134
|
+
expect(result.keysMap).toEqual({
|
|
135
|
+
modifier: { outlined: true, ghost: true },
|
|
136
|
+
})
|
|
137
|
+
expect(result.keywords.modifier).toBe(true)
|
|
138
|
+
})
|
|
139
|
+
|
|
140
|
+
it("includes function values as boolean keywords when useBooleans", () => {
|
|
141
|
+
const themes = {
|
|
142
|
+
modifier: {
|
|
143
|
+
outlined: (theme: any) => ({ color: theme.bg }),
|
|
144
|
+
},
|
|
145
|
+
}
|
|
146
|
+
const result = getDimensionsMap({ themes, useBooleans: true })
|
|
147
|
+
expect(result.keywords.outlined).toBe(true)
|
|
148
|
+
})
|
|
149
|
+
})
|
|
150
|
+
|
|
151
|
+
describe("getTransformDimensions", () => {
|
|
152
|
+
it("identifies transform dimensions", () => {
|
|
153
|
+
const dimensions = {
|
|
154
|
+
states: "state",
|
|
155
|
+
modifiers: { propName: "modifier", multi: true, transform: true },
|
|
156
|
+
}
|
|
157
|
+
expect(getTransformDimensions(dimensions)).toEqual({ modifier: true })
|
|
158
|
+
})
|
|
159
|
+
|
|
160
|
+
it("returns empty when no transform dimensions exist", () => {
|
|
161
|
+
const dimensions = {
|
|
162
|
+
states: "state",
|
|
163
|
+
sizes: "size",
|
|
164
|
+
multiple: { propName: "multiple", multi: true },
|
|
165
|
+
}
|
|
166
|
+
expect(getTransformDimensions(dimensions)).toEqual({})
|
|
167
|
+
})
|
|
168
|
+
|
|
169
|
+
it("skips dimensions without transform flag", () => {
|
|
170
|
+
const dimensions = {
|
|
171
|
+
states: "state",
|
|
172
|
+
tags: { propName: "tags", multi: true },
|
|
173
|
+
}
|
|
174
|
+
expect(getTransformDimensions(dimensions)).toEqual({})
|
|
175
|
+
})
|
|
176
|
+
|
|
177
|
+
it("skips transform=false", () => {
|
|
178
|
+
const dimensions = {
|
|
179
|
+
modifiers: { propName: "modifier", multi: true, transform: false },
|
|
180
|
+
}
|
|
181
|
+
expect(getTransformDimensions(dimensions)).toEqual({})
|
|
182
|
+
})
|
|
183
|
+
})
|