{"version":3,"file":"index.cjs","sources":["../src/utils/directory.ts","../src/utils/options.ts","../src/utils/regex.ts","../src/utils/scan-files.ts","../src/utils/lookup.ts","../src/handler.ts","../src/module.ts"],"sourcesContent":["import fs from 'node:fs';\nimport path from 'node:path';\nimport type { ReadDirectoryCallback } from '../type';\n\nexport function readDirectory(\n    dir: string,\n    callback: ReadDirectoryCallback,\n    prefix = '',\n) {\n    dir = path.resolve('.', dir);\n\n    let abs : string;\n    let stats : fs.Stats;\n\n    fs.promises.readdir(dir)\n        .then((arr) => {\n            for (let i = 0; i < arr.length; i++) {\n                abs = path.join(dir, arr[i]);\n                stats = fs.statSync(abs);\n\n                if (stats.isDirectory()) {\n                    readDirectory(abs, callback, path.join(prefix, arr[i]));\n                } else {\n                    callback(path.join(prefix, arr[i]), abs, stats);\n                }\n            }\n        });\n}\n","import path from 'node:path';\nimport type { Options, OptionsInput } from '../type';\n\nexport function buildOptions(input: OptionsInput) : Options {\n    let fallbackPath = '/';\n    if (typeof input.fallback === 'string') {\n        const idx = input.fallback.lastIndexOf('.');\n        fallbackPath += ~idx ? input.fallback.substring(0, idx) : input.fallback;\n    }\n\n    const fallbackIgnores : RegExp[] = [];\n    if (typeof input.fallbackIgnores !== 'undefined') {\n        // any file with extension\n        fallbackIgnores.push(/[/]([A-Za-z\\s\\d~$._-]+\\.\\w+)+$/);\n\n        if (input.dotFiles) {\n            fallbackIgnores.push(/\\/\\.\\w/);\n        } else {\n            fallbackIgnores.push(/\\/\\.well-known/);\n        }\n\n        if (Array.isArray(input.fallbackIgnores)) {\n            for (let i = 0; i < input.fallbackIgnores.length; i++) {\n                fallbackIgnores.push(new RegExp(input.fallbackIgnores[i], 'i'));\n            }\n        } else {\n            fallbackIgnores.push(new RegExp(input.fallbackIgnores, 'i'));\n        }\n    }\n\n    const ignores : RegExp[] = [];\n    if (typeof input.ignores !== 'undefined') {\n        if (!input.dotFiles) {\n            ignores.push(/\\/\\.\\w/);\n        }\n\n        if (Array.isArray(input.ignores)) {\n            for (let i = 0; i < input.ignores.length; i++) {\n                ignores.push(new RegExp(input.ignores[i], 'i'));\n            }\n        }\n    }\n\n    let directoryPath : string;\n    if (input.directoryPath) {\n        if (path.isAbsolute(input.directoryPath)) {\n            directoryPath = input.directoryPath;\n        } else {\n            directoryPath = path.resolve(input.directoryPath);\n        }\n    } else {\n        directoryPath = path.resolve('.');\n    }\n\n    let cacheMaxAge : number | false;\n\n    if (typeof input.cacheMaxAge === 'boolean') {\n        if (input.cacheMaxAge) {\n            cacheMaxAge = false;\n        } else {\n            cacheMaxAge = 0;\n        }\n    } else {\n        cacheMaxAge = input.cacheMaxAge || 0;\n    }\n\n    return {\n        directoryPath,\n        fallbackPath,\n        scan: input.scan ?? true,\n        cacheMaxAge,\n        fallthrough: input.fallthrough ?? true,\n        cacheImmutable: input.cacheImmutable ?? false,\n        fallback: input.fallback ?? false,\n        fallbackIgnores,\n        extensions: input.extensions ?? ['html', 'htm'],\n        dotFiles: input.dotFiles ?? false,\n        ignores,\n    };\n}\n","export function isRegexMatch(input: string, pattern: RegExp | RegExp[]) : boolean {\n    const patterns = Array.isArray(pattern) ? pattern : [pattern];\n\n    for (let i = 0; i < patterns.length; i++) {\n        if (patterns[i].test(input)) {\n            return true;\n        }\n    }\n\n    return false;\n}\n","import type { FileInfo, Options } from '../type';\nimport { readDirectory } from './directory';\nimport { isRegexMatch } from './regex';\n\nexport function scanFiles(\n    stack: Record<string, FileInfo>,\n    options: Options,\n) {\n    if (!options.scan) {\n        return;\n    }\n\n    readDirectory(options.directoryPath, (relativePath, filePath, stats) => {\n        if (\n            !(/\\.well-known[\\\\+/]/.test(relativePath)) &&\n            !options.dotFiles &&\n            /(^\\.|[\\\\+|/+]\\.)/.test(relativePath)\n        ) {\n            return;\n        }\n\n        if (\n            options.ignores.length > 0 &&\n            isRegexMatch(relativePath, options.ignores)\n        ) {\n            return;\n        }\n\n        const key = `/${relativePath.normalize().replace(/\\\\+/g, '/')}`;\n\n        stack[key] = {\n            filePath,\n            stats,\n        };\n    });\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\nimport type { FileInfo, Options } from '../type';\nimport { isRegexMatch } from './regex';\n\nfunction generatePathForExtensions(\n    requestPath: string,\n    extensions: string[],\n) : string[] {\n    const items = [];\n\n    for (let i = 0; i < extensions.length; i++) {\n        items.push(\n            requestPath +\n            (extensions[i].startsWith('.') ? extensions[i] : `.${extensions[i]}`),\n        );\n    }\n\n    return items;\n}\n\nfunction withLeadingSlash(input: string) {\n    if (\n        input.length > 0 &&\n        !input.startsWith('/')\n    ) {\n        return `/${input}`;\n    }\n\n    return input;\n}\n\nconst lookupPath = async (\n    requestPath: string,\n    options: Options,\n    stack?: Record<string, FileInfo>,\n) : Promise<FileInfo | undefined> => {\n    const relativeFilePaths : string[] = [];\n\n    const parts = requestPath\n        .split('/')\n        .filter((el) => el.length > 0);\n\n    const basePaths : string[] = [];\n    // no file\n    while (parts.length > 0) {\n        const next = parts.join('/');\n        if (next.length > 0) {\n            basePaths.push(withLeadingSlash(next));\n        }\n\n        parts.shift();\n    }\n\n    if (basePaths.length === 0) {\n        relativeFilePaths.push(...generatePathForExtensions('/index', options.extensions));\n    } else {\n        for (let i = 0; i < basePaths.length; i++) {\n            const basePath = basePaths[i];\n            if (basePath.endsWith('/')) {\n                relativeFilePaths.push(...generatePathForExtensions(`${basePath}index`, options.extensions));\n            } else {\n                relativeFilePaths.push(basePath);\n                relativeFilePaths.push(...generatePathForExtensions(basePath, options.extensions));\n                relativeFilePaths.push(...generatePathForExtensions(`${basePath}/index`, options.extensions));\n            }\n        }\n    }\n\n    if (\n        options.scan &&\n        stack\n    ) {\n        for (let i = 0; i < relativeFilePaths.length; i++) {\n            if (typeof stack[relativeFilePaths[i]] !== 'undefined') {\n                return stack[relativeFilePaths[i]];\n            }\n        }\n    } else {\n        let filePath : string;\n        for (let i = 0; i < relativeFilePaths.length; i++) {\n            filePath = path.join(options.directoryPath, relativeFilePaths[i]);\n\n            try {\n                const stats = await fs.promises.stat(filePath);\n                if (stats.isFile()) {\n                    return {\n                        stats,\n                        filePath,\n                    };\n                }\n            } catch (e) {\n                // do nothing :)\n            }\n        }\n    }\n\n    return undefined;\n};\n\nexport async function lookup(\n    requestPath: string,\n    options: Options,\n    stack?: Record<string, FileInfo>,\n) : Promise<FileInfo | undefined> {\n    let fileInfo : FileInfo | undefined;\n\n    if (\n        options.ignores.length === 0 ||\n        !isRegexMatch(requestPath, options.ignores)\n    ) {\n        fileInfo = await lookupPath(requestPath, options, stack);\n    }\n\n    if (\n        typeof fileInfo === 'undefined' &&\n        !!options.fallback &&\n        !isRegexMatch(requestPath, options.fallbackIgnores)\n    ) {\n        fileInfo = await lookupPath(options.fallbackPath, options, stack);\n    }\n\n    return fileInfo;\n}\n","import fs from 'node:fs';\nimport type { CoreHandlerFn, Handler } from 'routup';\nimport {\n    HeaderName,\n    coreHandler,\n    sendFile,\n    useRequestMountPath,\n    useRequestPath,\n} from 'routup';\nimport type { FileInfo, OptionsInput } from './type';\nimport { buildOptions, scanFiles } from './utils';\nimport { lookup } from './utils/lookup';\n\nexport function createHandler(directory: string, input?: OptionsInput) : Handler {\n    return coreHandler(createHandlerFn(directory, input));\n}\nexport function createHandlerFn(directory: string, input?: OptionsInput) : CoreHandlerFn {\n    const options = buildOptions({\n        ...(input || {}),\n        directoryPath: directory,\n    });\n\n    let cacheControl : string | undefined;\n    if (typeof options.cacheMaxAge !== 'undefined') {\n        cacheControl = `public,max-age=${options.cacheMaxAge}`;\n\n        if (options.cacheImmutable) {\n            cacheControl += ',immutable';\n        } else if (options.cacheMaxAge === 0) {\n            cacheControl += ',must-revalidate';\n        }\n    }\n\n    const stack : Record<string, FileInfo> = {};\n\n    scanFiles(stack, options);\n\n    return (req, res, next) => {\n        let requestPath = useRequestPath(req);\n\n        const mountPath = useRequestMountPath(req);\n        if (requestPath.startsWith(mountPath)) {\n            requestPath = requestPath.substring(mountPath.length);\n        }\n\n        if (!requestPath.startsWith('/')) {\n            requestPath = `/${requestPath}`;\n        }\n\n        if (requestPath.indexOf('%') !== -1) {\n            try {\n                requestPath = decodeURI(requestPath);\n            } catch (err) {\n                // do nothing :)\n            }\n        }\n\n        lookup(requestPath, options, stack)\n            .then((fileInfo) => {\n                if (typeof fileInfo === 'undefined') {\n                    if (\n                        options.fallthrough &&\n                        typeof next !== 'undefined'\n                    ) {\n                        next();\n                    } else {\n                        res.statusCode = 404;\n                        res.end();\n                    }\n\n                    return Promise.resolve();\n                }\n\n                if (cacheControl) {\n                    res.setHeader(HeaderName.CACHE_CONTROL, cacheControl);\n                }\n\n                if (\n                    req.headers[HeaderName.IF_NONE_MATCH] === `W/\"${fileInfo.stats.size}-${fileInfo.stats.mtime.getTime()}\"`\n                ) {\n                    res.writeHead(304);\n                    res.end();\n                    return Promise.resolve();\n                }\n\n                return sendFile(res, {\n                    content: (options) => fs.createReadStream(fileInfo.filePath, options),\n                    stats: () => fileInfo.stats,\n                    name: fileInfo.filePath,\n                }, (err?: Error) => {\n                    if (err) {\n                        if (\n                            options.fallthrough &&\n                            typeof next === 'function'\n                        ) {\n                            return next(err);\n                        }\n\n                        res.statusCode = 404;\n                    }\n\n                    res.end();\n\n                    return Promise.resolve();\n                });\n            });\n    };\n}\n","import type { Plugin } from 'routup';\nimport { createHandler } from './handler';\nimport type { OptionsInput } from './type';\n\nexport function assets(\n    directory: string,\n    options?: OptionsInput,\n) : Plugin {\n    return {\n        name: 'assets',\n        install: (router) => {\n            router.use(createHandler(directory, options));\n        },\n    };\n}\n"],"names":["readDirectory","dir","callback","prefix","path","resolve","abs","stats","fs","promises","readdir","then","arr","i","length","join","statSync","isDirectory","buildOptions","input","fallbackPath","fallback","idx","lastIndexOf","substring","fallbackIgnores","push","dotFiles","Array","isArray","RegExp","ignores","directoryPath","isAbsolute","cacheMaxAge","scan","fallthrough","cacheImmutable","extensions","isRegexMatch","pattern","patterns","test","scanFiles","stack","options","relativePath","filePath","key","normalize","replace","generatePathForExtensions","requestPath","items","startsWith","withLeadingSlash","lookupPath","relativeFilePaths","parts","split","filter","el","basePaths","next","shift","basePath","endsWith","stat","isFile","e","undefined","lookup","fileInfo","createHandler","directory","coreHandler","createHandlerFn","cacheControl","req","res","useRequestPath","mountPath","useRequestMountPath","indexOf","decodeURI","err","statusCode","end","Promise","setHeader","HeaderName","CACHE_CONTROL","headers","IF_NONE_MATCH","size","mtime","getTime","writeHead","sendFile","content","createReadStream","name","assets","install","router","use"],"mappings":"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"}