@sprlab/wccompiler 0.11.0 → 0.11.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -76,12 +76,14 @@ export function wccVuePlugin(options = {}) {
76
76
 
77
77
  // Transform v-model:propName="expr" on custom elements (tags with hyphens)
78
78
  // Also handles modifiers: v-model:propName.trim.number="expr"
79
- // → :propName="expr" @wcc:model="$event.detail.prop === 'propName' && (expr = value)"
79
+ // → :propName="expr" + merged @wcc:model handler
80
80
  // with modifiers applied to the extracted value:
81
81
  // .trim → value.trim() (for string values)
82
82
  // .number → Number(value)
83
83
  // .lazy → no-op for custom elements
84
- // Run in a loop to handle multiple v-model on the same element
84
+ //
85
+ // Multiple v-model:prop on the same element are merged into a single
86
+ // @wcc:model handler with semicolons (avoids Vue "Duplicate attribute" error).
85
87
  let prev = ''
86
88
  while (prev !== result) {
87
89
  prev = result
@@ -99,14 +101,23 @@ export function wccVuePlugin(options = {}) {
99
101
  }
100
102
  // .lazy is a no-op for custom elements (they already use change events)
101
103
  }
102
- return `${prefix}:${prop}="${expr}" @wcc:model="$event.detail.prop === '${prop}' && (${expr} = ${value})"`
104
+ const handler = `$event.detail.prop === '${prop}' && (${expr} = ${value})`
105
+ // Check if there's already a @wcc:model on this element — append to it
106
+ if (prefix.includes('@wcc:model="')) {
107
+ const merged = prefix.replace(
108
+ /@wcc:model="([^"]*)"/,
109
+ (_, existing) => `@wcc:model="${existing}; ${handler}"`
110
+ )
111
+ return `${merged}:${prop}="${expr}"`
112
+ }
113
+ return `${prefix}:${prop}="${expr}" @wcc:model="${handler}"`
103
114
  }
104
115
  )
105
116
  }
106
117
 
107
118
  // Transform v-model="expr" (without argument) on custom elements
108
119
  // Also handles modifiers: v-model.trim.lazy="expr"
109
- // → :model-value="expr" @wcc:model="$event.detail.prop === 'modelValue' && (expr = value)"
120
+ // → :model-value="expr" + merged @wcc:model handler
110
121
  prev = ''
111
122
  while (prev !== result) {
112
123
  prev = result
@@ -122,11 +133,29 @@ export function wccVuePlugin(options = {}) {
122
133
  value = `Number(${value})`
123
134
  }
124
135
  }
125
- return `${prefix}:model-value="${expr}" @wcc:model="$event.detail.prop === 'modelValue' && (${expr} = ${value})"`
136
+ const handler = `$event.detail.prop === 'modelValue' && (${expr} = ${value})`
137
+ // Check if there's already a @wcc:model on this element — append to it
138
+ if (prefix.includes('@wcc:model="')) {
139
+ const merged = prefix.replace(
140
+ /@wcc:model="([^"]*)"/,
141
+ (_, existing) => `@wcc:model="${existing}; ${handler}"`
142
+ )
143
+ return `${merged}:model-value="${expr}"`
144
+ }
145
+ return `${prefix}:model-value="${expr}" @wcc:model="${handler}"`
126
146
  }
127
147
  )
128
148
  }
129
149
 
150
+ // Post-process: merge any duplicate @wcc:model attributes on the same element
151
+ // This handles the case where v-model (no arg) was before v-model:prop in source order
152
+ result = result.replace(
153
+ /<([\w]+-[\w-]*)((?:\s[^>]*?)?)@wcc:model="([^"]*)"((?:\s[^>]*?)?)@wcc:model="([^"]*)"([^>]*?)>/g,
154
+ (match, tag, before, handler1, middle, handler2, after) => {
155
+ return `<${tag}${before}@wcc:model="${handler1}; ${handler2}"${middle}${after}>`
156
+ }
157
+ )
158
+
130
159
  // ── Slot transforms ──
131
160
  // Transform <template #name>content</template> inside custom elements
132
161
  // → <div slot="name">content</div>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sprlab/wccompiler",
3
- "version": "0.11.0",
3
+ "version": "0.11.1",
4
4
  "description": "Zero-runtime compiler that transforms .wcc single-file components into native web components with signals-based reactivity",
5
5
  "type": "module",
6
6
  "exports": {