|
| 1 | +/* eslint-env jest */ |
| 2 | +import postcss from "postcss"; |
| 3 | +import stripIndent from "strip-indent"; |
| 4 | +import plugin from "../src"; |
| 5 | + |
| 6 | +const strip = input => stripIndent(input).replace(/^\n/, ""); |
| 7 | +const compile = input => postcss([plugin]).process(input); |
| 8 | +const runWarnings = input => |
| 9 | + compile(input).then(result => result.warnings().map(warning => warning.text)); |
| 10 | +const runCSS = input => compile(strip(input)).then(result => strip(result.css)); |
| 11 | + |
| 12 | +test("convert @import", () => { |
| 13 | + return expect( |
| 14 | + runCSS(` |
| 15 | + @import "foo.css"; |
| 16 | + @import 'bar.css'; |
| 17 | + @import url(baz.css); |
| 18 | + @import url("foobar.css"); |
| 19 | + @import url('foobarbaz.css'); |
| 20 | + .foo {} |
| 21 | + `) |
| 22 | + ).resolves.toEqual( |
| 23 | + strip(` |
| 24 | + :import('foo.css') { |
| 25 | + import: default |
| 26 | + } |
| 27 | + :import('bar.css') { |
| 28 | + import: default |
| 29 | + } |
| 30 | + :import('baz.css') { |
| 31 | + import: default |
| 32 | + } |
| 33 | + :import('foobar.css') { |
| 34 | + import: default |
| 35 | + } |
| 36 | + :import('foobarbaz.css') { |
| 37 | + import: default |
| 38 | + } |
| 39 | + .foo {} |
| 40 | + `) |
| 41 | + ); |
| 42 | +}); |
| 43 | + |
| 44 | +test("convert @import with media queries", () => { |
| 45 | + return expect( |
| 46 | + runCSS(` |
| 47 | + @import "foo.css" screen; |
| 48 | + @import 'bar.css' screen; |
| 49 | + @import url(baz.css) screen; |
| 50 | + @import url("foobar.css") screen and (min-width: 25em); |
| 51 | + @import url('foobarbaz.css') print, screen and (min-width: 25em); |
| 52 | + .foo {} |
| 53 | + `) |
| 54 | + ).resolves.toEqual( |
| 55 | + strip(` |
| 56 | + :import('foo.css') { |
| 57 | + import: default screen |
| 58 | + } |
| 59 | + :import('bar.css') { |
| 60 | + import: default screen |
| 61 | + } |
| 62 | + :import('baz.css') { |
| 63 | + import: default screen |
| 64 | + } |
| 65 | + :import('foobar.css') { |
| 66 | + import: default screen and (min-width: 25em) |
| 67 | + } |
| 68 | + :import('foobarbaz.css') { |
| 69 | + import: default print, screen and (min-width: 25em) |
| 70 | + } |
| 71 | + .foo {} |
| 72 | + `) |
| 73 | + ); |
| 74 | +}); |
| 75 | + |
| 76 | +test("convert camelcased @import", () => { |
| 77 | + return expect( |
| 78 | + runCSS(` |
| 79 | + @IMPORT 'path.css'; |
| 80 | + `) |
| 81 | + ).resolves.toEqual( |
| 82 | + strip(` |
| 83 | + :import('path.css') { |
| 84 | + import: default |
| 85 | + } |
| 86 | + `) |
| 87 | + ); |
| 88 | +}); |
| 89 | + |
| 90 | +test("not convert external uri", () => { |
| 91 | + const input = ` |
| 92 | + @import 'http://path'; |
| 93 | + @import 'https://path'; |
| 94 | + @import '//path'; |
| 95 | + `; |
| 96 | + return expect(runCSS(input)).resolves.toEqual(strip(input)); |
| 97 | +}); |
| 98 | + |
| 99 | +test("not warn when a user closed an import with ;", () => { |
| 100 | + return expect(runWarnings(`@import url('http://');`, [])).resolves.toEqual( |
| 101 | + [] |
| 102 | + ); |
| 103 | +}); |
| 104 | + |
| 105 | +test("warn when a user didn't close an import with ;", () => { |
| 106 | + return expect( |
| 107 | + runWarnings(`@import url('http://') :root{}`) |
| 108 | + ).resolves.toEqual([ |
| 109 | + "It looks like you didn't end your @import statement correctly. " + |
| 110 | + "Child nodes are attached to it." |
| 111 | + ]); |
| 112 | +}); |
| 113 | + |
| 114 | +test("warn on invalid url", () => { |
| 115 | + return expect( |
| 116 | + runWarnings(` |
| 117 | + @import foo-bar; |
| 118 | + @import ; |
| 119 | + @import ''; |
| 120 | + @import ""; |
| 121 | + @import " "; |
| 122 | + @import url(); |
| 123 | + @import url(''); |
| 124 | + @import url(""); |
| 125 | + `) |
| 126 | + ).resolves.toEqual([ |
| 127 | + `Unable to find uri in '@import foo-bar'`, |
| 128 | + `Unable to find uri in '@import '`, |
| 129 | + `Unable to find uri in '@import '''`, |
| 130 | + `Unable to find uri in '@import ""'`, |
| 131 | + `Unable to find uri in '@import " "'`, |
| 132 | + `Unable to find uri in '@import url()'`, |
| 133 | + `Unable to find uri in '@import url('')'`, |
| 134 | + `Unable to find uri in '@import url("")'` |
| 135 | + ]); |
| 136 | +}); |
| 137 | + |
| 138 | +test("convert only top-level @import", () => { |
| 139 | + const input = ` |
| 140 | + .foo { |
| 141 | + @import 'path.css'; |
| 142 | + } |
| 143 | + `; |
| 144 | + return expect(runCSS(input)).resolves.toEqual(strip(input)); |
| 145 | +}); |
0 commit comments