"use strict"; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; var __rest = (this && this.__rest) || function (s, e) { var t = {}; for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) t[p] = s[p]; if (s != null && typeof Object.getOwnPropertySymbols === "function") for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) if (e.indexOf(p[i]) < 0) t[p[i]] = s[p[i]]; return t; }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); const config_1 = require("@expo/config"); const find_yarn_workspace_root_1 = __importDefault(require("find-yarn-workspace-root")); const fs_1 = __importDefault(require("fs")); const path_1 = __importDefault(require("path")); const url_1 = __importDefault(require("url")); const getMode_1 = __importDefault(require("./getMode")); const possibleMainFiles = [ 'index.web.ts', 'index.ts', 'index.web.tsx', 'index.tsx', 'src/index.web.ts', 'src/index.ts', 'src/index.web.tsx', 'src/index.tsx', 'index.web.js', 'index.js', 'index.web.jsx', 'index.jsx', 'src/index.web.js', 'src/index.js', 'src/index.web.jsx', 'src/index.jsx', ]; function ensureSlash(inputPath, needsSlash) { const hasSlash = inputPath.endsWith('/'); if (hasSlash && !needsSlash) { return inputPath.substr(0, inputPath.length - 1); } else if (!hasSlash && needsSlash) { return `${inputPath}/`; } else { return inputPath; } } function getAbsolutePathWithProjectRoot(projectRoot, ...pathComponents) { // Simple check if we are dealing with an URL if (pathComponents && pathComponents.length === 1 && pathComponents[0].startsWith('http')) { return pathComponents[0]; } return path_1.default.resolve(projectRoot, ...pathComponents); } exports.getAbsolutePathWithProjectRoot = getAbsolutePathWithProjectRoot; function getPossibleProjectRoot() { return fs_1.default.realpathSync(process.cwd()); } exports.getPossibleProjectRoot = getPossibleProjectRoot; function getModulesPath(projectRoot) { const workspaceRoot = find_yarn_workspace_root_1.default(path_1.default.resolve(projectRoot)); // Absolute path or null if (workspaceRoot) { return path_1.default.resolve(workspaceRoot, 'node_modules'); } return path_1.default.resolve(projectRoot, 'node_modules'); } exports.getModulesPath = getModulesPath; function parsePaths(projectRoot, nativeAppManifest) { const inputProjectRoot = projectRoot || getPossibleProjectRoot(); function absolute(...pathComponents) { return getAbsolutePathWithProjectRoot(inputProjectRoot, ...pathComponents); } const packageJsonPath = absolute('package.json'); const modulesPath = getModulesPath(inputProjectRoot); const productionPath = absolute(config_1.getWebOutputPath(nativeAppManifest)); function templatePath(filename = '') { const overridePath = absolute('web', filename); if (fs_1.default.existsSync(overridePath)) { return overridePath; } return path_1.default.join(__dirname, '../../web-default', filename); } function getProductionPath(...props) { return path_1.default.resolve(productionPath, ...props); } function getIncludeModule(...props) { return path_1.default.resolve(modulesPath, ...props); } return { absolute, includeModule: getIncludeModule, packageJson: packageJsonPath, root: path_1.default.resolve(inputProjectRoot), appMain: getEntryPoint(inputProjectRoot), modules: modulesPath, servedPath: getServedPath(inputProjectRoot), template: { get: templatePath, folder: templatePath(), indexHtml: templatePath('index.html'), manifest: templatePath('manifest.json'), serveJson: templatePath('serve.json'), favicon: templatePath('favicon.ico'), }, production: { get: getProductionPath, folder: getProductionPath(), indexHtml: getProductionPath('index.html'), manifest: getProductionPath('manifest.json'), serveJson: getProductionPath('serve.json'), favicon: getProductionPath('favicon.ico'), }, }; } function getEntryPoint(projectRoot) { const { exp, pkg } = config_1.readConfigJson(projectRoot, true); /** * The main file is resolved like so: * * `app.json` -> `expo.entryPoint` * * `package.json` -> `"main"` * * `possibleMainFiles` */ if (exp && exp.entryPoint && typeof exp.entryPoint === 'string') { return getAbsolutePathWithProjectRoot(projectRoot, exp.entryPoint); } else if (pkg) { const { main } = pkg; if (main && typeof main === 'string') { return getAbsolutePathWithProjectRoot(projectRoot, main); } // Adds support for create-react-app (src/index.js) and react-native-cli (index.js) which don't define a main. for (const fileName of possibleMainFiles) { const filePath = getAbsolutePathWithProjectRoot(projectRoot, fileName); if (fs_1.default.existsSync(filePath)) { return filePath; } } } return null; } exports.getEntryPoint = getEntryPoint; function getPaths(projectRoot) { const { exp } = config_1.readConfigJson(projectRoot, true); return parsePaths(projectRoot, exp); } exports.getPaths = getPaths; function getPathsAsync(projectRoot) { return __awaiter(this, void 0, void 0, function* () { let exp; try { exp = (yield config_1.readConfigJsonAsync(projectRoot, true)).exp; } catch (error) { } return parsePaths(projectRoot, exp); }); } exports.getPathsAsync = getPathsAsync; function getServedPath(projectRoot) { const { pkg } = config_1.readConfigJson(projectRoot, true); const envPublicUrl = process.env.WEB_PUBLIC_URL; // We use `WEB_PUBLIC_URL` environment variable or "homepage" field to infer // "public path" at which the app is served. // Webpack needs to know it to put the right <script> hrefs into HTML even in // single-page apps that may serve index.html for nested URLs like /todos/42. // We can't use a relative path in HTML because we don't want to load something // like /todos/42/static/js/bundle.7289d.js. We have to know the root. const publicUrl = envPublicUrl || pkg.homepage; const servedUrl = envPublicUrl || (publicUrl ? url_1.default.parse(publicUrl).pathname : '/'); return ensureSlash(servedUrl, true); } exports.getServedPath = getServedPath; function getPublicPaths(_a) { var { projectRoot } = _a, env = __rest(_a, ["projectRoot"]); if (getMode_1.default(env) === 'production') { const publicPath = getServedPath(projectRoot); return { publicPath, publicUrl: publicPath.slice(0, -1), }; } return { publicUrl: '', publicPath: '/' }; } exports.getPublicPaths = getPublicPaths; //# sourceMappingURL=paths.js.map