You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					101 lines
				
				3.7 KiB
			
		
		
			
		
	
	
					101 lines
				
				3.7 KiB
			| 
											3 years ago
										 | "use strict"; | ||
|  | 
 | ||
|  | Object.defineProperty(exports, "__esModule", { | ||
|  |   value: true | ||
|  | }); | ||
|  | exports.stripLineComment = exports.minifyRawValues = exports.minifyRaw = exports.minifyCookedValues = exports.minifyCooked = exports.compressSymbols = void 0; | ||
|  | 
 | ||
|  | var _difference = _interopRequireDefault(require("lodash/difference")); | ||
|  | 
 | ||
|  | var _placeholderUtils = require("../css/placeholderUtils"); | ||
|  | 
 | ||
|  | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } | ||
|  | 
 | ||
|  | const injectUniquePlaceholders = strArr => { | ||
|  |   let i = 0; | ||
|  |   return strArr.reduce((str, val, index, arr) => { | ||
|  |     return str + val + (index < arr.length - 1 ? (0, _placeholderUtils.makePlaceholder)(i++) : ''); | ||
|  |   }, ''); | ||
|  | }; | ||
|  | 
 | ||
|  | const makeMultilineCommentRegex = newlinePattern => new RegExp('\\/\\*[^!](.|' + newlinePattern + ')*?\\*\\/', 'g'); | ||
|  | 
 | ||
|  | const lineCommentStart = /\/\//g; | ||
|  | const symbolRegex = /(\s*[;:{},]\s*)/g; // Counts occurences of substr inside str
 | ||
|  | 
 | ||
|  | const countOccurences = (str, substr) => str.split(substr).length - 1; // Joins substrings until predicate returns true
 | ||
|  | 
 | ||
|  | 
 | ||
|  | const reduceSubstr = (substrs, join, predicate) => { | ||
|  |   const length = substrs.length; | ||
|  |   let res = substrs[0]; | ||
|  | 
 | ||
|  |   if (length === 1) { | ||
|  |     return res; | ||
|  |   } | ||
|  | 
 | ||
|  |   for (let i = 1; i < length; i++) { | ||
|  |     if (predicate(res)) { | ||
|  |       break; | ||
|  |     } | ||
|  | 
 | ||
|  |     res += join + substrs[i]; | ||
|  |   } | ||
|  | 
 | ||
|  |   return res; | ||
|  | }; // Joins at comment starts when it's inside a string or parantheses
 | ||
|  | // effectively removing line comments
 | ||
|  | 
 | ||
|  | 
 | ||
|  | const stripLineComment = line => reduceSubstr(line.split(lineCommentStart), '//', str => !str.endsWith(':') && // NOTE: This is another guard against urls, if they're not inside strings or parantheses.
 | ||
|  | countOccurences(str, "'") % 2 === 0 && countOccurences(str, '"') % 2 === 0 && countOccurences(str, '(') === countOccurences(str, ')')); | ||
|  | 
 | ||
|  | exports.stripLineComment = stripLineComment; | ||
|  | 
 | ||
|  | const compressSymbols = code => code.split(symbolRegex).reduce((str, fragment, index) => { | ||
|  |   // Even-indices are non-symbol fragments
 | ||
|  |   if (index % 2 === 0) { | ||
|  |     return str + fragment; | ||
|  |   } // Only manipulate symbols outside of strings
 | ||
|  | 
 | ||
|  | 
 | ||
|  |   if (countOccurences(str, "'") % 2 === 0 && countOccurences(str, '"') % 2 === 0) { | ||
|  |     return str + fragment.trim(); | ||
|  |   } | ||
|  | 
 | ||
|  |   return str + fragment; | ||
|  | }, ''); // Detects lines that are exclusively line comments
 | ||
|  | 
 | ||
|  | 
 | ||
|  | exports.compressSymbols = compressSymbols; | ||
|  | 
 | ||
|  | const isLineComment = line => line.trim().startsWith('//'); // Creates a minifier with a certain linebreak pattern
 | ||
|  | 
 | ||
|  | 
 | ||
|  | const minify = linebreakPattern => { | ||
|  |   const linebreakRegex = new RegExp(linebreakPattern + '\\s*', 'g'); | ||
|  |   const multilineCommentRegex = makeMultilineCommentRegex(linebreakPattern); | ||
|  |   return code => { | ||
|  |     const newCode = code.replace(multilineCommentRegex, '\n') // Remove multiline comments
 | ||
|  |     .split(linebreakRegex) // Split at newlines
 | ||
|  |     .filter(line => line.length > 0 && !isLineComment(line)) // Removes lines containing only line comments
 | ||
|  |     .map(stripLineComment) // Remove line comments inside text
 | ||
|  |     .join(' '); // Rejoin all lines
 | ||
|  | 
 | ||
|  |     const eliminatedExpressionIndices = (0, _difference.default)(code.match(_placeholderUtils.placeholderRegex), newCode.match(_placeholderUtils.placeholderRegex)).map(x => parseInt(x.match(/\d+/)[0], 10)); | ||
|  |     return [compressSymbols(newCode), eliminatedExpressionIndices]; | ||
|  |   }; | ||
|  | }; | ||
|  | 
 | ||
|  | const minifyRaw = minify('(?:\\\\r|\\\\n|\\r|\\n)'); | ||
|  | exports.minifyRaw = minifyRaw; | ||
|  | const minifyCooked = minify('[\\r\\n]'); | ||
|  | exports.minifyCooked = minifyCooked; | ||
|  | 
 | ||
|  | const minifyRawValues = rawValues => (0, _placeholderUtils.splitByPlaceholders)(minifyRaw(injectUniquePlaceholders(rawValues)), false); | ||
|  | 
 | ||
|  | exports.minifyRawValues = minifyRawValues; | ||
|  | 
 | ||
|  | const minifyCookedValues = cookedValues => (0, _placeholderUtils.splitByPlaceholders)(minifyCooked(injectUniquePlaceholders(cookedValues)), false); | ||
|  | 
 | ||
|  | exports.minifyCookedValues = minifyCookedValues; |