@@ -45,6 +45,21 @@ const [provide, getProvide, initProvide] = createMark<CustomElement>(
4545 }
4646 }
4747)
48+ const [ provideAsync , getProvideAsync , initProvideAsync ] = createMark < CustomElement > (
49+ ( { name, kind} ) => {
50+ if ( kind === 'setter' ) throw new Error ( `@provide cannot decorate setter ${ String ( name ) } ` )
51+ if ( kind === 'method' ) throw new Error ( `@provide cannot decorate method ${ String ( name ) } ` )
52+ } ,
53+ ( instance : CustomElement , { name, kind, access} ) => {
54+ return {
55+ get : ( ) => ( kind === 'getter' ? access . get ! . call ( instance ) : access . value ) ,
56+ set : ( newValue : unknown ) => {
57+ access . set ?. call ( instance , newValue )
58+ for ( const callback of contexts . get ( instance ) ?. get ( name ) || [ ] ) callback ( newValue )
59+ }
60+ }
61+ }
62+ )
4863const [ consume , getConsume , initConsume ] = createMark < CustomElement > (
4964 ( { name, kind} ) => {
5065 if ( kind === 'method' ) throw new Error ( `@consume cannot decorate method ${ String ( name ) } ` )
@@ -75,7 +90,7 @@ const [consume, getConsume, initConsume] = createMark<CustomElement>(
7590
7691const disposes = new WeakMap < CustomElement , Map < PropertyKey , ( ) => void > > ( )
7792
78- export { consume , provide , getProvide , getConsume }
93+ export { consume , provide , provideAsync , getProvide , getProvideAsync , getConsume }
7994export const providable = createAbility (
8095 < T extends CustomElementClass > ( Class : T ) : T =>
8196 class extends Class {
@@ -86,18 +101,23 @@ export const providable = createAbility(
86101 constructor ( ...args : any [ ] ) {
87102 super ( ...args )
88103 initProvide ( this )
104+ initProvideAsync ( this )
89105 const provides = getProvide ( this )
90- if ( provides . size ) {
106+ const providesAsync = getProvideAsync ( this )
107+ if ( provides . size || providesAsync . size ) {
91108 if ( ! contexts . has ( this ) ) contexts . set ( this , new Map ( ) )
92109 const instanceContexts = contexts . get ( this ) !
93110 this . addEventListener ( 'context-request' , event => {
94111 if ( ! isContextEvent ( event ) ) return
95112 const name = event . context . name
96- if ( ! provides . has ( name ) ) return
113+ if ( ! provides . has ( name ) && ! providesAsync . has ( name ) ) return
97114 const value = this [ name ]
98115 const dispose = ( ) => instanceContexts . get ( name ) ?. delete ( callback )
99116 const eventCallback = event . callback
100- const callback = ( newValue : unknown ) => eventCallback ( newValue , dispose )
117+ let callback = ( newValue : unknown ) => eventCallback ( newValue , dispose )
118+ if ( providesAsync . has ( name ) ) {
119+ callback = async ( newValue : unknown ) => eventCallback ( await newValue , dispose )
120+ }
101121 if ( event . multiple ) {
102122 if ( ! instanceContexts . has ( name ) ) instanceContexts . set ( name , new Set ( ) )
103123 instanceContexts . get ( name ) ! . add ( callback )
0 commit comments