clava 0.4.2 → 0.6.0
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/CHANGELOG.md +85 -2
- package/README.md +78 -31
- package/dist/index.d.ts +193 -3
- package/dist/index.js +187 -115
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
- package/src/index.ts +451 -214
- package/src/refine-warning.ts +2 -2
- package/src/types.ts +129 -2
- package/tests/component-api.test.ts +81 -55
- package/tests/extend.test.ts +44 -10
- package/tests/language-service.test.ts +12 -1
- package/tests/prototype-pollution.test.ts +3 -4
- package/tests/refine.test.ts +267 -369
- package/tests/variants-inference.test.ts +149 -0
package/dist/index.js
CHANGED
|
@@ -75,7 +75,7 @@ function warnRefineLimit({ runState, creationFrame, unstableChanges }) {
|
|
|
75
75
|
if (process.env.NODE_ENV === "production") return;
|
|
76
76
|
if (runState.warned) return;
|
|
77
77
|
runState.warned = true;
|
|
78
|
-
let message = "Clava: Maximum refine iterations exceeded. This can happen when a
|
|
78
|
+
let message = "Clava: Maximum refine iterations exceeded. This can happen when a computed default variant or refine callback changes one of the variants on every run.";
|
|
79
79
|
if (unstableChanges && unstableChanges.size > 0) {
|
|
80
80
|
message += `\nVariant(s) that did not stabilize: ${Array.from(unstableChanges.keys()).join(", ")}.`;
|
|
81
81
|
message += `\nLatest variant changes before warning: ${formatVariantChanges(unstableChanges)}.`;
|
|
@@ -350,6 +350,23 @@ function mergeVariants(target, source, skipKeys) {
|
|
|
350
350
|
}
|
|
351
351
|
return changed;
|
|
352
352
|
}
|
|
353
|
+
function mergeProtectedIntoBase(baseResolved, protectedVariants) {
|
|
354
|
+
if (!protectedVariants) return baseResolved;
|
|
355
|
+
let hasProtected = false;
|
|
356
|
+
for (const key in protectedVariants) {
|
|
357
|
+
if (!Object.hasOwn(protectedVariants, key)) continue;
|
|
358
|
+
hasProtected = true;
|
|
359
|
+
break;
|
|
360
|
+
}
|
|
361
|
+
if (!hasProtected) return baseResolved;
|
|
362
|
+
const resolved = {};
|
|
363
|
+
Object.assign(resolved, baseResolved);
|
|
364
|
+
for (const key in protectedVariants) {
|
|
365
|
+
if (!Object.hasOwn(protectedVariants, key)) continue;
|
|
366
|
+
resolved[key] = protectedVariants[key];
|
|
367
|
+
}
|
|
368
|
+
return resolved;
|
|
369
|
+
}
|
|
353
370
|
function getComponentMeta(component) {
|
|
354
371
|
return component[META_KEY];
|
|
355
372
|
}
|
|
@@ -419,21 +436,11 @@ function collectVariantKeys(config) {
|
|
|
419
436
|
}
|
|
420
437
|
return Array.from(keys);
|
|
421
438
|
}
|
|
422
|
-
function isVariantDisabled(config, key) {
|
|
423
|
-
return config.variants?.[key] === null;
|
|
424
|
-
}
|
|
425
439
|
function getVariantValueKey(value) {
|
|
426
440
|
if (typeof value === "string") return value;
|
|
427
441
|
if (typeof value === "number") return String(value);
|
|
428
442
|
if (typeof value === "boolean") return String(value);
|
|
429
443
|
}
|
|
430
|
-
function isVariantValueDisabled(config, key, value) {
|
|
431
|
-
const valueKey = getVariantValueKey(value);
|
|
432
|
-
if (valueKey == null) return false;
|
|
433
|
-
const variant = config.variants?.[key];
|
|
434
|
-
if (!isRecordObject(variant)) return false;
|
|
435
|
-
return variant[valueKey] === null;
|
|
436
|
-
}
|
|
437
444
|
function collectDisabledVariantKeys(config) {
|
|
438
445
|
const keys = /* @__PURE__ */ new Set();
|
|
439
446
|
if (!config.variants) return keys;
|
|
@@ -614,6 +621,9 @@ function create({ transformClass = (className) => className } = {}) {
|
|
|
614
621
|
}
|
|
615
622
|
const variantEntryCount = variantEntryNames.length;
|
|
616
623
|
const functionVariantCount = functionVariantNames.length;
|
|
624
|
+
const computedDefaultNames = [];
|
|
625
|
+
const computedDefaultFns = [];
|
|
626
|
+
const defaultVariants = config.defaultVariants;
|
|
617
627
|
const staticDefaults = {};
|
|
618
628
|
if (extend) for (const ext of extend) {
|
|
619
629
|
const meta = getComponentMeta(ext);
|
|
@@ -625,7 +635,21 @@ function create({ transformClass = (className) => className } = {}) {
|
|
|
625
635
|
if (!isRecordObject(variantDef)) continue;
|
|
626
636
|
if (Object.hasOwn(variantDef, "false") && staticDefaults[name] === void 0) staticDefaults[name] = false;
|
|
627
637
|
}
|
|
628
|
-
if (
|
|
638
|
+
if (defaultVariants) for (const name in defaultVariants) {
|
|
639
|
+
if (!Object.hasOwn(defaultVariants, name)) continue;
|
|
640
|
+
const value = defaultVariants[name];
|
|
641
|
+
if (typeof value === "function") {
|
|
642
|
+
computedDefaultNames.push(name);
|
|
643
|
+
computedDefaultFns.push(value);
|
|
644
|
+
continue;
|
|
645
|
+
}
|
|
646
|
+
if (value === void 0) {
|
|
647
|
+
Reflect.deleteProperty(staticDefaults, name);
|
|
648
|
+
continue;
|
|
649
|
+
}
|
|
650
|
+
staticDefaults[name] = value;
|
|
651
|
+
}
|
|
652
|
+
const computedDefaultCount = computedDefaultNames.length;
|
|
629
653
|
if (hasAnyDisabled) for (const key in staticDefaults) {
|
|
630
654
|
if (!Object.hasOwn(staticDefaults, key)) continue;
|
|
631
655
|
if (disabledVariantKeys.has(key)) {
|
|
@@ -654,14 +678,19 @@ function create({ transformClass = (className) => className } = {}) {
|
|
|
654
678
|
} else extBaseClassesArr.push(meta.baseClass);
|
|
655
679
|
}
|
|
656
680
|
const extCount = extMetas.length;
|
|
681
|
+
const inheritedComputedDefaultKeys = /* @__PURE__ */ new Set();
|
|
682
|
+
for (let i = 0; i < extCount; i++) {
|
|
683
|
+
const keys = extMetas[i].computedDefaultKeys;
|
|
684
|
+
for (const key of keys) inheritedComputedDefaultKeys.add(key);
|
|
685
|
+
}
|
|
657
686
|
const extMetasWithRefine = [];
|
|
658
687
|
for (let i = 0; i < extCount; i++) {
|
|
659
688
|
const meta = extMetas[i];
|
|
660
|
-
if (meta.
|
|
689
|
+
if (meta.resolveRefine) extMetasWithRefine.push(meta);
|
|
661
690
|
}
|
|
662
691
|
const extMetasWithRefineCount = extMetasWithRefine.length;
|
|
663
692
|
const shouldCollectChangedVariants = extMetasWithRefineCount > 0;
|
|
664
|
-
const creationFrame = !!refine || extMetasWithRefineCount > 0 ? captureCreationFrame(cv) : void 0;
|
|
693
|
+
const creationFrame = !!refine || computedDefaultCount > 0 || extMetasWithRefineCount > 0 ? captureCreationFrame(cv) : void 0;
|
|
665
694
|
const functionVariantKeys = /* @__PURE__ */ new Set();
|
|
666
695
|
for (let i = 0; i < extCount; i++) {
|
|
667
696
|
const fnKeys = extMetas[i].functionVariantKeys;
|
|
@@ -672,6 +701,8 @@ function create({ transformClass = (className) => className } = {}) {
|
|
|
672
701
|
}
|
|
673
702
|
for (let i = 0; i < functionVariantCount; i++) functionVariantKeys.add(functionVariantNames[i]);
|
|
674
703
|
for (let i = 0; i < variantEntryCount; i++) functionVariantKeys.delete(variantEntryNames[i]);
|
|
704
|
+
const computedDefaultKeys = new Set(inheritedComputedDefaultKeys);
|
|
705
|
+
for (let i = 0; i < computedDefaultCount; i++) computedDefaultKeys.add(computedDefaultNames[i]);
|
|
675
706
|
let staticVariantsOverridingExtFn = null;
|
|
676
707
|
if (variantEntryCount > 0 && extCount > 0) for (let i = 0; i < variantEntryCount; i++) {
|
|
677
708
|
const name = variantEntryNames[i];
|
|
@@ -705,64 +736,42 @@ function create({ transformClass = (className) => className } = {}) {
|
|
|
705
736
|
out[key] = value;
|
|
706
737
|
}
|
|
707
738
|
}
|
|
708
|
-
const
|
|
709
|
-
|
|
710
|
-
|
|
711
|
-
|
|
712
|
-
if (
|
|
713
|
-
const v = childDefaults[key];
|
|
714
|
-
if (v === void 0) continue;
|
|
715
|
-
resolvedVariants[key] = v;
|
|
716
|
-
}
|
|
717
|
-
for (const key in userProps) {
|
|
718
|
-
if (!Object.hasOwn(userProps, key)) continue;
|
|
719
|
-
const v = userProps[key];
|
|
720
|
-
if (v === void 0) continue;
|
|
721
|
-
resolvedVariants[key] = v;
|
|
739
|
+
const isOwnDisabledValue = (key, value) => {
|
|
740
|
+
if (disabledVariantKeys.has(key)) return true;
|
|
741
|
+
if (hasDisabledVariantValues) {
|
|
742
|
+
const valueKey = getVariantValueKey(value);
|
|
743
|
+
if (valueKey != null && disabledVariantValues[key]?.has(valueKey)) return true;
|
|
722
744
|
}
|
|
723
|
-
|
|
724
|
-
|
|
725
|
-
|
|
726
|
-
|
|
727
|
-
|
|
728
|
-
|
|
745
|
+
return false;
|
|
746
|
+
};
|
|
747
|
+
const filterOwnDisabledVariants = (input, fallback) => {
|
|
748
|
+
if (!hasAnyDisabled) return input;
|
|
749
|
+
let hasOwnDisabledValue = false;
|
|
750
|
+
for (const key in input) {
|
|
751
|
+
if (!Object.hasOwn(input, key)) continue;
|
|
752
|
+
const value = input[key];
|
|
753
|
+
if (isOwnDisabledValue(key, value)) {
|
|
754
|
+
hasOwnDisabledValue = true;
|
|
755
|
+
break;
|
|
729
756
|
}
|
|
730
757
|
}
|
|
731
|
-
if (
|
|
732
|
-
|
|
733
|
-
|
|
734
|
-
|
|
735
|
-
|
|
758
|
+
if (!hasOwnDisabledValue) return input;
|
|
759
|
+
const filtered = {};
|
|
760
|
+
for (const key in input) {
|
|
761
|
+
if (!Object.hasOwn(input, key)) continue;
|
|
762
|
+
const value = input[key];
|
|
763
|
+
if (!isOwnDisabledValue(key, value)) {
|
|
764
|
+
filtered[key] = value;
|
|
765
|
+
continue;
|
|
736
766
|
}
|
|
737
|
-
|
|
738
|
-
|
|
739
|
-
setVariants: noop,
|
|
740
|
-
setDefaultVariants: (newDefaults) => {
|
|
741
|
-
for (const key in newDefaults) {
|
|
742
|
-
if (!Object.hasOwn(newDefaults, key)) continue;
|
|
743
|
-
const value = newDefaults[key];
|
|
744
|
-
if (userProps[key] !== void 0) continue;
|
|
745
|
-
if (isVariantDisabled(config, key)) continue;
|
|
746
|
-
if (isVariantValueDisabled(config, key, value)) continue;
|
|
747
|
-
refineDefaults[key] = value;
|
|
748
|
-
}
|
|
749
|
-
},
|
|
750
|
-
addClass: noop,
|
|
751
|
-
addStyle: noop
|
|
752
|
-
});
|
|
767
|
+
const fallbackValue = fallback[key];
|
|
768
|
+
if (fallbackValue !== void 0 && !isOwnDisabledValue(key, fallbackValue)) filtered[key] = fallbackValue;
|
|
753
769
|
}
|
|
754
|
-
return
|
|
755
|
-
}
|
|
770
|
+
return filtered;
|
|
771
|
+
};
|
|
756
772
|
function resolveVariantsHot(propsVariants) {
|
|
757
773
|
const defaults = {};
|
|
758
774
|
Object.assign(defaults, staticDefaults);
|
|
759
|
-
for (let i = 0; i < extMetasWithRefineCount; i++) {
|
|
760
|
-
const extDefaults = extMetasWithRefine[i].resolveDefaults(defaults, propsVariants);
|
|
761
|
-
for (const k in extDefaults) {
|
|
762
|
-
if (!Object.hasOwn(extDefaults, k)) continue;
|
|
763
|
-
defaults[k] = extDefaults[k];
|
|
764
|
-
}
|
|
765
|
-
}
|
|
766
775
|
for (const k in propsVariants) {
|
|
767
776
|
if (!Object.hasOwn(propsVariants, k)) continue;
|
|
768
777
|
const v = propsVariants[k];
|
|
@@ -774,7 +783,67 @@ function create({ transformClass = (className) => className } = {}) {
|
|
|
774
783
|
filterDisabledInto(defaults, result);
|
|
775
784
|
return result;
|
|
776
785
|
}
|
|
777
|
-
const
|
|
786
|
+
const runComputedDefaults = (resolved, defaultResolved, userVariantProps, filterOwnVariants, protectedVariantKeys) => {
|
|
787
|
+
if (computedDefaultCount === 0) return {
|
|
788
|
+
workingResolved: resolved,
|
|
789
|
+
changedVariants: null
|
|
790
|
+
};
|
|
791
|
+
let ownVariants = filterOwnVariants ? null : resolved;
|
|
792
|
+
const getOwnVariants = () => {
|
|
793
|
+
if (ownVariants) return ownVariants;
|
|
794
|
+
const filteredVariants = {};
|
|
795
|
+
for (let i = 0; i < variantKeysLength; i++) {
|
|
796
|
+
const key = variantKeys[i];
|
|
797
|
+
if (Object.hasOwn(resolved, key)) filteredVariants[key] = resolved[key];
|
|
798
|
+
}
|
|
799
|
+
ownVariants = filteredVariants;
|
|
800
|
+
return filteredVariants;
|
|
801
|
+
};
|
|
802
|
+
let updatedVariants = null;
|
|
803
|
+
let changedVariants = null;
|
|
804
|
+
const ensureUpdated = () => {
|
|
805
|
+
if (updatedVariants) return updatedVariants;
|
|
806
|
+
const updated = {};
|
|
807
|
+
Object.assign(updated, resolved);
|
|
808
|
+
updatedVariants = updated;
|
|
809
|
+
return updated;
|
|
810
|
+
};
|
|
811
|
+
for (let i = 0; i < computedDefaultCount; i++) {
|
|
812
|
+
const key = computedDefaultNames[i];
|
|
813
|
+
if (Object.hasOwn(userVariantProps, key)) {
|
|
814
|
+
if (userVariantProps[key] !== void 0) continue;
|
|
815
|
+
}
|
|
816
|
+
if (protectedVariantKeys?.has(key)) continue;
|
|
817
|
+
const variantSnapshot = getOwnVariants();
|
|
818
|
+
const defaultValue = inheritedComputedDefaultKeys.has(key) ? variantSnapshot[key] : defaultResolved[key];
|
|
819
|
+
const value = computedDefaultFns[i](defaultValue, variantSnapshot);
|
|
820
|
+
if (hasAnyDisabled) {
|
|
821
|
+
if (disabledVariantKeys.has(key)) continue;
|
|
822
|
+
const valueKey = getVariantValueKey(value);
|
|
823
|
+
if (valueKey != null && disabledVariantValues[key]?.has(valueKey)) continue;
|
|
824
|
+
}
|
|
825
|
+
if (value === void 0) {
|
|
826
|
+
if (!Object.hasOwn(variantSnapshot, key)) continue;
|
|
827
|
+
if (shouldCollectChangedVariants) {
|
|
828
|
+
changedVariants ??= {};
|
|
829
|
+
changedVariants[key] = value;
|
|
830
|
+
}
|
|
831
|
+
Reflect.deleteProperty(ensureUpdated(), key);
|
|
832
|
+
continue;
|
|
833
|
+
}
|
|
834
|
+
if (Object.is(variantSnapshot[key], value)) continue;
|
|
835
|
+
if (shouldCollectChangedVariants) {
|
|
836
|
+
changedVariants ??= {};
|
|
837
|
+
changedVariants[key] = value;
|
|
838
|
+
}
|
|
839
|
+
ensureUpdated()[key] = value;
|
|
840
|
+
}
|
|
841
|
+
return {
|
|
842
|
+
workingResolved: updatedVariants ?? resolved,
|
|
843
|
+
changedVariants
|
|
844
|
+
};
|
|
845
|
+
};
|
|
846
|
+
const runRefineContext = (resolved, userVariantProps, filterOwnVariants, collectOutput, applyVariantUpdates, protectedVariants, pendingProtectedVariants, protectedVariantKeys) => {
|
|
778
847
|
let workingResolved = resolved;
|
|
779
848
|
let cClasses = null;
|
|
780
849
|
let cStyle = null;
|
|
@@ -815,6 +884,7 @@ function create({ transformClass = (className) => className } = {}) {
|
|
|
815
884
|
const result = refine({
|
|
816
885
|
variants: ownVariants,
|
|
817
886
|
setVariants: (newVariants) => {
|
|
887
|
+
if (!applyVariantUpdates) return;
|
|
818
888
|
if (!hasAnyDisabled) {
|
|
819
889
|
for (const key in newVariants) {
|
|
820
890
|
if (!Object.hasOwn(newVariants, key)) continue;
|
|
@@ -838,23 +908,6 @@ function create({ transformClass = (className) => className } = {}) {
|
|
|
838
908
|
ensureUpdated()[key] = value;
|
|
839
909
|
}
|
|
840
910
|
},
|
|
841
|
-
setDefaultVariants: (newDefaults) => {
|
|
842
|
-
for (const key in newDefaults) {
|
|
843
|
-
if (!Object.hasOwn(newDefaults, key)) continue;
|
|
844
|
-
if (userVariantProps[key] !== void 0) continue;
|
|
845
|
-
if (protectedVariantKeys?.has(key)) continue;
|
|
846
|
-
const value = newDefaults[key];
|
|
847
|
-
if (hasAnyDisabled) {
|
|
848
|
-
if (disabledVariantKeys.has(key)) continue;
|
|
849
|
-
const valueKey = getVariantValueKey(value);
|
|
850
|
-
if (valueKey != null && disabledVariantValues[key]?.has(valueKey)) continue;
|
|
851
|
-
}
|
|
852
|
-
if (Object.is(getCurrentVariantValue(key), value)) continue;
|
|
853
|
-
setChangedVariant(key, value);
|
|
854
|
-
if (pendingProtectedVariants) pendingProtectedVariants[key] = value;
|
|
855
|
-
ensureUpdated()[key] = value;
|
|
856
|
-
}
|
|
857
|
-
},
|
|
858
911
|
addClass: (className) => {
|
|
859
912
|
localCClasses?.push(className);
|
|
860
913
|
},
|
|
@@ -892,18 +945,11 @@ function create({ transformClass = (className) => className } = {}) {
|
|
|
892
945
|
style: cStyle
|
|
893
946
|
};
|
|
894
947
|
};
|
|
895
|
-
const computeOnce = (resolved, userVariantProps, skipKeys, skipValues, classesOut, styleOut, runState, protectedVariants, pendingProtectedVariants, protectedVariantKeys) => {
|
|
948
|
+
const computeOnce = (resolved, userVariantProps, skipKeys, skipValues, classesOut, styleOut, runState, protectedVariants, pendingProtectedVariants, protectedVariantKeys, defaultResolved = resolved, renderOnly = false) => {
|
|
896
949
|
let workingResolved = resolved;
|
|
897
950
|
let cClasses = null;
|
|
898
951
|
let cStyle = null;
|
|
899
952
|
let changedVariants = null;
|
|
900
|
-
if (refine) {
|
|
901
|
-
const refineResult = runRefineContext(resolved, userVariantProps, true, true, protectedVariants, pendingProtectedVariants, protectedVariantKeys);
|
|
902
|
-
workingResolved = refineResult.workingResolved;
|
|
903
|
-
cClasses = refineResult.classes;
|
|
904
|
-
cStyle = refineResult.style;
|
|
905
|
-
changedVariants = refineResult.changedVariants;
|
|
906
|
-
}
|
|
907
953
|
if (hasExtend) {
|
|
908
954
|
let extSkipKeys;
|
|
909
955
|
if (skipKeys === null) extSkipKeys = staticExtSkipKeys;
|
|
@@ -931,15 +977,31 @@ function create({ transformClass = (className) => className } = {}) {
|
|
|
931
977
|
for (let i = 0; i < extCount; i++) {
|
|
932
978
|
if (hasIsolatedExt && extIsolated[i]) {
|
|
933
979
|
const extClasses = [];
|
|
934
|
-
workingResolved = extMetas[i].compute(workingResolved, extUserVariantProps, extSkipKeys, extSkipVals, extClasses, styleOut, runState, protectedVariants, pendingProtectedVariants, protectedVariantKeys);
|
|
980
|
+
workingResolved = extMetas[i].compute(workingResolved, extUserVariantProps, extSkipKeys, extSkipVals, extClasses, styleOut, runState, protectedVariants, pendingProtectedVariants, protectedVariantKeys, defaultResolved, renderOnly);
|
|
935
981
|
if (extClasses.length > 0) {
|
|
936
982
|
const joined = clsx(extClasses);
|
|
937
983
|
if (joined.length > 0) classesOut.push(extMetas[i].transformClass(joined));
|
|
938
984
|
}
|
|
939
|
-
} else workingResolved = extMetas[i].compute(workingResolved, extUserVariantProps, extSkipKeys, extSkipVals, classesOut, styleOut, runState, protectedVariants, pendingProtectedVariants, protectedVariantKeys);
|
|
985
|
+
} else workingResolved = extMetas[i].compute(workingResolved, extUserVariantProps, extSkipKeys, extSkipVals, classesOut, styleOut, runState, protectedVariants, pendingProtectedVariants, protectedVariantKeys, defaultResolved, renderOnly);
|
|
986
|
+
workingResolved = filterOwnDisabledVariants(workingResolved, defaultResolved);
|
|
940
987
|
if (protectedVariants && extMetasWithRefineCount > 0) Object.assign(extUserVariantProps, protectedVariants);
|
|
941
988
|
}
|
|
942
989
|
}
|
|
990
|
+
if (!renderOnly && computedDefaultCount > 0) {
|
|
991
|
+
const computedResult = runComputedDefaults(workingResolved, defaultResolved, userVariantProps, true, protectedVariantKeys);
|
|
992
|
+
workingResolved = computedResult.workingResolved;
|
|
993
|
+
changedVariants = computedResult.changedVariants;
|
|
994
|
+
}
|
|
995
|
+
if (refine) {
|
|
996
|
+
const refineResult = runRefineContext(workingResolved, userVariantProps, true, true, !renderOnly, protectedVariants, pendingProtectedVariants, protectedVariantKeys);
|
|
997
|
+
workingResolved = refineResult.workingResolved;
|
|
998
|
+
cClasses = refineResult.classes;
|
|
999
|
+
cStyle = refineResult.style;
|
|
1000
|
+
if (refineResult.changedVariants) {
|
|
1001
|
+
changedVariants ??= {};
|
|
1002
|
+
Object.assign(changedVariants, refineResult.changedVariants);
|
|
1003
|
+
}
|
|
1004
|
+
}
|
|
943
1005
|
if (hasBaseStyle) Object.assign(styleOut, baseStyle);
|
|
944
1006
|
const ownSkipKeys = skipKeys;
|
|
945
1007
|
const ownSkipValues = skipValues;
|
|
@@ -982,7 +1044,8 @@ function create({ transformClass = (className) => className } = {}) {
|
|
|
982
1044
|
if (cStyle) Object.assign(styleOut, cStyle);
|
|
983
1045
|
return workingResolved;
|
|
984
1046
|
};
|
|
985
|
-
const compute = !refine && extMetasWithRefineCount === 0 ? computeOnce : (resolved, userVariantProps, skipKeys, skipValues, classesOut, styleOut, runState, protectedVariants, pendingProtectedVariants, protectedVariantKeys) => {
|
|
1047
|
+
const compute = !refine && computedDefaultCount === 0 && extMetasWithRefineCount === 0 ? computeOnce : (resolved, userVariantProps, skipKeys, skipValues, classesOut, styleOut, runState, protectedVariants, pendingProtectedVariants, protectedVariantKeys, incomingDefaultResolved = resolved, renderOnly = false) => {
|
|
1048
|
+
if (renderOnly) return computeOnce(resolved, userVariantProps, skipKeys, skipValues, classesOut, styleOut, runState, protectedVariants, pendingProtectedVariants, protectedVariantKeys, incomingDefaultResolved, true);
|
|
986
1049
|
runState ??= { remaining: MAX_REFINE_RUNS };
|
|
987
1050
|
protectedVariants ??= {};
|
|
988
1051
|
protectedVariantKeys ??= /* @__PURE__ */ new Set();
|
|
@@ -1004,12 +1067,19 @@ function create({ transformClass = (className) => className } = {}) {
|
|
|
1004
1067
|
const nextPendingProtectedVariants = {};
|
|
1005
1068
|
const nextClasses = useDirectOutput ? classesOut : [];
|
|
1006
1069
|
const nextStyle = useDirectOutput ? styleOut : {};
|
|
1007
|
-
const
|
|
1070
|
+
const defaultResolved = mergeProtectedIntoBase(incomingDefaultResolved, protectedVariants);
|
|
1071
|
+
const nextResolved = computeOnce(workingResolved, userVariantProps, skipKeys, skipValues, nextClasses, nextStyle, runState, protectedVariants, nextPendingProtectedVariants, protectedVariantKeys, defaultResolved);
|
|
1008
1072
|
let protectedChanged;
|
|
1009
1073
|
if (pendingProtectedVariants) protectedChanged = mergeVariants(pendingProtectedVariants, nextPendingProtectedVariants, protectedVariantKeys);
|
|
1010
1074
|
else protectedChanged = mergeVariants(protectedVariants, nextPendingProtectedVariants, protectedVariantKeys);
|
|
1011
1075
|
if (!protectedChanged && (nextResolved === workingResolved || areVariantsEqual(workingResolved, nextResolved))) {
|
|
1012
|
-
if (
|
|
1076
|
+
if (nextResolved !== workingResolved) {
|
|
1077
|
+
if (useDirectOutput) {
|
|
1078
|
+
classesOut.length = classCount;
|
|
1079
|
+
for (const key in styleOut) if (Object.hasOwn(styleOut, key)) Reflect.deleteProperty(styleOut, key);
|
|
1080
|
+
}
|
|
1081
|
+
computeOnce(nextResolved, userVariantProps, skipKeys, skipValues, classesOut, styleOut, runState, protectedVariants, null, protectedVariantKeys, defaultResolved, true);
|
|
1082
|
+
} else if (!useDirectOutput) {
|
|
1013
1083
|
for (let i = 0; i < nextClasses.length; i++) classesOut.push(nextClasses[i]);
|
|
1014
1084
|
Object.assign(styleOut, nextStyle);
|
|
1015
1085
|
}
|
|
@@ -1046,26 +1116,35 @@ function create({ transformClass = (className) => className } = {}) {
|
|
|
1046
1116
|
Object.assign(styleOut, lastStyle);
|
|
1047
1117
|
return workingResolved;
|
|
1048
1118
|
};
|
|
1049
|
-
const resolveRefineOnce = (resolved, userVariantProps, filterOwnVariants = true, runState, protectedVariants, pendingProtectedVariants, protectedVariantKeys) => {
|
|
1119
|
+
const resolveRefineOnce = (resolved, userVariantProps, filterOwnVariants = true, runState, protectedVariants, pendingProtectedVariants, protectedVariantKeys, defaultResolved = resolved) => {
|
|
1050
1120
|
let workingResolved = resolved;
|
|
1051
1121
|
let changedVariants = null;
|
|
1052
|
-
if (refine) {
|
|
1053
|
-
const refineResult = runRefineContext(resolved, userVariantProps, filterOwnVariants, false, protectedVariants, pendingProtectedVariants, protectedVariantKeys);
|
|
1054
|
-
workingResolved = refineResult.workingResolved;
|
|
1055
|
-
changedVariants = refineResult.changedVariants;
|
|
1056
|
-
}
|
|
1057
1122
|
if (extMetasWithRefineCount > 0) {
|
|
1058
1123
|
const extUserVariantProps = getExtUserVariantProps(userVariantProps, protectedVariants ?? null, changedVariants);
|
|
1059
1124
|
for (let i = 0; i < extMetasWithRefineCount; i++) {
|
|
1060
1125
|
const resolveRefine = extMetasWithRefine[i].resolveRefine;
|
|
1061
1126
|
if (!resolveRefine) continue;
|
|
1062
|
-
workingResolved = resolveRefine(workingResolved, extUserVariantProps, true, runState, protectedVariants, pendingProtectedVariants, protectedVariantKeys);
|
|
1127
|
+
workingResolved = resolveRefine(workingResolved, extUserVariantProps, true, runState, protectedVariants, pendingProtectedVariants, protectedVariantKeys, defaultResolved);
|
|
1128
|
+
workingResolved = filterOwnDisabledVariants(workingResolved, defaultResolved);
|
|
1063
1129
|
if (protectedVariants) Object.assign(extUserVariantProps, protectedVariants);
|
|
1064
1130
|
}
|
|
1065
1131
|
}
|
|
1132
|
+
if (computedDefaultCount > 0) {
|
|
1133
|
+
const computedResult = runComputedDefaults(workingResolved, defaultResolved, userVariantProps, filterOwnVariants, protectedVariantKeys);
|
|
1134
|
+
workingResolved = computedResult.workingResolved;
|
|
1135
|
+
changedVariants = computedResult.changedVariants;
|
|
1136
|
+
}
|
|
1137
|
+
if (refine) {
|
|
1138
|
+
const refineResult = runRefineContext(workingResolved, userVariantProps, filterOwnVariants, false, true, protectedVariants, pendingProtectedVariants, protectedVariantKeys);
|
|
1139
|
+
workingResolved = refineResult.workingResolved;
|
|
1140
|
+
if (refineResult.changedVariants) {
|
|
1141
|
+
changedVariants ??= {};
|
|
1142
|
+
Object.assign(changedVariants, refineResult.changedVariants);
|
|
1143
|
+
}
|
|
1144
|
+
}
|
|
1066
1145
|
return workingResolved;
|
|
1067
1146
|
};
|
|
1068
|
-
const resolveRefine = refine || extMetasWithRefineCount > 0 ? (resolved, userVariantProps, filterOwnVariants = true, runState, protectedVariants, pendingProtectedVariants, protectedVariantKeys) => {
|
|
1147
|
+
const resolveRefine = refine || computedDefaultCount > 0 || extMetasWithRefineCount > 0 ? (resolved, userVariantProps, filterOwnVariants = true, runState, protectedVariants, pendingProtectedVariants, protectedVariantKeys, incomingDefaultResolved = resolved) => {
|
|
1069
1148
|
runState ??= { remaining: MAX_REFINE_RUNS };
|
|
1070
1149
|
protectedVariants ??= {};
|
|
1071
1150
|
protectedVariantKeys ??= /* @__PURE__ */ new Set();
|
|
@@ -1075,7 +1154,8 @@ function create({ transformClass = (className) => className } = {}) {
|
|
|
1075
1154
|
while (runState.remaining > 0) {
|
|
1076
1155
|
runState.remaining -= 1;
|
|
1077
1156
|
const nextPendingProtectedVariants = {};
|
|
1078
|
-
const
|
|
1157
|
+
const defaultResolved = mergeProtectedIntoBase(incomingDefaultResolved, protectedVariants);
|
|
1158
|
+
const nextResolved = resolveRefineOnce(workingResolved, userVariantProps, filterOwnVariants, runState, protectedVariants, nextPendingProtectedVariants, protectedVariantKeys, defaultResolved);
|
|
1079
1159
|
let protectedChanged;
|
|
1080
1160
|
if (pendingProtectedVariants) protectedChanged = mergeVariants(pendingProtectedVariants, nextPendingProtectedVariants, protectedVariantKeys);
|
|
1081
1161
|
else protectedChanged = mergeVariants(protectedVariants, nextPendingProtectedVariants, protectedVariantKeys);
|
|
@@ -1102,19 +1182,12 @@ function create({ transformClass = (className) => className } = {}) {
|
|
|
1102
1182
|
let resolved = {};
|
|
1103
1183
|
Object.assign(resolved, staticDefaults);
|
|
1104
1184
|
let userVariantProps;
|
|
1105
|
-
if (extMetasWithRefineCount > 0) {
|
|
1185
|
+
if (refine || computedDefaultCount > 0 || extMetasWithRefineCount > 0) {
|
|
1106
1186
|
const variantProps = {};
|
|
1107
1187
|
for (let i = 0; i < variantKeysLength; i++) {
|
|
1108
1188
|
const key = variantKeys[i];
|
|
1109
1189
|
if (Object.hasOwn(propsRecord, key)) variantProps[key] = propsRecord[key];
|
|
1110
1190
|
}
|
|
1111
|
-
for (let i = 0; i < extMetasWithRefineCount; i++) {
|
|
1112
|
-
const extDefaults = extMetasWithRefine[i].resolveDefaults(resolved, variantProps);
|
|
1113
|
-
for (const k in extDefaults) {
|
|
1114
|
-
if (!Object.hasOwn(extDefaults, k)) continue;
|
|
1115
|
-
resolved[k] = extDefaults[k];
|
|
1116
|
-
}
|
|
1117
|
-
}
|
|
1118
1191
|
for (const k in variantProps) {
|
|
1119
1192
|
if (!Object.hasOwn(variantProps, k)) continue;
|
|
1120
1193
|
const v = variantProps[k];
|
|
@@ -1173,11 +1246,11 @@ function create({ transformClass = (className) => className } = {}) {
|
|
|
1173
1246
|
const meta = {
|
|
1174
1247
|
baseClass: computedBaseClass,
|
|
1175
1248
|
staticDefaults,
|
|
1176
|
-
resolveDefaults: resolveDefaultsFn,
|
|
1177
1249
|
compute,
|
|
1178
1250
|
resolveRefine,
|
|
1179
1251
|
transformClass,
|
|
1180
|
-
functionVariantKeys
|
|
1252
|
+
functionVariantKeys,
|
|
1253
|
+
computedDefaultKeys
|
|
1181
1254
|
};
|
|
1182
1255
|
const initComponent = (c, propKeys, style) => {
|
|
1183
1256
|
c.class = classFn;
|
|
@@ -1244,7 +1317,6 @@ function create({ transformClass = (className) => className } = {}) {
|
|
|
1244
1317
|
cx
|
|
1245
1318
|
};
|
|
1246
1319
|
}
|
|
1247
|
-
function noop() {}
|
|
1248
1320
|
const { cv, cx } = create();
|
|
1249
1321
|
//#endregion
|
|
1250
1322
|
export { create, cv, cx, splitProps };
|