diff options
Diffstat (limited to 'src/data/things/flash.js')
-rw-r--r-- | src/data/things/flash.js | 183 |
1 files changed, 140 insertions, 43 deletions
diff --git a/src/data/things/flash.js b/src/data/things/flash.js index 81de327..ceed79f 100644 --- a/src/data/things/flash.js +++ b/src/data/things/flash.js @@ -2,17 +2,26 @@ export const FLASH_DATA_FILE = 'flashes.yaml'; import {input} from '#composite'; import find from '#find'; +import {empty} from '#sugar'; import {sortFlashesChronologically} from '#sort'; import Thing from '#thing'; -import {anyOf, isColor, isDirectory, isNumber, isString} from '#validators'; +import {anyOf, isColor, isContentString, isDirectory, isNumber, isString} + from '#validators'; import {parseDate, parseContributors} from '#yaml'; -import {exposeDependency, exposeUpdateValueOrContinue} - from '#composite/control-flow'; import {withPropertyFromObject} from '#composite/data'; import { + exposeConstant, + exposeDependency, + exposeDependencyOrContinue, + exposeUpdateValueOrContinue, +} from '#composite/control-flow'; + +import { color, + commentary, + commentatorArtists, contentString, contributionList, directory, @@ -25,6 +34,7 @@ import { } from '#composite/wiki-properties'; import {withFlashAct} from '#composite/things/flash'; +import {withFlashSide} from '#composite/things/flash-act'; export class Flash extends Thing { static [Thing.referenceType] = 'flash'; @@ -89,6 +99,8 @@ export class Flash extends Thing { urls: urls(), + commentary: commentary(), + // Update only artistData: wikiData({ @@ -105,16 +117,23 @@ export class Flash extends Thing { // Expose only - act: { - flags: {expose: true}, + commentatorArtists: commentatorArtists(), - expose: { - dependencies: ['this', 'flashActData'], + act: [ + withFlashAct(), + exposeDependency({dependency: '#flashAct'}), + ], - compute: ({this: flash, flashActData}) => - flashActData.find((act) => act.flashes.includes(flash)) ?? null, - }, - }, + side: [ + withFlashAct(), + + withPropertyFromObject({ + object: '#flashAct', + property: input.value('side'), + }), + + exposeDependency({dependency: '#flashAct.side'}), + ], }); static [Thing.getSerializeDescriptors] = ({ @@ -153,11 +172,14 @@ export class Flash extends Thing { 'Cover Art File Extension': {property: 'coverArtFileExtension'}, 'Featured Tracks': {property: 'featuredTracks'}, + 'Contributors': { property: 'contributorContribs', transform: parseContributors, }, + 'Commentary': {property: 'commentary'}, + 'Review Points': {ignore: true}, }, }; @@ -173,19 +195,27 @@ export class FlashAct extends Thing { name: name('Unnamed Flash Act'), directory: directory(), color: color(), - listTerminology: contentString(), - jump: contentString(), + listTerminology: [ + exposeUpdateValueOrContinue({ + validate: input.value(isContentString), + }), - jumpColor: { - flags: {update: true, expose: true}, - update: {validate: isColor}, - expose: { - dependencies: ['color'], - transform: (jumpColor, {color}) => - jumpColor ?? color, - } - }, + withFlashSide(), + + withPropertyFromObject({ + object: '#flashSide', + property: input.value('listTerminology'), + }), + + exposeDependencyOrContinue({ + dependency: '#flashSide.listTerminology', + }), + + exposeConstant({ + value: input.value(null), + }), + ], flashes: referenceList({ class: input.value(Flash), @@ -198,6 +228,17 @@ export class FlashAct extends Thing { flashData: wikiData({ class: input.value(Flash), }), + + flashSideData: wikiData({ + class: input.value(FlashSide), + }), + + // Expose only + + side: [ + withFlashSide(), + exposeDependency({dependency: '#flashSide'}), + ], }); static [Thing.findSpecs] = { @@ -215,12 +256,51 @@ export class FlashAct extends Thing { 'Color': {property: 'color'}, 'List Terminology': {property: 'listTerminology'}, - 'Jump': {property: 'jump'}, - 'Jump Color': {property: 'jumpColor'}, - 'Review Points': {ignore: true}, }, }; +} + +export class FlashSide extends Thing { + static [Thing.referenceType] = 'flash-side'; + static [Thing.friendlyName] = `Flash Side`; + + static [Thing.getPropertyDescriptors] = () => ({ + // Update & expose + + name: name('Unnamed Flash Side'), + directory: directory(), + color: color(), + listTerminology: contentString(), + + acts: referenceList({ + class: input.value(FlashAct), + find: input.value(find.flashAct), + data: 'flashActData', + }), + + // Update only + + flashActData: wikiData({ + class: input.value(FlashAct), + }), + }); + + static [Thing.yamlDocumentSpec] = { + fields: { + 'Side': {property: 'name'}, + 'Directory': {property: 'directory'}, + 'Color': {property: 'color'}, + 'List Terminology': {property: 'listTerminology'}, + }, + }; + + static [Thing.findSpecs] = { + flashSide: { + referenceTypes: ['flash-side'], + bindTo: 'flashSideData', + }, + }; static [Thing.getYamlLoadingSpec] = ({ documentModes: {allInOne}, @@ -231,39 +311,56 @@ export class FlashAct extends Thing { documentMode: allInOne, documentThing: document => - ('Act' in document + ('Side' in document + ? FlashSide + : 'Act' in document ? FlashAct : Flash), save(results) { - let flashAct; - let flashRefs = []; + // JavaScript likes you. - if (results[0] && !(results[0] instanceof FlashAct)) { - throw new Error(`Expected an act at top of flash data file`); + if (!empty(results) && !(results[0] instanceof FlashSide)) { + throw new Error(`Expected a side at top of flash data file`); } - for (const thing of results) { - if (thing instanceof FlashAct) { - if (flashAct) { - Object.assign(flashAct, {flashes: flashRefs}); - } + let index = 0; + let thing; + for (; thing = results[index]; index++) { + const flashSide = thing; + const flashActRefs = []; - flashAct = thing; - flashRefs = []; - } else { - flashRefs.push(Thing.getReference(thing)); + if (results[index + 1] instanceof Flash) { + throw new Error(`Expected an act to immediately follow a side`); } - } - if (flashAct) { - Object.assign(flashAct, {flashes: flashRefs}); + for ( + index++; + (thing = results[index]) && thing instanceof FlashAct; + index++ + ) { + const flashAct = thing; + const flashRefs = []; + for ( + index++; + (thing = results[index]) && thing instanceof Flash; + index++ + ) { + flashRefs.push(Thing.getReference(thing)); + } + index--; + flashAct.flashes = flashRefs; + flashActRefs.push(Thing.getReference(flashAct)); + } + index--; + flashSide.acts = flashActRefs; } const flashData = results.filter(x => x instanceof Flash); const flashActData = results.filter(x => x instanceof FlashAct); + const flashSideData = results.filter(x => x instanceof FlashSide); - return {flashData, flashActData}; + return {flashData, flashActData, flashSideData}; }, sort({flashData}) { |