@@ -3,13 +3,15 @@ import postcss from "postcss";
33import stripIndent from "strip-indent" ;
44import plugin from "../src" ;
55
6- const strip = input =>
7- stripIndent ( input ) . replace ( / ^ \n / , "" ) . replace ( / \s + $ / , "" ) ;
6+ const strip = input => stripIndent ( input ) . trim ( ) ;
87const compile = ( input , options ) =>
98 postcss ( [ plugin ( options ) ] )
109 . process ( input , options )
1110 . catch ( e => Promise . reject ( e . message ) ) ;
1211const generateScopedName = name => `__scope__${ name } ` ;
12+ const messagesPlugin = messages => ( css , result ) => {
13+ result . messages . push ( ...messages ) ;
14+ } ;
1315
1416const runCSS = ( { fixture, expected, options } ) => {
1517 return expect (
@@ -26,6 +28,28 @@ const runError = ({ fixture, error, options }) => {
2628 ) ;
2729} ;
2830
31+ const runMessages = ( {
32+ fixture,
33+ inputMessages = [ ] ,
34+ outputMessages,
35+ warnings = [ ] ,
36+ expected
37+ } ) => {
38+ const processor = postcss ( [
39+ messagesPlugin ( inputMessages ) ,
40+ plugin ( { generateScopedName } )
41+ ] ) . process ( strip ( fixture ) ) ;
42+ return processor . then ( result => {
43+ expect ( result . messages . filter ( msg => msg . type !== "warning" ) ) . toEqual (
44+ outputMessages
45+ ) ;
46+ expect ( result . warnings ( ) . map ( msg => msg . text ) ) . toEqual ( warnings ) ;
47+ if ( expected ) {
48+ expect ( result . css ) . toEqual ( strip ( expected ) ) ;
49+ }
50+ } ) ;
51+ } ;
52+
2953test ( "scope selectors" , ( ) => {
3054 return runCSS ( {
3155 fixture : `
@@ -657,3 +681,192 @@ test("save :import statemtents", () => {
657681 `
658682 } ) ;
659683} ) ;
684+
685+ test ( "dispatch messages with all locals" , ( ) => {
686+ return runMessages ( {
687+ fixture : `
688+ .foo {}
689+ .foo .bar {}
690+ :global .baz :local(.zab) {}
691+ ` ,
692+ outputMessages : [
693+ {
694+ plugin : "postcss-icss-selectors" ,
695+ type : "icss-scoped" ,
696+ name : "foo" ,
697+ value : "__scope__foo"
698+ } ,
699+ {
700+ plugin : "postcss-icss-selectors" ,
701+ type : "icss-scoped" ,
702+ name : "bar" ,
703+ value : "__scope__bar"
704+ } ,
705+ {
706+ plugin : "postcss-icss-selectors" ,
707+ type : "icss-scoped" ,
708+ name : "zab" ,
709+ value : "__scope__zab"
710+ }
711+ ]
712+ } ) ;
713+ } ) ;
714+
715+ test ( "icss-scoped contract" , ( ) => {
716+ const inputMessages = [
717+ {
718+ plugin : "previous-plugin" ,
719+ type : "icss-scoped" ,
720+ name : "foo" ,
721+ value : "__declared__foo"
722+ }
723+ ] ;
724+ return runMessages ( {
725+ fixture : `
726+ :export {
727+ foo: __declared__foo
728+ }
729+ .foo {}
730+ .bar {}
731+ .foo {}
732+ ` ,
733+ expected : `
734+ :export {
735+ foo: __scope__foo;
736+ bar: __scope__bar
737+ }
738+ .__scope__foo {}
739+ .__scope__bar {}
740+ .__scope__foo {}
741+ ` ,
742+ inputMessages,
743+ outputMessages : [
744+ ...inputMessages ,
745+ {
746+ plugin : "postcss-icss-selectors" ,
747+ type : "icss-scoped" ,
748+ name : "foo" ,
749+ value : "__scope__foo"
750+ } ,
751+ {
752+ plugin : "postcss-icss-selectors" ,
753+ type : "icss-scoped" ,
754+ name : "bar" ,
755+ value : "__scope__bar"
756+ }
757+ ] ,
758+ warnings : [ `'foo' already declared` ]
759+ } ) ;
760+ } ) ;
761+
762+ test ( "icss-composed contract" , ( ) => {
763+ const inputMessages = [
764+ {
765+ plugin : "previous-plugin" ,
766+ type : "icss-composed" ,
767+ name : "foo" ,
768+ value : "__compose__foo1"
769+ } ,
770+ {
771+ plugin : "previous-plugin" ,
772+ type : "icss-composed" ,
773+ name : "foo" ,
774+ value : "__compose__foo2"
775+ } ,
776+ {
777+ plugin : "previous-plugin" ,
778+ type : "icss-composed" ,
779+ name : "bar" ,
780+ value : "__compose__bar"
781+ }
782+ ] ;
783+ return runMessages ( {
784+ fixture : `
785+ :export {
786+ foo: __compose__foo;
787+ baz: __declared__baz
788+ }
789+ .foo {}
790+ .bar {}
791+ .baz {}
792+ ` ,
793+ expected : `
794+ :export {
795+ foo: __scope__foo __compose__foo1 __compose__foo2;
796+ baz: __scope__baz;
797+ bar: __scope__bar __compose__bar
798+ }
799+ .__scope__foo {}
800+ .__scope__bar {}
801+ .__scope__baz {}
802+ ` ,
803+ inputMessages,
804+ outputMessages : [
805+ ...inputMessages ,
806+ {
807+ plugin : "postcss-icss-selectors" ,
808+ type : "icss-scoped" ,
809+ name : "foo" ,
810+ value : "__scope__foo"
811+ } ,
812+ {
813+ plugin : "postcss-icss-selectors" ,
814+ type : "icss-scoped" ,
815+ name : "bar" ,
816+ value : "__scope__bar"
817+ } ,
818+ {
819+ plugin : "postcss-icss-selectors" ,
820+ type : "icss-scoped" ,
821+ name : "baz" ,
822+ value : "__scope__baz"
823+ }
824+ ]
825+ } ) ;
826+ } ) ;
827+
828+ test ( "icss-value contract" , ( ) => {
829+ const inputMessages = [
830+ {
831+ plugin : "previous-plugin" ,
832+ type : "icss-value" ,
833+ name : "foo" ,
834+ value : "__declared__foo"
835+ } ,
836+ {
837+ plugin : "previous-plugin" ,
838+ type : "icss-value" ,
839+ name : "bar" ,
840+ value : "__declared__bar"
841+ }
842+ ] ;
843+ return runMessages ( {
844+ fixture : `
845+ :export {
846+ foo: __declared__foo
847+ }
848+ .__declared__foo {}
849+ .__declared__bar {}
850+ .baz {}
851+ ` ,
852+ expected : `
853+ :export {
854+ foo: __declared__foo;
855+ baz: __scope__baz
856+ }
857+ .__declared__foo {}
858+ .__declared__bar {}
859+ .__scope__baz {}
860+ ` ,
861+ inputMessages,
862+ outputMessages : [
863+ ...inputMessages ,
864+ {
865+ plugin : "postcss-icss-selectors" ,
866+ type : "icss-scoped" ,
867+ name : "baz" ,
868+ value : "__scope__baz"
869+ }
870+ ]
871+ } ) ;
872+ } ) ;
0 commit comments