diff --git a/packages/nuxt/src/components/plugins/islands-transform.ts b/packages/nuxt/src/components/plugins/islands-transform.ts
index 2b854b9bbc..9016f07986 100644
--- a/packages/nuxt/src/components/plugins/islands-transform.ts
+++ b/packages/nuxt/src/components/plugins/islands-transform.ts
@@ -38,6 +38,40 @@ export const IslandsTransformPlugin = (options: ServerOnlyComponentTransformPlug
return `
${code}
`
}
+ /**
+ * extract attributes from a node
+ */
+ function extractAttributes (attributes: Record, names: string[]) {
+ const extracted: Record = {}
+ for (const name of names) {
+ if (name in attributes) {
+ extracted[name] = attributes[name]!
+ delete attributes[name]
+ }
+ }
+ return extracted
+ }
+
+ function attributeToString (attributes: Record) {
+ return Object.entries(attributes).map(([name, value]) => value ? ` ${name}="${value}"` : ` ${name}`).join('')
+ }
+
+ function isBinding (attr: string): boolean {
+ return attr.startsWith(':')
+ }
+
+ function getPropsToString (bindings: Record): string {
+ const vfor = bindings['v-for']?.split(' in ').map((v: string) => v.trim()) as [string, string] | undefined
+ if (Object.keys(bindings).length === 0) { return 'undefined' }
+ const content = Object.entries(bindings).filter(b => b[0] && (b[0] !== '_bind' && b[0] !== 'v-for')).map(([name, value]) => isBinding(name) ? `[\`${name.slice(1)}\`]: ${value}` : `[\`${name}\`]: \`${value}\``).join(',')
+ const data = bindings._bind ? `__mergeProps(${bindings._bind}, { ${content} })` : `{ ${content} }`
+ if (!vfor) {
+ return `[${data}]`
+ } else {
+ return `__vforToArray(${vfor[1]}).map(${vfor[0]} => (${data}))`
+ }
+ }
+
return {
name: 'nuxt:server-only-component-transform',
enforce: 'pre',
@@ -145,40 +179,6 @@ export const IslandsTransformPlugin = (options: ServerOnlyComponentTransformPlug
}
})
-/**
- * extract attributes from a node
- */
-function extractAttributes (attributes: Record, names: string[]) {
- const extracted: Record = {}
- for (const name of names) {
- if (name in attributes) {
- extracted[name] = attributes[name]!
- delete attributes[name]
- }
- }
- return extracted
-}
-
-function attributeToString (attributes: Record) {
- return Object.entries(attributes).map(([name, value]) => value ? ` ${name}="${value}"` : ` ${name}`).join('')
-}
-
-function isBinding (attr: string): boolean {
- return attr.startsWith(':')
-}
-
-function getPropsToString (bindings: Record): string {
- const vfor = bindings['v-for']?.split(' in ').map((v: string) => v.trim()) as [string, string] | undefined
- if (Object.keys(bindings).length === 0) { return 'undefined' }
- const content = Object.entries(bindings).filter(b => b[0] && (b[0] !== '_bind' && b[0] !== 'v-for')).map(([name, value]) => isBinding(name) ? `[\`${name.slice(1)}\`]: ${value}` : `[\`${name}\`]: \`${value}\``).join(',')
- const data = bindings._bind ? `__mergeProps(${bindings._bind}, { ${content} })` : `{ ${content} }`
- if (!vfor) {
- return `[${data}]`
- } else {
- return `__vforToArray(${vfor[1]}).map(${vfor[0]} => (${data}))`
- }
-}
-
export const ComponentsChunkPlugin = createUnplugin((options: ComponentChunkOptions) => {
const { buildDir } = options
return {