Enhance build-outline.mjs with progress tracking and parallel file copying for improved performance during SVG icon processing. Update tsconfig.json to include source files for better type checking.
This commit is contained in:
parent
2f0285ffbb
commit
af5ac46e7a
|
|
@ -14,12 +14,14 @@
|
||||||
"skipLibCheck": true,
|
"skipLibCheck": true,
|
||||||
"resolveJsonModule": true,
|
"resolveJsonModule": true,
|
||||||
"allowSyntheticDefaultImports": true,
|
"allowSyntheticDefaultImports": true,
|
||||||
|
"allowImportingTsExtensions": true,
|
||||||
"downlevelIteration": true,
|
"downlevelIteration": true,
|
||||||
"sourceMap": true,
|
"sourceMap": true,
|
||||||
"outDir": "./dist",
|
"outDir": "./dist",
|
||||||
"jsx": "react-jsx",
|
"jsx": "react-jsx",
|
||||||
"jsxImportSource": "preact",
|
"jsxImportSource": "preact",
|
||||||
"types": ["@testing-library/jest-dom"],
|
"types": ["@testing-library/jest-dom"]
|
||||||
},
|
},
|
||||||
"exclude": ["**/node_modules"]
|
"exclude": ["**/node_modules"],
|
||||||
|
"include": ["src"]
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -57,6 +57,19 @@ const buildOutline = async () => {
|
||||||
let processed = 0
|
let processed = 0
|
||||||
let cached = 0
|
let cached = 0
|
||||||
const total = iconsToProcess.length
|
const total = iconsToProcess.length
|
||||||
|
const startTime = Date.now()
|
||||||
|
|
||||||
|
// Progress update interval (every 50 icons to avoid console spam)
|
||||||
|
let lastProgress = 0
|
||||||
|
const showProgress = () => {
|
||||||
|
const done = processed + cached
|
||||||
|
if (done - lastProgress >= 50 || done === total) {
|
||||||
|
const percent = Math.round((done / total) * 100)
|
||||||
|
const elapsed = ((Date.now() - startTime) / 1000).toFixed(1)
|
||||||
|
process.stdout.write(`\r[${strokeName}/${type}] ${done}/${total} (${percent}%) - ${elapsed}s`.padEnd(60))
|
||||||
|
lastProgress = done
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
await parallelLimit(iconsToProcess, async ({ name, content, unicode }) => {
|
await parallelLimit(iconsToProcess, async ({ name, content, unicode }) => {
|
||||||
const filename = `u${unicode.toUpperCase()}-${name}.svg`
|
const filename = `u${unicode.toUpperCase()}-${name}.svg`
|
||||||
|
|
@ -73,6 +86,7 @@ const buildOutline = async () => {
|
||||||
|
|
||||||
if (cachedHash && crypto.createHash('sha1').update(contentWithoutHash).digest("hex") === cachedHash) {
|
if (cachedHash && crypto.createHash('sha1').update(contentWithoutHash).digest("hex") === cachedHash) {
|
||||||
cached++
|
cached++
|
||||||
|
showProgress()
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
|
|
@ -109,12 +123,14 @@ const buildOutline = async () => {
|
||||||
fs.writeFileSync(filePath, finalContent + hashString, 'utf-8')
|
fs.writeFileSync(filePath, finalContent + hashString, 'utf-8')
|
||||||
|
|
||||||
processed++
|
processed++
|
||||||
|
showProgress()
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error(`\nError processing ${strokeName}/${type}/${name}:`, error.message)
|
console.error(`\nError processing ${strokeName}/${type}/${name}:`, error.message)
|
||||||
}
|
}
|
||||||
}, 64) // 64 concurrent tasks
|
}, 64) // 64 concurrent tasks
|
||||||
|
|
||||||
console.log(`Stroke ${strokeName}/${type}: ${processed} processed, ${cached} cached`)
|
const totalTime = ((Date.now() - startTime) / 1000).toFixed(1)
|
||||||
|
console.log(`\n[${strokeName}/${type}] Done: ${processed} processed, ${cached} cached in ${totalTime}s`)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Remove old files
|
// Remove old files
|
||||||
|
|
@ -128,26 +144,29 @@ const buildOutline = async () => {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
// Copy icons to all directory
|
// Copy icons to all directory (parallel)
|
||||||
fs.mkdirSync(resolve(DIR, `icons-outlined/${strokeName}/all`), { recursive: true })
|
fs.mkdirSync(resolve(DIR, `icons-outlined/${strokeName}/all`), { recursive: true })
|
||||||
|
|
||||||
|
const copyTasks = []
|
||||||
for (const [type, typeIcons] of Object.entries(icons)) {
|
for (const [type, typeIcons] of Object.entries(icons)) {
|
||||||
for (const { name, unicode } of typeIcons) {
|
for (const { name, unicode } of typeIcons) {
|
||||||
if (!unicode) continue
|
if (!unicode) continue
|
||||||
const iconName = `u${unicode.toUpperCase()}-${name}`
|
copyTasks.push({ type, name, unicode })
|
||||||
const srcPath = resolve(DIR, `icons-outlined/${strokeName}/${type}/${iconName}.svg`)
|
|
||||||
|
|
||||||
try {
|
|
||||||
fs.copyFileSync(
|
|
||||||
srcPath,
|
|
||||||
resolve(DIR, `icons-outlined/${strokeName}/all/${iconName}${type !== 'outline' ? `-${type}` : ''}.svg`)
|
|
||||||
)
|
|
||||||
} catch (e) {
|
|
||||||
// Source file doesn't exist, skip
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
await parallelLimit(copyTasks, async ({ type, name, unicode }) => {
|
||||||
|
const iconName = `u${unicode.toUpperCase()}-${name}`
|
||||||
|
const srcPath = resolve(DIR, `icons-outlined/${strokeName}/${type}/${iconName}.svg`)
|
||||||
|
const destPath = resolve(DIR, `icons-outlined/${strokeName}/all/${iconName}${type !== 'outline' ? `-${type}` : ''}.svg`)
|
||||||
|
|
||||||
|
try {
|
||||||
|
fs.copyFileSync(srcPath, destPath)
|
||||||
|
} catch (e) {
|
||||||
|
// Source file doesn't exist, skip
|
||||||
|
}
|
||||||
|
}, 128) // High concurrency for simple I/O
|
||||||
|
|
||||||
console.log(`Stroke ${strokeName}: completed`)
|
console.log(`Stroke ${strokeName}: completed`)
|
||||||
}))
|
}))
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue