erudit 4.0.0-dev.4 → 4.0.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 (336) hide show
  1. package/.nuxtrc +1 -1
  2. package/app/app.vue +34 -34
  3. package/app/components/EruditLink.ts +7 -7
  4. package/app/components/FancyBold.vue +16 -16
  5. package/app/components/FancyCard.vue +52 -58
  6. package/app/components/FancyCardTag.vue +16 -16
  7. package/app/components/Loading.vue +7 -7
  8. package/app/components/Prose.vue +55 -52
  9. package/app/components/ScrollHolder.vue +13 -13
  10. package/app/components/SmartMedia.vue +107 -112
  11. package/app/components/ads/Ads.vue +17 -17
  12. package/app/components/ads/AdsBannerAside.vue +29 -29
  13. package/app/components/ads/AdsBannerBottom.vue +6 -6
  14. package/app/components/ads/AdsReplacer.vue +19 -21
  15. package/app/components/ads/provider/Custom.vue +9 -9
  16. package/app/components/ads/provider/Yandex.vue +56 -56
  17. package/app/components/aside/AsideListItem.vue +47 -52
  18. package/app/components/aside/AsideMajor.vue +6 -6
  19. package/app/components/aside/AsideMinor.vue +47 -52
  20. package/app/components/aside/AsidePlainMessage.vue +9 -9
  21. package/app/components/aside/AsideSwitch.vue +53 -54
  22. package/app/components/aside/major/PaneHolder.vue +61 -61
  23. package/app/components/aside/major/PaneSwitcher.vue +50 -55
  24. package/app/components/aside/major/PaneSwitcherButton.vue +24 -24
  25. package/app/components/aside/major/PaneTemplate.vue +3 -3
  26. package/app/components/aside/major/SiteInfo.vue +40 -42
  27. package/app/components/aside/major/contentNav/PaneBookNav.vue +107 -116
  28. package/app/components/aside/major/contentNav/PaneGlobalNav.vue +19 -19
  29. package/app/components/aside/major/contentNav/items/ContentNavBook.vue +8 -8
  30. package/app/components/aside/major/contentNav/items/ContentNavFolder.vue +55 -56
  31. package/app/components/aside/major/contentNav/items/ContentNavItem.vue +16 -16
  32. package/app/components/aside/major/contentNav/items/ContentNavPage.vue +2 -6
  33. package/app/components/aside/major/contentNav/items/ContentNavSeparator.vue +34 -35
  34. package/app/components/aside/major/contentNav/items/ContentNavTopic.vue +6 -6
  35. package/app/components/aside/major/contentNav/items/Flags.vue +31 -33
  36. package/app/components/aside/major/contentNav/items/ItemTemplate.vue +13 -13
  37. package/app/components/aside/major/languages/PaneLanguages.vue +40 -40
  38. package/app/components/aside/major/pages/PanePages.vue +45 -45
  39. package/app/components/aside/major/search/PaneSearch.vue +109 -100
  40. package/app/components/aside/major/search/SearchInput.vue +52 -53
  41. package/app/components/aside/major/search/SearchResult.vue +123 -75
  42. package/app/components/aside/major/search/SearchStatus.vue +28 -28
  43. package/app/components/aside/major/search/search.worker.ts +129 -129
  44. package/app/components/aside/major/settings/BuildTime.vue +15 -15
  45. package/app/components/aside/major/settings/EngineVersion.vue +8 -7
  46. package/app/components/aside/major/settings/PaneSettings.vue +8 -8
  47. package/app/components/aside/major/settings/ThemeSwitcher.vue +36 -36
  48. package/app/components/aside/major/settings/repository/Repository.vue +18 -18
  49. package/app/components/aside/major/settings/repository/SecondaryGitHub.vue +47 -47
  50. package/app/components/aside/minor/AsideMinorPane.vue +5 -5
  51. package/app/components/aside/minor/AsideMinorPlainHeader.vue +20 -20
  52. package/app/components/aside/minor/content/AsideMinorContentContributions.vue +47 -51
  53. package/app/components/aside/minor/content/AsideMinorContentPage.vue +37 -37
  54. package/app/components/aside/minor/content/AsideMinorContentTopic.vue +61 -66
  55. package/app/components/aside/minor/content/ButtonPaneContributions.vue +101 -114
  56. package/app/components/aside/minor/content/ButtonPaneImprove.vue +112 -123
  57. package/app/components/aside/minor/content/Contribution.vue +36 -36
  58. package/app/components/aside/minor/content/Toc.vue +163 -163
  59. package/app/components/aside/minor/content/TocItem.vue +91 -91
  60. package/app/components/aside/minor/content/TopicPartButton.vue +35 -35
  61. package/app/components/aside/minor/contributor/AsideMinorContributor.vue +36 -39
  62. package/app/components/aside/minor/contributor/ItemBook.vue +33 -39
  63. package/app/components/aside/minor/contributor/ItemContent.vue +17 -17
  64. package/app/components/aside/minor/news/AsideMinorNews.vue +132 -132
  65. package/app/components/aside/minor/news/NewsItem.vue +69 -69
  66. package/app/components/aside/minor/news/RenderNewsElement.vue +42 -42
  67. package/app/components/aside/minor/news/elements/Mix.vue +11 -11
  68. package/app/components/aside/minor/news/elements/P.vue +14 -14
  69. package/app/components/aside/minor/news/elements/Ref.vue +59 -58
  70. package/app/components/aside/minor/news/elements/Text.vue +18 -18
  71. package/app/components/indexPage/IndexPagePersons.vue +116 -117
  72. package/app/components/main/MainAction.vue +26 -26
  73. package/app/components/main/MainBreadcrumbs.vue +28 -28
  74. package/app/components/main/MainContentChild.vue +44 -47
  75. package/app/components/main/MainContentChildren.vue +13 -14
  76. package/app/components/main/MainDecoration.vue +15 -15
  77. package/app/components/main/MainDescription.vue +13 -13
  78. package/app/components/main/MainFlag.vue +129 -133
  79. package/app/components/main/MainFlags.vue +17 -17
  80. package/app/components/main/MainGlow.vue +12 -12
  81. package/app/components/main/MainQuickLink.vue +90 -91
  82. package/app/components/main/MainQuickLinks.vue +40 -40
  83. package/app/components/main/MainQuote.vue +149 -161
  84. package/app/components/main/MainQuoteLoader.vue +86 -86
  85. package/app/components/main/MainSection.vue +44 -44
  86. package/app/components/main/MainSectionPreamble.vue +5 -5
  87. package/app/components/main/MainSubTitle.vue +11 -12
  88. package/app/components/main/MainTitle.vue +32 -32
  89. package/app/components/main/MainTopicPartPage.vue +88 -88
  90. package/app/components/main/MainTopicPartSwitch.vue +67 -71
  91. package/app/components/main/connections/Deps.vue +30 -34
  92. package/app/components/main/connections/Externals.vue +80 -104
  93. package/app/components/main/connections/MainConnections.vue +90 -94
  94. package/app/components/main/connections/MainConnectionsButton.vue +81 -81
  95. package/app/components/main/connections/ScrollPane.vue +10 -10
  96. package/app/components/main/contentStats/Item.vue +28 -34
  97. package/app/components/main/contentStats/ItemElement.vue +19 -19
  98. package/app/components/main/contentStats/ItemMaterials.vue +11 -11
  99. package/app/components/main/contentStats/MainContentStats.vue +50 -53
  100. package/app/components/preview/Preview.vue +110 -118
  101. package/app/components/preview/PreviewError.vue +4 -4
  102. package/app/components/preview/PreviewLoading.vue +3 -3
  103. package/app/components/preview/PreviewScreen.vue +48 -48
  104. package/app/components/preview/PreviewScreenButton.vue +27 -27
  105. package/app/components/preview/screen/ContentPage.vue +27 -30
  106. package/app/components/preview/screen/DirectLink.vue +13 -13
  107. package/app/components/preview/screen/Unique.vue +31 -32
  108. package/app/components/site/SiteAside.vue +50 -51
  109. package/app/components/site/SiteAsideOverlay.vue +8 -8
  110. package/app/components/site/SiteMain.vue +11 -11
  111. package/app/components/transition/Fade.vue +16 -16
  112. package/app/components/transition/Slide.vue +27 -27
  113. package/app/components/tree/TreeContainer.vue +3 -3
  114. package/app/components/tree/TreeItem.vue +27 -31
  115. package/app/composables/ads.ts +11 -11
  116. package/app/composables/analytics.ts +102 -102
  117. package/app/composables/appElements.ts +21 -21
  118. package/app/composables/aside.ts +15 -15
  119. package/app/composables/asideMajorPane.ts +82 -82
  120. package/app/composables/asideMinor.ts +109 -109
  121. package/app/composables/contentNav.ts +7 -7
  122. package/app/composables/favicon.ts +103 -108
  123. package/app/composables/file.ts +4 -3
  124. package/app/composables/formatText.ts +100 -100
  125. package/app/composables/loading.ts +26 -26
  126. package/app/composables/mainContent.ts +22 -22
  127. package/app/composables/og.ts +184 -182
  128. package/app/composables/phrases.ts +98 -98
  129. package/app/composables/preview.ts +44 -44
  130. package/app/composables/route.ts +4 -2
  131. package/app/composables/theme.ts +47 -51
  132. package/app/composables/url.ts +19 -11
  133. package/app/formatters/ru.ts +14 -14
  134. package/app/pages/article/[...articleId].vue +12 -12
  135. package/app/pages/book/[...bookId].vue +56 -56
  136. package/app/pages/contributor/[contributorId].vue +144 -150
  137. package/app/pages/contributors.vue +95 -102
  138. package/app/pages/group/[...groupId].vue +58 -58
  139. package/app/pages/index.vue +113 -117
  140. package/app/pages/page/[...pageId].vue +60 -60
  141. package/app/pages/practice/[...practiceId].vue +12 -12
  142. package/app/pages/sponsors.vue +88 -92
  143. package/app/pages/summary/[...summaryId].vue +12 -12
  144. package/app/plugins/appSetup/client/htmlBranding.ts +6 -6
  145. package/app/plugins/appSetup/client/welcome.ts +37 -35
  146. package/app/plugins/appSetup/config.ts +6 -6
  147. package/app/plugins/appSetup/global.ts +3 -3
  148. package/app/plugins/appSetup/index.ts +27 -28
  149. package/app/plugins/prerender.server.ts +40 -40
  150. package/app/router.options.ts +5 -5
  151. package/app/scripts/theme.js +21 -24
  152. package/app/styles/main.css +128 -124
  153. package/bin/erudit.js +12 -0
  154. package/modules/erudit/env.ts +8 -0
  155. package/modules/erudit/globals/content.ts +4 -4
  156. package/modules/erudit/globals/contributor.ts +1 -1
  157. package/modules/erudit/globals/eruditConfig.ts +5 -10
  158. package/modules/erudit/globals/problem.ts +1 -1
  159. package/modules/erudit/globals/prose.ts +5 -1
  160. package/modules/erudit/globals/public.ts +18 -18
  161. package/modules/erudit/index.ts +50 -60
  162. package/modules/erudit/logger.ts +10 -10
  163. package/modules/erudit/setup/elements/appTemplate.ts +44 -45
  164. package/modules/erudit/setup/elements/globalTemplate.ts +82 -82
  165. package/modules/erudit/setup/elements/globalTypes.ts +259 -273
  166. package/modules/erudit/setup/elements/setup.ts +163 -167
  167. package/modules/erudit/setup/elements/shared.ts +10 -10
  168. package/modules/erudit/setup/elements/tagsTable.ts +28 -28
  169. package/modules/erudit/setup/fullRestart.ts +61 -71
  170. package/modules/erudit/setup/globals.ts +210 -196
  171. package/modules/erudit/setup/publicAssets.ts +43 -52
  172. package/modules/erudit/setup/runtimeConfig.ts +106 -58
  173. package/modules/erudit/watcher.ts +20 -27
  174. package/nuxt.config.ts +102 -84
  175. package/package.json +51 -55
  176. package/server/api/aside/major/frontNav/book/[...shortId].ts +10 -10
  177. package/server/api/aside/major/frontNav/global.ts +5 -5
  178. package/server/api/aside/major/pages.ts +6 -6
  179. package/server/api/contributor/list.ts +60 -61
  180. package/server/api/contributor/page/[contributorId].ts +68 -68
  181. package/server/api/indexPage.ts +81 -81
  182. package/server/api/language/functions.ts +11 -11
  183. package/server/api/language/phrase/[phraseKey].ts +35 -35
  184. package/server/api/main/content/[...contentTypePath].ts +149 -153
  185. package/server/api/news/batch/[batchIndex].ts +5 -5
  186. package/server/api/pageSponsors.ts +56 -58
  187. package/server/api/prerender/content.ts +79 -82
  188. package/server/api/prerender/default.ts +35 -35
  189. package/server/api/prerender/files.ts +10 -10
  190. package/server/api/prerender/frontNav.ts +13 -13
  191. package/server/api/prerender/language.ts +7 -7
  192. package/server/api/prerender/news.ts +8 -8
  193. package/server/api/prerender/quotes.ts +15 -15
  194. package/server/api/preview/contentPage/[...contentTypePath].ts +63 -63
  195. package/server/api/preview/contentUnique/[...contentTypePathUnique].ts +73 -81
  196. package/server/api/problemScript/[...problemScriptPath].ts +88 -92
  197. package/server/api/quote/data/[quoteId].ts +84 -87
  198. package/server/api/quote/ids.ts +3 -3
  199. package/server/erudit/build.ts +132 -137
  200. package/server/erudit/cameos/build.ts +161 -161
  201. package/server/erudit/config.ts +13 -13
  202. package/server/erudit/content/global/build.ts +300 -297
  203. package/server/erudit/content/global/singleton.ts +5 -5
  204. package/server/erudit/content/nav/build.ts +459 -463
  205. package/server/erudit/content/nav/front.ts +125 -127
  206. package/server/erudit/content/nav/repository/books.ts +37 -40
  207. package/server/erudit/content/nav/repository/get.ts +33 -33
  208. package/server/erudit/content/nav/repository/hasChildren.ts +5 -5
  209. package/server/erudit/content/nav/repository/hasNav.ts +3 -3
  210. package/server/erudit/content/nav/repository/hasParent.ts +5 -5
  211. package/server/erudit/content/nav/repository/id.ts +9 -9
  212. package/server/erudit/content/nav/repository/index.ts +9 -9
  213. package/server/erudit/content/nav/repository/order.ts +14 -14
  214. package/server/erudit/content/nav/repository/previousNext.ts +35 -35
  215. package/server/erudit/content/nav/repository/walk.ts +127 -127
  216. package/server/erudit/content/nav/setup.ts +13 -13
  217. package/server/erudit/content/nav/types.ts +24 -24
  218. package/server/erudit/content/repository/breadcrumbs.ts +24 -24
  219. package/server/erudit/content/repository/children.ts +47 -47
  220. package/server/erudit/content/repository/connections.ts +35 -35
  221. package/server/erudit/content/repository/contentLink.ts +16 -16
  222. package/server/erudit/content/repository/decoration.ts +23 -23
  223. package/server/erudit/content/repository/deps.ts +121 -84
  224. package/server/erudit/content/repository/description.ts +11 -11
  225. package/server/erudit/content/repository/elementSnippets.ts +105 -105
  226. package/server/erudit/content/repository/externals.ts +50 -50
  227. package/server/erudit/content/repository/flags.ts +33 -33
  228. package/server/erudit/content/repository/seo.ts +12 -12
  229. package/server/erudit/content/repository/stats.ts +97 -97
  230. package/server/erudit/content/repository/title.ts +27 -27
  231. package/server/erudit/content/repository/topicParts.ts +39 -39
  232. package/server/erudit/content/repository/unique.ts +76 -76
  233. package/server/erudit/content/resolve/book.ts +29 -32
  234. package/server/erudit/content/resolve/group.ts +34 -39
  235. package/server/erudit/content/resolve/index.ts +272 -290
  236. package/server/erudit/content/resolve/page.ts +80 -87
  237. package/server/erudit/content/resolve/topic.ts +220 -246
  238. package/server/erudit/content/resolve/utils/contentError.ts +10 -10
  239. package/server/erudit/content/resolve/utils/insertContentItem.ts +113 -122
  240. package/server/erudit/content/resolve/utils/insertContentResolved.ts +126 -132
  241. package/server/erudit/content/search.ts +146 -163
  242. package/server/erudit/contributors/build.ts +158 -166
  243. package/server/erudit/contributors/global.ts +3 -3
  244. package/server/erudit/contributors/repository/avatarUrl.ts +10 -10
  245. package/server/erudit/contributors/repository/contributions.ts +171 -178
  246. package/server/erudit/contributors/repository/count.ts +3 -3
  247. package/server/erudit/contributors/search.ts +34 -34
  248. package/server/erudit/db/repository/pushFile.ts +23 -26
  249. package/server/erudit/db/repository/pushProblemScript.ts +19 -19
  250. package/server/erudit/db/repository/pushProseLink.ts +40 -40
  251. package/server/erudit/db/schema/cameos.ts +7 -7
  252. package/server/erudit/db/schema/content.ts +18 -18
  253. package/server/erudit/db/schema/contentContributions.ts +15 -15
  254. package/server/erudit/db/schema/contentDeps.ts +21 -21
  255. package/server/erudit/db/schema/contentElementStats.ts +20 -20
  256. package/server/erudit/db/schema/contentProseLinks.ts +23 -23
  257. package/server/erudit/db/schema/contentSnippets.ts +15 -15
  258. package/server/erudit/db/schema/contentToc.ts +16 -16
  259. package/server/erudit/db/schema/contentUniques.ts +19 -25
  260. package/server/erudit/db/schema/contributors.ts +12 -12
  261. package/server/erudit/db/schema/files.ts +11 -11
  262. package/server/erudit/db/schema/groups.ts +6 -6
  263. package/server/erudit/db/schema/index.ts +17 -17
  264. package/server/erudit/db/schema/news.ts +7 -7
  265. package/server/erudit/db/schema/pages.ts +7 -7
  266. package/server/erudit/db/schema/problemScripts.ts +14 -14
  267. package/server/erudit/db/schema/sponsors.ts +9 -9
  268. package/server/erudit/db/schema/topics.ts +9 -9
  269. package/server/erudit/db/setup.ts +62 -62
  270. package/server/erudit/db/types.ts +10 -10
  271. package/server/erudit/global.ts +38 -33
  272. package/server/erudit/importer.ts +94 -97
  273. package/server/erudit/index.ts +96 -90
  274. package/server/erudit/language/list/en.ts +116 -116
  275. package/server/erudit/language/list/ru.ts +120 -120
  276. package/server/erudit/language/list.ts +6 -6
  277. package/server/erudit/language/setup.ts +36 -36
  278. package/server/erudit/language/types.ts +16 -16
  279. package/server/erudit/logger.ts +73 -77
  280. package/server/erudit/news/build.ts +112 -114
  281. package/server/erudit/news/repository/batch.ts +61 -61
  282. package/server/erudit/path.ts +19 -0
  283. package/server/erudit/prose/repository/finalize.ts +68 -68
  284. package/server/erudit/prose/repository/get.ts +54 -54
  285. package/server/erudit/prose/repository/resolve.ts +17 -17
  286. package/server/erudit/prose/storage/callout.ts +16 -14
  287. package/server/erudit/prose/storage/image.ts +22 -20
  288. package/server/erudit/prose/storage/link.ts +222 -226
  289. package/server/erudit/prose/storage/problemScript.ts +23 -21
  290. package/server/erudit/prose/storage/video.ts +16 -14
  291. package/server/erudit/prose/transform/bundleProblemScript.ts +6 -6
  292. package/server/erudit/prose/transform/extensions.ts +15 -15
  293. package/server/erudit/quote/repository/ids.ts +31 -31
  294. package/server/erudit/repository.ts +96 -96
  295. package/server/erudit/sponsors/build.ts +161 -165
  296. package/server/erudit/sponsors/repository/avatarUrl.ts +10 -10
  297. package/server/erudit/sponsors/repository/count.ts +4 -4
  298. package/server/erudit/staticFile.ts +28 -28
  299. package/server/plugins/augmentCss.ts +17 -17
  300. package/server/plugins/lang.ts +5 -7
  301. package/server/plugins/metaViewport.ts +15 -15
  302. package/server/plugins/theme.ts +13 -13
  303. package/server/routes/file/[...path].ts +18 -18
  304. package/server/routes/robots.txt.ts +9 -9
  305. package/server/routes/search.json.gz.ts +76 -75
  306. package/server/routes/sitemap.xml.ts +83 -81
  307. package/shared/search/encoders.ts +10 -10
  308. package/shared/types/asideMajorPages.ts +2 -2
  309. package/shared/types/breadcrumbs.ts +3 -3
  310. package/shared/types/contentChildren.ts +10 -10
  311. package/shared/types/contentConnections.ts +27 -27
  312. package/shared/types/contentStats.ts +6 -6
  313. package/shared/types/elementSnippet.ts +14 -14
  314. package/shared/types/frontContentNav.ts +17 -17
  315. package/shared/types/indexPage.ts +20 -20
  316. package/shared/types/language.ts +174 -174
  317. package/shared/types/mainContent.ts +40 -40
  318. package/shared/types/news.ts +13 -13
  319. package/shared/types/preview.ts +28 -28
  320. package/shared/types/runtimeConfig.ts +29 -48
  321. package/shared/types/search.ts +32 -32
  322. package/shared/utils/contentTypePath.ts +44 -44
  323. package/shared/utils/icons.ts +7 -7
  324. package/shared/utils/pages.ts +19 -20
  325. package/shared/utils/stringColor.ts +8 -8
  326. package/shared/utils/toStringEqual.ts +13 -13
  327. package/shared/utils/zip.ts +64 -64
  328. package/test/shared/utils/zip.test.ts +8 -8
  329. package/tsconfig.json +15 -15
  330. package/bin/erudit.mjs +0 -2
  331. package/modules/erudit/setup/aliases.ts +0 -17
  332. package/modules/erudit/setup/baseUrl.ts +0 -19
  333. package/modules/erudit/setup/nuxtConfig.ts +0 -62
  334. package/modules/erudit/setup/projectConfig.ts +0 -115
  335. package/shared/utils/slasher.ts +0 -64
  336. package/test/shared/utils/slasher.test.ts +0 -75
@@ -1,77 +1,73 @@
1
- import chalk from 'chalk';
2
- import { brandColorTitle } from '@erudit-js/core/brandTerminal';
3
-
4
- interface Logger {
5
- info(message: any): void;
6
- start(message: any): void;
7
- success(message: any): void;
8
- warn(message: any): void;
9
- error(message: any): void;
10
- stress(message: any): string;
11
- }
12
-
13
- export type EruditServerLogger = Logger & {
14
- debug: Logger;
15
- };
16
-
17
- export async function setupServerLogger() {
18
- const serverLogger = createLogger(brandColorTitle + ' Server');
19
- const serverDebugLogger = createLogger(brandColorTitle + ' Server Debug');
20
- const debugLogEnabled = !!ERUDIT.config.public.project.debug.log;
21
-
22
- ERUDIT.log = new Proxy(serverLogger, {
23
- get(target, prop) {
24
- if (prop === 'debug') {
25
- if (!debugLogEnabled) {
26
- return new Proxy(
27
- {},
28
- {
29
- get() {
30
- return () => {};
31
- },
32
- },
33
- );
34
- }
35
- return serverDebugLogger;
36
- }
37
- return target[prop as keyof typeof target];
38
- },
39
- }) as EruditServerLogger;
40
-
41
- ERUDIT.log.success('Logger setup complete!');
42
- }
43
-
44
- function createLogger(tag: string): Logger {
45
- const formattedTag = chalk.gray(`[${tag}]`);
46
-
47
- return {
48
- info(message: any) {
49
- console.log(`${formattedTag} ${chalk.blueBright('ℹ')} ${message}`);
50
- },
51
- start(message: any) {
52
- console.log(
53
- `${formattedTag} ${chalk.magentaBright('◐')} ${message}`,
54
- );
55
- },
56
- success(message: any) {
57
- console.log(
58
- `${formattedTag} ${chalk.greenBright('✔')} ${message}`,
59
- );
60
- },
61
- warn(message: any) {
62
- console.log(
63
- `${formattedTag} ${chalk.bgYellowBright.black(' WARN ')} ${message}`,
64
- );
65
- },
66
- error(message: any) {
67
- console.log();
68
- console.log(
69
- `${formattedTag} ${chalk.bgRed.whiteBright(' ERROR ')} ${message}`,
70
- );
71
- console.log();
72
- },
73
- stress(message: any) {
74
- return chalk.cyanBright(message);
75
- },
76
- };
77
- }
1
+ import chalk from 'chalk';
2
+ import { brandColorTitle } from '@erudit-js/core/brandTerminal';
3
+
4
+ interface Logger {
5
+ info(message: any): void;
6
+ start(message: any): void;
7
+ success(message: any): void;
8
+ warn(message: any): void;
9
+ error(message: any): void;
10
+ stress(message: any): string;
11
+ }
12
+
13
+ export type EruditServerLogger = Logger & {
14
+ debug: Logger;
15
+ };
16
+
17
+ export async function setupServerLogger() {
18
+ const serverLogger = createLogger(brandColorTitle + ' Server');
19
+ const serverDebugLogger = createLogger(brandColorTitle + ' Server Debug');
20
+ const debugLogEnabled = !!ERUDIT.config.public.debug.log;
21
+
22
+ ERUDIT.log = new Proxy(serverLogger, {
23
+ get(target, prop) {
24
+ if (prop === 'debug') {
25
+ if (!debugLogEnabled) {
26
+ return new Proxy(
27
+ {},
28
+ {
29
+ get() {
30
+ return () => {};
31
+ },
32
+ },
33
+ );
34
+ }
35
+ return serverDebugLogger;
36
+ }
37
+ return target[prop as keyof typeof target];
38
+ },
39
+ }) as EruditServerLogger;
40
+
41
+ ERUDIT.log.success('Logger setup complete!');
42
+ }
43
+
44
+ function createLogger(tag: string): Logger {
45
+ const formattedTag = chalk.gray(`[${tag}]`);
46
+
47
+ return {
48
+ info(message: any) {
49
+ console.log(`${formattedTag} ${chalk.blueBright('ℹ')} ${message}`);
50
+ },
51
+ start(message: any) {
52
+ console.log(`${formattedTag} ${chalk.magentaBright('◐')} ${message}`);
53
+ },
54
+ success(message: any) {
55
+ console.log(`${formattedTag} ${chalk.greenBright('✔')} ${message}`);
56
+ },
57
+ warn(message: any) {
58
+ console.log(
59
+ `${formattedTag} ${chalk.bgYellowBright.black(' WARN ')} ${message}`,
60
+ );
61
+ },
62
+ error(message: any) {
63
+ console.log();
64
+ console.log(
65
+ `${formattedTag} ${chalk.bgRed.whiteBright(' ERROR ')} ${message}`,
66
+ );
67
+ console.log();
68
+ },
69
+ stress(message: any) {
70
+ return chalk.cyanBright(message);
71
+ },
72
+ };
73
+ }
@@ -1,114 +1,112 @@
1
- import { existsSync } from 'node:fs';
2
- import { inArray } from 'drizzle-orm';
3
- import { globSync } from 'glob';
4
- import type { AnySchema, RawElement } from '@jsprose/core';
5
-
6
- import { resolveEruditProse } from '../prose/repository/resolve';
7
-
8
- let initialBuild = true;
9
-
10
- const newsRoot = () => `${ERUDIT.config.paths.project}/news`;
11
-
12
- export async function buildNews() {
13
- ERUDIT.log.debug.start('Building news...');
14
-
15
- const isInitial = initialBuild;
16
- initialBuild = false;
17
-
18
- const newsFilenames = collectNewsFilenames(isInitial);
19
-
20
- if (!newsFilenames.size) {
21
- ERUDIT.log.info(
22
- isInitial
23
- ? 'Skipping news — no news found.'
24
- : 'Skipping news — nothing changed.',
25
- );
26
- return;
27
- }
28
-
29
- for (const filename of newsFilenames) {
30
- await cleanupNews(filename);
31
- }
32
-
33
- const existingFilenames = [...newsFilenames].filter((filename) =>
34
- existsSync(`${newsRoot()}/${filename}`),
35
- );
36
-
37
- if (!existingFilenames.length) {
38
- return;
39
- }
40
-
41
- for (const filename of existingFilenames) {
42
- await buildNewsItem(filename);
43
- }
44
-
45
- ERUDIT.log.success(
46
- isInitial
47
- ? `News build complete! (${ERUDIT.log.stress(newsFilenames.size)})`
48
- : `News updated: ${ERUDIT.log.stress(existingFilenames.join(', '))}`,
49
- );
50
- }
51
-
52
- //
53
- //
54
- //
55
-
56
- function collectNewsFilenames(initial: boolean): Set<string> {
57
- if (initial) {
58
- return new Set(
59
- globSync(`[0-9][0-9][0-9][0-9].[0-9][0-9].[0-9][0-9].tsx`, {
60
- posix: true,
61
- cwd: newsRoot(),
62
- }),
63
- );
64
- }
65
-
66
- const filenames = new Set<string>();
67
-
68
- for (const file of ERUDIT.changedFiles.values()) {
69
- if (!file.startsWith(`${newsRoot()}/`)) continue;
70
- const relativePath = file.replace(`${newsRoot()}/`, '');
71
-
72
- if (relativePath.match(/^[0-9]{4}\.[0-9]{2}\.[0-9]{2}\.tsx$/)) {
73
- filenames.add(relativePath);
74
- }
75
- }
76
-
77
- return filenames;
78
- }
79
-
80
- async function cleanupNews(filename: string) {
81
- await ERUDIT.db
82
- .delete(ERUDIT.db.schema.news)
83
- .where(
84
- inArray(ERUDIT.db.schema.news.date, [filename.replace('.tsx', '')]),
85
- );
86
- }
87
-
88
- async function buildNewsItem(filename: string) {
89
- ERUDIT.log.debug.start(
90
- `Building news item ${ERUDIT.log.stress(filename)}...`,
91
- );
92
-
93
- let newsModule: { default: RawElement<AnySchema> } | undefined;
94
-
95
- try {
96
- newsModule = await ERUDIT.import(`${newsRoot()}/${filename}`);
97
- } catch (err) {
98
- ERUDIT.log.error(`Failed to load news item ${filename}:`);
99
- console.error(err);
100
- return;
101
- }
102
-
103
- if (!newsModule?.default) {
104
- ERUDIT.log.error(`No default export in news item ${filename}`);
105
- return;
106
- }
107
-
108
- const resolvedProse = await resolveEruditProse(newsModule.default, false);
109
-
110
- await ERUDIT.db.insert(ERUDIT.db.schema.news).values({
111
- date: filename.replace('.tsx', ''),
112
- prose: resolvedProse.proseElement,
113
- });
114
- }
1
+ import { existsSync } from 'node:fs';
2
+ import { inArray } from 'drizzle-orm';
3
+ import { globSync } from 'glob';
4
+ import type { AnySchema, RawElement } from '@jsprose/core';
5
+
6
+ import { resolveEruditProse } from '../prose/repository/resolve';
7
+
8
+ let initialBuild = true;
9
+
10
+ const newsRoot = () => ERUDIT.paths.project(`news`);
11
+
12
+ export async function buildNews() {
13
+ ERUDIT.log.debug.start('Building news...');
14
+
15
+ const isInitial = initialBuild;
16
+ initialBuild = false;
17
+
18
+ const newsFilenames = collectNewsFilenames(isInitial);
19
+
20
+ if (!newsFilenames.size) {
21
+ ERUDIT.log.info(
22
+ isInitial
23
+ ? 'Skipping news — no news found.'
24
+ : 'Skipping news — nothing changed.',
25
+ );
26
+ return;
27
+ }
28
+
29
+ for (const filename of newsFilenames) {
30
+ await cleanupNews(filename);
31
+ }
32
+
33
+ const existingFilenames = [...newsFilenames].filter((filename) =>
34
+ existsSync(`${newsRoot()}/${filename}`),
35
+ );
36
+
37
+ if (!existingFilenames.length) {
38
+ return;
39
+ }
40
+
41
+ for (const filename of existingFilenames) {
42
+ await buildNewsItem(filename);
43
+ }
44
+
45
+ ERUDIT.log.success(
46
+ isInitial
47
+ ? `News build complete! (${ERUDIT.log.stress(newsFilenames.size)})`
48
+ : `News updated: ${ERUDIT.log.stress(existingFilenames.join(', '))}`,
49
+ );
50
+ }
51
+
52
+ //
53
+ //
54
+ //
55
+
56
+ function collectNewsFilenames(initial: boolean): Set<string> {
57
+ if (initial) {
58
+ return new Set(
59
+ globSync(`[0-9][0-9][0-9][0-9].[0-9][0-9].[0-9][0-9].tsx`, {
60
+ posix: true,
61
+ cwd: newsRoot(),
62
+ }),
63
+ );
64
+ }
65
+
66
+ const filenames = new Set<string>();
67
+
68
+ for (const file of ERUDIT.changedFiles.values()) {
69
+ if (!file.startsWith(`${newsRoot()}/`)) continue;
70
+ const relativePath = file.replace(`${newsRoot()}/`, '');
71
+
72
+ if (relativePath.match(/^[0-9]{4}\.[0-9]{2}\.[0-9]{2}\.tsx$/)) {
73
+ filenames.add(relativePath);
74
+ }
75
+ }
76
+
77
+ return filenames;
78
+ }
79
+
80
+ async function cleanupNews(filename: string) {
81
+ await ERUDIT.db
82
+ .delete(ERUDIT.db.schema.news)
83
+ .where(inArray(ERUDIT.db.schema.news.date, [filename.replace('.tsx', '')]));
84
+ }
85
+
86
+ async function buildNewsItem(filename: string) {
87
+ ERUDIT.log.debug.start(
88
+ `Building news item ${ERUDIT.log.stress(filename)}...`,
89
+ );
90
+
91
+ let newsModule: { default: RawElement<AnySchema> } | undefined;
92
+
93
+ try {
94
+ newsModule = await ERUDIT.import(`${newsRoot()}/${filename}`);
95
+ } catch (err) {
96
+ ERUDIT.log.error(`Failed to load news item ${filename}:`);
97
+ console.error(err);
98
+ return;
99
+ }
100
+
101
+ if (!newsModule?.default) {
102
+ ERUDIT.log.error(`No default export in news item ${filename}`);
103
+ return;
104
+ }
105
+
106
+ const resolvedProse = await resolveEruditProse(newsModule.default, false);
107
+
108
+ await ERUDIT.db.insert(ERUDIT.db.schema.news).values({
109
+ date: filename.replace('.tsx', ''),
110
+ prose: resolvedProse.proseElement,
111
+ });
112
+ }
@@ -1,61 +1,61 @@
1
- import { count } from 'drizzle-orm';
2
-
3
- const newsNumberPerBatch = 20;
4
-
5
- export async function countNewsBatches(): Promise<number> {
6
- const newsTotal = await ERUDIT.db
7
- .select({ count: count() })
8
- .from(ERUDIT.db.schema.news)
9
- .then((result) => result[0].count);
10
-
11
- return Math.ceil(newsTotal / newsNumberPerBatch);
12
- }
13
-
14
- export async function getNewsNextBatch(index: number): Promise<NewsBatch> {
15
- const newsTotal = await ERUDIT.db
16
- .select({ count: count() })
17
- .from(ERUDIT.db.schema.news)
18
- .then((result) => result[0].count);
19
-
20
- const dbNews = await ERUDIT.db.query.news.findMany({
21
- columns: {
22
- date: true,
23
- prose: true,
24
- },
25
- orderBy: (news, { desc }) => [desc(news.date)],
26
- limit: newsNumberPerBatch,
27
- offset: index * newsNumberPerBatch,
28
- });
29
-
30
- const items: NewsItem[] = [];
31
-
32
- for (const dbNewsItem of dbNews) {
33
- const date = dbNewsItem.date;
34
- const finalizedProse = await ERUDIT.repository.prose.finalize(
35
- dbNewsItem.prose,
36
- );
37
-
38
- const item: NewsItem = {
39
- date,
40
- content: finalizedProse,
41
- };
42
-
43
- items.push(item);
44
- }
45
-
46
- const hasNext = (index + 1) * newsNumberPerBatch < newsTotal;
47
-
48
- const batch: NewsBatch = {
49
- items,
50
- };
51
-
52
- if (hasNext) {
53
- batch.nextIndex = index + 1;
54
- }
55
-
56
- if (index === 0) {
57
- batch.total = newsTotal;
58
- }
59
-
60
- return batch;
61
- }
1
+ import { count } from 'drizzle-orm';
2
+
3
+ const newsNumberPerBatch = 20;
4
+
5
+ export async function countNewsBatches(): Promise<number> {
6
+ const newsTotal = await ERUDIT.db
7
+ .select({ count: count() })
8
+ .from(ERUDIT.db.schema.news)
9
+ .then((result) => result[0].count);
10
+
11
+ return Math.ceil(newsTotal / newsNumberPerBatch);
12
+ }
13
+
14
+ export async function getNewsNextBatch(index: number): Promise<NewsBatch> {
15
+ const newsTotal = await ERUDIT.db
16
+ .select({ count: count() })
17
+ .from(ERUDIT.db.schema.news)
18
+ .then((result) => result[0].count);
19
+
20
+ const dbNews = await ERUDIT.db.query.news.findMany({
21
+ columns: {
22
+ date: true,
23
+ prose: true,
24
+ },
25
+ orderBy: (news, { desc }) => [desc(news.date)],
26
+ limit: newsNumberPerBatch,
27
+ offset: index * newsNumberPerBatch,
28
+ });
29
+
30
+ const items: NewsItem[] = [];
31
+
32
+ for (const dbNewsItem of dbNews) {
33
+ const date = dbNewsItem.date;
34
+ const finalizedProse = await ERUDIT.repository.prose.finalize(
35
+ dbNewsItem.prose,
36
+ );
37
+
38
+ const item: NewsItem = {
39
+ date,
40
+ content: finalizedProse,
41
+ };
42
+
43
+ items.push(item);
44
+ }
45
+
46
+ const hasNext = (index + 1) * newsNumberPerBatch < newsTotal;
47
+
48
+ const batch: NewsBatch = {
49
+ items,
50
+ };
51
+
52
+ if (hasNext) {
53
+ batch.nextIndex = index + 1;
54
+ }
55
+
56
+ if (index === 0) {
57
+ batch.total = newsTotal;
58
+ }
59
+
60
+ return batch;
61
+ }
@@ -0,0 +1,19 @@
1
+ import { sn } from 'unslash';
2
+
3
+ export interface EruditServerPaths {
4
+ erudit(...paths: string[]): string;
5
+ project(...paths: string[]): string;
6
+ }
7
+
8
+ export async function setupServerPaths() {
9
+ const runtimeConfig = useRuntimeConfig();
10
+
11
+ const pathConstructor = (basePart: string) => {
12
+ return (...parts: string[]) => sn(...[basePart, ...parts]);
13
+ };
14
+
15
+ ERUDIT.paths = {
16
+ erudit: pathConstructor(runtimeConfig.eruditPath),
17
+ project: pathConstructor(runtimeConfig.projectPath),
18
+ };
19
+ }
@@ -1,68 +1,68 @@
1
- import {
2
- fillStorage,
3
- isProseElement,
4
- PROSE_REGISTRY,
5
- type AnySchema,
6
- type FinalizedProse,
7
- type GenericStorage,
8
- type ProseElement,
9
- } from '@jsprose/core';
10
- import { imageSchema } from '@erudit-js/prose/elements/image/core';
11
- import { videoSchema } from '@erudit-js/prose/elements/video/core';
12
- import { calloutSchema } from '@erudit-js/prose/elements/callout/core';
13
- import {
14
- referenceSchema,
15
- refSchema,
16
- } from '@erudit-js/prose/elements/link/reference/core';
17
- import {
18
- dependencySchema,
19
- depSchema,
20
- } from '@erudit-js/prose/elements/link/dependency/core';
21
- import { problemSchema } from '@erudit-js/prose/elements/problem/problem';
22
- import { subProblemSchema } from '@erudit-js/prose/elements/problem/problems';
23
-
24
- import { createImageStorage } from '../storage/image';
25
- import { createVideoStorage } from '../storage/video';
26
- import { createCalloutStorage } from '../storage/callout';
27
- import { createLinkStorage } from '../storage/link';
28
- import { createProblemScriptStorage } from '../storage/problemScript';
29
-
30
- export async function finalizeProse(
31
- proseElement: ProseElement<AnySchema>,
32
- ): Promise<FinalizedProse> {
33
- const storage: GenericStorage = {};
34
-
35
- await fillStorage({
36
- storage,
37
- proseElement,
38
- storageCreators: PROSE_REGISTRY.getStorageCreators(),
39
- step: async (element) => {
40
- switch (true) {
41
- case isProseElement(element, imageSchema):
42
- await createImageStorage(element, storage);
43
- break;
44
- case isProseElement(element, videoSchema):
45
- await createVideoStorage(element, storage);
46
- break;
47
- case isProseElement(element, calloutSchema):
48
- await createCalloutStorage(element, storage);
49
- break;
50
- case isProseElement(element, refSchema):
51
- case isProseElement(element, referenceSchema):
52
- case isProseElement(element, depSchema):
53
- case isProseElement(element, dependencySchema):
54
- await createLinkStorage(element, storage);
55
- break;
56
- case isProseElement(element, problemSchema):
57
- case isProseElement(element, subProblemSchema):
58
- await createProblemScriptStorage(element, storage);
59
- break;
60
- }
61
- },
62
- });
63
-
64
- return {
65
- proseElement,
66
- storage,
67
- };
68
- }
1
+ import {
2
+ fillStorage,
3
+ isProseElement,
4
+ PROSE_REGISTRY,
5
+ type AnySchema,
6
+ type FinalizedProse,
7
+ type GenericStorage,
8
+ type ProseElement,
9
+ } from '@jsprose/core';
10
+ import { imageSchema } from '@erudit-js/prose/elements/image/core';
11
+ import { videoSchema } from '@erudit-js/prose/elements/video/core';
12
+ import { calloutSchema } from '@erudit-js/prose/elements/callout/core';
13
+ import {
14
+ referenceSchema,
15
+ refSchema,
16
+ } from '@erudit-js/prose/elements/link/reference/core';
17
+ import {
18
+ dependencySchema,
19
+ depSchema,
20
+ } from '@erudit-js/prose/elements/link/dependency/core';
21
+ import { problemSchema } from '@erudit-js/prose/elements/problem/problem';
22
+ import { subProblemSchema } from '@erudit-js/prose/elements/problem/problems';
23
+
24
+ import { createImageStorage } from '../storage/image';
25
+ import { createVideoStorage } from '../storage/video';
26
+ import { createCalloutStorage } from '../storage/callout';
27
+ import { createLinkStorage } from '../storage/link';
28
+ import { createProblemScriptStorage } from '../storage/problemScript';
29
+
30
+ export async function finalizeProse(
31
+ proseElement: ProseElement<AnySchema>,
32
+ ): Promise<FinalizedProse> {
33
+ const storage: GenericStorage = {};
34
+
35
+ await fillStorage({
36
+ storage,
37
+ proseElement,
38
+ storageCreators: PROSE_REGISTRY.getStorageCreators(),
39
+ step: async (element) => {
40
+ switch (true) {
41
+ case isProseElement(element, imageSchema):
42
+ await createImageStorage(element, storage);
43
+ break;
44
+ case isProseElement(element, videoSchema):
45
+ await createVideoStorage(element, storage);
46
+ break;
47
+ case isProseElement(element, calloutSchema):
48
+ await createCalloutStorage(element, storage);
49
+ break;
50
+ case isProseElement(element, refSchema):
51
+ case isProseElement(element, referenceSchema):
52
+ case isProseElement(element, depSchema):
53
+ case isProseElement(element, dependencySchema):
54
+ await createLinkStorage(element, storage);
55
+ break;
56
+ case isProseElement(element, problemSchema):
57
+ case isProseElement(element, subProblemSchema):
58
+ await createProblemScriptStorage(element, storage);
59
+ break;
60
+ }
61
+ },
62
+ });
63
+
64
+ return {
65
+ proseElement,
66
+ storage,
67
+ };
68
+ }