« get me outta code hell

hsmusic-wiki - HSMusic - static wiki software cataloguing collaborative creation
about summary refs log tree commit diff
path: root/src/data
diff options
context:
space:
mode:
Diffstat (limited to 'src/data')
-rw-r--r--src/data/composite.js54
-rw-r--r--src/data/composite/control-flow/exitWithoutUpdateValue.js2
-rw-r--r--src/data/composite/wiki-data/splitContentNodesAround.js2
-rw-r--r--src/data/composite/wiki-data/withResolvedAnnotatedReferenceList.js8
-rw-r--r--src/data/composite/wiki-data/withResolvedContribs.js1
-rw-r--r--src/data/composite/wiki-properties/annotatedReferenceList.js8
-rw-r--r--src/data/composite/wiki-properties/commentatorArtists.js5
-rw-r--r--src/data/composite/wiki-properties/contributionList.js3
-rw-r--r--src/data/things/album.js3
-rw-r--r--src/data/things/flash.js1
-rw-r--r--src/data/things/track.js4
-rw-r--r--src/data/things/wiki-info.js5
12 files changed, 63 insertions, 33 deletions
diff --git a/src/data/composite.js b/src/data/composite.js
index d3848806..8ac906c7 100644
--- a/src/data/composite.js
+++ b/src/data/composite.js
@@ -230,7 +230,14 @@ export function templateCompositeFrom(description) {
       ? Object.keys(description.inputs)
       : []);
 
-  const positionalInputNames = expectedInputNames;
+  const optionalInputNames =
+    expectedInputNames.filter(name => {
+      const inputDescription = getInputTokenValue(description.inputs[name]);
+      if (!inputDescription) return false;
+      if ('defaultValue' in inputDescription) return true;
+      if ('defaultDependency' in inputDescription) return true;
+      return false;
+    });
 
   const instantiate = (...args) => {
     const preparedInputs = {};
@@ -245,13 +252,14 @@ export function templateCompositeFrom(description) {
 
       const expresslyProvidedInputNames = Object.keys(namedInputs);
       const positionallyProvidedInputNames = [];
+      const remainingInputNames = expectedInputNames.slice();
 
       const apparentInputRoutes = {};
 
       const wrongTypeInputPositions = [];
       const namedAndPositionalConflictInputPositions = [];
 
-      const maximumPositionalInputs = positionalInputNames.length;
+      const maximumPositionalInputs = expectedInputNames.length;
       const lastPossiblePositionalIndex = maximumPositionalInputs - 1;
 
       for (const [index, value] of positionalInputs.entries()) {
@@ -269,7 +277,7 @@ export function templateCompositeFrom(description) {
           continue;
         }
 
-        const correspondingName = expectedInputNames[index];
+        const correspondingName = remainingInputNames.shift();
         if (expresslyProvidedInputNames.includes(correspondingName)) {
           namedAndPositionalConflictInputPositions.push(index);
           continue;
@@ -289,6 +297,9 @@ export function templateCompositeFrom(description) {
           .filter(name => !expectedInputNames.includes(name));
 
       const wrongTypeInputNames = [];
+      const skippedInputNames = [];
+      const passedInputNames = [];
+      const nameProvidedInputNames = [];
 
       for (const [name, value] of Object.entries(namedInputs)) {
         if (misplacedInputNames.includes(name)) {
@@ -301,8 +312,33 @@ export function templateCompositeFrom(description) {
           continue;
         }
 
+        const index = remainingInputNames.indexOf(name);
+        if (index === 0) {
+          passedInputNames.push(remainingInputNames.shift());
+        } else if (index === -1) {
+          // This input isn't misplaced, so it's an expected name,
+          // and SHOULD be in the list of remaining input names.
+          // But it isn't if it itself has already been skipped!
+          // And if so, that's already been tracked.
+        } else {
+          const til = remainingInputNames.splice(0, index);
+          passedInputNames.push(...til);
+
+          const skipped =
+            til.filter(name =>
+              !optionalInputNames.includes(name) ||
+              expresslyProvidedInputNames.includes(name));
+
+          if (!empty(skipped)) {
+            skippedInputNames.push({skipped, before: name});
+          }
+
+          passedInputNames.push(remainingInputNames.shift());
+        }
+
         preparedInputs[name] = value;
         apparentInputRoutes[name] = name;
+        nameProvidedInputNames.push(name);
       }
 
       const totalProvidedInputNames =
@@ -314,13 +350,7 @@ export function templateCompositeFrom(description) {
       const missingInputNames =
         expectedInputNames
           .filter(name => !totalProvidedInputNames.includes(name))
-          .filter(name => {
-            const inputDescription = getInputTokenValue(description.inputs[name]);
-            if (!inputDescription) return true;
-            if ('defaultValue' in inputDescription) return false;
-            if ('defaultDependency' in inputDescription) return false;
-            return true;
-          });
+          .filter(name => !optionalInputNames.includes(name));
 
       const expectedStaticValueInputNames = [];
       const expectedStaticDependencyInputNames = [];
@@ -389,6 +419,10 @@ export function templateCompositeFrom(description) {
         push(new Error(`${name}: Provided as both named and positional (i = ${index}) input`));
       }
 
+      for (const {skipped, before} of skippedInputNames) {
+        push(new Error(`Expected ${skipped.join(', ')} before ${before}`));
+      }
+
       for (const name of expectedStaticDependencyInputNames) {
         const appearance = inputAppearance(preparedInputs[name]);
         const route = apparentInputRoutes[name];
diff --git a/src/data/composite/control-flow/exitWithoutUpdateValue.js b/src/data/composite/control-flow/exitWithoutUpdateValue.js
index 3d9fbf76..5104a8c0 100644
--- a/src/data/composite/control-flow/exitWithoutUpdateValue.js
+++ b/src/data/composite/control-flow/exitWithoutUpdateValue.js
@@ -29,8 +29,8 @@ export default templateCompositeFrom({
   steps: () => [
     exitWithoutDependency({
       dependency: input.updateValue(),
-      mode: input('mode'),
       value: input('value'),
+      mode: input('mode'),
     }),
   ],
 });
diff --git a/src/data/composite/wiki-data/splitContentNodesAround.js b/src/data/composite/wiki-data/splitContentNodesAround.js
index afdbd3fa..f12bd8fc 100644
--- a/src/data/composite/wiki-data/splitContentNodesAround.js
+++ b/src/data/composite/wiki-data/splitContentNodesAround.js
@@ -42,8 +42,8 @@ export default templateCompositeFrom({
 
     withMappedList({
       list: '#separatorFilter',
-      filter: '#separatorFilter',
       map: input.value((_node, index) => index),
+      filter: '#separatorFilter',
     }),
 
     withFilteredList({
diff --git a/src/data/composite/wiki-data/withResolvedAnnotatedReferenceList.js b/src/data/composite/wiki-data/withResolvedAnnotatedReferenceList.js
index 670dc422..71bc56ac 100644
--- a/src/data/composite/wiki-data/withResolvedAnnotatedReferenceList.js
+++ b/src/data/composite/wiki-data/withResolvedAnnotatedReferenceList.js
@@ -23,14 +23,14 @@ export default templateCompositeFrom({
       acceptsNull: true,
     }),
 
-    reference: input({type: 'string', defaultValue: 'reference'}),
-    annotation: input({type: 'string', defaultValue: 'annotation'}),
-    thing: input({type: 'string', defaultValue: 'thing'}),
-
     data: inputWikiData({allowMixedTypes: true}),
     find: inputSoupyFind(),
     findOptions: inputFindOptions(),
 
+    reference: input({type: 'string', defaultValue: 'reference'}),
+    annotation: input({type: 'string', defaultValue: 'annotation'}),
+    thing: input({type: 'string', defaultValue: 'thing'}),
+
     notFoundMode: inputNotFoundMode(),
   },
 
diff --git a/src/data/composite/wiki-data/withResolvedContribs.js b/src/data/composite/wiki-data/withResolvedContribs.js
index 60b5d4c6..7729d5b6 100644
--- a/src/data/composite/wiki-data/withResolvedContribs.js
+++ b/src/data/composite/wiki-data/withResolvedContribs.js
@@ -28,6 +28,7 @@ export default templateCompositeFrom({
     date: input({
       validate: isDate,
       acceptsNull: true,
+      defaultDependency: 'date',
     }),
 
     notFoundMode: inputNotFoundMode(),
diff --git a/src/data/composite/wiki-properties/annotatedReferenceList.js b/src/data/composite/wiki-properties/annotatedReferenceList.js
index aea0f22c..918f8567 100644
--- a/src/data/composite/wiki-properties/annotatedReferenceList.js
+++ b/src/data/composite/wiki-properties/annotatedReferenceList.js
@@ -57,13 +57,13 @@ export default templateCompositeFrom({
     withResolvedAnnotatedReferenceList({
       list: input.updateValue(),
 
-      reference: input('reference'),
-      annotation: input('annotation'),
-      thing: input('thing'),
-
       data: input('data'),
       find: input('find'),
       findOptions: input('findOptions'),
+
+      reference: input('reference'),
+      annotation: input('annotation'),
+      thing: input('thing'),
     }),
 
     exposeDependency({dependency: '#resolvedAnnotatedReferenceList'}),
diff --git a/src/data/composite/wiki-properties/commentatorArtists.js b/src/data/composite/wiki-properties/commentatorArtists.js
index 54d3e1a5..44dee028 100644
--- a/src/data/composite/wiki-properties/commentatorArtists.js
+++ b/src/data/composite/wiki-properties/commentatorArtists.js
@@ -14,10 +14,9 @@ export default templateCompositeFrom({
   compose: false,
 
   steps: () => [
-    exitWithoutDependency({
-      dependency: 'commentary',
-      mode: input.value('falsy'),
+    exitWithoutDependency('commentary', {
       value: input.value([]),
+      mode: input.value('falsy'),
     }),
 
     withPropertyFromList({
diff --git a/src/data/composite/wiki-properties/contributionList.js b/src/data/composite/wiki-properties/contributionList.js
index d9a6b417..04f93b52 100644
--- a/src/data/composite/wiki-properties/contributionList.js
+++ b/src/data/composite/wiki-properties/contributionList.js
@@ -29,6 +29,7 @@ export default templateCompositeFrom({
     date: input({
       validate: isDate,
       acceptsNull: true,
+      defaultDependency: 'date',
     }),
 
     artistProperty: input({
@@ -42,9 +43,9 @@ export default templateCompositeFrom({
   steps: () => [
     withResolvedContribs({
       from: input.updateValue(),
+      date: input('date'),
       thingProperty: input.thisProperty(),
       artistProperty: input('artistProperty'),
-      date: input('date'),
     }),
 
     exposeDependencyOrContinue({
diff --git a/src/data/things/album.js b/src/data/things/album.js
index 0fdc6fa8..107d02c7 100644
--- a/src/data/things/album.js
+++ b/src/data/things/album.js
@@ -141,7 +141,6 @@ export class Album extends Thing {
     // > Update & expose - Credits and contributors
 
     artistContribs: contributionList({
-      date: '_date',
       artistProperty: input.value('albumArtistContributions'),
     }),
 
@@ -152,7 +151,6 @@ export class Album extends Thing {
         from: input.updateValue({validate: isContributionList}),
         thingProperty: input.thisProperty(),
         artistProperty: input.value('albumTrackArtistContributions'),
-        date: '_date',
       }).outputs({
         '#resolvedContribs': '#trackArtistContribs',
       }),
@@ -163,7 +161,6 @@ export class Album extends Thing {
         from: '_artistContribs',
         thingProperty: input.thisProperty(),
         artistProperty: input.value('albumTrackArtistContributions'),
-        date: 'date',
       }).outputs({
         '#resolvedContribs': '#trackArtistContribs',
       }),
diff --git a/src/data/things/flash.js b/src/data/things/flash.js
index cb791ef8..b595ec58 100644
--- a/src/data/things/flash.js
+++ b/src/data/things/flash.js
@@ -111,7 +111,6 @@ export class Flash extends Thing {
         .call(this, 'Cover Artwork'),
 
     contributorContribs: contributionList({
-      date: 'date',
       artistProperty: input.value('flashContributorContributions'),
     }),
 
diff --git a/src/data/things/track.js b/src/data/things/track.js
index 37639eee..1095cce9 100644
--- a/src/data/things/track.js
+++ b/src/data/things/track.js
@@ -293,9 +293,9 @@ export class Track extends Thing {
     artistContribs: [
       withResolvedContribs({
         from: input.updateValue({validate: isContributionList}),
+        date: 'date',
         thingProperty: input.thisProperty(),
         artistProperty: input.value('trackArtistContributions'),
-        date: 'date',
       }).outputs({
         '#resolvedContribs': '#artistContribs',
       }),
@@ -404,9 +404,9 @@ export class Track extends Thing {
 
       withResolvedContribs({
         from: input.updateValue({validate: isContributionList}),
+        date: 'coverArtDate',
         thingProperty: input.value('coverArtistContribs'),
         artistProperty: input.value('trackCoverArtistContributions'),
-        date: 'coverArtDate',
       }),
 
       exposeDependencyOrContinue('#resolvedContribs', V('empty')),
diff --git a/src/data/things/wiki-info.js b/src/data/things/wiki-info.js
index 96ae95f0..26b69ba6 100644
--- a/src/data/things/wiki-info.js
+++ b/src/data/things/wiki-info.js
@@ -79,10 +79,9 @@ export class WikiInfo extends Thing {
     enableGroupUI: flag(V(false)),
 
     enableSearch: [
-      exitWithoutDependency({
-        dependency: '_searchDataAvailable',
-        mode: input.value('falsy'),
+      exitWithoutDependency('_searchDataAvailable', {
         value: input.value(false),
+        mode: input.value('falsy'),
       }),
 
       flag(V(true)),