@stats-organization/github-readme-stats-core 2.1.4 → 2.2.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.
Files changed (182) hide show
  1. package/build/api/gist.d.ts +2 -7
  2. package/build/api/gist.d.ts.map +1 -1
  3. package/build/api/gist.js +28 -26
  4. package/build/api/index.d.ts +3 -8
  5. package/build/api/index.d.ts.map +1 -1
  6. package/build/api/index.js +32 -36
  7. package/build/api/pin.d.ts +2 -7
  8. package/build/api/pin.d.ts.map +1 -1
  9. package/build/api/pin.js +18 -33
  10. package/build/api/top-langs.d.ts +2 -7
  11. package/build/api/top-langs.d.ts.map +1 -1
  12. package/build/api/top-langs.js +32 -44
  13. package/build/api/wakatime.d.ts +2 -7
  14. package/build/api/wakatime.d.ts.map +1 -1
  15. package/build/api/wakatime.js +28 -26
  16. package/build/calculateRank.d.ts +12 -11
  17. package/build/calculateRank.d.ts.map +1 -1
  18. package/build/calculateRank.js +18 -18
  19. package/build/cards/common-options.d.ts +13 -0
  20. package/build/cards/common-options.d.ts.map +1 -0
  21. package/build/cards/common-options.js +1 -0
  22. package/build/cards/gist.d.ts +11 -16
  23. package/build/cards/gist.d.ts.map +1 -1
  24. package/build/cards/gist.js +26 -31
  25. package/build/cards/repo.d.ts +19 -16
  26. package/build/cards/repo.d.ts.map +1 -1
  27. package/build/cards/repo.js +79 -72
  28. package/build/cards/stats.d.ts +29 -44
  29. package/build/cards/stats.d.ts.map +1 -1
  30. package/build/cards/stats.js +118 -173
  31. package/build/cards/top-languages.d.ts +81 -77
  32. package/build/cards/top-languages.d.ts.map +1 -1
  33. package/build/cards/top-languages.js +186 -184
  34. package/build/cards/wakatime.d.ts +21 -11
  35. package/build/cards/wakatime.d.ts.map +1 -1
  36. package/build/cards/wakatime.js +92 -109
  37. package/build/common/Card.d.ts +41 -14
  38. package/build/common/Card.d.ts.map +1 -1
  39. package/build/common/Card.js +92 -31
  40. package/build/common/I18n.d.ts +4 -2
  41. package/build/common/I18n.d.ts.map +1 -1
  42. package/build/common/color.d.ts +91 -15
  43. package/build/common/color.d.ts.map +1 -1
  44. package/build/common/color.js +163 -17
  45. package/build/common/config.d.ts +2 -1
  46. package/build/common/config.d.ts.map +1 -1
  47. package/build/common/config.js +16 -26
  48. package/build/common/constants.d.ts +2 -1
  49. package/build/common/constants.d.ts.map +1 -1
  50. package/build/common/date.d.ts +37 -0
  51. package/build/common/date.d.ts.map +1 -0
  52. package/build/common/date.js +31 -0
  53. package/build/common/html.js +1 -1
  54. package/build/common/http.d.ts +37 -5
  55. package/build/common/http.d.ts.map +1 -1
  56. package/build/common/http.js +29 -6
  57. package/build/common/icons.d.ts +1 -0
  58. package/build/common/icons.d.ts.map +1 -1
  59. package/build/common/icons.js +1 -0
  60. package/build/common/languageColors.d.ts +11 -0
  61. package/build/common/languageColors.d.ts.map +1 -0
  62. package/build/common/languageColors.js +15 -0
  63. package/build/common/languageColors.json +10 -1
  64. package/build/common/ops.d.ts +27 -33
  65. package/build/common/ops.d.ts.map +1 -1
  66. package/build/common/ops.js +31 -48
  67. package/build/common/render.d.ts +154 -113
  68. package/build/common/render.d.ts.map +1 -1
  69. package/build/common/render.js +209 -92
  70. package/build/common/retryer.d.ts +15 -6
  71. package/build/common/retryer.d.ts.map +1 -1
  72. package/build/common/retryer.js +2 -0
  73. package/build/fetchers/gist.d.ts +6 -21
  74. package/build/fetchers/gist.d.ts.map +1 -1
  75. package/build/fetchers/gist.js +28 -64
  76. package/build/fetchers/repo.d.ts +12 -11
  77. package/build/fetchers/repo.d.ts.map +1 -1
  78. package/build/fetchers/repo.js +27 -68
  79. package/build/fetchers/stats.d.ts +24 -17
  80. package/build/fetchers/stats.d.ts.map +1 -1
  81. package/build/fetchers/stats.js +302 -184
  82. package/build/fetchers/top-languages.d.ts +10 -15
  83. package/build/fetchers/top-languages.d.ts.map +1 -1
  84. package/build/fetchers/top-languages.js +52 -103
  85. package/build/fetchers/types.d.ts +130 -0
  86. package/build/fetchers/types.d.ts.map +1 -0
  87. package/build/fetchers/types.js +1 -0
  88. package/build/fetchers/wakatime.d.ts +9 -5
  89. package/build/fetchers/wakatime.d.ts.map +1 -1
  90. package/build/fetchers/wakatime.js +8 -4
  91. package/build/graphql/contributionsDocument.d.ts +18 -0
  92. package/build/graphql/contributionsDocument.d.ts.map +1 -0
  93. package/build/graphql/contributionsDocument.js +30 -0
  94. package/build/graphql/generated/common.d.ts +42 -0
  95. package/build/graphql/generated/common.d.ts.map +1 -0
  96. package/build/graphql/generated/common.js +2 -0
  97. package/build/graphql/generated/gist.d.ts +44 -0
  98. package/build/graphql/generated/gist.d.ts.map +1 -0
  99. package/build/graphql/generated/gist.js +27 -0
  100. package/build/graphql/generated/repo.d.ts +67 -0
  101. package/build/graphql/generated/repo.d.ts.map +1 -0
  102. package/build/graphql/generated/repo.js +30 -0
  103. package/build/graphql/generated/stats.d.ts +150 -0
  104. package/build/graphql/generated/stats.d.ts.map +1 -0
  105. package/build/graphql/generated/stats.js +95 -0
  106. package/build/graphql/generated/top-languages.d.ts +54 -0
  107. package/build/graphql/generated/top-languages.d.ts.map +1 -0
  108. package/build/graphql/generated/top-languages.js +27 -0
  109. package/build/graphql/graphqlDocument.d.ts +22 -0
  110. package/build/graphql/graphqlDocument.d.ts.map +1 -0
  111. package/build/graphql/graphqlDocument.js +8 -0
  112. package/build/graphql/reposContributedToDocument.d.ts +27 -0
  113. package/build/graphql/reposContributedToDocument.d.ts.map +1 -0
  114. package/build/graphql/reposContributedToDocument.js +59 -0
  115. package/build/index.d.ts +3 -1
  116. package/build/index.d.ts.map +1 -1
  117. package/build/index.js +2 -1
  118. package/build/themes/index.d.ts +32 -0
  119. package/build/themes/index.d.ts.map +1 -1
  120. package/build/themes/index.js +28 -0
  121. package/build/translations.d.ts +17 -0
  122. package/build/translations.d.ts.map +1 -1
  123. package/build/translations.js +17 -0
  124. package/package.json +14 -8
  125. package/src/_emoji-name-map.d.ts +10 -0
  126. package/src/_github-username-regex.d.ts +4 -0
  127. package/src/api/gist.js +31 -31
  128. package/src/api/index.js +40 -42
  129. package/src/api/pin.js +20 -38
  130. package/src/api/top-langs.js +36 -49
  131. package/src/api/wakatime.js +31 -31
  132. package/src/{calculateRank.js → calculateRank.ts} +29 -19
  133. package/src/cards/common-options.ts +13 -0
  134. package/src/cards/{gist.js → gist.ts} +37 -37
  135. package/src/cards/{repo.js → repo.ts} +107 -79
  136. package/src/cards/{stats.js → stats.ts} +173 -210
  137. package/src/cards/{top-languages.js → top-languages.ts} +325 -243
  138. package/src/cards/{wakatime.js → wakatime.ts} +158 -127
  139. package/src/common/Card.ts +123 -43
  140. package/src/common/I18n.ts +6 -2
  141. package/src/common/color.ts +240 -28
  142. package/src/common/config.ts +22 -29
  143. package/src/common/constants.ts +3 -1
  144. package/src/common/date.ts +45 -0
  145. package/src/common/html.ts +1 -1
  146. package/src/common/http.ts +71 -0
  147. package/src/common/icons.ts +1 -0
  148. package/src/common/languageColors.json +10 -1
  149. package/src/common/languageColors.ts +19 -0
  150. package/src/common/ops.ts +158 -0
  151. package/src/common/render.ts +652 -0
  152. package/src/common/retryer.ts +21 -12
  153. package/src/fetchers/gist.ts +79 -0
  154. package/src/fetchers/repo.ts +114 -0
  155. package/src/fetchers/stats.ts +743 -0
  156. package/src/fetchers/top-languages.ts +135 -0
  157. package/src/fetchers/{types.d.ts → types.ts} +28 -20
  158. package/src/fetchers/{wakatime.js → wakatime.ts} +19 -5
  159. package/src/graphql/contributionsDocument.ts +44 -0
  160. package/src/graphql/generated/common.ts +26 -0
  161. package/src/graphql/generated/gist.ts +59 -0
  162. package/src/graphql/generated/repo.ts +90 -0
  163. package/src/graphql/generated/stats.ts +194 -0
  164. package/src/graphql/generated/top-languages.ts +75 -0
  165. package/src/graphql/graphqlDocument.ts +25 -0
  166. package/src/graphql/queries/gist.graphql +25 -0
  167. package/src/graphql/queries/repo.graphql +28 -0
  168. package/src/graphql/queries/stats.graphql +120 -0
  169. package/src/graphql/queries/top-languages.graphql +34 -0
  170. package/src/graphql/reposContributedToDocument.ts +86 -0
  171. package/src/index.ts +3 -1
  172. package/src/themes/index.ts +33 -0
  173. package/src/translations.ts +17 -0
  174. package/src/cards/types.d.ts +0 -78
  175. package/src/common/http.js +0 -19
  176. package/src/common/ops.js +0 -170
  177. package/src/common/render.js +0 -440
  178. package/src/fetchers/gist.js +0 -112
  179. package/src/fetchers/repo.js +0 -161
  180. package/src/fetchers/stats.js +0 -474
  181. package/src/fetchers/top-languages.js +0 -175
  182. package/src/themes/README.md +0 -229
@@ -1,4 +1,5 @@
1
1
  import { renderTopLanguages } from "../cards/top-languages.js";
2
+ import { findInvalidColorParam, pickColorParams } from "../common/color.js";
2
3
  import {
3
4
  MissingParamError,
4
5
  retrieveSecondaryMessage,
@@ -16,11 +17,6 @@ export default async (
16
17
  hide_title,
17
18
  hide_border,
18
19
  card_width,
19
- title_color,
20
- text_color,
21
- bg_color,
22
- prog_bar_bg_color,
23
- theme,
24
20
  layout,
25
21
  langs_count,
26
22
  exclude_repo,
@@ -29,70 +25,76 @@ export default async (
29
25
  custom_title,
30
26
  locale,
31
27
  border_radius,
32
- border_color,
33
28
  role,
34
29
  disable_animations,
35
30
  hide_progress,
36
31
  hide_values,
37
32
  stats_format,
33
+ ...remainingParams
38
34
  },
39
35
  pat = null,
40
36
  ) => {
37
+ const colorParams = pickColorParams(remainingParams);
38
+
39
+ const invalidColorInput = findInvalidColorParam(colorParams);
40
+
41
+ if (invalidColorInput) {
42
+ return {
43
+ status: "error - permanent",
44
+ content: renderError({
45
+ message: "Something went wrong",
46
+ secondaryMessage: `Invalid color input for parameter "${invalidColorInput}"`,
47
+ }),
48
+ };
49
+ }
50
+
41
51
  if (locale && !isLocaleAvailable(locale)) {
42
52
  return {
43
53
  status: "error - permanent",
44
54
  content: renderError({
45
55
  message: "Something went wrong",
46
56
  secondaryMessage: "Locale not found",
47
- renderOptions: {
48
- title_color,
49
- text_color,
50
- bg_color,
51
- border_color,
52
- theme,
53
- },
57
+ renderOptions: colorParams,
58
+ }),
59
+ };
60
+ }
61
+
62
+ const safePattern = /^[-\w/.,]+$/;
63
+ if (username && !safePattern.test(username)) {
64
+ return {
65
+ status: "error - permanent",
66
+ content: renderError({
67
+ message: "Something went wrong",
68
+ secondaryMessage: "Username contains unsafe characters",
69
+ renderOptions: colorParams,
54
70
  }),
55
71
  };
56
72
  }
57
73
 
58
74
  if (
59
75
  layout !== undefined &&
60
- (typeof layout !== "string" ||
61
- !["compact", "normal", "donut", "donut-vertical", "pie"].includes(layout))
76
+ !["compact", "normal", "donut", "donut-vertical", "pie"].includes(layout)
62
77
  ) {
63
78
  return {
64
79
  status: "error - permanent",
65
80
  content: renderError({
66
81
  message: "Something went wrong",
67
82
  secondaryMessage: "Incorrect layout input",
68
- renderOptions: {
69
- title_color,
70
- text_color,
71
- bg_color,
72
- border_color,
73
- theme,
74
- },
83
+ renderOptions: colorParams,
75
84
  }),
76
85
  };
77
86
  }
78
87
 
79
88
  if (
80
89
  stats_format !== undefined &&
81
- (typeof stats_format !== "string" ||
82
- !["bytes", "percentages"].includes(stats_format))
90
+ !["bytes", "percentages"].includes(stats_format)
83
91
  ) {
84
92
  return {
85
93
  status: "error - permanent",
86
94
  content: renderError({
87
95
  message: "Something went wrong",
88
96
  secondaryMessage: "Incorrect stats_format input",
89
- renderOptions: {
90
- title_color,
91
- text_color,
92
- bg_color,
93
- border_color,
94
- theme,
95
- },
97
+ renderOptions: colorParams,
96
98
  }),
97
99
  };
98
100
  }
@@ -110,20 +112,15 @@ export default async (
110
112
  return {
111
113
  status: "success",
112
114
  content: renderTopLanguages(topLangs, {
115
+ ...colorParams,
113
116
  custom_title,
114
117
  hide_title: parseBoolean(hide_title),
115
118
  hide_border: parseBoolean(hide_border),
116
119
  card_width: parseInt(card_width, 10),
117
120
  hide: parseArray(hide),
118
- title_color,
119
- text_color,
120
- bg_color,
121
- prog_bar_bg_color,
122
- theme,
123
121
  layout,
124
122
  langs_count,
125
123
  border_radius,
126
- border_color,
127
124
  locale: locale ? locale.toLowerCase() : null,
128
125
  disable_animations: parseBoolean(disable_animations),
129
126
  hide_progress: parseBoolean(hide_progress),
@@ -139,11 +136,7 @@ export default async (
139
136
  message: err.message,
140
137
  secondaryMessage: retrieveSecondaryMessage(err),
141
138
  renderOptions: {
142
- title_color,
143
- text_color,
144
- bg_color,
145
- border_color,
146
- theme,
139
+ ...colorParams,
147
140
  show_repo_link: !(err instanceof MissingParamError),
148
141
  },
149
142
  }),
@@ -153,13 +146,7 @@ export default async (
153
146
  status: "error - temporary",
154
147
  content: renderError({
155
148
  message: "An unknown error occurred",
156
- renderOptions: {
157
- title_color,
158
- text_color,
159
- bg_color,
160
- border_color,
161
- theme,
162
- },
149
+ renderOptions: colorParams,
163
150
  }),
164
151
  };
165
152
  }
@@ -1,4 +1,5 @@
1
1
  import { renderWakatimeCard } from "../cards/wakatime.js";
2
+ import { findInvalidColorParam, pickColorParams } from "../common/color.js";
2
3
  import {
3
4
  MissingParamError,
4
5
  retrieveSecondaryMessage,
@@ -11,14 +12,9 @@ import { isLocaleAvailable } from "../translations.js";
11
12
  // @ts-ignore
12
13
  export default async ({
13
14
  username,
14
- title_color,
15
- icon_color,
16
15
  hide_border,
17
16
  card_width,
18
17
  line_height,
19
- text_color,
20
- bg_color,
21
- theme,
22
18
  hide_title,
23
19
  hide_progress,
24
20
  custom_title,
@@ -28,23 +24,42 @@ export default async ({
28
24
  hide,
29
25
  api_domain,
30
26
  border_radius,
31
- border_color,
32
27
  display_format,
33
28
  disable_animations,
29
+ ...remainingParams
34
30
  }) => {
31
+ const colorParams = pickColorParams(remainingParams);
32
+
33
+ const invalidColorInput = findInvalidColorParam(colorParams);
34
+ if (invalidColorInput) {
35
+ return {
36
+ status: "error - permanent",
37
+ content: renderError({
38
+ message: "Something went wrong",
39
+ secondaryMessage: `Invalid color input for parameter "${invalidColorInput}"`,
40
+ }),
41
+ };
42
+ }
43
+
35
44
  if (locale && !isLocaleAvailable(locale)) {
36
45
  return {
37
46
  status: "error - permanent",
38
47
  content: renderError({
39
48
  message: "Something went wrong",
40
49
  secondaryMessage: "Language not found",
41
- renderOptions: {
42
- title_color,
43
- text_color,
44
- bg_color,
45
- border_color,
46
- theme,
47
- },
50
+ renderOptions: colorParams,
51
+ }),
52
+ };
53
+ }
54
+
55
+ const safePattern = /^[-\w/.,]+$/;
56
+ if (username && !safePattern.test(username)) {
57
+ return {
58
+ status: "error - permanent",
59
+ content: renderError({
60
+ message: "Something went wrong",
61
+ secondaryMessage: "Username contains unsafe characters",
62
+ renderOptions: colorParams,
48
63
  }),
49
64
  };
50
65
  }
@@ -55,20 +70,15 @@ export default async ({
55
70
  return {
56
71
  status: "success",
57
72
  content: renderWakatimeCard(stats, {
73
+ ...colorParams,
58
74
  custom_title,
59
75
  hide_title: parseBoolean(hide_title),
60
76
  hide_border: parseBoolean(hide_border),
61
77
  card_width: parseInt(card_width, 10),
62
78
  hide: parseArray(hide),
63
79
  line_height,
64
- title_color,
65
- icon_color,
66
- text_color,
67
- bg_color,
68
- theme,
69
80
  hide_progress,
70
81
  border_radius,
71
- border_color,
72
82
  locale: locale ? locale.toLowerCase() : null,
73
83
  layout,
74
84
  langs_count,
@@ -84,11 +94,7 @@ export default async ({
84
94
  message: err.message,
85
95
  secondaryMessage: retrieveSecondaryMessage(err),
86
96
  renderOptions: {
87
- title_color,
88
- text_color,
89
- bg_color,
90
- border_color,
91
- theme,
97
+ ...colorParams,
92
98
  show_repo_link: !(err instanceof MissingParamError),
93
99
  },
94
100
  }),
@@ -98,13 +104,7 @@ export default async ({
98
104
  status: "error - temporary",
99
105
  content: renderError({
100
106
  message: "An unknown error occurred",
101
- renderOptions: {
102
- title_color,
103
- text_color,
104
- bg_color,
105
- border_color,
106
- theme,
107
- },
107
+ renderOptions: colorParams,
108
108
  }),
109
109
  };
110
110
  }
@@ -1,20 +1,20 @@
1
1
  /**
2
2
  * Calculates the exponential cdf.
3
3
  *
4
- * @param {number} x The value.
5
- * @returns {number} The exponential cdf.
4
+ * @param x The value.
5
+ * @returns The exponential cdf.
6
6
  */
7
- function exponential_cdf(x) {
7
+ function exponential_cdf(x: number): number {
8
8
  return 1 - 2 ** -x;
9
9
  }
10
10
 
11
11
  /**
12
12
  * Calculates the log normal cdf.
13
13
  *
14
- * @param {number} x The value.
15
- * @returns {number} The log normal cdf.
14
+ * @param x The value.
15
+ * @returns The log normal cdf.
16
16
  */
17
- function log_normal_cdf(x) {
17
+ function log_normal_cdf(x: number): number {
18
18
  // approximation
19
19
  return x / (1 + x);
20
20
  }
@@ -22,16 +22,16 @@ function log_normal_cdf(x) {
22
22
  /**
23
23
  * Calculates the users rank.
24
24
  *
25
- * @param {object} params Parameters on which the user's rank depends.
26
- * @param {boolean} params.all_commits Whether `include_all_commits` was used.
27
- * @param {number} params.commits Number of commits.
28
- * @param {number} params.prs The number of pull requests.
29
- * @param {number} params.issues The number of issues.
30
- * @param {number} params.reviews The number of reviews.
31
- * @param {number} params.repos Total number of repos.
32
- * @param {number} params.stars The number of stars.
33
- * @param {number} params.followers The number of followers.
34
- * @returns {{ level: string, percentile: number }} The users rank.
25
+ * @param params Parameters on which the user's rank depends.
26
+ * @param params.all_commits Whether `include_all_commits` was used.
27
+ * @param params.commits Number of commits.
28
+ * @param params.prs The number of pull requests.
29
+ * @param params.issues The number of issues.
30
+ * @param params.reviews The number of reviews.
31
+ * @param params.repos Total number of repos (accepted for compatibility, unused in the calculation).
32
+ * @param params.stars The number of stars.
33
+ * @param params.followers The number of followers.
34
+ * @returns The users rank.
35
35
  */
36
36
  function calculateRank({
37
37
  all_commits,
@@ -39,11 +39,18 @@ function calculateRank({
39
39
  prs,
40
40
  issues,
41
41
  reviews,
42
- // eslint-disable-next-line no-unused-vars
43
- repos, // unused
44
42
  stars,
45
43
  followers,
46
- }) {
44
+ }: {
45
+ all_commits: boolean;
46
+ commits: number;
47
+ prs: number;
48
+ issues: number;
49
+ reviews: number;
50
+ repos: number;
51
+ stars: number;
52
+ followers: number;
53
+ }): { level: string; percentile: number } {
47
54
  const COMMITS_MEDIAN = all_commits ? 1000 : 250,
48
55
  COMMITS_WEIGHT = 2;
49
56
  const PRS_MEDIAN = 50,
@@ -79,6 +86,9 @@ function calculateRank({
79
86
  TOTAL_WEIGHT;
80
87
 
81
88
  const level = LEVELS[THRESHOLDS.findIndex((t) => rank * 100 <= t)];
89
+ if (level === undefined) {
90
+ throw new Error("Unable to determine rank level");
91
+ }
82
92
 
83
93
  return { level, percentile: rank * 100 };
84
94
  }
@@ -0,0 +1,13 @@
1
+ import type { ThemeName } from "../themes/index.js";
2
+
3
+ export interface CommonOptions {
4
+ title_color: string;
5
+ icon_color: string;
6
+ text_color: string;
7
+ bg_color: string;
8
+ theme: ThemeName;
9
+ border_radius: number;
10
+ border_color: string;
11
+ locale: string;
12
+ hide_border: boolean;
13
+ }
@@ -1,9 +1,9 @@
1
1
  import { default as Card } from "../common/Card.js";
2
- import { getCardColors } from "../common/color.js";
2
+ import { getLightDarkColors } from "../common/color.js";
3
3
  import { kFormatter, wrapTextMultiline } from "../common/fmt.js";
4
4
  import { encodeHTML } from "../common/html.js";
5
5
  import { icons } from "../common/icons.js";
6
- import languageColors from "../common/languageColors.json" with { type: "json" };
6
+ import { getLanguageColor } from "../common/languageColors.js";
7
7
  import { parseEmojis } from "../common/ops.js";
8
8
  import {
9
9
  countWrappedLines,
@@ -14,6 +14,9 @@ import {
14
14
  wrappedTextNode,
15
15
  wrappedTextStyles,
16
16
  } from "../common/render.js";
17
+ import type { GistData } from "../fetchers/types.js";
18
+
19
+ import type { CommonOptions } from "./common-options.js";
17
20
 
18
21
  const ICON_SIZE = 16;
19
22
  const CARD_DEFAULT_WIDTH = 400;
@@ -24,48 +27,39 @@ const DESCRIPTION_FONT_SIZE = 13;
24
27
  const DESCRIPTION_LINE_HEIGHT_PX = 16;
25
28
  const DESCRIPTION_MAX_LINES = 10;
26
29
 
27
- /**
28
- * @typedef {import('./types').GistCardOptions} GistCardOptions Gist card options.
29
- * @typedef {import('../fetchers/types').GistData} GistData Gist data.
30
- */
30
+ interface GistCardOptions extends CommonOptions {
31
+ show_owner: boolean;
32
+ browser_rendering: boolean;
33
+ }
31
34
 
32
35
  /**
33
36
  * Render gist card.
34
37
  *
35
- * @param {GistData} gistData Gist data.
36
- * @param {Partial<GistCardOptions>} options Gist card options.
37
- * @returns {string} Gist card.
38
+ * @param gistData Gist data.
39
+ * @param options Gist card options.
40
+ * @returns Gist card.
38
41
  */
39
- const renderGistCard = (gistData, options = {}) => {
42
+ const renderGistCard = (
43
+ gistData: GistData,
44
+ options: Partial<GistCardOptions> = {},
45
+ ): string => {
40
46
  const { name, nameWithOwner, description, language, starsCount, forksCount } =
41
47
  gistData;
42
48
  const {
43
- title_color,
44
- icon_color,
45
- text_color,
46
- bg_color,
47
49
  theme = "default_repocard",
48
50
  border_radius,
49
- border_color,
50
51
  show_owner = false,
51
52
  browser_rendering = false,
52
53
  hide_border = false,
53
54
  } = options;
54
55
 
55
- // returns theme based colors with proper overrides and defaults
56
- const { titleColor, textColor, iconColor, bgColor, borderColor } =
57
- getCardColors({
58
- title_color,
59
- icon_color,
60
- text_color,
61
- bg_color,
62
- border_color,
63
- theme,
64
- });
56
+ const { lightColors, darkColors } = getLightDarkColors({ ...options, theme });
57
+ const { textColor, iconColor } = lightColors;
65
58
 
66
59
  const desc = parseEmojis(description || "No description provided");
67
60
 
68
- let descriptionLines, descriptionSvg;
61
+ let descriptionLines: number;
62
+ let descriptionSvg: string;
69
63
  if (browser_rendering) {
70
64
  // The browser performs the actual text wrapping inside the foreignObject;
71
65
  // we only estimate the line count server-side so the SVG can reserve enough
@@ -128,8 +122,7 @@ const renderGistCard = (gistData, options = {}) => {
128
122
  );
129
123
 
130
124
  const languageName = language || "Unspecified";
131
- // @ts-ignore
132
- const languageColor = languageColors[languageName] || "#858585";
125
+ const languageColor = getLanguageColor(languageName);
133
126
 
134
127
  const svgLanguage = createLanguageNode(languageName, languageColor);
135
128
 
@@ -154,23 +147,30 @@ const renderGistCard = (gistData, options = {}) => {
154
147
  width: CARD_DEFAULT_WIDTH,
155
148
  height,
156
149
  border_radius,
157
- colors: {
158
- titleColor,
159
- textColor,
160
- iconColor,
161
- bgColor,
162
- borderColor,
163
- },
150
+ colors: { light: lightColors, dark: darkColors },
164
151
  });
165
152
 
166
- card.setCSS(`
153
+ card.setCSS({
154
+ light: `
167
155
  .description {
168
156
  font: 400 ${DESCRIPTION_FONT_SIZE}px 'Segoe UI', Ubuntu, Sans-Serif;fill: ${textColor};
169
157
  ${browser_rendering ? wrappedTextStyles(textColor) : ""}
170
158
  }
171
159
  .gray { font: 400 12px 'Segoe UI', Ubuntu, Sans-Serif; fill: ${textColor} }
172
160
  .icon { fill: ${iconColor} }
173
- `);
161
+ `,
162
+ dark: darkColors
163
+ ? `
164
+ .description {
165
+ fill: ${darkColors.textColor};
166
+ ${browser_rendering ? wrappedTextStyles(darkColors.textColor) : ""}
167
+ }
168
+ .gray { fill: ${darkColors.textColor} }
169
+ .icon { fill: ${darkColors.iconColor} }
170
+ `
171
+ : null,
172
+ });
173
+
174
174
  card.setHideBorder(hide_border);
175
175
 
176
176
  return card.render(`