142 lines
5.2 KiB
JavaScript
142 lines
5.2 KiB
JavaScript
var CLASS_PART_SEPARATOR = '-';
|
|
function createClassUtils(config) {
|
|
var classMap = createClassMap(config);
|
|
var conflictingClassGroups = config.conflictingClassGroups,
|
|
_config$conflictingCl = config.conflictingClassGroupModifiers,
|
|
conflictingClassGroupModifiers = _config$conflictingCl === void 0 ? {} : _config$conflictingCl;
|
|
function getClassGroupId(className) {
|
|
var classParts = className.split(CLASS_PART_SEPARATOR);
|
|
// Classes like `-inset-1` produce an empty string as first classPart. We assume that classes for negative values are used correctly and remove it from classParts.
|
|
if (classParts[0] === '' && classParts.length !== 1) {
|
|
classParts.shift();
|
|
}
|
|
return getGroupRecursive(classParts, classMap) || getGroupIdForArbitraryProperty(className);
|
|
}
|
|
function getConflictingClassGroupIds(classGroupId, hasPostfixModifier) {
|
|
var conflicts = conflictingClassGroups[classGroupId] || [];
|
|
if (hasPostfixModifier && conflictingClassGroupModifiers[classGroupId]) {
|
|
return [].concat(conflicts, conflictingClassGroupModifiers[classGroupId]);
|
|
}
|
|
return conflicts;
|
|
}
|
|
return {
|
|
getClassGroupId: getClassGroupId,
|
|
getConflictingClassGroupIds: getConflictingClassGroupIds
|
|
};
|
|
}
|
|
function getGroupRecursive(classParts, classPartObject) {
|
|
if (classParts.length === 0) {
|
|
return classPartObject.classGroupId;
|
|
}
|
|
var currentClassPart = classParts[0];
|
|
var nextClassPartObject = classPartObject.nextPart.get(currentClassPart);
|
|
var classGroupFromNextClassPart = nextClassPartObject ? getGroupRecursive(classParts.slice(1), nextClassPartObject) : undefined;
|
|
if (classGroupFromNextClassPart) {
|
|
return classGroupFromNextClassPart;
|
|
}
|
|
if (classPartObject.validators.length === 0) {
|
|
return undefined;
|
|
}
|
|
var classRest = classParts.join(CLASS_PART_SEPARATOR);
|
|
return classPartObject.validators.find(function (_ref) {
|
|
var validator = _ref.validator;
|
|
return validator(classRest);
|
|
})?.classGroupId;
|
|
}
|
|
var arbitraryPropertyRegex = /^\[(.+)\]$/;
|
|
function getGroupIdForArbitraryProperty(className) {
|
|
if (arbitraryPropertyRegex.test(className)) {
|
|
var arbitraryPropertyClassName = arbitraryPropertyRegex.exec(className)[1];
|
|
var property = arbitraryPropertyClassName?.substring(0, arbitraryPropertyClassName.indexOf(':'));
|
|
if (property) {
|
|
// I use two dots here because one dot is used as prefix for class groups in plugins
|
|
return 'arbitrary..' + property;
|
|
}
|
|
}
|
|
}
|
|
/**
|
|
* Exported for testing only
|
|
*/
|
|
function createClassMap(config) {
|
|
var theme = config.theme,
|
|
prefix = config.prefix;
|
|
var classMap = {
|
|
nextPart: new Map(),
|
|
validators: []
|
|
};
|
|
var prefixedClassGroupEntries = getPrefixedClassGroupEntries(Object.entries(config.classGroups), prefix);
|
|
prefixedClassGroupEntries.forEach(function (_ref2) {
|
|
var classGroupId = _ref2[0],
|
|
classGroup = _ref2[1];
|
|
processClassesRecursively(classGroup, classMap, classGroupId, theme);
|
|
});
|
|
return classMap;
|
|
}
|
|
function processClassesRecursively(classGroup, classPartObject, classGroupId, theme) {
|
|
classGroup.forEach(function (classDefinition) {
|
|
if (typeof classDefinition === 'string') {
|
|
var classPartObjectToEdit = classDefinition === '' ? classPartObject : getPart(classPartObject, classDefinition);
|
|
classPartObjectToEdit.classGroupId = classGroupId;
|
|
return;
|
|
}
|
|
if (typeof classDefinition === 'function') {
|
|
if (isThemeGetter(classDefinition)) {
|
|
processClassesRecursively(classDefinition(theme), classPartObject, classGroupId, theme);
|
|
return;
|
|
}
|
|
classPartObject.validators.push({
|
|
validator: classDefinition,
|
|
classGroupId: classGroupId
|
|
});
|
|
return;
|
|
}
|
|
Object.entries(classDefinition).forEach(function (_ref3) {
|
|
var key = _ref3[0],
|
|
classGroup = _ref3[1];
|
|
processClassesRecursively(classGroup, getPart(classPartObject, key), classGroupId, theme);
|
|
});
|
|
});
|
|
}
|
|
function getPart(classPartObject, path) {
|
|
var currentClassPartObject = classPartObject;
|
|
path.split(CLASS_PART_SEPARATOR).forEach(function (pathPart) {
|
|
if (!currentClassPartObject.nextPart.has(pathPart)) {
|
|
currentClassPartObject.nextPart.set(pathPart, {
|
|
nextPart: new Map(),
|
|
validators: []
|
|
});
|
|
}
|
|
currentClassPartObject = currentClassPartObject.nextPart.get(pathPart);
|
|
});
|
|
return currentClassPartObject;
|
|
}
|
|
function isThemeGetter(func) {
|
|
return func.isThemeGetter;
|
|
}
|
|
function getPrefixedClassGroupEntries(classGroupEntries, prefix) {
|
|
if (!prefix) {
|
|
return classGroupEntries;
|
|
}
|
|
return classGroupEntries.map(function (_ref4) {
|
|
var classGroupId = _ref4[0],
|
|
classGroup = _ref4[1];
|
|
var prefixedClassGroup = classGroup.map(function (classDefinition) {
|
|
if (typeof classDefinition === 'string') {
|
|
return prefix + classDefinition;
|
|
}
|
|
if (typeof classDefinition === 'object') {
|
|
return Object.fromEntries(Object.entries(classDefinition).map(function (_ref5) {
|
|
var key = _ref5[0],
|
|
value = _ref5[1];
|
|
return [prefix + key, value];
|
|
}));
|
|
}
|
|
return classDefinition;
|
|
});
|
|
return [classGroupId, prefixedClassGroup];
|
|
});
|
|
}
|
|
|
|
export { createClassMap, createClassUtils };
|
|
//# sourceMappingURL=class-utils.mjs.map
|