diff options
Diffstat (limited to 'src/data/composite/wiki-properties')
19 files changed, 240 insertions, 166 deletions
diff --git a/src/data/composite/wiki-properties/additionalFiles.js b/src/data/composite/wiki-properties/additionalFiles.js deleted file mode 100644 index 6760527a..00000000 --- a/src/data/composite/wiki-properties/additionalFiles.js +++ /dev/null @@ -1,30 +0,0 @@ -// This is a somewhat more involved data structure - it's for additional -// or "bonus" files associated with albums or tracks (or anything else). -// It's got this form: -// -// [ -// {title: 'Booklet', files: ['Booklet.pdf']}, -// { -// title: 'Wallpaper', -// description: 'Cool Wallpaper!', -// files: ['1440x900.png', '1920x1080.png'] -// }, -// {title: 'Alternate Covers', description: null, files: [...]}, -// ... -// ] -// - -import {isAdditionalFileList} from '#validators'; - -// TODO: Not templateCompositeFrom. - -export default function() { - return { - flags: {update: true, expose: true}, - update: {validate: isAdditionalFileList}, - expose: { - transform: (additionalFiles) => - additionalFiles ?? [], - }, - }; -} 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/annotatedReferenceList.js b/src/data/composite/wiki-properties/annotatedReferenceList.js index 8e6c96a1..918f8567 100644 --- a/src/data/composite/wiki-properties/annotatedReferenceList.js +++ b/src/data/composite/wiki-properties/annotatedReferenceList.js @@ -9,8 +9,13 @@ import { } from '#validators'; import {exposeDependency} from '#composite/control-flow'; -import {inputSoupyFind, inputWikiData, withResolvedAnnotatedReferenceList} - from '#composite/wiki-data'; + +import { + inputFindOptions, + inputSoupyFind, + inputWikiData, + withResolvedAnnotatedReferenceList, +} from '#composite/wiki-data'; import {referenceListInputDescriptions, referenceListUpdateDescription} from './helpers/reference-list-helpers.js'; @@ -25,6 +30,7 @@ export default templateCompositeFrom({ data: inputWikiData({allowMixedTypes: true}), find: inputSoupyFind(), + findOptions: inputFindOptions(), reference: input.staticValue({type: 'string', defaultValue: 'reference'}), annotation: input.staticValue({type: 'string', defaultValue: 'annotation'}), @@ -51,12 +57,13 @@ export default templateCompositeFrom({ withResolvedAnnotatedReferenceList({ list: input.updateValue(), + data: input('data'), + find: input('find'), + findOptions: input('findOptions'), + reference: input('reference'), annotation: input('annotation'), thing: input('thing'), - - data: input('data'), - find: input('find'), }), exposeDependency({dependency: '#resolvedAnnotatedReferenceList'}), diff --git a/src/data/composite/wiki-properties/canonicalBase.js b/src/data/composite/wiki-properties/canonicalBase.js new file mode 100644 index 00000000..81740d6c --- /dev/null +++ b/src/data/composite/wiki-properties/canonicalBase.js @@ -0,0 +1,16 @@ +import {isURL} from '#validators'; + +export default function() { + return { + flags: {update: true, expose: true}, + update: {validate: isURL}, + expose: { + transform: (value) => + (value === null + ? null + : value.endsWith('/') + ? value + : value + '/'), + }, + }; +} 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/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/constitutibleArtwork.js b/src/data/composite/wiki-properties/constitutibleArtwork.js index 0ee3bfcd..48f4211a 100644 --- a/src/data/composite/wiki-properties/constitutibleArtwork.js +++ b/src/data/composite/wiki-properties/constitutibleArtwork.js @@ -17,6 +17,7 @@ const template = templateCompositeFrom({ compose: false, inputs: { + thingProperty: input({type: 'string', acceptsNull: true}), dimensionsFromThingProperty: input({type: 'string', acceptsNull: true}), fileExtensionFromThingProperty: input({type: 'string', acceptsNull: true}), dateFromThingProperty: input({type: 'string', acceptsNull: true}), @@ -35,6 +36,7 @@ const template = templateCompositeFrom({ }), withConstitutedArtwork({ + thingProperty: input('thingProperty'), dimensionsFromThingProperty: input('dimensionsFromThingProperty'), fileExtensionFromThingProperty: input('fileExtensionFromThingProperty'), dateFromThingProperty: input('dateFromThingProperty'), diff --git a/src/data/composite/wiki-properties/constitutibleArtworkList.js b/src/data/composite/wiki-properties/constitutibleArtworkList.js index 246c08b5..dad3a957 100644 --- a/src/data/composite/wiki-properties/constitutibleArtworkList.js +++ b/src/data/composite/wiki-properties/constitutibleArtworkList.js @@ -16,6 +16,7 @@ const template = templateCompositeFrom({ compose: false, inputs: { + thingProperty: input({type: 'string', acceptsNull: true}), dimensionsFromThingProperty: input({type: 'string', acceptsNull: true}), fileExtensionFromThingProperty: input({type: 'string', acceptsNull: true}), dateFromThingProperty: input({type: 'string', acceptsNull: true}), @@ -34,6 +35,7 @@ const template = templateCompositeFrom({ }), withConstitutedArtwork({ + thingProperty: input('thingProperty'), dimensionsFromThingProperty: input('dimensionsFromThingProperty'), fileExtensionFromThingProperty: input('fileExtensionFromThingProperty'), dateFromThingProperty: input('dateFromThingProperty'), diff --git a/src/data/composite/wiki-properties/contribsPresent.js b/src/data/composite/wiki-properties/contribsPresent.js deleted file mode 100644 index 24f302a5..00000000 --- a/src/data/composite/wiki-properties/contribsPresent.js +++ /dev/null @@ -1,30 +0,0 @@ -// Nice 'n simple shorthand for an exposed-only flag which is true when any -// contributions are present in the specified property. - -import {input, templateCompositeFrom} from '#composite'; -import {isContributionList} from '#validators'; - -import {exposeDependency, withResultOfAvailabilityCheck} - from '#composite/control-flow'; - -export default templateCompositeFrom({ - annotation: `contribsPresent`, - - compose: false, - - inputs: { - contribs: input.staticDependency({ - validate: isContributionList, - acceptsNull: true, - }), - }, - - steps: () => [ - withResultOfAvailabilityCheck({ - from: input('contribs'), - mode: input.value('empty'), - }), - - exposeDependency({dependency: '#availability'}), - ], -}); 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/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/hasArtwork.js b/src/data/composite/wiki-properties/hasArtwork.js new file mode 100644 index 00000000..e403a7e2 --- /dev/null +++ b/src/data/composite/wiki-properties/hasArtwork.js @@ -0,0 +1,90 @@ +import {input, templateCompositeFrom, V} from '#composite'; +import {isContributionList, isThing, strictArrayOf} from '#validators'; + +import {fillMissingListItems, withFlattenedList, withPropertyFromList} + from '#composite/data'; + +import { + exitWithoutDependency, + exposeWhetherDependencyAvailable, + withResultOfAvailabilityCheck, +} from '#composite/control-flow'; + +export default templateCompositeFrom({ + annotation: 'hasArtwork', + + inputs: { + contribs: input({ + validate: isContributionList, + defaultValue: null, + }), + + artwork: input({ + validate: isThing, + defaultValue: null, + }), + + artworks: input({ + validate: strictArrayOf(isThing), + defaultValue: null, + }), + }, + + compose: false, + + steps: () => [ + withResultOfAvailabilityCheck({ + from: input('contribs'), + mode: input.value('empty'), + }), + + { + dependencies: ['#availability'], + compute: (continuation, { + ['#availability']: availability, + }) => + (availability + ? true + : continuation()), + }, + + { + dependencies: [input('artwork'), input('artworks')], + compute: (continuation, { + [input('artwork')]: artwork, + [input('artworks')]: artworks, + }) => + continuation({ + ['#artworks']: + (artwork && artworks + ? [artwork, ...artworks] + : artwork + ? [artwork] + : artworks + ? artworks + : []), + }), + }, + + exitWithoutDependency('#artworks', { + value: input.value(false), + mode: input.value('empty'), + }), + + withPropertyFromList('#artworks', { + property: input.value('artistContribs'), + internal: input.value(true), + }), + + // Since we're getting the update value for each artwork's artistContribs, + // it may not be set at all, and in that case won't be exposing as []. + fillMissingListItems('#artworks.artistContribs', V([])), + + withFlattenedList('#artworks.artistContribs'), + + exposeWhetherDependencyAvailable({ + dependency: '#flattenedList', + mode: input.value('empty'), + }), + ], +}); \ No newline at end of file diff --git a/src/data/composite/wiki-properties/index.js b/src/data/composite/wiki-properties/index.js index d5e7657e..9ef7ccc4 100644 --- a/src/data/composite/wiki-properties/index.js +++ b/src/data/composite/wiki-properties/index.js @@ -3,15 +3,13 @@ // Entries here may depend on entries in #composite/control-flow, // #composite/data, and #composite/wiki-data. -export {default as additionalFiles} from './additionalFiles.js'; -export {default as additionalNameList} from './additionalNameList.js'; export {default as annotatedReferenceList} from './annotatedReferenceList.js'; +export {default as canonicalBase} from './canonicalBase.js'; export {default as color} from './color.js'; export {default as commentatorArtists} from './commentatorArtists.js'; export {default as constitutibleArtwork} from './constitutibleArtwork.js'; export {default as constitutibleArtworkList} from './constitutibleArtworkList.js'; export {default as contentString} from './contentString.js'; -export {default as contribsPresent} from './contribsPresent.js'; export {default as contributionList} from './contributionList.js'; export {default as dimensions} from './dimensions.js'; export {default as directory} from './directory.js'; @@ -19,11 +17,11 @@ export {default as duration} from './duration.js'; export {default as externalFunction} from './externalFunction.js'; export {default as fileExtension} from './fileExtension.js'; export {default as flag} from './flag.js'; +export {default as hasArtwork} from './hasArtwork.js'; export {default as name} from './name.js'; export {default as referenceList} from './referenceList.js'; export {default as referencedArtworkList} from './referencedArtworkList.js'; export {default as reverseReferenceList} from './reverseReferenceList.js'; -export {default as seriesList} from './seriesList.js'; export {default as simpleDate} from './simpleDate.js'; export {default as simpleString} from './simpleString.js'; export {default as singleReference} from './singleReference.js'; 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/composite/wiki-properties/referenceList.js b/src/data/composite/wiki-properties/referenceList.js index 4f8207b5..663349ee 100644 --- a/src/data/composite/wiki-properties/referenceList.js +++ b/src/data/composite/wiki-properties/referenceList.js @@ -11,8 +11,13 @@ import {input, templateCompositeFrom} from '#composite'; import {validateReferenceList} from '#validators'; import {exposeDependency} from '#composite/control-flow'; -import {inputSoupyFind, inputWikiData, withResolvedReferenceList} - from '#composite/wiki-data'; + +import { + inputFindOptions, + inputSoupyFind, + inputWikiData, + withResolvedReferenceList, +} from '#composite/wiki-data'; import {referenceListInputDescriptions, referenceListUpdateDescription} from './helpers/reference-list-helpers.js'; @@ -27,6 +32,7 @@ export default templateCompositeFrom({ data: inputWikiData({allowMixedTypes: true}), find: inputSoupyFind(), + findOptions: inputFindOptions(), }, update: @@ -39,6 +45,7 @@ export default templateCompositeFrom({ list: input.updateValue(), data: input('data'), find: input('find'), + findOptions: input('findOptions'), }), exposeDependency({dependency: '#resolvedReferenceList'}), diff --git a/src/data/composite/wiki-properties/referencedArtworkList.js b/src/data/composite/wiki-properties/referencedArtworkList.js index 9ba2e393..278f063d 100644 --- a/src/data/composite/wiki-properties/referencedArtworkList.js +++ b/src/data/composite/wiki-properties/referencedArtworkList.js @@ -1,6 +1,5 @@ import {input, templateCompositeFrom} from '#composite'; import find from '#find'; -import {isDate} from '#validators'; import annotatedReferenceList from './annotatedReferenceList.js'; @@ -23,7 +22,7 @@ export default templateCompositeFrom({ annotatedReferenceList({ referenceType: input.value(['album', 'track']), - data: 'artworkData', + data: '_artworkData', find: '#find', thing: input.value('artwork'), diff --git a/src/data/composite/wiki-properties/seriesList.js b/src/data/composite/wiki-properties/seriesList.js deleted file mode 100644 index 2a101b45..00000000 --- a/src/data/composite/wiki-properties/seriesList.js +++ /dev/null @@ -1,31 +0,0 @@ -import {input, templateCompositeFrom} from '#composite'; -import {isSeriesList, validateThing} from '#validators'; - -import {exposeDependency} from '#composite/control-flow'; -import {withResolvedSeriesList} from '#composite/wiki-data'; - -export default templateCompositeFrom({ - annotation: `seriesList`, - - compose: false, - - inputs: { - group: input({ - validate: validateThing({referenceType: 'group'}), - }), - }, - - steps: () => [ - withResolvedSeriesList({ - group: input('group'), - - list: input.updateValue({ - validate: isSeriesList, - }), - }), - - exposeDependency({ - dependency: '#resolvedSeriesList', - }), - ], -}); diff --git a/src/data/composite/wiki-properties/singleReference.js b/src/data/composite/wiki-properties/singleReference.js index f532ebbe..25b97907 100644 --- a/src/data/composite/wiki-properties/singleReference.js +++ b/src/data/composite/wiki-properties/singleReference.js @@ -8,11 +8,19 @@ // import {input, templateCompositeFrom} from '#composite'; -import {isThingClass, validateReference} from '#validators'; +import {validateReference} from '#validators'; import {exposeDependency} from '#composite/control-flow'; -import {inputSoupyFind, inputWikiData, withResolvedReference} - from '#composite/wiki-data'; + +import { + inputFindOptions, + inputSoupyFind, + inputWikiData, + withResolvedReference, +} from '#composite/wiki-data'; + +import {referenceListInputDescriptions, referenceListUpdateDescription} + from './helpers/reference-list-helpers.js'; export default templateCompositeFrom({ annotation: `singleReference`, @@ -20,25 +28,24 @@ export default templateCompositeFrom({ compose: false, inputs: { - class: input.staticValue({validate: isThingClass}), + ...referenceListInputDescriptions(), + data: inputWikiData({allowMixedTypes: true}), find: inputSoupyFind(), - data: inputWikiData({allowMixedTypes: false}), + findOptions: inputFindOptions(), }, - update: ({ - [input.staticValue('class')]: thingClass, - }) => ({ - validate: - validateReference( - thingClass[Symbol.for('Thing.referenceType')]), - }), + update: + referenceListUpdateDescription({ + validateReferenceList: validateReference, + }), steps: () => [ withResolvedReference({ ref: input.updateValue(), data: input('data'), find: input('find'), + findOptions: input('findOptions'), }), exposeDependency({dependency: '#resolvedReference'}), |