@stats-organization/github-readme-stats-core 0.0.1

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 (140) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +1 -0
  3. package/build/api/gist.d.ts +19 -0
  4. package/build/api/gist.d.ts.map +1 -0
  5. package/build/api/gist.js +77 -0
  6. package/build/api/index.d.ts +37 -0
  7. package/build/api/index.d.ts.map +1 -0
  8. package/build/api/index.js +115 -0
  9. package/build/api/pin.d.ts +27 -0
  10. package/build/api/pin.d.ts.map +1 -0
  11. package/build/api/pin.js +104 -0
  12. package/build/api/top-langs.d.ts +31 -0
  13. package/build/api/top-langs.d.ts.map +1 -0
  14. package/build/api/top-langs.js +121 -0
  15. package/build/api/wakatime.d.ts +28 -0
  16. package/build/api/wakatime.d.ts.map +1 -0
  17. package/build/api/wakatime.js +85 -0
  18. package/build/calculateRank.d.ts +28 -0
  19. package/build/calculateRank.d.ts.map +1 -0
  20. package/build/calculateRank.js +63 -0
  21. package/build/cards/gist.d.ts +21 -0
  22. package/build/cards/gist.d.ts.map +1 -0
  23. package/build/cards/gist.js +124 -0
  24. package/build/cards/repo.d.ts +21 -0
  25. package/build/cards/repo.d.ts.map +1 -0
  26. package/build/cards/repo.js +264 -0
  27. package/build/cards/stats.d.ts +49 -0
  28. package/build/cards/stats.d.ts.map +1 -0
  29. package/build/cards/stats.js +527 -0
  30. package/build/cards/top-languages.d.ts +143 -0
  31. package/build/cards/top-languages.d.ts.map +1 -0
  32. package/build/cards/top-languages.js +795 -0
  33. package/build/cards/wakatime.d.ts +16 -0
  34. package/build/cards/wakatime.d.ts.map +1 -0
  35. package/build/cards/wakatime.js +387 -0
  36. package/build/common/Card.d.ts +109 -0
  37. package/build/common/Card.d.ts.map +1 -0
  38. package/build/common/Card.js +241 -0
  39. package/build/common/I18n.d.ts +26 -0
  40. package/build/common/I18n.d.ts.map +1 -0
  41. package/build/common/I18n.js +34 -0
  42. package/build/common/color.d.ts +53 -0
  43. package/build/common/color.d.ts.map +1 -0
  44. package/build/common/color.js +92 -0
  45. package/build/common/config.d.ts +3 -0
  46. package/build/common/config.d.ts.map +1 -0
  47. package/build/common/config.js +69 -0
  48. package/build/common/constants.d.ts +6 -0
  49. package/build/common/constants.d.ts.map +1 -0
  50. package/build/common/constants.js +7 -0
  51. package/build/common/error.d.ts +53 -0
  52. package/build/common/error.d.ts.map +1 -0
  53. package/build/common/error.js +72 -0
  54. package/build/common/fmt.d.ts +27 -0
  55. package/build/common/fmt.d.ts.map +1 -0
  56. package/build/common/fmt.js +66 -0
  57. package/build/common/html.d.ts +10 -0
  58. package/build/common/html.d.ts.map +1 -0
  59. package/build/common/html.js +18 -0
  60. package/build/common/http.d.ts +9 -0
  61. package/build/common/http.d.ts.map +1 -0
  62. package/build/common/http.js +18 -0
  63. package/build/common/icons.d.ts +26 -0
  64. package/build/common/icons.d.ts.map +1 -0
  65. package/build/common/icons.js +77 -0
  66. package/build/common/languageColors.json +667 -0
  67. package/build/common/log.d.ts +9 -0
  68. package/build/common/log.d.ts.map +1 -0
  69. package/build/common/log.js +8 -0
  70. package/build/common/ops.d.ts +65 -0
  71. package/build/common/ops.d.ts.map +1 -0
  72. package/build/common/ops.js +137 -0
  73. package/build/common/render.d.ts +155 -0
  74. package/build/common/render.d.ts.map +1 -0
  75. package/build/common/render.js +361 -0
  76. package/build/common/retryer.d.ts +22 -0
  77. package/build/common/retryer.d.ts.map +1 -0
  78. package/build/common/retryer.js +86 -0
  79. package/build/fetchers/gist.d.ts +26 -0
  80. package/build/fetchers/gist.d.ts.map +1 -0
  81. package/build/fetchers/gist.js +99 -0
  82. package/build/fetchers/repo.d.ts +16 -0
  83. package/build/fetchers/repo.d.ts.map +1 -0
  84. package/build/fetchers/repo.js +116 -0
  85. package/build/fetchers/stats.d.ts +22 -0
  86. package/build/fetchers/stats.d.ts.map +1 -0
  87. package/build/fetchers/stats.js +339 -0
  88. package/build/fetchers/top-languages.d.ts +20 -0
  89. package/build/fetchers/top-languages.d.ts.map +1 -0
  90. package/build/fetchers/top-languages.js +139 -0
  91. package/build/fetchers/wakatime.d.ts +11 -0
  92. package/build/fetchers/wakatime.d.ts.map +1 -0
  93. package/build/fetchers/wakatime.js +25 -0
  94. package/build/index.d.ts +20 -0
  95. package/build/index.d.ts.map +1 -0
  96. package/build/index.js +19 -0
  97. package/build/themes/index.d.ts +469 -0
  98. package/build/themes/index.d.ts.map +1 -0
  99. package/build/themes/index.js +468 -0
  100. package/build/translations.d.ts +533 -0
  101. package/build/translations.d.ts.map +1 -0
  102. package/build/translations.js +1140 -0
  103. package/package.json +94 -0
  104. package/src/api/gist.js +99 -0
  105. package/src/api/index.js +185 -0
  106. package/src/api/pin.js +146 -0
  107. package/src/api/top-langs.js +168 -0
  108. package/src/api/wakatime.js +113 -0
  109. package/src/calculateRank.js +86 -0
  110. package/src/cards/gist.js +187 -0
  111. package/src/cards/repo.js +365 -0
  112. package/src/cards/stats.js +673 -0
  113. package/src/cards/top-languages.js +1023 -0
  114. package/src/cards/types.d.ts +78 -0
  115. package/src/cards/wakatime.js +471 -0
  116. package/src/common/Card.js +275 -0
  117. package/src/common/I18n.js +42 -0
  118. package/src/common/color.js +145 -0
  119. package/src/common/config.js +78 -0
  120. package/src/common/constants.js +9 -0
  121. package/src/common/error.js +90 -0
  122. package/src/common/fmt.js +80 -0
  123. package/src/common/html.js +22 -0
  124. package/src/common/http.js +21 -0
  125. package/src/common/icons.js +81 -0
  126. package/src/common/languageColors.json +667 -0
  127. package/src/common/log.ts +12 -0
  128. package/src/common/ops.js +172 -0
  129. package/src/common/render.js +442 -0
  130. package/src/common/retryer.js +104 -0
  131. package/src/fetchers/gist.js +114 -0
  132. package/src/fetchers/repo.js +165 -0
  133. package/src/fetchers/stats.js +478 -0
  134. package/src/fetchers/top-languages.js +177 -0
  135. package/src/fetchers/types.d.ts +128 -0
  136. package/src/fetchers/wakatime.js +37 -0
  137. package/src/index.ts +25 -0
  138. package/src/themes/README.md +229 -0
  139. package/src/themes/index.ts +476 -0
  140. package/src/translations.js +1156 -0
package/package.json ADDED
@@ -0,0 +1,94 @@
1
+ {
2
+ "name": "@stats-organization/github-readme-stats-core",
3
+ "version": "0.0.1",
4
+ "type": "module",
5
+ "homepage": "https://github-stats-extended.vercel.app/frontend",
6
+ "bugs": {
7
+ "url": "https://github.com/stats-organization/github-stats-extended/issues"
8
+ },
9
+ "repository": {
10
+ "type": "git",
11
+ "url": "https://github.com/stats-organization/github-stats-extended.git",
12
+ "directory": "packages/core"
13
+ },
14
+ "author": {
15
+ "name": "Anurag Hazra",
16
+ "url": "https://github.com/anuraghazra/"
17
+ },
18
+ "contributors": [
19
+ {
20
+ "name": "Rick Staa",
21
+ "url": "https://github.com/rickstaa"
22
+ },
23
+ {
24
+ "name": "Alexandr Garbuzov",
25
+ "url": "https://github.com/qwerty541"
26
+ },
27
+ {
28
+ "name": "Abhijit Gupta",
29
+ "url": "https://github.com/avgupta456"
30
+ },
31
+ {
32
+ "name": "Marco Pasqualetti",
33
+ "url": "https://github.com/marcalexiei"
34
+ },
35
+ {
36
+ "name": "martin-mfg",
37
+ "url": "https://github.com/martin-mfg"
38
+ }
39
+ ],
40
+ "license": "MIT",
41
+ "engines": {
42
+ "node": "24.x"
43
+ },
44
+ "description": "Dynamically generate stats for your GitHub readme",
45
+ "keywords": [
46
+ "github-readme-stats",
47
+ "readme-stats",
48
+ "cards",
49
+ "card-generator",
50
+ "github-stats",
51
+ "github-stats-extended",
52
+ "github-readme-stats-extended"
53
+ ],
54
+ "main": "./build/index.js",
55
+ "exports": {
56
+ ".": {
57
+ "@stats/source": "./src/index.ts",
58
+ "default": "./build/index.js"
59
+ }
60
+ },
61
+ "files": [
62
+ "build",
63
+ "src",
64
+ "README.md"
65
+ ],
66
+ "publishConfig": {
67
+ "access": "public"
68
+ },
69
+ "devDependencies": {
70
+ "@testing-library/dom": "10.4.1",
71
+ "@testing-library/jest-dom": "6.9.1",
72
+ "@uppercod/css-to-object": "1.1.1",
73
+ "axios-mock-adapter": "2.1.0",
74
+ "js-yaml": "4.1.1",
75
+ "jsdom": "29.0.2",
76
+ "vitest": "4.1.4"
77
+ },
78
+ "dependencies": {
79
+ "axios": "^1.15.2",
80
+ "emoji-name-map": "^2.0.3",
81
+ "github-username-regex": "^1.0.0"
82
+ },
83
+ "scripts": {
84
+ "build": "tsc -p tsconfig.build.json",
85
+ "test": "vitest",
86
+ "test:update:snapshot": "vitest -u",
87
+ "test:e2e": "vitest --config vitest.config.e2e.ts",
88
+ "bench": "vitest bench --run --config vitest.config.bench.ts",
89
+ "lint": "eslint",
90
+ "typecheck": "tsc -p tsconfig.typecheck.json",
91
+ "theme-readme-gen": "node scripts/generate-theme-doc",
92
+ "generate-langs-json": "node scripts/generate-langs-json"
93
+ }
94
+ }
@@ -0,0 +1,99 @@
1
+ // @ts-check
2
+
3
+ import { renderGistCard } from "../cards/gist.js";
4
+ import {
5
+ MissingParamError,
6
+ retrieveSecondaryMessage,
7
+ } from "../common/error.js";
8
+ import { parseBoolean } from "../common/ops.js";
9
+ import { renderError } from "../common/render.js";
10
+ import { fetchGist } from "../fetchers/gist.js";
11
+ import { isLocaleAvailable } from "../translations.js";
12
+
13
+ // @ts-ignore
14
+ export default async (
15
+ {
16
+ id,
17
+ title_color,
18
+ icon_color,
19
+ text_color,
20
+ bg_color,
21
+ theme,
22
+ locale,
23
+ border_radius,
24
+ border_color,
25
+ show_owner,
26
+ browser_rendering,
27
+ hide_border,
28
+ },
29
+ pat = null,
30
+ ) => {
31
+ if (locale && !isLocaleAvailable(locale)) {
32
+ return {
33
+ status: "error - permanent",
34
+ content: renderError({
35
+ message: "Something went wrong",
36
+ secondaryMessage: "Language not found",
37
+ renderOptions: {
38
+ title_color,
39
+ text_color,
40
+ bg_color,
41
+ border_color,
42
+ theme,
43
+ },
44
+ }),
45
+ };
46
+ }
47
+
48
+ try {
49
+ const gistData = await fetchGist(id, pat);
50
+
51
+ return {
52
+ status: "success",
53
+ content: renderGistCard(gistData, {
54
+ title_color,
55
+ icon_color,
56
+ text_color,
57
+ bg_color,
58
+ theme,
59
+ border_radius,
60
+ border_color,
61
+ locale: locale ? locale.toLowerCase() : null,
62
+ show_owner: parseBoolean(show_owner),
63
+ browser_rendering: parseBoolean(browser_rendering),
64
+ hide_border: parseBoolean(hide_border),
65
+ }),
66
+ };
67
+ } catch (err) {
68
+ if (err instanceof Error) {
69
+ return {
70
+ status: "error - temporary",
71
+ content: renderError({
72
+ message: err.message,
73
+ secondaryMessage: retrieveSecondaryMessage(err),
74
+ renderOptions: {
75
+ title_color,
76
+ text_color,
77
+ bg_color,
78
+ border_color,
79
+ theme,
80
+ show_repo_link: !(err instanceof MissingParamError),
81
+ },
82
+ }),
83
+ };
84
+ }
85
+ return {
86
+ status: "error - temporary",
87
+ content: renderError({
88
+ message: "An unknown error occurred",
89
+ renderOptions: {
90
+ title_color,
91
+ text_color,
92
+ bg_color,
93
+ border_color,
94
+ theme,
95
+ },
96
+ }),
97
+ };
98
+ }
99
+ };
@@ -0,0 +1,185 @@
1
+ // @ts-check
2
+
3
+ import { renderStatsCard } from "../cards/stats.js";
4
+ import {
5
+ MissingParamError,
6
+ retrieveSecondaryMessage,
7
+ } from "../common/error.js";
8
+ import { parseArray, parseBoolean } from "../common/ops.js";
9
+ import { renderError } from "../common/render.js";
10
+ import { fetchStats } from "../fetchers/stats.js";
11
+ import { isLocaleAvailable } from "../translations.js";
12
+
13
+ // @ts-ignore
14
+ export default async (
15
+ {
16
+ username,
17
+ repo,
18
+ owner,
19
+ hide,
20
+ hide_title,
21
+ hide_border,
22
+ card_width,
23
+ hide_rank,
24
+ show_icons,
25
+ include_all_commits,
26
+ commits_year,
27
+ line_height,
28
+ title_color,
29
+ ring_color,
30
+ icon_color,
31
+ text_color,
32
+ text_bold,
33
+ bg_color,
34
+ theme,
35
+ exclude_repo,
36
+ custom_title,
37
+ locale,
38
+ disable_animations,
39
+ border_radius,
40
+ number_format,
41
+ role,
42
+ number_precision,
43
+ border_color,
44
+ rank_icon,
45
+ show,
46
+ },
47
+ pat = null,
48
+ ) => {
49
+ if (locale && !isLocaleAvailable(locale)) {
50
+ return {
51
+ status: "error - permanent",
52
+ content: renderError({
53
+ message: "Something went wrong",
54
+ secondaryMessage: "Language not found",
55
+ renderOptions: {
56
+ title_color,
57
+ text_color,
58
+ bg_color,
59
+ border_color,
60
+ theme,
61
+ },
62
+ }),
63
+ };
64
+ }
65
+
66
+ const safePattern = /^[-\w/.,]+$/;
67
+ if (
68
+ (username && !safePattern.test(username)) ||
69
+ (repo && !safePattern.test(repo)) ||
70
+ (owner && !safePattern.test(owner))
71
+ ) {
72
+ return {
73
+ status: "error - permanent",
74
+ content: renderError({
75
+ message: "Something went wrong",
76
+ secondaryMessage:
77
+ "Username, repository or owner contains unsafe characters",
78
+ renderOptions: {
79
+ title_color,
80
+ text_color,
81
+ bg_color,
82
+ border_color,
83
+ theme,
84
+ },
85
+ }),
86
+ };
87
+ }
88
+
89
+ try {
90
+ const showStats = parseArray(show);
91
+ const repoOwner = parseArray(owner);
92
+ let repository = parseArray(repo);
93
+ repository = repository.map((repo) =>
94
+ repo.includes("/") ? repo : `${username}/${repo}`,
95
+ );
96
+
97
+ const stats = await fetchStats(
98
+ username,
99
+ parseBoolean(include_all_commits),
100
+ parseArray(exclude_repo),
101
+ showStats.includes("prs_merged") ||
102
+ showStats.includes("prs_merged_percentage"),
103
+ showStats.includes("discussions_started"),
104
+ showStats.includes("discussions_answered"),
105
+ parseInt(commits_year, 10),
106
+ repository,
107
+ repoOwner,
108
+ showStats.includes("prs_authored"),
109
+ showStats.includes("prs_commented"),
110
+ showStats.includes("prs_reviewed"),
111
+ showStats.includes("issues_authored"),
112
+ showStats.includes("issues_commented"),
113
+ parseArray(role),
114
+ pat,
115
+ );
116
+
117
+ return {
118
+ status: "success",
119
+ content: renderStatsCard(
120
+ stats,
121
+ {
122
+ hide: parseArray(hide),
123
+ show_icons: parseBoolean(show_icons),
124
+ hide_title: parseBoolean(hide_title),
125
+ hide_border: parseBoolean(hide_border),
126
+ card_width: parseInt(card_width, 10),
127
+ hide_rank: parseBoolean(hide_rank),
128
+ include_all_commits: parseBoolean(include_all_commits),
129
+ commits_year: parseInt(commits_year, 10),
130
+ line_height,
131
+ title_color,
132
+ ring_color,
133
+ icon_color,
134
+ text_color,
135
+ text_bold: parseBoolean(text_bold),
136
+ bg_color,
137
+ theme,
138
+ custom_title,
139
+ border_radius,
140
+ border_color,
141
+ number_format,
142
+ number_precision: parseInt(number_precision, 10),
143
+ locale: locale ? locale.toLowerCase() : null,
144
+ disable_animations: parseBoolean(disable_animations),
145
+ rank_icon,
146
+ show: showStats,
147
+ },
148
+ username,
149
+ repository,
150
+ repoOwner,
151
+ ),
152
+ };
153
+ } catch (err) {
154
+ if (err instanceof Error) {
155
+ return {
156
+ status: "error - temporary",
157
+ content: renderError({
158
+ message: err.message,
159
+ secondaryMessage: retrieveSecondaryMessage(err),
160
+ renderOptions: {
161
+ title_color,
162
+ text_color,
163
+ bg_color,
164
+ border_color,
165
+ theme,
166
+ show_repo_link: !(err instanceof MissingParamError),
167
+ },
168
+ }),
169
+ };
170
+ }
171
+ return {
172
+ status: "error - temporary",
173
+ content: renderError({
174
+ message: "An unknown error occurred",
175
+ renderOptions: {
176
+ title_color,
177
+ text_color,
178
+ bg_color,
179
+ border_color,
180
+ theme,
181
+ },
182
+ }),
183
+ };
184
+ }
185
+ };
package/src/api/pin.js ADDED
@@ -0,0 +1,146 @@
1
+ // @ts-check
2
+
3
+ import { renderRepoCard } from "../cards/repo.js";
4
+ import {
5
+ MissingParamError,
6
+ retrieveSecondaryMessage,
7
+ } from "../common/error.js";
8
+ import { parseArray, parseBoolean } from "../common/ops.js";
9
+ import { renderError } from "../common/render.js";
10
+ import { fetchRepo } from "../fetchers/repo.js";
11
+ import { isLocaleAvailable } from "../translations.js";
12
+
13
+ // @ts-ignore
14
+ export default async (
15
+ {
16
+ username,
17
+ repo,
18
+ hide_border,
19
+ title_color,
20
+ icon_color,
21
+ text_color,
22
+ bg_color,
23
+ card_width,
24
+ theme,
25
+ show_owner,
26
+ browser_rendering,
27
+ show,
28
+ show_icons,
29
+ number_format,
30
+ text_bold,
31
+ line_height,
32
+ locale,
33
+ border_radius,
34
+ border_color,
35
+ description_lines_count,
36
+ },
37
+ pat = null,
38
+ ) => {
39
+ if (locale && !isLocaleAvailable(locale)) {
40
+ return {
41
+ status: "error - permanent",
42
+ content: renderError({
43
+ message: "Something went wrong",
44
+ secondaryMessage: "Language not found",
45
+ renderOptions: {
46
+ title_color,
47
+ text_color,
48
+ bg_color,
49
+ border_color,
50
+ theme,
51
+ },
52
+ }),
53
+ };
54
+ }
55
+
56
+ const safePattern = /^[-\w/.,]+$/;
57
+ if (
58
+ (username && !safePattern.test(username)) ||
59
+ (repo && !safePattern.test(repo))
60
+ ) {
61
+ return {
62
+ status: "error - permanent",
63
+ content: renderError({
64
+ message: "Something went wrong",
65
+ secondaryMessage: "Username or repository contains unsafe characters",
66
+ renderOptions: {
67
+ title_color,
68
+ text_color,
69
+ bg_color,
70
+ border_color,
71
+ theme,
72
+ },
73
+ }),
74
+ };
75
+ }
76
+
77
+ try {
78
+ const showStats = parseArray(show);
79
+ const repoData = await fetchRepo(
80
+ username,
81
+ repo,
82
+ showStats.includes("prs_authored"),
83
+ showStats.includes("prs_commented"),
84
+ showStats.includes("prs_reviewed"),
85
+ showStats.includes("issues_authored"),
86
+ showStats.includes("issues_commented"),
87
+ pat,
88
+ );
89
+
90
+ return {
91
+ status: "success",
92
+ content: renderRepoCard(repoData, {
93
+ hide_border: parseBoolean(hide_border),
94
+ title_color,
95
+ icon_color,
96
+ text_color,
97
+ bg_color,
98
+ theme,
99
+ border_radius,
100
+ border_color,
101
+ card_width_input: parseInt(card_width, 10),
102
+ show_owner: parseBoolean(show_owner),
103
+ browser_rendering: parseBoolean(browser_rendering),
104
+ show: showStats,
105
+ show_icons: parseBoolean(show_icons),
106
+ number_format,
107
+ text_bold: parseBoolean(text_bold),
108
+ line_height,
109
+ username,
110
+ locale: locale ? locale.toLowerCase() : null,
111
+ description_lines_count,
112
+ }),
113
+ };
114
+ } catch (err) {
115
+ if (err instanceof Error) {
116
+ return {
117
+ status: "error - temporary",
118
+ content: renderError({
119
+ message: err.message,
120
+ secondaryMessage: retrieveSecondaryMessage(err),
121
+ renderOptions: {
122
+ title_color,
123
+ text_color,
124
+ bg_color,
125
+ border_color,
126
+ theme,
127
+ show_repo_link: !(err instanceof MissingParamError),
128
+ },
129
+ }),
130
+ };
131
+ }
132
+ return {
133
+ status: "error - temporary",
134
+ content: renderError({
135
+ message: "An unknown error occurred",
136
+ renderOptions: {
137
+ title_color,
138
+ text_color,
139
+ bg_color,
140
+ border_color,
141
+ theme,
142
+ },
143
+ }),
144
+ };
145
+ }
146
+ };
@@ -0,0 +1,168 @@
1
+ // @ts-check
2
+
3
+ import { renderTopLanguages } from "../cards/top-languages.js";
4
+ import {
5
+ MissingParamError,
6
+ retrieveSecondaryMessage,
7
+ } from "../common/error.js";
8
+ import { parseArray, parseBoolean } from "../common/ops.js";
9
+ import { renderError } from "../common/render.js";
10
+ import { fetchTopLanguages } from "../fetchers/top-languages.js";
11
+ import { isLocaleAvailable } from "../translations.js";
12
+
13
+ // @ts-ignore
14
+ export default async (
15
+ {
16
+ username,
17
+ hide,
18
+ hide_title,
19
+ hide_border,
20
+ card_width,
21
+ title_color,
22
+ text_color,
23
+ bg_color,
24
+ prog_bar_bg_color,
25
+ theme,
26
+ layout,
27
+ langs_count,
28
+ exclude_repo,
29
+ size_weight,
30
+ count_weight,
31
+ custom_title,
32
+ locale,
33
+ border_radius,
34
+ border_color,
35
+ role,
36
+ disable_animations,
37
+ hide_progress,
38
+ hide_values,
39
+ stats_format,
40
+ },
41
+ pat = null,
42
+ ) => {
43
+ if (locale && !isLocaleAvailable(locale)) {
44
+ return {
45
+ status: "error - permanent",
46
+ content: renderError({
47
+ message: "Something went wrong",
48
+ secondaryMessage: "Locale not found",
49
+ renderOptions: {
50
+ title_color,
51
+ text_color,
52
+ bg_color,
53
+ border_color,
54
+ theme,
55
+ },
56
+ }),
57
+ };
58
+ }
59
+
60
+ if (
61
+ layout !== undefined &&
62
+ (typeof layout !== "string" ||
63
+ !["compact", "normal", "donut", "donut-vertical", "pie"].includes(layout))
64
+ ) {
65
+ return {
66
+ status: "error - permanent",
67
+ content: renderError({
68
+ message: "Something went wrong",
69
+ secondaryMessage: "Incorrect layout input",
70
+ renderOptions: {
71
+ title_color,
72
+ text_color,
73
+ bg_color,
74
+ border_color,
75
+ theme,
76
+ },
77
+ }),
78
+ };
79
+ }
80
+
81
+ if (
82
+ stats_format !== undefined &&
83
+ (typeof stats_format !== "string" ||
84
+ !["bytes", "percentages"].includes(stats_format))
85
+ ) {
86
+ return {
87
+ status: "error - permanent",
88
+ content: renderError({
89
+ message: "Something went wrong",
90
+ secondaryMessage: "Incorrect stats_format input",
91
+ renderOptions: {
92
+ title_color,
93
+ text_color,
94
+ bg_color,
95
+ border_color,
96
+ theme,
97
+ },
98
+ }),
99
+ };
100
+ }
101
+
102
+ try {
103
+ const topLangs = await fetchTopLanguages(
104
+ username,
105
+ parseArray(exclude_repo),
106
+ size_weight,
107
+ count_weight,
108
+ parseArray(role),
109
+ pat,
110
+ );
111
+
112
+ return {
113
+ status: "success",
114
+ content: renderTopLanguages(topLangs, {
115
+ custom_title,
116
+ hide_title: parseBoolean(hide_title),
117
+ hide_border: parseBoolean(hide_border),
118
+ card_width: parseInt(card_width, 10),
119
+ hide: parseArray(hide),
120
+ title_color,
121
+ text_color,
122
+ bg_color,
123
+ prog_bar_bg_color,
124
+ theme,
125
+ layout,
126
+ langs_count,
127
+ border_radius,
128
+ border_color,
129
+ locale: locale ? locale.toLowerCase() : null,
130
+ disable_animations: parseBoolean(disable_animations),
131
+ hide_progress: parseBoolean(hide_progress),
132
+ hide_values: parseBoolean(hide_values),
133
+ stats_format,
134
+ }),
135
+ };
136
+ } catch (err) {
137
+ if (err instanceof Error) {
138
+ return {
139
+ status: "error - temporary",
140
+ content: renderError({
141
+ message: err.message,
142
+ secondaryMessage: retrieveSecondaryMessage(err),
143
+ renderOptions: {
144
+ title_color,
145
+ text_color,
146
+ bg_color,
147
+ border_color,
148
+ theme,
149
+ show_repo_link: !(err instanceof MissingParamError),
150
+ },
151
+ }),
152
+ };
153
+ }
154
+ return {
155
+ status: "error - temporary",
156
+ content: renderError({
157
+ message: "An unknown error occurred",
158
+ renderOptions: {
159
+ title_color,
160
+ text_color,
161
+ bg_color,
162
+ border_color,
163
+ theme,
164
+ },
165
+ }),
166
+ };
167
+ }
168
+ };