erudit 4.0.0-dev.3 → 4.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 (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 -0
  8. package/app/components/Prose.vue +55 -51
  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 -55
  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 +111 -100
  40. package/app/components/aside/major/search/SearchInput.vue +52 -53
  41. package/app/components/aside/major/search/SearchResult.vue +125 -74
  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 +38 -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 -120
  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 -20
  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 -159
  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 -121
  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 -2
  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 -99
  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 -91
  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 +1 -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 +206 -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 -73
  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 -47
  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 -114
  335. package/shared/utils/slasher.ts +0 -64
  336. package/test/shared/utils/slasher.test.ts +0 -75
@@ -1,163 +1,146 @@
1
- import { eq } from 'drizzle-orm';
2
- import { contentTypes } from '@erudit-js/core/content/type';
3
- import { headingSchema } from '@erudit-js/prose/elements/heading/core';
4
- import type { TopicPart } from '@erudit-js/core/content/topic';
5
-
6
- export async function searchIndexContentTypes(): Promise<SearchEntriesList[]> {
7
- const entryLists: SearchEntriesList[] = [];
8
-
9
- for (const contentType of contentTypes) {
10
- const dbContentItems = await ERUDIT.db.query.content.findMany({
11
- columns: {
12
- fullId: true,
13
- title: true,
14
- description: true,
15
- type: true,
16
- },
17
- where: (fields) => eq(fields.type, contentType),
18
- });
19
-
20
- entryLists.push({
21
- category: {
22
- id: contentType,
23
- priority: 200,
24
- },
25
- entries: await Promise.all(
26
- dbContentItems.map(async (dbContentItem) => {
27
- const bookTitle: string | undefined = await (async () => {
28
- if (dbContentItem.type === 'book') {
29
- return undefined;
30
- }
31
-
32
- const itemBook = ERUDIT.contentNav.getBookFor(
33
- dbContentItem.fullId,
34
- );
35
-
36
- if (itemBook) {
37
- const bookId = itemBook.fullId;
38
- const dbBook =
39
- await ERUDIT.db.query.content.findFirst({
40
- columns: { title: true },
41
- where: eq(
42
- ERUDIT.db.schema.content.fullId,
43
- bookId,
44
- ),
45
- });
46
- return dbBook?.title;
47
- }
48
- })();
49
-
50
- return {
51
- category: contentType,
52
- title: dbContentItem.title,
53
- description: dbContentItem.description || undefined,
54
- link: await ERUDIT.repository.content.link(
55
- dbContentItem.fullId,
56
- ),
57
- location: bookTitle,
58
- } satisfies SearchEntry;
59
- }),
60
- ),
61
- });
62
- }
63
-
64
- return entryLists;
65
- }
66
-
67
- export async function searchIndexSnippets(): Promise<SearchEntriesList[]> {
68
- const entryLists: Map<string, SearchEntriesList> = new Map();
69
-
70
- const dbSnippets = await ERUDIT.db.query.contentSnippets.findMany({
71
- where: eq(ERUDIT.db.schema.contentSnippets.search, true),
72
- });
73
-
74
- for (const dbSnippet of dbSnippets) {
75
- if (!entryLists.has(dbSnippet.schemaName)) {
76
- entryLists.set(dbSnippet.schemaName, {
77
- category: {
78
- id: 'element:' + dbSnippet.schemaName,
79
- priority:
80
- dbSnippet.schemaName === headingSchema.name ? 325 : 350,
81
- },
82
- entries: [],
83
- });
84
- }
85
-
86
- const navNode = ERUDIT.contentNav.getNodeOrThrow(
87
- dbSnippet.contentFullId,
88
- );
89
- let link: string;
90
-
91
- const locationTitle = await (async () => {
92
- const dbContentItem = await ERUDIT.db.query.content.findFirst({
93
- columns: { title: true },
94
- where: eq(
95
- ERUDIT.db.schema.content.fullId,
96
- dbSnippet.contentFullId,
97
- ),
98
- });
99
-
100
- return dbContentItem?.title;
101
- })();
102
-
103
- switch (navNode.type) {
104
- case 'page':
105
- link = PAGES[navNode.type](
106
- navNode.shortId,
107
- dbSnippet.elementId,
108
- );
109
- break;
110
- case 'topic':
111
- link = PAGES['topic'](
112
- dbSnippet.contentProseType as TopicPart,
113
- navNode.shortId,
114
- dbSnippet.elementId,
115
- );
116
- break;
117
- default:
118
- throw createError({
119
- statusCode: 500,
120
- statusMessage: `Cannot create search snippet link for content type "${navNode.type}"!`,
121
- });
122
- }
123
-
124
- let searchTitle = dbSnippet.snippetData.title!;
125
- let searchDescription = dbSnippet.snippetData.description;
126
- if (
127
- typeof dbSnippet.snippetData.search === 'object' &&
128
- !Array.isArray(dbSnippet.snippetData.search)
129
- ) {
130
- if (dbSnippet.snippetData.search.title) {
131
- searchTitle = dbSnippet.snippetData.search.title;
132
- }
133
-
134
- if (dbSnippet.snippetData.search.description) {
135
- searchDescription = dbSnippet.snippetData.search.description;
136
- }
137
- }
138
-
139
- let searchSynonyms: string[] | undefined = undefined;
140
- if (Array.isArray(dbSnippet.snippetData.search)) {
141
- searchSynonyms = dbSnippet.snippetData.search;
142
- } else {
143
- if (typeof dbSnippet.snippetData.search === 'object') {
144
- searchSynonyms = dbSnippet.snippetData.search.synonyms;
145
- }
146
- }
147
-
148
- entryLists.get(dbSnippet.schemaName)!.entries.push({
149
- category: 'element:' + dbSnippet.schemaName,
150
- title: searchTitle,
151
- description: searchDescription,
152
- link,
153
- location: locationTitle,
154
- synonyms: searchSynonyms
155
- ? searchSynonyms.length > 0
156
- ? searchSynonyms
157
- : undefined
158
- : undefined,
159
- });
160
- }
161
-
162
- return Array.from(entryLists.values());
163
- }
1
+ import { eq } from 'drizzle-orm';
2
+ import { contentTypes } from '@erudit-js/core/content/type';
3
+ import { headingSchema } from '@erudit-js/prose/elements/heading/core';
4
+ import type { TopicPart } from '@erudit-js/core/content/topic';
5
+
6
+ export async function searchIndexContentTypes(): Promise<SearchEntriesList[]> {
7
+ const entryLists: SearchEntriesList[] = [];
8
+
9
+ for (const contentType of contentTypes) {
10
+ const dbContentItems = await ERUDIT.db.query.content.findMany({
11
+ columns: {
12
+ fullId: true,
13
+ title: true,
14
+ description: true,
15
+ type: true,
16
+ },
17
+ where: (fields) => eq(fields.type, contentType),
18
+ });
19
+
20
+ entryLists.push({
21
+ category: {
22
+ id: contentType,
23
+ priority: 200,
24
+ },
25
+ entries: await Promise.all(
26
+ dbContentItems.map(async (dbContentItem) => {
27
+ const bookTitle: string | undefined = await (async () => {
28
+ if (dbContentItem.type === 'book') {
29
+ return undefined;
30
+ }
31
+
32
+ const itemBook = ERUDIT.contentNav.getBookFor(dbContentItem.fullId);
33
+
34
+ if (itemBook) {
35
+ const bookId = itemBook.fullId;
36
+ const dbBook = await ERUDIT.db.query.content.findFirst({
37
+ columns: { title: true },
38
+ where: eq(ERUDIT.db.schema.content.fullId, bookId),
39
+ });
40
+ return dbBook?.title;
41
+ }
42
+ })();
43
+
44
+ return {
45
+ category: contentType,
46
+ title: dbContentItem.title,
47
+ description: dbContentItem.description || undefined,
48
+ link: await ERUDIT.repository.content.link(dbContentItem.fullId),
49
+ location: bookTitle,
50
+ } satisfies SearchEntry;
51
+ }),
52
+ ),
53
+ });
54
+ }
55
+
56
+ return entryLists;
57
+ }
58
+
59
+ export async function searchIndexSnippets(): Promise<SearchEntriesList[]> {
60
+ const entryLists: Map<string, SearchEntriesList> = new Map();
61
+
62
+ const dbSnippets = await ERUDIT.db.query.contentSnippets.findMany({
63
+ where: eq(ERUDIT.db.schema.contentSnippets.search, true),
64
+ });
65
+
66
+ for (const dbSnippet of dbSnippets) {
67
+ if (!entryLists.has(dbSnippet.schemaName)) {
68
+ entryLists.set(dbSnippet.schemaName, {
69
+ category: {
70
+ id: 'element:' + dbSnippet.schemaName,
71
+ priority: dbSnippet.schemaName === headingSchema.name ? 325 : 350,
72
+ },
73
+ entries: [],
74
+ });
75
+ }
76
+
77
+ const navNode = ERUDIT.contentNav.getNodeOrThrow(dbSnippet.contentFullId);
78
+ let link: string;
79
+
80
+ const locationTitle = await (async () => {
81
+ const dbContentItem = await ERUDIT.db.query.content.findFirst({
82
+ columns: { title: true },
83
+ where: eq(ERUDIT.db.schema.content.fullId, dbSnippet.contentFullId),
84
+ });
85
+
86
+ return dbContentItem?.title;
87
+ })();
88
+
89
+ switch (navNode.type) {
90
+ case 'page':
91
+ link = PAGES[navNode.type](navNode.shortId, dbSnippet.elementId);
92
+ break;
93
+ case 'topic':
94
+ link = PAGES['topic'](
95
+ dbSnippet.contentProseType as TopicPart,
96
+ navNode.shortId,
97
+ dbSnippet.elementId,
98
+ );
99
+ break;
100
+ default:
101
+ throw createError({
102
+ statusCode: 500,
103
+ statusMessage: `Cannot create search snippet link for content type "${navNode.type}"!`,
104
+ });
105
+ }
106
+
107
+ let searchTitle = dbSnippet.snippetData.title!;
108
+ let searchDescription = dbSnippet.snippetData.description;
109
+ if (
110
+ typeof dbSnippet.snippetData.search === 'object' &&
111
+ !Array.isArray(dbSnippet.snippetData.search)
112
+ ) {
113
+ if (dbSnippet.snippetData.search.title) {
114
+ searchTitle = dbSnippet.snippetData.search.title;
115
+ }
116
+
117
+ if (dbSnippet.snippetData.search.description) {
118
+ searchDescription = dbSnippet.snippetData.search.description;
119
+ }
120
+ }
121
+
122
+ let searchSynonyms: string[] | undefined = undefined;
123
+ if (Array.isArray(dbSnippet.snippetData.search)) {
124
+ searchSynonyms = dbSnippet.snippetData.search;
125
+ } else {
126
+ if (typeof dbSnippet.snippetData.search === 'object') {
127
+ searchSynonyms = dbSnippet.snippetData.search.synonyms;
128
+ }
129
+ }
130
+
131
+ entryLists.get(dbSnippet.schemaName)!.entries.push({
132
+ category: 'element:' + dbSnippet.schemaName,
133
+ title: searchTitle,
134
+ description: searchDescription,
135
+ link,
136
+ location: locationTitle,
137
+ synonyms: searchSynonyms
138
+ ? searchSynonyms.length > 0
139
+ ? searchSynonyms
140
+ : undefined
141
+ : undefined,
142
+ });
143
+ }
144
+
145
+ return Array.from(entryLists.values());
146
+ }
@@ -1,166 +1,158 @@
1
- import { existsSync, readdirSync, writeFileSync } from 'node:fs';
2
- import { eq, like } from 'drizzle-orm';
3
- import { globSync } from 'glob';
4
- import { isRawElement, type AnySchema, type ProseElement } from '@jsprose/core';
5
- import {
6
- contributorIdToPropertyName,
7
- globalContributorsObject,
8
- globalContributorsTypes,
9
- type ContributorDefinition,
10
- } from '@erudit-js/core/contributor';
11
-
12
- $CONTRIBUTOR;
13
-
14
- let initialBuild = true;
15
-
16
- const contributorsRoot = () => `${ERUDIT.config.paths.project}/contributors`;
17
-
18
- const contributorsTypesPath = () =>
19
- `${ERUDIT.config.paths.build}/types/contributors.d.ts`;
20
-
21
- export async function buildContributors() {
22
- if (!ERUDIT.config.public.project.contributors?.enabled) return;
23
-
24
- ERUDIT.log.debug.start('Building contributors...');
25
-
26
- const isInitial = initialBuild;
27
- initialBuild = false;
28
-
29
- const contributorIds = collectContributorIds(isInitial);
30
-
31
- if (!contributorIds.size) {
32
- ERUDIT.log.info(
33
- isInitial
34
- ? 'Skipping contributors — no contributors found.'
35
- : 'Skipping contributors — nothing changed.',
36
- );
37
- return;
38
- }
39
-
40
- for (const id of contributorIds) {
41
- await cleanupContributor(id);
42
- }
43
-
44
- const existingIds = [...contributorIds].filter((id) =>
45
- existsSync(`${contributorsRoot()}/${id}`),
46
- );
47
-
48
- syncContributorGlobals(existingIds);
49
-
50
- if (!existingIds.length) {
51
- return;
52
- }
53
-
54
- for (const id of existingIds) {
55
- await buildContributor(id);
56
- }
57
-
58
- ERUDIT.log.success(
59
- isInitial
60
- ? `Contributors build complete! (${ERUDIT.log.stress(contributorIds.size)})`
61
- : `Contributors updated: ${ERUDIT.log.stress(existingIds.join(', '))}`,
62
- );
63
- }
64
-
65
- //
66
- //
67
- //
68
-
69
- function collectContributorIds(initial: boolean): Set<string> {
70
- if (initial) {
71
- return new Set(
72
- globSync(`${contributorsRoot()}/*/`, { posix: true }).map(
73
- (p) => p.split('/').at(-1)!,
74
- ),
75
- );
76
- }
77
-
78
- const ids = new Set<string>();
79
-
80
- for (const file of ERUDIT.changedFiles.values()) {
81
- if (!file.startsWith(`${contributorsRoot()}/`)) continue;
82
- const id = file.replace(`${contributorsRoot()}/`, '').split('/')[0];
83
- if (id) ids.add(id);
84
- }
85
-
86
- return ids;
87
- }
88
-
89
- async function cleanupContributor(contributorId: string) {
90
- await ERUDIT.db
91
- .delete(ERUDIT.db.schema.contributors)
92
- .where(eq(ERUDIT.db.schema.contributors.contributorId, contributorId));
93
-
94
- await ERUDIT.db
95
- .delete(ERUDIT.db.schema.files)
96
- .where(
97
- like(ERUDIT.db.schema.files.role, `contributor:${contributorId}%`),
98
- );
99
-
100
- delete $CONTRIBUTOR[contributorIdToPropertyName(contributorId)];
101
- }
102
-
103
- function syncContributorGlobals(contributorIds: string[]) {
104
- Object.assign($CONTRIBUTOR, globalContributorsObject(contributorIds));
105
-
106
- writeFileSync(
107
- contributorsTypesPath(),
108
- globalContributorsTypes($CONTRIBUTOR),
109
- );
110
- }
111
-
112
- async function buildContributor(contributorId: string) {
113
- ERUDIT.log.debug.start(
114
- `Building contributor ${ERUDIT.log.stress(contributorId)}...`,
115
- );
116
-
117
- const dir = `${contributorsRoot()}/${contributorId}`;
118
- const files = readdirSync(dir);
119
-
120
- const avatar = files.find((f) => f.startsWith('avatar.'));
121
- if (avatar) {
122
- await ERUDIT.repository.db.pushFile(
123
- `${dir}/${avatar}`,
124
- `contributor:${contributorId}`,
125
- );
126
- }
127
-
128
- let def: ContributorDefinition | undefined;
129
-
130
- try {
131
- def = await ERUDIT.import(`${dir}/contributor`);
132
- } catch (err) {
133
- if (!String(err).includes('Cannot find module')) {
134
- ERUDIT.log.error(`Failed to load contributor ${contributorId}:`);
135
- console.error(err);
136
- }
137
- }
138
-
139
- let description: ProseElement<AnySchema> | undefined;
140
-
141
- if (isRawElement(def?.description)) {
142
- const resolved = await ERUDIT.repository.prose.resolve(
143
- def.description,
144
- false,
145
- );
146
-
147
- for (const file of resolved.files) {
148
- await ERUDIT.repository.db.pushFile(
149
- file,
150
- `contributor:${contributorId}`,
151
- );
152
- }
153
-
154
- description = resolved.proseElement;
155
- }
156
-
157
- await ERUDIT.db.insert(ERUDIT.db.schema.contributors).values({
158
- contributorId,
159
- avatarExtension: avatar?.split('.').pop(),
160
- displayName: def?.displayName,
161
- short: def?.short,
162
- links: def?.links,
163
- editor: def?.editor,
164
- description,
165
- });
166
- }
1
+ import { existsSync, readdirSync, writeFileSync } from 'node:fs';
2
+ import { eq, like } from 'drizzle-orm';
3
+ import { globSync } from 'glob';
4
+ import { isRawElement, type AnySchema, type ProseElement } from '@jsprose/core';
5
+ import {
6
+ contributorIdToPropertyName,
7
+ globalContributorsObject,
8
+ globalContributorsTypes,
9
+ type ContributorDefinition,
10
+ } from '@erudit-js/core/contributor';
11
+
12
+ $CONTRIBUTOR;
13
+
14
+ let initialBuild = true;
15
+
16
+ const contributorsRoot = () => ERUDIT.paths.project(`contributors`);
17
+
18
+ const contributorsTypesPath = () =>
19
+ ERUDIT.paths.project(`.erudit/types/contributors.d.ts`);
20
+
21
+ export async function buildContributors() {
22
+ if (!ERUDIT.config.public.contributors?.enabled) return;
23
+
24
+ ERUDIT.log.debug.start('Building contributors...');
25
+
26
+ const isInitial = initialBuild;
27
+ initialBuild = false;
28
+
29
+ const contributorIds = collectContributorIds(isInitial);
30
+
31
+ if (!contributorIds.size) {
32
+ ERUDIT.log.info(
33
+ isInitial
34
+ ? 'Skipping contributors — no contributors found.'
35
+ : 'Skipping contributors — nothing changed.',
36
+ );
37
+ return;
38
+ }
39
+
40
+ for (const id of contributorIds) {
41
+ await cleanupContributor(id);
42
+ }
43
+
44
+ const existingIds = [...contributorIds].filter((id) =>
45
+ existsSync(`${contributorsRoot()}/${id}`),
46
+ );
47
+
48
+ syncContributorGlobals(existingIds);
49
+
50
+ if (!existingIds.length) {
51
+ return;
52
+ }
53
+
54
+ for (const id of existingIds) {
55
+ await buildContributor(id);
56
+ }
57
+
58
+ ERUDIT.log.success(
59
+ isInitial
60
+ ? `Contributors build complete! (${ERUDIT.log.stress(contributorIds.size)})`
61
+ : `Contributors updated: ${ERUDIT.log.stress(existingIds.join(', '))}`,
62
+ );
63
+ }
64
+
65
+ //
66
+ //
67
+ //
68
+
69
+ function collectContributorIds(initial: boolean): Set<string> {
70
+ if (initial) {
71
+ return new Set(
72
+ globSync(`${contributorsRoot()}/*/`, { posix: true }).map(
73
+ (p) => p.split('/').at(-1)!,
74
+ ),
75
+ );
76
+ }
77
+
78
+ const ids = new Set<string>();
79
+
80
+ for (const file of ERUDIT.changedFiles.values()) {
81
+ if (!file.startsWith(`${contributorsRoot()}/`)) continue;
82
+ const id = file.replace(`${contributorsRoot()}/`, '').split('/')[0];
83
+ if (id) ids.add(id);
84
+ }
85
+
86
+ return ids;
87
+ }
88
+
89
+ async function cleanupContributor(contributorId: string) {
90
+ await ERUDIT.db
91
+ .delete(ERUDIT.db.schema.contributors)
92
+ .where(eq(ERUDIT.db.schema.contributors.contributorId, contributorId));
93
+
94
+ await ERUDIT.db
95
+ .delete(ERUDIT.db.schema.files)
96
+ .where(like(ERUDIT.db.schema.files.role, `contributor:${contributorId}%`));
97
+
98
+ delete $CONTRIBUTOR[contributorIdToPropertyName(contributorId)];
99
+ }
100
+
101
+ function syncContributorGlobals(contributorIds: string[]) {
102
+ Object.assign($CONTRIBUTOR, globalContributorsObject(contributorIds));
103
+
104
+ writeFileSync(contributorsTypesPath(), globalContributorsTypes($CONTRIBUTOR));
105
+ }
106
+
107
+ async function buildContributor(contributorId: string) {
108
+ ERUDIT.log.debug.start(
109
+ `Building contributor ${ERUDIT.log.stress(contributorId)}...`,
110
+ );
111
+
112
+ const dir = `${contributorsRoot()}/${contributorId}`;
113
+ const files = readdirSync(dir);
114
+
115
+ const avatar = files.find((f) => f.startsWith('avatar.'));
116
+ if (avatar) {
117
+ await ERUDIT.repository.db.pushFile(
118
+ `${dir}/${avatar}`,
119
+ `contributor:${contributorId}`,
120
+ );
121
+ }
122
+
123
+ let def: ContributorDefinition | undefined;
124
+
125
+ try {
126
+ def = await ERUDIT.import(`${dir}/contributor`);
127
+ } catch (err) {
128
+ if (!String(err).includes('Cannot find module')) {
129
+ ERUDIT.log.error(`Failed to load contributor ${contributorId}:`);
130
+ console.error(err);
131
+ }
132
+ }
133
+
134
+ let description: ProseElement<AnySchema> | undefined;
135
+
136
+ if (isRawElement(def?.description)) {
137
+ const resolved = await ERUDIT.repository.prose.resolve(
138
+ def.description,
139
+ false,
140
+ );
141
+
142
+ for (const file of resolved.files) {
143
+ await ERUDIT.repository.db.pushFile(file, `contributor:${contributorId}`);
144
+ }
145
+
146
+ description = resolved.proseElement;
147
+ }
148
+
149
+ await ERUDIT.db.insert(ERUDIT.db.schema.contributors).values({
150
+ contributorId,
151
+ avatarExtension: avatar?.split('.').pop(),
152
+ displayName: def?.displayName,
153
+ short: def?.short,
154
+ links: def?.links,
155
+ editor: def?.editor,
156
+ description,
157
+ });
158
+ }
@@ -1,3 +1,3 @@
1
- export const $CONTRIBUTOR: Record<string, string> = {};
2
-
3
- (globalThis as any).$CONTRIBUTOR = $CONTRIBUTOR;
1
+ export const $CONTRIBUTOR: Record<string, string> = {};
2
+
3
+ (globalThis as any).$CONTRIBUTOR = $CONTRIBUTOR;