@@ -3,13 +3,15 @@ import postcss from "postcss";
3
3
import stripIndent from "strip-indent" ;
4
4
import plugin from "../src" ;
5
5
6
- const strip = input =>
7
- stripIndent ( input ) . replace ( / ^ \n / , "" ) . replace ( / \s + $ / , "" ) ;
6
+ const strip = input => stripIndent ( input ) . trim ( ) ;
8
7
const compile = ( input , options ) =>
9
8
postcss ( [ plugin ( options ) ] )
10
9
. process ( input , options )
11
10
. catch ( e => Promise . reject ( e . message ) ) ;
12
11
const generateScopedName = name => `__scope__${ name } ` ;
12
+ const messagesPlugin = messages => ( css , result ) => {
13
+ result . messages . push ( ...messages ) ;
14
+ } ;
13
15
14
16
const runCSS = ( { fixture, expected, options } ) => {
15
17
return expect (
@@ -26,6 +28,28 @@ const runError = ({ fixture, error, options }) => {
26
28
) ;
27
29
} ;
28
30
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
+
29
53
test ( "scope selectors" , ( ) => {
30
54
return runCSS ( {
31
55
fixture : `
@@ -657,3 +681,192 @@ test("save :import statemtents", () => {
657
681
`
658
682
} ) ;
659
683
} ) ;
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