@@ -6,16 +6,27 @@ import {createMark} from './mark.js'
66import { createAbility } from './ability.js'
77
88const attrChangedCallback = Symbol ( )
9+ const serializeAttributeName = Symbol ( )
910
1011export interface Attrable {
1112 [ key : PropertyKey ] : unknown
13+ [ serializeAttributeName ] ( name : PropertyKey ) : string
1214 [ attrChangedCallback ] ( changed : Map < PropertyKey , unknown > ) : void
1315}
1416
1517export interface AttrableClass {
1618 new ( ) : Attrable
1719}
1820
21+ export const deprecatedDataPrefixedAttrs = createAbility (
22+ < T extends CustomElementClass > ( Class : T ) : T =>
23+ class extends controllable ( Class ) {
24+ [ serializeAttributeName ] ( name : PropertyKey ) {
25+ return `data-${ dasherize ( name ) } `
26+ }
27+ }
28+ )
29+
1930const Identity = ( v : unknown ) => v
2031let setFromMutation = false
2132const attrs = new WeakMap < Element , Map < string , PropertyKey > > ( )
@@ -47,7 +58,7 @@ const [attr, getAttr, initializeAttrs] = createMark<Element & Attrable>(
4758 initialValue = access . value
4859 }
4960 let value = initialValue
50- const attributeName = dasherize ( name )
61+ const attributeName = instance [ serializeAttributeName ] ( name )
5162 const setCallback = ( kind === 'method' ? access . value : access . set ) || Identity
5263 const getCallback = access . get || ( ( ) => value )
5364 if ( ! attrs . get ( instance ) ) attrs . set ( instance , new Map ( ) )
@@ -97,16 +108,21 @@ export const attrable = createAbility(
97108 constructor ( ) {
98109 super ( )
99110 initializeAttrs ( this )
100- observer . observe ( this , { attributeFilter : Array . from ( getAttr ( this ) ) . map ( dasherize ) } )
111+ const attributeFilter = Array . from ( getAttr ( this ) ) . map ( name => this [ serializeAttributeName ] ( name ) )
112+ observer . observe ( this , { attributeFilter} )
113+ }
114+
115+ [ serializeAttributeName ] ( name : PropertyKey ) {
116+ return dasherize ( name )
101117 }
102118
103119 [ attrChangedCallback ] ( changed : Map < PropertyKey , unknown > ) {
104120 if ( ! this . isConnected ) return
105121 for ( const [ name , value ] of changed ) {
106122 if ( typeof value === 'boolean' ) {
107- this . toggleAttribute ( dasherize ( name ) , value )
123+ this . toggleAttribute ( this [ serializeAttributeName ] ( name ) , value )
108124 } else {
109- this . setAttribute ( dasherize ( name ) , String ( value ) )
125+ this . setAttribute ( this [ serializeAttributeName ] ( name ) , String ( value ) )
110126 }
111127 }
112128 }
0 commit comments