53 lines
2.8 KiB
JavaScript
53 lines
2.8 KiB
JavaScript
const fs = require('node:fs')
|
|
const assert = require('node:assert/strict')
|
|
const crypto = require('node:crypto')
|
|
const postcss = require('postcss')
|
|
const evidence = JSON.parse(fs.readFileSync('.tmp/rea-todo20-new-project-dialog.json', 'utf8').replace(/^\uFEFF/, ''))
|
|
assert.equal(evidence.evidence_id, 'ev_bc0f5546bb714cad4634168969a115be8f34e307bc09f51caf1457f5d3ed61ec')
|
|
const output = postcss.root()
|
|
function sheet(name) {
|
|
const item = evidence.normalized_result.styles.items.find(item => item.file_path.endsWith(name))
|
|
assert.ok(item?.source.included)
|
|
const text = item.source.artifact.text
|
|
assert.equal(crypto.createHash('sha256').update(text).digest('hex'), item.source.artifact.sha256)
|
|
return postcss.parse(text)
|
|
}
|
|
sheet('tokens-Df-i-zsO.css').walkRules(rule => {
|
|
if (!rule.selector.includes(':root') && !rule.selector.includes('[data-theme=dark]')) return
|
|
if (!rule.nodes.some(node => node.type === 'decl' && node.prop.startsWith('--'))) return
|
|
const dark = rule.selector.includes('dark')
|
|
const target = postcss.rule({ selector: dark ? '[data-theme=dark] .yc-project-surface' : '.yc-project-surface' })
|
|
for (const node of rule.nodes) if (node.type === 'decl' && node.prop.startsWith('--')) target.append(node.clone())
|
|
output.append(target)
|
|
})
|
|
assert.ok(output.nodes.length >= 2)
|
|
function select(container) {
|
|
const result = container.clone({ nodes: [] })
|
|
for (const node of container.nodes || []) {
|
|
if (node.type === 'rule' && /\.wb-(?:button|input|textarea)(?:[\s.:#[\]>+~,-]|__|--|$)/.test(node.selector)) {
|
|
const copy = node.clone()
|
|
copy.selectors = copy.selectors.map(selector => `:where(.yc-project-surface) ${selector}`)
|
|
result.append(copy)
|
|
} else if (node.type === 'atrule' && node.nodes && !/keyframes$/.test(node.name)) {
|
|
const nested = select(node)
|
|
if (nested.nodes.length) result.append(nested)
|
|
}
|
|
}
|
|
return result
|
|
}
|
|
const controls = sheet('src-Bh3YZ35H.css')
|
|
controls.walkRules(rule => {
|
|
if (!rule.selector.includes(':root') && !rule.selector.includes('[data-theme=dark]')) return
|
|
const declarations = rule.nodes.filter(node => node.type === 'decl' && node.prop.startsWith('--'))
|
|
if (!declarations.length) return
|
|
const target = postcss.rule({ selector: rule.selector.includes('dark') ? '[data-theme=dark] .yc-project-surface' : '.yc-project-surface' })
|
|
declarations.forEach(node => target.append(node.clone()))
|
|
output.append(target)
|
|
})
|
|
output.append(select(controls).nodes)
|
|
const text = `/* WorkBuddy 5.8.3 shared controls/tokens; REA ${evidence.evidence_id}. */\n${output.toString()}\n`
|
|
const file = 'src/renderer/src/projects/source-project-controls.css'
|
|
if (process.argv.includes('--check')) assert.equal(fs.readFileSync(file, 'utf8'), text)
|
|
else fs.writeFileSync(file, text)
|
|
console.log(`PASS project controls/tokens: ${output.nodes.length} top-level blocks, hashes verified`)
|