21 lines
1.9 KiB
JavaScript
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`)
|