mirror of
https://github.com/wahyd4/vuepress.git
synced 2026-08-09 13:26:08 +10:00
90 lines
2.4 KiB
JavaScript
90 lines
2.4 KiB
JavaScript
const path = require('path')
|
|
const spawn = require('cross-spawn')
|
|
const fs = require('fs-extra')
|
|
const globby = require('globby')
|
|
|
|
const tempPath = path.resolve(__dirname, '../app/.temp')
|
|
fs.ensureDirSync(tempPath)
|
|
|
|
const tempCache = new Map()
|
|
exports.writeTemp = async function (file, content) {
|
|
// cache write to avoid hitting the dist if it didn't change
|
|
const cached = tempCache.get(file)
|
|
if (cached !== content) {
|
|
await fs.writeFile(path.join(tempPath, file), content)
|
|
tempCache.set(file, content)
|
|
}
|
|
}
|
|
|
|
exports.writeEnhanceTemp = async function (destName, srcPath) {
|
|
await exports.writeTemp(
|
|
destName,
|
|
fs.existsSync(srcPath)
|
|
? `export { default } from ${JSON.stringify(srcPath)}`
|
|
: `export default function () {}`
|
|
)
|
|
}
|
|
|
|
const indexRE = /(^|.*\/)(index|readme)\.md$/i
|
|
const extRE = /\.(vue|md)$/
|
|
|
|
exports.fileToPath = function (file) {
|
|
if (exports.isIndexFile(file)) {
|
|
// README.md -> /
|
|
// foo/README.md -> /foo/
|
|
return file.replace(indexRE, '/$1')
|
|
} else {
|
|
// foo.md -> /foo.html
|
|
// foo/bar.md -> /foo/bar.html
|
|
return `/${file.replace(extRE, '').replace(/\\/g, '/')}.html`
|
|
}
|
|
}
|
|
|
|
exports.fileToComponentName = function (file) {
|
|
let normalizedName = file
|
|
.replace(/\/|\\/g, '-')
|
|
.replace(extRE, '')
|
|
if (exports.isIndexFile(file)) {
|
|
normalizedName = normalizedName.replace(/readme$/i, 'index')
|
|
}
|
|
const pagePrefix = /\.md$/.test(file) ? `page-` : ``
|
|
return `${pagePrefix}${normalizedName}`
|
|
}
|
|
|
|
exports.isIndexFile = function (file) {
|
|
return indexRE.test(file)
|
|
}
|
|
|
|
exports.resolveComponents = async function (sourceDir) {
|
|
const componentDir = path.resolve(sourceDir, '.vuepress/components')
|
|
if (!fs.existsSync(componentDir)) {
|
|
return
|
|
}
|
|
return exports.sort(await globby(['**/*.vue'], { cwd: componentDir }))
|
|
}
|
|
|
|
exports.sort = function (arr) {
|
|
return arr.sort((a, b) => {
|
|
if (a < b) return -1
|
|
if (a > b) return 1
|
|
return 0
|
|
})
|
|
}
|
|
|
|
exports.encodePath = function (userpath) {
|
|
return userpath.split('/').map(item => encodeURIComponent(item)).join('/')
|
|
}
|
|
|
|
exports.getGitLastUpdatedTimeStamp = function (filePath) {
|
|
let lastUpdated
|
|
try {
|
|
lastUpdated = parseInt(spawn.sync(
|
|
'git',
|
|
['log', '-1', '--format=%ct', path.basename(filePath)],
|
|
{ cwd: path.dirname(filePath) }
|
|
).stdout.toString('utf-8')) * 1000
|
|
} catch (e) { /* do not handle for now */ }
|
|
return lastUpdated
|
|
}
|
|
|