« get me outta code hell

data: AdditionalName - 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>2025-05-16 15:40:15 -0300
committer(quasar) nebula <qznebula@protonmail.com>2025-05-16 15:40:15 -0300
commit613522d60b16aedf6893ee3a7d4aeeb539b31230 (patch)
tree0364f9d92d8aa049b253616eeb9d3e27e72dc6cd
parent30fbe117d5a08b8e5f1963e91fbd930935cc5a58 (diff)
data: AdditionalName
-rw-r--r--src/data/composite/wiki-properties/additionalNameList.js14
-rw-r--r--src/data/composite/wiki-properties/index.js1
-rw-r--r--src/data/things/additional-name.js21
-rw-r--r--src/data/things/album.js6
-rw-r--r--src/data/things/art-tag.js12
-rw-r--r--src/data/things/flash.js6
-rw-r--r--src/data/things/index.js2
-rw-r--r--src/data/things/track.js6
-rw-r--r--src/data/yaml.js18
-rw-r--r--src/validators.js11
10 files changed, 59 insertions, 38 deletions
diff --git a/src/data/composite/wiki-properties/additionalNameList.js b/src/data/composite/wiki-properties/additionalNameList.js
deleted file mode 100644
index c5971d4a..00000000
--- a/src/data/composite/wiki-properties/additionalNameList.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// A list of additional names! These can be used for a variety of purposes,
-// e.g. providing extra searchable titles, localizations, romanizations or
-// original titles, and so on. Each item has a name and, optionally, a
-// descriptive annotation.
-
-import {isAdditionalNameList} from '#validators';
-
-export default function() {
-  return {
-    flags: {update: true, expose: true},
-    update: {validate: isAdditionalNameList},
-    expose: {transform: value => value ?? []},
-  };
-}
diff --git a/src/data/composite/wiki-properties/index.js b/src/data/composite/wiki-properties/index.js
index b45eef13..9d7f1aed 100644
--- a/src/data/composite/wiki-properties/index.js
+++ b/src/data/composite/wiki-properties/index.js
@@ -3,7 +3,6 @@
 // Entries here may depend on entries in #composite/control-flow,
 // #composite/data, and #composite/wiki-data.
 
-export {default as additionalNameList} from './additionalNameList.js';
 export {default as annotatedReferenceList} from './annotatedReferenceList.js';
 export {default as color} from './color.js';
 export {default as commentatorArtists} from './commentatorArtists.js';
diff --git a/src/data/things/additional-name.js b/src/data/things/additional-name.js
new file mode 100644
index 00000000..b96fcd50
--- /dev/null
+++ b/src/data/things/additional-name.js
@@ -0,0 +1,21 @@
+import Thing from '#thing';
+
+import {contentString, simpleString, thing} from '#composite/wiki-properties';
+
+export class AdditionalName extends Thing {
+  static [Thing.getPropertyDescriptors] = ({}) => ({
+    // Update & expose
+
+    thing: thing(),
+
+    name: contentString(),
+    annotation: contentString(),
+  });
+
+  static [Thing.yamlDocumentSpec] = {
+    fields: {
+      'Name': {property: 'name'},
+      'Annotation': {property: 'annotation'},
+    },
+  };
+}
diff --git a/src/data/things/album.js b/src/data/things/album.js
index 2274c92a..7a7b387d 100644
--- a/src/data/things/album.js
+++ b/src/data/things/album.js
@@ -33,7 +33,6 @@ import {exitWithoutContribs, withDirectory, withCoverArtDate}
   from '#composite/wiki-data';
 
 import {
-  additionalNameList,
   color,
   commentatorArtists,
   constitutibleArtwork,
@@ -69,6 +68,7 @@ export class Album extends Thing {
 
   static [Thing.getPropertyDescriptors] = ({
     AdditionalFile,
+    AdditionalName,
     ArtTag,
     Artwork,
     CommentaryEntry,
@@ -102,7 +102,9 @@ export class Album extends Thing {
     color: color(),
     urls: urls(),
 
-    additionalNames: additionalNameList(),
+    additionalNames: thingList({
+      class: input.value(AdditionalName),
+    }),
 
     bandcampAlbumIdentifier: simpleString(),
     bandcampArtworkIdentifier: simpleString(),
diff --git a/src/data/things/art-tag.js b/src/data/things/art-tag.js
index 57e156ee..0ec1ff31 100644
--- a/src/data/things/art-tag.js
+++ b/src/data/things/art-tag.js
@@ -12,7 +12,6 @@ import {exitWithoutDependency, exposeDependency, exposeUpdateValueOrContinue}
   from '#composite/control-flow';
 
 import {
-  additionalNameList,
   annotatedReferenceList,
   color,
   contentString,
@@ -23,6 +22,7 @@ import {
   name,
   soupyFind,
   soupyReverse,
+  thingList,
   urls,
   wikiData,
 } from '#composite/wiki-properties';
@@ -34,7 +34,11 @@ export class ArtTag extends Thing {
   static [Thing.referenceType] = 'tag';
   static [Thing.friendlyName] = `Art Tag`;
 
-  static [Thing.getPropertyDescriptors] = ({Album, Track}) => ({
+  static [Thing.getPropertyDescriptors] = ({
+    AdditionalName,
+    Album,
+    Track,
+  }) => ({
     // Update & expose
 
     name: name('Unnamed Art Tag'),
@@ -55,7 +59,9 @@ export class ArtTag extends Thing {
       },
     ],
 
-    additionalNames: additionalNameList(),
+    additionalNames: thingList({
+      class: input.value(AdditionalName),
+    }),
 
     description: contentString(),
 
diff --git a/src/data/things/flash.js b/src/data/things/flash.js
index a0bcb523..11b19ebc 100644
--- a/src/data/things/flash.js
+++ b/src/data/things/flash.js
@@ -27,7 +27,6 @@ import {
 } from '#composite/control-flow';
 
 import {
-  additionalNameList,
   color,
   commentatorArtists,
   constitutibleArtwork,
@@ -54,6 +53,7 @@ export class Flash extends Thing {
   static [Thing.referenceType] = 'flash';
 
   static [Thing.getPropertyDescriptors] = ({
+    AdditionalName,
     CommentaryEntry,
     CreditingSourcesEntry,
     Track,
@@ -127,7 +127,9 @@ export class Flash extends Thing {
 
     urls: urls(),
 
-    additionalNames: additionalNameList(),
+    additionalNames: thingList({
+      class: input.value(AdditionalName),
+    }),
 
     commentary: thingList({
       class: input.value(CommentaryEntry),
diff --git a/src/data/things/index.js b/src/data/things/index.js
index 3fda2bd1..11307b50 100644
--- a/src/data/things/index.js
+++ b/src/data/things/index.js
@@ -10,6 +10,7 @@ import {withEntries} from '#sugar';
 import Thing from '#thing';
 
 import * as additionalFileClasses from './additional-file.js';
+import * as additionalNameClasses from './additional-name.js';
 import * as albumClasses from './album.js';
 import * as artTagClasses from './art-tag.js';
 import * as artistClasses from './artist.js';
@@ -28,6 +29,7 @@ import * as wikiInfoClasses from './wiki-info.js';
 
 const allClassLists = {
   'additional-file.js': additionalFileClasses,
+  'additional-name.js': additionalNameClasses,
   'album.js': albumClasses,
   'art-tag.js': artTagClasses,
   'artist.js': artistClasses,
diff --git a/src/data/things/track.js b/src/data/things/track.js
index 8072c3cb..557ba2a7 100644
--- a/src/data/things/track.js
+++ b/src/data/things/track.js
@@ -38,7 +38,6 @@ import {
 } from '#composite/wiki-data';
 
 import {
-  additionalNameList,
   commentatorArtists,
   constitutibleArtworkList,
   contentString,
@@ -86,6 +85,7 @@ export class Track extends Thing {
 
   static [Thing.getPropertyDescriptors] = ({
     AdditionalFile,
+    AdditionalName,
     Album,
     ArtTag,
     Artwork,
@@ -134,7 +134,9 @@ export class Track extends Thing {
       class: input.value(Album),
     }),
 
-    additionalNames: additionalNameList(),
+    additionalNames: thingList({
+      class: input.value(AdditionalName),
+    }),
 
     bandcampTrackIdentifier: simpleString(),
     bandcampArtworkIdentifier: simpleString(),
diff --git a/src/data/yaml.js b/src/data/yaml.js
index f3ba3f3b..45694237 100644
--- a/src/data/yaml.js
+++ b/src/data/yaml.js
@@ -619,23 +619,23 @@ export function parseAdditionalFiles(entries, {subdoc, AdditionalFile}) {
   });
 }
 
-export function parseAdditionalNames(entries) {
+export function parseAdditionalNames(entries, {subdoc, AdditionalName}) {
   return parseArrayEntries(entries, item => {
-    if (typeof item === 'object' && typeof item['Name'] === 'string')
-      return {
-        name: item['Name'],
-        annotation: item['Annotation'] ?? null,
-      };
+    if (typeof item === 'object') {
+      return subdoc(AdditionalName, item, {bindInto: 'thing'});
+    }
 
     if (typeof item !== 'string') return item;
 
     const match = item.match(extractAccentRegex);
     if (!match) return item;
 
-    return {
-      name: match.groups.main,
-      annotation: match.groups.accent ?? null,
+    const document = {
+      ['Name']: match.groups.main,
+      ['Annotation']: match.groups.accent ?? null,
     };
+
+    return subdoc(AdditionalName, document, {bindInto: 'thing'});
   });
 }
 
diff --git a/src/validators.js b/src/validators.js
index 3756acb9..d45560fc 100644
--- a/src/validators.js
+++ b/src/validators.js
@@ -979,12 +979,13 @@ export function validateWikiData({
   };
 }
 
-export const isAdditionalName = validateProperties({
-  name: isContentString,
-  annotation: optional(isContentString),
-});
+export function isAdditionalName() {
+  throw new Error('deprecated');
+}
 
-export const isAdditionalNameList = validateArrayItems(isAdditionalName);
+export function isAdditionalNameList() {
+  throw new Error('deprecated');
+}
 
 // Compositional utilities