-
Notifications
You must be signed in to change notification settings - Fork 4.2k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Add support for arbitrary properties (#6161)
* Basic implementation + some failing tests for edge cases * Use asClass instead of nameClass * Solve edge cases around content with colons * Avoid duplicating work when parsing arbitrary properties * Update changelog
- Loading branch information
1 parent
56c1646
commit d261531
Showing
7 changed files
with
337 additions
and
59 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,61 @@ | ||
let matchingBrackets = new Map([ | ||
['{', '}'], | ||
['[', ']'], | ||
['(', ')'], | ||
]) | ||
let inverseMatchingBrackets = new Map( | ||
Array.from(matchingBrackets.entries()).map(([k, v]) => [v, k]) | ||
) | ||
|
||
let quotes = new Set(['"', "'", '`']) | ||
|
||
// Arbitrary values must contain balanced brackets (), [] and {}. Escaped | ||
// values don't count, and brackets inside quotes also don't count. | ||
// | ||
// E.g.: w-[this-is]w-[weird-and-invalid] | ||
// E.g.: w-[this-is\\]w-\\[weird-but-valid] | ||
// E.g.: content-['this-is-also-valid]-weirdly-enough'] | ||
export default function isValidArbitraryValue(value) { | ||
let stack = [] | ||
let inQuotes = false | ||
|
||
for (let i = 0; i < value.length; i++) { | ||
let char = value[i] | ||
|
||
if (char === ':' && !inQuotes && stack.length === 0) { | ||
return false | ||
} | ||
|
||
// Non-escaped quotes allow us to "allow" anything in between | ||
if (quotes.has(char) && value[i - 1] !== '\\') { | ||
inQuotes = !inQuotes | ||
} | ||
|
||
if (inQuotes) continue | ||
if (value[i - 1] === '\\') continue // Escaped | ||
|
||
if (matchingBrackets.has(char)) { | ||
stack.push(char) | ||
} else if (inverseMatchingBrackets.has(char)) { | ||
let inverse = inverseMatchingBrackets.get(char) | ||
|
||
// Nothing to pop from, therefore it is unbalanced | ||
if (stack.length <= 0) { | ||
return false | ||
} | ||
|
||
// Popped value must match the inverse value, otherwise it is unbalanced | ||
if (stack.pop() !== inverse) { | ||
return false | ||
} | ||
} | ||
} | ||
|
||
// If there is still something on the stack, it is also unbalanced | ||
if (stack.length > 0) { | ||
return false | ||
} | ||
|
||
// All good, totally balanced! | ||
return true | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.