rsnext/packages/eslint-plugin-next/lib/utils/url.js
Prateek Bhatnagar 75b0bfff9c
bug fixes for Lint routing (#13111)
- bug fixes in `@next/eslint-plugin-next`.
- adds rules to `recommended` config.
2020-05-21 23:42:20 +00:00

82 lines
2 KiB
JavaScript

const fs = require('fs')
const path = require('path')
/**
* Checks if the source is a directory.
* @param {string} source
*/
function isDirectory(source) {
return fs.lstatSync(source).isDirectory()
}
/**
* Checks if the source is a directory.
* @param {string} source
*/
function isSymlink(source) {
return fs.lstatSync(source).isSymbolicLink()
}
/**
* Gets the possible URLs from a directory.
* @param {string} urlprefix
* @param {string} directory
*/
function getUrlFromPagesDirectory(urlPrefix, directory) {
return parseUrlForPages(urlPrefix, directory).map(
// Since the URLs are normalized we add `^` and `$` to the RegExp to make sure they match exactly.
(url) => new RegExp(`^${normalizeURL(url)}$`)
)
}
/**
* Recursively parse directory for page URLs.
* @param {string} urlprefix
* @param {string} directory
*/
function parseUrlForPages(urlprefix, directory) {
const files = fs.readdirSync(directory)
const res = []
files.forEach((fname) => {
if (/(\.(j|t)sx?)$/.test(fname)) {
fname = fname.replace(/\[.*\]/g, '.*')
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
}
/**
* Takes a url and does the following things.
* - replace `index.html` with `/`
* - Makes sure all URLs are have a trainiling `/`
* - Removes query string
* @param {string} url
*/
function normalizeURL(url) {
if (!url) {
return
}
url = url.split('?')[0]
url = url.split('#')[0]
url = url = url.replace(/(\/index\.html)$/, '/')
// empty URLs should not be trailed with `/`, e.g. `#heading`
if (url === '') {
return url
}
url = url.endsWith('/') ? url : url + '/'
return url
}
module.exports = {
getUrlFromPagesDirectory,
normalizeURL,
}