|
81 | 81 | EnumToken[EnumToken["FractionTokenType"] = 69] = "FractionTokenType"; |
82 | 82 | EnumToken[EnumToken["IdenListTokenType"] = 70] = "IdenListTokenType"; |
83 | 83 | EnumToken[EnumToken["GridTemplateFuncTokenType"] = 71] = "GridTemplateFuncTokenType"; |
| 84 | + EnumToken[EnumToken["KeyFrameRuleNodeType"] = 72] = "KeyFrameRuleNodeType"; |
84 | 85 | /* aliases */ |
85 | 86 | EnumToken[EnumToken["Time"] = 25] = "Time"; |
86 | 87 | EnumToken[EnumToken["Iden"] = 7] = "Iden"; |
|
2510 | 2511 | * @param tokens |
2511 | 2512 | */ |
2512 | 2513 | function evaluate(tokens) { |
2513 | | - const nodes = inlineExpression(evaluateExpression(buildExpression(tokens))); |
| 2514 | + let nodes; |
| 2515 | + try { |
| 2516 | + nodes = inlineExpression(evaluateExpression(buildExpression(tokens))); |
| 2517 | + } |
| 2518 | + catch (e) { |
| 2519 | + // console.error({tokens}); |
| 2520 | + // console.error(e); |
| 2521 | + return tokens; |
| 2522 | + } |
2514 | 2523 | if (nodes.length <= 1) { |
2515 | 2524 | return nodes; |
2516 | 2525 | } |
|
3036 | 3045 | return result; |
3037 | 3046 | } |
3038 | 3047 | function updateSourceMap(node, options, cache, sourcemap, position, str) { |
3039 | | - if ([exports.EnumToken.RuleNodeType, exports.EnumToken.AtRuleNodeType].includes(node.typ)) { |
| 3048 | + if ([exports.EnumToken.RuleNodeType, exports.EnumToken.AtRuleNodeType, exports.EnumToken.KeyFrameRuleNodeType].includes(node.typ)) { |
3040 | 3049 | let src = node.loc?.src ?? ''; |
3041 | 3050 | let output = options.output ?? ''; |
3042 | 3051 | if (!(src in cache)) { |
|
3096 | 3105 | }, ''); |
3097 | 3106 | case exports.EnumToken.AtRuleNodeType: |
3098 | 3107 | case exports.EnumToken.RuleNodeType: |
| 3108 | + case exports.EnumToken.KeyFrameRuleNodeType: |
3099 | 3109 | if (data.typ == exports.EnumToken.AtRuleNodeType && !('chi' in data)) { |
3100 | 3110 | return `${indent}@${data.nam}${data.val === '' ? '' : options.indent || ' '}${data.val};`; |
3101 | 3111 | } |
|
6446 | 6456 | const position = map.get(tokens[0]); |
6447 | 6457 | const uniq = new Map; |
6448 | 6458 | parseTokens(tokens, { minify: true }).reduce((acc, curr, index, array) => { |
| 6459 | + if (curr.typ == exports.EnumToken.CommentTokenType) { |
| 6460 | + return acc; |
| 6461 | + } |
6449 | 6462 | if (curr.typ == exports.EnumToken.WhitespaceTokenType) { |
6450 | 6463 | if (trimWhiteSpace.includes(array[index - 1]?.typ) || |
6451 | 6464 | trimWhiteSpace.includes(array[index + 1]?.typ) || |
|
6467 | 6480 | return acc; |
6468 | 6481 | }, uniq); |
6469 | 6482 | const node = { |
6470 | | - typ: exports.EnumToken.RuleNodeType, |
| 6483 | + typ: context.typ == exports.EnumToken.AtRuleNodeType && context.nam == 'keyframes' ? exports.EnumToken.KeyFrameRuleNodeType : exports.EnumToken.RuleNodeType, |
6471 | 6484 | // @ts-ignore |
6472 | 6485 | sel: [...uniq.keys()].join(','), |
6473 | 6486 | chi: [] |
|
8405 | 8418 | // @ts-ignore |
8406 | 8419 | const features = Object.values(allFeatures).sort((a, b) => a.ordering - b.ordering); |
8407 | 8420 | function minify(ast, options = {}, recursive = false, errors, nestingContent, context = {}) { |
| 8421 | + // console.debug(JSON.stringify({ast}, null, 1)); |
8408 | 8422 | if (!('nodes' in context)) { |
8409 | | - context.nodes = new WeakSet; |
| 8423 | + context.nodes = new Set; |
8410 | 8424 | } |
8411 | 8425 | if (context.nodes.has(ast)) { |
8412 | 8426 | return ast; |
|
8637 | 8651 | } |
8638 | 8652 | if (shouldMerge) { |
8639 | 8653 | // @ts-ignore |
8640 | | - if ((node.typ == exports.EnumToken.RuleNodeType && node.sel == previous.sel) || |
| 8654 | + if (((node.typ == exports.EnumToken.RuleNodeType || node.typ == exports.EnumToken.KeyFrameRuleNodeType) && node.sel == previous.sel) || |
8641 | 8655 | // @ts-ignore |
8642 | 8656 | (node.typ == exports.EnumToken.AtRuleNodeType) && node.val != 'font-face' && node.val == previous.val) { |
8643 | 8657 | // @ts-ignore |
|
8656 | 8670 | nodeIndex = i; |
8657 | 8671 | continue; |
8658 | 8672 | } |
8659 | | - else if (node.typ == exports.EnumToken.RuleNodeType && previous?.typ == exports.EnumToken.RuleNodeType) { |
| 8673 | + else if (node.typ == previous?.typ && [exports.EnumToken.KeyFrameRuleNodeType, exports.EnumToken.RuleNodeType].includes(node.typ)) { |
8660 | 8674 | const intersect = diff(previous, node, reducer, options); |
8661 | 8675 | if (intersect != null) { |
8662 | 8676 | if (intersect.node1.chi.length == 0) { |
8663 | 8677 | // @ts-ignore |
8664 | 8678 | ast.chi.splice(i--, 1); |
8665 | 8679 | // @ts-ignore |
8666 | | - node = ast.chi[i]; |
| 8680 | + // node = ast.chi[i]; |
8667 | 8681 | } |
8668 | 8682 | else { |
8669 | 8683 | // @ts-ignore |
8670 | 8684 | ast.chi.splice(i, 1, intersect.node1); |
8671 | | - node = intersect.node1; |
| 8685 | + // node = ast.chi intersect.node1; |
8672 | 8686 | } |
8673 | 8687 | if (intersect.node2.chi.length == 0) { |
8674 | 8688 | // @ts-ignore |
8675 | 8689 | ast.chi.splice(nodeIndex, 1, intersect.result); |
8676 | | - previous = intersect.result; |
8677 | 8690 | } |
8678 | 8691 | else { |
8679 | 8692 | // @ts-ignore |
8680 | 8693 | ast.chi.splice(nodeIndex, 1, intersect.result, intersect.node2); |
8681 | | - previous = intersect.result; |
8682 | 8694 | // @ts-ignore |
8683 | | - i = nodeIndex; |
| 8695 | + i = (nodeIndex ?? 0) + 1; |
8684 | 8696 | } |
| 8697 | + reduceRuleSelector(intersect.result); |
| 8698 | + previous = intersect.result; |
| 8699 | + nodeIndex = i; |
8685 | 8700 | } |
8686 | 8701 | } |
8687 | 8702 | } |
|
8903 | 8918 | result.push([]); |
8904 | 8919 | continue; |
8905 | 8920 | } |
| 8921 | + if (chr == ':') { |
| 8922 | + if (str !== '') { |
| 8923 | + // @ts-ignore |
| 8924 | + result.at(-1).push(str); |
| 8925 | + str = ''; |
| 8926 | + } |
| 8927 | + if (buffer.charAt(i + 1) == ':') { |
| 8928 | + chr += buffer.charAt(++i); |
| 8929 | + } |
| 8930 | + str += chr; |
| 8931 | + continue; |
| 8932 | + } |
8906 | 8933 | str += chr; |
8907 | 8934 | if (chr == '\\') { |
8908 | 8935 | str += buffer.charAt(++i); |
|
9204 | 9231 | const raw1 = node1.raw; |
9205 | 9232 | // @ts-ignore |
9206 | 9233 | const raw2 = node2.raw; |
| 9234 | + if (raw1 != null && raw2 != null) { |
| 9235 | + const prefixes1 = new Set; |
| 9236 | + const prefixes2 = new Set; |
| 9237 | + for (const token1 of raw1) { |
| 9238 | + for (const t of token1) { |
| 9239 | + if (t[0] == ':') { |
| 9240 | + const matches = t.match(/::?-([a-z]+)-/); |
| 9241 | + if (matches == null) { |
| 9242 | + continue; |
| 9243 | + } |
| 9244 | + prefixes1.add(matches[1]); |
| 9245 | + if (prefixes1.size > 1) { |
| 9246 | + break; |
| 9247 | + } |
| 9248 | + } |
| 9249 | + } |
| 9250 | + if (prefixes1.size > 1) { |
| 9251 | + break; |
| 9252 | + } |
| 9253 | + } |
| 9254 | + for (const token2 of raw2) { |
| 9255 | + for (const t of token2) { |
| 9256 | + if (t[0] == ':') { |
| 9257 | + const matches = t.match(/::?-([a-z]+)-/); |
| 9258 | + if (matches == null) { |
| 9259 | + continue; |
| 9260 | + } |
| 9261 | + prefixes2.add(matches[1]); |
| 9262 | + if (prefixes2.size > 1) { |
| 9263 | + break; |
| 9264 | + } |
| 9265 | + } |
| 9266 | + } |
| 9267 | + if (prefixes2.size > 1) { |
| 9268 | + break; |
| 9269 | + } |
| 9270 | + } |
| 9271 | + if (prefixes1.size != prefixes2.size) { |
| 9272 | + return null; |
| 9273 | + } |
| 9274 | + for (const prefix of prefixes1) { |
| 9275 | + if (!prefixes2.has(prefix)) { |
| 9276 | + return null; |
| 9277 | + } |
| 9278 | + } |
| 9279 | + } |
9207 | 9280 | // @ts-ignore |
9208 | 9281 | node1 = { ...node1, chi: node1.chi.slice() }; |
9209 | 9282 | node2 = { ...node2, chi: node2.chi.slice() }; |
|
9240 | 9313 | const result = (intersect.length == 0 ? null : { |
9241 | 9314 | ...node1, |
9242 | 9315 | // @ts-ignore |
9243 | | - sel: [...new Set([...(n1?.raw?.reduce(reducer, []) || splitRule(n1.sel)).concat(n2?.raw?.reduce(reducer, []) || splitRule(n2.sel))])].join(','), |
| 9316 | + sel: [...new Set([...(n1?.raw?.reduce(reducer, []) ?? splitRule(n1.sel)).concat(n2?.raw?.reduce(reducer, []) ?? splitRule(n2.sel))])].join(','), |
9244 | 9317 | chi: intersect.reverse() |
9245 | 9318 | }); |
9246 | 9319 | if (result == null || [n1, n2].reduce((acc, curr) => curr.chi.length == 0 ? acc : acc + doRender(curr, options).code.length, 0) <= [node1, node2, result].reduce((acc, curr) => curr.chi.length == 0 ? acc : acc + doRender(curr, options).code.length, 0)) { |
|
9391 | 9464 | return response.text(); |
9392 | 9465 | } |
9393 | 9466 | async function load(url, currentFile) { |
| 9467 | + let t; |
9394 | 9468 | if (matchUrl.test(url)) { |
9395 | | - return fetch(url).then(parseResponse); |
| 9469 | + t = new URL(url); |
9396 | 9470 | } |
9397 | | - if (matchUrl.test(currentFile)) { |
9398 | | - return fetch(new URL(url, currentFile)).then(parseResponse); |
| 9471 | + else if (matchUrl.test(currentFile)) { |
| 9472 | + t = new URL(url, currentFile); |
| 9473 | + } |
| 9474 | + else { |
| 9475 | + const path = resolve(url, currentFile).absolute; |
| 9476 | + t = new URL(path, self.origin); |
9399 | 9477 | } |
9400 | | - const path = resolve(url, currentFile).absolute; |
9401 | | - const t = new URL(path, self.origin); |
9402 | | - // return fetch(new URL(url, new URL(currentFile, self.location.href).href)).then(parseResponse); |
9403 | | - return fetch(url, t.origin != self.location.origin ? { mode: 'cors' } : {}).then(parseResponse); |
| 9478 | + return fetch(t, t.origin != self.origin ? { mode: 'cors' } : {}).then(parseResponse); |
9404 | 9479 | } |
9405 | 9480 |
|
9406 | 9481 | function render(data, options = {}) { |
|
0 commit comments