erudit 3.0.0-dev.3 → 3.0.0-dev.5

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 (243) hide show
  1. package/app/app.vue +195 -172
  2. package/app/components/Loading.vue +23 -23
  3. package/app/components/SiteAside.vue +393 -382
  4. package/app/components/SiteMain.vue +35 -35
  5. package/app/components/ads/BannerTemplate.vue +51 -51
  6. package/app/components/ads/BottomBanner.vue +45 -45
  7. package/app/components/ads/LeftBanner.vue +50 -50
  8. package/app/components/aside/AsideListItem.vue +74 -74
  9. package/app/components/aside/AsideMajor.vue +56 -56
  10. package/app/components/aside/AsideMinor.vue +71 -71
  11. package/app/components/aside/major/PaneContentScroll.vue +23 -23
  12. package/app/components/aside/major/PaneSwitch.vue +54 -54
  13. package/app/components/aside/major/PaneSwitchButton.vue +63 -63
  14. package/app/components/aside/major/SiteInfo.vue +85 -85
  15. package/app/components/aside/major/panes/Language.vue +79 -79
  16. package/app/components/aside/major/panes/Pages.vue +34 -34
  17. package/app/components/aside/major/panes/Search.vue +11 -11
  18. package/app/components/aside/major/panes/nav/Nav.vue +87 -91
  19. package/app/components/aside/major/panes/nav/NavBook.vue +87 -86
  20. package/app/components/aside/major/panes/nav/NavBookLoading.vue +24 -24
  21. package/app/components/aside/major/panes/nav/NavGlobal.vue +16 -16
  22. package/app/components/aside/major/panes/nav/fnav/FNav.vue +105 -105
  23. package/app/components/aside/major/panes/nav/fnav/FNavBook.vue +32 -32
  24. package/app/components/aside/major/panes/nav/fnav/FNavFlags.vue +40 -40
  25. package/app/components/aside/major/panes/nav/fnav/FNavFolder.vue +60 -60
  26. package/app/components/aside/major/panes/nav/fnav/FNavItem.vue +34 -34
  27. package/app/components/aside/major/panes/nav/fnav/FNavSeparator.vue +80 -80
  28. package/app/components/aside/major/panes/nav/fnav/FNavTopic.vue +24 -24
  29. package/app/components/aside/major/panes/other/ItemContent.vue +29 -29
  30. package/app/components/aside/major/panes/other/ItemGenerator.vue +15 -15
  31. package/app/components/aside/major/panes/other/ItemTheme.vue +54 -54
  32. package/app/components/aside/major/panes/other/Other.vue +16 -16
  33. package/app/components/aside/minor/AsideMinorContributor.vue +5 -5
  34. package/app/components/aside/minor/AsideMinorNews.vue +11 -11
  35. package/app/components/aside/minor/AsideMinorPane.vue +15 -15
  36. package/app/components/aside/minor/AsideMinorTopLink.vue +67 -67
  37. package/app/components/aside/minor/Contribute.vue +145 -145
  38. package/app/components/aside/minor/content/AsideMinorContent.vue +92 -92
  39. package/app/components/aside/minor/topic/AsideMinorTopic.vue +32 -32
  40. package/app/components/aside/minor/topic/TopicContributors.vue +177 -177
  41. package/app/components/aside/minor/topic/TopicNav.vue +49 -49
  42. package/app/components/aside/minor/topic/TopicToc.vue +219 -203
  43. package/app/components/aside/minor/topic/TopicTocItem.vue +30 -31
  44. package/app/components/aside/utils/AsideOverlayPane.vue +40 -40
  45. package/app/components/bitran/BitranContent.vue +70 -63
  46. package/app/components/bitran/RenderWrapper.vue +10 -10
  47. package/app/components/contributor/ContributorAvatar.vue +43 -43
  48. package/app/components/contributor/ContributorListItem.vue +35 -35
  49. package/app/components/main/topic/MainTopic.vue +79 -79
  50. package/app/components/main/topic/TopicPartSwitch.vue +118 -118
  51. package/app/components/main/utils/Breadcrumb.vue +75 -75
  52. package/app/components/main/utils/ContentDecoration.vue +29 -29
  53. package/app/components/main/utils/ContentDescription.vue +19 -19
  54. package/app/components/main/utils/ContentPopover.vue +188 -176
  55. package/app/components/main/utils/ContentPopovers.vue +105 -105
  56. package/app/components/main/utils/ContentReferences.vue +70 -70
  57. package/app/components/main/utils/ContentSection.vue +45 -45
  58. package/app/components/main/utils/ContentTitle.vue +63 -39
  59. package/app/components/main/utils/reference/ReferenceGroup.vue +38 -38
  60. package/app/components/main/utils/reference/ReferenceItem.vue +68 -68
  61. package/app/components/main/utils/reference/ReferenceSource.vue +116 -116
  62. package/app/components/preview/Preview.vue +186 -177
  63. package/app/components/preview/PreviewDisplay.vue +139 -139
  64. package/app/components/preview/PreviewFooterAction.vue +73 -73
  65. package/app/components/preview/PreviewLoading.vue +14 -14
  66. package/app/components/preview/PreviewScreen.vue +141 -99
  67. package/app/components/preview/display/Alert.vue +50 -50
  68. package/app/components/preview/display/Custom.vue +18 -18
  69. package/app/components/preview/display/GenericLink.vue +48 -48
  70. package/app/components/preview/display/PageLink.vue +20 -20
  71. package/app/components/preview/display/Unique.vue +49 -49
  72. package/app/components/transition/Fade.vue +19 -19
  73. package/app/components/tree/TreeContainer.vue +11 -11
  74. package/app/components/tree/TreeItem.vue +89 -89
  75. package/app/composables/bitran.ts +129 -127
  76. package/app/composables/bitranContent.ts +39 -39
  77. package/app/composables/bitranLocation.ts +7 -7
  78. package/app/composables/contentData.ts +36 -36
  79. package/app/composables/contentPage.ts +157 -156
  80. package/app/composables/contentRoute.ts +45 -45
  81. package/app/composables/darkMagic.ts +24 -24
  82. package/app/composables/externalApi.ts +63 -63
  83. package/app/composables/favicon.ts +8 -8
  84. package/app/composables/formatText.ts +86 -86
  85. package/app/composables/majorPane.ts +60 -60
  86. package/app/composables/phrases.ts +81 -80
  87. package/app/composables/theme.ts +29 -29
  88. package/app/composables/url.ts +33 -33
  89. package/app/pages/_test/preview.vue +110 -110
  90. package/app/pages/article/[...articleId].vue +3 -3
  91. package/app/pages/book/[...bookId].vue +47 -47
  92. package/app/pages/group/[...groupId].vue +65 -65
  93. package/app/pages/index.vue +32 -32
  94. package/app/pages/members.vue +6 -6
  95. package/app/pages/practice/[...practice].vue +3 -3
  96. package/app/pages/summary/[...summaryId].vue +3 -3
  97. package/app/public/favicon/article.svg +9 -9
  98. package/app/public/favicon/default.svg +3 -3
  99. package/app/public/favicon/practice.svg +3 -3
  100. package/app/public/favicon/summary.svg +4 -4
  101. package/app/public/logotype.svg +2 -2
  102. package/app/scripts/_immediate.js +9 -9
  103. package/app/scripts/aside/index.ts +59 -59
  104. package/app/scripts/aside/major/nav.ts +26 -26
  105. package/app/scripts/aside/minor/state.ts +37 -37
  106. package/app/scripts/aside/minor/topic.ts +3 -3
  107. package/app/scripts/flag.ts +28 -28
  108. package/app/scripts/og.ts +27 -27
  109. package/app/scripts/preview/build.ts +73 -73
  110. package/app/scripts/preview/data/alert.ts +19 -19
  111. package/app/scripts/preview/data/custom.ts +8 -8
  112. package/app/scripts/preview/data/genericLink.ts +24 -24
  113. package/app/scripts/preview/data/pageLink.ts +22 -20
  114. package/app/scripts/preview/data/unique.ts +71 -71
  115. package/app/scripts/preview/data.ts +24 -24
  116. package/app/scripts/preview/display.ts +37 -37
  117. package/app/scripts/preview/footer.ts +9 -9
  118. package/app/scripts/preview/request.ts +51 -51
  119. package/app/scripts/preview/state.ts +63 -63
  120. package/app/styles/_immediate.css +7 -7
  121. package/app/styles/_util.scss +43 -43
  122. package/app/styles/_utils.scss +44 -44
  123. package/app/styles/app.scss +91 -91
  124. package/app/styles/def/_bp.scss +27 -27
  125. package/app/styles/def/_size.scss +7 -7
  126. package/app/styles/def/_z.scss +5 -5
  127. package/app/styles/normalize.scss +63 -63
  128. package/app/styles/partials/_darkMagic.scss +5 -5
  129. package/app/styles/partials/_fnav.scss +15 -15
  130. package/app/styles/partials/_preview.scss +5 -5
  131. package/globalPath.ts +21 -21
  132. package/globals/bitran.ts +2 -47
  133. package/globals/content.ts +22 -22
  134. package/globals/contributor.ts +5 -5
  135. package/globals/erudit.ts +5 -5
  136. package/globals/register.ts +18 -18
  137. package/languages/en.ts +95 -95
  138. package/languages/ru.ts +99 -99
  139. package/module/bitran.ts +35 -34
  140. package/module/config.ts +34 -34
  141. package/module/imports.ts +50 -46
  142. package/module/index.ts +47 -47
  143. package/module/logger.ts +10 -10
  144. package/module/paths.ts +22 -22
  145. package/module/restart.ts +61 -61
  146. package/nuxt.config.ts +138 -112
  147. package/package.json +7 -8
  148. package/server/api/aside/major/nav/bookIds.ts +5 -5
  149. package/server/api/aside/major/nav/bookNav/[...bookId].ts +20 -20
  150. package/server/api/aside/major/nav/global.ts +7 -7
  151. package/server/api/aside/minor/news.ts +7 -7
  152. package/server/api/aside/minor/path.ts +78 -78
  153. package/server/api/bitran/content/[location].ts +8 -8
  154. package/server/api/bitran/toc/[location].ts +7 -7
  155. package/server/api/content/data.ts +72 -72
  156. package/server/api/contributor/count.ts +6 -6
  157. package/server/api/fake/content.ts +11 -11
  158. package/server/api/fake/shared/languages.ts +12 -12
  159. package/server/api/language/functions.ts +12 -12
  160. package/server/api/language/phrase/[phraseId].ts +19 -19
  161. package/server/api/language/phraseIds.ts +8 -8
  162. package/server/api/preview/page/[...parts].ts +51 -51
  163. package/server/api/preview/unique/[location].ts +57 -57
  164. package/server/plugin/bitran/content.ts +187 -187
  165. package/server/plugin/bitran/location.ts +25 -25
  166. package/server/plugin/bitran/products/include.ts +230 -230
  167. package/server/plugin/bitran/products/link.ts +116 -116
  168. package/server/plugin/bitran/setup.ts +11 -9
  169. package/server/plugin/bitran/toc.ts +83 -83
  170. package/server/plugin/bitran/transpiler.ts +48 -46
  171. package/server/plugin/build/close.ts +10 -10
  172. package/server/plugin/build/jobs/content/builderArgs.ts +8 -8
  173. package/server/plugin/build/jobs/content/generic.ts +176 -176
  174. package/server/plugin/build/jobs/content/parse.ts +100 -100
  175. package/server/plugin/build/jobs/content/path.ts +6 -6
  176. package/server/plugin/build/jobs/content/type/book.ts +9 -9
  177. package/server/plugin/build/jobs/content/type/group.ts +37 -37
  178. package/server/plugin/build/jobs/content/type/topic.ts +36 -36
  179. package/server/plugin/build/jobs/contributors.ts +66 -66
  180. package/server/plugin/build/jobs/language.ts +36 -36
  181. package/server/plugin/build/jobs/nav.ts +210 -210
  182. package/server/plugin/build/process.ts +25 -25
  183. package/server/plugin/build/rebuild.ts +55 -55
  184. package/server/plugin/build/setup.ts +21 -21
  185. package/server/plugin/content/absoluteId.ts +94 -94
  186. package/server/plugin/content/context.ts +112 -112
  187. package/server/plugin/db/entities/Book.ts +7 -7
  188. package/server/plugin/db/entities/Content.ts +49 -49
  189. package/server/plugin/db/entities/Contribution.ts +10 -10
  190. package/server/plugin/db/entities/Contributor.ts +16 -16
  191. package/server/plugin/db/entities/Group.ts +14 -14
  192. package/server/plugin/db/entities/Hash.ts +15 -15
  193. package/server/plugin/db/entities/Topic.ts +20 -20
  194. package/server/plugin/db/entities/Unique.ts +21 -21
  195. package/server/plugin/db/setup.ts +34 -34
  196. package/server/plugin/global.ts +17 -18
  197. package/server/plugin/importer.ts +12 -12
  198. package/server/plugin/index.ts +9 -9
  199. package/server/plugin/logger.ts +23 -23
  200. package/server/plugin/nav/node.ts +26 -26
  201. package/server/plugin/nav/utils.ts +129 -129
  202. package/server/plugin/repository/book.ts +21 -21
  203. package/server/plugin/repository/content.ts +238 -238
  204. package/server/plugin/repository/contributor.ts +8 -8
  205. package/server/plugin/repository/frontNav.ts +148 -148
  206. package/server/plugin/repository/topic.ts +32 -32
  207. package/server/tsconfig.json +9 -9
  208. package/shared/aside/minor.ts +50 -50
  209. package/shared/asset.ts +15 -15
  210. package/shared/bitran/context.ts +8 -8
  211. package/shared/bitran/default.ts +46 -46
  212. package/shared/bitran/link/Link.vue +166 -167
  213. package/shared/bitran/link/factory.ts +24 -24
  214. package/shared/bitran/link/languages/en.ts +7 -7
  215. package/shared/bitran/link/languages/ru.ts +7 -7
  216. package/shared/bitran/link/renderer.ts +21 -21
  217. package/shared/bitran/link/shared.ts +17 -17
  218. package/shared/bitran/link/target.ts +134 -134
  219. package/shared/bitran/link/transpiler.ts +10 -10
  220. package/shared/bitran/location.ts +166 -166
  221. package/shared/bitran/toc.ts +8 -8
  222. package/shared/content/context.ts +9 -9
  223. package/shared/content/data/base.ts +32 -32
  224. package/shared/content/data/index.ts +5 -5
  225. package/shared/content/data/type/book.ts +5 -5
  226. package/shared/content/data/type/group.ts +6 -6
  227. package/shared/content/data/type/topic.ts +11 -11
  228. package/shared/content/previousNext.ts +9 -9
  229. package/shared/contributor.ts +5 -5
  230. package/shared/frontNav.ts +41 -41
  231. package/shared/icons.ts +38 -38
  232. package/shared/image.ts +5 -5
  233. package/shared/link.ts +25 -25
  234. package/shared/popover.ts +8 -0
  235. package/shared/types/language.ts +75 -75
  236. package/shared/utils/objectsEqual.ts +4 -4
  237. package/shared/utils/stringColor.ts +9 -9
  238. package/test/bitran/link/target.test.ts +141 -141
  239. package/test/bitran/location.test.ts +143 -143
  240. package/tsconfig.json +8 -8
  241. package/utils/stress.ts +9 -9
  242. package/app/components/main/utils/ContentFlag.vue +0 -15
  243. package/app/styles/default.scss +0 -83
@@ -1,36 +1,36 @@
1
- import { existsSync, readFileSync } from 'node:fs';
2
- import { topicParts, type TopicPart } from 'erudit-cog/schema';
3
-
4
- import { ERUDIT_SERVER } from '@server/global';
5
- import { DbTopic } from '@server/db/entities/Topic';
6
- import type { BuilderFunctionArgs } from '../builderArgs';
7
- import { contentItemPath } from '../path';
8
- import { parseBitranContent } from '../parse';
9
-
10
- export async function buildTopic({ navNode }: BuilderFunctionArgs) {
11
- const dbTopic = new DbTopic();
12
- dbTopic.contentId = navNode.id;
13
- const existingTopicParts: TopicPart[] = [];
14
-
15
- for (const topicPart of topicParts) {
16
- const partPath = contentItemPath(navNode, `${topicPart}.bi`);
17
- const strContent =
18
- existsSync(partPath) && readFileSync(partPath, 'utf-8');
19
-
20
- if (strContent === false) continue;
21
-
22
- existingTopicParts.push(topicPart);
23
- dbTopic[topicPart] = strContent;
24
-
25
- await parseBitranContent(
26
- {
27
- type: topicPart,
28
- path: navNode.id,
29
- },
30
- strContent,
31
- );
32
- }
33
-
34
- dbTopic.parts = existingTopicParts;
35
- await ERUDIT_SERVER.DB.manager.save(dbTopic);
36
- }
1
+ import { existsSync, readFileSync } from 'node:fs';
2
+ import { topicParts, type TopicPart } from 'erudit-cog/schema';
3
+
4
+ import { ERUDIT_SERVER } from '@server/global';
5
+ import { DbTopic } from '@server/db/entities/Topic';
6
+ import type { BuilderFunctionArgs } from '../builderArgs';
7
+ import { contentItemPath } from '../path';
8
+ import { parseBitranContent } from '../parse';
9
+
10
+ export async function buildTopic({ navNode }: BuilderFunctionArgs) {
11
+ const dbTopic = new DbTopic();
12
+ dbTopic.contentId = navNode.id;
13
+ const existingTopicParts: TopicPart[] = [];
14
+
15
+ for (const topicPart of topicParts) {
16
+ const partPath = contentItemPath(navNode, `${topicPart}.bi`);
17
+ const strContent =
18
+ existsSync(partPath) && readFileSync(partPath, 'utf-8');
19
+
20
+ if (strContent === false) continue;
21
+
22
+ existingTopicParts.push(topicPart);
23
+ dbTopic[topicPart] = strContent;
24
+
25
+ await parseBitranContent(
26
+ {
27
+ type: topicPart,
28
+ path: navNode.id,
29
+ },
30
+ strContent,
31
+ );
32
+ }
33
+
34
+ dbTopic.parts = existingTopicParts;
35
+ await ERUDIT_SERVER.DB.manager.save(dbTopic);
36
+ }
@@ -1,66 +1,66 @@
1
- import { readFileSync } from 'node:fs';
2
- import { globSync } from 'glob';
3
- import path from 'node:path';
4
- import chalk from 'chalk';
5
- import { resolvePaths } from 'erudit-cog/kit';
6
- import type { ContributorConfig } from 'erudit-cog/schema';
7
-
8
- import { PROJECT_DIR } from '#erudit/globalPaths';
9
- import { stress } from '@erudit/utils/stress';
10
- import { debug, logger } from '@server/logger';
11
- import { ERUDIT_SERVER } from '@server/global';
12
- import { IMPORT } from '@server/importer';
13
- import { DbContributor } from '@server/db/entities/Contributor';
14
-
15
- export async function buildContributors() {
16
- debug.start('Building contributors...');
17
-
18
- const contributorPaths = globSync(PROJECT_DIR + '/contributors/*/');
19
- for (const contributorPath of contributorPaths)
20
- await addContributor(resolvePaths(contributorPath));
21
-
22
- logger.success(
23
- `Contributors built successfully!`,
24
- chalk.dim(`(${contributorPaths.length})`),
25
- );
26
- }
27
-
28
- async function addContributor(contributorPath: string) {
29
- const contributorId = contributorPath.split('/').pop() as string;
30
-
31
- debug.start(`Adding contributor ${stress(contributorId)}...`);
32
-
33
- const avatarFilename = (() => {
34
- const avatarPaths = globSync(`${contributorPath}/avatar.*`);
35
- if (avatarPaths[0])
36
- return avatarPaths[0].split(path.sep).slice(-2).join('/');
37
-
38
- return undefined;
39
- })();
40
-
41
- const config: Partial<ContributorConfig> = await (async () => {
42
- try {
43
- return await IMPORT(`${contributorPath}/contributor`, {
44
- default: true,
45
- });
46
- } catch {
47
- return {};
48
- }
49
- })();
50
-
51
- const description = (() => {
52
- try {
53
- return readFileSync(`${contributorPath}/description.bi`, 'utf-8');
54
- } catch {
55
- return undefined;
56
- }
57
- })();
58
-
59
- const dbContributor = new DbContributor();
60
- dbContributor.contributorId = contributorId;
61
- dbContributor.avatar = avatarFilename;
62
- dbContributor.displayName = config.displayName;
63
- dbContributor.description = description;
64
-
65
- await ERUDIT_SERVER.DB.manager.save(dbContributor);
66
- }
1
+ import { readFileSync } from 'node:fs';
2
+ import { globSync } from 'glob';
3
+ import path from 'node:path';
4
+ import chalk from 'chalk';
5
+ import { resolvePaths } from 'erudit-cog/kit';
6
+ import type { ContributorConfig } from 'erudit-cog/schema';
7
+
8
+ import { PROJECT_DIR } from '#erudit/globalPaths';
9
+ import { stress } from '@erudit/utils/stress';
10
+ import { debug, logger } from '@server/logger';
11
+ import { ERUDIT_SERVER } from '@server/global';
12
+ import { IMPORT } from '@server/importer';
13
+ import { DbContributor } from '@server/db/entities/Contributor';
14
+
15
+ export async function buildContributors() {
16
+ debug.start('Building contributors...');
17
+
18
+ const contributorPaths = globSync(PROJECT_DIR + '/contributors/*/');
19
+ for (const contributorPath of contributorPaths)
20
+ await addContributor(resolvePaths(contributorPath));
21
+
22
+ logger.success(
23
+ `Contributors built successfully!`,
24
+ chalk.dim(`(${contributorPaths.length})`),
25
+ );
26
+ }
27
+
28
+ async function addContributor(contributorPath: string) {
29
+ const contributorId = contributorPath.split('/').pop() as string;
30
+
31
+ debug.start(`Adding contributor ${stress(contributorId)}...`);
32
+
33
+ const avatarFilename = (() => {
34
+ const avatarPaths = globSync(`${contributorPath}/avatar.*`);
35
+ if (avatarPaths[0])
36
+ return avatarPaths[0].split(path.sep).slice(-2).join('/');
37
+
38
+ return undefined;
39
+ })();
40
+
41
+ const config: Partial<ContributorConfig> = await (async () => {
42
+ try {
43
+ return await IMPORT(`${contributorPath}/contributor`, {
44
+ default: true,
45
+ });
46
+ } catch {
47
+ return {};
48
+ }
49
+ })();
50
+
51
+ const description = (() => {
52
+ try {
53
+ return readFileSync(`${contributorPath}/description.bi`, 'utf-8');
54
+ } catch {
55
+ return undefined;
56
+ }
57
+ })();
58
+
59
+ const dbContributor = new DbContributor();
60
+ dbContributor.contributorId = contributorId;
61
+ dbContributor.avatar = avatarFilename;
62
+ dbContributor.displayName = config.displayName;
63
+ dbContributor.description = description;
64
+
65
+ await ERUDIT_SERVER.DB.manager.save(dbContributor);
66
+ }
@@ -1,36 +1,36 @@
1
- import { existsSync } from 'node:fs';
2
-
3
- import { ERUDIT_DIR } from '#erudit/globalPaths';
4
- import { stress } from '@erudit/utils/stress';
5
- import { ERUDIT_SERVER } from '@server/global';
6
- import { IMPORT } from '@server/importer';
7
-
8
- export async function setupLanguage() {
9
- const languageCode = ERUDIT_SERVER.CONFIG?.language || 'en';
10
- const languageFilePath = ERUDIT_DIR + `/languages/${languageCode}.ts`;
11
-
12
- if (!existsSync(languageFilePath))
13
- throw new Error(`Language file for ${stress(languageCode)} not found!`);
14
-
15
- try {
16
- const languageModule = await IMPORT(languageFilePath);
17
-
18
- if (!languageModule.default)
19
- throw new Error(
20
- `Language file for ${stress(languageCode)} is missing default export with phrases!`,
21
- );
22
-
23
- const { default: phrases, ...context } = { ...languageModule };
24
-
25
- ERUDIT_SERVER.LANGUAGE = {
26
- phrases,
27
- functions: Object.entries(context)
28
- .filter(([, value]) => typeof value === 'function')
29
- .reduce((acc, [key, value]) => ({ ...acc, [key]: value }), {}),
30
- };
31
- } catch (error) {
32
- throw new Error(
33
- `Error while loading language ${stress(languageCode)}!\n\n${error}`,
34
- );
35
- }
36
- }
1
+ import { existsSync } from 'node:fs';
2
+
3
+ import { ERUDIT_DIR } from '#erudit/globalPaths';
4
+ import { stress } from '@erudit/utils/stress';
5
+ import { ERUDIT_SERVER } from '@server/global';
6
+ import { IMPORT } from '@server/importer';
7
+
8
+ export async function setupLanguage() {
9
+ const languageCode = ERUDIT_SERVER.CONFIG?.language || 'en';
10
+ const languageFilePath = ERUDIT_DIR + `/languages/${languageCode}.ts`;
11
+
12
+ if (!existsSync(languageFilePath))
13
+ throw new Error(`Language file for ${stress(languageCode)} not found!`);
14
+
15
+ try {
16
+ const languageModule = await IMPORT(languageFilePath);
17
+
18
+ if (!languageModule.default)
19
+ throw new Error(
20
+ `Language file for ${stress(languageCode)} is missing default export with phrases!`,
21
+ );
22
+
23
+ const { default: phrases, ...context } = { ...languageModule };
24
+
25
+ ERUDIT_SERVER.LANGUAGE = {
26
+ phrases,
27
+ functions: Object.entries(context)
28
+ .filter(([, value]) => typeof value === 'function')
29
+ .reduce((acc, [key, value]) => ({ ...acc, [key]: value }), {}),
30
+ };
31
+ } catch (error) {
32
+ throw new Error(
33
+ `Error while loading language ${stress(languageCode)}!\n\n${error}`,
34
+ );
35
+ }
36
+ }