« 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/composite
diff options
context:
space:
mode:
Diffstat (limited to 'src/data/composite')
-rw-r--r--src/data/composite/wiki-properties/color.js28
-rw-r--r--src/data/composite/wiki-properties/fileExtension.js29
-rw-r--r--src/data/composite/wiki-properties/flag.js30
-rw-r--r--src/data/composite/wiki-properties/name.js28
4 files changed, 83 insertions, 32 deletions
diff --git a/src/data/composite/wiki-properties/color.js b/src/data/composite/wiki-properties/color.js
index 1bc9888b..e7fe472a 100644
--- a/src/data/composite/wiki-properties/color.js
+++ b/src/data/composite/wiki-properties/color.js
@@ -1,12 +1,26 @@
 // A color! This'll be some CSS-ready value.
 
+import {input, templateCompositeFrom} from '#composite';
 import {isColor} from '#validators';
 
-// TODO: Not templateCompositeFrom.
+export default templateCompositeFrom({
+  annotation: 'color',
 
-export default function() {
-  return {
-    flags: {update: true, expose: true},
-    update: {validate: isColor},
-  };
-}
+  compose: false,
+
+  inputs: {
+    default: input({validate: isColor, defaultValue: null}),
+  },
+
+  update: {
+    validate: isColor,
+  },
+
+  steps: () => [
+    {
+      dependencies: [input('default')],
+      transform: (value, {[input('default')]: defaultValue}) =>
+        value ?? defaultValue,
+    },
+  ],
+});
\ No newline at end of file
diff --git a/src/data/composite/wiki-properties/fileExtension.js b/src/data/composite/wiki-properties/fileExtension.js
index c926fa8b..fa933f56 100644
--- a/src/data/composite/wiki-properties/fileExtension.js
+++ b/src/data/composite/wiki-properties/fileExtension.js
@@ -1,13 +1,26 @@
 // A file extension! Or the default, if provided when calling this.
 
+import {input, templateCompositeFrom} from '#composite';
 import {isFileExtension} from '#validators';
 
-// TODO: Not templateCompositeFrom.
+export default templateCompositeFrom({
+  annotation: 'name',
 
-export default function(defaultFileExtension = null) {
-  return {
-    flags: {update: true, expose: true},
-    update: {validate: isFileExtension},
-    expose: {transform: (value) => value ?? defaultFileExtension},
-  };
-}
+  compose: false,
+
+  inputs: {
+    default: input({validate: isFileExtension, acceptsNull: true}),
+  },
+
+  update: {
+    validate: isFileExtension,
+  },
+
+  steps: () => [
+    {
+      dependencies: [input('default')],
+      transform: (value, {[input('default')]: defaultValue}) =>
+        value ?? defaultValue,
+    },
+  ],
+});
\ No newline at end of file
diff --git a/src/data/composite/wiki-properties/flag.js b/src/data/composite/wiki-properties/flag.js
index 076e663f..fa787f92 100644
--- a/src/data/composite/wiki-properties/flag.js
+++ b/src/data/composite/wiki-properties/flag.js
@@ -1,19 +1,27 @@
 // Straightforward flag descriptor for a variety of property purposes.
 // Provide a default value, true or false!
 
+import {input, templateCompositeFrom} from '#composite';
 import {isBoolean} from '#validators';
 
-// TODO: Not templateCompositeFrom.
+export default templateCompositeFrom({
+  annotation: 'flag',
 
-// TODO: The description is a lie. This defaults to false. Bad.
+  compose: false,
 
-export default function(defaultValue = false) {
-  if (typeof defaultValue !== 'boolean') {
-    throw new TypeError(`Always set explicit defaults for flags!`);
-  }
+  inputs: {
+    default: input({type: 'boolean'}),
+  },
 
-  return {
-    flags: {update: true, expose: true},
-    update: {validate: isBoolean, default: defaultValue},
-  };
-}
+  update: {
+    validate: isBoolean,
+  },
+
+  steps: () => [
+    {
+      dependencies: [input('default')],
+      transform: (value, {[input('default')]: defaultValue}) =>
+        value ?? defaultValue,
+    },
+  ],
+});
\ No newline at end of file
diff --git a/src/data/composite/wiki-properties/name.js b/src/data/composite/wiki-properties/name.js
index 5146488b..e4a28860 100644
--- a/src/data/composite/wiki-properties/name.js
+++ b/src/data/composite/wiki-properties/name.js
@@ -1,11 +1,27 @@
 // A wiki data object's name! Its directory (i.e. unique identifier) will be
 // computed based on this value if not otherwise specified.
 
+import {input, templateCompositeFrom} from '#composite';
 import {isName} from '#validators';
 
-export default function(defaultName) {
-  return {
-    flags: {update: true, expose: true},
-    update: {validate: isName, default: defaultName},
-  };
-}
+export default templateCompositeFrom({
+  annotation: 'name',
+
+  compose: false,
+
+  inputs: {
+    default: input({type: 'string'}),
+  },
+
+  update: {
+    validate: isName,
+  },
+
+  steps: () => [
+    {
+      dependencies: [input('default')],
+      transform: (value, {[input('default')]: defaultValue}) =>
+        value ?? defaultValue,
+    },
+  ],
+});
\ No newline at end of file