From 92273610270e2feef60bfca28e588ad7b9560e03 Mon Sep 17 00:00:00 2001 From: Daniel Roe Date: Thu, 10 Nov 2022 11:31:01 +0100 Subject: [PATCH] fix(nuxt): detect non-functional imports within page meta (#8881) --- packages/nuxt/src/pages/page-meta.ts | 22 +++++++++++++++++----- test/fixtures/basic/pages/index.vue | 5 ++++- test/fixtures/basic/some-exports.ts | 2 ++ 3 files changed, 23 insertions(+), 6 deletions(-) create mode 100644 test/fixtures/basic/some-exports.ts diff --git a/packages/nuxt/src/pages/page-meta.ts b/packages/nuxt/src/pages/page-meta.ts index e4a76cf28a..bb53f1bf50 100644 --- a/packages/nuxt/src/pages/page-meta.ts +++ b/packages/nuxt/src/pages/page-meta.ts @@ -2,7 +2,7 @@ import { pathToFileURL } from 'node:url' import { createUnplugin } from 'unplugin' import { parseQuery, parseURL, stringifyQuery } from 'ufo' import { findStaticImports, findExports, StaticImport, parseStaticImport } from 'mlly' -import type { CallExpression, Expression } from 'estree' +import type { CallExpression, Identifier, Expression } from 'estree' import { walk } from 'estree-walker' import MagicString from 'magic-string' import { isAbsolute, normalize } from 'pathe' @@ -93,6 +93,7 @@ export const PageMetaPlugin = createUnplugin((options: PageMetaPluginOptions) => } const importMap = new Map() + const addedImports = new Set() for (const i of imports) { const parsed = parseStaticImport(i) for (const name of [ @@ -118,14 +119,25 @@ export const PageMetaPlugin = createUnplugin((options: PageMetaPluginOptions) => let contents = `const __nuxt_page_meta = ${code!.slice(meta.start, meta.end) || '{}'}\nexport default __nuxt_page_meta` + function addImport (name: string | false) { + if (name && importMap.has(name)) { + const importValue = importMap.get(name)!.code + if (!addedImports.has(importValue)) { + contents = importMap.get(name)!.code + '\n' + contents + addedImports.add(importValue) + } + } + } + walk(meta, { enter (_node) { if (_node.type === 'CallExpression') { const node = _node as CallExpression & { start: number, end: number } - const name = 'name' in node.callee && node.callee.name - if (name && importMap.has(name)) { - contents = importMap.get(name)!.code + '\n' + contents - } + addImport('name' in node.callee && node.callee.name) + } + if (_node.type === 'Identifier') { + const node = _node as Identifier & { start: number, end: number } + addImport(node.name) } } }) diff --git a/test/fixtures/basic/pages/index.vue b/test/fixtures/basic/pages/index.vue index f7af073946..7935e551b0 100644 --- a/test/fixtures/basic/pages/index.vue +++ b/test/fixtures/basic/pages/index.vue @@ -23,6 +23,7 @@