message: Reduce the scope of the `try` / `catch` within `fromFile`.
  The GraphQL executor is capable of producing its own, more useful errors and
  we destroy those boundaries by trying this entire block since there are no
  less than three different error sources.
diff: @@ -43,11 +43,18 @@ async function buildIntrospectionSchemaInLocalGraphQLContext(
  return executionResult.data.__schema;
  }
  -function fromFile(file: string): Promise<IntrospectionSchema | undefined> {
  +async function fromFile(
  + file: string
  +): Promise<IntrospectionSchema | undefined> {
  + let result;
  try {
  - const result = fs.readFileSync(file, {
  + result = fs.readFileSync(file, {
  encoding: "utf-8"
  });
  + } catch (err) {
  + throw new Error(`Unable to read file ${file}. ${err.message}`);
  + }
  +
  const ext = path.extname(file);
  // an actual introspectionQuery result
  @@ -63,21 +70,18 @@ function fromFile(file: string): Promise<IntrospectionSchema | undefined> {
  }
  if (ext === ".graphql" || ext === ".graphqls" || ext === ".gql") {
  - return buildIntrospectionSchemaInLocalGraphQLContext(
  + return await buildIntrospectionSchemaInLocalGraphQLContext(
  new Source(result, file)
  );
  }
  if (ext === ".ts" || ext === ".tsx" || ext === ".js" || ext === ".jsx") {
  - return buildIntrospectionSchemaInLocalGraphQLContext(
  + return await buildIntrospectionSchemaInLocalGraphQLContext(
  extractDocumentFromJavascript(result)!
  );
  }
  - return Promise.resolve(undefined);
  - } catch (e) {
  - throw new Error(`Unable to read file ${file}. ${e.message}`);
  - }
  + return;
  }
  export const fetchSchema = async (
  