Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
<script module>
export { mySnippet };
</script>

{#snippet mySnippet()}
snippet!
{/snippet}
63 changes: 41 additions & 22 deletions packages/vite/src/node/__tests__/scan.spec.ts
Original file line number Diff line number Diff line change
@@ -1,10 +1,22 @@
import path from 'node:path'
import { describe, expect, test } from 'vitest'
import { commentRE, importsRE, scriptRE } from '../optimizer/scan'
import {
ScanEnvironment,
commentRE,
importsRE,
scanImports,
scriptRE,
} from '../optimizer/scan'
import { multilineCommentsRE, singlelineCommentsRE } from '../utils'
import { createServer, createServerModuleRunner } from '..'
import { createServer, createServerModuleRunner, resolveConfig } from '..'

describe('optimizer-scan:script-test', () => {
const execScriptRE = (input: string) => {
const result = scriptRE.exec(input)
scriptRE.lastIndex = 0
return result
}

const scriptContent = `import { defineComponent } from 'vue'
import ScriptDevelopPane from './ScriptDevelopPane.vue';
export default defineComponent({
Expand All @@ -14,24 +26,21 @@ describe('optimizer-scan:script-test', () => {
})`

test('component return value test', () => {
scriptRE.lastIndex = 0
const [, tsOpenTag, tsContent] = scriptRE.exec(
const [, tsOpenTag, tsContent] = execScriptRE(
`<script lang="ts">${scriptContent}</script>`,
)!
expect(tsOpenTag).toEqual('<script lang="ts">')
expect(tsContent).toEqual(scriptContent)

scriptRE.lastIndex = 0
const [, openTag, content] = scriptRE.exec(
const [, openTag, content] = execScriptRE(
`<script>${scriptContent}</script>`,
)!
expect(openTag).toEqual('<script>')
expect(content).toEqual(scriptContent)
})

test('include comments test', () => {
scriptRE.lastIndex = 0
const ret = scriptRE.exec(
const ret = execScriptRE(
`<template>
<!-- <script >var test1 = null</script> -->
<!-- <script >var test2 = null</script> -->
Expand All @@ -41,35 +50,26 @@ describe('optimizer-scan:script-test', () => {
})

test('components with script keyword test', () => {
scriptRE.lastIndex = 0
let ret = scriptRE.exec(`<template><script-develop-pane/></template>`)
let ret = execScriptRE(`<template><script-develop-pane/></template>`)
expect(ret).toBe(null)

scriptRE.lastIndex = 0
ret = scriptRE.exec(
ret = execScriptRE(
`<template><script-develop-pane></script-develop-pane></template>`,
)
expect(ret).toBe(null)

scriptRE.lastIndex = 0
ret = scriptRE.exec(
ret = execScriptRE(
`<template><script-develop-pane > content </script-develop-pane></template>`,
)
expect(ret).toBe(null)
})

test('ordinary script tag test', () => {
scriptRE.lastIndex = 0
const [, tag, content] = scriptRE.exec(
`<script >var test = null</script>`,
)!
const [, tag, content] = execScriptRE(`<script >var test = null</script>`)!
expect(tag).toEqual('<script >')
expect(content).toEqual('var test = null')

scriptRE.lastIndex = 0
const [, tag1, content1] = scriptRE.exec(
`<script>var test = null</script>`,
)!
const [, tag1, content1] = execScriptRE(`<script>var test = null</script>`)!
expect(tag1).toEqual('<script>')
expect(content1).toEqual('var test = null')
})
Expand Down Expand Up @@ -126,6 +126,25 @@ describe('optimizer-scan:script-test', () => {
})
})

test('scan svelte', async () => {
const config = await resolveConfig(
{
configFile: false,
root: path.join(import.meta.dirname, 'fixtures', 'scan-svelte'),
optimizeDeps: {
include: [],
entries: ['./svelte-snippet.svelte'],
extensions: ['.svelte'],
},
},
'serve',
)
const environment = new ScanEnvironment('client', config)
await environment.init()
const { result } = scanImports(environment)
await result
})

test('scan jsx-runtime', async (ctx) => {
const server = await createServer({
configFile: false,
Expand Down
11 changes: 11 additions & 0 deletions packages/vite/src/node/optimizer/scan.ts
Original file line number Diff line number Diff line change
Expand Up @@ -477,6 +477,12 @@ function esbuildScanPlugin(
external: true,
}))

// dummy module for Svelte file with snippets
build.onResolve({ filter: /^svelte-snippet-dummy:/ }, ({ path }) => ({
path,
external: true,
}))

// local scripts (`<script>` in Svelte and `<script setup>` in Vue)
build.onResolve({ filter: virtualModuleRE }, ({ path }) => {
return {
Expand Down Expand Up @@ -604,6 +610,11 @@ function esbuildScanPlugin(
if (!isModule) {
addedImport = true
js += `import ${virtualModulePath}\n`
} else if (raw.includes('#snippet')) {
// <script module> in files with #snippet contains exports that are not declared
// skip scanning the script content
addedImport = true
js += `export * from 'svelte-snippet-dummy:${normalizePath(p)}'\n`
}
}

Expand Down
Loading