Compare commits
2 commits
b10c132857
...
8b70f735fc
Author | SHA1 | Date | |
---|---|---|---|
![]() |
8b70f735fc | ||
![]() |
e291dbc4a2 |
12 changed files with 178 additions and 26 deletions
|
@ -1,2 +1,2 @@
|
|||
[tools]
|
||||
bun = "latest"
|
||||
bun = "1.2.22"
|
||||
|
|
BIN
bun.lockb
BIN
bun.lockb
Binary file not shown.
14
dist/palette.toml
vendored
14
dist/palette.toml
vendored
|
@ -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
22
dist/palette.yml
vendored
Normal 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"
|
2
index.ts
2
index.ts
|
@ -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)
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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
62
src/build/yaml.ts
Normal 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
3
src/helpers/string.ts
Normal file
|
@ -0,0 +1,3 @@
|
|||
export function toSnakeCase(str: string): string {
|
||||
return str.replaceAll(' ', '_').toLowerCase()
|
||||
}
|
30
tests/dist/toml.test.ts
vendored
Normal file
30
tests/dist/toml.test.ts
vendored
Normal 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
25
tests/dist/yaml.test.ts
vendored
Normal 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())
|
||||
})
|
||||
})
|
||||
|
9
tests/helpers/string.test.ts
Normal file
9
tests/helpers/string.test.ts
Normal 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')
|
||||
})
|
||||
|
Loading…
Add table
Reference in a new issue