« get me outta code hell

generateTrackChronologyLinks.js « dependencies « content « src - hsmusic-wiki - HSMusic - static wiki software cataloguing collaborative creation
about summary refs log tree commit diff
path: root/src/content/dependencies/generateTrackChronologyLinks.js
blob: 814e9a6ac2731649de0f9f14cb119e596d20c2e6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
import {sortAlbumsTracksChronologically} from '#sort';

import getChronologyRelations from '../util/getChronologyRelations.js';

export default {
  contentDependencies: [
    'generateChronologyLinks',
    'linkArtist',
    'linkTrack',
  ],

  relations: (relation, track) => ({
    chronologyLinks:
      relation('generateChronologyLinks'),

    artistChronologyContributions:
      getChronologyRelations(track, {
        contributions: [
          ...track.artistContribs ?? [],
          ...track.contributorContribs ?? [],
        ],

        linkArtist: artist => relation('linkArtist', artist),
        linkThing: track => relation('linkTrack', track),

        getThings(artist) {
          const getDate = thing => thing.date;

          const things = [
            ...artist.tracksAsArtist,
            ...artist.tracksAsContributor,
          ].filter(getDate);

          return sortAlbumsTracksChronologically(things, {getDate});
        },
      }),

    coverArtistChronologyContributions:
      getChronologyRelations(track, {
        contributions: track.coverArtistContribs ?? [],

        linkArtist: artist => relation('linkArtist', artist),

        linkThing: trackOrAlbum =>
          (trackOrAlbum.album
            ? relation('linkTrack', trackOrAlbum)
            : relation('linkAlbum', trackOrAlbum)),

        getThings(artist) {
          const getDate = thing => thing.coverArtDate ?? thing.date;

          const things = [
            ...artist.albumsAsCoverArtist,
            ...artist.tracksAsCoverArtist,
          ].filter(getDate);

          return sortAlbumsTracksChronologically(things, {getDate});
        },
      }),
  }),

  generate: (relations) =>
    relations.chronologyLinks.slots({
      chronologyInfoSets: [
        {
          headingString: 'misc.chronology.heading.track',
          contributions: relations.artistChronologyContributions,
        },
        {
          headingString: 'misc.chronology.heading.coverArt',
          contributions: relations.coverArtistChronologyContributions,
        },
      ],
    }),
};