#!/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)) {
        const errorOutput = typeof err === 'string' ? err : util.inspect(err);
        throw new CordovaError('Promise rejected with non-error: ' + errorOutput);
    }
    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);
});
