fix: adding in standard build

This commit is contained in:
D. Moonfire 2022-10-13 08:58:28 -05:00
parent e75593daaf
commit 39bb85442f
25 changed files with 18367 additions and 5902 deletions

26
.editorconfig Normal file
View file

@ -0,0 +1,26 @@
# EditorConfig is awesome: http://EditorConfig.org
# top-most EditorConfig file
root = true
[*]
charset = utf-8
end_of_line = lf
indent_size = 4
indent_style = space
insert_final_newline = true
max_line_length = 80
tab_width = 4
trim_trailing_whitespace = true
[*.{js,ts}]
quote_type = double
[*.yaml]
indent_size = 4
tab_width = 4
indent_style = space
[package.json]
indent_size = 2
tab_width = 2

2
.envrc Normal file
View file

@ -0,0 +1,2 @@
export PATH=$PWD/scripts:$PWD/node_modules/.bin:$PATH
use flake || use nix

16
.gitignore vendored
View file

@ -1,5 +1,13 @@
*~
node_modules/
*.epub
*.pdf
D Moonfire*
summary.md
.direnv/
tmp/
build/
.*-swp
dmoonfire*.pdf
dmoonfire*.docx
dmoonfire*.html
dmoonfire*.mobi
dmoonfire*.epub
*.bz2

17
.prettierignore Normal file
View file

@ -0,0 +1,17 @@
CHANGELOG.md
package-lock.json
yarn.lock
*~
archives/
build/
extras/
others/
node_modules/
submissions/
sample-edits/
maps/
.direnv/
tmp/
edit/

36
.woodpecker.yml Normal file
View file

@ -0,0 +1,36 @@
clone:
git:
image: woodpeckerci/plugin-git
settings:
tags: true
pipeline:
build:
image: registry.gitlab.com/dmoonfire/nix-flake-docker:latest
commands:
- nix profile install 'nixpkgs#fontconfig'
- nix develop --command scripts/build.sh
secrets:
- gitea_token
- s3_bucket
- s3_endpoint
- s3_access_key_id
- s3_secret_access_key
when:
event: [push, pull_request, tag]
tag: v*
release:
image: registry.gitlab.com/dmoonfire/nix-flake-docker:latest
commands:
- nix profile install 'nixpkgs#fontconfig'
- nix develop --command scripts/release.sh
secrets:
- gitea_token
- s3_bucket
- s3_endpoint
- s3_access_key_id
- s3_secret_access_key
when:
event: push
branch: main

6
commitlint.config.js Normal file
View file

@ -0,0 +1,6 @@
module.exports = {
extends: ["@commitlint/config-conventional"],
rules: {
"body-max-line-length": [0],
},
};

View file

@ -4,25 +4,118 @@
"character": {
"pov": 49,
"name": "Glorias",
"character_slug": "glorias",
"color": "hsl(137, 63%, 37%)"
},
"source": {
"pov": 49,
"volume": 0,
"title": "May I Lead This Dance",
"status": "unstable",
"word_count": 19258,
"length": "Novelette",
"title_slug": "may-i-lead-this-dance",
"identifier_slug": "0049-00-may-i-lead-this-dance",
"copyright_year": 2019,
"status": "Unstable",
"genres": [
"Drama",
"Romance"
],
"has_dedication": false,
"git": {
"http_url": "https://gitlab.com/fedran/may-i-lead-this-dance.git",
"http_url": "https://src.mfgames.com/fedran-sources/may-i-lead-this-dance.git",
"branch": "master"
},
"links": {
"development": {
"git": "https://gitlab.com/fedran/may-i-lead-this-dance"
}
}
"git": "https://src.mfgames.com/fedran-sources/may-i-lead-this-dance/",
"issues": "https://src.mfgames.com/fedran-sources/may-i-lead-this-dance/issues"
}
},
"cover": {
"title_page_lines": [
"May I Lead",
"This Dance"
]
},
"warnings": {
"text": "This novelette contains no scenes of sexual assault."
},
"chapters": [
{
"title": "Measured",
"word_count": 1041,
"summary": "Galadin doesn't want to be fitted for a suit, he wants to be measured for a dress. However, no one knows his secret fantasy and he is forced to endure the role life gave him.\n"
},
{
"title": "Dance Lessons",
"word_count": 1609,
"summary": "At Galadin's dance lessons, he meets up with his friend, Kalir. Kalir's older brother, Benard, joins them but Kalir is cold toward his sibling. Benard reveals that he is gay and an embarrassment to his family but he saved a ship and therefore is being rewarded with attendance at the ball.\n",
"teaser": "In the many rituals of the presentation balls, learning how to dance was one rite of passage that both men and women had to suffer. But what happens when there are only men showing up to the lessons, will the rigid roles of society prevent the class. And what if an unexpected man appears to throw everything in chaos?\n"
},
{
"title": "Decision",
"word_count": 930,
"summary": "At dinner, Galadin practices how to eat in public. His mother is insistent he learn how to do it properly but things go awry when she finds out that Galadin danced with another man during that day's lessons.\n"
},
{
"title": "Revelation",
"word_count": 1136,
"summary": "Spurred by his father's encouragement, Galadin finally reveals his secret.\n"
},
{
"title": "Plans",
"word_count": 1281,
"summary": "Enraged by his desire to be a woman, Galadin's mother storms home to blame his father. However, the curious mage sees it as a different problem to be solved.\n"
},
{
"title": "Ladies' Fashions",
"word_count": 2842,
"summary": "With a new plan in place, Galadin finds himself in front of seamstress willing to make the one thing he craved the most: a dress. It would be the first step in attending the ball as a debutante instead of a suitor. He is asked what name he wanted to have when he's dressed as a woman and he chooses Glorias.\n"
},
{
"title": "Dysphoria",
"word_count": 2314,
"summary": "Galadin struggles with the dysphoria of turning into a girl where the image in the mirror doesn't match what he wants to look like. At the same time, he thinks he is getting sick. His father offers to help but does a poor job. Later, his mother interrupts and teaches Galadin how to do it right. Both of his parents make strange remarks about Galadin in the process.\n",
"teaser": "For all the efforts to make him look like a lady, Galadin wasn't there. With his fledgling skills with makeup, he couldn't get everything to match. Not without help.\n"
},
{
"title": "Magic in the Makeup",
"word_count": 1066,
"summary": "Galadin and Maran are in a carriage. Galadin is practicing speaking like a woman in a higher register. His mother stops him and asked for his feelings. Then she shows that when he feels like a woman, his face changes to match. It depends on his emotional state. She apologizes for not seeing it earlier.\n",
"teaser": "After weeks of lessons, Galadin was finally accepting the changes. Never before had he felt so much like a woman and it was starting to show.\n"
},
{
"title": "Arrival",
"word_count": 1062,
"summary": "Glorias and Maran arrive at the ball well after it started and through a side entrance. After the events in the previous chapter, her family had finally turned a corner and they treated her as a \"she\" full time.\n",
"teaser": "Arriving at Glorias's first ball through the side entrance wasn't the greatest of plans but it had to be done. Glorias had too many secrets that couldn't be revealed.\n"
},
{
"title": "The Dance",
"word_count": 1630,
"summary": "The big night and the first dance. Glorias is attending as Glorias and it is everything she hoped it would be. At least until someone recognizes him.\n"
},
{
"title": "A Breather",
"word_count": 608,
"summary": "The big night continues and the doubt fills in the spaces between the dances. Would someone notice Galadin's mistakes? Would they call him out in front of all of society?\n"
},
{
"title": "One Last Dance",
"word_count": 2046,
"summary": "The night is finally over, at least for Galadin. The last two lines were empty and no more men were waiting to dance.\n"
},
{
"title": "Casual Talk",
"word_count": 923,
"summary": "After a month of social events, Glorias was more comfortable with the politics and dangers of being a debutante. Her life was becoming comfortable and she loved every moment of it.\n"
},
{
"title": "One Ending, Another Beginning",
"word_count": 770,
"summary": "A little over a month later, Glorias was done with the city's Social Season. She only one thing left as she sat on the stairs of her parents house, waiting to be picked up by her husband-to-be.\n"
}
]
}
}

58
flake.lock Normal file
View file

@ -0,0 +1,58 @@
{
"nodes": {
"flake-utils": {
"locked": {
"lastModified": 1642700792,
"narHash": "sha256-XqHrk7hFb+zBvRg6Ghl+AZDq03ov6OshJLiSWOoX5es=",
"owner": "numtide",
"repo": "flake-utils",
"rev": "846b2ae0fc4cc943637d3d1def4454213e203cba",
"type": "github"
},
"original": {
"owner": "numtide",
"repo": "flake-utils",
"type": "github"
}
},
"nixpkgs": {
"locked": {
"lastModified": 1643805626,
"narHash": "sha256-AXLDVMG+UaAGsGSpOtQHPIKB+IZ0KSd9WS77aanGzgc=",
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "554d2d8aa25b6e583575459c297ec23750adb6cb",
"type": "github"
},
"original": {
"id": "nixpkgs",
"ref": "nixos-unstable",
"type": "indirect"
}
},
"nixstable": {
"locked": {
"lastModified": 1622516815,
"narHash": "sha256-ZjBd81a6J3TwtlBr3rHsZspYUwT9OdhDk+a/SgSEf7I=",
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "7e9b0dff974c89e070da1ad85713ff3c20b0ca97",
"type": "github"
},
"original": {
"id": "nixpkgs",
"ref": "21.05",
"type": "indirect"
}
},
"root": {
"inputs": {
"flake-utils": "flake-utils",
"nixpkgs": "nixpkgs",
"nixstable": "nixstable"
}
}
},
"root": "root",
"version": 7
}

28
flake.nix Normal file
View file

@ -0,0 +1,28 @@
{
inputs = {
nixstable.url = "nixpkgs/21.05";
nixpkgs.url = "nixpkgs/nixos-unstable";
flake-utils.url = "github:numtide/flake-utils";
};
outputs = { self, nixpkgs, nixstable, flake-utils }:
flake-utils.lib.eachDefaultSystem (system:
let
pkgs = nixpkgs.legacyPackages.${system};
stable = nixstable.legacyPackages.${system};
in {
devShell = pkgs.mkShell {
buildInputs = [
pkgs.epubcheck
pkgs.nixfmt
pkgs.nodejs-16_x
pkgs.pandoc
pkgs.pdftk
pkgs.python39Full
pkgs.python39Packages.weasyprint
pkgs.jq
pkgs.s3cmd
];
};
});
}

11
matter/about.md Normal file
View file

@ -0,0 +1,11 @@
---
title: About D. Moonfire
---
D. Moonfire is the remarkable intersection of a computer nerd and a scientist. He inherited a desire for learning, endless curiosity, and a talent for being a polymath from both of his parents. Instead of focusing on a single genre, he writes stories and novels in many different settings ranging from fantasy to science fiction. He also throws in the occasional romance or forensics murder mystery to mix things up.
In addition to having a borderline unhealthy obsession with the written word, he is also a developer who loves to code as much as he loves writing.
He lives near Cedar Rapids, Iowa with his wife, numerous pet computers, and a pair of highly mobile things of the male variety.
You can see more work by D. Moonfire at his website at [https://d.moonfire.us/](https://d.moonfire.us/). His fantasy world, Fedran, can be found at [https://fedran.com/](https://fedran.com/).

13
matter/fedran.md Normal file
View file

@ -0,0 +1,13 @@
---
title: Fedran
---
Fedran is a world caught on the cusp of two great ages.
For centuries, the Crystal Age shaped society through the exploration of magic. Every creature had the ability to affect the world using talents and spells. The only limitation was imagination, will, and the inescapable rules of resonance. But as society grew more civilized, magic became less reliable and weaker.
When an unexpected epiphany seemingly breaks the laws of resonance, everything changed. Artifacts no longer exploded when exposed to spells, but only if they were wrapped in cocoons of steel and brass. The humble fire rune becomes the fuel for new devices, ones powered by steam and pressure. These machines herald the birth of a new age, the Industrial Age.
Now, the powers of the old age struggle against the onslaught of new technologies and an alien way of approaching magic. Either the world will adapt or it will be washed away in the relentless march of innovation.
To explore the world of Fedran, check out [https://fedran.com/](https://fedran.com/). There you'll find stories, novels, character write-ups and more.

27
matter/legal.md Normal file
View file

@ -0,0 +1,27 @@
---
title: Legal
---
Copyright © 2019 D. Moonfire\
Some Rights Reserved\
Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International
Cover art by D. Moonfire
All characters, events, and locations are fictitious. Any resemblance to persons, past, present, and future is coincidental and highly unlikely.
This novelette contains no scenes of sexual assault.
Broken Typewriter Press\
5001 1st Ave SE\
Ste 105 #243\
Cedar Rapids, IA 52402
Broken Typewriter Press\
[https://broken.typewriter.press/](https://broken.typewriter.press/)
{% if (edition.isbn) %}
ISBN {{edition.isbn}}
{% endif %}
Version {{edition.version}}

32
matter/license.md Normal file
View file

@ -0,0 +1,32 @@
---
title: License
---
This book is distributed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International license. More info can be found at [https://creativecommons.org/licenses/by-nc-sa/4.0/](https://creativecommons.org/licenses/by-nc-sa/4.0/). This means:
### You are free to:
- Share — copy and redistribute the material in any medium or format
- Adapt — remix, transform, and build upon the material
The licensor cannot revoke these freedoms as long as you follow the license terms.
### Under the following terms:
- Attribution — You must give appropriate credit, provide a link to the license, and indicate if changes were made. You may do so in any reasonable manner, but not in any way that suggests the licensor endorses you or your use.
- NonCommercial — You may not use the material for commercial purposes.
- ShareAlike — If you remix, transform, or build upon the material, you must distribute your contributions under the same license as the original.
No additional restrictions — You may not apply legal terms or technological measures that legally restrict others from doing anything the license permits.
### Preferred Attribution
The preferred attribution for this novel is:
> "May I Lead This Dance" by D. Moonfire is licensed under CC BY-NC-SA 4.0
In the above attribution, use the following links:
- Flight of the Scions: [https://fedran.com/may-i-lead-this-dance/](https://fedran.com/may-i-lead-this-dance/)
- D. Moonfire: https://d.moonfire.us/
- CC BY-NC-SA 4.0: https://creativecommons.org/licenses/by-nc-sa/4.0/

1
matter/pad.html Normal file
View file

@ -0,0 +1 @@
<br />

14
matter/title.html Normal file
View file

@ -0,0 +1,14 @@
---
title: Title
---
<div class="title">
<div class="title-area">
<div class="large">May I Lead</div>
<div class="large">This Dance</div>
</div>
<div class="author">D. Moonfire</div>
<div class="publisher">Broken Typewriter Press &#8226; Cedar Rapids</div>
</div>

23529
package-lock.json generated

File diff suppressed because it is too large Load diff

View file

@ -1,58 +1,50 @@
{
"name": "if-i-lead-this-dance",
"private": true,
"name": "may-i-lead-this-dance",
"version": "0.1.0",
"private": true,
"description": "\"May I Lead This Dance\" is a novelette by D. Moonfire.",
"author": {
"name": "D. Moonfire"
},
"license": "CC-BY-NC-SA-4.0",
"repository": {
"type": "git",
"url": "git+https://src.mfgames.com/fedran-sources/may-i-lead-this-dance.git"
},
"homepage": "https://fedran.com/may-i-lead-this-dance/",
"scripts": {
"build:epub": "mfgames-writing-format build epub",
"build:pdf": "mfgames-writing-format build pdf",
"build": "npm run build:epub && npm run build:pdf"
},
"release": {
"branch": "master",
"message": "chore(release): v${nextRelease.version}\n\n${nextRelease.notes}",
"verifyConditions": [
"@semantic-release/changelog",
"@semantic-release/git"
],
"analyzeCommits": [
"@semantic-release/commit-analyzer"
],
"prepare": [
"@semantic-release/changelog",
"@semantic-release/git"
],
"publish": [],
"success": [],
"fail": []
},
"commitlint": {
"extends": [
"@commitlint/config-conventional"
]
},
"config": {
"commitizen": {
"path": "./node_modules/cz-conventional-changelog"
}
},
"husky": {
"hooks": {
"commit-msg": "commitlint -E HUSKY_GIT_PARAMS"
}
"build:epub": "mfgames-writing-format build epub",
"build:docx": "mfgames-writing-format build docx",
"build": "run-s build:*",
"prepare": "husky install"
},
"dependencies": {
"@commitlint/cli": "^8.0.0",
"@commitlint/config-conventional": "^8.0.0",
"@fedran/writing-theme": "^2.0.2",
"@mfgames-writing/epub2": "^1.1.3",
"@mfgames-writing/format": "^2.0.0",
"@mfgames-writing/hyphen": "^0.4.3",
"@mfgames-writing/weasyprint": "^3.0.2",
"@semantic-release/changelog": "^3.0.2",
"@semantic-release/git": "^7.0.8",
"commitizen": "^3.1.1",
"cz-conventional-changelog": "^2.1.0",
"husky": "^2.4.0",
"semantic-release": "^15.13.12"
"@fedran/writing-hyphen": "^1.0.0",
"@fedran/writing-theme": "^4.0.2",
"@mfgames-writing/contracts": "^4.4.0",
"@mfgames-writing/docx-format": "^1.0.2",
"@mfgames-writing/epub2-format": "^2.1.1",
"@mfgames-writing/format": "^3.3.1",
"@mfgames-writing/guillemet": "^1.0.0",
"@mfgames-writing/hyphen-pipeline": "^1.0.2",
"@mfgames-writing/liquid-theme": "^2.1.1",
"@mfgames-writing/weasyprint-format": "^5.0.4",
"markdown-it-multimd-table": "^4.1.3"
},
"devDependencies": {
"@commitlint/cli": "^15.0.0",
"@commitlint/config-conventional": "^15.0.0",
"@saithodev/semantic-release-gitea": "^2.1.0",
"@semantic-release/changelog": "^6.0.1",
"@semantic-release/exec": "^6.0.3",
"@semantic-release/git": "^10.0.1",
"@semantic-release/npm": "^8.0.3",
"@semantic-release/release-notes-generator": "^10.0.3",
"husky": "^7.0.2",
"markdowny": "^0.2.1",
"npm-run-all": "^4.1.5",
"prettier": "^2.0.5",
"semantic-release": "^18.0.1"
}
}

114
publication.json Normal file
View file

@ -0,0 +1,114 @@
{
"metadata": {
"title": "{{edition.fedran.source.title}}",
"author": "D. Moonfire",
"language": "en",
"theme": "@fedran/writing-theme",
"outputDirectory": ".",
"outputFilename": "dmoonfire-{{edition.fedran.source.title_slug}}-{{edition.name}}-{{edition.version}}.{{edition.ext}}",
"markdown": {
"extensions": [
{
"package": "markdown-it-multimd-table",
"options": {
"headerless": true
}
}
]
},
"style": {
"css": "td { width: 6em; } td[colspan=\"2\"] { width: 12em; }"
}
},
"includes": [
{
"json": "./fedran.json",
"merge": "metadata.fedran"
}
],
"editions": {
"epub": {
"format": "@mfgames-writing/epub2-format",
"ext": "epub"
},
"pdf": {
"format": "@mfgames-writing/weasyprint-format",
"isbn": "",
"images": {
"grayscale": true,
"opaque": true
},
"ext": "pdf"
},
"docx": {
"format": "@mfgames-writing/docx-format",
"ext": "docx"
}
},
"contents": [
{
"element": "bastard",
"source": "matter/title.html",
"linear": false,
"exclude": {
"editions": ["epub", "html"],
"toc": true
}
},
{
"element": "title",
"source": "matter/title.html",
"linear": false,
"exclude": {
"toc": true
}
},
{
"element": "legal",
"source": "matter/legal.md",
"liquid": true,
"linear": false
},
{
"element": "toc",
"linear": false,
"title": "Contents",
"exclude": {
"editions": ["pdf"]
}
},
{
"element": "chapter",
"number": 1,
"directory": "chapters",
"source": "/^chapter-\\d+.(markdown|md)$/",
"start": true,
"page": 1,
"pipeline": [
{
"module": "@mfgames-writing/guillemet"
},
{
"module": "@fedran/writing-hyphen"
},
{
"module": "@mfgames-writing/hyphen-pipeline",
"exclude": ["`.*?`", "<code>.*?</code>"]
}
]
},
{
"element": "appendix",
"source": "matter/about.md"
},
{
"element": "appendix",
"source": "matter/fedran.md"
},
{
"element": "appendix",
"id": "license",
"source": "matter/license.md"
}
]
}

39
release.config.js Normal file
View file

@ -0,0 +1,39 @@
module.exports = {
branches: ["main"],
extends: ["@commitlint/config-conventional"],
message:
"chore(release): v${nextRelease.version} [skip ci]\n\n${nextRelease.notes}",
plugins: [
[
"@semantic-release/commit-analyzer",
{
preset: "conventionalcommits",
},
],
"@semantic-release/release-notes-generator",
"@semantic-release/npm",
[
"@semantic-release/exec",
{
prepareCmd: "npm run build",
},
],
"@semantic-release/changelog",
"@semantic-release/git",
[
"@saithodev/semantic-release-gitea",
{
giteaUrl: "https://src.mfgames.com",
assets: [
{ path: "*.epub", label: "EPUB2", type: "other" },
{ path: "*.pdf", label: "PDF", type: "other" },
{ path: "*.docx", label: "DOCX", type: "other" },
],
},
],
],
};

18
scripts/build.sh Executable file
View file

@ -0,0 +1,18 @@
#!/usr/bin/env bash
# Set up logging.
log() { echo "🛠️ $(basename $0): $@"; }
# Move into the root folder.
cd $(dirname $(dirname $0))
# Make sure everything is set up.
log "setting up project"
./scripts/setup.sh || exit 1
# Build the project outputs.
log "building PDF"
npm run build:pdf || exit 1
log "building EPUB"
npm run build:epub || exit 1

27
scripts/check-env-bucket.sh Executable file
View file

@ -0,0 +1,27 @@
#!/usr/bin/env bash
# Checks the environment to see if we have all the requisite components needed
# to upload or download from the S3 bucket.
# Set up logging.
log() { echo "⚗️ $(basename $0): $@"; }
# Move into the root folder.
cd $(dirname $(dirname $0))
for i in S3_ACCESS_KEY_ID S3_SECRET_ACCESS_KEY S3_ENDPOINT S3_BUCKET
do
if [ "x${!i}" = "x" ]
then
log "missing environment variable $i"
exit 1
fi
done
if [ ! which s3cmd 2> /dev/null ]
then
log "cannot find 's3cmd' to execute"
exit 1
fi
exit 0

40
scripts/release.sh Executable file
View file

@ -0,0 +1,40 @@
#!/usr/bin/env bash
# Builds the final versions of the book and then upload the results to various
# locations.
# Set up logging.
log() { echo "️🚢 $(basename $0): $@"; }
# Move into the root folder.
cd $(dirname $(dirname $0))
# Perform the basic environment checks and setup.
./scripts/setup.sh || exit 1
./scripts/check-env-bucket.sh || exit 1
# Clean up old versions of the file.
log "cleaning up prior versions which may not match versions"
rm -f dmoonfire*
# Perform the release process.
log "performing semantic release"
export GIT_CREDENTIALS="dmoonfire:$GITEA_TOKEN"
npx semantic-release || exit 1
# Create a tarball of the output files and upload them to S3.
if ls dmoonfire* &> /dev/null
then
log "packaging output into a tarball"
tar -cjf may-i-lead-this-dance.tar.bz2 dmoonfire*
log "uploading tarball to bucket"
export AWS_ACCESS_KEY_ID=$S3_ACCESS_KEY_ID
export AWS_SECRET_ACCESS_KEY=$S3_SECRET_ACCESS_KEY
export AWS_ENDPOINT=$S3_ENDPOINT
export AWS_BUCKET=$S3_BUCKET
s3cmd --access_key=$S3_ACCESS_KEY_ID --access_token=$S3_SECRET_ACCESS_KEY --host=$S3_ENDPOINT --host-bucket=$S3_ENDPOINT -P put may-i-lead-this-dance.tar.bz2 s3://$S3_BUCKET || exit 1
else
log "no files to upload"
fi

24
scripts/setup-fonts.sh Executable file
View file

@ -0,0 +1,24 @@
#!/usr/bin/env bash
# Sets up the fonts for building the PDF output. It doesn't do it if we are not
# in a CI environment.
# Set up logging.
log() { echo "✒️ $(basename $0): $@"; }
# Move into the root directory.
cd $(dirname $(dirname $0))
# We only insert the fonts if we are on a CI server.
if [ "x$CI" == "x" ]
then
log "not in CI environment, not installing fonts"
else
log "installing fonts"
mkdir -p ~/.local/share/fonts
cp $(nix-build --no-out-link '<nixpkgs>' -A source-serif-pro)/share/fonts/opentype/*.otf ~/.local/share/fonts
cp $(nix-build --no-out-link '<nixpkgs>' -A source-sans-pro)/share/fonts/opentype/*.otf ~/.local/share/fonts
log "updating font caches"
fc-cache
fi

17
scripts/setup-node.sh Executable file
View file

@ -0,0 +1,17 @@
#!/usr/bin/env bash
# Installs the required Node packages
# Set up logging.
log() { echo "📦️ $(basename $0): $@"; }
# Move into the root directory.
cd $(dirname $(dirname $0))
if [ -d ./node_modules ]
then
log "node_modules already exists"
else
log "setting up node"
npm install --ci
fi

9
scripts/setup.sh Executable file
View file

@ -0,0 +1,9 @@
#!/usr/bin/env bash
# Move into the root folder.
cd $(dirname $(dirname $0))
# Run the setup commands.
./scripts/setup-fonts.sh || exit 1
./scripts/setup-node.sh || exit 1