You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
	
	
		
			111 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			JavaScript
		
	
		
		
			
		
	
	
			111 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			JavaScript
		
	
| 
											9 months ago
										 | "use strict"; | ||
|  | Object.defineProperty(exports, "__esModule", { | ||
|  |     value: true | ||
|  | }); | ||
|  | 0 && (module.exports = { | ||
|  |     findPageFile: null, | ||
|  |     createValidFileMatcher: null | ||
|  | }); | ||
|  | function _export(target, all) { | ||
|  |     for(var name in all)Object.defineProperty(target, name, { | ||
|  |         enumerable: true, | ||
|  |         get: all[name] | ||
|  |     }); | ||
|  | } | ||
|  | _export(exports, { | ||
|  |     findPageFile: function() { | ||
|  |         return findPageFile; | ||
|  |     }, | ||
|  |     createValidFileMatcher: function() { | ||
|  |         return createValidFileMatcher; | ||
|  |     } | ||
|  | }); | ||
|  | const _fileexists = require("../../lib/file-exists"); | ||
|  | const _getpagepaths = require("../../shared/lib/page-path/get-page-paths"); | ||
|  | const _nonnullable = require("../../lib/non-nullable"); | ||
|  | const _path = require("path"); | ||
|  | const _fs = require("fs"); | ||
|  | const _log = require("../../build/output/log"); | ||
|  | const _picocolors = require("../../lib/picocolors"); | ||
|  | const _ismetadataroute = require("../../lib/metadata/is-metadata-route"); | ||
|  | async function isTrueCasePagePath(pagePath, pagesDir) { | ||
|  |     const pageSegments = (0, _path.normalize)(pagePath).split(_path.sep).filter(Boolean); | ||
|  |     const segmentExistsPromises = pageSegments.map(async (segment, i)=>{ | ||
|  |         const segmentParentDir = (0, _path.join)(pagesDir, ...pageSegments.slice(0, i)); | ||
|  |         const parentDirEntries = await _fs.promises.readdir(segmentParentDir); | ||
|  |         return parentDirEntries.includes(segment); | ||
|  |     }); | ||
|  |     return (await Promise.all(segmentExistsPromises)).every(Boolean); | ||
|  | } | ||
|  | async function findPageFile(pagesDir, normalizedPagePath, pageExtensions, isAppDir) { | ||
|  |     const pagePaths = (0, _getpagepaths.getPagePaths)(normalizedPagePath, pageExtensions, isAppDir); | ||
|  |     const [existingPath, ...others] = (await Promise.all(pagePaths.map(async (path)=>{ | ||
|  |         const filePath = (0, _path.join)(pagesDir, path); | ||
|  |         try { | ||
|  |             return await (0, _fileexists.fileExists)(filePath) ? path : null; | ||
|  |         } catch (err) { | ||
|  |             var _err_code; | ||
|  |             if (!(err == null ? void 0 : (_err_code = err.code) == null ? void 0 : _err_code.includes("ENOTDIR"))) throw err; | ||
|  |         } | ||
|  |         return null; | ||
|  |     }))).filter(_nonnullable.nonNullable); | ||
|  |     if (!existingPath) { | ||
|  |         return null; | ||
|  |     } | ||
|  |     if (!await isTrueCasePagePath(existingPath, pagesDir)) { | ||
|  |         return null; | ||
|  |     } | ||
|  |     if (others.length > 0) { | ||
|  |         (0, _log.warn)(`Duplicate page detected. ${(0, _picocolors.cyan)((0, _path.join)("pages", existingPath))} and ${(0, _picocolors.cyan)((0, _path.join)("pages", others[0]))} both resolve to ${(0, _picocolors.cyan)(normalizedPagePath)}.`); | ||
|  |     } | ||
|  |     return existingPath; | ||
|  | } | ||
|  | function createValidFileMatcher(pageExtensions, appDirPath) { | ||
|  |     const getExtensionRegexString = (extensions)=>`(?:${extensions.join("|")})`; | ||
|  |     const validExtensionFileRegex = new RegExp("\\." + getExtensionRegexString(pageExtensions) + "$"); | ||
|  |     const leafOnlyPageFileRegex = new RegExp(`(^(page|route)|[\\\\/](page|route))\\.${getExtensionRegexString(pageExtensions)}$`); | ||
|  |     const rootNotFoundFileRegex = new RegExp(`^not-found\\.${getExtensionRegexString(pageExtensions)}$`); | ||
|  |     /** TODO-METADATA: support other metadata routes | ||
|  |    *  regex for: | ||
|  |    * | ||
|  |    * /robots.txt|<ext> | ||
|  |    * /sitemap.xml|<ext> | ||
|  |    * /favicon.ico | ||
|  |    * /manifest.json|<ext> | ||
|  |    * <route>/icon.png|jpg|<ext> | ||
|  |    * <route>/apple-touch-icon.png|jpg|<ext> | ||
|  |    * | ||
|  |    */ /** | ||
|  |    * Match the file if it's a metadata route file, static: if the file is a static metadata file. | ||
|  |    * It needs to be a file which doesn't match the custom metadata routes e.g. `app/robots.txt/route.js` | ||
|  |    */ function isMetadataFile(filePath) { | ||
|  |         const appDirRelativePath = appDirPath ? filePath.replace(appDirPath, "") : filePath; | ||
|  |         return (0, _ismetadataroute.isMetadataRouteFile)(appDirRelativePath, pageExtensions, true); | ||
|  |     } | ||
|  |     // Determine if the file is leaf node page file or route file under layouts,
 | ||
|  |     // 'page.<extension>' | 'route.<extension>'
 | ||
|  |     function isAppRouterPage(filePath) { | ||
|  |         return leafOnlyPageFileRegex.test(filePath) || isMetadataFile(filePath); | ||
|  |     } | ||
|  |     function isPageFile(filePath) { | ||
|  |         return validExtensionFileRegex.test(filePath) || isMetadataFile(filePath); | ||
|  |     } | ||
|  |     function isRootNotFound(filePath) { | ||
|  |         if (!appDirPath) { | ||
|  |             return false; | ||
|  |         } | ||
|  |         if (!filePath.startsWith(appDirPath + _path.sep)) { | ||
|  |             return false; | ||
|  |         } | ||
|  |         const rest = filePath.slice(appDirPath.length + 1); | ||
|  |         return rootNotFoundFileRegex.test(rest); | ||
|  |     } | ||
|  |     return { | ||
|  |         isPageFile, | ||
|  |         isAppRouterPage, | ||
|  |         isMetadataFile, | ||
|  |         isRootNotFound | ||
|  |     }; | ||
|  | } | ||
|  | 
 | ||
|  | //# sourceMappingURL=find-page-file.js.map
 |