@hypergood/css-core 0.0.1 → 0.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/plugin.cjs +153 -24
- package/dist/plugin.cjs.map +1 -1
- package/dist/plugin.js +153 -24
- package/dist/plugin.js.map +1 -1
- package/package.json +2 -1
- package/src/evaluate.ts +158 -19
- package/src/plugin.ts +13 -4
- package/src/print.ts +1 -9
- package/tests/evaluate.test.ts +73 -0
package/dist/plugin.cjs
CHANGED
|
@@ -67084,7 +67084,6 @@ var atomizers = {
|
|
|
67084
67084
|
const ast = csstree.parse(value2, { context: "value" });
|
|
67085
67085
|
const matchResult = csstree.lexer.matchProperty("animation", ast);
|
|
67086
67086
|
const match = matchResult.matched?.match;
|
|
67087
|
-
console.log({ match: JSON.stringify(match) });
|
|
67088
67087
|
if (!match) return void 0;
|
|
67089
67088
|
const animationNames = [];
|
|
67090
67089
|
const animationDurations = [];
|
|
@@ -67352,51 +67351,129 @@ function cssJsLogger() {
|
|
|
67352
67351
|
}
|
|
67353
67352
|
|
|
67354
67353
|
// src/evaluate.ts
|
|
67355
|
-
var UNKNOWN = {
|
|
67354
|
+
var UNKNOWN = (badNode) => ({
|
|
67356
67355
|
confident: false,
|
|
67357
|
-
value: void 0
|
|
67358
|
-
|
|
67356
|
+
value: void 0,
|
|
67357
|
+
badNode
|
|
67358
|
+
});
|
|
67359
67359
|
var known = (value2) => ({
|
|
67360
67360
|
confident: true,
|
|
67361
67361
|
value: value2
|
|
67362
67362
|
});
|
|
67363
67363
|
function evaluateBabelExpression(node, knownConstants) {
|
|
67364
|
-
if (!node) return UNKNOWN;
|
|
67364
|
+
if (!node) return UNKNOWN(node);
|
|
67365
67365
|
switch (node.type) {
|
|
67366
|
+
case "ArrayExpression":
|
|
67367
|
+
return evaluateArrayExpression(node, knownConstants);
|
|
67366
67368
|
case "BinaryExpression":
|
|
67367
67369
|
return evaluateBinaryExpression(node, knownConstants);
|
|
67368
67370
|
case "Identifier":
|
|
67369
67371
|
return evaluateIdentifier(node, knownConstants);
|
|
67370
|
-
case "NumericLiteral":
|
|
67371
|
-
return evaluateNumericLiteral(node);
|
|
67372
67372
|
case "MemberExpression":
|
|
67373
67373
|
return evaluateMemberExpression(node, knownConstants);
|
|
67374
|
+
case "NullLiteral":
|
|
67375
|
+
return evaluateNullLiteral(node);
|
|
67376
|
+
case "NumericLiteral":
|
|
67377
|
+
return evaluateNumericLiteral(node);
|
|
67374
67378
|
case "ObjectExpression":
|
|
67375
67379
|
return evaluateObjectExpression(node, knownConstants);
|
|
67376
67380
|
case "StringLiteral":
|
|
67377
67381
|
return evaluateStringLiteral(node);
|
|
67382
|
+
case "TemplateLiteral":
|
|
67383
|
+
return evaluateTemplateLiteral(node, knownConstants);
|
|
67384
|
+
case "UnaryExpression":
|
|
67385
|
+
return evaluateUnaryExpression(node, knownConstants);
|
|
67378
67386
|
default:
|
|
67379
|
-
return UNKNOWN;
|
|
67387
|
+
return UNKNOWN(node);
|
|
67380
67388
|
}
|
|
67381
67389
|
}
|
|
67390
|
+
function evaluateArrayExpression(node, knownConstants) {
|
|
67391
|
+
const elements = [];
|
|
67392
|
+
for (const item of node.elements) {
|
|
67393
|
+
if (!item) return UNKNOWN(node);
|
|
67394
|
+
if (item.type === "SpreadElement") {
|
|
67395
|
+
const spreadElements = evaluateBabelExpression(
|
|
67396
|
+
item.argument,
|
|
67397
|
+
knownConstants
|
|
67398
|
+
);
|
|
67399
|
+
if (spreadElements.confident) {
|
|
67400
|
+
elements.push(...spreadElements.value);
|
|
67401
|
+
continue;
|
|
67402
|
+
} else {
|
|
67403
|
+
return UNKNOWN(spreadElements.badNode);
|
|
67404
|
+
}
|
|
67405
|
+
}
|
|
67406
|
+
const result = evaluateBabelExpression(item, knownConstants);
|
|
67407
|
+
if (result.confident) {
|
|
67408
|
+
elements.push(result.value);
|
|
67409
|
+
} else {
|
|
67410
|
+
return UNKNOWN(result.badNode);
|
|
67411
|
+
}
|
|
67412
|
+
}
|
|
67413
|
+
return known(elements);
|
|
67414
|
+
}
|
|
67382
67415
|
function evaluateBinaryExpression(node, knownConstants) {
|
|
67383
67416
|
const left = evaluateBabelExpression(node.left, knownConstants);
|
|
67384
67417
|
const right = evaluateBabelExpression(node.right, knownConstants);
|
|
67385
|
-
if (!left.confident
|
|
67418
|
+
if (!left.confident) return UNKNOWN(left.badNode);
|
|
67419
|
+
if (!right.confident) return UNKNOWN(right.badNode);
|
|
67386
67420
|
switch (node.operator) {
|
|
67387
|
-
case "*":
|
|
67388
|
-
return known(left.value * right.value);
|
|
67389
67421
|
case "+":
|
|
67390
67422
|
return known(left.value + right.value);
|
|
67423
|
+
case "-":
|
|
67424
|
+
return known(left.value - right.value);
|
|
67425
|
+
case "/":
|
|
67426
|
+
return known(left.value / right.value);
|
|
67427
|
+
case "%":
|
|
67428
|
+
return known(left.value % right.value);
|
|
67429
|
+
case "*":
|
|
67430
|
+
return known(left.value * right.value);
|
|
67431
|
+
case "**":
|
|
67432
|
+
return known(left.value ** right.value);
|
|
67433
|
+
case "&":
|
|
67434
|
+
return known(left.value & right.value);
|
|
67435
|
+
case "|":
|
|
67436
|
+
return known(left.value | right.value);
|
|
67437
|
+
case ">>":
|
|
67438
|
+
return known(left.value >> right.value);
|
|
67439
|
+
case ">>>":
|
|
67440
|
+
return known(left.value >>> right.value);
|
|
67441
|
+
case "<<":
|
|
67442
|
+
return known(left.value << right.value);
|
|
67443
|
+
case "^":
|
|
67444
|
+
return known(left.value ^ right.value);
|
|
67445
|
+
case "==":
|
|
67446
|
+
return known(left.value == right.value);
|
|
67447
|
+
case "===":
|
|
67448
|
+
return known(left.value === right.value);
|
|
67449
|
+
case "!=":
|
|
67450
|
+
return known(left.value != right.value);
|
|
67451
|
+
case "!==":
|
|
67452
|
+
return known(left.value !== right.value);
|
|
67453
|
+
case "in":
|
|
67454
|
+
return known(left.value in right.value);
|
|
67455
|
+
case "instanceof":
|
|
67456
|
+
return known(left.value instanceof right.value);
|
|
67457
|
+
case ">":
|
|
67458
|
+
return known(left.value > right.value);
|
|
67459
|
+
case "<":
|
|
67460
|
+
return known(left.value < right.value);
|
|
67461
|
+
case ">=":
|
|
67462
|
+
return known(left.value >= right.value);
|
|
67463
|
+
case "<=":
|
|
67464
|
+
return known(left.value <= right.value);
|
|
67391
67465
|
default:
|
|
67392
|
-
return UNKNOWN;
|
|
67466
|
+
return UNKNOWN(node);
|
|
67393
67467
|
}
|
|
67394
67468
|
}
|
|
67395
67469
|
function evaluateIdentifier(node, knownConstants) {
|
|
67396
67470
|
if (node.name in knownConstants) {
|
|
67397
67471
|
return known(knownConstants[node.name]);
|
|
67398
67472
|
}
|
|
67399
|
-
|
|
67473
|
+
if (node.name === "undefined") {
|
|
67474
|
+
return known(void 0);
|
|
67475
|
+
}
|
|
67476
|
+
return UNKNOWN(node);
|
|
67400
67477
|
}
|
|
67401
67478
|
function evaluateMemberExpression(node, knownConstants) {
|
|
67402
67479
|
const obj = evaluateBabelExpression(node.object, knownConstants);
|
|
@@ -67408,12 +67485,15 @@ function evaluateMemberExpression(node, knownConstants) {
|
|
|
67408
67485
|
if (propertyNode.type === "Identifier") {
|
|
67409
67486
|
property = known(propertyNode.name);
|
|
67410
67487
|
} else {
|
|
67411
|
-
return UNKNOWN;
|
|
67488
|
+
return UNKNOWN(node);
|
|
67412
67489
|
}
|
|
67413
67490
|
}
|
|
67414
|
-
if (!obj.confident || !property.confident) return UNKNOWN;
|
|
67491
|
+
if (!obj.confident || !property.confident) return UNKNOWN(node);
|
|
67415
67492
|
return known(obj.value[property.value]);
|
|
67416
67493
|
}
|
|
67494
|
+
function evaluateNullLiteral(node) {
|
|
67495
|
+
return known(null);
|
|
67496
|
+
}
|
|
67417
67497
|
function evaluateNumericLiteral(node) {
|
|
67418
67498
|
return known(node.value);
|
|
67419
67499
|
}
|
|
@@ -67422,9 +67502,9 @@ function evaluateObjectExpression(node, knownConstants) {
|
|
|
67422
67502
|
for (const property of node.properties) {
|
|
67423
67503
|
switch (property.type) {
|
|
67424
67504
|
case "ObjectMethod":
|
|
67425
|
-
return UNKNOWN;
|
|
67505
|
+
return UNKNOWN(property);
|
|
67426
67506
|
case "SpreadElement":
|
|
67427
|
-
return UNKNOWN;
|
|
67507
|
+
return UNKNOWN(property);
|
|
67428
67508
|
case "ObjectProperty": {
|
|
67429
67509
|
const keyNode = property.key;
|
|
67430
67510
|
let key2;
|
|
@@ -67436,11 +67516,12 @@ function evaluateObjectExpression(node, knownConstants) {
|
|
|
67436
67516
|
} else if (keyNode.type === "Identifier") {
|
|
67437
67517
|
key2 = known(keyNode.name);
|
|
67438
67518
|
} else {
|
|
67439
|
-
return UNKNOWN;
|
|
67519
|
+
return UNKNOWN(property);
|
|
67440
67520
|
}
|
|
67441
67521
|
}
|
|
67442
67522
|
const value2 = evaluateBabelExpression(property.value, knownConstants);
|
|
67443
|
-
if (!key2 || !key2.confident || !value2.confident)
|
|
67523
|
+
if (!key2 || !key2.confident || !value2.confident)
|
|
67524
|
+
return UNKNOWN(property);
|
|
67444
67525
|
result[key2.value] = value2.value;
|
|
67445
67526
|
}
|
|
67446
67527
|
}
|
|
@@ -67450,6 +67531,45 @@ function evaluateObjectExpression(node, knownConstants) {
|
|
|
67450
67531
|
function evaluateStringLiteral(node) {
|
|
67451
67532
|
return known(node.value);
|
|
67452
67533
|
}
|
|
67534
|
+
function evaluateTemplateLiteral(node, knownConstants) {
|
|
67535
|
+
const quasisAsStrings = node.quasis.map((q) => q.value.cooked ?? q.value.raw);
|
|
67536
|
+
const expressions = node.expressions.map(
|
|
67537
|
+
(e) => evaluateBabelExpression(e, knownConstants)
|
|
67538
|
+
);
|
|
67539
|
+
if (expressions.some((e) => !e.confident)) {
|
|
67540
|
+
return UNKNOWN(node);
|
|
67541
|
+
}
|
|
67542
|
+
const expressionValues = expressions.map((e) => e.value);
|
|
67543
|
+
let result = "";
|
|
67544
|
+
for (let i = 0; i < quasisAsStrings.length; i++) {
|
|
67545
|
+
result += quasisAsStrings[i];
|
|
67546
|
+
if (i < expressionValues.length) {
|
|
67547
|
+
let value2 = expressionValues[i];
|
|
67548
|
+
result += value2;
|
|
67549
|
+
}
|
|
67550
|
+
}
|
|
67551
|
+
return known(result);
|
|
67552
|
+
}
|
|
67553
|
+
function evaluateUnaryExpression(node, knownConstants) {
|
|
67554
|
+
const argument = evaluateBabelExpression(node.argument, knownConstants);
|
|
67555
|
+
if (!argument.confident) return UNKNOWN(argument.badNode);
|
|
67556
|
+
switch (node.operator) {
|
|
67557
|
+
case "+":
|
|
67558
|
+
return known(+argument.value);
|
|
67559
|
+
case "-":
|
|
67560
|
+
return known(-argument.value);
|
|
67561
|
+
case "void":
|
|
67562
|
+
return known(void argument.value);
|
|
67563
|
+
case "!":
|
|
67564
|
+
return known(!argument.value);
|
|
67565
|
+
case "~":
|
|
67566
|
+
return known(~argument.value);
|
|
67567
|
+
case "typeof":
|
|
67568
|
+
return known(typeof argument.value);
|
|
67569
|
+
default:
|
|
67570
|
+
return UNKNOWN(node);
|
|
67571
|
+
}
|
|
67572
|
+
}
|
|
67453
67573
|
|
|
67454
67574
|
// src/runtime.ts
|
|
67455
67575
|
function mergeClassNames(classNames) {
|
|
@@ -67483,7 +67603,7 @@ ${styleRules2.map((rule) => ` ${rule.property}: ${rule.value};`).join("\n")}
|
|
|
67483
67603
|
});
|
|
67484
67604
|
const tree = groupStyleRules(styleRules, []);
|
|
67485
67605
|
const rulesSection = renderStyleRuleNode(tree, styleRuleToClassName);
|
|
67486
|
-
return keyframesSection + "\n" + rulesSection
|
|
67606
|
+
return keyframesSection + "\n" + rulesSection;
|
|
67487
67607
|
}
|
|
67488
67608
|
function renderStyleRuleNode(node, styleRuleToClassName, indent = 0) {
|
|
67489
67609
|
const rulesSection = node.rules.sort((a, b) => a.value.localeCompare(b.value)).sort((a, b) => a.property.localeCompare(b.property)).sort((a, b) => a.selector.length - b.selector.length).sort((a, b) => a.atRules.length - b.atRules.length).map((rule) => {
|
|
@@ -67939,7 +68059,7 @@ function babelPluginReplaceCssProp({
|
|
|
67939
68059
|
}
|
|
67940
68060
|
}
|
|
67941
68061
|
},
|
|
67942
|
-
JSXAttribute(path) {
|
|
68062
|
+
JSXAttribute(path, state) {
|
|
67943
68063
|
if (path.node.name && path.node.name.type === "JSXIdentifier" && path.node.name.name === "css") {
|
|
67944
68064
|
const value2 = path.node.value;
|
|
67945
68065
|
if (value2?.type !== "JSXExpressionContainer") return;
|
|
@@ -67952,9 +68072,18 @@ function babelPluginReplaceCssProp({
|
|
|
67952
68072
|
);
|
|
67953
68073
|
let styleObject = styleObjectResult.value;
|
|
67954
68074
|
if (!styleObjectResult.confident) {
|
|
67955
|
-
|
|
67956
|
-
|
|
67957
|
-
|
|
68075
|
+
const badNode = styleObjectResult.badNode;
|
|
68076
|
+
if (badNode) {
|
|
68077
|
+
const { start, end } = badNode;
|
|
68078
|
+
const rawCode = state.file.code.slice(start, end);
|
|
68079
|
+
console.error(`COULD NOT EVALUATE CSS: \`${rawCode}\``);
|
|
68080
|
+
return;
|
|
68081
|
+
} else {
|
|
68082
|
+
console.error(
|
|
68083
|
+
"COULD NOT EVALUATE CSS: L" + expression.loc?.start.line
|
|
68084
|
+
);
|
|
68085
|
+
return;
|
|
68086
|
+
}
|
|
67958
68087
|
}
|
|
67959
68088
|
const classNames = styleObjectToClassNames(styleObject);
|
|
67960
68089
|
path.node.name.name = "className";
|