1{"version":3,"file":"evalConfig.js","names":["evalConfig","configFile","request","contents","readFileSync","result","code","transform","filePath","transforms","requireString","error","location","extractLocationFromSyntaxError","codeFrameColumns","require","codeFrame","start","loc","highlightCode","message","importantStack","extractImportantStackFromNodeError","resolveConfigExport","line","lineNumber","column","columnNumber","isSyntaxError","traces","stack","split","filter","startsWith","length","pop","join","SyntaxError","constructor","name","default","exportedObjectType","Promise","ConfigError","expo","serializeSkippingMods","config"],"sources":["../src/evalConfig.ts"],"sourcesContent":["import { readFileSync } from 'fs';\nimport requireString from 'require-from-string';\nimport { transform } from 'sucrase';\n\nimport { AppJSONConfig, ConfigContext, ExpoConfig } from './Config.types';\nimport { ConfigError } from './Errors';\nimport { serializeSkippingMods } from './Serialize';\n\ntype RawDynamicConfig = AppJSONConfig | Partial<ExpoConfig> | null;\n\nexport type DynamicConfigResults = { config: RawDynamicConfig; exportedObjectType: string };\n\n/**\n * Transpile and evaluate the dynamic config object.\n * This method is shared between the standard reading method in getConfig, and the headless script.\n *\n * @param options configFile path to the dynamic app.config.*, request to send to the dynamic config if it exports a function.\n * @returns the serialized and evaluated config along with the exported object type (object or function).\n */\nexport function evalConfig(\n  configFile: string,\n  request: ConfigContext | null\n): DynamicConfigResults {\n  const contents = readFileSync(configFile, 'utf8');\n  let result: any;\n  try {\n    const { code } = transform(contents, {\n      filePath: configFile,\n      transforms: ['typescript', 'imports'],\n    });\n\n    result = requireString(code, configFile);\n  } catch (error: any) {\n    const location = extractLocationFromSyntaxError(error);\n\n    // Apply a code frame preview to the error if possible, sucrase doesn't do this by default.\n    if (location) {\n      const { codeFrameColumns } = require('@babel/code-frame');\n      const codeFrame = codeFrameColumns(contents, { start: error.loc }, { highlightCode: true });\n      error.codeFrame = codeFrame;\n      error.message += `\\n${codeFrame}`;\n    } else {\n      const importantStack = extractImportantStackFromNodeError(error);\n\n      if (importantStack) {\n        error.message += `\\n${importantStack}`;\n      }\n    }\n    throw error;\n  }\n  return resolveConfigExport(result, configFile, request);\n}\n\nfunction extractLocationFromSyntaxError(\n  error: Error | any\n): { line: number; column?: number } | null {\n  // sucrase provides the `loc` object\n  if (error.loc) {\n    return error.loc;\n  }\n\n  // `SyntaxError`s provide the `lineNumber` and `columnNumber` properties\n  if ('lineNumber' in error && 'columnNumber' in error) {\n    return { line: error.lineNumber, column: error.columnNumber };\n  }\n\n  return null;\n}\n\n// These kinda errors often come from syntax errors in files that were imported by the main file.\n// An example is a module that includes an import statement.\nfunction extractImportantStackFromNodeError(error: any): string | null {\n  if (isSyntaxError(error)) {\n    const traces = error.stack?.split('\\n').filter((line) => !line.startsWith('    at '));\n    if (!traces) return null;\n\n    // Remove redundant line\n    if (traces[traces.length - 1].startsWith('SyntaxError:')) {\n      traces.pop();\n    }\n    return traces.join('\\n');\n  }\n  return null;\n}\n\nfunction isSyntaxError(error: any): error is SyntaxError {\n  return error instanceof SyntaxError || error.constructor.name === 'SyntaxError';\n}\n\n/**\n * - Resolve the exported contents of an Expo config (be it default or module.exports)\n * - Assert no promise exports\n * - Return config type\n * - Serialize config\n *\n * @param result\n * @param configFile\n * @param request\n */\nexport function resolveConfigExport(\n  result: any,\n  configFile: string,\n  request: ConfigContext | null\n) {\n  if (result.default != null) {\n    result = result.default;\n  }\n  const exportedObjectType = typeof result;\n  if (typeof result === 'function') {\n    result = result(request);\n  }\n\n  if (result instanceof Promise) {\n    throw new ConfigError(`Config file ${configFile} cannot return a Promise.`, 'INVALID_CONFIG');\n  }\n\n  // If the expo object exists, ignore all other values.\n  if (result?.expo) {\n    result = serializeSkippingMods(result.expo);\n  } else {\n    result = serializeSkippingMods(result);\n  }\n\n  return { config: result, exportedObjectType };\n}\n"],"mappings":"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"}