123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121 |
- const fs = require('fs')
- const path = require('path')
- const fsLstatSyncCache = {}
- const fsLstatSync = (source) => {
- fsLstatSyncCache[source] = fsLstatSyncCache[source] || fs.lstatSync(source)
- return fsLstatSyncCache[source]
- }
- function isDirectory(source) {
- return fsLstatSync(source).isDirectory()
- }
- function isSymlink(source) {
- return fsLstatSync(source).isSymbolicLink()
- }
- function getUrlFromPagesDirectories(urlPrefix, directories) {
- return Array.from(
-
- new Set(
- directories
- .map((directory) => parseUrlForPages(urlPrefix, directory))
- .flat()
- .map(
-
- (url) => `^${normalizeURL(url)}$`
- )
- )
- ).map((urlReg) => {
- urlReg = urlReg.replace(/\[.*\]/g, '((?!.+?\\..+?).*?)')
- return new RegExp(urlReg)
- })
- }
- const fsReadDirSyncCache = {}
- function parseUrlForPages(urlprefix, directory) {
- fsReadDirSyncCache[directory] =
- fsReadDirSyncCache[directory] || fs.readdirSync(directory)
- const res = []
- fsReadDirSyncCache[directory].forEach((fname) => {
-
-
- if (/(\.(j|t)sx?)$/.test(fname)) {
- if (/^index(\.(j|t)sx?)$/.test(fname)) {
- res.push(`${urlprefix}${fname.replace(/^index(\.(j|t)sx?)$/, '')}`)
- }
- res.push(`${urlprefix}${fname.replace(/(\.(j|t)sx?)$/, '')}`)
- } else {
- const dirPath = path.join(directory, fname)
- if (isDirectory(dirPath) && !isSymlink(dirPath)) {
- res.push(...parseUrlForPages(urlprefix + fname + '/', dirPath))
- }
- }
- })
- return res
- }
- function normalizeURL(url) {
- if (!url) {
- return
- }
- url = url.split('?')[0]
- url = url.split('#')[0]
- url = url = url.replace(/(\/index\.html)$/, '/')
-
- if (url === '') {
- return url
- }
- url = url.endsWith('/') ? url : url + '/'
- return url
- }
- function execOnce(fn) {
- let used = false
- let result
- return (...args) => {
- if (!used) {
- used = true
- result = fn(...args)
- }
- return result
- }
- }
- module.exports = {
- getUrlFromPagesDirectories,
- normalizeURL,
- execOnce,
- }
|