export async function cliMain()

in packages/@aws-cdk/node-bundle/src/cli-main.ts [11:109]


export async function cliMain(cliArgs: string[]) {
  const argv = await yargs
    .usage('Usage: node-bundle COMMAND')
    .option('entrypoint', { type: 'array', nargs: 1, desc: 'List of entrypoints to bundle' })
    .option('external', { type: 'array', nargs: 1, default: [], desc: 'Packages in this list will be excluded from the bundle and added as dependencies (example: fsevents:optional)' })
    .option('allowed-license', { type: 'array', nargs: 1, default: [], desc: 'List of valid licenses' })
    .option('resource', { type: 'array', nargs: 1, default: [], desc: 'List of resources that need to be explicitly copied to the bundle (example: node_modules/proxy-agent/contextify.js:bin/contextify.js)' })
    .option('dont-attribute', { type: 'string', desc: 'Dependencies matching this regular expressions wont be added to the notice file' })
    .option('test', { type: 'string', desc: 'Validation command to sanity test the bundle after its created' })
    .option('minify-whitespace', { type: 'boolean', default: false, desc: 'Minify whitespace' })
    .command('validate', 'Validate the package is ready for bundling', args => args
      .option('fix', { type: 'boolean', default: false, alias: 'f', desc: 'Fix any fixable violations' }),
    )
    .command('write', 'Write the bundled version of the project to a temp directory')
    .command('pack', 'Write the bundle and create the tarball', args => args
      .option('destination', { type: 'string', desc: 'Directory to write the tarball to', nargs: 1, requiresArg: true }),
    )
    .demandCommand() // require a subcommand
    .strict() // require a VALID subcommand, and only supported options
    .fail((msg, err) => {
      // Throw an error in test mode, exit with an error code otherwise
      if (err) {
        throw err;
      }
      if (process.env.NODE_ENV === 'test') {
        throw new Error(msg);
      }
      console.error(msg);
      process.exit(1); // exit() not exitCode, we must not return.
    })
    .help()
    .version(versionNumber())
    .parse(cliArgs);

  const command = argv._[0];

  function undefinedIfEmpty(arr?: any[]): string[] | undefined {
    if (!arr || arr.length === 0) return undefined;
    return arr as string[];
  }

  const resources: any = {};
  for (const resource of (argv.resource as string[])) {
    const parts = resource.split(':');
    resources[parts[0]] = parts[1];
  }

  const optionalExternals = [];
  const runtimeExternals = [];

  for (const external of (argv.external as string[])) {
    const parts = external.split(':');
    const name = parts[0];
    const type = parts[1];
    switch (type) {
      case 'optional':
        optionalExternals.push(name);
        break;
      case 'runtime':
        runtimeExternals.push(name);
        break;
      default:
        throw new Error(`Unsupported dependency type '${type}' for external package '${name}'. Supported types are: ['optional', 'runtime']`);
    }
  }

  const props: BundleProps = {
    packageDir: process.cwd(),
    entryPoints: undefinedIfEmpty(argv.entrypoint),
    externals: { dependencies: runtimeExternals, optionalDependencies: optionalExternals },
    allowedLicenses: undefinedIfEmpty(argv['allowed-license']),
    resources: resources,
    dontAttribute: argv['dont-attribute'],
    test: argv.test,
    minifyWhitespace: argv['minify-whitespace'],
  };

  const bundle = new Bundle(props);

  switch (command) {
    case 'validate':
      // When using `yargs.command(command, builder [, handler])` without the handler
      // as we do here, there is no typing for command-specific options. So force a cast.
      const fix = argv.fix as boolean | undefined;
      validate(bundle, { fix });
      break;
    case 'write':
      write(bundle);
      break;
    case 'pack':
      const target = argv.destination as string | undefined;
      pack(bundle, {
        target,
      });
      break;
    default:
      throw new Error(`Unknown command: ${command}`);
  }
}