ProxyScriptingJsFuncHelper.cs 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using Abp.Collections.Extensions;
  6. using Abp.Extensions;
  7. using Abp.Web.Api.Modeling;
  8. namespace Abp.Web.Api.ProxyScripting.Generators
  9. {
  10. public static class ProxyScriptingJsFuncHelper
  11. {
  12. private const string ValidJsVariableNameChars = "abcdefghijklmnopqrstuxwvyzABCDEFGHIJKLMNOPQRSTUXWVYZ0123456789_";
  13. private static readonly HashSet<string> ReservedWords = new HashSet<string> {
  14. "abstract",
  15. "else",
  16. "instanceof",
  17. "super",
  18. "boolean",
  19. "enum",
  20. "int",
  21. "switch",
  22. "break",
  23. "export",
  24. "interface",
  25. "synchronized",
  26. "byte",
  27. "extends",
  28. "let",
  29. "this",
  30. "case",
  31. "false",
  32. "long",
  33. "throw",
  34. "catch",
  35. "final",
  36. "native",
  37. "throws",
  38. "char",
  39. "finally",
  40. "new",
  41. "transient",
  42. "class",
  43. "float",
  44. "null",
  45. "true",
  46. "const",
  47. "for",
  48. "package",
  49. "try",
  50. "continue",
  51. "function",
  52. "private",
  53. "typeof",
  54. "debugger",
  55. "goto",
  56. "protected",
  57. "var",
  58. "default",
  59. "if",
  60. "public",
  61. "void",
  62. "delete",
  63. "implements",
  64. "return",
  65. "volatile",
  66. "do",
  67. "import",
  68. "short",
  69. "while",
  70. "double",
  71. "in",
  72. "static",
  73. "with"
  74. };
  75. public static string NormalizeJsVariableName(string name, string additionalChars = "")
  76. {
  77. var validChars = ValidJsVariableNameChars + additionalChars;
  78. var sb = new StringBuilder(name);
  79. sb.Replace('-', '_');
  80. //Delete invalid chars
  81. foreach (var c in name)
  82. {
  83. if (!validChars.Contains(c))
  84. {
  85. sb.Replace(c.ToString(), "");
  86. }
  87. }
  88. if (sb.Length == 0)
  89. {
  90. return "_" + Guid.NewGuid().ToString("N").Left(8);
  91. }
  92. return sb.ToString();
  93. }
  94. public static string WrapWithBracketsOrWithDotPrefix(string name)
  95. {
  96. if (!ReservedWords.Contains(name))
  97. {
  98. return "." + name;
  99. }
  100. return "['" + name + "']";
  101. }
  102. public static string GetParamNameInJsFunc(ParameterApiDescriptionModel parameterInfo)
  103. {
  104. return parameterInfo.Name == parameterInfo.NameOnMethod
  105. ? NormalizeJsVariableName(parameterInfo.Name.ToCamelCase(), ".")
  106. : NormalizeJsVariableName(parameterInfo.NameOnMethod.ToCamelCase()) + "." + NormalizeJsVariableName(parameterInfo.Name.ToCamelCase(), ".");
  107. }
  108. public static string CreateJsObjectLiteral(ParameterApiDescriptionModel[] parameters, int indent = 0)
  109. {
  110. var sb = new StringBuilder();
  111. sb.AppendLine("{");
  112. foreach (var prm in parameters)
  113. {
  114. sb.AppendLine($"{new string(' ', indent)} '{prm.Name}': {GetParamNameInJsFunc(prm)}");
  115. }
  116. sb.Append(new string(' ', indent) + "}");
  117. return sb.ToString();
  118. }
  119. public static string GenerateJsFuncParameterList(ActionApiDescriptionModel action, string ajaxParametersName)
  120. {
  121. var methodParamNames = action.Parameters.Select(p => p.NameOnMethod).Distinct().ToList();
  122. methodParamNames.Add(ajaxParametersName);
  123. return methodParamNames.Select(prmName => NormalizeJsVariableName(prmName.ToCamelCase())).JoinAsString(", ");
  124. }
  125. }
  126. }