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,167 +1,163 @@
1
- import chalk from 'chalk';
2
- import type { Nuxt } from 'nuxt/schema';
3
- import { findPath } from 'nuxt/kit';
4
- import type { EruditProseCoreElement } from '@erudit-js/prose';
5
-
6
- import type { EruditRuntimeConfig } from '../../../../shared/types/runtimeConfig';
7
- import { moduleLogger } from '../../logger';
8
- import type { ElementData } from './shared';
9
- import { createTagsTable } from './tagsTable';
10
- import { createGlobalTypes } from './globalTypes';
11
- import { createGlobalTemplate } from './globalTemplate';
12
- import { createAppTemplate } from './appTemplate';
13
-
14
- const BUILTIN_ELEMENT_PATHS = [
15
- '@erudit-js/prose/elements/callout',
16
- '@erudit-js/prose/elements/caption',
17
- '@erudit-js/prose/elements/details',
18
- '@erudit-js/prose/elements/emphasis',
19
- '@erudit-js/prose/elements/flex',
20
- '@erudit-js/prose/elements/gallery',
21
- '@erudit-js/prose/elements/heading',
22
- '@erudit-js/prose/elements/horizontalLine',
23
- '@erudit-js/prose/elements/image',
24
- '@erudit-js/prose/elements/lineBreak',
25
- '@erudit-js/prose/elements/link/dependency',
26
- '@erudit-js/prose/elements/link/reference',
27
- '@erudit-js/prose/elements/list',
28
- '@erudit-js/prose/elements/paragraph',
29
- '@erudit-js/prose/elements/problem',
30
- '@erudit-js/prose/elements/table',
31
- '@erudit-js/prose/elements/video',
32
- ];
33
-
34
- export async function setupProseElements(
35
- nuxt: Nuxt,
36
- runtimeConfig: EruditRuntimeConfig,
37
- ) {
38
- const elementsData: ElementData[] = [];
39
-
40
- const seenElements = new Set<string>();
41
- const seenSchemas = new Set<string>();
42
- const seenTags = new Set<string>();
43
-
44
- const elementPaths: string[] = [
45
- ...BUILTIN_ELEMENT_PATHS,
46
- ...runtimeConfig.project.elements,
47
- ];
48
-
49
- for (const elementPath of elementPaths) {
50
- const pathParts = elementPath.split('/');
51
- let elementName = pathParts[pathParts.length - 1]!;
52
- let uniqueElementName = elementName;
53
- let counter = 1;
54
- while (seenElements.has(uniqueElementName)) {
55
- uniqueElementName = `${elementName}_${counter}`;
56
- counter++;
57
- }
58
- seenElements.add(uniqueElementName);
59
-
60
- const elementData: ElementData = {
61
- name: uniqueElementName,
62
- registryItems: [],
63
- absDirectory: '',
64
- absCorePath: '',
65
- absAppPath: undefined,
66
- };
67
-
68
- const corePath = elementPath + '/core';
69
- const coreAbsPath = await findPath(corePath, {
70
- cwd: runtimeConfig.paths.project,
71
- extensions: ['.ts', '.js'],
72
- });
73
-
74
- if (!coreAbsPath) {
75
- throw new Error(
76
- `Failed to detect "core" part of prose element "${elementPath}"!`,
77
- );
78
- }
79
-
80
- elementData.absCorePath = coreAbsPath;
81
- elementData.absDirectory = coreAbsPath.replace(
82
- /\/core\.(?:ts|js)$/,
83
- '',
84
- );
85
-
86
- const appPath = elementPath + '/app';
87
- const appAbsPath = await findPath(appPath, {
88
- cwd: runtimeConfig.paths.project,
89
- extensions: ['.ts', '.js'],
90
- });
91
-
92
- if (appAbsPath) {
93
- elementData.absAppPath = appAbsPath;
94
- }
95
-
96
- const coreDefault: EruditProseCoreElement | EruditProseCoreElement[] = (
97
- await import(coreAbsPath)
98
- ).default;
99
-
100
- const coreElements = Array.isArray(coreDefault)
101
- ? coreDefault
102
- : [coreDefault];
103
-
104
- for (const coreElement of coreElements) {
105
- const schemaName = coreElement.registryItem.schema.name;
106
-
107
- if (seenSchemas.has(schemaName)) {
108
- throw new Error(
109
- `Prose element schema name "${schemaName}" is already registered by another element!`,
110
- );
111
- }
112
-
113
- seenSchemas.add(schemaName);
114
- elementData.registryItems.push({
115
- schemaName,
116
- tagNames: [],
117
- });
118
-
119
- if (coreElement.registryItem.tags) {
120
- for (const tagName of Object.keys(
121
- coreElement.registryItem.tags,
122
- )) {
123
- if (seenTags.has(tagName)) {
124
- throw new Error(
125
- `Prose element tag name "<${tagName}>" is already registered by another element!`,
126
- );
127
- }
128
-
129
- seenTags.add(tagName);
130
- elementData.registryItems[
131
- elementData.registryItems.length - 1
132
- ]!.tagNames.push(tagName);
133
- }
134
- }
135
-
136
- const transpile = (nuxt.options.build.transpile ||= []);
137
- const optimizeDeps = nuxt.options.vite.optimizeDeps || {};
138
- const optimizeDepsInclude = (optimizeDeps.include ||= []);
139
-
140
- for (const [name, options] of Object.entries(
141
- coreElement.dependencies ?? {},
142
- )) {
143
- if (options?.transpile) transpile.push(name);
144
- if (options?.optimize) optimizeDepsInclude.push(name);
145
- }
146
- }
147
-
148
- elementsData.push(elementData);
149
- }
150
-
151
- createGlobalTypes(runtimeConfig, elementsData);
152
- createGlobalTemplate(nuxt, elementsData);
153
- createAppTemplate(nuxt, elementsData);
154
-
155
- const elementsNumber = elementsData.length;
156
- const schemasNumber = seenSchemas.size;
157
- const tagsNumber = seenTags.size;
158
-
159
- moduleLogger.success(
160
- `
161
- Registered ${elementsNumber} prose elements: ${schemasNumber} schema(s) and ${tagsNumber} tag(s)!
162
- `.trim(),
163
- );
164
-
165
- const tagsTable = createTagsTable(elementsData);
166
- console.log(chalk.gray(tagsTable));
167
- }
1
+ import chalk from 'chalk';
2
+ import type { Nuxt } from 'nuxt/schema';
3
+ import { findPath } from 'nuxt/kit';
4
+ import type { EruditProseCoreElement } from '@erudit-js/prose';
5
+
6
+ import type { EruditRuntimeConfig } from '../../../../shared/types/runtimeConfig';
7
+ import { moduleLogger } from '../../logger';
8
+ import type { ElementData } from './shared';
9
+ import { createTagsTable } from './tagsTable';
10
+ import { createGlobalTypes } from './globalTypes';
11
+ import { createGlobalTemplate } from './globalTemplate';
12
+ import { createAppTemplate } from './appTemplate';
13
+ import { PROJECT_PATH } from '../../env';
14
+
15
+ const BUILTIN_ELEMENT_PATHS = [
16
+ '@erudit-js/prose/elements/callout',
17
+ '@erudit-js/prose/elements/caption',
18
+ '@erudit-js/prose/elements/details',
19
+ '@erudit-js/prose/elements/emphasis',
20
+ '@erudit-js/prose/elements/flex',
21
+ '@erudit-js/prose/elements/gallery',
22
+ '@erudit-js/prose/elements/heading',
23
+ '@erudit-js/prose/elements/horizontalLine',
24
+ '@erudit-js/prose/elements/image',
25
+ '@erudit-js/prose/elements/lineBreak',
26
+ '@erudit-js/prose/elements/link/dependency',
27
+ '@erudit-js/prose/elements/link/reference',
28
+ '@erudit-js/prose/elements/list',
29
+ '@erudit-js/prose/elements/paragraph',
30
+ '@erudit-js/prose/elements/problem',
31
+ '@erudit-js/prose/elements/table',
32
+ '@erudit-js/prose/elements/video',
33
+ ];
34
+
35
+ export async function setupProseElements(
36
+ nuxt: Nuxt,
37
+ runtimeConfig: EruditRuntimeConfig,
38
+ ) {
39
+ const elementsData: ElementData[] = [];
40
+
41
+ const seenElements = new Set<string>();
42
+ const seenSchemas = new Set<string>();
43
+ const seenTags = new Set<string>();
44
+
45
+ const elementPaths: string[] = [
46
+ ...BUILTIN_ELEMENT_PATHS,
47
+ ...runtimeConfig.elements,
48
+ ];
49
+
50
+ for (const elementPath of elementPaths) {
51
+ const pathParts = elementPath.split('/');
52
+ let elementName = pathParts[pathParts.length - 1]!;
53
+ let uniqueElementName = elementName;
54
+ let counter = 1;
55
+ while (seenElements.has(uniqueElementName)) {
56
+ uniqueElementName = `${elementName}_${counter}`;
57
+ counter++;
58
+ }
59
+ seenElements.add(uniqueElementName);
60
+
61
+ const elementData: ElementData = {
62
+ name: uniqueElementName,
63
+ registryItems: [],
64
+ absDirectory: '',
65
+ absCorePath: '',
66
+ absAppPath: undefined,
67
+ };
68
+
69
+ const corePath = elementPath + '/core';
70
+ const coreAbsPath = await findPath(corePath, {
71
+ cwd: PROJECT_PATH,
72
+ extensions: ['.ts', '.js'],
73
+ });
74
+
75
+ if (!coreAbsPath) {
76
+ throw new Error(
77
+ `Failed to detect "core" part of prose element "${elementPath}"!`,
78
+ );
79
+ }
80
+
81
+ elementData.absCorePath = coreAbsPath;
82
+ elementData.absDirectory = coreAbsPath.replace(/\/core\.(?:ts|js)$/, '');
83
+
84
+ const appPath = elementPath + '/app';
85
+ const appAbsPath = await findPath(appPath, {
86
+ cwd: PROJECT_PATH,
87
+ extensions: ['.ts', '.js'],
88
+ });
89
+
90
+ if (appAbsPath) {
91
+ elementData.absAppPath = appAbsPath;
92
+ }
93
+
94
+ const coreDefault: EruditProseCoreElement | EruditProseCoreElement[] = (
95
+ await import(coreAbsPath)
96
+ ).default;
97
+
98
+ const coreElements = Array.isArray(coreDefault)
99
+ ? coreDefault
100
+ : [coreDefault];
101
+
102
+ for (const coreElement of coreElements) {
103
+ const schemaName = coreElement.registryItem.schema.name;
104
+
105
+ if (seenSchemas.has(schemaName)) {
106
+ throw new Error(
107
+ `Prose element schema name "${schemaName}" is already registered by another element!`,
108
+ );
109
+ }
110
+
111
+ seenSchemas.add(schemaName);
112
+ elementData.registryItems.push({
113
+ schemaName,
114
+ tagNames: [],
115
+ });
116
+
117
+ if (coreElement.registryItem.tags) {
118
+ for (const tagName of Object.keys(coreElement.registryItem.tags)) {
119
+ if (seenTags.has(tagName)) {
120
+ throw new Error(
121
+ `Prose element tag name "<${tagName}>" is already registered by another element!`,
122
+ );
123
+ }
124
+
125
+ seenTags.add(tagName);
126
+ elementData.registryItems[
127
+ elementData.registryItems.length - 1
128
+ ]!.tagNames.push(tagName);
129
+ }
130
+ }
131
+
132
+ const transpile = (nuxt.options.build.transpile ||= []);
133
+ const optimizeDeps = nuxt.options.vite.optimizeDeps || {};
134
+ const optimizeDepsInclude = (optimizeDeps.include ||= []);
135
+
136
+ for (const [name, options] of Object.entries(
137
+ coreElement.dependencies ?? {},
138
+ )) {
139
+ if (options?.transpile) transpile.push(name);
140
+ if (options?.optimize) optimizeDepsInclude.push(name);
141
+ }
142
+ }
143
+
144
+ elementsData.push(elementData);
145
+ }
146
+
147
+ createGlobalTypes(elementsData);
148
+ createGlobalTemplate(nuxt, elementsData);
149
+ createAppTemplate(nuxt, elementsData);
150
+
151
+ const elementsNumber = elementsData.length;
152
+ const schemasNumber = seenSchemas.size;
153
+ const tagsNumber = seenTags.size;
154
+
155
+ moduleLogger.success(
156
+ `
157
+ Registered ${elementsNumber} prose elements: ${schemasNumber} schema(s) and ${tagsNumber} tag(s)!
158
+ `.trim(),
159
+ );
160
+
161
+ const tagsTable = createTagsTable(elementsData);
162
+ console.log(chalk.gray(tagsTable));
163
+ }
@@ -1,10 +1,10 @@
1
- export interface ElementData {
2
- name: string;
3
- registryItems: {
4
- schemaName: string;
5
- tagNames: string[];
6
- }[];
7
- absDirectory: string;
8
- absCorePath: string;
9
- absAppPath: string | undefined;
10
- }
1
+ export interface ElementData {
2
+ name: string;
3
+ registryItems: {
4
+ schemaName: string;
5
+ tagNames: string[];
6
+ }[];
7
+ absDirectory: string;
8
+ absCorePath: string;
9
+ absAppPath: string | undefined;
10
+ }
@@ -1,28 +1,28 @@
1
- import type { ElementData } from './shared';
2
-
3
- export function createTagsTable(elementsData: ElementData[], columns = 4) {
4
- const tagNames = elementsData.flatMap((data) =>
5
- data.registryItems.flatMap((item) => item.tagNames),
6
- );
7
-
8
- if (tagNames.length === 0) return '';
9
-
10
- const cols = Math.max(1, columns);
11
- const formatted = tagNames.map((t) => `<${t}>`);
12
- const maxLen = Math.max(...formatted.map((s) => s.length));
13
- const colWidth = maxLen + 2; // padding between columns
14
-
15
- const rows = Math.ceil(formatted.length / cols);
16
- const lines: string[] = [];
17
-
18
- for (let r = 0; r < rows; r++) {
19
- const start = r * cols;
20
- const rowItems = formatted.slice(start, start + cols);
21
- const padded = rowItems.map((s) => s.padEnd(colWidth, ' '));
22
- lines.push(padded.join('').replace(/\s+$/u, '')); // trim trailing spaces on the row
23
- }
24
-
25
- const tagTable = lines.join('\n');
26
-
27
- return tagTable;
28
- }
1
+ import type { ElementData } from './shared';
2
+
3
+ export function createTagsTable(elementsData: ElementData[], columns = 4) {
4
+ const tagNames = elementsData.flatMap((data) =>
5
+ data.registryItems.flatMap((item) => item.tagNames),
6
+ );
7
+
8
+ if (tagNames.length === 0) return '';
9
+
10
+ const cols = Math.max(1, columns);
11
+ const formatted = tagNames.map((t) => `<${t}>`);
12
+ const maxLen = Math.max(...formatted.map((s) => s.length));
13
+ const colWidth = maxLen + 2; // padding between columns
14
+
15
+ const rows = Math.ceil(formatted.length / cols);
16
+ const lines: string[] = [];
17
+
18
+ for (let r = 0; r < rows; r++) {
19
+ const start = r * cols;
20
+ const rowItems = formatted.slice(start, start + cols);
21
+ const padded = rowItems.map((s) => s.padEnd(colWidth, ' '));
22
+ lines.push(padded.join('').replace(/\s+$/u, '')); // trim trailing spaces on the row
23
+ }
24
+
25
+ const tagTable = lines.join('\n');
26
+
27
+ return tagTable;
28
+ }
@@ -1,71 +1,61 @@
1
- import type { Nuxt } from '@nuxt/schema';
2
- import { debounce } from 'perfect-debounce';
3
- import { globSync } from 'glob';
4
- import chalk from 'chalk';
5
- import slash from 'slash';
6
-
7
- import { ERUDIT_PACKAGE_WATCHER, ERUDIT_PROJECT_WATCHER } from '../watcher';
8
- import { moduleLogger } from '../logger';
9
- import type { EruditRuntimeConfig } from '../../../shared/types/runtimeConfig';
10
-
11
- export async function setupEruditFullRestart(
12
- nuxt: Nuxt,
13
- runtimeConfig: EruditRuntimeConfig,
14
- ) {
15
- const paths = runtimeConfig.paths;
16
- const changedPaths = new Set<string>();
17
-
18
- const tryRestartNuxt = debounce(async () => {
19
- const files = Array.from(changedPaths);
20
- changedPaths.clear();
21
-
22
- moduleLogger.warn(
23
- `${chalk.yellow('Full restart due to critical file change(s):')}\n\n` +
24
- files
25
- .map((p, i) => chalk.gray(`${i + 1} -`) + ` "${p}"`)
26
- .join('\n'),
27
- );
28
-
29
- await nuxt.callHook('close', nuxt);
30
- process.exit(1337);
31
- }, 300);
32
-
33
- const isTargetFile = (path: string): boolean => {
34
- // Check if it's in the module directory
35
- if (path.startsWith(paths.module)) {
36
- return true;
37
- }
38
-
39
- // Check if it's in package/shared
40
- if (path.startsWith(paths.package + '/shared')) {
41
- return true;
42
- }
43
-
44
- // Check if it's nuxt.config.ts in package
45
- if (path === paths.package + '/nuxt.config.ts') {
46
- return true;
47
- }
48
-
49
- // Check if it's erudit.config.{js,ts} in project
50
- const configFiles = globSync(
51
- paths.project + '/erudit.config.{js,ts}',
52
- ).map((p) => slash(p));
53
- if (configFiles.includes(path)) {
54
- return true;
55
- }
56
-
57
- return false;
58
- };
59
-
60
- const handleFileChange = (_event: string, path: string) => {
61
- path = slash(path);
62
-
63
- if (path.trim() && isTargetFile(path)) {
64
- changedPaths.add(String(path));
65
- tryRestartNuxt();
66
- }
67
- };
68
-
69
- ERUDIT_PACKAGE_WATCHER?.on('all', handleFileChange);
70
- ERUDIT_PROJECT_WATCHER?.on('all', handleFileChange);
71
- }
1
+ import type { Nuxt } from '@nuxt/schema';
2
+ import { debounce } from 'perfect-debounce';
3
+ import chalk from 'chalk';
4
+ import { sn } from 'unslash';
5
+
6
+ import { ERUDIT_PACKAGE_WATCHER, ERUDIT_PROJECT_WATCHER } from '../watcher';
7
+ import { moduleLogger } from '../logger';
8
+ import { ERUDIT_PATH, PROJECT_PATH } from '../env';
9
+
10
+ export async function setupEruditFullRestart(nuxt: Nuxt) {
11
+ const changedPaths = new Set<string>();
12
+
13
+ const tryRestartNuxt = debounce(async () => {
14
+ const files = Array.from(changedPaths);
15
+ changedPaths.clear();
16
+
17
+ moduleLogger.warn(
18
+ `${chalk.yellow('Full restart due to critical file change(s):')}\n\n` +
19
+ files.map((p, i) => chalk.gray(`${i + 1} -`) + ` "${p}"`).join('\n'),
20
+ );
21
+
22
+ await nuxt.callHook('close', nuxt);
23
+ process.exit(1337);
24
+ }, 300);
25
+
26
+ const isTargetFile = (path: string): boolean => {
27
+ // Check if it is in Erudit Nuxt Layer "modules" directory
28
+ if (path.startsWith(sn(ERUDIT_PATH, 'modules'))) {
29
+ return true;
30
+ }
31
+
32
+ // Check if it is in Erudit Nuxt Layer "shared" directory
33
+ if (path.startsWith(sn(ERUDIT_PATH, 'shared'))) {
34
+ return true;
35
+ }
36
+
37
+ // Check if it is Erudit Nuxt Layer "nuxt.config.ts" file
38
+ if (path === sn(ERUDIT_PATH, 'nuxt.config.ts')) {
39
+ return true;
40
+ }
41
+
42
+ // Check if it is project "erudit.config.ts" file
43
+ if (path === sn(PROJECT_PATH, 'erudit.config.ts')) {
44
+ return true;
45
+ }
46
+
47
+ return false;
48
+ };
49
+
50
+ const handleFileChange = (_event: string, path: string) => {
51
+ path = sn(path);
52
+
53
+ if (path.trim() && isTargetFile(path)) {
54
+ changedPaths.add(String(path));
55
+ tryRestartNuxt();
56
+ }
57
+ };
58
+
59
+ ERUDIT_PACKAGE_WATCHER?.on('all', handleFileChange);
60
+ ERUDIT_PROJECT_WATCHER?.on('all', handleFileChange);
61
+ }