Files
ycode/scripts/rea/recover-project-controls.cjs
T

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`)