« get me outta code hell

infra, data: cut unneeded boilerplate from top-level compositions - hsmusic-wiki - HSMusic - static wiki software cataloguing collaborative creation
about summary refs log tree commit diff
diff options
context:
space:
mode:
author(quasar) nebula <qznebula@protonmail.com>2023-09-09 09:16:50 -0300
committer(quasar) nebula <qznebula@protonmail.com>2023-09-09 09:16:50 -0300
commit7b32066dd9629bbb220c2e2425b5294070b5a0db (patch)
treed545d0a9a1e61ddb11c41f37631ae186420a253f
parentceaed5fef3ce2c5d59a6606a6318164b93294f2b (diff)
infra, data: cut unneeded boilerplate from top-level compositions
-rw-r--r--src/data/things/album.js17
-rw-r--r--src/data/things/index.js13
-rw-r--r--src/data/things/track.js48
3 files changed, 43 insertions, 35 deletions
diff --git a/src/data/things/album.js b/src/data/things/album.js
index e11d090..0785953 100644
--- a/src/data/things/album.js
+++ b/src/data/things/album.js
@@ -3,7 +3,6 @@ import {stitchArrays} from '#sugar';
 import {isDate, isTrackSectionList} from '#validators';
 
 import {
-  compositeFrom,
   exitWithoutDependency,
   exitWithoutUpdateValue,
   exposeDependency,
@@ -51,7 +50,7 @@ export class Album extends Thing {
     trackArtDate: simpleDate(),
     dateAddedToWiki: simpleDate(),
 
-    coverArtDate: compositeFrom(`Album.coverArtDate`, [
+    coverArtDate: [
       withResolvedContribs({from: 'coverArtistContribs'}),
       exitWithoutDependency({dependency: '#resolvedContribs', mode: 'empty'}),
 
@@ -60,7 +59,7 @@ export class Album extends Thing {
         dependency: 'date',
         update: {validate: isDate},
       }),
-    ]),
+    ],
 
     artistContribs: contributionList(),
     coverArtistContribs: contributionList(),
@@ -80,7 +79,7 @@ export class Album extends Thing {
       data: 'artTagData',
     }),
 
-    trackSections: compositeFrom(`Album.trackSections`, [
+    trackSections: [
       exitWithoutDependency({dependency: 'trackData', value: []}),
       exitWithoutUpdateValue({value: [], mode: 'empty'}),
 
@@ -150,13 +149,13 @@ export class Album extends Thing {
             }),
         },
       },
-    ]),
+    ],
 
-    coverArtFileExtension: compositeFrom(`Album.coverArtFileExtension`, [
+    coverArtFileExtension: [
       withResolvedContribs({from: 'coverArtistContribs'}),
       exitWithoutDependency({dependency: '#resolvedContribs', mode: 'empty'}),
       fileExtension('jpg'),
-    ]),
+    ],
 
     trackCoverArtFileExtension: fileExtension('jpg'),
 
@@ -189,7 +188,7 @@ export class Album extends Thing {
     hasWallpaperArt: contribsPresent('wallpaperArtistContribs'),
     hasBannerArt: contribsPresent('bannerArtistContribs'),
 
-    tracks: compositeFrom(`Album.tracks`, [
+    tracks: [
       exitWithoutDependency({dependency: 'trackData', value: []}),
       exitWithoutDependency({dependency: 'trackSections', mode: 'empty', value: []}),
 
@@ -209,7 +208,7 @@ export class Album extends Thing {
       }),
 
       exposeDependency({dependency: '#resolvedReferenceList'}),
-    ]),
+    ],
   });
 
   static [Thing.getSerializeDescriptors] = ({
diff --git a/src/data/things/index.js b/src/data/things/index.js
index 3b73a77..4d8d9d1 100644
--- a/src/data/things/index.js
+++ b/src/data/things/index.js
@@ -2,6 +2,7 @@ import * as path from 'node:path';
 import {fileURLToPath} from 'node:url';
 
 import {logError} from '#cli';
+import {compositeFrom} from '#composite';
 import * as serialize from '#serialize';
 import {openAggregate, showAggregate} from '#sugar';
 
@@ -130,8 +131,16 @@ function evaluatePropertyDescriptors() {
         throw new Error(`Missing [Thing.getPropertyDescriptors] function`);
       }
 
-      constructor.propertyDescriptors =
-        constructor[Thing.getPropertyDescriptors](opts);
+      const results = constructor[Thing.getPropertyDescriptors](opts);
+
+      for (const [key, value] of Object.entries(results)) {
+        if (Array.isArray(value)) {
+          results[key] = compositeFrom(`${constructor.name}.${key}`, value);
+          continue;
+        }
+      }
+
+      constructor.propertyDescriptors = results;
     },
 
     showFailedClasses(failedClasses) {
diff --git a/src/data/things/track.js b/src/data/things/track.js
index 25d316e..a8d5902 100644
--- a/src/data/things/track.js
+++ b/src/data/things/track.js
@@ -59,7 +59,7 @@ export class Track extends Thing {
     urls: urls(),
     dateFirstReleased: simpleDate(),
 
-    color: compositeFrom(`Track.color`, [
+    color: [
       exposeUpdateValueOrContinue(),
 
       withContainingTrackSection(),
@@ -71,7 +71,7 @@ export class Track extends Thing {
         dependency: '#album.color',
         update: {validate: isColor},
       }),
-    ]),
+    ],
 
     // Disables presenting the track as though it has its own unique artwork.
     // This flag should only be used in select circumstances, i.e. to override
@@ -83,7 +83,7 @@ export class Track extends Thing {
     // track's unique cover artwork, if any, and does not inherit the extension
     // of the album's main artwork. It does inherit trackCoverArtFileExtension,
     // if present on the album.
-    coverArtFileExtension: compositeFrom(`Track.coverArtFileExtension`, [
+    coverArtFileExtension: [
       exitWithoutUniqueCoverArt(),
 
       exposeUpdateValueOrContinue(),
@@ -95,13 +95,13 @@ export class Track extends Thing {
         value: 'jpg',
         update: {validate: isFileExtension},
       }),
-    ]),
+    ],
 
     // Date of cover art release. Like coverArtFileExtension, this represents
     // only the track's own unique cover artwork, if any. This exposes only as
     // the track's own coverArtDate or its album's trackArtDate, so if neither
     // is specified, this value is null.
-    coverArtDate: compositeFrom(`Track.coverArtDate`, [
+    coverArtDate: [
       withHasUniqueCoverArt(),
       exitWithoutDependency({dependency: '#hasUniqueCoverArt', mode: 'falsy'}),
 
@@ -112,7 +112,7 @@ export class Track extends Thing {
         dependency: '#album.trackArtDate',
         update: {validate: isDate},
       }),
-    ]),
+    ],
 
     commentary: commentary(),
     lyrics: simpleString(),
@@ -136,7 +136,7 @@ export class Track extends Thing {
       data: 'albumData',
     }),
 
-    artistContribs: compositeFrom(`Track.artistContribs`, [
+    artistContribs: [
       inheritFromOriginalRelease({property: 'artistContribs'}),
 
       withUpdateValueAsDependency(),
@@ -148,17 +148,17 @@ export class Track extends Thing {
         dependency: '#album.artistContribs',
         update: {validate: isContributionList},
       }),
-    ]),
+    ],
 
-    contributorContribs: compositeFrom(`Track.contributorContribs`, [
+    contributorContribs: [
       inheritFromOriginalRelease({property: 'contributorContribs'}),
       contributionList(),
-    ]),
+    ],
 
     // Cover artists aren't inherited from the original release, since it
     // typically varies by release and isn't defined by the musical qualities
     // of the track.
-    coverArtistContribs: compositeFrom(`Track.coverArtistContribs`, [
+    coverArtistContribs: [
       exitWithoutUniqueCoverArt(),
 
       withUpdateValueAsDependency(),
@@ -170,25 +170,25 @@ export class Track extends Thing {
         dependency: '#album.trackCoverArtistContribs',
         update: {validate: isContributionList},
       }),
-    ]),
+    ],
 
-    referencedTracks: compositeFrom(`Track.referencedTracks`, [
+    referencedTracks: [
       inheritFromOriginalRelease({property: 'referencedTracks'}),
       referenceList({
         class: Track,
         find: find.track,
         data: 'trackData',
       }),
-    ]),
+    ],
 
-    sampledTracks: compositeFrom(`Track.sampledTracks`, [
+    sampledTracks: [
       inheritFromOriginalRelease({property: 'sampledTracks'}),
       referenceList({
         class: Track,
         find: find.track,
         data: 'trackData',
       }),
-    ]),
+    ],
 
     artTags: referenceList({
       class: ArtTag,
@@ -208,16 +208,16 @@ export class Track extends Thing {
 
     commentatorArtists: commentatorArtists(),
 
-    album: compositeFrom(`Track.album`, [
+    album: [
       withAlbum(),
       exposeDependency({dependency: '#album'}),
-    ]),
+    ],
 
-    date: compositeFrom(`Track.date`, [
+    date: [
       exposeDependencyOrContinue({dependency: 'dateFirstReleased'}),
       withPropertyFromAlbum({property: 'date'}),
       exposeDependency({dependency: '#album.date'}),
-    ]),
+    ],
 
     // Whether or not the track has "unique" cover artwork - a cover which is
     // specifically associated with this track in particular, rather than with
@@ -226,12 +226,12 @@ export class Track extends Thing {
     // or a placeholder. (This property is named hasUniqueCoverArt instead of
     // the usual hasCoverArt to emphasize that it does not inherit from the
     // album.)
-    hasUniqueCoverArt: compositeFrom(`Track.hasUniqueCoverArt`, [
+    hasUniqueCoverArt: [
       withHasUniqueCoverArt(),
       exposeDependency({dependency: '#hasUniqueCoverArt'}),
-    ]),
+    ],
 
-    otherReleases: compositeFrom(`Track.otherReleases`, [
+    otherReleases: [
       exitWithoutDependency({dependency: 'trackData', mode: 'empty'}),
       withOriginalRelease({selfIfOriginal: true}),
 
@@ -253,7 +253,7 @@ export class Track extends Thing {
                 track.originalReleaseTrack === originalRelease)),
         },
       },
-    ]),
+    ],
 
     // Specifically exclude re-releases from this list - while it's useful to
     // get from a re-release to the tracks it references, re-releases aren't