You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
127 lines
2.9 KiB
127 lines
2.9 KiB
4 weeks ago
|
/*
|
||
|
MIT License http://www.opensource.org/licenses/mit-license.php
|
||
|
Author Gengkun He @ahabhgk
|
||
|
*/
|
||
|
|
||
|
"use strict";
|
||
|
|
||
|
/** @typedef {import("../../declarations/WebpackOptions").CssGeneratorExportsConvention} CssGeneratorExportsConvention */
|
||
|
|
||
|
/**
|
||
|
* @param {string} input input
|
||
|
* @param {CssGeneratorExportsConvention | undefined} convention convention
|
||
|
* @returns {string[]} results
|
||
|
*/
|
||
|
module.exports.cssExportConvention = (input, convention) => {
|
||
|
const set = new Set();
|
||
|
if (typeof convention === "function") {
|
||
|
set.add(convention(input));
|
||
|
} else {
|
||
|
switch (convention) {
|
||
|
case "camel-case": {
|
||
|
set.add(input);
|
||
|
set.add(module.exports.camelCase(input));
|
||
|
break;
|
||
|
}
|
||
|
case "camel-case-only": {
|
||
|
set.add(module.exports.camelCase(input));
|
||
|
break;
|
||
|
}
|
||
|
case "dashes": {
|
||
|
set.add(input);
|
||
|
set.add(module.exports.dashesCamelCase(input));
|
||
|
break;
|
||
|
}
|
||
|
case "dashes-only": {
|
||
|
set.add(module.exports.dashesCamelCase(input));
|
||
|
break;
|
||
|
}
|
||
|
case "as-is": {
|
||
|
set.add(input);
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
return Array.from(set);
|
||
|
};
|
||
|
|
||
|
// Copy from css-loader
|
||
|
/**
|
||
|
* @param {string} input input
|
||
|
* @returns {string} result
|
||
|
*/
|
||
|
module.exports.dashesCamelCase = input =>
|
||
|
input.replace(/-+(\w)/g, (match, firstLetter) => firstLetter.toUpperCase());
|
||
|
|
||
|
// Copy from css-loader
|
||
|
/**
|
||
|
* @param {string} input input
|
||
|
* @returns {string} result
|
||
|
*/
|
||
|
module.exports.camelCase = input => {
|
||
|
let result = input.trim();
|
||
|
|
||
|
if (result.length === 0) {
|
||
|
return "";
|
||
|
}
|
||
|
|
||
|
if (result.length === 1) {
|
||
|
return result.toLowerCase();
|
||
|
}
|
||
|
|
||
|
const hasUpperCase = result !== result.toLowerCase();
|
||
|
|
||
|
if (hasUpperCase) {
|
||
|
result = preserveCamelCase(result);
|
||
|
}
|
||
|
|
||
|
return result
|
||
|
.replace(/^[_.\- ]+/, "")
|
||
|
.toLowerCase()
|
||
|
.replace(/[_.\- ]+([\p{Alpha}\p{N}_]|$)/gu, (_, p1) => p1.toUpperCase())
|
||
|
.replace(/\d+([\p{Alpha}\p{N}_]|$)/gu, m => m.toUpperCase());
|
||
|
};
|
||
|
|
||
|
// Copy from css-loader
|
||
|
/**
|
||
|
* @param {string} string string
|
||
|
* @returns {string} result
|
||
|
*/
|
||
|
const preserveCamelCase = string => {
|
||
|
let result = string;
|
||
|
let isLastCharLower = false;
|
||
|
let isLastCharUpper = false;
|
||
|
let isLastLastCharUpper = false;
|
||
|
|
||
|
for (let i = 0; i < result.length; i++) {
|
||
|
const character = result[i];
|
||
|
|
||
|
if (isLastCharLower && /[\p{Lu}]/u.test(character)) {
|
||
|
result = `${result.slice(0, i)}-${result.slice(i)}`;
|
||
|
isLastCharLower = false;
|
||
|
isLastLastCharUpper = isLastCharUpper;
|
||
|
isLastCharUpper = true;
|
||
|
i += 1;
|
||
|
} else if (
|
||
|
isLastCharUpper &&
|
||
|
isLastLastCharUpper &&
|
||
|
/[\p{Ll}]/u.test(character)
|
||
|
) {
|
||
|
result = `${result.slice(0, i - 1)}-${result.slice(i - 1)}`;
|
||
|
isLastLastCharUpper = isLastCharUpper;
|
||
|
isLastCharUpper = false;
|
||
|
isLastCharLower = true;
|
||
|
} else {
|
||
|
isLastCharLower =
|
||
|
character.toLowerCase() === character &&
|
||
|
character.toUpperCase() !== character;
|
||
|
isLastLastCharUpper = isLastCharUpper;
|
||
|
isLastCharUpper =
|
||
|
character.toUpperCase() === character &&
|
||
|
character.toLowerCase() !== character;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return result;
|
||
|
};
|