mirror of
https://github.com/terribleplan/next.js.git
synced 2024-01-19 02:48:18 +00:00
165924b71b
* Server JSON pages directly from the filesystem. * Make Json pages even if there's an error. * Implement much better page serving. * Use JsonPagesPlugin in the production mode as well. * Add gzip support for JSON pages. * Use glob-promise instead of recursive-readdir * Handle renderStatic 404 properly. * Simply the gzip code. * Cache already read JSON pages. * Change JSON pages extension to .json. * Fix HMR related issue. * Fix hot-reload for .json solely on server. * Properly clear cache on hot-reloader. * Convert .js pages into .json page right inside the plugin. * Fix gzipping .json pages. * Remove unwanted json pages cleanup. * Get rid of deprecated fs.exists for fs.access
56 lines
1 KiB
JavaScript
56 lines
1 KiB
JavaScript
import { join, sep } from 'path'
|
|
import fs from 'mz/fs'
|
|
|
|
export default async function resolve (id) {
|
|
const paths = getPaths(id)
|
|
for (const p of paths) {
|
|
if (await isFile(p)) {
|
|
return p
|
|
}
|
|
}
|
|
|
|
const err = new Error(`Cannot find module ${id}`)
|
|
err.code = 'ENOENT'
|
|
throw err
|
|
}
|
|
|
|
export function resolveFromList (id, files) {
|
|
const paths = getPaths(id)
|
|
const set = new Set(files)
|
|
for (const p of paths) {
|
|
if (set.has(p)) return p
|
|
}
|
|
}
|
|
|
|
function getPaths (id) {
|
|
const i = sep === '/' ? id : id.replace(/\//g, sep)
|
|
|
|
if (i.slice(-3) === '.js') return [i]
|
|
if (i.slice(-5) === '.json') return [i]
|
|
|
|
if (i[i.length - 1] === sep) {
|
|
return [
|
|
i + 'index.json',
|
|
i + 'index.js'
|
|
]
|
|
}
|
|
|
|
return [
|
|
i + '.js',
|
|
join(i, 'index.js'),
|
|
i + '.json',
|
|
join(i, 'index.json')
|
|
]
|
|
}
|
|
|
|
async function isFile (p) {
|
|
let stat
|
|
try {
|
|
stat = await fs.stat(p)
|
|
} catch (err) {
|
|
if (err.code === 'ENOENT') return false
|
|
throw err
|
|
}
|
|
return stat.isFile() || stat.isFIFO()
|
|
}
|