'use strict';

var _promise = require('babel-runtime/core-js/promise');

var _promise2 = _interopRequireDefault(_promise);

var _asyncToGenerator2 = require('babel-runtime/helpers/asyncToGenerator');

var _asyncToGenerator3 = _interopRequireDefault(_asyncToGenerator2);

let run = (() => {
  var _ref = (0, _asyncToGenerator3.default)(function* () {
    try {
      const projectDir = process.argv[2];
      if (!projectDir) {
        throw new Error('No project dir specified.\nUsage: yarn dev <project-dir>');
      }

      const app = (0, _next2.default)({ dev: true });
      yield app.prepare();

      const server = (0, _express2.default)();
      const authenticationContext = yield (0, _DevToolsServer.createAuthenticationContextAsync)({ port: PORT });
      server.get('/dev-tools-info', authenticationContext.requestHandler);
      server.get('/graphiql', (0, _apolloServerExpress.graphiqlExpress)({
        endpointURL: authenticationContext.webSocketGraphQLUrl,
        websocketConnectionParams: {
          clientAuthenticationToken: authenticationContext.clientAuthenticationToken
        }
      }));
      server.get('*', app.getRequestHandler());

      const httpServer = _http2.default.createServer(server);
      yield new _promise2.default(function (resolve, reject) {
        httpServer.once('error', reject);
        httpServer.once('listening', resolve);
        httpServer.listen(PORT, 'localhost');
      });
      (0, _DevToolsServer.startGraphQLServer)(projectDir, httpServer, authenticationContext);
      console.log('Starting project...');
      yield _xdl.Project.startAsync(projectDir);
      let url = `http://localhost:${PORT}`;
      console.log(`Development server running at ${url}`);
      (0, _openBrowser2.default)(url);
    } catch (error) {
      console.error(error);
      process.exit(1);
    }
  });

  return function run() {
    return _ref.apply(this, arguments);
  };
})();

var _apolloServerExpress = require('apollo-server-express');

var _xdl = require('@expo/xdl');

var _express = require('express');

var _express2 = _interopRequireDefault(_express);

var _http = require('http');

var _http2 = _interopRequireDefault(_http);

var _next = require('next');

var _next2 = _interopRequireDefault(_next);

var _openBrowser = require('react-dev-utils/openBrowser');

var _openBrowser2 = _interopRequireDefault(_openBrowser);

var _DevToolsServer = require('./DevToolsServer');

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

const PORT = 3333;

run();