mirror of https://github.com/webpack/webpack.git
				
				
				
			
		
			
				
	
	
		
			302 lines
		
	
	
		
			5.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
			
		
		
	
	
			302 lines
		
	
	
		
			5.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
| const walkCssTokens = require("../lib/css/walkCssTokens");
 | |
| 
 | |
| describe("walkCssTokens", () => {
 | |
| 	const test = (name, content, fn) => {
 | |
| 		it(`should ${name}`, () => {
 | |
| 			const results = [];
 | |
| 			walkCssTokens(content, {
 | |
| 				isSelector: () => true,
 | |
| 				url: (input, s, e, cs, ce) => {
 | |
| 					results.push(["url", input.slice(s, e), input.slice(cs, ce)]);
 | |
| 					return e;
 | |
| 				},
 | |
| 				leftCurlyBracket: (input, s, e) => {
 | |
| 					results.push(["leftCurlyBracket", input.slice(s, e)]);
 | |
| 					return e;
 | |
| 				},
 | |
| 				rightCurlyBracket: (input, s, e) => {
 | |
| 					results.push(["rightCurlyBracket", input.slice(s, e)]);
 | |
| 					return e;
 | |
| 				},
 | |
| 				leftParenthesis: (input, s, e) => {
 | |
| 					results.push(["leftParenthesis", input.slice(s, e)]);
 | |
| 					return e;
 | |
| 				},
 | |
| 				rightParenthesis: (input, s, e) => {
 | |
| 					results.push(["rightParenthesis", input.slice(s, e)]);
 | |
| 					return e;
 | |
| 				},
 | |
| 				semicolon: (input, s, e) => {
 | |
| 					results.push(["semicolon", input.slice(s, e)]);
 | |
| 					return e;
 | |
| 				},
 | |
| 				comma: (input, s, e) => {
 | |
| 					results.push(["comma", input.slice(s, e)]);
 | |
| 					return e;
 | |
| 				},
 | |
| 				pseudoClass: (input, s, e) => {
 | |
| 					results.push(["pseudoClass", input.slice(s, e)]);
 | |
| 					return e;
 | |
| 				},
 | |
| 				pseudoFunction: (input, s, e) => {
 | |
| 					results.push(["pseudoFunction", input.slice(s, e)]);
 | |
| 					return e;
 | |
| 				},
 | |
| 				atKeyword: (input, s, e) => {
 | |
| 					results.push(["atKeyword", input.slice(s, e)]);
 | |
| 					return e;
 | |
| 				},
 | |
| 				class: (input, s, e) => {
 | |
| 					results.push(["class", input.slice(s, e)]);
 | |
| 					return e;
 | |
| 				},
 | |
| 				identifier: (input, s, e) => {
 | |
| 					results.push(["identifier", input.slice(s, e)]);
 | |
| 					return e;
 | |
| 				},
 | |
| 				id: (input, s, e) => {
 | |
| 					results.push(["id", input.slice(s, e)]);
 | |
| 					return e;
 | |
| 				}
 | |
| 			});
 | |
| 			fn(expect(results));
 | |
| 		});
 | |
| 	};
 | |
| 	test(
 | |
| 		"parse urls",
 | |
| 		`body {
 | |
| 	background: url(
 | |
| 		https://example\\2f4a8f.com\
 | |
| /image.png
 | |
| 	)
 | |
| }
 | |
| --element\\ name.class\\ name#_id {
 | |
| 	background: url(  "https://example.com/some url \\"with\\" 'spaces'.png"   )  url('https://example.com/\\'"quotes"\\'.png');
 | |
| }`,
 | |
| 		e =>
 | |
| 			e.toMatchInlineSnapshot(`
 | |
| 			Array [
 | |
| 			  Array [
 | |
| 			    "identifier",
 | |
| 			    "body",
 | |
| 			  ],
 | |
| 			  Array [
 | |
| 			    "leftCurlyBracket",
 | |
| 			    "{",
 | |
| 			  ],
 | |
| 			  Array [
 | |
| 			    "identifier",
 | |
| 			    "background",
 | |
| 			  ],
 | |
| 			  Array [
 | |
| 			    "url",
 | |
| 			    "url(
 | |
| 					https://example\\\\2f4a8f.com/image.png
 | |
| 				)",
 | |
| 			    "https://example\\\\2f4a8f.com/image.png",
 | |
| 			  ],
 | |
| 			  Array [
 | |
| 			    "rightCurlyBracket",
 | |
| 			    "}",
 | |
| 			  ],
 | |
| 			  Array [
 | |
| 			    "identifier",
 | |
| 			    "--element\\\\ name",
 | |
| 			  ],
 | |
| 			  Array [
 | |
| 			    "class",
 | |
| 			    ".class\\\\ name",
 | |
| 			  ],
 | |
| 			  Array [
 | |
| 			    "id",
 | |
| 			    "#_id",
 | |
| 			  ],
 | |
| 			  Array [
 | |
| 			    "leftCurlyBracket",
 | |
| 			    "{",
 | |
| 			  ],
 | |
| 			  Array [
 | |
| 			    "identifier",
 | |
| 			    "background",
 | |
| 			  ],
 | |
| 			  Array [
 | |
| 			    "rightParenthesis",
 | |
| 			    ")",
 | |
| 			  ],
 | |
| 			  Array [
 | |
| 			    "rightParenthesis",
 | |
| 			    ")",
 | |
| 			  ],
 | |
| 			  Array [
 | |
| 			    "semicolon",
 | |
| 			    ";",
 | |
| 			  ],
 | |
| 			  Array [
 | |
| 			    "rightCurlyBracket",
 | |
| 			    "}",
 | |
| 			  ],
 | |
| 			]
 | |
| 		`)
 | |
| 	);
 | |
| 
 | |
| 	test(
 | |
| 		"parse pseudo functions",
 | |
| 		`:local(.class#id, .class:not(*:hover)) { color: red; }
 | |
| :import(something from ":somewhere") {}`,
 | |
| 		e =>
 | |
| 			e.toMatchInlineSnapshot(`
 | |
| 			Array [
 | |
| 			  Array [
 | |
| 			    "pseudoFunction",
 | |
| 			    ":local(",
 | |
| 			  ],
 | |
| 			  Array [
 | |
| 			    "class",
 | |
| 			    ".class",
 | |
| 			  ],
 | |
| 			  Array [
 | |
| 			    "id",
 | |
| 			    "#id",
 | |
| 			  ],
 | |
| 			  Array [
 | |
| 			    "comma",
 | |
| 			    ",",
 | |
| 			  ],
 | |
| 			  Array [
 | |
| 			    "class",
 | |
| 			    ".class",
 | |
| 			  ],
 | |
| 			  Array [
 | |
| 			    "pseudoFunction",
 | |
| 			    ":not(",
 | |
| 			  ],
 | |
| 			  Array [
 | |
| 			    "pseudoClass",
 | |
| 			    ":hover",
 | |
| 			  ],
 | |
| 			  Array [
 | |
| 			    "rightParenthesis",
 | |
| 			    ")",
 | |
| 			  ],
 | |
| 			  Array [
 | |
| 			    "rightParenthesis",
 | |
| 			    ")",
 | |
| 			  ],
 | |
| 			  Array [
 | |
| 			    "leftCurlyBracket",
 | |
| 			    "{",
 | |
| 			  ],
 | |
| 			  Array [
 | |
| 			    "identifier",
 | |
| 			    "color",
 | |
| 			  ],
 | |
| 			  Array [
 | |
| 			    "identifier",
 | |
| 			    "red",
 | |
| 			  ],
 | |
| 			  Array [
 | |
| 			    "semicolon",
 | |
| 			    ";",
 | |
| 			  ],
 | |
| 			  Array [
 | |
| 			    "rightCurlyBracket",
 | |
| 			    "}",
 | |
| 			  ],
 | |
| 			  Array [
 | |
| 			    "pseudoFunction",
 | |
| 			    ":import(",
 | |
| 			  ],
 | |
| 			  Array [
 | |
| 			    "identifier",
 | |
| 			    "something",
 | |
| 			  ],
 | |
| 			  Array [
 | |
| 			    "identifier",
 | |
| 			    "from",
 | |
| 			  ],
 | |
| 			  Array [
 | |
| 			    "rightParenthesis",
 | |
| 			    ")",
 | |
| 			  ],
 | |
| 			  Array [
 | |
| 			    "leftCurlyBracket",
 | |
| 			    "{",
 | |
| 			  ],
 | |
| 			  Array [
 | |
| 			    "rightCurlyBracket",
 | |
| 			    "}",
 | |
| 			  ],
 | |
| 			]
 | |
| 		`)
 | |
| 	);
 | |
| 
 | |
| 	test(
 | |
| 		"parse at rules",
 | |
| 		`@media (max-size: 100px) {
 | |
| 	@import "external.css";
 | |
| 	body { color: red; }
 | |
| }`,
 | |
| 		e =>
 | |
| 			e.toMatchInlineSnapshot(`
 | |
| 			Array [
 | |
| 			  Array [
 | |
| 			    "atKeyword",
 | |
| 			    "@media",
 | |
| 			  ],
 | |
| 			  Array [
 | |
| 			    "leftParenthesis",
 | |
| 			    "(",
 | |
| 			  ],
 | |
| 			  Array [
 | |
| 			    "identifier",
 | |
| 			    "max-size",
 | |
| 			  ],
 | |
| 			  Array [
 | |
| 			    "rightParenthesis",
 | |
| 			    ")",
 | |
| 			  ],
 | |
| 			  Array [
 | |
| 			    "leftCurlyBracket",
 | |
| 			    "{",
 | |
| 			  ],
 | |
| 			  Array [
 | |
| 			    "atKeyword",
 | |
| 			    "@import",
 | |
| 			  ],
 | |
| 			  Array [
 | |
| 			    "semicolon",
 | |
| 			    ";",
 | |
| 			  ],
 | |
| 			  Array [
 | |
| 			    "identifier",
 | |
| 			    "body",
 | |
| 			  ],
 | |
| 			  Array [
 | |
| 			    "leftCurlyBracket",
 | |
| 			    "{",
 | |
| 			  ],
 | |
| 			  Array [
 | |
| 			    "identifier",
 | |
| 			    "color",
 | |
| 			  ],
 | |
| 			  Array [
 | |
| 			    "identifier",
 | |
| 			    "red",
 | |
| 			  ],
 | |
| 			  Array [
 | |
| 			    "semicolon",
 | |
| 			    ";",
 | |
| 			  ],
 | |
| 			  Array [
 | |
| 			    "rightCurlyBracket",
 | |
| 			    "}",
 | |
| 			  ],
 | |
| 			  Array [
 | |
| 			    "rightCurlyBracket",
 | |
| 			    "}",
 | |
| 			  ],
 | |
| 			]
 | |
| 		`)
 | |
| 	);
 | |
| });
 |