From 8788eebd70be24b90308d639de1fef64dab4357b Mon Sep 17 00:00:00 2001
From: Alex <alex@brewingcode.net>
Date: Tue, 5 Jul 2022 15:14:51 -0700
Subject: [PATCH] implement `--line-length`

---
 README.md         |  1 +
 bin/uglifyjs      |  5 +++++
 lib/minify.js     |  2 ++
 test/mocha/cli.js | 16 ++++++++++++++++
 4 files changed, 24 insertions(+)

diff --git a/README.md b/README.md
index 60ee8145ca0..bdc5baec1c8 100644
--- a/README.md
+++ b/README.md
@@ -118,6 +118,7 @@ a double dash to prevent input files being used as option arguments:
     --keep-fargs                Do not mangle/drop function arguments.
     --keep-fnames               Do not mangle/drop function names.  Useful for
                                 code relying on Function.prototype.name.
+    -l, --line-length <value>   Maximum line length for output code.
     --module                    Process input as ES module (implies --toplevel)
     --name-cache <file>         File to hold mangled name mappings.
     --self                      Build UglifyJS as a library (implies --wrap UglifyJS)
diff --git a/bin/uglifyjs b/bin/uglifyjs
index 304d84de703..94b08e8049f 100755
--- a/bin/uglifyjs
+++ b/bin/uglifyjs
@@ -21,6 +21,7 @@ var short_forms = {
     d: "define",
     e: "enclose",
     h: "help",
+    l: "line-length",
     m: "mangle",
     o: "output",
     O: "output-opts",
@@ -107,6 +108,7 @@ function process_option(name, no_value) {
                 "  --ie                                     Support non-standard Internet Explorer.",
                 "  --keep-fargs                             Do not mangle/drop function arguments.",
                 "  --keep-fnames                            Do not mangle/drop function names. Useful for code relying on Function.prototype.name.",
+                "  -l, --line-length <value>                Maximum line length for output code.",
                 "  --module                                 Process input as ES module (implies --toplevel)",
                 "  --name-cache <file>                      File to hold mangled name mappings.",
                 "  --rename                                 Force symbol expansion.",
@@ -153,6 +155,9 @@ function process_option(name, no_value) {
       case "annotations":
       case "ie":
       case "ie8":
+      case "line-length":
+        options.max_line_len = read_value(true);
+        break;
       case "module":
       case "timings":
       case "toplevel":
diff --git a/lib/minify.js b/lib/minify.js
index 2e9c33253a6..e7b07e8d12d 100644
--- a/lib/minify.js
+++ b/lib/minify.js
@@ -80,6 +80,7 @@ function minify(files, options) {
             ie8: false,
             keep_fargs: false,
             keep_fnames: false,
+            max_line_len: undefined,
             mangle: {},
             module: false,
             nameCache: null,
@@ -214,6 +215,7 @@ function minify(files, options) {
         var output = defaults(options.output, {
             ast: false,
             code: true,
+            max_line_len: options.max_line_len,
         });
         if (output.ast) result.ast = toplevel;
         if (output.code) {
diff --git a/test/mocha/cli.js b/test/mocha/cli.js
index 34b97101d50..23f73c67ce8 100644
--- a/test/mocha/cli.js
+++ b/test/mocha/cli.js
@@ -964,4 +964,20 @@ describe("bin/uglifyjs", function() {
             done();
         }).stdin.end(code);
     });
+    it("Should fail with empty --line-length", function(done) {
+        exec(uglifyjscmd + " -l", function(err, stdout, stderr) {
+            assert.ok(err);
+            assert.strictEqual(stdout, "");
+            assert.strictEqual(stderr, "ERROR: missing option argument for --line-length\n");
+            done();
+        })
+    });
+    it("Should work with --line-length", function(done) {
+        exec(uglifyjscmd + " --line-length 20 test/input/reduce/label.js", function(err, stdout, stderr) {
+            if (err) throw err
+            assert.strictEqual(stdout, "UNUSED:{console.log(\n0-.1-.1-.1)}\n");
+            assert.strictEqual(stderr, "");
+            done();
+        })
+    });
 });