Compare commits

...

2 commits

Author SHA1 Message Date
Ava Gaiety W
8b70f735fc yaml builds, and tests for builds 2025-09-20 12:31:11 -06:00
Ava Gaiety W
e291dbc4a2 toml test, abstract string function with test 2025-09-20 11:30:30 -06:00
12 changed files with 178 additions and 26 deletions

View file

@ -1,2 +1,2 @@
[tools] [tools]
bun = "latest" bun = "1.2.22"

BIN
bun.lockb

Binary file not shown.

14
dist/palette.toml vendored
View file

@ -1,12 +1,12 @@
name = verdigris name = "verdigris"
version = 0.0.1 version = "0.0.1"
license = GPL-3.0-only license = "GPL-3.0-only"
sourcecode = https://git.basking.monster/gaiety/verdigris sourcecode = "https://git.basking.monster/gaiety/verdigris"
[author] [author]
name = Gaiety name = "Gaiety"
email = ava+verdigris@gaiety.me email = "ava+verdigris@gaiety.me"
url = https://gaiety.me url = "https://gaiety.me"
[colors] [colors]

22
dist/palette.yml vendored Normal file
View file

@ -0,0 +1,22 @@
name: "verdigris"
version: "0.0.1"
license: "GPL-3.0-only"
sourcecode: "https://git.basking.monster/gaiety/verdigris"
author:
name: "Gaiety"
email: "ava+verdigris@gaiety.me"
url: "https://gaiety.me"
common:
pit: "#00040B"
depths: "#19323B"
stope: "#4E6872"
text: "#C6E4F0"
orange: "#FF9F6F"
teal: "#23DBC1"
red: "#E8ADA9"
yellow: "#E1B392"
green: "#98CCAC"
blue: "#8CC8E0"
purple: "#BEB6E8"

View file

@ -4,6 +4,7 @@ import { timerToSeconds } from './src/helpers/math';
import previewList from './src/preview/cli-list' import previewList from './src/preview/cli-list'
import previewSnippet from './src/preview/cli-snippet' import previewSnippet from './src/preview/cli-snippet'
import buildTOML from './src/build/toml' import buildTOML from './src/build/toml'
import buildYAML from './src/build/yaml'
import buildKitty from './ports/kitty/src/build' import buildKitty from './ports/kitty/src/build'
const program = new Command(); const program = new Command();
@ -41,6 +42,7 @@ program
if (options.verbose) console.info('Building Direct Exports...') if (options.verbose) console.info('Building Direct Exports...')
log(options.verbose, await buildTOML(), timer) log(options.verbose, await buildTOML(), timer)
log(options.verbose, await buildYAML(), timer)
if (options.verbose) console.info('Building Ports...') if (options.verbose) console.info('Building Ports...')
log(options.verbose, await buildKitty(), timer) log(options.verbose, await buildKitty(), timer)

View file

@ -15,7 +15,8 @@
"app-root-path": "^3.1.0", "app-root-path": "^3.1.0",
"chalk": "^5.6.2", "chalk": "^5.6.2",
"color-convert": "^3.1.2", "color-convert": "^3.1.2",
"commander": "^14.0.1" "commander": "^14.0.1",
"estilo": "^2.1.3",
}, },
"peerDependencies": { "peerDependencies": {
"typescript": "^5.0.0" "typescript": "^5.0.0"

View file

@ -3,13 +3,18 @@ import appRoot from 'app-root-path'
import { rmFile, mkFilePath, appendToFile } from "../helpers/file" import { rmFile, mkFilePath, appendToFile } from "../helpers/file"
import colors from '../palette' import colors from '../palette'
import type color from '../helpers/color' import type color from '../helpers/color'
import { toSnakeCase } from '../helpers/string'
const file = appRoot + '/dist/palette.toml' const file = appRoot + '/dist/palette.toml'
const appendToTOML = async (content: string) => await appendToFile(file, content) const appendToTOML = async (content: string) => await appendToFile(file, content)
export default async function(isVerbose = false): Promise<string> { export default async function(isVerbose = false): Promise<string> {
if (isVerbose) console.info('Removing previous build', file) if (isVerbose) console.info('Removing previous build', file)
await rmFile(file) try {
await rmFile(file)
} catch (error) {
console.info('TOML: Previous build already removed')
}
if (isVerbose) console.info('Ensuring path and file exist', file) if (isVerbose) console.info('Ensuring path and file exist', file)
await mkFilePath(file) await mkFilePath(file)
if (isVerbose) console.info('Writing header info to file', file) if (isVerbose) console.info('Writing header info to file', file)
@ -28,10 +33,10 @@ export default async function(isVerbose = false): Promise<string> {
} }
function headerTOML(): string { function headerTOML(): string {
return `name = ${name} return `name = "${name}"
version = ${version} version = "${version}"
license = ${license} license = "${license}"
sourcecode = ${url} sourcecode = "${url}"
` `
} }
@ -40,11 +45,12 @@ function authorTOML(): string {
return ` return `
[author] [author]
name = ${name} name = "${name}"
email = ${email} email = "${email}"
url = ${url} url = "${url}"
` `
} }
function colorHeaderTOML(): string { function colorHeaderTOML(): string {
return ` return `
[colors] [colors]
@ -54,7 +60,7 @@ function colorHeaderTOML(): string {
function colorTOML(color: color): string { function colorTOML(color: color): string {
const { name, l, c, h } = color const { name, l, c, h } = color
return ` return `
[colors.${name.replaceAll(' ', '_').toLowerCase()}] [colors.${toSnakeCase(name)}]
name = "${name}" name = "${name}"
l = ${l} l = ${l}
c = ${c} c = ${c}
@ -62,11 +68,3 @@ h = ${h}
hex = "${color.toHex()}" hex = "${color.toHex()}"
` `
} }
// [colors]
//
// [colors.bg]
// l = 0.2
// c = 0.02
// h =

62
src/build/yaml.ts Normal file
View file

@ -0,0 +1,62 @@
import { name, version, license, url, author } from '../../package.json'
import appRoot from 'app-root-path'
import { rmFile, mkFilePath, appendToFile } from "../helpers/file"
import { toSnakeCase } from '../helpers/string'
import colors from '../palette'
import type color from '../helpers/color'
const file = appRoot + '/dist/palette.yml'
const appendToYAML = async (content: string) => await appendToFile(file, content)
export default async function(isVerbose = false): Promise<string> {
if (isVerbose) console.info('Removing previous build', file)
try {
await rmFile(file)
} catch (error) {
console.info('YAML: Previous build already removed')
}
if (isVerbose) console.info('Ensuring path and file exist', file)
await mkFilePath(file)
if (isVerbose) console.info('Writing header info to file', file)
await appendToYAML(headerYAML())
if (isVerbose) console.info('Writing author info to file', file)
await appendToYAML(authorYAML())
if (isVerbose) console.info('Writing color palette to file', file)
await appendToYAML(colorHeaderYAML())
for (let index = 0; index < colors.length; index++) {
const color = colors[index]
if (isVerbose) console.info(`${color.name}`, file)
await appendToYAML(colorYAML(color))
}
return file
}
function headerYAML(): string {
return `name: "${name}"
version: "${version}"
license: "${license}"
sourcecode: "${url}"
`
}
function authorYAML(): string {
const { name, email, url } = author
return `
author:
name: "${name}"
email: "${email}"
url: "${url}"
`
}
function colorHeaderYAML(): string {
return `
common:`
}
function colorYAML(color: color): string {
return `
${toSnakeCase(color.name)}: "${color.toHex()}"`
}

3
src/helpers/string.ts Normal file
View file

@ -0,0 +1,3 @@
export function toSnakeCase(str: string): string {
return str.replaceAll(' ', '_').toLowerCase()
}

30
tests/dist/toml.test.ts vendored Normal file
View file

@ -0,0 +1,30 @@
import { name, version, license, url, author } from '../../package.json'
import { expect, test } from 'bun:test'
import data from '../../dist/palette.toml'
import colors from '../../src/palette'
import { toSnakeCase } from '../../src/helpers/string'
test('has header info', () => {
expect(data.name).toBe(name)
expect(data.version).toBe(version)
expect(data.license).toBe(license)
expect(data.sourcecode).toBe(url)
expect(data.author.name).toBe(author.name)
expect(data.author.email).toBe(author.email)
expect(data.author.url).toBe(author.url)
})
test('has expected colors', () => {
colors.forEach(color => {
const { name, l, c, h } = color
const dataColor = data.colors[toSnakeCase(name)]
expect(dataColor.name).toBe(name)
expect(dataColor.l).toBe(l)
expect(dataColor.c).toBe(c)
expect(dataColor.h).toBe(h)
expect(dataColor.hex).toBe(color.toHex())
})
})

25
tests/dist/yaml.test.ts vendored Normal file
View file

@ -0,0 +1,25 @@
import { name, version, license, url, author } from '../../package.json'
import { expect, test } from 'bun:test'
import colors from '../../src/palette'
import { toSnakeCase } from '../../src/helpers/string'
import data from '../../dist/palette.yml'
test('has header info', () => {
expect(data.name).toBe(name)
expect(data.version).toBe(version)
expect(data.license).toBe(license)
expect(data.sourcecode).toBe(url)
expect(data.author.name).toBe(author.name)
expect(data.author.email).toBe(author.email)
expect(data.author.url).toBe(author.url)
})
test('has expected colors', () => {
colors.forEach(color => {
const dataColor = data.common[toSnakeCase(color.name)]
expect(dataColor).toBe(color.toHex())
})
})

View file

@ -0,0 +1,9 @@
import { expect, test } from 'bun:test'
import { toSnakeCase } from '../../src/helpers/string'
test('can convert a string to snake case', () => {
expect(
toSnakeCase('Very Cool Beans')
).toBe('very_cool_beans')
})