@@ -811,11 +811,10 @@ describe('defineVaporCustomElement', () => {
811811 } )
812812 } )
813813
814- describe . todo ( 'provide/inject' , ( ) => {
814+ describe ( 'provide/inject' , ( ) => {
815815 const Consumer = defineVaporCustomElement ( {
816816 setup ( ) {
817817 const foo = inject < Ref > ( 'foo' ) !
818- // return () => h('div', foo.value)
819818 const n0 = template ( '<div> </div>' , true ) ( ) as any
820819 const x0 = txt ( n0 ) as any
821820 renderEffect ( ( ) => setText ( x0 , toDisplayString ( foo . value ) ) )
@@ -827,12 +826,6 @@ describe('defineVaporCustomElement', () => {
827826 test ( 'over nested usage' , async ( ) => {
828827 const foo = ref ( 'injected!' )
829828 const Provider = defineVaporCustomElement ( {
830- // provide: {
831- // foo,
832- // },
833- // render() {
834- // return h('my-consumer')
835- // },
836829 setup ( ) {
837830 provide ( 'foo' , foo )
838831 return createComponentWithFallback ( 'my-consumer' )
@@ -850,168 +843,168 @@ describe('defineVaporCustomElement', () => {
850843 expect ( consumer . shadowRoot ! . innerHTML ) . toBe ( `<div>changed!</div>` )
851844 } )
852845
853- // test('over slot composition', async () => {
854- // const foo = ref('injected!')
855- // const Provider = defineVaporCustomElement({
856- // provide: {
857- // foo,
858- // },
859- // render() {
860- // return renderSlot(this.$slots, 'default')
861- // },
862- // })
863- // customElements.define('my-provider-2', Provider)
846+ test ( 'over slot composition' , async ( ) => {
847+ const foo = ref ( 'injected!' )
848+ const Provider = defineVaporCustomElement ( {
849+ setup ( ) {
850+ provide ( 'foo' , foo )
851+ return createSlot ( 'default' , null )
852+ } ,
853+ } )
854+ customElements . define ( 'my-provider-2' , Provider )
864855
865- // container.innerHTML = `<my-provider-2><my-consumer></my-consumer><my-provider-2>`
866- // const provider = container.childNodes[0]
867- // const consumer = provider.childNodes[0] as VaporElement
868- // expect(consumer.shadowRoot!.innerHTML).toBe(`<div>injected!</div>`)
856+ container . innerHTML = `<my-provider-2><my-consumer></my-consumer><my-provider-2>`
857+ const provider = container . childNodes [ 0 ]
858+ const consumer = provider . childNodes [ 0 ] as VaporElement
859+ expect ( consumer . shadowRoot ! . innerHTML ) . toBe ( `<div>injected!</div>` )
869860
870- // foo.value = 'changed!'
871- // await nextTick()
872- // expect(consumer.shadowRoot!.innerHTML).toBe(`<div>changed!</div>`)
873- // })
861+ foo . value = 'changed!'
862+ await nextTick ( )
863+ expect ( consumer . shadowRoot ! . innerHTML ) . toBe ( `<div>changed!</div>` )
864+ } )
874865
875- // test('inherited from ancestors', async () => {
876- // const fooA = ref('FooA!')
877- // const fooB = ref('FooB!')
878- // const ProviderA = defineVaporCustomElement({
879- // provide: {
880- // fooA,
881- // },
882- // render() {
883- // return h('provider-b')
884- // },
885- // })
886- // const ProviderB = defineVaporCustomElement({
887- // provide: {
888- // fooB,
889- // },
890- // render() {
891- // return h('my-multi-consumer')
892- // },
893- // })
866+ test ( 'inherited from ancestors' , async ( ) => {
867+ const fooA = ref ( 'FooA!' )
868+ const fooB = ref ( 'FooB!' )
869+ const ProviderA = defineVaporCustomElement ( {
870+ setup ( ) {
871+ provide ( 'fooA' , fooA )
872+ return createComponentWithFallback ( 'provider-b' )
873+ } ,
874+ } )
875+ const ProviderB = defineVaporCustomElement ( {
876+ setup ( ) {
877+ provide ( 'fooB' , fooB )
878+ return createComponentWithFallback ( 'my-multi-consumer' )
879+ } ,
880+ } )
894881
895- // const Consumer = defineVaporCustomElement({
896- // setup() {
897- // const fooA = inject<Ref>('fooA')!
898- // const fooB = inject<Ref>('fooB')!
899- // return () => h('div', `${fooA.value} ${fooB.value}`)
900- // },
901- // })
902-
903- // customElements.define('provider-a', ProviderA)
904- // customElements.define('provider-b', ProviderB)
905- // customElements.define('my-multi-consumer', Consumer)
906- // container.innerHTML = `<provider-a><provider-a>`
907- // const providerA = container.childNodes[0] as VaporElement
908- // const providerB = providerA.shadowRoot!.childNodes[0] as VaporElement
909- // const consumer = providerB.shadowRoot!.childNodes[0] as VaporElement
910-
911- // expect(consumer.shadowRoot!.innerHTML).toBe(`<div>FooA! FooB!</div>`)
912-
913- // fooA.value = 'changedA!'
914- // fooB.value = 'changedB!'
915- // await nextTick()
916- // expect(consumer.shadowRoot!.innerHTML).toBe(
917- // `<div>changedA! changedB!</div>`,
918- // )
919- // })
882+ const Consumer = defineVaporCustomElement ( {
883+ setup ( ) {
884+ const fooA = inject < Ref > ( 'fooA' ) !
885+ const fooB = inject < Ref > ( 'fooB' ) !
886+ const n0 = template ( '<div> </div>' , true ) ( ) as any
887+ const x0 = txt ( n0 ) as any
888+ renderEffect ( ( ) => setText ( x0 , `${ fooA . value } ${ fooB . value } ` ) )
889+ return n0
890+ } ,
891+ } )
920892
921- // // #13212
922- // test('inherited from app context within nested elements', async () => {
923- // const outerValues: (string | undefined)[] = []
924- // const innerValues: (string | undefined)[] = []
925- // const innerChildValues: (string | undefined)[] = []
893+ customElements . define ( 'provider-a' , ProviderA )
894+ customElements . define ( 'provider-b' , ProviderB )
895+ customElements . define ( 'my-multi-consumer' , Consumer )
896+ container . innerHTML = `<provider-a><provider-a>`
897+ const providerA = container . childNodes [ 0 ] as VaporElement
898+ const providerB = providerA . shadowRoot ! . childNodes [ 0 ] as VaporElement
899+ const consumer = providerB . shadowRoot ! . childNodes [ 0 ] as VaporElement
926900
927- // const Outer = defineVaporCustomElement(
928- // {
929- // setup() {
930- // outerValues.push(
931- // inject<string>('shared'),
932- // inject<string>('outer'),
933- // inject<string>('inner'),
934- // )
935- // },
936- // render() {
937- // return h('div', [renderSlot(this.$slots, 'default')])
938- // },
939- // },
940- // {
941- // configureApp(app) {
942- // app.provide('shared', 'shared')
943- // app.provide('outer', 'outer')
944- // },
945- // },
946- // )
901+ expect ( consumer . shadowRoot ! . innerHTML ) . toBe ( `<div>FooA! FooB!</div>` )
947902
948- // const Inner = defineVaporCustomElement(
949- // {
950- // setup() {
951- // // ensure values are not self-injected
952- // provide('inner', 'inner-child')
953-
954- // innerValues.push(
955- // inject<string>('shared'),
956- // inject<string>('outer'),
957- // inject<string>('inner'),
958- // )
959- // },
960- // render() {
961- // return h('div', [renderSlot(this.$slots, 'default')])
962- // },
963- // },
964- // {
965- // configureApp(app) {
966- // app.provide('outer', 'override-outer')
967- // app.provide('inner', 'inner')
968- // },
969- // },
970- // )
903+ fooA . value = 'changedA!'
904+ fooB . value = 'changedB!'
905+ await nextTick ( )
906+ expect ( consumer . shadowRoot ! . innerHTML ) . toBe (
907+ `<div>changedA! changedB!</div>` ,
908+ )
909+ } )
971910
972- // const InnerChild = defineVaporCustomElement({
973- // setup() {
974- // innerChildValues.push(
975- // inject<string>('shared'),
976- // inject<string>('outer'),
977- // inject<string>('inner'),
978- // )
979- // },
980- // render() {
981- // return h('div')
982- // },
983- // })
911+ test ( 'inherited from app context within nested elements' , async ( ) => {
912+ const outerValues : ( string | undefined ) [ ] = [ ]
913+ const innerValues : ( string | undefined ) [ ] = [ ]
914+ const innerChildValues : ( string | undefined ) [ ] = [ ]
915+
916+ const Outer = defineVaporCustomElement (
917+ {
918+ setup ( ) {
919+ outerValues . push (
920+ inject < string > ( 'shared' ) ,
921+ inject < string > ( 'outer' ) ,
922+ inject < string > ( 'inner' ) ,
923+ )
924+
925+ const n0 = template ( '<div></div>' , true ) ( ) as any
926+ setInsertionState ( n0 , null )
927+ createSlot ( 'default' , null )
928+ return n0
929+ } ,
930+ } ,
931+ {
932+ configureApp ( app : any ) {
933+ app . provide ( 'shared' , 'shared' )
934+ app . provide ( 'outer' , 'outer' )
935+ } ,
936+ } as any ,
937+ )
984938
985- // customElements.define('provide-from-app-outer', Outer)
986- // customElements.define('provide-from-app-inner', Inner)
987- // customElements.define('provide-from-app-inner-child', InnerChild)
939+ const Inner = defineVaporCustomElement (
940+ {
941+ setup ( ) {
942+ // ensure values are not self-injected
943+ provide ( 'inner' , 'inner-child' )
944+
945+ innerValues . push (
946+ inject < string > ( 'shared' ) ,
947+ inject < string > ( 'outer' ) ,
948+ inject < string > ( 'inner' ) ,
949+ )
950+ const n0 = template ( '<div></div>' , true ) ( ) as any
951+ setInsertionState ( n0 , null )
952+ createSlot ( 'default' , null )
953+ return n0
954+ } ,
955+ } ,
956+ {
957+ configureApp ( app : any ) {
958+ app . provide ( 'outer' , 'override-outer' )
959+ app . provide ( 'inner' , 'inner' )
960+ } ,
961+ } as any ,
962+ )
988963
989- // container.innerHTML =
990- // '<provide-from-app-outer>' +
991- // '<provide-from-app-inner>' +
992- // '<provide-from-app-inner-child></provide-from-app-inner-child>' +
993- // '</provide-from-app-inner>' +
994- // '</provide-from-app-outer>'
964+ const InnerChild = defineVaporCustomElement ( {
965+ setup ( ) {
966+ innerChildValues . push (
967+ inject < string > ( 'shared' ) ,
968+ inject < string > ( 'outer' ) ,
969+ inject < string > ( 'inner' ) ,
970+ )
971+ const n0 = template ( '<div></div>' , true ) ( ) as any
972+ return n0
973+ } ,
974+ } )
995975
996- // const outer = container.childNodes[0] as VaporElement
997- // expect(outer.shadowRoot!.innerHTML).toBe('<div><slot></slot></div>')
976+ customElements . define ( 'provide-from-app-outer' , Outer )
977+ customElements . define ( 'provide-from-app-inner' , Inner )
978+ customElements . define ( 'provide-from-app-inner-child' , InnerChild )
998979
999- // expect('[Vue warn]: injection "inner" not found.').toHaveBeenWarnedTimes(
1000- // 1,
1001- // )
1002- // expect(
1003- // '[Vue warn]: App already provides property with key "outer" inherited from its parent element. ' +
1004- // 'It will be overwritten with the new value.',
1005- // ).toHaveBeenWarnedTimes(1)
1006-
1007- // expect(outerValues).toEqual(['shared', 'outer', undefined])
1008- // expect(innerValues).toEqual(['shared', 'override-outer', 'inner'])
1009- // expect(innerChildValues).toEqual([
1010- // 'shared',
1011- // 'override-outer',
1012- // 'inner-child',
1013- // ])
1014- // })
980+ container . innerHTML =
981+ '<provide-from-app-outer>' +
982+ '<provide-from-app-inner>' +
983+ '<provide-from-app-inner-child></provide-from-app-inner-child>' +
984+ '</provide-from-app-inner>' +
985+ '</provide-from-app-outer>'
986+
987+ const outer = container . childNodes [ 0 ] as VaporElement
988+ expect ( outer . shadowRoot ! . innerHTML ) . toBe (
989+ '<div><slot></slot><!--slot--></div>' ,
990+ )
991+
992+ expect ( '[Vue warn]: injection "inner" not found.' ) . toHaveBeenWarnedTimes (
993+ 1 ,
994+ )
995+ expect (
996+ '[Vue warn]: App already provides property with key "outer" inherited from its parent element. ' +
997+ 'It will be overwritten with the new value.' ,
998+ ) . toHaveBeenWarnedTimes ( 1 )
999+
1000+ expect ( outerValues ) . toEqual ( [ 'shared' , 'outer' , undefined ] )
1001+ expect ( innerValues ) . toEqual ( [ 'shared' , 'override-outer' , 'inner' ] )
1002+ expect ( innerChildValues ) . toEqual ( [
1003+ 'shared' ,
1004+ 'override-outer' ,
1005+ 'inner-child' ,
1006+ ] )
1007+ } )
10151008 } )
10161009
10171010 // describe('styles', () => {
0 commit comments