64 lines
1.4 KiB
TypeScript
64 lines
1.4 KiB
TypeScript
![]() |
import MetalSmith from 'metalsmith';
|
||
|
import { ejs } from 'consolidate';
|
||
|
import { promisify } from 'util';
|
||
|
import * as path from 'path';
|
||
|
|
||
|
/**
|
||
|
*
|
||
|
* @param {*} fromPath 源路径
|
||
|
* @param {*} toPath 目标路径
|
||
|
*/
|
||
|
async function handleTemplate(fromPath: string, toPath: string, config: any) {
|
||
|
await new Promise((resovle, reject) => {
|
||
|
MetalSmith(__dirname)
|
||
|
.source(fromPath)
|
||
|
.destination(path.join(path.resolve(), toPath))
|
||
|
.use(async (_files, metal, done) => {
|
||
|
let result = {
|
||
|
license: 'MIT',
|
||
|
version: '0.0.1',
|
||
|
...config,
|
||
|
};
|
||
|
const data = metal.metadata();
|
||
|
Object.assign(data, result);
|
||
|
//@ts-ignore
|
||
|
done();
|
||
|
})
|
||
|
.use((files, metal, done) => {
|
||
|
Object.keys(files).forEach(async (file) => {
|
||
|
let content = files[file].contents.toString();
|
||
|
if (
|
||
|
file.includes('.js') ||
|
||
|
file.includes('.json') ||
|
||
|
file.includes('.txt') ||
|
||
|
file.includes('.md')
|
||
|
) {
|
||
|
if (content.includes('<%')) {
|
||
|
let { render } = ejs;
|
||
|
//@ts-ignore
|
||
|
render = promisify(render);
|
||
|
try {
|
||
|
content = await render(content, metal.metadata());
|
||
|
} catch (e) {
|
||
|
console.log(e);
|
||
|
}
|
||
|
files[file].contents = Buffer.from(content);
|
||
|
}
|
||
|
}
|
||
|
});
|
||
|
//@ts-ignore
|
||
|
done();
|
||
|
})
|
||
|
.build((err) => {
|
||
|
if (!err) {
|
||
|
resovle(true);
|
||
|
} else {
|
||
|
console.log(err);
|
||
|
reject(false);
|
||
|
}
|
||
|
});
|
||
|
});
|
||
|
}
|
||
|
|
||
|
export default handleTemplate;
|