feat(module): devtools integration (#2196)

Co-authored-by: Benjamin Canac <canacb1@gmail.com>
This commit is contained in:
Romain Hamel
2024-11-05 22:17:56 +01:00
committed by GitHub
parent 7fc6b387b3
commit 701c75a2a8
100 changed files with 2062 additions and 59 deletions

View File

@@ -0,0 +1,44 @@
import type { PropertyMeta } from 'vue-component-meta'
import BooleanInput, { booleanInputSchema } from '../components/inputs/BooleanInput.vue'
import StringInput, { stringInputSchema } from '../components/inputs/StringInput.vue'
import NumberInput, { numberInputSchema } from '../components/inputs/NumberInput.vue'
import StringEnumInput, { stringEnumInputSchema } from '../components/inputs/StringEnumInput.vue'
import ObjectInput, { objectInputSchema } from '../components/inputs/ObjectInput.vue'
import ArrayInput, { arrayInputSchema } from '../components/inputs/ArrayInput.vue'
// List of available inputs.
const availableInputs = [
{ id: 'string', schema: stringInputSchema, component: StringInput },
{ id: 'number', schema: numberInputSchema, component: NumberInput },
{ id: 'boolean', schema: booleanInputSchema, component: BooleanInput },
{ id: 'stringEnum', schema: stringEnumInputSchema, component: StringEnumInput },
{ id: 'object', schema: objectInputSchema, component: ObjectInput },
{ id: 'array', schema: arrayInputSchema, component: ArrayInput }
]
export function usePropSchema() {
function resolveInputSchema(schema: PropertyMeta['schema']): { schema: PropertyMeta['schema'], input: any } | undefined {
// Return the first input in the list of available inputs that matches the schema.
for (const input of availableInputs) {
const result = input.schema.safeParse(schema)
if (result.success) {
// Returns the output from zod to get the transformed output.
// It only includes attributes defined in the zod schema.
return { schema: result.data as PropertyMeta['schema'], input }
}
}
if (typeof schema === 'string') return
// If the schema is a complex enum or array return the first nested schema that matches an input.
if (schema.kind === 'enum' && schema.schema) {
const enumSchemas = typeof schema.schema === 'object' ? Object.values(schema.schema) : schema.schema
for (const enumSchema of enumSchemas) {
const result = resolveInputSchema(enumSchema)
if (result) return result
}
}
}
return { resolveInputSchema }
}

View File

@@ -0,0 +1,34 @@
import { createHighlighterCore } from 'shiki/core'
import type { BuiltinLanguage, HighlighterCore } from 'shiki'
import loadWasm from 'shiki/wasm'
import MaterialThemeLighter from 'shiki/themes/material-theme-lighter.mjs'
import MaterialThemePalenight from 'shiki/themes/material-theme-palenight.mjs'
import VueLang from 'shiki/langs/vue.mjs'
import MarkdownLang from 'shiki/langs/markdown.mjs'
export const highlighter = shallowRef<HighlighterCore>()
// A custom composable for syntax highlighting with Shiki since `@nuxt/mdc` relies on
// a server endpoint to highlight code.
export function useShiki() {
async function codeToHtml(code: string, lang: BuiltinLanguage | 'text' = 'text') {
if (!highlighter.value) {
highlighter.value = await createHighlighterCore({
themes: [MaterialThemeLighter, MaterialThemePalenight],
langs: [VueLang, MarkdownLang],
loadWasm
})
}
return highlighter.value.codeToHtml(code, {
lang,
themes: {
dark: 'material-theme-palenight',
default: 'material-theme-lighter',
light: 'material-theme-lighter'
}
})
}
return { codeToHtml }
}