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]
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
version = 0.0.1
license = GPL-3.0-only
sourcecode = https://git.basking.monster/gaiety/verdigris
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
name = "Gaiety"
email = "ava+verdigris@gaiety.me"
url = "https://gaiety.me"
[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 previewSnippet from './src/preview/cli-snippet'
import buildTOML from './src/build/toml'
import buildYAML from './src/build/yaml'
import buildKitty from './ports/kitty/src/build'
const program = new Command();
@ -41,6 +42,7 @@ program
if (options.verbose) console.info('Building Direct Exports...')
log(options.verbose, await buildTOML(), timer)
log(options.verbose, await buildYAML(), timer)
if (options.verbose) console.info('Building Ports...')
log(options.verbose, await buildKitty(), timer)

View file

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

View file

@ -3,13 +3,18 @@ import appRoot from 'app-root-path'
import { rmFile, mkFilePath, appendToFile } from "../helpers/file"
import colors from '../palette'
import type color from '../helpers/color'
import { toSnakeCase } from '../helpers/string'
const file = appRoot + '/dist/palette.toml'
const appendToTOML = async (content: string) => await appendToFile(file, content)
export default async function(isVerbose = false): Promise<string> {
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)
await mkFilePath(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 {
return `name = ${name}
version = ${version}
license = ${license}
sourcecode = ${url}
return `name = "${name}"
version = "${version}"
license = "${license}"
sourcecode = "${url}"
`
}
@ -40,11 +45,12 @@ function authorTOML(): string {
return `
[author]
name = ${name}
email = ${email}
url = ${url}
name = "${name}"
email = "${email}"
url = "${url}"
`
}
function colorHeaderTOML(): string {
return `
[colors]
@ -54,7 +60,7 @@ function colorHeaderTOML(): string {
function colorTOML(color: color): string {
const { name, l, c, h } = color
return `
[colors.${name.replaceAll(' ', '_').toLowerCase()}]
[colors.${toSnakeCase(name)}]
name = "${name}"
l = ${l}
c = ${c}
@ -62,11 +68,3 @@ h = ${h}
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')
})