diff options
| author | (quasar) nebula <qznebula@protonmail.com> | 2025-12-06 13:55:33 -0400 |
|---|---|---|
| committer | (quasar) nebula <qznebula@protonmail.com> | 2025-12-06 13:55:33 -0400 |
| commit | 722fe82043e74bdb7c10ed214a9f3006a26ff42b (patch) | |
| tree | 2949fa4b4235acef5cf0b012c6071d7ed0b57bf2 /src/data | |
| parent | c7cc130f97c2a0f390ba0e07e3aa048395636817 (diff) | |
data: make various wiki-properties fn's into compositions
Diffstat (limited to 'src/data')
| -rw-r--r-- | src/data/composite/wiki-properties/color.js | 28 | ||||
| -rw-r--r-- | src/data/composite/wiki-properties/fileExtension.js | 29 | ||||
| -rw-r--r-- | src/data/composite/wiki-properties/flag.js | 30 | ||||
| -rw-r--r-- | src/data/composite/wiki-properties/name.js | 28 | ||||
| -rw-r--r-- | src/data/things/album.js | 32 | ||||
| -rw-r--r-- | src/data/things/art-tag.js | 4 | ||||
| -rw-r--r-- | src/data/things/artist.js | 8 | ||||
| -rw-r--r-- | src/data/things/artwork.js | 2 | ||||
| -rw-r--r-- | src/data/things/flash.js | 8 | ||||
| -rw-r--r-- | src/data/things/group.js | 10 | ||||
| -rw-r--r-- | src/data/things/homepage-layout.js | 2 | ||||
| -rw-r--r-- | src/data/things/language.js | 4 | ||||
| -rw-r--r-- | src/data/things/news-entry.js | 2 | ||||
| -rw-r--r-- | src/data/things/sorting-rule.js | 2 | ||||
| -rw-r--r-- | src/data/things/static-page.js | 4 | ||||
| -rw-r--r-- | src/data/things/track.js | 6 | ||||
| -rw-r--r-- | src/data/things/wiki-info.js | 36 |
17 files changed, 137 insertions, 98 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 diff --git a/src/data/things/album.js b/src/data/things/album.js index 5f5492ce..ee25e59e 100644 --- a/src/data/things/album.js +++ b/src/data/things/album.js @@ -106,7 +106,7 @@ export class Album extends Thing { // > Update & expose - Identifying metadata - name: name('Unnamed Album'), + name: name(V('Unnamed Album')), directory: directory(), directorySuffix: [ @@ -117,9 +117,9 @@ export class Album extends Thing { exposeDependency('directory'), ], - alwaysReferenceByDirectory: flag(false), - alwaysReferenceTracksByDirectory: flag(false), - suffixTrackDirectories: flag(false), + alwaysReferenceByDirectory: flag(V(false)), + alwaysReferenceTracksByDirectory: flag(V(false)), + suffixTrackDirectories: flag(V(false)), style: [ exposeUpdateValueOrContinue({ @@ -177,15 +177,15 @@ export class Album extends Thing { // > Update & expose - General configuration - countTracksInArtistTotals: flag(true), + countTracksInArtistTotals: flag(V(true)), - showAlbumInTracksWithoutArtists: flag(false), + showAlbumInTracksWithoutArtists: flag(V(false)), - hasTrackNumbers: flag(true), - isListedOnHomepage: flag(true), - isListedInGalleries: flag(true), + hasTrackNumbers: flag(V(true)), + isListedOnHomepage: flag(V(true)), + isListedInGalleries: flag(V(true)), - hideDuration: flag(false), + hideDuration: flag(V(false)), // > Update & expose - General metadata @@ -229,7 +229,7 @@ export class Album extends Thing { mode: input.value('falsy'), }), - fileExtension('jpg'), + fileExtension(V('jpg')), ], coverArtDimensions: [ @@ -274,7 +274,7 @@ export class Album extends Thing { trackArtDate: simpleDate(), - trackCoverArtFileExtension: fileExtension('jpg'), + trackCoverArtFileExtension: fileExtension(V('jpg')), trackDimensions: dimensions(), @@ -299,7 +299,7 @@ export class Album extends Thing { mode: input.value('falsy'), }), - fileExtension('jpg'), + fileExtension(V('jpg')), ], wallpaperStyle: [ @@ -341,7 +341,7 @@ export class Album extends Thing { mode: input.value('falsy'), }), - fileExtension('jpg'), + fileExtension(V('jpg')), ], bannerDimensions: [ @@ -959,7 +959,7 @@ export class TrackSection extends Thing { class: input.value(Album), }), - name: name('Unnamed Track Section'), + name: name(V('Unnamed Track Section')), unqualifiedDirectory: directory(), @@ -1055,7 +1055,7 @@ export class TrackSection extends Thing { exposeDependency({dependency: '#album.countTracksInArtistTotals'}), ], - isDefaultTrackSection: flag(false), + isDefaultTrackSection: flag(V(false)), description: contentString(), diff --git a/src/data/things/art-tag.js b/src/data/things/art-tag.js index 9c2740ed..998aa064 100644 --- a/src/data/things/art-tag.js +++ b/src/data/things/art-tag.js @@ -41,10 +41,10 @@ export class ArtTag extends Thing { static [Thing.getPropertyDescriptors] = ({AdditionalName}) => ({ // Update & expose - name: name('Unnamed Art Tag'), + name: name(V('Unnamed Art Tag')), directory: directory(), color: color(), - isContentWarning: flag(false), + isContentWarning: flag(V(false)), extraReadingURLs: urls(), nameShort: [ diff --git a/src/data/things/artist.js b/src/data/things/artist.js index ce68d42d..1e7ef0e5 100644 --- a/src/data/things/artist.js +++ b/src/data/things/artist.js @@ -46,14 +46,14 @@ export class Artist extends Thing { static [Thing.getPropertyDescriptors] = () => ({ // Update & expose - name: name('Unnamed Artist'), + name: name(V('Unnamed Artist')), directory: directory(), urls: urls(), contextNotes: contentString(), - hasAvatar: flag(false), - avatarFileExtension: fileExtension('jpg'), + hasAvatar: flag(V(false)), + avatarFileExtension: fileExtension(V('jpg')), avatarArtwork: [ exitWithoutDependency('hasAvatar', { @@ -65,7 +65,7 @@ export class Artist extends Thing { .call(this, 'Avatar Artwork'), ], - isAlias: flag(), + isAlias: flag(V(false)), artistAliases: thingList({ class: input.value(Artist), diff --git a/src/data/things/artwork.js b/src/data/things/artwork.js index 579d2299..7a6c3cfb 100644 --- a/src/data/things/artwork.js +++ b/src/data/things/artwork.js @@ -120,7 +120,7 @@ export class Artwork extends Thing { constituteFrom('thing', 'dimensionsFromThingProperty'), ], - attachAbove: flag(false), + attachAbove: flag(V(false)), artistContribsFromThingProperty: simpleString(), artistContribsArtistProperty: simpleString(), diff --git a/src/data/things/flash.js b/src/data/things/flash.js index 738df937..5610dadc 100644 --- a/src/data/things/flash.js +++ b/src/data/things/flash.js @@ -65,7 +65,7 @@ export class Flash extends Thing { class: input.value(FlashAct), }), - name: name('Unnamed Flash'), + name: name(V('Unnamed Flash')), directory: { flags: {update: true, expose: true}, @@ -104,7 +104,7 @@ export class Flash extends Thing { date: simpleDate(), - coverArtFileExtension: fileExtension('jpg'), + coverArtFileExtension: fileExtension(V('jpg')), coverArtDimensions: dimensions(), @@ -275,7 +275,7 @@ export class FlashAct extends Thing { class: input.value(FlashSide), }), - name: name('Unnamed Flash Act'), + name: name(V('Unnamed Flash Act')), directory: directory(), color: color(), @@ -339,7 +339,7 @@ export class FlashSide extends Thing { static [Thing.getPropertyDescriptors] = ({FlashAct}) => ({ // Update & expose - name: name('Unnamed Flash Side'), + name: name(V('Unnamed Flash Side')), directory: directory(), color: color(), listTerminology: contentString(), diff --git a/src/data/things/group.js b/src/data/things/group.js index 20a74fa1..b7fe49e5 100644 --- a/src/data/things/group.js +++ b/src/data/things/group.js @@ -39,7 +39,7 @@ export class Group extends Thing { static [Thing.getPropertyDescriptors] = ({Album, Artist, Series}) => ({ // Update & expose - name: name('Unnamed Group'), + name: name(V('Unnamed Group')), directory: directory(), excludeFromGalleryTabs: [ @@ -59,7 +59,7 @@ export class Group extends Thing { exposeConstant(V(false)), ], - divideAlbumsByStyle: flag(false), + divideAlbumsByStyle: flag(V(false)), description: contentString(), @@ -246,10 +246,10 @@ export class GroupCategory extends Thing { static [Thing.getPropertyDescriptors] = ({Group}) => ({ // Update & expose - name: name('Unnamed Group Category'), + name: name(V('Unnamed Group Category')), directory: directory(), - excludeGroupsFromGalleryTabs: flag(false), + excludeGroupsFromGalleryTabs: flag(V(false)), color: color(), @@ -295,7 +295,7 @@ export class Series extends Thing { static [Thing.getPropertyDescriptors] = ({Album, Group}) => ({ // Update & expose - name: name('Unnamed Series'), + name: name(V('Unnamed Series')), showAlbumArtists: { flags: {update: true, expose: true}, diff --git a/src/data/things/homepage-layout.js b/src/data/things/homepage-layout.js index 70505af6..c0a2aea1 100644 --- a/src/data/things/homepage-layout.js +++ b/src/data/things/homepage-layout.js @@ -153,7 +153,7 @@ export class HomepageLayoutSection extends Thing { static [Thing.getPropertyDescriptors] = ({HomepageLayoutRow}) => ({ // Update & expose - name: name(`Unnamed Homepage Section`), + name: name(V(`Unnamed Homepage Section`)), color: color(), diff --git a/src/data/things/language.js b/src/data/things/language.js index 1e22ead6..7f3f43de 100644 --- a/src/data/things/language.js +++ b/src/data/things/language.js @@ -35,7 +35,7 @@ export class Language extends Thing { // Human-readable name. This should be the language's own native name, not // localized to any other language. - name: name(`Unnamed Language`), + name: name(V(`Unnamed Language`)), // Language code specific to JavaScript's Internationalization (Intl) API. // Usually this will be the same as the language's general code, but it @@ -57,7 +57,7 @@ export class Language extends Thing { // with languages that are currently in development and not ready for // formal release, or which are just kept hidden as "experimental zones" // for wiki development or content testing. - hidden: flag(false), + hidden: flag(V(false)), // Mapping of translation keys to values (strings). Generally, don't // access this object directly - use methods instead. diff --git a/src/data/things/news-entry.js b/src/data/things/news-entry.js index 54362d06..bb35d11b 100644 --- a/src/data/things/news-entry.js +++ b/src/data/things/news-entry.js @@ -17,7 +17,7 @@ export class NewsEntry extends Thing { static [Thing.getPropertyDescriptors] = () => ({ // Update & expose - name: name('Unnamed News Entry'), + name: name(V('Unnamed News Entry')), directory: directory(), date: simpleDate(), diff --git a/src/data/things/sorting-rule.js b/src/data/things/sorting-rule.js index 71b90277..101a4966 100644 --- a/src/data/things/sorting-rule.js +++ b/src/data/things/sorting-rule.js @@ -43,7 +43,7 @@ export class SortingRule extends Thing { static [Thing.getPropertyDescriptors] = () => ({ // Update & expose - active: flag(true), + active: flag(V(true)), message: { flags: {update: true, expose: true}, diff --git a/src/data/things/static-page.js b/src/data/things/static-page.js index 6a8ea8af..999072d3 100644 --- a/src/data/things/static-page.js +++ b/src/data/things/static-page.js @@ -20,7 +20,7 @@ export class StaticPage extends Thing { static [Thing.getPropertyDescriptors] = () => ({ // Update & expose - name: name('Unnamed Static Page'), + name: name(V('Unnamed Static Page')), nameShort: { flags: {update: true, expose: true}, @@ -38,7 +38,7 @@ export class StaticPage extends Thing { script: simpleString(), content: contentString(), - absoluteLinks: flag(), + absoluteLinks: flag(V(false)), // Expose only diff --git a/src/data/things/track.js b/src/data/things/track.js index 08b0f94f..e65c5d13 100644 --- a/src/data/things/track.js +++ b/src/data/things/track.js @@ -129,7 +129,7 @@ export class Track extends Thing { // > Update & expose - Identifying metadata - name: name('Unnamed Track'), + name: name(V('Unnamed Track')), nameText: contentString(), directory: directory({ @@ -348,8 +348,8 @@ export class Track extends Thing { exposeDependency('#trackSection.countTracksInArtistTotals'), ], - disableUniqueCoverArt: flag(), - disableDate: flag(), + disableUniqueCoverArt: flag(V(false)), + disableDate: flag(V(false)), // > Update & expose - General metadata diff --git a/src/data/things/wiki-info.js b/src/data/things/wiki-info.js index 258b1af0..96ae95f0 100644 --- a/src/data/things/wiki-info.js +++ b/src/data/things/wiki-info.js @@ -2,20 +2,15 @@ export const WIKI_INFO_FILE = 'wiki-info.yaml'; import {input, V} from '#composite'; import Thing from '#thing'; +import {isBoolean, isContributionPresetList, isLanguageCode, isName} + from '#validators'; import {parseContributionPresets, parseWallpaperParts} from '#yaml'; -import { - isBoolean, - isColor, - isContributionPresetList, - isLanguageCode, - isName, -} from '#validators'; - import {exitWithoutDependency, exposeConstant} from '#composite/control-flow'; import { canonicalBase, + color, contentString, fileExtension, flag, @@ -34,7 +29,7 @@ export class WikiInfo extends Thing { static [Thing.getPropertyDescriptors] = ({Group}) => ({ // Update & expose - name: name('Unnamed Wiki'), + name: name(V('Unnamed Wiki')), // Displayed in nav bar. nameShort: { @@ -47,14 +42,7 @@ export class WikiInfo extends Thing { }, }, - color: { - flags: {update: true, expose: true}, - update: {validate: isColor}, - - expose: { - transform: color => color ?? '#0088ff', - }, - }, + color: color(V('#0088ff')), // One-line description used for <meta rel="description"> tag. description: contentString(), @@ -69,7 +57,7 @@ export class WikiInfo extends Thing { canonicalBase: canonicalBase(), canonicalMediaBase: canonicalBase(), - wikiWallpaperFileExtension: fileExtension('jpg'), + wikiWallpaperFileExtension: fileExtension(V('jpg')), wikiWallpaperStyle: simpleString(), wikiWallpaperParts: wallpaperParts(), @@ -84,11 +72,11 @@ export class WikiInfo extends Thing { }, // Feature toggles - enableFlashesAndGames: flag(false), - enableListings: flag(false), - enableNews: flag(false), - enableArtTagUI: flag(false), - enableGroupUI: flag(false), + enableFlashesAndGames: flag(V(false)), + enableListings: flag(V(false)), + enableNews: flag(V(false)), + enableArtTagUI: flag(V(false)), + enableGroupUI: flag(V(false)), enableSearch: [ exitWithoutDependency({ @@ -97,7 +85,7 @@ export class WikiInfo extends Thing { value: input.value(false), }), - flag(true), + flag(V(true)), ], // Update only |