« get me outta code hell

contracts: initial commit - 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>2023-05-02 14:58:27 -0300
committer(quasar) nebula <qznebula@protonmail.com>2023-05-02 14:58:54 -0300
commit4280c6240b88dadc8e5ea187b78c10aca9dfc163 (patch)
tree93ea9f2986fc378e7054c99f7e59c536cc2d5e20
parentbf6bff764880f96597f915bd9a59abfaaf310db1 (diff)
contracts: initial commit
All draft stuff here for now, but this is *relatively* un-naive
as it's based on a lot of recent research and discussion.
But none of this code is evaluated yet!!
-rw-r--r--src/content/contracts/adjacentAlbumsInGroup.js17
-rw-r--r--src/content/dependencies/generateAlbumSidebar.js46
-rw-r--r--src/content/dependencies/generateAlbumSidebarGroupBox.js22
-rw-r--r--src/contract.js5
4 files changed, 69 insertions, 21 deletions
diff --git a/src/content/contracts/adjacentAlbumsInGroup.js b/src/content/contracts/adjacentAlbumsInGroup.js
new file mode 100644
index 00000000..e982fa5b
--- /dev/null
+++ b/src/content/contracts/adjacentAlbumsInGroup.js
@@ -0,0 +1,17 @@
+export default {
+  hook(contract, [album, group]) {
+    contract.provide({
+      group,
+      album,
+      albums: contract.selectProperty(group, 'albums'),
+    });
+  },
+
+  compute({group, album, albums}) {
+    const datedAlbums = albums.filter(album => album.date);
+    const index = datedAlbums.indexOf(album);
+    const previousAlbum = (index > 0) && datedAlbums[index - 1];
+    const nextAlbum = (index < datedAlbums.length - 1) && datedAlbums[index + 1];
+    return {previousAlbum, nextAlbum};
+  },
+};
diff --git a/src/content/dependencies/generateAlbumSidebar.js b/src/content/dependencies/generateAlbumSidebar.js
index bf6b091a..4eef62b2 100644
--- a/src/content/dependencies/generateAlbumSidebar.js
+++ b/src/content/dependencies/generateAlbumSidebar.js
@@ -7,26 +7,44 @@ export default {
 
   extraDependencies: ['html'],
 
+  contracts: {
+    relations: {
+      hook(contract, [relation, album, track]) {
+        contract.provide({
+          relation, album, track,
 
-  relations(relation, album, track) {
-    const relations = {};
+          groups: contract.selectProperty(album, 'groups'),
+          trackSections: contract.selectProperty(album, 'trackSections'),
+        });
+      },
 
-    relations.albumLink =
-      relation('linkAlbum', album);
+      compute({relation, album, track, groups, trackSections}) {
+        const relations = {};
 
-    relations.groupBoxes =
-      album.groups.map(group =>
-        relation('generateAlbumSidebarGroupBox', album, group));
+        relations.albumLink =
+          relation('linkAlbum', album);
 
-    relations.trackSections =
-      album.trackSections.map(trackSection =>
-        relation('generateAlbumSidebarTrackSection', album, track, trackSection));
+        relations.groupBoxes =
+          groups.map(group =>
+            relation('generateAlbumSidebarGroupBox', album, group));
 
-    return relations;
-  },
+        relations.trackSections =
+          trackSections.map(trackSection =>
+            relation('generateAlbumSidebarTrackSection', album, track, trackSection));
+
+        return relations;
+      },
+    },
+
+    data: {
+      hook(contract, [album, track]) {
+        contract.provide({track});
+      },
 
-  data(album, track) {
-    return {isAlbumPage: !track};
+      compute({track}) {
+        return {isAlbumPage: !track};
+      },
+    },
   },
 
   generate(data, relations, {html}) {
diff --git a/src/content/dependencies/generateAlbumSidebarGroupBox.js b/src/content/dependencies/generateAlbumSidebarGroupBox.js
index 0679e8fc..4e46c931 100644
--- a/src/content/dependencies/generateAlbumSidebarGroupBox.js
+++ b/src/content/dependencies/generateAlbumSidebarGroupBox.js
@@ -4,20 +4,28 @@ export default {
   contentDependencies: ['linkAlbum', 'linkExternal', 'linkGroup'],
   extraDependencies: ['html', 'language', 'transformMultiline'],
 
-  relations(relation, album, group) {
+  contracts: {
+    relations(contract, [album, group]) {
+      contract.provide({
+        group, album,
+
+        urls: contract.selectProperty(group, 'urls'),
+        adjacentAlbums: contract.subcontract('adjacentAlbumsInGroup', album, group),
+      });
+    },
+  },
+
+  relations(relation, {group, album, urls, adjacentAlbums}) {
     const relations = {};
 
     relations.groupLink =
       relation('linkGroup', group);
 
     relations.externalLinks =
-      group.urls.map(url =>
-        relation('linkExternal', url));
+      urls.map(url =>
+        relation('linkExternal', urls));
 
-    const albums = group.albums.filter(album => album.date);
-    const index = albums.indexOf(album);
-    const previousAlbum = (index > 0) && albums[index - 1];
-    const nextAlbum = (index < albums.length - 1) && albums[index + 1];
+    const {previousAlbum, nextAlbum} = adjacentAlbums;
 
     if (previousAlbum) {
       relations.previousAlbumLink =
diff --git a/src/contract.js b/src/contract.js
new file mode 100644
index 00000000..24a2fd53
--- /dev/null
+++ b/src/contract.js
@@ -0,0 +1,5 @@
+export default class Contract {
+  #caches = {};
+
+  hire() {},
+}