import fs from 'node:fs'
const originFilePath = 'vars.less'
const originRootPath = '../src/'
const outputPath1 = '../src'
const outputPath2 = '../dist'
const tokenList = {}
export default () => {
const writeFile = () => {
const fileContent = `const list = ${JSON.stringify(tokenList, null, 2)};
export default list;
`
fs.writeFileSync(`${outputPath1}/token.js`, fileContent, 'utf8')
fs.writeFileSync(`${outputPath2}/token.js`, fileContent, 'utf8')
}
const parseVarsFile = (content) => {
const lines = content.split('\n')
const result = []
let desc = ''
let skipNext = false
for (let i = 0; i < lines.length; i++) {
const line = lines[i].trim()
if (line.startsWith('//-------') || line.startsWith('// -------')) {
skipNext = true
}
if (line.startsWith('//') && !skipNext) {
desc = line.replace(/^\/\/\s*/, '')
}
if (line.startsWith('--tv-')) {
if (!desc) {
desc = ''
console.log(`Missing description for variable at line ${i + 1}: ${line}`)
}
const [token, valuePart] = line.split(':').map((s) => s.trim())
let tokenValue = ''
const tokenValueMatch = valuePart.match(/,\s*([^)]+)\)?/)
if (tokenValueMatch) {
tokenValue = tokenValueMatch[1]
} else {
tokenValue = valuePart.replace(/;.*$/, '')
}
tokenValue = tokenValue.split(';')[0].split('//')[0].trim()
if (tokenValue.includes('rgba') || tokenValue.includes('rgb')) {
tokenValue += ')'
}
result.push({
desc,
token,
tokenValue
})
desc = ''
}
skipNext = false
}
return result
}
const readFile = (fileDir) => {
const varsPath = `${originRootPath}/${fileDir}/${originFilePath}`
try {
const content = fs.readFileSync(varsPath, { encoding: 'utf-8' })
return parseVarsFile(content)
} catch (error) {
console.console.log(error)
return []
}
}
const isFileExist = (fileDir) => {
const path = `${originRootPath}/${fileDir}/${originFilePath}`
try {
const exist = fs.existsSync(path)
if (exist) {
return readFile(fileDir)
}
return []
} catch (error) {
console.console.log(error)
return []
}
}
const mkStat = (fileDir) => {
if (fileDir === 'base') {
return
}
const statPath = `${originRootPath}/${fileDir}`
const data = fs.statSync(statPath)
if (data.isDirectory()) {
return isFileExist(fileDir)
}
}
const data = fs.readdirSync(originRootPath)
data.forEach((fileDir) => {
const fileTokens = mkStat(fileDir)
if (fileTokens && fileTokens.length) {
tokenList[fileDir] = fileTokens
}
})
writeFile()
}