Files
ycode/scripts/rea/recover-project-detail-styles.cjs

21 lines
1.9 KiB
JavaScript

// Recover the observed project-detail selectors from REA retained evidence.
const fs=require('node:fs'),path=require('node:path'),crypto=require('node:crypto'),postcss=require('postcss'),assert=require('node:assert/strict')
const evidence=JSON.parse(fs.readFileSync('.tmp/rea-todo20-project-tasks-full.json','utf8').replace(/^\uFEFF/,''))
assert.equal(evidence.evidence_id,'ev_8782905c492acd1618e137480a3da8a8d7eba56e8f328e4856b008e1dd7f34ea')
const source=evidence.normalized_result.styles.items.find(item=>item.file_path.endsWith('project-detail-page-aED_k-Ym.css'))
assert.ok(source?.source.included)
const css=source.source.artifact.text
const sha=crypto.createHash('sha256').update(css).digest('hex')
assert.equal(sha,source.source.artifact.sha256)
const root=postcss.parse(css),out=postcss.root();let count=0
function select(container){const result=container.clone({nodes:[]});for(const node of container.nodes||[]){
if(node.type==='rule'&&/(?:project-detail-view|project-task-panel|project-instruction-drawer|context-panel|wb-config-card|task-item|wb-list-item|wb-status-dot|wb-avatar|collaborator-avatar-stack)/.test(node.selector)){
const rule=node.clone();rule.selectors=rule.selectors.map(selector=>`:where(.yc-project-surface) ${selector}`);result.append(rule);count++
}else if(node.type==='atrule'&&node.nodes&&!/keyframes$/i.test(node.name)){const nested=select(node);if(nested.nodes.length)result.append(nested)}
}return result}
out.append(select(root).nodes)
const text=`/* WorkBuddy 5.8.3 project detail; REA ${evidence.evidence_id}; source SHA-256 ${sha}. */\n${out.toString()}\n`
const destination=path.resolve('src/renderer/src/projects/source-project-detail-recovered.css')
if(process.argv.includes('--check'))assert.equal(fs.readFileSync(destination,'utf8'),text);else fs.writeFileSync(destination,text)
console.log(`PASS project-detail CSS: ${count} scoped rules; SHA verified`)