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