|
1 | 1 | import { fileURLToPath } from 'url'
|
2 | 2 | import fsp from 'fs/promises'
|
3 |
| -import { defineNuxtModule, addPlugin, resolveModule, addServerMiddleware } from '@nuxt/kit' |
| 3 | +import { defineNuxtModule, resolveModule, createResolver } from '@nuxt/kit' |
4 | 4 | import { parse, compileScript, compileTemplate } from '@vue/compiler-sfc'
|
5 | 5 | import type { SFCDescriptor } from '@vue/compiler-sfc'
|
6 |
| -import type { Nitro } from 'nitropack' |
7 | 6 |
|
8 |
| -export interface ModuleOptions { |
9 |
| - addPlugin: boolean |
10 |
| -} |
| 7 | +export interface ModuleOptions {} |
11 | 8 |
|
12 | 9 | export default defineNuxtModule<ModuleOptions>({
|
13 | 10 | meta: {
|
14 | 11 | name: 'nuxt-component-meta',
|
15 | 12 | configKey: 'componentMeta'
|
16 | 13 | },
|
17 |
| - defaults: { |
18 |
| - addPlugin: true |
19 |
| - }, |
20 |
| - setup (options, nuxt) { |
21 |
| - if (options.addPlugin) { |
22 |
| - const runtimeDir = fileURLToPath(new URL('./runtime', import.meta.url)) |
23 |
| - let nitro: Nitro |
24 |
| - nuxt.hook('components:extend', async (components) => { |
25 |
| - const componentMeta = await Promise.all( |
26 |
| - components.map(async (component) => { |
27 |
| - const name = (component as any).pascalName |
28 |
| - const path = resolveModule((component as any).filePath, { paths: nuxt.options.rootDir }) |
29 |
| - const source = await fsp.readFile(path, { encoding: 'utf-8' }) |
30 |
| - |
31 |
| - // Parse component source |
32 |
| - const { descriptor } = parse(source) |
33 |
| - |
34 |
| - // Parse script |
35 |
| - const { props } = descriptor.scriptSetup |
36 |
| - ? parseSetupScript(name, descriptor) |
37 |
| - : { |
38 |
| - props: [] |
39 |
| - } |
40 |
| - |
41 |
| - const { slots } = parseTemplate(name, descriptor) |
42 |
| - |
43 |
| - return { |
44 |
| - name, |
45 |
| - props, |
46 |
| - slots |
47 |
| - } |
48 |
| - }) |
49 |
| - ) |
50 |
| - nitro.options.virtual['#meta/virtual/meta'] = `export const components = ${JSON.stringify(componentMeta)}` |
51 |
| - }) |
| 14 | + setup (_options, nuxt) { |
| 15 | + const resolver = createResolver(import.meta.url) |
52 | 16 |
|
53 |
| - nuxt.hook('nitro:init', (_nitro) => { |
54 |
| - nitro = _nitro |
55 |
| - }) |
| 17 | + let componentMeta |
| 18 | + nuxt.hook('components:extend', async (components) => { |
| 19 | + componentMeta = await Promise.all( |
| 20 | + components.map(async (component) => { |
| 21 | + const name = (component as any).pascalName |
| 22 | + const path = resolveModule((component as any).filePath, { paths: nuxt.options.rootDir }) |
| 23 | + const source = await fsp.readFile(path, { encoding: 'utf-8' }) |
| 24 | + |
| 25 | + // Parse component source |
| 26 | + const { descriptor } = parse(source) |
| 27 | + |
| 28 | + // Parse script |
| 29 | + const { props } = descriptor.scriptSetup |
| 30 | + ? parseSetupScript(name, descriptor) |
| 31 | + : { |
| 32 | + props: [] |
| 33 | + } |
56 | 34 |
|
57 |
| - addServerMiddleware({ |
| 35 | + const { slots } = parseTemplate(name, descriptor) |
| 36 | + |
| 37 | + return { |
| 38 | + name, |
| 39 | + props, |
| 40 | + slots |
| 41 | + } |
| 42 | + }) |
| 43 | + ) |
| 44 | + }) |
| 45 | + |
| 46 | + nuxt.hook('nitro:config', (nitroConfig) => { |
| 47 | + nitroConfig.handlers = nitroConfig.handlers || [] |
| 48 | + nitroConfig.virtual = nitroConfig.virtual || {} |
| 49 | + |
| 50 | + nitroConfig.virtual['#meta/virtual/meta'] = () => `export const components = ${JSON.stringify(componentMeta)}` |
| 51 | + |
| 52 | + nitroConfig.handlers.push({ |
58 | 53 | route: '/api/component-meta',
|
59 |
| - handler: resolveModule('./server/api/component-meta.get', { paths: runtimeDir }) |
| 54 | + handler: resolver.resolve('./runtime/server/api/component-meta.get') |
60 | 55 | })
|
61 |
| - addServerMiddleware({ |
| 56 | + |
| 57 | + nitroConfig.handlers.push({ |
62 | 58 | route: '/api/component-meta/:component?',
|
63 |
| - handler: resolveModule('./server/api/component-meta.get', { paths: runtimeDir }) |
| 59 | + handler: resolver.resolve('./runtime/server/api/component-meta.get') |
64 | 60 | })
|
65 |
| - } |
| 61 | + }) |
66 | 62 | }
|
67 | 63 | })
|
68 | 64 |
|
|
0 commit comments