#!/usr/bin/env node /** * D6b: profile.vue palette hoist * 局部变量 $c-wisdom-mid/$c-danger-ant/$c-pink/$c-pink-deep 均有全局等值令牌 -> * 提升为全局引用(删声明 + 使用处替换),仅保留无令牌的 $c-fill-2b */ const fs = require('fs'); const F = 'pages/profile-main/profile.vue'; let lines = fs.readFileSync(F, 'utf8').split('\n'); const HOIST = [ ['$c-wisdom-mid', '$dim-wisdom-deep', '#4F46E5'], ['$c-danger-ant', '$status-danger-2', '#FF4D4F'], ['$c-pink-deep', '$accent-pink-deep', '#DB2777'], ['$c-pink', '$accent-pink', '#EC4899'], ]; let src = lines.join('\n'); // 先删除这 4 行声明(含其 hex 定义) for (const [v] of HOIST) { const re = new RegExp('^\\s*' + v.replace(/\$/g, '\\$') + '\\s*:[^\\n]*;[^\\n]*\\n', 'm'); if (!re.test(src)) { console.warn('DECL NOT FOUND:', v); } src = src.replace(re, ''); } // 再替换使用处(顺序:先 pink-deep 再 pink,避免前缀误伤) for (const [v, token] of HOIST) { const re = new RegExp(v.replace(/\$/g, '\\$') + '(?![a-zA-Z0-9-])', 'g'); const before = src; src = src.replace(re, token); if (before === src) console.warn('USE NOT REPLACED:', v); } fs.writeFileSync(F, src); console.log('hoisted 4 vars to global tokens'); // 校验剩余 lines = src.split('\n'); let n = 0; for (let i = 0; i < lines.length; i++) { if (/#[0-9a-fA-F]{3,8}\b/.test(lines[i])) { console.log('HEX ' + (i + 1) + ': ' + lines[i].trim()); n++; } } console.log('remaining hex lines:', n);