Contributing

The good news:

The bad news:

Required Tooling

Build Pipeline

For performance and consistency, most of the content for Skyline is actually data driven. That is, if you’re writing HTML by hand you’re probably doing it wrong. Visually, the system looks like this:

Build Pipeline & AssetsPlantUMLnpm run templateCSSnpm run sassMachine NPCsnpm run templateBooks & Player Charactersnpm run templateData Schemanpm run schemaProse & Packagingnpm run jekyll:serveUI Javascriptnpm run assets:skyline«Source»assets/puml/*.pumlDiagram Sources«Library»PlantUML«Script»src/template/PlantUml*.tsPlantUML Renderer«Source»assets/scss/*Site Stylesheet«Library»dart-sass«Intermediate»assets/css/all.cssGenerated CSS«Source»data/schema/machine.schema.jsonMachine Data Schema«Source»*.machine.yamlMachine Data«Intermediate»**/{machine}.mdMachine Stat Block«Source»data/machine/hzd-machines*.tsvMachine Statistics«Script»src/template/*.tsxAdapter Renderers«Script»src/machine/attacks.tsMachine Data Renderer«Source»**/book.yamlBook Data«Source»data/schema/book.schema.jsonBook Schema«Intermediate»**/{player-character}.mdPlayer Character Sheet«Script»src/template/*.tsxAdapter Renderers«Script»src/schema/schema.tsTypescript Generator«Intermediate»src/schema/*.tsTypescript Interfaces«Source»**/*.mdProse & Rendered Blocks«Library»Jekyll & GitHub PagesSite«Source»src/assets/skyline.tsUI TS Source«Library»Typescript Compiler«Intermediate»assets/js/skyline.jsUI JSusesvalidated byOne-time initial setupvalidated byvalidated byvalidated byResourceTypeHandlingFile<<Source>>Edited by handComponent<<Script>>Edited by HandFile<<Intermediate>>Generated, not edited!Component<<Library>>Third-party app

Development Process

Easy mode:

npm start

This starts up the next five items. Alternatively, you can do them one at a time.

Start up the CSS pipeline:

npm run sass

Start up the JSONSchema-to-Typescript pipeline:

npm run schema:watch

Start up the Typescript-to-Javascript pipeline:

npm run assets:skyline

Start up the template pipeline:

npm run template:watch

Start up the Jekyll pipeline:

npm run jekyll:serve

Once those are up and running, changes to most things will yield changes in the browser. Most of those watchers, including Jekyll, will also occasionally get confused when you add new files, and will need to be restarted.

Some changes won’t get caught by the watchers. In those cases, you can force a full sync, which isn’t as expensive as it sounds:

npm run template

To make sure you haven’t completely trashed anything:

npm test

Those tests won’t catch every problem, but they’ll catch the big ones.