Skip to content

Commit 1a3f8ce

Browse files
committed
Add coverage
1 parent f51e4b6 commit 1a3f8ce

File tree

9 files changed

+99
-23
lines changed

9 files changed

+99
-23
lines changed

packages/eslint-plugin/src/configs/__tests__/__snapshots__/recommended.test.ts.snap

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,7 @@ exports[`recommended > export recommended config 1`] = `
7979
},
8080
"messages": {
8181
"styleOrderRange": "styleOrder prop must be a number greater than 0 and less than 255.",
82+
"wrongType": "styleOrder prop must be a number or a string representing a number.",
8283
},
8384
"schema": [],
8485
"type": "problem",

packages/eslint-plugin/src/rules/no-duplicate-value/__tests__/index.test.ts

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,10 @@ describe('no-duplicate-value rule', () => {
3939
code: 'import { css } from "other-package";\ncss()',
4040
filename: 'src/app/page.tsx',
4141
},
42+
{
43+
code: 'import { Box } from "@devup-ui/react";\n<Box w={[call(), null, null, 3]} />',
44+
filename: 'src/app/page.tsx',
45+
},
4246
],
4347
invalid: [
4448
{
@@ -80,6 +84,20 @@ describe('no-duplicate-value rule', () => {
8084
},
8185
],
8286
},
87+
{
88+
code: 'import { css } from "@devup-ui/react";\ncss({w: [1, `2`, 2, "2", 3]})',
89+
output:
90+
'import { css } from "@devup-ui/react";\ncss({w: [1, `2`, null, null, 3]})',
91+
filename: 'src/app/page.tsx',
92+
errors: [
93+
{
94+
messageId: 'duplicateValue',
95+
},
96+
{
97+
messageId: 'duplicateValue',
98+
},
99+
],
100+
},
83101
],
84102
})
85103
})

packages/eslint-plugin/src/rules/no-duplicate-value/index.ts

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,25 +12,38 @@ const createRule = ESLintUtils.RuleCreator(
1212
`https://github.com/dev-five-git/devup-ui/tree/main/packages/eslint-plugin/src/rules/${name}`,
1313
)
1414

15+
function getValue(node: TSESTree.Literal | TSESTree.TemplateLiteral) {
16+
if (node.type === AST_NODE_TYPES.Literal) {
17+
return node.value?.toString()
18+
}
19+
return node.quasis[0].value.raw
20+
}
21+
1522
function checkDuplicateValue<T extends RuleContext<string, []>>(
1623
node: TSESTree.ArrayExpression,
1724
context: T,
1825
) {
1926
for (let i = 0; i < node.elements.length; i++) {
2027
const element = node.elements[i]
21-
if (element?.type === AST_NODE_TYPES.Literal) {
28+
if (
29+
element?.type === AST_NODE_TYPES.Literal ||
30+
element?.type === AST_NODE_TYPES.TemplateLiteral
31+
) {
2232
if (i === 0) continue
33+
const elementValue = getValue(element)
34+
if (elementValue === undefined) continue
35+
2336
const prevElement = node.elements[i - 1]
2437
if (
25-
prevElement?.type === AST_NODE_TYPES.Literal &&
26-
element.value === prevElement.value &&
27-
element.value !== null
38+
(prevElement?.type === AST_NODE_TYPES.Literal ||
39+
prevElement?.type === AST_NODE_TYPES.TemplateLiteral) &&
40+
elementValue === getValue(prevElement)
2841
) {
2942
context.report({
3043
node,
3144
messageId: 'duplicateValue',
3245
data: {
33-
value: element.value,
46+
value: elementValue,
3447
},
3548
fix(fixer) {
3649
return fixer.replaceText(element, 'null')

packages/eslint-plugin/src/rules/no-useless-responsive/__tests__/index.test.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,11 @@ describe('no-useless-responsive rule', () => {
5959
code: 'import { Box } from "@devup-ui/react";\n<Box w={[1].length === 1 ? 1 : 2} />',
6060
filename: 'src/app/page.tsx',
6161
},
62+
{
63+
// normal case
64+
code: '<Box w={[1]} />',
65+
filename: 'src/app/page.tsx',
66+
},
6267
{
6368
code: 'import { css } from "@devup-ui/react";\ncss({w: 1})',
6469
filename: 'src/app/page.tsx',

packages/eslint-plugin/src/rules/no-useless-tailing-nulls/__tests__/index.test.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,15 @@ describe('no-useless-tailing-nulls rule', () => {
2424
filename: 'src/app/page.tsx',
2525
},
2626
{
27+
// normal case
2728
code: 'import { Box } from "other-package";\n<Box w={[1, 2,]} />',
2829
filename: 'src/app/page.tsx',
2930
},
31+
{
32+
// normal case
33+
code: 'css({ w: [1, 2, null] })',
34+
filename: 'src/app/page.tsx',
35+
},
3036
],
3137
invalid: [
3238
{

packages/eslint-plugin/src/rules/style-order-range/__tests__/index.test.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -344,6 +344,15 @@ describe('style-order-range rule', () => {
344344
},
345345
],
346346
},
347+
{
348+
code: 'import { Box } from "@devup-ui/react";\n<Box styleOrder=<div /> />',
349+
filename: 'src/app/page.tsx',
350+
errors: [
351+
{
352+
messageId: 'wrongType',
353+
},
354+
],
355+
},
347356
],
348357
})
349358
})

packages/eslint-plugin/src/rules/style-order-range/index.ts

Lines changed: 17 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,8 @@ export const styleOrderRange = createRule({
8181
messages: {
8282
styleOrderRange:
8383
'styleOrder prop must be a number greater than 0 and less than 255.',
84+
wrongType:
85+
'styleOrder prop must be a number or a string representing a number.',
8486
},
8587
type: 'problem',
8688
docs: {
@@ -114,18 +116,14 @@ export const styleOrderRange = createRule({
114116
}
115117
},
116118
Property(node) {
117-
if (!devupContext) return
118119
if (
120+
devupContext &&
119121
node.key.type === AST_NODE_TYPES.Identifier &&
120-
node.key.name === 'styleOrder'
122+
node.key.name === 'styleOrder' &&
123+
node.value.type !== AST_NODE_TYPES.AssignmentPattern &&
124+
node.value.type !== AST_NODE_TYPES.TSEmptyBodyFunctionExpression
121125
) {
122-
const value = node.value
123-
if (
124-
value.type !== AST_NODE_TYPES.AssignmentPattern &&
125-
value.type !== AST_NODE_TYPES.TSEmptyBodyFunctionExpression
126-
) {
127-
checkStyleOrderRange(value, context)
128-
}
126+
checkStyleOrderRange(node.value, context)
129127
}
130128
},
131129
JSXOpeningElement(node) {
@@ -149,13 +147,18 @@ export const styleOrderRange = createRule({
149147
return
150148
}
151149

152-
if (node.value.type === AST_NODE_TYPES.JSXExpressionContainer) {
153-
const expression = node.value.expression
154-
if (expression.type !== AST_NODE_TYPES.JSXEmptyExpression) {
155-
checkStyleOrderRange(expression, context)
156-
}
150+
if (
151+
node.value.type === AST_NODE_TYPES.JSXExpressionContainer &&
152+
node.value.expression.type !== AST_NODE_TYPES.JSXEmptyExpression
153+
) {
154+
checkStyleOrderRange(node.value.expression, context)
157155
} else if (node.value.type === AST_NODE_TYPES.Literal) {
158156
checkStyleOrderRange(node.value, context)
157+
} else {
158+
context.report({
159+
node: node,
160+
messageId: 'wrongType',
161+
})
159162
}
160163
},
161164
}

packages/react/src/stores/theme-store.ts

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,9 +30,11 @@ export function createThemeStore() {
3030
}
3131

3232
const mo = new MutationObserver((mutations) => {
33-
for (const m of mutations)
34-
if (m.type === 'attributes' && m.target instanceof HTMLElement)
35-
set(m.target.getAttribute('data-theme') as Theme)
33+
mutations
34+
.filter((m) => m.type === 'attributes' && m.target instanceof HTMLElement)
35+
.forEach((m) => {
36+
set((m.target as HTMLElement).getAttribute('data-theme') as Theme)
37+
})
3638
})
3739
mo.observe(el, {
3840
attributes: true,

packages/rsbuild-plugin/src/__tests__/plugin.test.ts

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { existsSync } from 'node:fs'
1+
import { existsSync, writeFileSync } from 'node:fs'
22
import { mkdir, readFile, writeFile } from 'node:fs/promises'
33
import { join, resolve } from 'node:path'
44

@@ -65,6 +65,25 @@ describe('DevupUIRsbuildPlugin', () => {
6565
} as any)
6666
})
6767

68+
it('should write data files without theme', async () => {
69+
vi.mocked(readFile).mockResolvedValueOnce(JSON.stringify({}))
70+
vi.mocked(getThemeInterface).mockReturnValue('')
71+
vi.mocked(existsSync).mockImplementation((path) => {
72+
if (path === 'devup.json') return true
73+
return false
74+
})
75+
const plugin = DevupUI()
76+
expect(plugin).toBeDefined()
77+
expect(plugin.setup).toBeDefined()
78+
const transform = vi.fn()
79+
const modifyRsbuildConfig = vi.fn()
80+
await plugin.setup({
81+
transform,
82+
modifyRsbuildConfig,
83+
} as any)
84+
expect(writeFileSync).not.toHaveBeenCalled()
85+
})
86+
6887
it('should error when write data files', async () => {
6988
const originalConsoleError = console.error
7089
console.error = vi.fn()

0 commit comments

Comments
 (0)