diff --git a/.changeset/rich-facts-buy.md b/.changeset/rich-facts-buy.md new file mode 100644 index 00000000..e34116d6 --- /dev/null +++ b/.changeset/rich-facts-buy.md @@ -0,0 +1,5 @@ +--- +'@devup-ui/next-plugin': patch +--- + +Fix default theme issue diff --git a/packages/next-plugin/src/__tests__/plugin.test.ts b/packages/next-plugin/src/__tests__/plugin.test.ts index 1623840a..024ff63e 100644 --- a/packages/next-plugin/src/__tests__/plugin.test.ts +++ b/packages/next-plugin/src/__tests__/plugin.test.ts @@ -1,7 +1,7 @@ import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs' import { join, resolve } from 'node:path' -import { getThemeInterface } from '@devup-ui/wasm' +import { getDefaultTheme, getThemeInterface } from '@devup-ui/wasm' import { DevupUIWebpackPlugin } from '@devup-ui/webpack-plugin' import { DevupUI } from '../plugin' @@ -14,6 +14,19 @@ vi.mock('@devup-ui/wasm', async (original) => ({ ...(await original()), registerTheme: vi.fn(), getThemeInterface: vi.fn(), + getDefaultTheme: vi.fn(), + exportSheet: vi.fn(() => + JSON.stringify({ + css: {}, + font_faces: {}, + global_css_files: [], + imports: {}, + keyframes: {}, + properties: {}, + }), + ), + exportClassMap: vi.fn(() => JSON.stringify({})), + exportFileMap: vi.fn(() => JSON.stringify({})), })) describe('DevupUINextPlugin', () => { @@ -312,5 +325,67 @@ describe('DevupUINextPlugin', () => { }) expect(writeFileSync).toHaveBeenCalledWith(join('df', '.gitignore'), '*') }) + it('should set DEVUP_UI_DEFAULT_THEME when getDefaultTheme returns a value', async () => { + vi.stubEnv('TURBOPACK', '1') + vi.stubEnv('DEVUP_UI_DEFAULT_THEME', '') + vi.mocked(existsSync) + .mockReturnValueOnce(true) + .mockReturnValueOnce(true) + .mockReturnValueOnce(true) + .mockReturnValueOnce(false) + vi.mocked(getDefaultTheme).mockReturnValue('dark') + const config: any = {} + const ret = DevupUI(config) + + expect(process.env.DEVUP_UI_DEFAULT_THEME).toBe('dark') + expect(ret.env).toEqual({ + DEVUP_UI_DEFAULT_THEME: 'dark', + }) + expect(config.env).toEqual({ + DEVUP_UI_DEFAULT_THEME: 'dark', + }) + }) + it('should not set DEVUP_UI_DEFAULT_THEME when getDefaultTheme returns undefined', async () => { + vi.stubEnv('TURBOPACK', '1') + vi.stubEnv('DEVUP_UI_DEFAULT_THEME', '') + vi.mocked(existsSync) + .mockReturnValueOnce(true) + .mockReturnValueOnce(true) + .mockReturnValueOnce(true) + .mockReturnValueOnce(false) + vi.mocked(getDefaultTheme).mockReturnValue(undefined) + const config: any = {} + const ret = DevupUI(config) + + expect(process.env.DEVUP_UI_DEFAULT_THEME).toBe('') + expect(ret.env).toBeUndefined() + expect(config.env).toBeUndefined() + }) + it('should set DEVUP_UI_DEFAULT_THEME and preserve existing env vars', async () => { + vi.stubEnv('TURBOPACK', '1') + vi.stubEnv('DEVUP_UI_DEFAULT_THEME', '') + vi.mocked(existsSync) + .mockReturnValueOnce(true) + .mockReturnValueOnce(true) + .mockReturnValueOnce(true) + .mockReturnValueOnce(false) + vi.mocked(getDefaultTheme).mockReturnValue('light') + const config: any = { + env: { + CUSTOM_VAR: 'value', + }, + } + const ret = DevupUI(config) + + expect(process.env.DEVUP_UI_DEFAULT_THEME).toBe('light') + expect(ret.env).toEqual({ + CUSTOM_VAR: 'value', + DEVUP_UI_DEFAULT_THEME: 'light', + }) + expect(config.env).toEqual({ + CUSTOM_VAR: 'value', + DEVUP_UI_DEFAULT_THEME: 'light', + }) + }) }) }) diff --git a/packages/next-plugin/src/plugin.ts b/packages/next-plugin/src/plugin.ts index d3819f06..f9eff8a7 100644 --- a/packages/next-plugin/src/plugin.ts +++ b/packages/next-plugin/src/plugin.ts @@ -5,6 +5,7 @@ import { exportClassMap, exportFileMap, exportSheet, + getDefaultTheme, getThemeInterface, registerTheme, } from '@devup-ui/wasm' @@ -96,6 +97,15 @@ export function DevupUI( const defaultSheet = JSON.parse(exportSheet()) const defaultClassMap = JSON.parse(exportClassMap()) const defaultFileMap = JSON.parse(exportFileMap()) + // for theme script + const defaultTheme = getDefaultTheme() + if (defaultTheme) { + process.env.DEVUP_UI_DEFAULT_THEME = defaultTheme + config.env ??= {} + Object.assign(config.env, { + DEVUP_UI_DEFAULT_THEME: defaultTheme, + }) + } const rules: NonNullable = { [`./${relative(process.cwd(), cssDir).replaceAll('\\', '/')}/*.css`]: [