Skip to content

Commit 8f28514

Browse files
committed
fix!: disallow setting colorMode.value + test types
resolves #317
1 parent ed8ea85 commit 8f28514

File tree

9 files changed

+98
-36
lines changed

9 files changed

+98
-36
lines changed

package.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@
4242
"lint": "eslint .",
4343
"prepublishOnly": "pnpm run prepack",
4444
"release": "pnpm lint && pnpm test && changelogen --release && npm publish && git push --follow-tags",
45-
"test": "vitest run --coverage"
45+
"test": "vitest run --coverage && vue-tsc --noEmit"
4646
},
4747
"dependencies": {
4848
"@nuxt/kit": "^4.2.1",
@@ -68,6 +68,7 @@
6868
"husky": "9.1.7",
6969
"nuxt": "^4.2.1",
7070
"typescript": "^5.9.3",
71+
"unbuild": "^3.6.1",
7172
"vitest": "^4.0.8",
7273
"vue-tsc": "^3.1.3"
7374
}

playground/package.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,8 @@
77
"@nuxt/icon": "^2.1.0",
88
"@nuxtjs/color-mode": "latest",
99
"@nuxtjs/tailwindcss": "^6.14.0",
10-
"nuxt": "^4.2.1"
10+
"nuxt": "^4.2.1",
11+
"tailwindcss": "^3.4.18"
1112
},
1213
"scripts": {
1314
"postinstall": "pnpm -C .. run dev:prepare",

pnpm-lock.yaml

Lines changed: 70 additions & 25 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/runtime/nitro-plugin.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import type { NitroAppPlugin } from 'nitropack'
22

3+
// @ts-expect-error untyped virtual module
34
import { script } from '#color-mode-options'
45

56
export default <NitroAppPlugin> function (nitro) {

src/runtime/plugin.client.ts

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -45,17 +45,18 @@ export default defineNuxtPlugin((nuxtApp) => {
4545
const forcedColorMode = to.meta.colorMode
4646

4747
if (forcedColorMode && forcedColorMode !== 'system') {
48-
colorMode.value = forcedColorMode
48+
setColorModeValue(colorMode, forcedColorMode)
4949
colorMode.forced = true
5050
}
5151
else {
5252
if (forcedColorMode === 'system') {
5353
console.warn('You cannot force the colorMode to system at the page level.')
5454
}
5555
colorMode.forced = false
56-
colorMode.value = colorMode.preference === 'system'
56+
const newValue = colorMode.preference === 'system'
5757
? helper.getColorScheme()
5858
: colorMode.preference
59+
setColorModeValue(colorMode, newValue)
5960
}
6061
})
6162

@@ -69,7 +70,7 @@ export default defineNuxtPlugin((nuxtApp) => {
6970
darkWatcher = window.matchMedia('(prefers-color-scheme: dark)')
7071
darkWatcher.addEventListener('change', () => {
7172
if (!colorMode.forced && colorMode.preference === 'system') {
72-
colorMode.value = helper.getColorScheme()
73+
setColorModeValue(colorMode, helper.getColorScheme())
7374
}
7475
})
7576
}
@@ -93,11 +94,11 @@ export default defineNuxtPlugin((nuxtApp) => {
9394
return
9495
}
9596
if (preference === 'system') {
96-
colorMode.value = helper.getColorScheme()
97+
setColorModeValue(colorMode, helper.getColorScheme())
9798
watchMedia()
9899
}
99100
else {
100-
colorMode.value = preference
101+
setColorModeValue(colorMode, preference)
101102
}
102103

103104
setPreferenceToStorage(storage, preference)
@@ -129,10 +130,15 @@ export default defineNuxtPlugin((nuxtApp) => {
129130
nuxtApp.hook('app:mounted', () => {
130131
if (colorMode.unknown) {
131132
colorMode.preference = helper.preference
132-
colorMode.value = helper.value
133+
setColorModeValue(colorMode, helper.value)
133134
colorMode.unknown = false
134135
}
135136
})
136137

137138
nuxtApp.provide('colorMode', colorMode)
138139
})
140+
141+
function setColorModeValue(colorMode: ColorModeInstance, value: string) {
142+
// @ts-expect-error readonly property
143+
colorMode.value = value
144+
}

src/runtime/plugin.server.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,9 @@ export default defineNuxtPlugin((nuxtApp) => {
2929
const forcedColorMode = to.meta.colorMode
3030

3131
if (forcedColorMode && forcedColorMode !== 'system') {
32-
colorMode.value = htmlAttrs['data-color-mode-forced'] = forcedColorMode
32+
htmlAttrs['data-color-mode-forced'] = forcedColorMode
33+
// @ts-expect-error readonly property
34+
colorMode.value = forcedColorMode
3335
if (dataValue) {
3436
htmlAttrs[`data-${dataValue}`] = colorMode.value
3537
}

src/runtime/types.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
export interface ColorModeInstance {
22
preference: string
3-
value: string
3+
readonly value: string
44
unknown: boolean
55
forced: boolean
66
}

src/script.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818

1919
addColorScheme(value)
2020

21+
// @ts-expect-error global name is not of correct type
2122
w['<%= options.globalName %>'] = {
2223
preference,
2324
value,

tsconfig.json

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,8 @@
11
{
2-
"extends": "./.nuxt/tsconfig.json"
2+
"extends": "./.nuxt/tsconfig.json",
3+
"exclude": [
4+
"dist",
5+
"docs",
6+
"playground"
7+
]
38
}

0 commit comments

Comments
 (0)