mirror of
https://github.com/ArthurDanjou/ui.git
synced 2026-01-28 10:50:40 +01:00
docs(ComponentExample): add
This commit is contained in:
@@ -101,7 +101,7 @@ const code = computed(() => {
|
|||||||
return code
|
return code
|
||||||
})
|
})
|
||||||
|
|
||||||
const { data: ast } = await useAsyncData(`${name}-code-${JSON.stringify({ props: componentProps, slots: props.slots })}`, async () => {
|
const { data: ast } = await useAsyncData(`component-code-${name}-${JSON.stringify({ props: componentProps, slots: props.slots })}`, async () => {
|
||||||
let formatted = ''
|
let formatted = ''
|
||||||
try {
|
try {
|
||||||
formatted = await $prettier.format(code.value)
|
formatted = await $prettier.format(code.value)
|
||||||
|
|||||||
26
docs/app/components/content/ComponentExample.vue
Normal file
26
docs/app/components/content/ComponentExample.vue
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
<script setup lang="ts">
|
||||||
|
import { camelCase } from 'scule'
|
||||||
|
|
||||||
|
const props = defineProps<{
|
||||||
|
name: string
|
||||||
|
props?: { [key: string]: any }
|
||||||
|
}>()
|
||||||
|
|
||||||
|
const camelName = camelCase(props.name)
|
||||||
|
|
||||||
|
const data = await fetchComponentExample(camelName)
|
||||||
|
|
||||||
|
const componentProps = reactive({ ...(props.props || {}) })
|
||||||
|
|
||||||
|
const { data: ast } = await useAsyncData(`component-example-${camelName}`, () => parseMarkdown(`\`\`\`vue\n${data?.code ?? ''}\n\`\`\``))
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<template>
|
||||||
|
<div>
|
||||||
|
<div class="flex border border-b-0 border-gray-300 dark:border-gray-700 relative p-4 rounded-t-md">
|
||||||
|
<component :is="camelName" v-bind="componentProps" />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<MDCRenderer v-if="ast" :body="ast.body" :data="ast.data" class="[&>div>pre]:!rounded-t-none [&>div]:!mt-0" />
|
||||||
|
</template>
|
||||||
@@ -33,7 +33,7 @@ const component = computed(() => {
|
|||||||
return stripCompoundVariants(component)
|
return stripCompoundVariants(component)
|
||||||
})
|
})
|
||||||
|
|
||||||
const { data: ast } = await useAsyncData(`${name}-theme`, () => parseMarkdown(`
|
const { data: ast } = await useAsyncData(`component-theme-${name}`, () => parseMarkdown(`
|
||||||
\`\`\`yml
|
\`\`\`yml
|
||||||
${json5.stringify(component.value, null, 2).replace(/,([ |\t\n]+[}|\])])/g, '$1')}
|
${json5.stringify(component.value, null, 2).replace(/,([ |\t\n]+[}|\])])/g, '$1')}
|
||||||
\`\`\`\
|
\`\`\`\
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ const type = computed(() => {
|
|||||||
return props.type
|
return props.type
|
||||||
})
|
})
|
||||||
|
|
||||||
const { data: ast } = await useAsyncData(`hightlight-inline-code-` + props.type, () => parseMarkdown(`\`${type.value}\`{lang="ts-type"}`))
|
const { data: ast } = await useAsyncData(`hightlight-inline-code-${props.type}`, () => parseMarkdown(`\`${type.value}\`{lang="ts-type"}`))
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
|
|||||||
28
docs/app/composables/fetchComponentExample.ts
Normal file
28
docs/app/composables/fetchComponentExample.ts
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
const useComponentExampleState = () => useState('component-example-state', () => ({}))
|
||||||
|
|
||||||
|
export async function fetchComponentExample(name: string) {
|
||||||
|
const state = useComponentExampleState()
|
||||||
|
|
||||||
|
if (state.value[name]?.then) {
|
||||||
|
await state.value[name]
|
||||||
|
return state.value[name]
|
||||||
|
}
|
||||||
|
if (state.value[name]) {
|
||||||
|
return state.value[name]
|
||||||
|
}
|
||||||
|
|
||||||
|
// add to nitro prerender
|
||||||
|
if (import.meta.server) {
|
||||||
|
const event = useRequestEvent()
|
||||||
|
event.node.res.setHeader(
|
||||||
|
'x-nitro-prerender',
|
||||||
|
[event.node.res.getHeader('x-nitro-prerender'), `/api/component-example/${name}.json`].filter(Boolean).join(',')
|
||||||
|
)
|
||||||
|
}
|
||||||
|
state.value[name] = $fetch(`/api/component-example/${name}.json`).then((data) => {
|
||||||
|
state.value[name] = data
|
||||||
|
})
|
||||||
|
|
||||||
|
await state.value[name]
|
||||||
|
return state.value[name]
|
||||||
|
}
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
import type { ComponentMeta } from 'vue-component-meta'
|
import type { ComponentMeta } from 'vue-component-meta'
|
||||||
|
|
||||||
const useComponentsMetaState = () => useState('components-meta', () => ({}))
|
const useComponentsMetaState = () => useState('component-meta-state', () => ({}))
|
||||||
|
|
||||||
export async function fetchComponentMeta(name: string): Promise<{ meta: ComponentMeta }> {
|
export async function fetchComponentMeta(name: string): Promise<{ meta: ComponentMeta }> {
|
||||||
const state = useComponentsMetaState()
|
const state = useComponentsMetaState()
|
||||||
|
|||||||
@@ -1,29 +0,0 @@
|
|||||||
const useContentExamplesCodeState = () => useState('content-examples-code', () => ({}))
|
|
||||||
|
|
||||||
export async function fetchContentExampleCode(name?: string) {
|
|
||||||
if (!name) return
|
|
||||||
const state = useContentExamplesCodeState()
|
|
||||||
|
|
||||||
if (state.value[name]?.then) {
|
|
||||||
await state.value[name]
|
|
||||||
return state.value[name]
|
|
||||||
}
|
|
||||||
if (state.value[name]) {
|
|
||||||
return state.value[name]
|
|
||||||
}
|
|
||||||
|
|
||||||
// add to nitro prerender
|
|
||||||
if (import.meta.server) {
|
|
||||||
const event = useRequestEvent()
|
|
||||||
event.node.res.setHeader(
|
|
||||||
'x-nitro-prerender',
|
|
||||||
[event.node.res.getHeader('x-nitro-prerender'), `/api/content-examples-code/${name}.json`].filter(Boolean).join(',')
|
|
||||||
)
|
|
||||||
}
|
|
||||||
state.value[name] = $fetch(`/api/content-examples-code/${name}.json`).then((data) => {
|
|
||||||
state.value[name] = data
|
|
||||||
})
|
|
||||||
|
|
||||||
await state.value[name]
|
|
||||||
return state.value[name]
|
|
||||||
}
|
|
||||||
@@ -5,13 +5,13 @@ import { defineNuxtModule, addTemplate, addServerHandler, createResolver } from
|
|||||||
|
|
||||||
export default defineNuxtModule({
|
export default defineNuxtModule({
|
||||||
meta: {
|
meta: {
|
||||||
name: 'content-examples-code'
|
name: 'component-example'
|
||||||
},
|
},
|
||||||
async setup(_options, nuxt) {
|
async setup(_options, nuxt) {
|
||||||
const resolver = createResolver(import.meta.url)
|
const resolver = createResolver(import.meta.url)
|
||||||
let _configResolved: any
|
let _configResolved: any
|
||||||
let components: Record<string, any>
|
let components: Record<string, any>
|
||||||
const outputPath = join(nuxt.options.buildDir, 'content-examples-code')
|
const outputPath = join(nuxt.options.buildDir, 'component-example')
|
||||||
|
|
||||||
async function stubOutput() {
|
async function stubOutput() {
|
||||||
if (existsSync(outputPath + '.mjs')) {
|
if (existsSync(outputPath + '.mjs')) {
|
||||||
@@ -77,7 +77,7 @@ export default defineNuxtModule({
|
|||||||
})
|
})
|
||||||
|
|
||||||
addTemplate({
|
addTemplate({
|
||||||
filename: 'content-examples-code.mjs',
|
filename: 'component-example.mjs',
|
||||||
getContents: () => 'export default {}',
|
getContents: () => 'export default {}',
|
||||||
write: true
|
write: true
|
||||||
})
|
})
|
||||||
@@ -85,7 +85,7 @@ export default defineNuxtModule({
|
|||||||
nuxt.hook('vite:extend', (vite: any) => {
|
nuxt.hook('vite:extend', (vite: any) => {
|
||||||
vite.config.plugins = vite.config.plugins || []
|
vite.config.plugins = vite.config.plugins || []
|
||||||
vite.config.plugins.push({
|
vite.config.plugins.push({
|
||||||
name: 'content-examples-code',
|
name: 'component-example',
|
||||||
enforce: 'post',
|
enforce: 'post',
|
||||||
async buildStart() {
|
async buildStart() {
|
||||||
if (_configResolved?.build.ssr) {
|
if (_configResolved?.build.ssr) {
|
||||||
@@ -112,17 +112,17 @@ export default defineNuxtModule({
|
|||||||
|
|
||||||
nuxt.hook('nitro:config', (nitroConfig) => {
|
nuxt.hook('nitro:config', (nitroConfig) => {
|
||||||
nitroConfig.virtual = nitroConfig.virtual || {}
|
nitroConfig.virtual = nitroConfig.virtual || {}
|
||||||
nitroConfig.virtual['#content-examples-code/nitro'] = () =>
|
nitroConfig.virtual['#component-example/nitro'] = () =>
|
||||||
readFileSync(
|
readFileSync(
|
||||||
join(nuxt.options.buildDir, '/content-examples-code.mjs'),
|
join(nuxt.options.buildDir, '/component-example.mjs'),
|
||||||
'utf-8'
|
'utf-8'
|
||||||
)
|
)
|
||||||
})
|
})
|
||||||
|
|
||||||
addServerHandler({
|
addServerHandler({
|
||||||
method: 'get',
|
method: 'get',
|
||||||
route: '/api/content-examples-code/:component?',
|
route: '/api/component-example/:component?',
|
||||||
handler: resolver.resolve('../server/api/content-examples-code.get')
|
handler: resolver.resolve('../server/api/component-example.get')
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
@@ -25,7 +25,6 @@ export default defineNuxtConfig({
|
|||||||
'@nuxt/image',
|
'@nuxt/image',
|
||||||
'@nuxtjs/plausible',
|
'@nuxtjs/plausible',
|
||||||
'@vueuse/nuxt',
|
'@vueuse/nuxt',
|
||||||
// 'modules/content-examples-code'
|
|
||||||
'nuxt-component-meta',
|
'nuxt-component-meta',
|
||||||
'nuxt-og-image'
|
'nuxt-og-image'
|
||||||
],
|
],
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
import { defineEventHandler, createError, appendHeader } from 'h3'
|
import { defineEventHandler, createError, appendHeader } from 'h3'
|
||||||
import { pascalCase } from 'scule'
|
import { pascalCase } from 'scule'
|
||||||
// @ts-expect-error - no types available
|
// @ts-expect-error - no types available
|
||||||
import components from '#content-examples-code/nitro'
|
import components from '#component-example/nitro'
|
||||||
|
|
||||||
export default defineEventHandler((event) => {
|
export default defineEventHandler((event) => {
|
||||||
appendHeader(event, 'Access-Control-Allow-Origin', '*')
|
appendHeader(event, 'Access-Control-Allow-Origin', '*')
|
||||||
@@ -10,7 +10,7 @@ export default defineEventHandler((event) => {
|
|||||||
const component = components[pascalCase(componentName)]
|
const component = components[pascalCase(componentName)]
|
||||||
if (!component) {
|
if (!component) {
|
||||||
throw createError({
|
throw createError({
|
||||||
statusMessage: 'Examples not found!',
|
statusMessage: 'Example not found!',
|
||||||
statusCode: 404
|
statusCode: 404
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user