name.mjs 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. const matchIconName = /^[a-z0-9]+(-[a-z0-9]+)*$/;
  2. const stringToIcon = (value, validate, allowSimpleName, provider = "") => {
  3. const colonSeparated = value.split(":");
  4. if (value.slice(0, 1) === "@") {
  5. if (colonSeparated.length < 2 || colonSeparated.length > 3) {
  6. return null;
  7. }
  8. provider = colonSeparated.shift().slice(1);
  9. }
  10. if (colonSeparated.length > 3 || !colonSeparated.length) {
  11. return null;
  12. }
  13. if (colonSeparated.length > 1) {
  14. const name2 = colonSeparated.pop();
  15. const prefix = colonSeparated.pop();
  16. const result = {
  17. // Allow provider without '@': "provider:prefix:name"
  18. provider: colonSeparated.length > 0 ? colonSeparated[0] : provider,
  19. prefix,
  20. name: name2
  21. };
  22. return validate && !validateIconName(result) ? null : result;
  23. }
  24. const name = colonSeparated[0];
  25. const dashSeparated = name.split("-");
  26. if (dashSeparated.length > 1) {
  27. const result = {
  28. provider,
  29. prefix: dashSeparated.shift(),
  30. name: dashSeparated.join("-")
  31. };
  32. return validate && !validateIconName(result) ? null : result;
  33. }
  34. if (allowSimpleName && provider === "") {
  35. const result = {
  36. provider,
  37. prefix: "",
  38. name
  39. };
  40. return validate && !validateIconName(result, allowSimpleName) ? null : result;
  41. }
  42. return null;
  43. };
  44. const validateIconName = (icon, allowSimpleName) => {
  45. if (!icon) {
  46. return false;
  47. }
  48. return !!// Check prefix: cannot be empty, unless allowSimpleName is enabled
  49. // Check name: cannot be empty
  50. ((allowSimpleName && icon.prefix === "" || !!icon.prefix) && !!icon.name);
  51. };
  52. export { matchIconName, stringToIcon, validateIconName };