« get me outta code hell

data: Track, Album: concise-retouch toplevel property descriptors - hsmusic-wiki - HSMusic - static wiki software cataloguing collaborative creation
about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
author(quasar) nebula <qznebula@protonmail.com>2025-11-27 21:09:29 -0400
committer(quasar) nebula <qznebula@protonmail.com>2025-11-27 21:09:29 -0400
commitf2161a3fe8ff9b574f53156d08ca7853427be8e4 (patch)
treed79e117ddf638729c20c4e4deb847ae5a50d92ca /src
parent861810685da73fa9fd6d4a1cb965155c61c99d11 (diff)
data: Track, Album: concise-retouch toplevel property descriptors
notably chopped exitWithoutArtwork and contribsPresent,
replaced with new hasArtwork and more exitWithoutDependency
Diffstat (limited to 'src')
-rw-r--r--src/data/composite/wiki-data/exitWithoutArtwork.js45
-rw-r--r--src/data/composite/wiki-data/index.js2
-rw-r--r--src/data/composite/wiki-properties/contribsPresent.js30
-rw-r--r--src/data/composite/wiki-properties/hasArtwork.js (renamed from src/data/composite/wiki-data/withHasArtwork.js)43
-rw-r--r--src/data/composite/wiki-properties/index.js2
-rw-r--r--src/data/things/album.js175
-rw-r--r--src/data/things/track.js357
7 files changed, 175 insertions, 479 deletions
diff --git a/src/data/composite/wiki-data/exitWithoutArtwork.js b/src/data/composite/wiki-data/exitWithoutArtwork.js
deleted file mode 100644
index 8e799fda..00000000
--- a/src/data/composite/wiki-data/exitWithoutArtwork.js
+++ /dev/null
@@ -1,45 +0,0 @@
-import {input, templateCompositeFrom} from '#composite';
-import {isContributionList, isThing, strictArrayOf} from '#validators';
-
-import {exitWithoutDependency} from '#composite/control-flow';
-
-import withHasArtwork from './withHasArtwork.js';
-
-export default templateCompositeFrom({
-  annotation: `exitWithoutArtwork`,
-
-  inputs: {
-    contribs: input({
-      validate: isContributionList,
-      defaultValue: null,
-    }),
-
-    artwork: input({
-      validate: isThing,
-      defaultValue: null,
-    }),
-
-    artworks: input({
-      validate: strictArrayOf(isThing),
-      defaultValue: null,
-    }),
-
-    value: input({
-      defaultValue: null,
-    }),
-  },
-
-  steps: () => [
-    withHasArtwork({
-      contribs: input('contribs'),
-      artwork: input('artwork'),
-      artworks: input('artworks'),
-    }),
-
-    exitWithoutDependency({
-      dependency: '#hasArtwork',
-      mode: input.value('falsy'),
-      value: input('value'),
-    }),
-  ],
-});
diff --git a/src/data/composite/wiki-data/index.js b/src/data/composite/wiki-data/index.js
index beb6f3b8..41f34d21 100644
--- a/src/data/composite/wiki-data/index.js
+++ b/src/data/composite/wiki-data/index.js
@@ -7,7 +7,6 @@
 export {default as constituteFrom} from './constituteFrom.js';
 export {default as constituteOrContinue} from './constituteOrContinue.js';
 export {default as exitWithoutContribs} from './exitWithoutContribs.js';
-export {default as exitWithoutArtwork} from './exitWithoutArtwork.js';
 export {default as gobbleSoupyFind} from './gobbleSoupyFind.js';
 export {default as gobbleSoupyReverse} from './gobbleSoupyReverse.js';
 export {default as inputFindOptions} from './inputFindOptions.js';
@@ -21,7 +20,6 @@ export {default as withConstitutedArtwork} from './withConstitutedArtwork.js';
 export {default as withContentNodes} from './withContentNodes.js';
 export {default as withContributionListSums} from './withContributionListSums.js';
 export {default as withDirectory} from './withDirectory.js';
-export {default as withHasArtwork} from './withHasArtwork.js';
 export {default as withRecontextualizedContributionList} from './withRecontextualizedContributionList.js';
 export {default as withRedatedContributionList} from './withRedatedContributionList.js';
 export {default as withResolvedAnnotatedReferenceList} from './withResolvedAnnotatedReferenceList.js';
diff --git a/src/data/composite/wiki-properties/contribsPresent.js b/src/data/composite/wiki-properties/contribsPresent.js
deleted file mode 100644
index 24f302a5..00000000
--- a/src/data/composite/wiki-properties/contribsPresent.js
+++ /dev/null
@@ -1,30 +0,0 @@
-// Nice 'n simple shorthand for an exposed-only flag which is true when any
-// contributions are present in the specified property.
-
-import {input, templateCompositeFrom} from '#composite';
-import {isContributionList} from '#validators';
-
-import {exposeDependency, withResultOfAvailabilityCheck}
-  from '#composite/control-flow';
-
-export default templateCompositeFrom({
-  annotation: `contribsPresent`,
-
-  compose: false,
-
-  inputs: {
-    contribs: input.staticDependency({
-      validate: isContributionList,
-      acceptsNull: true,
-    }),
-  },
-
-  steps: () => [
-    withResultOfAvailabilityCheck({
-      from: input('contribs'),
-      mode: input.value('empty'),
-    }),
-
-    exposeDependency({dependency: '#availability'}),
-  ],
-});
diff --git a/src/data/composite/wiki-data/withHasArtwork.js b/src/data/composite/wiki-properties/hasArtwork.js
index 9c22f439..e403a7e2 100644
--- a/src/data/composite/wiki-data/withHasArtwork.js
+++ b/src/data/composite/wiki-properties/hasArtwork.js
@@ -1,13 +1,17 @@
-import {input, templateCompositeFrom} from '#composite';
+import {input, templateCompositeFrom, V} from '#composite';
 import {isContributionList, isThing, strictArrayOf} from '#validators';
 
-import {raiseOutputWithoutDependency, withResultOfAvailabilityCheck}
-  from '#composite/control-flow';
 import {fillMissingListItems, withFlattenedList, withPropertyFromList}
   from '#composite/data';
 
+import {
+  exitWithoutDependency,
+  exposeWhetherDependencyAvailable,
+  withResultOfAvailabilityCheck,
+} from '#composite/control-flow';
+
 export default templateCompositeFrom({
-  annotation: 'withHasArtwork',
+  annotation: 'hasArtwork',
 
   inputs: {
     contribs: input({
@@ -26,7 +30,7 @@ export default templateCompositeFrom({
     }),
   },
 
-  outputs: ['#hasArtwork'],
+  compose: false,
 
   steps: () => [
     withResultOfAvailabilityCheck({
@@ -40,9 +44,7 @@ export default templateCompositeFrom({
         ['#availability']: availability,
       }) =>
         (availability
-          ? continuation.raiseOutput({
-              ['#hasArtwork']: true,
-            })
+          ? true
           : continuation()),
     },
 
@@ -64,34 +66,25 @@ export default templateCompositeFrom({
         }),
     },
 
-    raiseOutputWithoutDependency({
-      dependency: '#artworks',
+    exitWithoutDependency('#artworks', {
+      value: input.value(false),
       mode: input.value('empty'),
-      output: input.value({'#hasArtwork': false}),
     }),
 
-    withPropertyFromList({
-      list: '#artworks',
+    withPropertyFromList('#artworks', {
       property: input.value('artistContribs'),
       internal: input.value(true),
     }),
 
     // Since we're getting the update value for each artwork's artistContribs,
     // it may not be set at all, and in that case won't be exposing as [].
-    fillMissingListItems({
-      list: '#artworks.artistContribs',
-      fill: input.value([]),
-    }),
+    fillMissingListItems('#artworks.artistContribs', V([])),
 
-    withFlattenedList({
-      list: '#artworks.artistContribs',
-    }),
+    withFlattenedList('#artworks.artistContribs'),
 
-    withResultOfAvailabilityCheck({
-      from: '#flattenedList',
+    exposeWhetherDependencyAvailable({
+      dependency: '#flattenedList',
       mode: input.value('empty'),
-    }).outputs({
-      '#availability': '#hasArtwork',
     }),
   ],
-});
+});
\ No newline at end of file
diff --git a/src/data/composite/wiki-properties/index.js b/src/data/composite/wiki-properties/index.js
index 57a2b8f2..9ef7ccc4 100644
--- a/src/data/composite/wiki-properties/index.js
+++ b/src/data/composite/wiki-properties/index.js
@@ -10,7 +10,6 @@ export {default as commentatorArtists} from './commentatorArtists.js';
 export {default as constitutibleArtwork} from './constitutibleArtwork.js';
 export {default as constitutibleArtworkList} from './constitutibleArtworkList.js';
 export {default as contentString} from './contentString.js';
-export {default as contribsPresent} from './contribsPresent.js';
 export {default as contributionList} from './contributionList.js';
 export {default as dimensions} from './dimensions.js';
 export {default as directory} from './directory.js';
@@ -18,6 +17,7 @@ export {default as duration} from './duration.js';
 export {default as externalFunction} from './externalFunction.js';
 export {default as fileExtension} from './fileExtension.js';
 export {default as flag} from './flag.js';
+export {default as hasArtwork} from './hasArtwork.js';
 export {default as name} from './name.js';
 export {default as referenceList} from './referenceList.js';
 export {default as referencedArtworkList} from './referencedArtworkList.js';
diff --git a/src/data/things/album.js b/src/data/things/album.js
index e660a2b1..5f5492ce 100644
--- a/src/data/things/album.js
+++ b/src/data/things/album.js
@@ -4,7 +4,7 @@ import * as path from 'node:path';
 import {inspect} from 'node:util';
 
 import {colors} from '#cli';
-import {input} from '#composite';
+import {input, V} from '#composite';
 import {traverse} from '#node-utils';
 import {sortAlbumsTracksChronologically, sortChronologically} from '#sort';
 import {empty} from '#sugar';
@@ -33,6 +33,8 @@ import {
   parseWallpaperParts,
 } from '#yaml';
 
+import {withResolvedContribs} from '#composite/wiki-data';
+
 import {
   exitWithoutDependency,
   exposeConstant,
@@ -50,24 +52,17 @@ import {
 } from '#composite/data';
 
 import {
-  exitWithoutArtwork,
-  withDirectory,
-  withHasArtwork,
-  withResolvedContribs,
-} from '#composite/wiki-data';
-
-import {
   color,
   commentatorArtists,
   constitutibleArtwork,
   constitutibleArtworkList,
   contentString,
-  contribsPresent,
   contributionList,
   dimensions,
   directory,
   fileExtension,
   flag,
+  hasArtwork,
   name,
   referencedArtworkList,
   referenceList,
@@ -119,11 +114,7 @@ export class Album extends Thing {
         validate: input.value(isDirectory),
       }),
 
-      withDirectory(),
-
-      exposeDependency({
-        dependency: '#directory',
-      }),
+      exposeDependency('directory'),
     ],
 
     alwaysReferenceByDirectory: flag(false),
@@ -138,9 +129,7 @@ export class Album extends Thing {
         ])),
       }),
 
-      exposeConstant({
-        value: input.value('album'),
-      }),
+      exposeConstant(V('album')),
     ],
 
     bandcampAlbumIdentifier: simpleString(),
@@ -172,10 +161,7 @@ export class Album extends Thing {
         '#resolvedContribs': '#trackArtistContribs',
       }),
 
-      exposeDependencyOrContinue({
-        dependency: '#trackArtistContribs',
-        mode: input.value('empty'),
-      }),
+      exposeDependencyOrContinue('#trackArtistContribs', V('empty')),
 
       withResolvedContribs({
         from: '_artistContribs',
@@ -186,7 +172,7 @@ export class Album extends Thing {
         '#resolvedContribs': '#trackArtistContribs',
       }),
 
-      exposeDependency({dependency: '#trackArtistContribs'}),
+      exposeDependency('#trackArtistContribs'),
     ],
 
     // > Update & expose - General configuration
@@ -210,10 +196,9 @@ export class Album extends Thing {
     // > Update & expose - Artworks
 
     coverArtworks: [
-      exitWithoutArtwork({
-        contribs: '_coverArtistContribs',
-        artworks: '_coverArtworks',
+      exitWithoutDependency('hasCoverArt', {
         value: input.value([]),
+        mode: input.value('falsy'),
       }),
 
       constitutibleArtworkList.fromYAMLFieldSpec
@@ -226,13 +211,8 @@ export class Album extends Thing {
     }),
 
     coverArtDate: [
-      withHasArtwork({
-        contribs: '_coverArtistContribs',
-        artworks: '_coverArtworks',
-      }),
-
-      exitWithoutDependency({
-        dependency: '#hasArtwork',
+      exitWithoutDependency('hasCoverArt', {
+        value: input.value(null),
         mode: input.value('falsy'),
       }),
 
@@ -240,34 +220,31 @@ export class Album extends Thing {
         validate: input.value(isDate),
       }),
 
-      exposeDependency({
-        dependency: 'date',
-      }),
+      exposeDependency('date'),
     ],
 
     coverArtFileExtension: [
-      exitWithoutArtwork({
-        contribs: '_coverArtistContribs',
-        artworks: '_coverArtworks',
+      exitWithoutDependency('hasCoverArt', {
+        value: input.value(null),
+        mode: input.value('falsy'),
       }),
 
       fileExtension('jpg'),
     ],
 
     coverArtDimensions: [
-      exitWithoutArtwork({
-        contribs: '_coverArtistContribs',
-        artworks: '_coverArtworks',
+      exitWithoutDependency('hasCoverArt', {
+        value: input.value(null),
+        mode: input.value('falsy'),
       }),
 
       dimensions(),
     ],
 
     artTags: [
-      exitWithoutArtwork({
-        contribs: '_coverArtistContribs',
-        artworks: '_coverArtworks',
+      exitWithoutDependency('hasCoverArt', {
         value: input.value([]),
+        mode: input.value('falsy'),
       }),
 
       referenceList({
@@ -277,10 +254,9 @@ export class Album extends Thing {
     ],
 
     referencedArtworks: [
-      exitWithoutArtwork({
-        contribs: '_coverArtistContribs',
-        artworks: '_coverArtworks',
+      exitWithoutDependency('hasCoverArt', {
         value: input.value([]),
+        mode: input.value('falsy'),
       }),
 
       referencedArtworkList(),
@@ -289,7 +265,7 @@ export class Album extends Thing {
     trackCoverArtistContribs: contributionList({
       // May be null, indicating cover art was added for tracks on the date
       // each track specifies, or else the track's own release date.
-      date: '_trackArtDate',
+      date: 'trackArtDate',
 
       // This is the "correct" value, but it gets overwritten - with the same
       // value - regardless.
@@ -303,10 +279,9 @@ export class Album extends Thing {
     trackDimensions: dimensions(),
 
     wallpaperArtwork: [
-      exitWithoutDependency({
-        dependency: '_wallpaperArtistContribs',
-        mode: input.value('empty'),
+      exitWithoutDependency('hasWallpaperArt', {
         value: input.value(null),
+        mode: input.value('falsy'),
       }),
 
       constitutibleArtwork.fromYAMLFieldSpec
@@ -319,39 +294,36 @@ export class Album extends Thing {
     }),
 
     wallpaperFileExtension: [
-      exitWithoutArtwork({
-        contribs: '_wallpaperArtistContribs',
-        artwork: '_wallpaperArtwork',
+      exitWithoutDependency('hasWallpaperArt', {
+        value: input.value(null),
+        mode: input.value('falsy'),
       }),
 
       fileExtension('jpg'),
     ],
 
     wallpaperStyle: [
-      exitWithoutArtwork({
-        contribs: '_wallpaperArtistContribs',
-        artwork: '_wallpaperArtwork',
+      exitWithoutDependency('hasWallpaperArt', {
+        value: input.value(null),
+        mode: input.value('falsy'),
       }),
 
       simpleString(),
     ],
 
     wallpaperParts: [
-      // kinda nonsensical or at least unlikely lol, but y'know
-      exitWithoutArtwork({
-        contribs: '_wallpaperArtistContribs',
-        artwork: '_wallpaperArtwork',
+      exitWithoutDependency('hasWallpaperArt', {
         value: input.value([]),
+        mode: input.value('falsy'),
       }),
 
       wallpaperParts(),
     ],
 
     bannerArtwork: [
-      exitWithoutDependency({
-        dependency: '_bannerArtistContribs',
-        mode: input.value('empty'),
+      exitWithoutDependency('hasBannerArt', {
         value: input.value(null),
+        mode: input.value('falsy'),
       }),
 
       constitutibleArtwork.fromYAMLFieldSpec
@@ -364,27 +336,27 @@ export class Album extends Thing {
     }),
 
     bannerFileExtension: [
-      exitWithoutArtwork({
-        contribs: '_bannerArtistContribs',
-        artwork: '_bannerArtwork',
+      exitWithoutDependency('hasBannerArt', {
+        value: input.value(null),
+        mode: input.value('falsy'),
       }),
 
       fileExtension('jpg'),
     ],
 
     bannerDimensions: [
-      exitWithoutArtwork({
-        contribs: '_bannerArtistContribs',
-        artwork: '_bannerArtwork',
+      exitWithoutDependency('hasBannerArt', {
+        value: input.value(null),
+        mode: input.value('falsy'),
       }),
 
       dimensions(),
     ],
 
     bannerStyle: [
-      exitWithoutArtwork({
-        contribs: '_bannerArtistContribs',
-        artwork: '_bannerArtwork',
+      exitWithoutDependency('hasBannerArt', {
+        value: input.value(null),
+        mode: input.value('falsy'),
       }),
 
       simpleString(),
@@ -430,44 +402,31 @@ export class Album extends Thing {
 
     // > Expose only
 
-    isAlbum: [
-      exposeConstant({
-        value: input.value(true),
-      }),
-    ],
+    isAlbum: exposeConstant(V(true)),
 
     commentatorArtists: commentatorArtists(),
 
-    hasCoverArt: [
-      withHasArtwork({
-        contribs: '_coverArtistContribs',
-        artworks: '_coverArtworks',
-      }),
+    hasCoverArt: hasArtwork({
+      contribs: '_coverArtistContribs',
+      artworks: '_coverArtworks',
+    }),
 
-      exposeDependency({dependency: '#hasArtwork'}),
-    ],
+    hasWallpaperArt: hasArtwork({
+      contribs: '_wallpaperArtistContribs',
+      artwork: '_wallpaperArtwork',
+    }),
 
-    hasWallpaperArt: contribsPresent({contribs: '_wallpaperArtistContribs'}),
-    hasBannerArt: contribsPresent({contribs: '_bannerArtistContribs'}),
+    hasBannerArt: hasArtwork({
+      contribs: '_bannerArtistContribs',
+      artwork: '_bannerArtwork',
+    }),
 
     tracks: [
-      exitWithoutDependency({
-        dependency: 'trackSections',
-        value: input.value([]),
-      }),
-
-      withPropertyFromList({
-        list: 'trackSections',
-        property: input.value('tracks'),
-      }),
+      exitWithoutDependency('trackSections', V([])),
 
-      withFlattenedList({
-        list: '#trackSections.tracks',
-      }),
-
-      exposeDependency({
-        dependency: '#flattenedList',
-      }),
+      withPropertyFromList('trackSections', V('tracks')),
+      withFlattenedList('#trackSections.tracks'),
+      exposeDependency('#flattenedList'),
     ],
   });
 
@@ -1126,17 +1085,11 @@ export class TrackSection extends Thing {
         property: input.value('directory'),
       }),
 
-      withDirectory({
-        directory: '_unqualifiedDirectory',
-      }).outputs({
-        '#directory': '#unqualifiedDirectory',
-      }),
-
       {
-        dependencies: ['#album.directory', '#unqualifiedDirectory'],
+        dependencies: ['#album.directory', 'unqualifiedDirectory'],
         compute: ({
           ['#album.directory']: albumDirectory,
-          ['#unqualifiedDirectory']: unqualifiedDirectory,
+          ['unqualifiedDirectory']: unqualifiedDirectory,
         }) =>
           albumDirectory + '/' + unqualifiedDirectory,
       },
diff --git a/src/data/things/track.js b/src/data/things/track.js
index 030778a3..08b0f94f 100644
--- a/src/data/things/track.js
+++ b/src/data/things/track.js
@@ -248,10 +248,7 @@ export class Track extends Thing {
             : null),
       },
 
-      withPropertyFromObject({
-        object: '#matchingAlbum',
-        property: input.value('tracks'),
-      }),
+      withPropertyFromObject( '#matchingAlbum', V('tracks')),
 
       {
         dependencies: [
@@ -285,14 +282,8 @@ export class Track extends Thing {
         validate: input.value(isContentString),
       }),
 
-      withPropertyFromObject({
-        object: 'album',
-        property: input.value('trackArtistText'),
-      }),
-
-      exposeDependency({
-        dependency: '#album.trackArtistText',
-      }),
+      withPropertyFromObject('album', V('trackArtistText')),
+      exposeDependency('#album.trackArtistText'),
     ],
 
     artistTextInLists: [
@@ -316,19 +307,13 @@ export class Track extends Thing {
         '#resolvedContribs': '#artistContribs',
       }),
 
-      exposeDependencyOrContinue({
-        dependency: '#artistContribs',
-        mode: input.value('empty'),
-      }),
+      exposeDependencyOrContinue('#artistContribs', V('empty')),
 
       // Specifically inherit artist contributions later than artist contribs.
       // Secondary releases' artists may differ from the main release.
       inheritContributionListFromMainRelease(),
 
-      withPropertyFromObject({
-        object: 'album',
-        property: input.value('trackArtistContribs'),
-      }),
+      withPropertyFromObject('album', V('trackArtistContribs')),
 
       withRecontextualizedContributionList({
         list: '#album.trackArtistContribs',
@@ -340,7 +325,7 @@ export class Track extends Thing {
         date: 'date',
       }),
 
-      exposeDependency({dependency: '#album.trackArtistContribs'}),
+      exposeDependency('#album.trackArtistContribs'),
     ],
 
     contributorContribs: [
@@ -359,12 +344,8 @@ export class Track extends Thing {
         validate: input.value(isBoolean),
       }),
 
-      withPropertyFromObject({
-        object: 'trackSection',
-        property: input.value('countTracksInArtistTotals'),
-      }),
-
-      exposeDependency({dependency: '#trackSection.countTracksInArtistTotals'}),
+      withPropertyFromObject('trackSection', V('countTracksInArtistTotals')),
+      exposeDependency('#trackSection.countTracksInArtistTotals'),
     ],
 
     disableUniqueCoverArt: flag(),
@@ -379,19 +360,11 @@ export class Track extends Thing {
         validate: input.value(isColor),
       }),
 
-      withPropertyFromObject({
-        object: 'trackSection',
-        property: input.value('color'),
-      }),
-
-      exposeDependencyOrContinue({dependency: '#trackSection.color'}),
-
-      withPropertyFromObject({
-        object: 'album',
-        property: input.value('color'),
-      }),
+      withPropertyFromObject('trackSection', V('color')),
+      exposeDependencyOrContinue('#trackSection.color'),
 
-      exposeDependency({dependency: '#album.color'}),
+      withPropertyFromObject('album', V('color')),
+      exposeDependency('#album.color'),
     ],
 
     needsLyrics: [
@@ -400,16 +373,12 @@ export class Track extends Thing {
         validate: input.value(isBoolean),
       }),
 
-      exitWithoutDependency({
-        dependency: '_lyrics',
-        mode: input.value('empty'),
+      exitWithoutDependency('_lyrics', {
         value: input.value(false),
+        mode: input.value('empty'),
       }),
 
-      withPropertyFromList({
-        list: '_lyrics',
-        property: input.value('helpNeeded'),
-      }),
+      withPropertyFromList('_lyrics', V('helpNeeded')),
 
       {
         dependencies: ['#lyrics.helpNeeded'],
@@ -425,10 +394,9 @@ export class Track extends Thing {
     // > Update & expose - Artworks
 
     trackArtworks: [
-      exitWithoutDependency({
-        dependency: 'hasUniqueCoverArt',
-        mode: input.value('falsy'),
+      exitWithoutDependency('hasUniqueCoverArt', {
         value: input.value([]),
+        mode: input.value('falsy'),
       }),
 
       constitutibleArtworkList.fromYAMLFieldSpec
@@ -436,10 +404,9 @@ export class Track extends Thing {
     ],
 
     coverArtistContribs: [
-      exitWithoutDependency({
-        dependency: 'hasUniqueCoverArt',
-        mode: input.value('falsy'),
+      exitWithoutDependency('hasUniqueCoverArt', {
         value: input.value([]),
+        mode: input.value('falsy'),
       }),
 
       withResolvedContribs({
@@ -449,15 +416,9 @@ export class Track extends Thing {
         date: 'coverArtDate',
       }),
 
-      exposeDependencyOrContinue({
-        dependency: '#resolvedContribs',
-        mode: input.value('empty'),
-      }),
+      exposeDependencyOrContinue('#resolvedContribs', V('empty')),
 
-      withPropertyFromObject({
-        object: 'album',
-        property: input.value('trackCoverArtistContribs'),
-      }),
+      withPropertyFromObject('album', V('trackCoverArtistContribs')),
 
       withRecontextualizedContributionList({
         list: '#album.trackCoverArtistContribs',
@@ -469,14 +430,12 @@ export class Track extends Thing {
         date: 'coverArtDate',
       }),
 
-      exposeDependency({
-        dependency: '#album.trackCoverArtistContribs',
-      }),
+      exposeDependency('#album.trackCoverArtistContribs'),
     ],
 
     coverArtDate: [
-      exitWithoutDependency({
-        dependency: 'hasUniqueCoverArt',
+      exitWithoutDependency('hasUniqueCoverArt', {
+        value: input.value(null),
         mode: input.value('falsy'),
       }),
 
@@ -484,23 +443,15 @@ export class Track extends Thing {
         validate: input.value(isDate),
       }),
 
-      withPropertyFromObject({
-        object: 'album',
-        property: input.value('trackArtDate'),
-      }),
-
-      exposeDependencyOrContinue({
-        dependency: '#album.trackArtDate',
-      }),
+      withPropertyFromObject('album', V('trackArtDate')),
+      exposeDependencyOrContinue('#album.trackArtDate'),
 
-      exposeDependency({
-        dependency: 'date',
-      }),
+      exposeDependency('date'),
     ],
 
     coverArtFileExtension: [
-      exitWithoutDependency({
-        dependency: 'hasUniqueCoverArt',
+      exitWithoutDependency('hasUniqueCoverArt', {
+        value: input.value(null),
         mode: input.value('falsy'),
       }),
 
@@ -508,41 +459,30 @@ export class Track extends Thing {
         validate: input.value(isFileExtension),
       }),
 
-      withPropertyFromObject({
-        object: 'album',
-        property: input.value('trackCoverArtFileExtension'),
-      }),
-
-      exposeDependencyOrContinue({dependency: '#album.trackCoverArtFileExtension'}),
+      withPropertyFromObject('album', V('trackCoverArtFileExtension')),
+      exposeDependencyOrContinue('#album.trackCoverArtFileExtension'),
 
-      exposeConstant({
-        value: input.value('jpg'),
-      }),
+      exposeConstant(V('jpg')),
     ],
 
     coverArtDimensions: [
-      exitWithoutDependency({
-        dependency: 'hasUniqueCoverArt',
+      exitWithoutDependency('hasUniqueCoverArt', {
+        value: input.value(null),
         mode: input.value('falsy'),
       }),
 
       exposeUpdateValueOrContinue(),
 
-      withPropertyFromObject({
-        object: 'album',
-        property: input.value('trackDimensions'),
-      }),
-
-      exposeDependencyOrContinue({dependency: '#album.trackDimensions'}),
+      withPropertyFromObject('album', V('trackDimensions')),
+      exposeDependencyOrContinue('#album.trackDimensions'),
 
       dimensions(),
     ],
 
     artTags: [
-      exitWithoutDependency({
-        dependency: 'hasUniqueCoverArt',
-        mode: input.value('falsy'),
+      exitWithoutDependency('hasUniqueCoverArt', {
         value: input.value([]),
+        mode: input.value('falsy'),
       }),
 
       referenceList({
@@ -552,10 +492,9 @@ export class Track extends Thing {
     ],
 
     referencedArtworks: [
-      exitWithoutDependency({
-        dependency: 'hasUniqueCoverArt',
-        mode: input.value('falsy'),
+      exitWithoutDependency('hasUniqueCoverArt', {
         value: input.value([]),
+        mode: input.value('falsy'),
       }),
 
       referencedArtworkList(),
@@ -646,28 +585,18 @@ export class Track extends Thing {
 
     // > Expose only
 
-    isTrack: [
-      exposeConstant({
-        value: input.value(true),
-      }),
-    ],
+    isTrack: exposeConstant(V(true)),
 
     commentatorArtists: commentatorArtists(),
 
     directorySuffix: [
-      exitWithoutDependency({
-        dependency: 'suffixDirectoryFromAlbum',
+      exitWithoutDependency('suffixDirectoryFromAlbum', {
+        value: input.value(null),
         mode: input.value('falsy'),
       }),
 
-      withPropertyFromObject({
-        object: 'trackSection',
-        property: input.value('directorySuffix'),
-      }),
-
-      exposeDependency({
-        dependency: '#trackSection.directorySuffix',
-      }),
+      withPropertyFromObject('trackSection', V('directorySuffix')),
+      exposeDependency('#trackSection.directorySuffix'),
     ],
 
     date: [
@@ -679,43 +608,21 @@ export class Track extends Thing {
             : continuation()),
       },
 
-      exposeDependencyOrContinue({
-        dependency: 'dateFirstReleased',
-      }),
-
-      withPropertyFromObject({
-        object: 'album',
-        property: input.value('date'),
-      }),
+      exposeDependencyOrContinue('dateFirstReleased'),
 
-      exposeDependency({
-        dependency: '#album.date',
-      }),
+      withPropertyFromObject('album', V('date')),
+      exposeDependency('#album.date'),
     ],
 
     trackNumber: [
       // Zero is the fallback, not one, but in most albums the first track
       // (and its intended output by this composition) will be one.
-      exitWithoutDependency({
-        dependency: 'trackSection',
-        value: input.value(0),
-      }),
 
-      withPropertiesFromObject({
-        object: 'trackSection',
-        properties: input.value(['tracks', 'startCountingFrom']),
-      }),
+      exitWithoutDependency('trackSection', V(0)),
+      withPropertiesFromObject('trackSection', V(['tracks', 'startCountingFrom'])),
 
-      withIndexInList({
-        list: '#trackSection.tracks',
-        item: input.myself(),
-      }),
-
-      exitWithoutDependency({
-        dependency: '#index',
-        value: input.value(0),
-        mode: input.value('index'),
-      }),
+      withIndexInList('#trackSection.tracks', input.myself()),
+      exitWithoutDependency('#index', V(0), V('index')),
 
       {
         dependencies: ['#trackSection.startCountingFrom', '#index'],
@@ -762,8 +669,7 @@ export class Track extends Thing {
             : continuation()),
       },
 
-      withPropertyFromObject({
-        object: 'album',
+      withPropertyFromObject('album', {
         property: input.value('trackCoverArtistContribs'),
         internal: input.value(true),
       }),
@@ -783,61 +689,43 @@ export class Track extends Thing {
             : continuation()),
       },
 
-      exitWithoutDependency({
-        dependency: '_trackArtworks',
-        mode: input.value('empty'),
+      exitWithoutDependency('_trackArtworks', {
         value: input.value(false),
+        mode: input.value('empty'),
       }),
 
-      withPropertyFromList({
-        list: '_trackArtworks',
+      withPropertyFromList('_trackArtworks', {
         property: input.value('artistContribs'),
         internal: input.value(true),
       }),
 
       // Since we're getting the update value for each artwork's artistContribs,
       // it may not be set at all, and in that case won't be exposing as [].
-      fillMissingListItems({
-        list: '#trackArtworks.artistContribs',
-        fill: input.value([]),
-      }),
+      fillMissingListItems('#trackArtworks.artistContribs', V([])),
 
-      withFlattenedList({
-        list: '#trackArtworks.artistContribs',
-      }),
+      withFlattenedList('#trackArtworks.artistContribs'),
 
-      withResultOfAvailabilityCheck({
-        from: '#flattenedList',
+      exposeWhetherDependencyAvailable({
+        dependency: '#flattenedList',
         mode: input.value('empty'),
       }),
-
-      exposeDependency({
-        dependency: '#availability',
-      }),
     ],
 
-    isMainRelease: [
+    isMainRelease:
       exposeWhetherDependencyAvailable({
         dependency: 'mainReleaseTrack',
         negate: input.value(true),
       }),
-    ],
 
-    isSecondaryRelease: [
+    isSecondaryRelease:
       exposeWhetherDependencyAvailable({
         dependency: 'mainReleaseTrack',
       }),
-    ],
 
     mainReleaseTrack: [
-      exitWithoutDependency({
-        dependency: 'mainRelease',
-      }),
+      exitWithoutDependency('mainRelease'),
 
-      withPropertyFromObject({
-        object: 'mainRelease',
-        property: input.value('isTrack'),
-      }),
+      withPropertyFromObject('mainRelease', V('isTrack')),
 
       {
         dependencies: ['mainRelease', '#mainRelease.isTrack'],
@@ -878,20 +766,14 @@ export class Track extends Thing {
         },
       },
 
-      withPropertyFromObject({
-        object: 'mainRelease',
-        property: input.value('tracks'),
-      }),
+      withPropertyFromObject('mainRelease', V('tracks')),
 
-      withPropertyFromList({
-        list: '#mainRelease.tracks',
+      withPropertyFromList('#mainRelease.tracks', {
         property: input.value('mainRelease'),
         internal: input.value(true),
       }),
 
-      withAvailabilityFilter({
-        from: '#mainRelease.tracks.mainRelease',
-      }),
+      withAvailabilityFilter({from: '#mainRelease.tracks.mainRelease'}),
 
       withMappedList({
         list: '#availabilityFilter',
@@ -900,79 +782,39 @@ export class Track extends Thing {
         '#mappedList': '#availabilityFilter',
       }),
 
-      withFilteredList({
-        list: '#mainRelease.tracks',
-        filter: '#availabilityFilter',
-      }).outputs({
-        '#filteredList': '#mainRelease.tracks',
-      }),
+      withFilteredList('#mainRelease.tracks', '#availabilityFilter')
+        .outputs({'#filteredList': '#mainRelease.tracks'}),
 
-      withPropertyFromList({
-        list: '#mainRelease.tracks',
-        property: input.value('name'),
-      }),
+      withPropertyFromList('#mainRelease.tracks', V('name')),
 
-      withPropertyFromList({
-        list: '#mainRelease.tracks',
+      withPropertyFromList('#mainRelease.tracks', {
         property: input.value('directory'),
         internal: input.value(true),
       }),
 
-      withMappedList({
-        list: '#mainRelease.tracks.name',
-        map: '#mapItsNameLikeName',
-      }).outputs({
-        '#mappedList': '#filterItsNameLikeName',
-      }),
+      withMappedList('#mainRelease.tracks.name', '#mapItsNameLikeName')
+        .outputs({'#mappedList': '#filterItsNameLikeName'}),
 
-      withMappedList({
-        list: '#mainRelease.tracks.directory',
-        map: '#mapItsDirectoryLikeDirectory',
-      }).outputs({
-        '#mappedList': '#filterItsDirectoryLikeDirectory',
-      }),
+      withMappedList('#mainRelease.tracks.directory', '#mapItsDirectoryLikeDirectory')
+        .outputs({'#mappedList': '#filterItsDirectoryLikeDirectory'}),
 
-      withMappedList({
-        list: '#mainRelease.tracks.name',
-        map: '#mapItsNameLikeDirectory',
-      }).outputs({
-        '#mappedList': '#filterItsNameLikeDirectory',
-      }),
+      withMappedList('#mainRelease.tracks.name', '#mapItsNameLikeDirectory')
+        .outputs({'#mappedList': '#filterItsNameLikeDirectory'}),
 
-      withMappedList({
-        list: '#mainRelease.tracks.directory',
-        map: '#mapItsDirectoryLikeName',
-      }).outputs({
-        '#mappedList': '#filterItsDirectoryLikeName',
-      }),
+      withMappedList('#mainRelease.tracks.directory', '#mapItsDirectoryLikeName')
+        .outputs({'#mappedList': '#filterItsDirectoryLikeName'}),
 
-      withFilteredList({
-        list: '#mainRelease.tracks',
-        filter: '#filterItsNameLikeName',
-      }).outputs({
-        '#filteredList': '#matchingItsNameLikeName',
-      }),
+      withFilteredList('#mainRelease.tracks', '#filterItsNameLikeName')
+        .outputs({'#filteredList': '#matchingItsNameLikeName'}),
 
-      withFilteredList({
-        list: '#mainRelease.tracks',
-        filter: '#filterItsDirectoryLikeDirectory',
-      }).outputs({
-        '#filteredList': '#matchingItsDirectoryLikeDirectory',
-      }),
+      withFilteredList('#mainRelease.tracks', '#filterItsDirectoryLikeDirectory')
+        .outputs({'#filteredList': '#matchingItsDirectoryLikeDirectory'}),
 
-      withFilteredList({
-        list: '#mainRelease.tracks',
-        filter: '#filterItsNameLikeDirectory',
-      }).outputs({
-        '#filteredList': '#matchingItsNameLikeDirectory',
-      }),
+      withFilteredList('#mainRelease.tracks', '#filterItsNameLikeDirectory')
+        .outputs({'#filteredList': '#matchingItsNameLikeDirectory'}),
 
-      withFilteredList({
-        list: '#mainRelease.tracks',
-        filter: '#filterItsDirectoryLikeName',
-      }).outputs({
-        '#filteredList': '#matchingItsDirectoryLikeName',
-      }),
+      withFilteredList('#mainRelease.tracks', '#filterItsDirectoryLikeName')
+        .outputs({'#filteredList': '#matchingItsDirectoryLikeName'}),
 
       {
         dependencies: [
@@ -1065,30 +907,15 @@ export class Track extends Thing {
     ],
 
     commentaryFromMainRelease: [
-      exitWithoutDependency({
-        dependency: 'mainReleaseTrack',
-        value: input.value([]),
-      }),
+      exitWithoutDependency('mainReleaseTrack', V([])),
 
-      withPropertyFromObject({
-        object: 'mainReleaseTrack',
-        property: input.value('commentary'),
-      }),
-
-      exposeDependency({
-        dependency: '#mainReleaseTrack.commentary',
-      }),
+      withPropertyFromObject('mainReleaseTrack', V('commentary')),
+      exposeDependency('#mainReleaseTrack.commentary'),
     ],
 
     groups: [
-      withPropertyFromObject({
-        object: 'album',
-        property: input.value('groups'),
-      }),
-
-      exposeDependency({
-        dependency: '#album.groups',
-      }),
+      withPropertyFromObject('album', V('groups')),
+      exposeDependency('#album.groups'),
     ],
 
     followingProductionTracks: reverseReferenceList({