« get me outta code hell

data: Track: inline alwaysReferenceByDirectory - hsmusic-wiki - HSMusic - static wiki software cataloguing collaborative creation
about summary refs log tree commit diff
path: root/src/data/things
diff options
context:
space:
mode:
author(quasar) nebula <qznebula@protonmail.com>2025-11-25 17:05:17 -0400
committer(quasar) nebula <qznebula@protonmail.com>2025-11-25 17:05:17 -0400
commit697a92ab17dda83b281329843eba8da626caf226 (patch)
tree90d592621d15a510102fe64a995484ce1a89ca46 /src/data/things
parent3d6e0377e01a6c8c05ab3725cc0c30d02f318d0f (diff)
data: Track: inline alwaysReferenceByDirectory
Diffstat (limited to 'src/data/things')
-rw-r--r--src/data/things/track.js47
1 files changed, 45 insertions, 2 deletions
diff --git a/src/data/things/track.js b/src/data/things/track.js
index 032171d0..f275b509 100644
--- a/src/data/things/track.js
+++ b/src/data/things/track.js
@@ -87,7 +87,6 @@ import {
 } from '#composite/wiki-properties';
 
 import {
-  alwaysReferenceByDirectory,
   exitWithoutUniqueCoverArt,
   inheritContributionListFromMainRelease,
   inheritFromMainRelease,
@@ -154,7 +153,51 @@ export class Track extends Thing {
       }),
     ],
 
-    alwaysReferenceByDirectory: alwaysReferenceByDirectory(),
+    // Controls how find.track works - it'll never be matched by
+    // a reference just to the track's name, which means you don't
+    // have to always reference some *other* (much more commonly
+    // referenced) track by directory instead of more naturally by name.
+    alwaysReferenceByDirectory: [
+      exposeUpdateValueOrContinue({
+        validate: input.value(isBoolean),
+      }),
+
+      withPropertyFromAlbum({
+        property: input.value('alwaysReferenceTracksByDirectory'),
+      }),
+
+      // Falsy mode means this exposes true if the album's property is true,
+      // but continues if the property is false (which is also the default).
+      exposeDependencyOrContinue({
+        dependency: '#album.alwaysReferenceTracksByDirectory',
+        mode: input.value('falsy'),
+      }),
+
+      exitWithoutDependency({
+        dependency: '_mainRelease',
+        value: input.value(false),
+      }),
+
+      exitWithoutDependency({
+        dependency: 'mainReleaseTrack',
+        value: input.value(false),
+      }),
+
+      withPropertyFromObject({
+        object: 'mainReleaseTrack',
+        property: input.value('name'),
+      }),
+
+      {
+        dependencies: ['name', '#mainReleaseTrack.name'],
+        compute: ({
+          ['name']: name,
+          ['#mainReleaseTrack.name']: mainReleaseName,
+        }) =>
+          getKebabCase(name) ===
+          getKebabCase(mainReleaseName),
+      },
+    ],
 
     // Album or track. The exposed value is really just what's provided here,
     // whether or not a matching track is found on a provided album, for