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

Commit

Permalink
fix(nuxt): detect non-functional imports within page meta (#8881)
Browse files Browse the repository at this point in the history
  • Loading branch information
danielroe authored Nov 10, 2022
1 parent be80360 commit 9227361
Show file tree
Hide file tree
Showing 3 changed files with 23 additions and 6 deletions.
22 changes: 17 additions & 5 deletions packages/nuxt/src/pages/page-meta.ts
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
export const importedValue = 'an imported value'
export const importedRE = /an imported regex/

0 comments on commit 9227361

Please sign in to comment.