#!/usr/bin/env node

/**
    Licensed to the Apache Software Foundation (ASF) under one
    or more contributor license agreements.  See the NOTICE file
    distributed with this work for additional information
    regarding copyright ownership.  The ASF licenses this file
    to you 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.
*/

require('loud-rejection/register');
const util = require('util');
const events = require('cordova-common').events;
const CordovaError = require('cordova-common').CordovaError;
const cli = require('../src/cli');

cli(process.argv).catch(err => {
    if (!(err instanceof Error)) {
        throw new CordovaError('Promise rejected with non-error: ' + util.inspect(err));
    }
    process.exitCode = err.code || 1;

    // We cannot emit an error event here, as that would cause another error
    console.error(err.message);
    events.emit('verbose', err.stack);
});
