From 235556d3e00b7a008fe16beba3f370b4af8bbb56 Mon Sep 17 00:00:00 2001 From: Benjamin Canac Date: Wed, 3 Jul 2024 14:35:58 +0200 Subject: [PATCH] fix(components): `ui` prop override with class (#136) --- ...lesCode.ts => fetchContentExamplesCode.ts} | 6 ++- docs/app/composables/useShikiHighlighter.ts | 31 ------------ docs/app/plugins/prettier.ts | 13 ++--- docs/app/workers/prettier.js | 4 +- docs/modules/content-examples-code.ts | 22 ++++---- docs/server/api/content-examples-code.get.ts | 2 +- docs/server/api/pulls.json.get.ts | 2 +- src/runtime/components/Accordion.vue | 18 ++++--- src/runtime/components/Alert.vue | 22 ++++---- src/runtime/components/Avatar.vue | 11 ++-- src/runtime/components/AvatarGroup.vue | 6 +-- src/runtime/components/Breadcrumb.vue | 20 ++++---- src/runtime/components/Button.vue | 8 +-- src/runtime/components/Card.vue | 10 ++-- src/runtime/components/Checkbox.vue | 16 +++--- src/runtime/components/Chip.vue | 4 +- src/runtime/components/Collapsible.vue | 6 +-- src/runtime/components/CommandPalette.vue | 45 +++++++++-------- src/runtime/components/ContextMenu.vue | 11 +++- src/runtime/components/ContextMenuContent.vue | 26 +++++----- src/runtime/components/Drawer.vue | 21 ++++---- src/runtime/components/DropdownMenu.vue | 13 +++-- .../components/DropdownMenuContent.vue | 26 +++++----- src/runtime/components/FormField.vue | 16 +++--- src/runtime/components/Input.vue | 12 ++--- src/runtime/components/InputMenu.vue | 50 +++++++++---------- src/runtime/components/Modal.vue | 20 ++++---- src/runtime/components/NavigationMenu.vue | 50 +++++++++---------- src/runtime/components/Pagination.vue | 8 +-- src/runtime/components/Popover.vue | 7 ++- src/runtime/components/Progress.vue | 12 ++--- src/runtime/components/RadioGroup.vue | 22 ++++---- src/runtime/components/Select.vue | 36 ++++++------- src/runtime/components/SelectMenu.vue | 42 ++++++++-------- src/runtime/components/Separator.vue | 14 +++--- src/runtime/components/Slideover.vue | 20 ++++---- src/runtime/components/Slider.vue | 8 +-- src/runtime/components/Switch.vue | 20 ++++---- src/runtime/components/Tabs.vue | 16 +++--- src/runtime/components/Textarea.vue | 4 +- src/runtime/components/Toast.vue | 26 +++++----- src/runtime/components/Toaster.vue | 2 +- src/runtime/components/Tooltip.vue | 11 ++-- src/theme/progress.ts | 3 ++ .../__snapshots__/Breadcrumb.spec.ts.snap | 6 +-- .../__snapshots__/Chip.spec.ts.snap | 2 +- .../__snapshots__/DropdownMenu.spec.ts.snap | 2 +- .../__snapshots__/Input.spec.ts.snap | 2 +- .../__snapshots__/Progress.spec.ts.snap | 2 +- .../__snapshots__/Slider.spec.ts.snap | 2 +- 50 files changed, 383 insertions(+), 375 deletions(-) rename docs/app/composables/{useContentExamplesCode.ts => fetchContentExamplesCode.ts} (85%) delete mode 100644 docs/app/composables/useShikiHighlighter.ts diff --git a/docs/app/composables/useContentExamplesCode.ts b/docs/app/composables/fetchContentExamplesCode.ts similarity index 85% rename from docs/app/composables/useContentExamplesCode.ts rename to docs/app/composables/fetchContentExamplesCode.ts index 659dcbc0..52e40307 100644 --- a/docs/app/composables/useContentExamplesCode.ts +++ b/docs/app/composables/fetchContentExamplesCode.ts @@ -1,6 +1,6 @@ const useContentExamplesCodeState = () => useState('content-examples-code', () => ({})) -export async function fetchContentExampleCode (name?: string) { +export async function fetchContentExampleCode(name?: string) { if (!name) return const state = useContentExamplesCodeState() @@ -8,7 +8,9 @@ export async function fetchContentExampleCode (name?: string) { await state.value[name] return state.value[name] } - if (state.value[name]) { return state.value[name] } + if (state.value[name]) { + return state.value[name] + } // add to nitro prerender if (import.meta.server) { diff --git a/docs/app/composables/useShikiHighlighter.ts b/docs/app/composables/useShikiHighlighter.ts deleted file mode 100644 index 4bd48c36..00000000 --- a/docs/app/composables/useShikiHighlighter.ts +++ /dev/null @@ -1,31 +0,0 @@ -import { createShikiHighlighter } from '@nuxtjs/mdc/runtime/highlighter/shiki' -import MaterialTheme from 'shiki/themes/material-theme.mjs' -import MaterialThemeLighter from 'shiki/themes/material-theme-lighter.mjs' -import MaterialThemePalenight from 'shiki/themes/material-theme-palenight.mjs' -import HtmlLang from 'shiki/langs/html.mjs' -import MdcLang from 'shiki/langs/mdc.mjs' -import VueLang from 'shiki/langs/vue.mjs' -import YamlLang from 'shiki/langs/yaml.mjs' -import PostcssLang from 'shiki/langs/postcss.mjs' - -let highlighter -export const useShikiHighlighter = () => { - if (!highlighter) { - highlighter = createShikiHighlighter({ - bundledThemes: { - 'material-theme': MaterialTheme, - 'material-theme-lighter': MaterialThemeLighter, - 'material-theme-palenight': MaterialThemePalenight - }, - bundledLangs: { - html: HtmlLang, - mdc: MdcLang, - vue: VueLang, - yml: YamlLang, - postcss: PostcssLang - } - }) - } - - return highlighter -} diff --git a/docs/app/plugins/prettier.ts b/docs/app/plugins/prettier.ts index 3abf6013..02261349 100644 --- a/docs/app/plugins/prettier.ts +++ b/docs/app/plugins/prettier.ts @@ -2,10 +2,10 @@ import type { Options } from 'prettier' import PrettierWorker from '@/workers/prettier.js?worker&inline' export interface SimplePrettier { - format: (source: string, options?: Options) => Promise; + format: (source: string, options?: Options) => Promise } -function createPrettierWorkerApi (worker: Worker): SimplePrettier { +function createPrettierWorkerApi(worker: Worker): SimplePrettier { let counter = 0 const handlers = {} @@ -17,6 +17,7 @@ function createPrettierWorkerApi (worker: Worker): SimplePrettier { } const [resolve, reject] = handlers[uid] + // eslint-disable-next-line @typescript-eslint/no-dynamic-delete delete handlers[uid] if (error) { @@ -26,7 +27,7 @@ function createPrettierWorkerApi (worker: Worker): SimplePrettier { } }) - function postMessage (message) { + function postMessage(message) { const uid = ++counter return new Promise((resolve, reject) => { handlers[uid] = [resolve, reject] @@ -35,19 +36,19 @@ function createPrettierWorkerApi (worker: Worker): SimplePrettier { } return { - format (source: string, options?: Options) { + format(source: string, options?: Options) { return postMessage({ type: 'format', source, options }) } } } export default defineNuxtPlugin({ - async setup () { + async setup() { let prettier: SimplePrettier if (import.meta.server) { const prettierModule = await import('prettier') prettier = { - format (source, options = { + format(source, options = { parser: 'markdown' }) { return prettierModule.format(source, options) diff --git a/docs/app/workers/prettier.js b/docs/app/workers/prettier.js index 0c39f96f..b12fafec 100644 --- a/docs/app/workers/prettier.js +++ b/docs/app/workers/prettier.js @@ -10,14 +10,14 @@ self.onmessage = async function (event) { }) } -function handleMessage (message) { +function handleMessage(message) { switch (message.type) { case 'format': return handleFormatMessage(message) } } -async function handleFormatMessage (message) { +async function handleFormatMessage(message) { const { options, source } = message const formatted = await prettier.format(source, { parser: 'markdown', diff --git a/docs/modules/content-examples-code.ts b/docs/modules/content-examples-code.ts index 985eb5c3..b983e3f1 100644 --- a/docs/modules/content-examples-code.ts +++ b/docs/modules/content-examples-code.ts @@ -1,5 +1,5 @@ -import { existsSync, readFileSync } from 'fs' -import fsp from 'fs/promises' +import { existsSync, readFileSync } from 'node:fs' +import fsp from 'node:fs/promises' import { dirname, join } from 'pathe' import { defineNuxtModule, addTemplate, addServerHandler, createResolver } from '@nuxt/kit' @@ -7,20 +7,20 @@ export default defineNuxtModule({ meta: { name: 'content-examples-code' }, - async setup (_options, nuxt) { + async setup(_options, nuxt) { const resolver = createResolver(import.meta.url) let _configResolved: any let components: Record const outputPath = join(nuxt.options.buildDir, 'content-examples-code') - async function stubOutput () { + async function stubOutput() { if (existsSync(outputPath + '.mjs')) { return } await updateOutput('export default {}') } - async function fetchComponent (component: string | any) { + async function fetchComponent(component: string | any) { if (typeof component === 'string') { if (components[component]) { component = components[component] @@ -51,7 +51,7 @@ export default defineNuxtModule({ const getVirtualModuleContent = () => `export default ${getStringifiedComponents()}` - async function updateOutput (content?: string) { + async function updateOutput(content?: string) { const path = outputPath + '.mjs' if (!existsSync(dirname(path))) { await fsp.mkdir(dirname(path), { recursive: true }) @@ -62,13 +62,13 @@ export default defineNuxtModule({ await fsp.writeFile(path, content || getVirtualModuleContent(), 'utf-8') } - async function fetchComponents () { + async function fetchComponents() { await Promise.all(Object.keys(components).map(fetchComponent)) } nuxt.hook('components:extend', async (_components) => { components = _components - .filter((v) => v.shortPath.includes('components/content/examples/')) + .filter(v => v.shortPath.includes('components/content/examples/')) .reduce((acc, component) => { acc[component.pascalName] = component return acc @@ -87,17 +87,17 @@ export default defineNuxtModule({ vite.config.plugins.push({ name: 'content-examples-code', enforce: 'post', - async buildStart () { + async buildStart() { if (_configResolved?.build.ssr) { return } await fetchComponents() await updateOutput() }, - configResolved (config) { + configResolved(config) { _configResolved = config }, - async handleHotUpdate ({ file }) { + async handleHotUpdate({ file }) { if ( Object.entries(components).some( ([, comp]: any) => comp.filePath === file diff --git a/docs/server/api/content-examples-code.get.ts b/docs/server/api/content-examples-code.get.ts index 4c38f4e9..e652401f 100644 --- a/docs/server/api/content-examples-code.get.ts +++ b/docs/server/api/content-examples-code.get.ts @@ -1,6 +1,6 @@ import { defineEventHandler, createError, appendHeader } from 'h3' import { pascalCase } from 'scule' -// @ts-expect-error +// @ts-expect-error - no types available import components from '#content-examples-code/nitro' export default defineEventHandler((event) => { diff --git a/docs/server/api/pulls.json.get.ts b/docs/server/api/pulls.json.get.ts index 97066e03..ab3ee909 100644 --- a/docs/server/api/pulls.json.get.ts +++ b/docs/server/api/pulls.json.get.ts @@ -1,6 +1,6 @@ import { Octokit } from '@octokit/rest' -function isUserABot (user) { +function isUserABot(user) { return user?.login?.endsWith('-bot') || user?.login?.endsWith('[bot]') } diff --git a/src/runtime/components/Accordion.vue b/src/runtime/components/Accordion.vue index ff063126..7c65e0b2 100644 --- a/src/runtime/components/Accordion.vue +++ b/src/runtime/components/Accordion.vue @@ -65,7 +65,9 @@ const appConfig = useAppConfig() const rootProps = useForwardPropsEmits(reactivePick(props, 'as', 'collapsible', 'defaultValue', 'disabled', 'modelValue', 'type'), emits) const contentProps = toRef(() => props.content) -const ui = computed(() => tv({ extend: accordion, slots: props.ui })({ disabled: props.disabled })) +const ui = computed(() => accordion({ + disabled: props.disabled +}))