@codeandmoney/soelma 0.0.0-dev.1 → 0.0.0-dev.10
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/.eslintignore +1 -0
- package/.eslintrc.js +27 -0
- package/.github/workflows/nodejs.yml +33 -0
- package/.size-limit.json +6 -0
- package/babel.config.js +3 -0
- package/biome.jsonc +73 -0
- package/docs/api.md +103 -0
- package/docs/appearance.md +54 -0
- package/docs/dark-mode.md +46 -0
- package/docs/dimensions.md +29 -0
- package/docs/i18n.md +67 -0
- package/docs/logo.png +0 -0
- package/docs/media-query.md +274 -0
- package/docs/orientation.md +44 -0
- package/docs/safe-area.md +62 -0
- package/docs/testting.md +51 -0
- package/docs/ts.md +127 -0
- package/example/AppStyleX/.watchmanconfig +1 -0
- package/example/AppStyleX/android/build.gradle +26 -0
- package/example/AppStyleX/android/gradle/wrapper/gradle-wrapper.jar +0 -0
- package/example/AppStyleX/android/gradle/wrapper/gradle-wrapper.properties +7 -0
- package/example/AppStyleX/android/gradle.properties +53 -0
- package/example/AppStyleX/android/gradlew +249 -0
- package/example/AppStyleX/android/gradlew.bat +92 -0
- package/example/AppStyleX/android/settings.gradle +12 -0
- package/example/AppStyleX/app.json +16 -0
- package/example/AppStyleX/babel.config.js +3 -0
- package/example/AppStyleX/index.js +9 -0
- package/example/AppStyleX/ios/Podfile +7 -0
- package/example/AppStyleX/ios/Podfile.lock +1252 -0
- package/example/AppStyleX/metro.config.js +51 -0
- package/example/AppStyleX/package.json +43 -0
- package/example/AppStyleX/react-native.config.js +23 -0
- package/example/AppStyleX/src/App.tsx +22 -0
- package/example/AppStyleX/src/BottomNav/index.tsx +26 -0
- package/example/AppStyleX/src/BottomNav/styles.ts +42 -0
- package/example/AppStyleX/src/Circle/index.tsx +53 -0
- package/example/AppStyleX/src/Circle/styles.ts +22 -0
- package/example/AppStyleX/src/Root/index.tsx +35 -0
- package/example/AppStyleX/src/Root/styles.ts +18 -0
- package/example/AppStyleX/src/ToggleButton/index.tsx +52 -0
- package/example/AppStyleX/src/ToggleButton/styles.ts +67 -0
- package/example/AppStyleX/src/style-system/hooks/useAnimatedBgColor.ts +5 -0
- package/example/AppStyleX/src/style-system/hooks/useAnimatedTextColor.ts +5 -0
- package/example/AppStyleX/src/style-system/hooks/useIsDark.ts +8 -0
- package/example/AppStyleX/src/style-system/palette.ts +11 -0
- package/example/AppStyleX/src/style-system/theme.ts +14 -0
- package/example/AppStyleX/src/style-system/utils.ts +8 -0
- package/example/AppStyleX/src/stylex.d.ts +6 -0
- package/example/AppStyleX/tsconfig.json +3 -0
- package/example/AppStyleX/yarn.lock +6767 -0
- package/jest.config.js +19 -0
- package/package.json +38 -3
- package/src/appearance/index.ts +30 -0
- package/src/appearance/init.ts +12 -0
- package/{context.js → src/context.ts} +4 -1
- package/src/create-event-emitter.ts +26 -0
- package/src/dark-mode/index.ts +26 -0
- package/src/dark-mode/init.ts +19 -0
- package/{dark-mode/state.js → src/dark-mode/state.ts} +2 -1
- package/src/default-theme.ts +4 -0
- package/src/dependency-registry.ts +21 -0
- package/src/dependency-usage.ts +21 -0
- package/src/dimensions/index.ts +20 -0
- package/src/dimensions/init.ts +32 -0
- package/src/dimensions/utils.ts +9 -0
- package/src/i18n.ts +15 -0
- package/src/index.ts +7 -0
- package/{makeUseStyles/createUseStylesTheme.js → src/make-use-styles/create-use-styles-theme.js} +23 -6
- package/src/make-use-styles/create-use-styles-theme.test.js +137 -0
- package/{makeUseStyles/createUseStylesWithoutTheme.js → src/make-use-styles/create-use-styles-without-theme.js} +20 -4
- package/src/make-use-styles/create-use-styles-without-theme.test.js +63 -0
- package/src/make-use-styles/index.d.ts +20 -0
- package/src/make-use-styles/index.js +12 -0
- package/src/make-use-styles/index.test.js +28 -0
- package/src/make-use-styles/types.ts +43 -0
- package/{makeUseStyles → src/make-use-styles}/utils.js +5 -10
- package/src/media-query/base.ts +32 -0
- package/src/media-query/breakpoints.ts +96 -0
- package/src/media-query/index.ts +12 -0
- package/src/orientation.ts +13 -0
- package/{safe-area/eventEmitter.js → src/safe-area/event-emitter.ts} +2 -1
- package/src/safe-area/index.tsx +16 -0
- package/src/safe-area/init.tsx +6 -0
- package/src/safe-area/safe-area-provider.tsx +18 -0
- package/{safe-area/state.js → src/safe-area/state.ts} +7 -5
- package/src/safe-area/stylex-save-area-consumer.ts +22 -0
- package/{safe-area/types.d.ts → src/safe-area/types.ts} +7 -6
- package/src/tests/createBreakpoints.test.ts +152 -0
- package/src/tests/createBreakpointsMatcher.test.ts +188 -0
- package/src/tests/createBreakpointsMatcher.types-test.ts +81 -0
- package/src/tests/createEventEmitter.test.ts +37 -0
- package/src/tests/dark-mode.test.ts +56 -0
- package/src/tests/dependencyRegistry.test.ts +16 -0
- package/src/tests/dependencyUsage.test.ts +13 -0
- package/src/tests/dimensions.test.ts +33 -0
- package/src/tests/makeUseStyles.types-test.ts +69 -0
- package/src/tests/media-query.test.ts +196 -0
- package/src/tests/orientation.test.ts +61 -0
- package/src/tests/useTheme.test.ts +26 -0
- package/src/tests/withStyles.types-test.tsx +172 -0
- package/src/use-color-transition.ts +50 -0
- package/src/use-theme.ts +14 -0
- package/src/with-styles.tsx +22 -0
- package/tsconfig.build.json +31 -0
- package/tsconfig.json +30 -0
- package/DefaultTheme.d.ts +0 -2
- package/DefaultTheme.js +0 -1
- package/appearance/consts.d.ts +0 -1
- package/appearance/index.d.ts +0 -8
- package/appearance/index.js +0 -18
- package/appearance/init.d.ts +0 -1
- package/appearance/init.js +0 -7
- package/context.d.ts +0 -4
- package/createEventEmitter.d.ts +0 -8
- package/createEventEmitter.js +0 -11
- package/dark-mode/consts.d.ts +0 -1
- package/dark-mode/index.d.ts +0 -7
- package/dark-mode/index.js +0 -16
- package/dark-mode/init.d.ts +0 -1
- package/dark-mode/init.js +0 -13
- package/dark-mode/state.d.ts +0 -3
- package/dependencyRegistry.d.ts +0 -5
- package/dependencyRegistry.js +0 -12
- package/dependencyUsage.d.ts +0 -7
- package/dependencyUsage.js +0 -10
- package/dimensions/consts.d.ts +0 -2
- package/dimensions/index.d.ts +0 -4
- package/dimensions/index.js +0 -13
- package/dimensions/init.d.ts +0 -1
- package/dimensions/init.js +0 -21
- package/dimensions/utils.d.ts +0 -1
- package/dimensions/utils.js +0 -7
- package/i18n.d.ts +0 -7
- package/i18n.js +0 -9
- package/index.d.ts +0 -7
- package/index.js +0 -5
- package/makeUseStyles/index.d.ts +0 -7
- package/makeUseStyles/index.js +0 -12
- package/media-query/base.d.ts +0 -12
- package/media-query/base.js +0 -18
- package/media-query/breakpoints.d.ts +0 -18
- package/media-query/breakpoints.js +0 -60
- package/media-query/index.d.ts +0 -2
- package/media-query/index.js +0 -2
- package/orientation.d.ts +0 -7
- package/orientation.js +0 -7
- package/safe-area/SafeAreaProvider.d.ts +0 -3
- package/safe-area/SafeAreaProvider.js +0 -9
- package/safe-area/StylexSaveAreaConsumer.d.ts +0 -2
- package/safe-area/StylexSaveAreaConsumer.js +0 -15
- package/safe-area/consts.d.ts +0 -1
- package/safe-area/eventEmitter.d.ts +0 -1
- package/safe-area/index.d.ts +0 -5
- package/safe-area/index.js +0 -10
- package/safe-area/init.d.ts +0 -1
- package/safe-area/init.js +0 -4
- package/safe-area/state.d.ts +0 -8
- package/safe-area/types.js +0 -1
- package/useColorTransition.d.ts +0 -5
- package/useColorTransition.js +0 -38
- package/useTheme.d.ts +0 -2
- package/useTheme.js +0 -9
- package/withStyles.d.ts +0 -7
- package/withStyles.js +0 -13
- /package/{appearance/consts.js → src/appearance/consts.ts} +0 -0
- /package/{dark-mode/consts.js → src/dark-mode/consts.ts} +0 -0
- /package/{dimensions/consts.js → src/dimensions/consts.ts} +0 -0
- /package/{makeUseStyles → src/make-use-styles}/test-type.js +0 -0
- /package/{safe-area/consts.js → src/safe-area/consts.ts} +0 -0
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
import { createBreakpointsMatcher, maxWidth, minWidth } from "../media-query";
|
|
2
|
+
import { getWindowDimensions } from "../dimensions";
|
|
3
|
+
|
|
4
|
+
jest.mock("../dimensions", () => ({
|
|
5
|
+
getWindowDimensions: jest.fn(),
|
|
6
|
+
}));
|
|
7
|
+
|
|
8
|
+
const mockWindowWidth = (width: number) => {
|
|
9
|
+
const mockGetWindowDimensions = getWindowDimensions as jest.Mock;
|
|
10
|
+
mockGetWindowDimensions.mockReturnValue({ width });
|
|
11
|
+
};
|
|
12
|
+
|
|
13
|
+
/*
|
|
14
|
+
* To debug use analog on CSS: https://codepen.io/retyui/pen/dyOzKzV
|
|
15
|
+
*/
|
|
16
|
+
describe("createBreakpointsMatcher", () => {
|
|
17
|
+
const config = {
|
|
18
|
+
xxs: 100,
|
|
19
|
+
xs: 200,
|
|
20
|
+
s: 300,
|
|
21
|
+
m: 400,
|
|
22
|
+
l: 500,
|
|
23
|
+
};
|
|
24
|
+
const breakpointsMaxWidth = createBreakpointsMatcher(config, maxWidth);
|
|
25
|
+
const breakpointsMinWidth = createBreakpointsMatcher(config);
|
|
26
|
+
|
|
27
|
+
const values = {
|
|
28
|
+
xxs: "xxs: 100",
|
|
29
|
+
xs: "xs: 200",
|
|
30
|
+
s: "s: 300",
|
|
31
|
+
m: "m: 400",
|
|
32
|
+
l: "l: 500",
|
|
33
|
+
default: "default",
|
|
34
|
+
};
|
|
35
|
+
|
|
36
|
+
it("should return boundary values", () => {
|
|
37
|
+
mockWindowWidth(600);
|
|
38
|
+
|
|
39
|
+
expect({
|
|
40
|
+
maxWidth: breakpointsMaxWidth(values),
|
|
41
|
+
minWidth: breakpointsMinWidth(values),
|
|
42
|
+
}).toEqual({
|
|
43
|
+
maxWidth: "default",
|
|
44
|
+
minWidth: "l: 500",
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
mockWindowWidth(50);
|
|
48
|
+
|
|
49
|
+
expect({
|
|
50
|
+
maxWidth: breakpointsMaxWidth(values),
|
|
51
|
+
minWidth: breakpointsMinWidth(values),
|
|
52
|
+
}).toEqual({
|
|
53
|
+
maxWidth: "xxs: 100",
|
|
54
|
+
minWidth: "default",
|
|
55
|
+
});
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
it("should work properly", () => {
|
|
59
|
+
mockWindowWidth(450);
|
|
60
|
+
|
|
61
|
+
expect({
|
|
62
|
+
maxWidth: breakpointsMaxWidth(values),
|
|
63
|
+
minWidth: breakpointsMinWidth(values),
|
|
64
|
+
}).toEqual({
|
|
65
|
+
maxWidth: "l: 500",
|
|
66
|
+
minWidth: "m: 400",
|
|
67
|
+
});
|
|
68
|
+
|
|
69
|
+
mockWindowWidth(401);
|
|
70
|
+
|
|
71
|
+
expect({
|
|
72
|
+
maxWidth: breakpointsMaxWidth(values),
|
|
73
|
+
minWidth: breakpointsMinWidth(values),
|
|
74
|
+
}).toEqual({
|
|
75
|
+
maxWidth: "l: 500",
|
|
76
|
+
minWidth: "m: 400",
|
|
77
|
+
});
|
|
78
|
+
|
|
79
|
+
mockWindowWidth(400);
|
|
80
|
+
|
|
81
|
+
expect({
|
|
82
|
+
maxWidth: breakpointsMaxWidth(values),
|
|
83
|
+
minWidth: breakpointsMinWidth(values),
|
|
84
|
+
}).toEqual({
|
|
85
|
+
maxWidth: "m: 400",
|
|
86
|
+
minWidth: "m: 400",
|
|
87
|
+
});
|
|
88
|
+
|
|
89
|
+
mockWindowWidth(399);
|
|
90
|
+
|
|
91
|
+
expect({
|
|
92
|
+
maxWidth: breakpointsMaxWidth(values),
|
|
93
|
+
minWidth: breakpointsMinWidth(values),
|
|
94
|
+
}).toEqual({
|
|
95
|
+
maxWidth: "m: 400",
|
|
96
|
+
minWidth: "s: 300",
|
|
97
|
+
});
|
|
98
|
+
});
|
|
99
|
+
|
|
100
|
+
it("should return null when no default and it pass boundary values", () => {
|
|
101
|
+
const { default: _, ...valuesWithoutDefault } = values;
|
|
102
|
+
mockWindowWidth(600);
|
|
103
|
+
|
|
104
|
+
expect({
|
|
105
|
+
maxWidth: breakpointsMaxWidth(valuesWithoutDefault),
|
|
106
|
+
minWidth: breakpointsMinWidth(valuesWithoutDefault),
|
|
107
|
+
}).toEqual({
|
|
108
|
+
maxWidth: null,
|
|
109
|
+
minWidth: "l: 500",
|
|
110
|
+
});
|
|
111
|
+
|
|
112
|
+
mockWindowWidth(50);
|
|
113
|
+
|
|
114
|
+
expect({
|
|
115
|
+
maxWidth: breakpointsMaxWidth(valuesWithoutDefault),
|
|
116
|
+
minWidth: breakpointsMinWidth(valuesWithoutDefault),
|
|
117
|
+
}).toEqual({
|
|
118
|
+
maxWidth: "xxs: 100",
|
|
119
|
+
minWidth: null,
|
|
120
|
+
});
|
|
121
|
+
});
|
|
122
|
+
});
|
|
123
|
+
|
|
124
|
+
describe("docs examples", () => {
|
|
125
|
+
const config = {
|
|
126
|
+
xxs: 320,
|
|
127
|
+
xs: 480,
|
|
128
|
+
s: 640,
|
|
129
|
+
m: 768,
|
|
130
|
+
l: 1024,
|
|
131
|
+
xl: 1200,
|
|
132
|
+
xxl: 1920,
|
|
133
|
+
};
|
|
134
|
+
describe("maxWidth", () => {
|
|
135
|
+
const applyBreakpoints = createBreakpointsMatcher(config, maxWidth);
|
|
136
|
+
|
|
137
|
+
it("should work properly", () => {
|
|
138
|
+
const values = { xxs: 20, xs: 18, default: 16 };
|
|
139
|
+
|
|
140
|
+
mockWindowWidth(0);
|
|
141
|
+
expect(applyBreakpoints(values)).toBe(20);
|
|
142
|
+
|
|
143
|
+
mockWindowWidth(320);
|
|
144
|
+
expect(applyBreakpoints(values)).toBe(20);
|
|
145
|
+
|
|
146
|
+
mockWindowWidth(321);
|
|
147
|
+
expect(applyBreakpoints(values)).toBe(18);
|
|
148
|
+
|
|
149
|
+
mockWindowWidth(480);
|
|
150
|
+
expect(applyBreakpoints(values)).toBe(18);
|
|
151
|
+
|
|
152
|
+
mockWindowWidth(481);
|
|
153
|
+
expect(applyBreakpoints(values)).toBe(16);
|
|
154
|
+
|
|
155
|
+
mockWindowWidth(999);
|
|
156
|
+
expect(applyBreakpoints(values)).toBe(16);
|
|
157
|
+
});
|
|
158
|
+
});
|
|
159
|
+
|
|
160
|
+
describe("minWidth", () => {
|
|
161
|
+
const applyBreakpoints = createBreakpointsMatcher(config, minWidth);
|
|
162
|
+
|
|
163
|
+
it("should work properly", () => {
|
|
164
|
+
const values = { xxs: 18, xs: 16, default: 20 };
|
|
165
|
+
|
|
166
|
+
mockWindowWidth(0);
|
|
167
|
+
expect(applyBreakpoints(values)).toBe(20);
|
|
168
|
+
|
|
169
|
+
mockWindowWidth(319);
|
|
170
|
+
expect(applyBreakpoints(values)).toBe(20);
|
|
171
|
+
|
|
172
|
+
mockWindowWidth(320);
|
|
173
|
+
expect(applyBreakpoints(values)).toBe(18);
|
|
174
|
+
|
|
175
|
+
mockWindowWidth(479);
|
|
176
|
+
expect(applyBreakpoints(values)).toBe(18);
|
|
177
|
+
|
|
178
|
+
mockWindowWidth(480);
|
|
179
|
+
expect(applyBreakpoints(values)).toBe(16);
|
|
180
|
+
|
|
181
|
+
mockWindowWidth(481);
|
|
182
|
+
expect(applyBreakpoints(values)).toBe(16);
|
|
183
|
+
|
|
184
|
+
mockWindowWidth(999);
|
|
185
|
+
expect(applyBreakpoints(values)).toBe(16);
|
|
186
|
+
});
|
|
187
|
+
});
|
|
188
|
+
});
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import { makeUseStyles } from "../index";
|
|
2
|
+
import { createBreakpointsMatcher } from "../media-query";
|
|
3
|
+
|
|
4
|
+
{
|
|
5
|
+
const breakpoints = createBreakpointsMatcher({
|
|
6
|
+
s: 100,
|
|
7
|
+
m: 200,
|
|
8
|
+
l: 300,
|
|
9
|
+
});
|
|
10
|
+
|
|
11
|
+
makeUseStyles(() => ({
|
|
12
|
+
root: {
|
|
13
|
+
position: breakpoints({
|
|
14
|
+
l: "absolute",
|
|
15
|
+
default: "relative",
|
|
16
|
+
}),
|
|
17
|
+
|
|
18
|
+
// @ts-expect-error - 'invalid value' is wrong value
|
|
19
|
+
alignItems: breakpoints({
|
|
20
|
+
l: "invalid value",
|
|
21
|
+
}),
|
|
22
|
+
},
|
|
23
|
+
}));
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
{
|
|
27
|
+
const breakpoints = createBreakpointsMatcher({
|
|
28
|
+
s: 100,
|
|
29
|
+
m: 200,
|
|
30
|
+
l: 300,
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
const a1: string | undefined = breakpoints({ s: "1" });
|
|
34
|
+
const a2: string | undefined = breakpoints({ s: "1", m: "2" });
|
|
35
|
+
const a3: string | undefined = breakpoints({ s: "1", m: "2", l: "3" });
|
|
36
|
+
const a4: string = breakpoints({
|
|
37
|
+
s: "1",
|
|
38
|
+
m: "2",
|
|
39
|
+
l: "3",
|
|
40
|
+
default: "0",
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
{
|
|
45
|
+
const breakpoints = createBreakpointsMatcher({
|
|
46
|
+
s: 100,
|
|
47
|
+
m: 200,
|
|
48
|
+
l: 300,
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
// @ts-expect-error - 'number' is not 'string'
|
|
52
|
+
const a1: string | undefined = breakpoints({ s: 1 });
|
|
53
|
+
const a2 = breakpoints({
|
|
54
|
+
s: 1,
|
|
55
|
+
// @ts-expect-error - 'string' is not 'number'
|
|
56
|
+
m: "2",
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
{
|
|
61
|
+
const breakpoints = createBreakpointsMatcher({
|
|
62
|
+
s: 100,
|
|
63
|
+
m: 200,
|
|
64
|
+
l: 300,
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
// @ts-expect-error - can be 'undefined'
|
|
68
|
+
const a1: string = breakpoints({ s: "1" });
|
|
69
|
+
// @ts-expect-error - can be 'undefined'
|
|
70
|
+
const a2: string = breakpoints({ s: "1", m: "2" });
|
|
71
|
+
// @ts-expect-error - can be 'undefined'
|
|
72
|
+
const a3: string = breakpoints({ s: "1", m: "2", l: "3" });
|
|
73
|
+
|
|
74
|
+
// @ts-expect-error - 'undefined' is not 'string'
|
|
75
|
+
const a4: undefined = breakpoints({
|
|
76
|
+
s: "1",
|
|
77
|
+
m: "2",
|
|
78
|
+
l: "3",
|
|
79
|
+
default: "0",
|
|
80
|
+
});
|
|
81
|
+
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { createEventEmitter } from "../create-event-emitter";
|
|
2
|
+
|
|
3
|
+
it("should call handler when invoke emit", () => {
|
|
4
|
+
const a = createEventEmitter("event");
|
|
5
|
+
const handler = jest.fn();
|
|
6
|
+
|
|
7
|
+
const unsub = a.on(handler);
|
|
8
|
+
|
|
9
|
+
expect(handler).toHaveBeenCalledTimes(0);
|
|
10
|
+
|
|
11
|
+
a.emit();
|
|
12
|
+
|
|
13
|
+
expect(handler).toHaveBeenCalledTimes(1);
|
|
14
|
+
});
|
|
15
|
+
|
|
16
|
+
it("should not call handler when unsubscribe", () => {
|
|
17
|
+
const a = createEventEmitter("event");
|
|
18
|
+
const handler = jest.fn();
|
|
19
|
+
|
|
20
|
+
const unsub = a.on(handler);
|
|
21
|
+
|
|
22
|
+
a.emit();
|
|
23
|
+
|
|
24
|
+
expect(handler).toHaveBeenCalledTimes(1);
|
|
25
|
+
|
|
26
|
+
unsub();
|
|
27
|
+
|
|
28
|
+
a.emit();
|
|
29
|
+
|
|
30
|
+
expect(handler).toHaveBeenCalledTimes(1);
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
it("should throw error when no subscribed functions", () => {
|
|
34
|
+
const a = createEventEmitter("test");
|
|
35
|
+
|
|
36
|
+
a.emit();
|
|
37
|
+
});
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import type { Mode } from "react-native-dark-mode";
|
|
2
|
+
|
|
3
|
+
import { darkUiMode, lightUiMode } from "../dark-mode";
|
|
4
|
+
import { state } from "../dark-mode/state";
|
|
5
|
+
|
|
6
|
+
jest.mock("react-native-dark-mode", () => ({
|
|
7
|
+
initialMode: "light",
|
|
8
|
+
eventEmitter: { on: jest.fn() },
|
|
9
|
+
}));
|
|
10
|
+
|
|
11
|
+
const mockStyles = { color: "red" };
|
|
12
|
+
|
|
13
|
+
const mutateUiMode = (mode: Mode | null) => {
|
|
14
|
+
// @ts-expect-error: for test only add null
|
|
15
|
+
state.mode = mode;
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
describe("darkUiMode", () => {
|
|
19
|
+
it("should return style when dark mode", () => {
|
|
20
|
+
mutateUiMode("dark");
|
|
21
|
+
|
|
22
|
+
expect(darkUiMode(mockStyles)).toEqual(mockStyles);
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
it("should return 'undefined' when light mode", () => {
|
|
26
|
+
mutateUiMode("light");
|
|
27
|
+
|
|
28
|
+
expect(darkUiMode(mockStyles)).toBeUndefined();
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
it("should return 'undefined' when unknown mode", () => {
|
|
32
|
+
mutateUiMode(null);
|
|
33
|
+
|
|
34
|
+
expect(darkUiMode(mockStyles)).toBeUndefined();
|
|
35
|
+
});
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
describe("lightUiMode", () => {
|
|
39
|
+
it("should return style when light mode", () => {
|
|
40
|
+
mutateUiMode("light");
|
|
41
|
+
|
|
42
|
+
expect(lightUiMode(mockStyles)).toEqual(mockStyles);
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
it("should return 'undefined' when dark mode", () => {
|
|
46
|
+
mutateUiMode("dark");
|
|
47
|
+
|
|
48
|
+
expect(lightUiMode(mockStyles)).toBeUndefined();
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
it("should return 'undefined' when unknown mode", () => {
|
|
52
|
+
mutateUiMode(null);
|
|
53
|
+
|
|
54
|
+
expect(lightUiMode(mockStyles)).toBeUndefined();
|
|
55
|
+
});
|
|
56
|
+
});
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { addDependency, getDependency } from "../dependency-registry";
|
|
2
|
+
|
|
3
|
+
it("should overwrite handler", () => {
|
|
4
|
+
const name = "dark-mode";
|
|
5
|
+
const handler = () => () => {};
|
|
6
|
+
|
|
7
|
+
addDependency(name, handler);
|
|
8
|
+
|
|
9
|
+
expect(getDependency(name)).toBe(handler);
|
|
10
|
+
|
|
11
|
+
const newHandler = () => () => {};
|
|
12
|
+
|
|
13
|
+
addDependency(name, newHandler);
|
|
14
|
+
|
|
15
|
+
expect(getDependency(name)).not.toBe(newHandler);
|
|
16
|
+
});
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { onUse, resetUsing, getUsing } from "../dependency-usage";
|
|
2
|
+
|
|
3
|
+
it("should clear usage map", () => {
|
|
4
|
+
onUse("a");
|
|
5
|
+
onUse("a");
|
|
6
|
+
onUse("b");
|
|
7
|
+
|
|
8
|
+
expect(getUsing()).toEqual({ a: true, b: true });
|
|
9
|
+
|
|
10
|
+
resetUsing();
|
|
11
|
+
|
|
12
|
+
expect(getUsing()).toEqual({});
|
|
13
|
+
});
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { WINDOW_DEPENDENCY_KEY, SCREEN_DEPENDENCY_KEY } from "../dimensions/consts";
|
|
2
|
+
import { optimizeDependencies } from "../dimensions/utils";
|
|
3
|
+
|
|
4
|
+
describe("optimizeDependencies", () => {
|
|
5
|
+
it("should remove screen dependency when window dependency exist", () => {
|
|
6
|
+
expect(
|
|
7
|
+
optimizeDependencies({
|
|
8
|
+
[WINDOW_DEPENDENCY_KEY]: true,
|
|
9
|
+
[SCREEN_DEPENDENCY_KEY]: true,
|
|
10
|
+
}),
|
|
11
|
+
).toEqual({
|
|
12
|
+
[WINDOW_DEPENDENCY_KEY]: true,
|
|
13
|
+
});
|
|
14
|
+
});
|
|
15
|
+
|
|
16
|
+
it("should skip removing", () => {
|
|
17
|
+
expect(
|
|
18
|
+
optimizeDependencies({
|
|
19
|
+
[WINDOW_DEPENDENCY_KEY]: true,
|
|
20
|
+
}),
|
|
21
|
+
).toEqual({
|
|
22
|
+
[WINDOW_DEPENDENCY_KEY]: true,
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
expect(
|
|
26
|
+
optimizeDependencies({
|
|
27
|
+
[SCREEN_DEPENDENCY_KEY]: true,
|
|
28
|
+
}),
|
|
29
|
+
).toEqual({
|
|
30
|
+
[SCREEN_DEPENDENCY_KEY]: true,
|
|
31
|
+
});
|
|
32
|
+
});
|
|
33
|
+
});
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { makeUseStyles } from "../make-use-styles";
|
|
2
|
+
|
|
3
|
+
{
|
|
4
|
+
const useStyles = makeUseStyles(() => ({
|
|
5
|
+
root: {
|
|
6
|
+
textAlign: "center",
|
|
7
|
+
},
|
|
8
|
+
}));
|
|
9
|
+
|
|
10
|
+
const a: "center" = useStyles().root.textAlign;
|
|
11
|
+
|
|
12
|
+
// @ts-expect-error: expect literal type
|
|
13
|
+
const b: "not center" = useStyles().root.textAlign;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
{
|
|
17
|
+
interface Theme {
|
|
18
|
+
color: string;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
const useStyles = makeUseStyles(({ color }: Theme) => ({
|
|
22
|
+
root: {
|
|
23
|
+
color,
|
|
24
|
+
textAlign: "center",
|
|
25
|
+
},
|
|
26
|
+
}));
|
|
27
|
+
|
|
28
|
+
const a: "center" = useStyles().root.textAlign;
|
|
29
|
+
|
|
30
|
+
// @ts-expect-error: expect literal type
|
|
31
|
+
const b: "not center" = useStyles().root.textAlign;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
{
|
|
35
|
+
const useStyles = makeUseStyles(() => ({
|
|
36
|
+
root: {
|
|
37
|
+
// @ts-expect-error: invalid color value
|
|
38
|
+
color: [],
|
|
39
|
+
},
|
|
40
|
+
}));
|
|
41
|
+
|
|
42
|
+
const {
|
|
43
|
+
root,
|
|
44
|
+
// @ts-expect-error: 'otherProps' not exist
|
|
45
|
+
otherProp,
|
|
46
|
+
} = useStyles();
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
{
|
|
50
|
+
interface MyTheme {
|
|
51
|
+
color: {
|
|
52
|
+
red: string;
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
const useStyles = makeUseStyles((theme: MyTheme) => ({
|
|
57
|
+
root: {
|
|
58
|
+
color: theme.color.red,
|
|
59
|
+
// @ts-expect-error: 'blue' not exist in passed theme
|
|
60
|
+
borderColor: theme.color.blue,
|
|
61
|
+
},
|
|
62
|
+
}));
|
|
63
|
+
|
|
64
|
+
const {
|
|
65
|
+
root,
|
|
66
|
+
// @ts-expect-error: 'otherProps' not exist
|
|
67
|
+
otherProp,
|
|
68
|
+
} = useStyles();
|
|
69
|
+
}
|
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
import { Dimensions } from "react-native";
|
|
2
|
+
import { maxHeight, maxWidth, minHeight, minWidth, aspectRatio, minAspectRatio, maxAspectRatio } from "../media-query";
|
|
3
|
+
|
|
4
|
+
const mockStyle = { color: "black" };
|
|
5
|
+
|
|
6
|
+
const mockGetDimensions = (dimensions: any) => {
|
|
7
|
+
Dimensions.get = () => dimensions;
|
|
8
|
+
};
|
|
9
|
+
|
|
10
|
+
describe("max*", () => {
|
|
11
|
+
describe("maxHeight", () => {
|
|
12
|
+
it("should return style when device height less than passed", () => {
|
|
13
|
+
const dimensions = { height: 319 };
|
|
14
|
+
|
|
15
|
+
mockGetDimensions(dimensions);
|
|
16
|
+
|
|
17
|
+
expect(maxHeight(320, mockStyle)).toEqual(mockStyle);
|
|
18
|
+
});
|
|
19
|
+
|
|
20
|
+
it("should return null when device height more than passed value", () => {
|
|
21
|
+
const dimensions = { height: 321 };
|
|
22
|
+
|
|
23
|
+
mockGetDimensions(dimensions);
|
|
24
|
+
|
|
25
|
+
expect(maxHeight(320, mockStyle)).toEqual(null);
|
|
26
|
+
});
|
|
27
|
+
|
|
28
|
+
it("should return null when device height equal a passed value", () => {
|
|
29
|
+
const dimensions = { height: 321 };
|
|
30
|
+
|
|
31
|
+
mockGetDimensions(dimensions);
|
|
32
|
+
|
|
33
|
+
expect(maxHeight(320, mockStyle)).toEqual(null);
|
|
34
|
+
});
|
|
35
|
+
});
|
|
36
|
+
|
|
37
|
+
describe("maxWidth", () => {
|
|
38
|
+
it("should return style when device width less than passed", () => {
|
|
39
|
+
const dimensions = { width: 319 };
|
|
40
|
+
|
|
41
|
+
mockGetDimensions(dimensions);
|
|
42
|
+
|
|
43
|
+
expect(maxWidth(320, mockStyle)).toEqual(mockStyle);
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
it("should return null when device width more than passed value", () => {
|
|
47
|
+
const dimensions = { width: 321 };
|
|
48
|
+
|
|
49
|
+
mockGetDimensions(dimensions);
|
|
50
|
+
|
|
51
|
+
expect(maxWidth(320, mockStyle)).toEqual(null);
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
it("should return null when device width equal a passed value", () => {
|
|
55
|
+
const dimensions = { width: 321 };
|
|
56
|
+
|
|
57
|
+
mockGetDimensions(dimensions);
|
|
58
|
+
|
|
59
|
+
expect(maxWidth(320, mockStyle)).toEqual(null);
|
|
60
|
+
});
|
|
61
|
+
});
|
|
62
|
+
});
|
|
63
|
+
|
|
64
|
+
describe("min*", () => {
|
|
65
|
+
describe("minHeight", () => {
|
|
66
|
+
it("should return null when device height less than passed", () => {
|
|
67
|
+
const dimensions = { height: 319 };
|
|
68
|
+
|
|
69
|
+
mockGetDimensions(dimensions);
|
|
70
|
+
|
|
71
|
+
expect(minHeight(320, mockStyle)).toEqual(null);
|
|
72
|
+
});
|
|
73
|
+
|
|
74
|
+
it("should return style when device height more than passed value", () => {
|
|
75
|
+
const dimensions = { height: 321 };
|
|
76
|
+
|
|
77
|
+
mockGetDimensions(dimensions);
|
|
78
|
+
|
|
79
|
+
expect(minHeight(320, mockStyle)).toEqual(mockStyle);
|
|
80
|
+
});
|
|
81
|
+
|
|
82
|
+
it("should return null when device height equal a passed value", () => {
|
|
83
|
+
const dimensions = { height: 319 };
|
|
84
|
+
|
|
85
|
+
mockGetDimensions(dimensions);
|
|
86
|
+
|
|
87
|
+
expect(minHeight(320, mockStyle)).toEqual(null);
|
|
88
|
+
});
|
|
89
|
+
});
|
|
90
|
+
|
|
91
|
+
describe("minWidth", () => {
|
|
92
|
+
it("should return null when device width less than passed", () => {
|
|
93
|
+
const dimensions = { width: 319 };
|
|
94
|
+
|
|
95
|
+
mockGetDimensions(dimensions);
|
|
96
|
+
|
|
97
|
+
expect(minWidth(320, mockStyle)).toEqual(null);
|
|
98
|
+
});
|
|
99
|
+
|
|
100
|
+
it("should return style when device width more than passed value", () => {
|
|
101
|
+
const dimensions = { width: 321 };
|
|
102
|
+
|
|
103
|
+
mockGetDimensions(dimensions);
|
|
104
|
+
|
|
105
|
+
expect(minWidth(320, mockStyle)).toEqual(mockStyle);
|
|
106
|
+
});
|
|
107
|
+
|
|
108
|
+
it("should return null when device width equal a passed value", () => {
|
|
109
|
+
const dimensions = { width: 319 };
|
|
110
|
+
|
|
111
|
+
mockGetDimensions(dimensions);
|
|
112
|
+
|
|
113
|
+
expect(minWidth(320, mockStyle)).toEqual(null);
|
|
114
|
+
});
|
|
115
|
+
});
|
|
116
|
+
});
|
|
117
|
+
|
|
118
|
+
describe("aspectRatio", () => {
|
|
119
|
+
describe("equal", () => {
|
|
120
|
+
it("should return null when device ratio less then passed", () => {
|
|
121
|
+
const dimensions = { width: 100, height: 201 };
|
|
122
|
+
|
|
123
|
+
mockGetDimensions(dimensions);
|
|
124
|
+
|
|
125
|
+
expect(aspectRatio(1 / 2, mockStyle)).toEqual(null);
|
|
126
|
+
});
|
|
127
|
+
|
|
128
|
+
it("should return style when ratio equal", () => {
|
|
129
|
+
const dimensions = { width: 100, height: 200 };
|
|
130
|
+
|
|
131
|
+
mockGetDimensions(dimensions);
|
|
132
|
+
|
|
133
|
+
expect(aspectRatio(1 / 2, mockStyle)).toEqual(mockStyle);
|
|
134
|
+
});
|
|
135
|
+
|
|
136
|
+
it("should return null when device ratio greater than passed", () => {
|
|
137
|
+
const dimensions = { width: 100, height: 199 };
|
|
138
|
+
|
|
139
|
+
mockGetDimensions(dimensions);
|
|
140
|
+
|
|
141
|
+
expect(aspectRatio(1 / 2, mockStyle)).toEqual(null);
|
|
142
|
+
});
|
|
143
|
+
});
|
|
144
|
+
|
|
145
|
+
describe("min", () => {
|
|
146
|
+
it("should return null when device ratio less then passed", () => {
|
|
147
|
+
const dimensions = { width: 100, height: 201 };
|
|
148
|
+
|
|
149
|
+
mockGetDimensions(dimensions);
|
|
150
|
+
|
|
151
|
+
expect(minAspectRatio(1 / 2, mockStyle)).toEqual(null);
|
|
152
|
+
});
|
|
153
|
+
|
|
154
|
+
it("should return style when ratio equal passed", () => {
|
|
155
|
+
const dimensions = { width: 100, height: 200 };
|
|
156
|
+
|
|
157
|
+
mockGetDimensions(dimensions);
|
|
158
|
+
|
|
159
|
+
expect(minAspectRatio(1 / 2, mockStyle)).toEqual(mockStyle);
|
|
160
|
+
});
|
|
161
|
+
|
|
162
|
+
it("should return style when ratio greater than passed", () => {
|
|
163
|
+
const dimensions = { width: 100, height: 199 };
|
|
164
|
+
|
|
165
|
+
mockGetDimensions(dimensions);
|
|
166
|
+
|
|
167
|
+
expect(minAspectRatio(1 / 2, mockStyle)).toEqual(mockStyle);
|
|
168
|
+
});
|
|
169
|
+
});
|
|
170
|
+
|
|
171
|
+
describe("max", () => {
|
|
172
|
+
it("should return style when device ratio less then passed", () => {
|
|
173
|
+
const dimensions = { width: 100, height: 201 };
|
|
174
|
+
|
|
175
|
+
mockGetDimensions(dimensions);
|
|
176
|
+
|
|
177
|
+
expect(maxAspectRatio(1 / 2, mockStyle)).toEqual(mockStyle);
|
|
178
|
+
});
|
|
179
|
+
|
|
180
|
+
it("should return style when ratio equal passed", () => {
|
|
181
|
+
const dimensions = { width: 100, height: 200 };
|
|
182
|
+
|
|
183
|
+
mockGetDimensions(dimensions);
|
|
184
|
+
|
|
185
|
+
expect(maxAspectRatio(1 / 2, mockStyle)).toEqual(mockStyle);
|
|
186
|
+
});
|
|
187
|
+
|
|
188
|
+
it("should return null when ratio greater than passed", () => {
|
|
189
|
+
const dimensions = { width: 100, height: 199 };
|
|
190
|
+
|
|
191
|
+
mockGetDimensions(dimensions);
|
|
192
|
+
|
|
193
|
+
expect(maxAspectRatio(1 / 2, mockStyle)).toEqual(null);
|
|
194
|
+
});
|
|
195
|
+
});
|
|
196
|
+
});
|