Skip to content
This repository has been archived by the owner on Apr 6, 2023. It is now read-only.

fix(nuxt): detect non-functional imports within page meta #8881

Merged
merged 1 commit into from Nov 10, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
22 changes: 17 additions & 5 deletions packages/nuxt/src/pages/page-meta.ts
Expand Up @@ -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'
Expand Down Expand Up @@ -93,6 +93,7 @@ export const PageMetaPlugin = createUnplugin((options: PageMetaPluginOptions) =>
}

const importMap = new Map<string, StaticImport>()
const addedImports = new Set()
for (const i of imports) {
const parsed = parseStaticImport(i)
for (const name of [
Expand All @@ -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)
}
}
})
Expand Down
5 changes: 4 additions & 1 deletion test/fixtures/basic/pages/index.vue
Expand Up @@ -23,14 +23,17 @@
<script setup lang="ts">
import { setupDevtoolsPlugin } from '@vue/devtools-api'
import { useRuntimeConfig } from '#imports'
import { importedValue, importedRE } from '~/some-exports'

setupDevtoolsPlugin({}, () => {}) as any

const config = useRuntimeConfig()

definePageMeta({
alias: '/some-alias',
other: ref('test')
other: ref('test'),
imported: importedValue,
something: importedRE.test('an imported regex')
})

// reset title template example
Expand Down
2 changes: 2 additions & 0 deletions test/fixtures/basic/some-exports.ts
@@ -0,0 +1,2 @@
export const importedValue = 'an imported value'
export const importedRE = /an imported regex/