@sprlab/wccompiler 0.9.7 → 0.9.8
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 +32 -6
- package/package.json +1 -1
package/integrations/vue.js
CHANGED
|
@@ -64,28 +64,54 @@ export function wccVuePlugin(options = {}) {
|
|
|
64
64
|
let result = code
|
|
65
65
|
|
|
66
66
|
// Transform v-model:propName="expr" on custom elements (tags with hyphens)
|
|
67
|
+
// Also handles modifiers: v-model:propName.trim.number="expr"
|
|
67
68
|
// → :propName="expr" @propName-changed="expr = $event.detail"
|
|
69
|
+
// with modifiers applied to the event handler value:
|
|
70
|
+
// .trim → $event.detail.trim() (for string values)
|
|
71
|
+
// .number → Number($event.detail)
|
|
72
|
+
// .lazy → uses @propName-changed (same event, no difference for CE)
|
|
68
73
|
// Run in a loop to handle multiple v-model on the same element
|
|
69
74
|
let prev = ''
|
|
70
75
|
while (prev !== result) {
|
|
71
76
|
prev = result
|
|
72
77
|
result = result.replace(
|
|
73
|
-
/(<[\w]+-[\w-]*(?:\s[^>]*?)?)\bv-model:(\w+)="([^"]+)"/,
|
|
74
|
-
(match, prefix, prop, expr) => {
|
|
75
|
-
|
|
78
|
+
/(<[\w]+-[\w-]*(?:\s[^>]*?)?)\bv-model:(\w+)((?:\.\w+)*)="([^"]+)"/,
|
|
79
|
+
(match, prefix, prop, modifiersStr, expr) => {
|
|
80
|
+
const modifiers = modifiersStr ? modifiersStr.slice(1).split('.') : []
|
|
81
|
+
let value = '$event.detail'
|
|
82
|
+
// Apply modifiers in order
|
|
83
|
+
for (const mod of modifiers) {
|
|
84
|
+
if (mod === 'trim') {
|
|
85
|
+
value = `(typeof ${value} === 'string' ? (${value}).trim() : ${value})`
|
|
86
|
+
} else if (mod === 'number') {
|
|
87
|
+
value = `Number(${value})`
|
|
88
|
+
}
|
|
89
|
+
// .lazy is a no-op for custom elements (they already use change events)
|
|
90
|
+
}
|
|
91
|
+
return `${prefix}:${prop}="${expr}" @${prop}-changed="${expr} = ${value}"`
|
|
76
92
|
}
|
|
77
93
|
)
|
|
78
94
|
}
|
|
79
95
|
|
|
80
96
|
// Transform v-model="expr" (without argument) on custom elements
|
|
97
|
+
// Also handles modifiers: v-model.trim.lazy="expr"
|
|
81
98
|
// → :model-value="expr" @model-value-changed="expr = $event.detail"
|
|
82
99
|
prev = ''
|
|
83
100
|
while (prev !== result) {
|
|
84
101
|
prev = result
|
|
85
102
|
result = result.replace(
|
|
86
|
-
/(<[\w]+-[\w-]*(?:\s[^>]*?)?)\bv-model="([^"]+)"/,
|
|
87
|
-
(match, prefix, expr) => {
|
|
88
|
-
|
|
103
|
+
/(<[\w]+-[\w-]*(?:\s[^>]*?)?)\bv-model((?:\.\w+)*)="([^"]+)"/,
|
|
104
|
+
(match, prefix, modifiersStr, expr) => {
|
|
105
|
+
const modifiers = modifiersStr ? modifiersStr.slice(1).split('.') : []
|
|
106
|
+
let value = '$event.detail'
|
|
107
|
+
for (const mod of modifiers) {
|
|
108
|
+
if (mod === 'trim') {
|
|
109
|
+
value = `(typeof ${value} === 'string' ? (${value}).trim() : ${value})`
|
|
110
|
+
} else if (mod === 'number') {
|
|
111
|
+
value = `Number(${value})`
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
return `${prefix}:model-value="${expr}" @model-value-changed="${expr} = ${value}"`
|
|
89
115
|
}
|
|
90
116
|
)
|
|
91
117
|
}
|
package/package.json
CHANGED