@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.
- package/integrations/vue.js +34 -5
- package/package.json +1 -1
package/integrations/vue.js
CHANGED
|
@@ -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
|
|
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
|
-
//
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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