erudit 3.0.0-dev.2 → 3.0.0-dev.21

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 (321) hide show
  1. package/app/app.vue +195 -172
  2. package/app/assets/icons/cameo-add.svg +3 -0
  3. package/app/assets/icons/diamond.svg +3 -0
  4. package/app/assets/icons/graduation.svg +3 -0
  5. package/app/components/Avatar.vue +118 -0
  6. package/app/components/EruditLink.vue +17 -0
  7. package/app/components/Loading.vue +23 -23
  8. package/app/components/SiteAside.vue +393 -382
  9. package/app/components/SiteMain.vue +32 -35
  10. package/app/components/ads/Ads.vue +33 -0
  11. package/app/components/ads/AdsBannerAside.vue +61 -0
  12. package/app/components/ads/AdsBannerBottom.vue +22 -0
  13. package/app/components/ads/AdsProviderCustom.vue +35 -0
  14. package/app/components/ads/AdsProviderYandex.vue +91 -0
  15. package/app/components/ads/AdsReplacer.vue +73 -0
  16. package/app/components/aside/AsideListItem.vue +91 -74
  17. package/app/components/aside/AsideMajor.vue +56 -56
  18. package/app/components/aside/AsideMinor.vue +97 -71
  19. package/app/components/aside/major/PaneContentScroll.vue +23 -23
  20. package/app/components/aside/major/PaneSwitch.vue +54 -54
  21. package/app/components/aside/major/PaneSwitchButton.vue +63 -63
  22. package/app/components/aside/major/SiteInfo.vue +85 -85
  23. package/app/components/aside/major/panes/Language.vue +79 -79
  24. package/app/components/aside/major/panes/Pages.vue +50 -34
  25. package/app/components/aside/major/panes/Search.vue +11 -11
  26. package/app/components/aside/major/panes/nav/Nav.vue +92 -91
  27. package/app/components/aside/major/panes/nav/NavBook.vue +95 -86
  28. package/app/components/aside/major/panes/nav/NavBookLoading.vue +24 -24
  29. package/app/components/aside/major/panes/nav/NavGlobal.vue +16 -16
  30. package/app/components/aside/major/panes/nav/fnav/FNav.vue +105 -105
  31. package/app/components/aside/major/panes/nav/fnav/FNavBook.vue +32 -32
  32. package/app/components/aside/major/panes/nav/fnav/FNavFlags.vue +40 -40
  33. package/app/components/aside/major/panes/nav/fnav/FNavFolder.vue +60 -60
  34. package/app/components/aside/major/panes/nav/fnav/FNavItem.vue +34 -34
  35. package/app/components/aside/major/panes/nav/fnav/FNavSeparator.vue +80 -80
  36. package/app/components/aside/major/panes/nav/fnav/FNavTopic.vue +24 -24
  37. package/app/components/aside/major/panes/other/ItemContent.vue +29 -29
  38. package/app/components/aside/major/panes/other/ItemGenerator.vue +13 -15
  39. package/app/components/aside/major/panes/other/ItemTheme.vue +54 -54
  40. package/app/components/aside/major/panes/other/Other.vue +16 -16
  41. package/app/components/aside/minor/{Contribute.vue → AsideMinorContribute.vue} +175 -145
  42. package/app/components/aside/minor/AsideMinorNews.vue +11 -11
  43. package/app/components/aside/minor/AsideMinorPane.vue +15 -15
  44. package/app/components/aside/minor/AsideMinorTopLink.vue +66 -67
  45. package/app/components/aside/minor/content/AsideMinorContent.vue +89 -92
  46. package/app/components/aside/minor/contributor/AsideMinorContributor.vue +78 -0
  47. package/app/components/aside/minor/contributor/BookContribution.vue +64 -0
  48. package/app/components/aside/minor/topic/AsideMinorTopic.vue +31 -32
  49. package/app/components/aside/minor/topic/TopicContributors.vue +183 -177
  50. package/app/components/aside/minor/topic/TopicNav.vue +49 -49
  51. package/app/components/aside/minor/topic/TopicToc.vue +212 -203
  52. package/app/components/aside/minor/topic/TopicTocItem.vue +19 -31
  53. package/app/components/aside/utils/AsideOverlayPane.vue +40 -40
  54. package/app/components/bitran/BitranContent.vue +90 -63
  55. package/app/components/bitran/RenderWrapper.vue +10 -10
  56. package/app/components/contributor/ContributorListItem.vue +43 -35
  57. package/app/components/main/MainActionButton.vue +51 -0
  58. package/app/components/main/MainBitranContent.vue +55 -0
  59. package/app/components/main/{utils/Breadcrumb.vue → MainBreadcrumb.vue} +63 -75
  60. package/app/components/main/MainDescription.vue +24 -0
  61. package/app/components/main/MainSection.vue +58 -0
  62. package/app/components/main/MainTitle.vue +76 -0
  63. package/app/components/main/cameo/MainCameo.vue +135 -0
  64. package/app/components/main/cameo/MainCameoData.vue +232 -0
  65. package/app/components/main/content/ContentBreadcrumb.vue +28 -0
  66. package/app/components/main/{utils → content}/ContentDecoration.vue +29 -29
  67. package/app/components/main/{utils → content}/ContentPopover.vue +188 -176
  68. package/app/components/main/{utils → content}/ContentPopovers.vue +111 -105
  69. package/app/components/main/{utils → content}/ContentReferences.vue +70 -70
  70. package/app/components/main/{utils → content}/reference/ReferenceGroup.vue +38 -38
  71. package/app/components/main/{utils → content}/reference/ReferenceItem.vue +70 -68
  72. package/app/components/main/{utils → content}/reference/ReferenceSource.vue +120 -116
  73. package/app/components/main/topic/MainTopic.vue +76 -79
  74. package/app/components/main/topic/TopicPartSwitch.vue +119 -118
  75. package/app/components/preview/Preview.vue +186 -177
  76. package/app/components/preview/PreviewDisplay.vue +139 -139
  77. package/app/components/preview/PreviewFooterAction.vue +73 -73
  78. package/app/components/preview/PreviewLoading.vue +14 -14
  79. package/app/components/preview/PreviewScreen.vue +141 -99
  80. package/app/components/preview/display/Alert.vue +50 -50
  81. package/app/components/preview/display/Custom.vue +18 -18
  82. package/app/components/preview/display/GenericLink.vue +48 -48
  83. package/app/components/preview/display/PageLink.vue +22 -20
  84. package/app/components/preview/display/Unique.vue +46 -49
  85. package/app/components/sponsor/SponsorTier1.vue +89 -0
  86. package/app/components/sponsor/SponsorTier2.vue +109 -0
  87. package/app/components/transition/Fade.vue +19 -19
  88. package/app/components/tree/TreeContainer.vue +11 -11
  89. package/app/components/tree/TreeItem.vue +93 -89
  90. package/app/composables/adsAllowed.ts +11 -0
  91. package/app/composables/asset.ts +12 -0
  92. package/app/composables/bitran.ts +108 -127
  93. package/app/composables/bitranLocation.ts +7 -7
  94. package/app/composables/contentData.ts +38 -36
  95. package/app/composables/contentPage.ts +168 -156
  96. package/app/composables/contentRoute.ts +45 -45
  97. package/app/composables/darkMagic.ts +24 -24
  98. package/app/composables/externalApi.ts +69 -63
  99. package/app/composables/favicon.ts +8 -8
  100. package/app/composables/formatText.ts +99 -86
  101. package/app/composables/head.ts +24 -0
  102. package/app/composables/majorPane.ts +62 -60
  103. package/app/composables/phrases.ts +77 -80
  104. package/app/composables/theme.ts +29 -29
  105. package/app/composables/url.ts +43 -33
  106. package/app/pages/_test/preview.vue +110 -110
  107. package/app/pages/article/[...articleId].vue +3 -3
  108. package/app/pages/book/[...bookId].vue +42 -47
  109. package/app/pages/contributor/[contributorId].vue +227 -0
  110. package/app/pages/contributors.vue +184 -0
  111. package/app/pages/group/[...groupId].vue +53 -65
  112. package/app/pages/index.vue +32 -32
  113. package/app/pages/practice/[...practice].vue +3 -3
  114. package/app/pages/sponsors.vue +95 -0
  115. package/app/pages/summary/[...summaryId].vue +3 -3
  116. package/app/plugins/analytics.ts +95 -0
  117. package/app/plugins/prerender.server.ts +34 -0
  118. package/app/public/favicon/article.svg +5 -5
  119. package/app/public/favicon/default.svg +3 -3
  120. package/app/public/favicon/practice.svg +3 -3
  121. package/app/public/favicon/summary.svg +4 -4
  122. package/app/public/logotype.svg +2 -2
  123. package/app/scripts/_immediate.js +9 -9
  124. package/app/scripts/aside/index.ts +59 -59
  125. package/app/scripts/aside/major/nav.ts +26 -26
  126. package/app/scripts/aside/minor/state.ts +37 -37
  127. package/app/scripts/flag.ts +28 -28
  128. package/app/scripts/og.ts +28 -27
  129. package/app/scripts/preview/build.ts +76 -73
  130. package/app/scripts/preview/data/alert.ts +19 -19
  131. package/app/scripts/preview/data/custom.ts +8 -8
  132. package/app/scripts/preview/data/genericLink.ts +24 -24
  133. package/app/scripts/preview/data/pageLink.ts +23 -20
  134. package/app/scripts/preview/data/unique.ts +69 -70
  135. package/app/scripts/preview/data.ts +24 -24
  136. package/app/scripts/preview/display.ts +37 -37
  137. package/app/scripts/preview/footer.ts +9 -9
  138. package/app/scripts/preview/request.ts +51 -51
  139. package/app/scripts/preview/state.ts +63 -63
  140. package/app/styles/_immediate.css +7 -7
  141. package/app/styles/_util.scss +43 -43
  142. package/app/styles/_utils.scss +44 -44
  143. package/app/styles/app.scss +91 -91
  144. package/app/styles/def/_bp.scss +27 -27
  145. package/app/styles/def/_size.scss +7 -7
  146. package/app/styles/def/_z.scss +5 -5
  147. package/app/styles/normalize.scss +49 -63
  148. package/app/styles/partials/_darkMagic.scss +5 -5
  149. package/app/styles/partials/_fnav.scss +15 -15
  150. package/app/styles/partials/_preview.scss +5 -5
  151. package/bin/erudit.mjs +2 -0
  152. package/const.ts +3 -0
  153. package/globalPath.ts +21 -21
  154. package/globals/bitran.ts +1 -47
  155. package/globals/cameo.ts +5 -0
  156. package/globals/content.ts +27 -22
  157. package/globals/contributor.ts +5 -5
  158. package/globals/erudit.ts +5 -5
  159. package/globals/register.ts +23 -18
  160. package/globals/sponsor.ts +17 -0
  161. package/languages/en.ts +108 -95
  162. package/languages/ru.ts +112 -99
  163. package/module/bitran.ts +66 -34
  164. package/module/config.ts +35 -34
  165. package/module/imports.ts +74 -46
  166. package/module/index.ts +47 -47
  167. package/module/logger.ts +10 -10
  168. package/module/paths.ts +22 -22
  169. package/module/restart.ts +61 -61
  170. package/nuxt.config.ts +126 -112
  171. package/package.json +22 -15
  172. package/server/api/aside/major/nav/bookIds.ts +5 -5
  173. package/server/api/aside/major/nav/bookNav/[...bookId].ts +17 -20
  174. package/server/api/aside/major/nav/global.ts +7 -7
  175. package/server/api/aside/minor/book/[...bookId].ts +18 -0
  176. package/server/api/aside/minor/contributor/[contributorId].ts +18 -0
  177. package/server/api/aside/minor/group/[...groupId].ts +18 -0
  178. package/server/api/aside/minor/news.ts +7 -7
  179. package/server/api/aside/minor/topic.ts +36 -0
  180. package/server/api/bitran/content/[...location].ts +13 -0
  181. package/server/api/bitran/toc/[...location].ts +9 -0
  182. package/server/api/cameo/data/[cameoId].ts +42 -0
  183. package/server/api/cameo/ids.ts +5 -0
  184. package/server/api/content/data.ts +75 -72
  185. package/server/api/contributor/count.ts +6 -6
  186. package/server/api/contributor/list.ts +44 -0
  187. package/server/api/contributor/page/[contributorId].ts +14 -0
  188. package/server/api/fake/content.ts +11 -11
  189. package/server/api/fake/shared/languages.ts +12 -12
  190. package/server/api/language/functions.ts +12 -12
  191. package/server/api/language/phrase/[phraseId].ts +19 -19
  192. package/server/api/language/phraseIds.ts +8 -8
  193. package/server/api/prerender/assets/cameo.ts +14 -0
  194. package/server/api/prerender/assets/contributor.ts +12 -0
  195. package/server/api/prerender/assets/sponsor.ts +13 -0
  196. package/server/api/prerender/cameos.ts +12 -0
  197. package/server/api/prerender/language.ts +9 -0
  198. package/server/api/preview/page/[...parts].ts +78 -51
  199. package/server/api/preview/unique/{[location].ts → [...location].ts} +48 -55
  200. package/server/api/problem/generator/[...path].ts +26 -0
  201. package/server/api/sponsor/cameo/data/[sponsorId].ts +51 -0
  202. package/server/api/sponsor/cameo/ids.ts +5 -0
  203. package/server/api/sponsor/count.ts +5 -0
  204. package/server/api/sponsor/list.ts +36 -0
  205. package/server/plugin/bitran/content.ts +252 -187
  206. package/server/plugin/bitran/{products → elements}/include.ts +229 -230
  207. package/server/plugin/bitran/location.ts +43 -25
  208. package/server/plugin/bitran/toc.ts +94 -83
  209. package/server/plugin/bitran/transpiler.ts +18 -46
  210. package/server/plugin/build/close.ts +12 -10
  211. package/server/plugin/build/jobs/content/builderArgs.ts +8 -8
  212. package/server/plugin/build/jobs/content/generic.ts +191 -176
  213. package/server/plugin/build/jobs/content/parse.ts +113 -100
  214. package/server/plugin/build/jobs/content/path.ts +6 -6
  215. package/server/plugin/build/jobs/content/type/book.ts +9 -9
  216. package/server/plugin/build/jobs/content/type/group.ts +37 -37
  217. package/server/plugin/build/jobs/content/type/topic.ts +36 -36
  218. package/server/plugin/build/jobs/contributors.ts +69 -66
  219. package/server/plugin/build/jobs/language.ts +36 -36
  220. package/server/plugin/build/jobs/nav.ts +345 -210
  221. package/server/plugin/build/process.ts +34 -25
  222. package/server/plugin/build/rebuild.ts +68 -55
  223. package/server/plugin/build/setup.ts +19 -21
  224. package/server/plugin/content/context.ts +119 -112
  225. package/server/plugin/db/entities/Book.ts +7 -7
  226. package/server/plugin/db/entities/Content.ts +45 -49
  227. package/server/plugin/db/entities/Contribution.ts +10 -10
  228. package/server/plugin/db/entities/Contributor.ts +25 -16
  229. package/server/plugin/db/entities/File.ts +10 -0
  230. package/server/plugin/db/entities/Group.ts +14 -14
  231. package/server/plugin/db/entities/Hash.ts +15 -15
  232. package/server/plugin/db/entities/Topic.ts +20 -20
  233. package/server/plugin/db/entities/Unique.ts +21 -21
  234. package/server/plugin/db/reset.ts +12 -0
  235. package/server/plugin/db/setup.ts +49 -34
  236. package/server/plugin/global.ts +18 -18
  237. package/server/plugin/importer.ts +16 -12
  238. package/server/plugin/index.ts +9 -9
  239. package/server/plugin/logger.ts +23 -23
  240. package/server/plugin/nav/node.ts +27 -26
  241. package/server/plugin/nav/utils.ts +179 -129
  242. package/server/plugin/repository/asideMinor.ts +51 -0
  243. package/server/plugin/repository/book.ts +39 -21
  244. package/server/plugin/repository/cameo.ts +16 -0
  245. package/server/plugin/repository/content.ts +240 -238
  246. package/server/plugin/repository/contentId.ts +40 -0
  247. package/server/plugin/repository/contributor.ts +129 -8
  248. package/server/plugin/repository/file.ts +10 -0
  249. package/server/plugin/repository/frontNav.ts +145 -148
  250. package/server/plugin/repository/topic.ts +35 -32
  251. package/server/plugin/sponsor/build.ts +82 -0
  252. package/server/plugin/sponsor/index.ts +5 -0
  253. package/server/plugin/sponsor/repository.ts +56 -0
  254. package/server/routes/asset/[...assetPath].ts +34 -0
  255. package/server/routes/robots.txt.ts +9 -0
  256. package/server/routes/sitemap.xml.ts +103 -0
  257. package/server/tsconfig.json +9 -9
  258. package/shared/aside/minor.ts +55 -50
  259. package/shared/asset.ts +17 -15
  260. package/shared/bitran/content.ts +9 -0
  261. package/shared/bitran/contentId.ts +56 -0
  262. package/shared/bitran/toc.ts +8 -8
  263. package/shared/breadcrumb.ts +7 -0
  264. package/shared/content/bookId.ts +12 -0
  265. package/shared/content/context.ts +9 -9
  266. package/shared/content/data/base.ts +32 -32
  267. package/shared/content/data/index.ts +5 -5
  268. package/shared/content/data/type/book.ts +5 -5
  269. package/shared/content/data/type/group.ts +6 -6
  270. package/shared/content/data/type/topic.ts +11 -11
  271. package/shared/content/previousNext.ts +9 -9
  272. package/shared/contributor.ts +34 -5
  273. package/shared/frontNav.ts +41 -41
  274. package/shared/icons.ts +38 -38
  275. package/shared/image.ts +5 -5
  276. package/shared/link.ts +28 -25
  277. package/shared/popover.ts +8 -0
  278. package/shared/types/language.ts +84 -75
  279. package/shared/utils/objectsEqual.ts +4 -4
  280. package/shared/utils/stringColor.ts +9 -9
  281. package/test/contentId.test.ts +91 -0
  282. package/test/utils/url.test.ts +99 -0
  283. package/tsconfig.json +8 -8
  284. package/utils/contentPath.ts +67 -0
  285. package/utils/ext.ts +41 -0
  286. package/utils/stress.ts +9 -9
  287. package/utils/url.ts +23 -0
  288. package/app/components/ads/BannerTemplate.vue +0 -51
  289. package/app/components/ads/BottomBanner.vue +0 -45
  290. package/app/components/ads/LeftBanner.vue +0 -50
  291. package/app/components/aside/minor/AsideMinorContributor.vue +0 -5
  292. package/app/components/contributor/ContributorAvatar.vue +0 -43
  293. package/app/components/main/utils/ContentDescription.vue +0 -19
  294. package/app/components/main/utils/ContentFlag.vue +0 -15
  295. package/app/components/main/utils/ContentSection.vue +0 -45
  296. package/app/components/main/utils/ContentTitle.vue +0 -39
  297. package/app/composables/bitranContent.ts +0 -37
  298. package/app/pages/members.vue +0 -6
  299. package/app/public/user.svg +0 -10
  300. package/app/scripts/aside/minor/topic.ts +0 -3
  301. package/app/styles/default.scss +0 -83
  302. package/server/api/aside/minor/path.ts +0 -78
  303. package/server/api/bitran/content/[location].ts +0 -7
  304. package/server/api/bitran/toc/[location].ts +0 -7
  305. package/server/plugin/bitran/products/link.ts +0 -116
  306. package/server/plugin/bitran/setup.ts +0 -9
  307. package/server/plugin/content/absoluteId.ts +0 -94
  308. package/shared/bitran/context.ts +0 -8
  309. package/shared/bitran/default.ts +0 -46
  310. package/shared/bitran/link/Link.vue +0 -167
  311. package/shared/bitran/link/factory.ts +0 -24
  312. package/shared/bitran/link/icon.svg +0 -3
  313. package/shared/bitran/link/languages/en.ts +0 -7
  314. package/shared/bitran/link/languages/ru.ts +0 -7
  315. package/shared/bitran/link/renderer.ts +0 -21
  316. package/shared/bitran/link/shared.ts +0 -17
  317. package/shared/bitran/link/target.ts +0 -134
  318. package/shared/bitran/link/transpiler.ts +0 -10
  319. package/shared/bitran/location.ts +0 -166
  320. package/test/bitran/link/target.test.ts +0 -141
  321. package/test/bitran/location.test.ts +0 -143
@@ -1,55 +1,68 @@
1
- import chokidar, { type FSWatcher } from 'chokidar';
2
-
3
- import { ERUDIT_DIR, PROJECT_DIR } from '#erudit/globalPaths';
4
- import { ERUDIT_SERVER } from '@server/global';
5
- import { logger } from '@server/logger';
6
- import { build } from '@server/build/process';
7
- import { stress } from '@erudit/utils/stress';
8
-
9
- const watchTargets: string[] = [
10
- // Languages
11
- ERUDIT_DIR + '/languages',
12
- // Content directory
13
- PROJECT_DIR + '/content',
14
- // Contributors directory
15
- PROJECT_DIR + '/contributors',
16
- ];
17
-
18
- const ignoreTargets: string[] = [];
19
-
20
- const rebuildDelay = 300;
21
-
22
- //
23
- //
24
- //
25
-
26
- let watcher: FSWatcher;
27
- let rebuildTimeout: any;
28
- let rebuildRequested = false;
29
-
30
- export async function setupRebuildWatcher() {
31
- if (watcher) return;
32
-
33
- watcher = chokidar.watch(watchTargets, {
34
- ignored: ignoreTargets,
35
- ignoreInitial: true,
36
- });
37
-
38
- watcher.on('all', (event, path) =>
39
- requestServerRebuild(`File change: ${stress(path)}`),
40
- );
41
- }
42
-
43
- export async function requestServerRebuild(reason?: string) {
44
- if (rebuildRequested) return;
45
-
46
- clearTimeout(rebuildTimeout);
47
- rebuildTimeout = setTimeout(async () => {
48
- rebuildRequested = true;
49
- await ERUDIT_SERVER.BUILD_PROMISE;
50
- console.log('\n');
51
- logger.info(`Rebuilding server data!${reason ? ` ${reason}` : ''}\n\n`);
52
- await build();
53
- rebuildRequested = false;
54
- }, rebuildDelay);
55
- }
1
+ import chokidar, { type FSWatcher } from 'chokidar';
2
+
3
+ import { ERUDIT_DIR, PROJECT_DIR } from '#erudit/globalPaths';
4
+ import { ERUDIT_SERVER } from '@server/global';
5
+ import { logger } from '@server/logger';
6
+ import { build } from '@server/build/process';
7
+ import { stress } from '@erudit/utils/stress';
8
+
9
+ const watchTargets: string[] = [
10
+ // Languages
11
+ ERUDIT_DIR + '/languages',
12
+ // Content directory
13
+ PROJECT_DIR + '/content',
14
+ // Contributors directory
15
+ PROJECT_DIR + '/contributors',
16
+ // Sponsors directory
17
+ PROJECT_DIR + '/sponsors',
18
+ ];
19
+
20
+ const ignoreTargets: string[] = [];
21
+
22
+ const rebuildDelay = 300;
23
+
24
+ //
25
+ //
26
+ //
27
+
28
+ let watcher: FSWatcher;
29
+ let rebuildTimeout: any;
30
+ let rebuildRequested = false;
31
+ let pendingRebuild = false;
32
+
33
+ export async function setupRebuildWatcher() {
34
+ if (watcher) return;
35
+
36
+ watcher = chokidar.watch(watchTargets, {
37
+ ignored: ignoreTargets,
38
+ ignoreInitial: true,
39
+ });
40
+
41
+ watcher.on('all', (event, path) =>
42
+ requestServerRebuild(`File change: ${stress(path)}`),
43
+ );
44
+ }
45
+
46
+ export async function requestServerRebuild(reason?: string) {
47
+ // If rebuild is in progress, set flag for another rebuild after completion
48
+ if (rebuildRequested) {
49
+ pendingRebuild = true;
50
+ return;
51
+ }
52
+
53
+ clearTimeout(rebuildTimeout);
54
+ rebuildTimeout = setTimeout(async () => {
55
+ rebuildRequested = true;
56
+ await ERUDIT_SERVER.BUILD_PROMISE;
57
+ console.log('\n');
58
+ logger.info(`Rebuilding server data!${reason ? ` ${reason}` : ''}\n\n`);
59
+ await build();
60
+ rebuildRequested = false;
61
+
62
+ // If changes were detected during rebuild, start another rebuild
63
+ if (pendingRebuild) {
64
+ pendingRebuild = false;
65
+ requestServerRebuild('Changes detected during previous rebuild');
66
+ }
67
+ }, rebuildDelay);
68
+ }
@@ -1,21 +1,19 @@
1
- import eruditConfig from '#erudit/config';
2
-
3
- import { registerGlobals } from '@erudit/globals/register';
4
- import { debug } from '@server/logger';
5
- import { ERUDIT_SERVER } from '@server/global';
6
-
7
- import { setupRebuildWatcher } from './rebuild';
8
- import { setupDatabase } from '../db/setup';
9
- import { setupBitranConfig } from '../bitran/setup';
10
-
11
- export async function setup() {
12
- debug.start('Running initial setup procedures...');
13
-
14
- if (import.meta.dev) await setupRebuildWatcher();
15
-
16
- registerGlobals();
17
- ERUDIT_SERVER.CONFIG = eruditConfig;
18
-
19
- await setupBitranConfig();
20
- await setupDatabase();
21
- }
1
+ import eruditConfig from '#erudit/config';
2
+
3
+ import { registerGlobals } from '@erudit/globals/register';
4
+ import { debug } from '@server/logger';
5
+ import { ERUDIT_SERVER } from '@server/global';
6
+
7
+ import { setupRebuildWatcher } from './rebuild';
8
+ import { setupDatabase } from '../db/setup';
9
+
10
+ export async function setup() {
11
+ debug.start('Running initial setup procedures...');
12
+
13
+ if (import.meta.dev) await setupRebuildWatcher();
14
+
15
+ registerGlobals();
16
+ ERUDIT_SERVER.CONFIG = eruditConfig;
17
+
18
+ await setupDatabase();
19
+ }
@@ -1,112 +1,119 @@
1
- import { isContentType, isTopicPart, type TopicPart } from 'erudit-cog/schema';
2
-
3
- import { ERUDIT_SERVER } from '@server/global';
4
- import { getIdsUp, isSkipId } from '@server/nav/utils';
5
- import { DbContent } from '@server/db/entities/Content';
6
- import { DbContributor } from '@server/db/entities/Contributor';
7
-
8
- import type { Context } from '@shared/content/context';
9
- import {
10
- createContentLink,
11
- createContributorLink,
12
- createTopicPartLink,
13
- } from '@shared/link';
14
- import { CONTENT_TYPE_ICON, ICON, TOPIC_PART_ICON } from '@erudit/shared/icons';
15
- import type { BitranLocation } from '@erudit/shared/bitran/location';
16
-
17
- export async function getContentContext(contentId: string): Promise<Context> {
18
- const context: Context = [];
19
-
20
- for (const _contentId of (await getIdsUp(contentId)).reverse()) {
21
- const dbContent = await getDbContent(_contentId);
22
-
23
- context.push({
24
- type: ERUDIT_SERVER.LANGUAGE.phrases[dbContent.type],
25
- icon: isTopicPart(dbContent.type)
26
- ? TOPIC_PART_ICON[dbContent.type]
27
- : isContentType(dbContent.type)
28
- ? CONTENT_TYPE_ICON[dbContent.type]
29
- : '',
30
- title: dbContent.title || dbContent.contentId,
31
- href: createContentLink(dbContent.type, dbContent.contentId),
32
- hidden: await isSkipId(dbContent.contentId),
33
- });
34
- }
35
-
36
- return context;
37
- }
38
-
39
- export async function getTopicPartContext(
40
- topicPart: TopicPart,
41
- contentId: string,
42
- ): Promise<Context> {
43
- const context = await getContentContext(contentId);
44
- const topicItem = context.pop()!;
45
-
46
- topicItem.type = ERUDIT_SERVER.LANGUAGE.phrases[topicPart];
47
- topicItem.icon = TOPIC_PART_ICON[topicPart];
48
- topicItem.href = createTopicPartLink(topicPart, contentId);
49
-
50
- return context.concat([topicItem]);
51
- }
52
-
53
- export async function getContributorContext(
54
- contributorId: string,
55
- ): Promise<Context> {
56
- const dbContributor = await ERUDIT_SERVER.DB.manager.findOne(
57
- DbContributor,
58
- {
59
- select: ['displayName'],
60
- where: { contributorId },
61
- },
62
- );
63
-
64
- if (!dbContributor)
65
- throw new Error(`Contributor "${contributorId}" not found!`);
66
-
67
- return [
68
- {
69
- type: ERUDIT_SERVER.LANGUAGE.phrases.contributor,
70
- icon: ICON.contributor,
71
- title: dbContributor.displayName || contributorId,
72
- href: createContributorLink(contributorId),
73
- hidden: false,
74
- },
75
- ];
76
- }
77
-
78
- export async function getLocationContext(
79
- location: BitranLocation,
80
- ): Promise<Context> {
81
- const contentId = location.path!;
82
-
83
- switch (location.type) {
84
- case 'article':
85
- case 'summary':
86
- case 'practice':
87
- return await getTopicPartContext(location.type, contentId);
88
- case 'group':
89
- return await getContentContext(contentId);
90
- case 'contributor':
91
- return await getContributorContext(contentId);
92
- }
93
-
94
- throw new Error(
95
- `Cant' build context for location unknown type "${location.type}"!`,
96
- );
97
- }
98
-
99
- //
100
- //
101
- //
102
-
103
- async function getDbContent(contentId: string): Promise<DbContent> {
104
- const dbContent = await ERUDIT_SERVER.DB.manager.findOne(DbContent, {
105
- select: ['type', 'title', 'fullId', 'contentId'],
106
- where: { contentId },
107
- });
108
-
109
- if (!dbContent) throw new Error(`Content "${contentId}" not found!`);
110
-
111
- return dbContent;
112
- }
1
+ import {
2
+ isContentType,
3
+ isTopicPart,
4
+ type BitranLocation,
5
+ type TopicPart,
6
+ } from '@erudit-js/cog/schema';
7
+
8
+ import { ERUDIT_SERVER } from '@server/global';
9
+ import { getIdsUp, isSkipId } from '@server/nav/utils';
10
+ import { DbContent } from '@server/db/entities/Content';
11
+ import { DbContributor } from '@server/db/entities/Contributor';
12
+ import { getFullContentId } from '@server/repository/contentId';
13
+
14
+ import type { Context } from '@shared/content/context';
15
+ import {
16
+ createContentLink,
17
+ createContributorLink,
18
+ createTopicPartLink,
19
+ } from '@shared/link';
20
+ import { CONTENT_TYPE_ICON, ICON, TOPIC_PART_ICON } from '@erudit/shared/icons';
21
+
22
+ export async function getContentContext(contentId: string): Promise<Context> {
23
+ contentId = getFullContentId(contentId);
24
+
25
+ const context: Context = [];
26
+
27
+ for (const _contentId of getIdsUp(contentId).reverse()) {
28
+ const dbContent = await getDbContent(_contentId);
29
+
30
+ context.push({
31
+ type: ERUDIT_SERVER.LANGUAGE.phrases[dbContent.type],
32
+ icon: isTopicPart(dbContent.type)
33
+ ? TOPIC_PART_ICON[dbContent.type]
34
+ : isContentType(dbContent.type)
35
+ ? CONTENT_TYPE_ICON[dbContent.type]
36
+ : '',
37
+ title: dbContent.title || dbContent.contentId,
38
+ href: createContentLink(dbContent.type, dbContent.contentId),
39
+ hidden: await isSkipId(dbContent.contentId),
40
+ });
41
+ }
42
+
43
+ return context;
44
+ }
45
+
46
+ export async function getTopicPartContext(
47
+ topicPart: TopicPart,
48
+ contentId: string,
49
+ ): Promise<Context> {
50
+ const context = await getContentContext(contentId);
51
+ const topicItem = context.pop()!;
52
+
53
+ topicItem.type = ERUDIT_SERVER.LANGUAGE.phrases[topicPart];
54
+ topicItem.icon = TOPIC_PART_ICON[topicPart];
55
+ topicItem.href = createTopicPartLink(topicPart, contentId);
56
+
57
+ return context.concat([topicItem]);
58
+ }
59
+
60
+ export async function getContributorContext(
61
+ contributorId: string,
62
+ ): Promise<Context> {
63
+ const dbContributor = await ERUDIT_SERVER.DB.manager.findOne(
64
+ DbContributor,
65
+ {
66
+ select: ['displayName'],
67
+ where: { contributorId },
68
+ },
69
+ );
70
+
71
+ if (!dbContributor)
72
+ throw new Error(`Contributor "${contributorId}" not found!`);
73
+
74
+ return [
75
+ {
76
+ type: ERUDIT_SERVER.LANGUAGE.phrases.contributor,
77
+ icon: ICON.contributor,
78
+ title: dbContributor.displayName || contributorId,
79
+ href: createContributorLink(contributorId),
80
+ hidden: false,
81
+ },
82
+ ];
83
+ }
84
+
85
+ export async function getLocationContext(
86
+ location: BitranLocation,
87
+ ): Promise<Context> {
88
+ const contentId = location.path!;
89
+
90
+ switch (location.type) {
91
+ case 'article':
92
+ case 'summary':
93
+ case 'practice':
94
+ return await getTopicPartContext(location.type, contentId);
95
+ case 'group':
96
+ return await getContentContext(contentId);
97
+ case 'contributor':
98
+ return await getContributorContext(contentId);
99
+ }
100
+
101
+ throw new Error(
102
+ `Cant' build context for location unknown type "${location.type}"!`,
103
+ );
104
+ }
105
+
106
+ //
107
+ //
108
+ //
109
+
110
+ async function getDbContent(contentId: string): Promise<DbContent> {
111
+ const dbContent = await ERUDIT_SERVER.DB.manager.findOne(DbContent, {
112
+ select: ['type', 'title', 'contentId'],
113
+ where: { contentId },
114
+ });
115
+
116
+ if (!dbContent) throw new Error(`Content "${contentId}" not found!`);
117
+
118
+ return dbContent;
119
+ }
@@ -1,7 +1,7 @@
1
- import { Entity, PrimaryColumn } from 'typeorm';
2
-
3
- @Entity('book')
4
- export class DbBook {
5
- @PrimaryColumn('varchar')
6
- contentId!: string;
7
- }
1
+ import { Entity, PrimaryColumn } from 'typeorm';
2
+
3
+ @Entity('book')
4
+ export class DbBook {
5
+ @PrimaryColumn('varchar')
6
+ contentId!: string;
7
+ }
@@ -1,49 +1,45 @@
1
- import { Column, Entity, Index, PrimaryColumn } from 'typeorm';
2
- import type {
3
- ContentFlag,
4
- ContentReferences,
5
- ContentSeo,
6
- ContentType,
7
- } from 'erudit-cog/schema';
8
-
9
- import type { ImageData } from '@erudit/shared/image';
10
-
11
- @Entity('content')
12
- export class DbContent {
13
- @PrimaryColumn('varchar')
14
- contentId!: string;
15
-
16
- @Column('varchar')
17
- @Index({ unique: true })
18
- fullId!: string;
19
-
20
- @Column('varchar')
21
- type!: ContentType;
22
-
23
- @Column('varchar', { nullable: true })
24
- title?: string;
25
-
26
- @Column('varchar', { nullable: true })
27
- navTitle?: string;
28
-
29
- @Column('text', { nullable: true })
30
- description?: string;
31
-
32
- @Column('simple-json', { nullable: true })
33
- flags?: Record<ContentFlag, boolean>;
34
-
35
- @Column('varchar', { nullable: true })
36
- decoration?: string;
37
-
38
- @Column('simple-json', { nullable: true })
39
- seo?: Partial<ContentSeo>;
40
-
41
- @Column('simple-json', { nullable: true })
42
- ogImage?: ImageData;
43
-
44
- @Column('simple-array', { nullable: true })
45
- dependencies?: string[];
46
-
47
- @Column('simple-json', { nullable: true })
48
- references?: ContentReferences;
49
- }
1
+ import { Column, Entity, Index, PrimaryColumn } from 'typeorm';
2
+ import type {
3
+ ContentFlag,
4
+ ContentReferences,
5
+ ContentSeo,
6
+ ContentType,
7
+ } from '@erudit-js/cog/schema';
8
+
9
+ import type { ImageData } from '@erudit/shared/image';
10
+
11
+ @Entity('content')
12
+ export class DbContent {
13
+ @PrimaryColumn('varchar')
14
+ contentId!: string;
15
+
16
+ @Column('varchar')
17
+ type!: ContentType;
18
+
19
+ @Column('varchar', { nullable: true })
20
+ title?: string;
21
+
22
+ @Column('varchar', { nullable: true })
23
+ navTitle?: string;
24
+
25
+ @Column('text', { nullable: true })
26
+ description?: string;
27
+
28
+ @Column('simple-json', { nullable: true })
29
+ flags?: Partial<Record<ContentFlag, boolean>>;
30
+
31
+ @Column('varchar', { nullable: true })
32
+ decoration?: string;
33
+
34
+ @Column('simple-json', { nullable: true })
35
+ seo?: Partial<ContentSeo>;
36
+
37
+ @Column('simple-json', { nullable: true })
38
+ ogImage?: ImageData;
39
+
40
+ @Column('simple-array', { nullable: true })
41
+ dependencies?: string[];
42
+
43
+ @Column('simple-json', { nullable: true })
44
+ references?: ContentReferences;
45
+ }
@@ -1,10 +1,10 @@
1
- import { Entity, PrimaryColumn } from 'typeorm';
2
-
3
- @Entity('contribution')
4
- export class DbContribution {
5
- @PrimaryColumn('varchar')
6
- contentId!: string;
7
-
8
- @PrimaryColumn('varchar')
9
- contributorId!: string;
10
- }
1
+ import { Entity, PrimaryColumn } from 'typeorm';
2
+
3
+ @Entity('contribution')
4
+ export class DbContribution {
5
+ @PrimaryColumn('varchar')
6
+ contentId!: string;
7
+
8
+ @PrimaryColumn('varchar')
9
+ contributorId!: string;
10
+ }
@@ -1,16 +1,25 @@
1
- import { Column, Entity, PrimaryColumn } from 'typeorm';
2
-
3
- @Entity('contributor')
4
- export class DbContributor {
5
- @PrimaryColumn('varchar')
6
- contributorId!: string;
7
-
8
- @Column('varchar', { nullable: true })
9
- displayName?: string;
10
-
11
- @Column('text', { nullable: true })
12
- description?: string;
13
-
14
- @Column('varchar', { nullable: true })
15
- avatar?: string;
16
- }
1
+ import { Column, Entity, PrimaryColumn } from 'typeorm';
2
+
3
+ @Entity('contributor')
4
+ export class DbContributor {
5
+ @PrimaryColumn('varchar')
6
+ contributorId!: string;
7
+
8
+ @Column('varchar', { nullable: true })
9
+ displayName?: string;
10
+
11
+ @Column('varchar', { nullable: true })
12
+ slogan?: string;
13
+
14
+ @Column('simple-json', { nullable: true })
15
+ links?: Record<string, string>;
16
+
17
+ @Column('text', { nullable: true })
18
+ description?: string;
19
+
20
+ @Column('varchar', { nullable: true })
21
+ avatar?: string;
22
+
23
+ @Column('boolean', { nullable: true })
24
+ isEditor?: boolean;
25
+ }
@@ -0,0 +1,10 @@
1
+ import { Column, Entity, PrimaryColumn } from 'typeorm';
2
+
3
+ @Entity('file')
4
+ export class DbFile {
5
+ @PrimaryColumn('varchar')
6
+ path!: string;
7
+
8
+ @Column('varchar', { unique: true })
9
+ fullPath!: string;
10
+ }
@@ -1,14 +1,14 @@
1
- import { Column, Entity, PrimaryColumn } from 'typeorm';
2
- import type { GroupType } from 'erudit-cog/schema';
3
-
4
- @Entity('group')
5
- export class DbGroup {
6
- @PrimaryColumn('varchar')
7
- contentId!: string;
8
-
9
- @Column('varchar')
10
- type!: GroupType;
11
-
12
- @Column('text', { nullable: true })
13
- content?: string;
14
- }
1
+ import { Column, Entity, PrimaryColumn } from 'typeorm';
2
+ import type { GroupType } from '@erudit-js/cog/schema';
3
+
4
+ @Entity('group')
5
+ export class DbGroup {
6
+ @PrimaryColumn('varchar')
7
+ contentId!: string;
8
+
9
+ @Column('varchar')
10
+ type!: GroupType;
11
+
12
+ @Column('text', { nullable: true })
13
+ content?: string;
14
+ }
@@ -1,15 +1,15 @@
1
- import { Column, Entity, PrimaryColumn } from 'typeorm';
2
-
3
- /**
4
- * TODO:
5
- * Create hash of Bitran content of content items and use it to distinguish between content item version.
6
- */
7
-
8
- @Entity('hash')
9
- export class DbHash {
10
- @PrimaryColumn('varchar')
11
- id!: string;
12
-
13
- @Column('varchar')
14
- hash!: string;
15
- }
1
+ import { Column, Entity, PrimaryColumn } from 'typeorm';
2
+
3
+ /**
4
+ * TODO:
5
+ * Create hash of Bitran content of content items and use it to distinguish between content item version.
6
+ */
7
+
8
+ @Entity('hash')
9
+ export class DbHash {
10
+ @PrimaryColumn('varchar')
11
+ id!: string;
12
+
13
+ @Column('varchar')
14
+ hash!: string;
15
+ }