#!/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, CordovaError } = require('cordova-common');
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);
});
