#!/usr/bin/env node

// Licensed under the Apache License, Version 2.0 (the "License"); you may not
// use this file except in compliance with the License. You may obtain a copy of
// the License at
//
//   http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
// License for the specific language governing permissions and limitations under
// the License.

var optimist = require('optimist')
  .usage('Fauxton server \nUsage: $0')
  .options('couchdb', {
    alias : 'c',
    default : 'http://localhost:5984',
    describe: 'Url to your CouchDB instance'
  })
  .options('port', {
    alias : 'p',
    default : 8000,
    describe: 'Local port that Fauxton will run on'
  })
  .options('help', {
    alias : 'h',
    describe: 'Show this message'
  })
  .options('contentSecurityPolicy', {
    alias : 'csp',
    default : true,
    describe: 'Configure the content security policy'
  });

var argv = optimist.argv;

if (argv.help || argv.h) {
  return optimist.showHelp(console.log);
}

var server = require('..')(argv);
