1{"version":3,"file":"paths.js","names":["ensureSlash","inputPath","needsSlash","hasSlash","endsWith","substr","length","getPossibleProjectRoot","fs","realpathSync","process","cwd","nativePlatforms","resolveEntryPoint","projectRoot","platform","projectConfig","platforms","includes","getEntryPoint","entryFiles","extensions","getBareExtensions","getEntryPointWithExtensions","exp","pkg","getConfig","skipSDKVersionRequirement","entryPoint","entry","getFileWithExtensions","resolveFromSilentWithExtensions","main","Error","fileName","resolveFrom","fromDirectory","moduleId","extension","modulePath","silent","path","join","existsSync"],"sources":["../../src/paths/paths.ts"],"sourcesContent":["import fs from 'fs';\nimport path from 'path';\nimport resolveFrom from 'resolve-from';\n\nimport { getConfig } from '../Config';\nimport { ProjectConfig } from '../Config.types';\nimport { getBareExtensions } from './extensions';\n\n// https://github.com/facebook/create-react-app/blob/9750738cce89a967cc71f28390daf5d4311b193c/packages/react-scripts/config/paths.js#L22\nexport function ensureSlash(inputPath: string, needsSlash: boolean): string {\n const hasSlash = inputPath.endsWith('/');\n if (hasSlash && !needsSlash) {\n return inputPath.substr(0, inputPath.length - 1);\n } else if (!hasSlash && needsSlash) {\n return `${inputPath}/`;\n } else {\n return inputPath;\n }\n}\n\nexport function getPossibleProjectRoot(): string {\n return fs.realpathSync(process.cwd());\n}\n\nconst nativePlatforms = ['ios', 'android'];\n\nexport function resolveEntryPoint(\n projectRoot: string,\n { platform, projectConfig }: { platform: string; projectConfig?: ProjectConfig }\n) {\n const platforms = nativePlatforms.includes(platform) ? [platform, 'native'] : [platform];\n return getEntryPoint(projectRoot, ['./index'], platforms, projectConfig);\n}\n\nexport function getEntryPoint(\n projectRoot: string,\n entryFiles: string[],\n platforms: string[],\n projectConfig?: ProjectConfig\n): string | null {\n const extensions = getBareExtensions(platforms);\n return getEntryPointWithExtensions(projectRoot, entryFiles, extensions, projectConfig);\n}\n\n// Used to resolve the main entry file for a project.\nexport function getEntryPointWithExtensions(\n projectRoot: string,\n entryFiles: string[],\n extensions: string[],\n projectConfig?: ProjectConfig\n): string {\n const { exp, pkg } = projectConfig ?? getConfig(projectRoot, { skipSDKVersionRequirement: true });\n\n // This will first look in the `app.json`s `expo.entryPoint` field for a potential main file.\n // We check the Expo config first in case you want your project to start differently with Expo then in a standalone environment.\n if (exp && exp.entryPoint && typeof exp.entryPoint === 'string') {\n // If the field exists then we want to test it against every one of the supplied extensions\n // to ensure the bundler resolves the same way.\n let entry = getFileWithExtensions(projectRoot, exp.entryPoint, extensions);\n if (!entry) {\n // Allow for paths like: `{ \"main\": \"expo/AppEntry\" }`\n entry = resolveFromSilentWithExtensions(projectRoot, exp.entryPoint, extensions);\n\n // If it doesn't resolve then just return the entryPoint as-is. This makes\n // it possible for people who have an unconventional setup (eg: multiple\n // apps in monorepo with metro at root) to customize entry point without\n // us imposing our assumptions.\n if (!entry) {\n return exp.entryPoint;\n }\n }\n return entry;\n } else if (pkg) {\n // If the config doesn't define a custom entry then we want to look at the `package.json`s `main` field, and try again.\n const { main } = pkg;\n if (main && typeof main === 'string') {\n // Testing the main field against all of the provided extensions - for legacy reasons we can't use node module resolution as the package.json allows you to pass in a file without a relative path and expect it as a relative path.\n let entry = getFileWithExtensions(projectRoot, main, extensions);\n if (!entry) {\n // Allow for paths like: `{ \"main\": \"expo/AppEntry\" }`\n entry = resolveFromSilentWithExtensions(projectRoot, main, extensions);\n if (!entry)\n throw new Error(\n `Cannot resolve entry file: The \\`main\\` field defined in your \\`package.json\\` points to a non-existent path.`\n );\n }\n return entry;\n }\n }\n\n // Now we will start looking for a default entry point using the provided `entryFiles` argument.\n // This will add support for create-react-app (src/index.js) and react-native-cli (index.js) which don't define a main.\n for (const fileName of entryFiles) {\n const entry = resolveFromSilentWithExtensions(projectRoot, fileName, extensions);\n if (entry) return entry;\n }\n\n try {\n // If none of the default files exist then we will attempt to use the main Expo entry point.\n // This requires `expo` to be installed in the project to work as it will use `node_module/expo/AppEntry.js`\n // Doing this enables us to create a bare minimum Expo project.\n\n // TODO(Bacon): We may want to do a check against `./App` and `expo` in the `package.json` `dependencies` as we can more accurately ensure that the project is expo-min without needing the modules installed.\n return resolveFrom(projectRoot, 'expo/AppEntry');\n } catch {\n throw new Error(\n `The project entry file could not be resolved. Please either define it in the \\`package.json\\` (main), \\`app.json\\` (expo.entryPoint), create an \\`index.js\\`, or install the \\`expo\\` package.`\n );\n }\n}\n\n// Resolve from but with the ability to resolve like a bundler\nexport function resolveFromSilentWithExtensions(\n fromDirectory: string,\n moduleId: string,\n extensions: string[]\n): string | null {\n for (const extension of extensions) {\n const modulePath = resolveFrom.silent(fromDirectory, `${moduleId}.${extension}`);\n if (modulePath && modulePath.endsWith(extension)) {\n return modulePath;\n }\n }\n return resolveFrom.silent(fromDirectory, moduleId) || null;\n}\n\n// Statically attempt to resolve a module but with the ability to resolve like a bundler.\n// This won't use node module resolution.\nexport function getFileWithExtensions(\n fromDirectory: string,\n moduleId: string,\n extensions: string[]\n): string | null {\n const modulePath = path.join(fromDirectory, moduleId);\n if (fs.existsSync(modulePath)) {\n return modulePath;\n }\n for (const extension of extensions) {\n const modulePath = path.join(fromDirectory, `${moduleId}.${extension}`);\n if (fs.existsSync(modulePath)) {\n return modulePath;\n }\n }\n return null;\n}\n"],"mappings":";;;;;;;;;;;;AAAA;EAAA;EAAA;IAAA;EAAA;EAAA;AAAA;AACA;EAAA;EAAA;IAAA;EAAA;EAAA;AAAA;AACA;EAAA;EAAA;IAAA;EAAA;EAAA;AAAA;AAEA;EAAA;EAAA;IAAA;EAAA;EAAA;AAAA;AAEA;EAAA;EAAA;IAAA;EAAA;EAAA;AAAA;AAAiD;AAEjD;AACO,SAASA,WAAW,CAACC,SAAiB,EAAEC,UAAmB,EAAU;EAC1E,MAAMC,QAAQ,GAAGF,SAAS,CAACG,QAAQ,CAAC,GAAG,CAAC;EACxC,IAAID,QAAQ,IAAI,CAACD,UAAU,EAAE;IAC3B,OAAOD,SAAS,CAACI,MAAM,CAAC,CAAC,EAAEJ,SAAS,CAACK,MAAM,GAAG,CAAC,CAAC;EAClD,CAAC,MAAM,IAAI,CAACH,QAAQ,IAAID,UAAU,EAAE;IAClC,OAAQ,GAAED,SAAU,GAAE;EACxB,CAAC,MAAM;IACL,OAAOA,SAAS;EAClB;AACF;AAEO,SAASM,sBAAsB,GAAW;EAC/C,OAAOC,aAAE,CAACC,YAAY,CAACC,OAAO,CAACC,GAAG,EAAE,CAAC;AACvC;AAEA,MAAMC,eAAe,GAAG,CAAC,KAAK,EAAE,SAAS,CAAC;AAEnC,SAASC,iBAAiB,CAC/BC,WAAmB,EACnB;EAAEC,QAAQ;EAAEC;AAAmE,CAAC,EAChF;EACA,MAAMC,SAAS,GAAGL,eAAe,CAACM,QAAQ,CAACH,QAAQ,CAAC,GAAG,CAACA,QAAQ,EAAE,QAAQ,CAAC,GAAG,CAACA,QAAQ,CAAC;EACxF,OAAOI,aAAa,CAACL,WAAW,EAAE,CAAC,SAAS,CAAC,EAAEG,SAAS,EAAED,aAAa,CAAC;AAC1E;AAEO,SAASG,aAAa,CAC3BL,WAAmB,EACnBM,UAAoB,EACpBH,SAAmB,EACnBD,aAA6B,EACd;EACf,MAAMK,UAAU,GAAG,IAAAC,+BAAiB,EAACL,SAAS,CAAC;EAC/C,OAAOM,2BAA2B,CAACT,WAAW,EAAEM,UAAU,EAAEC,UAAU,EAAEL,aAAa,CAAC;AACxF;;AAEA;AACO,SAASO,2BAA2B,CACzCT,WAAmB,EACnBM,UAAoB,EACpBC,UAAoB,EACpBL,aAA6B,EACrB;EACR,MAAM;IAAEQ,GAAG;IAAEC;EAAI,CAAC,GAAGT,aAAa,aAAbA,aAAa,cAAbA,aAAa,GAAI,IAAAU,mBAAS,EAACZ,WAAW,EAAE;IAAEa,yBAAyB,EAAE;EAAK,CAAC,CAAC;;EAEjG;EACA;EACA,IAAIH,GAAG,IAAIA,GAAG,CAACI,UAAU,IAAI,OAAOJ,GAAG,CAACI,UAAU,KAAK,QAAQ,EAAE;IAC/D;IACA;IACA,IAAIC,KAAK,GAAGC,qBAAqB,CAAChB,WAAW,EAAEU,GAAG,CAACI,UAAU,EAAEP,UAAU,CAAC;IAC1E,IAAI,CAACQ,KAAK,EAAE;MACV;MACAA,KAAK,GAAGE,+BAA+B,CAACjB,WAAW,EAAEU,GAAG,CAACI,UAAU,EAAEP,UAAU,CAAC;;MAEhF;MACA;MACA;MACA;MACA,IAAI,CAACQ,KAAK,EAAE;QACV,OAAOL,GAAG,CAACI,UAAU;MACvB;IACF;IACA,OAAOC,KAAK;EACd,CAAC,MAAM,IAAIJ,GAAG,EAAE;IACd;IACA,MAAM;MAAEO;IAAK,CAAC,GAAGP,GAAG;IACpB,IAAIO,IAAI,IAAI,OAAOA,IAAI,KAAK,QAAQ,EAAE;MACpC;MACA,IAAIH,KAAK,GAAGC,qBAAqB,CAAChB,WAAW,EAAEkB,IAAI,EAAEX,UAAU,CAAC;MAChE,IAAI,CAACQ,KAAK,EAAE;QACV;QACAA,KAAK,GAAGE,+BAA+B,CAACjB,WAAW,EAAEkB,IAAI,EAAEX,UAAU,CAAC;QACtE,IAAI,CAACQ,KAAK,EACR,MAAM,IAAII,KAAK,CACZ,+GAA8G,CAChH;MACL;MACA,OAAOJ,KAAK;IACd;EACF;;EAEA;EACA;EACA,KAAK,MAAMK,QAAQ,IAAId,UAAU,EAAE;IACjC,MAAMS,KAAK,GAAGE,+BAA+B,CAACjB,WAAW,EAAEoB,QAAQ,EAAEb,UAAU,CAAC;IAChF,IAAIQ,KAAK,EAAE,OAAOA,KAAK;EACzB;EAEA,IAAI;IACF;IACA;IACA;;IAEA;IACA,OAAO,IAAAM,sBAAW,EAACrB,WAAW,EAAE,eAAe,CAAC;EAClD,CAAC,CAAC,MAAM;IACN,MAAM,IAAImB,KAAK,CACZ,gMAA+L,CACjM;EACH;AACF;;AAEA;AACO,SAASF,+BAA+B,CAC7CK,aAAqB,EACrBC,QAAgB,EAChBhB,UAAoB,EACL;EACf,KAAK,MAAMiB,SAAS,IAAIjB,UAAU,EAAE;IAClC,MAAMkB,UAAU,GAAGJ,sBAAW,CAACK,MAAM,CAACJ,aAAa,EAAG,GAAEC,QAAS,IAAGC,SAAU,EAAC,CAAC;IAChF,IAAIC,UAAU,IAAIA,UAAU,CAACnC,QAAQ,CAACkC,SAAS,CAAC,EAAE;MAChD,OAAOC,UAAU;IACnB;EACF;EACA,OAAOJ,sBAAW,CAACK,MAAM,CAACJ,aAAa,EAAEC,QAAQ,CAAC,IAAI,IAAI;AAC5D;;AAEA;AACA;AACO,SAASP,qBAAqB,CACnCM,aAAqB,EACrBC,QAAgB,EAChBhB,UAAoB,EACL;EACf,MAAMkB,UAAU,GAAGE,eAAI,CAACC,IAAI,CAACN,aAAa,EAAEC,QAAQ,CAAC;EACrD,IAAI7B,aAAE,CAACmC,UAAU,CAACJ,UAAU,CAAC,EAAE;IAC7B,OAAOA,UAAU;EACnB;EACA,KAAK,MAAMD,SAAS,IAAIjB,UAAU,EAAE;IAClC,MAAMkB,UAAU,GAAGE,eAAI,CAACC,IAAI,CAACN,aAAa,EAAG,GAAEC,QAAS,IAAGC,SAAU,EAAC,CAAC;IACvE,IAAI9B,aAAE,CAACmC,UAAU,CAACJ,UAAU,CAAC,EAAE;MAC7B,OAAOA,UAAU;IACnB;EACF;EACA,OAAO,IAAI;AACb"}