From 987c23396ef2a30989c6f280d0650ab4e8bf2fa5 Mon Sep 17 00:00:00 2001 From: Vincent Potucek Date: Fri, 28 Nov 2025 17:05:21 +0100 Subject: [PATCH 01/20] [rewrite] apply `ECMAScript6BestPractices` Signed-off-by: Vincent Potucek --- gradle/rewrite.gradle | 7 +- .../com/diffplug/spotless/npm/common-serve.js | 107 ++++++++---------- .../com/diffplug/spotless/npm/eslint-serve.js | 2 +- .../diffplug/spotless/npm/prettier-serve.js | 2 +- .../com/diffplug/spotless/npm/tsfmt-serve.js | 4 +- ...namicallyInstalledNpmInstallationTest.java | 16 ++- rewrite.yml | 7 +- 7 files changed, 72 insertions(+), 73 deletions(-) diff --git a/gradle/rewrite.gradle b/gradle/rewrite.gradle index 62f5170c46..1d389dfe99 100644 --- a/gradle/rewrite.gradle +++ b/gradle/rewrite.gradle @@ -5,6 +5,7 @@ rewrite { '**.dirty.java', '**FormatterProperties.java', '**_gradle_node_plugin_example_**', + '**common-serve.js', '**gradle/changelog.gradle', '**gradle/java-publish.gradle', '**idea/full.clean.java', @@ -15,14 +16,16 @@ rewrite { '**plugin-maven/build.gradle', '**settings.gradle', '**special-tests.gradle', - '**testlib/src/main/resources**' + '**testlib/src/main/resources**', + '**tsfmt-serve.js', ) exportDatatables = true failOnDryRunResults = true } dependencies { - rewrite('org.openrewrite.recipe:rewrite-migrate-java:3.22.0') + rewrite('org.openrewrite.recipe:rewrite-codemods:0.22.0') rewrite('org.openrewrite.recipe:rewrite-java-security:3.22.0') + rewrite('org.openrewrite.recipe:rewrite-migrate-java:3.22.0') rewrite('org.openrewrite.recipe:rewrite-rewrite:0.16.0') rewrite('org.openrewrite.recipe:rewrite-static-analysis:2.22.0') rewrite('org.openrewrite.recipe:rewrite-third-party:0.31.2') diff --git a/lib/src/main/resources/com/diffplug/spotless/npm/common-serve.js b/lib/src/main/resources/com/diffplug/spotless/npm/common-serve.js index edce61465a..af9f05780c 100644 --- a/lib/src/main/resources/com/diffplug/spotless/npm/common-serve.js +++ b/lib/src/main/resources/com/diffplug/spotless/npm/common-serve.js @@ -1,65 +1,58 @@ -// this file will be glued to the top of the specific xy-serve.js file -const debug_serve = false; // set to true for debug log output in node process -const shutdownServer = require("http-graceful-shutdown"); -const express = require("express"); const app = express(); +const express = require("express"); +const fs = require("fs"); +const shutdownServer = require("http-graceful-shutdown"); app.use(express.json({limit: "50mb"})); -const fs = require("fs"); - -function debugLog() { - if (debug_serve) { - console.log.apply(this, arguments) - } -} +// This file will be glued to the top of the specific xy-serve.js file + +app.post('/shutdown', (req, res) => { + res.status(200).send('Shutting down'); + setTimeout(async () => { + try { + await shutdownServer( + app.listen(0, '127.0.0.1', () => { + const instanceId = getInstanceId(); + debugLog('Server running on port ' + listener.address().port + ' for instance ' + instanceId); + fs.writeFile('server.port.tmp', '' + listener.address().port, function (err) { + if (err) { + return console.log(err); + } else { + // Try to be as atomic as possible + fs.rename('server.port.tmp', `server-${instanceId}.port`, function (err) { + if (err) { + return console.log(err); + } + }); + } + }); + }), + { + forceExit: false, // Let the event loop clear + finally: () => debugLog('graceful shutdown finished.'), + } + )(); + } catch (err) { + console.error('Error during shutdown:', err); + } + }, 200); +}); function getInstanceId() { - const args = process.argv.slice(2); - - // Look for the --node-server-instance-id option - let instanceId; - - args.forEach(arg => { - if (arg.startsWith('--node-server-instance-id=')) { - instanceId = arg.split('=')[1]; - } - }); - - // throw if instanceId is not set - if (!instanceId) { - throw new Error("Missing --node-server-instance-id argument"); - } - return instanceId; + return ( + process.argv + .slice(2) + .find(arg => arg.startsWith('--node-server-instance-id=')) + ?.split('=')[1] + || (() => { + throw new Error('Missing --node-server-instance-id argument'); + })() + ); } -var listener = app.listen(0, "127.0.0.1", () => { - const instanceId = getInstanceId(); - debugLog("Server running on port " + listener.address().port + " for instance " + instanceId); - fs.writeFile("server.port.tmp", "" + listener.address().port, function (err) { - if (err) { - return console.log(err); - } else { - fs.rename("server.port.tmp", `server-${instanceId}.port`, function (err) { - if (err) { - return console.log(err); - } - }); // try to be as atomic as possible - } - }); -}); -const shutdown = shutdownServer(listener, { - forceExit: false, // let the event loop clear - finally: () => debugLog("graceful shutdown finished."), -}); - -app.post("/shutdown", (req, res) => { - res.status(200).send("Shutting down"); - setTimeout(async () => { - try { - await shutdown(); - } catch (err) { - console.error("Error during shutdown:", err); - } - }, 200); -}); +function debugLog() { + if (false) { // Set to true for debug log output in node process + console.log.apply(this, arguments); + } +} diff --git a/lib/src/main/resources/com/diffplug/spotless/npm/eslint-serve.js b/lib/src/main/resources/com/diffplug/spotless/npm/eslint-serve.js index 8b60e56dc8..532c481ddd 100644 --- a/lib/src/main/resources/com/diffplug/spotless/npm/eslint-serve.js +++ b/lib/src/main/resources/com/diffplug/spotless/npm/eslint-serve.js @@ -1,4 +1,4 @@ -const {ESLint} = require("eslint"); +import { ESLint } from 'eslint'; app.post("/eslint/format", async (req, res) => { try { diff --git a/lib/src/main/resources/com/diffplug/spotless/npm/prettier-serve.js b/lib/src/main/resources/com/diffplug/spotless/npm/prettier-serve.js index ac1f26790d..0a5c0bb6e5 100644 --- a/lib/src/main/resources/com/diffplug/spotless/npm/prettier-serve.js +++ b/lib/src/main/resources/com/diffplug/spotless/npm/prettier-serve.js @@ -1,4 +1,4 @@ -const prettier = require("prettier"); +import prettier from 'prettier'; app.post("/prettier/config-options", (req, res) => { const config_data = req.body; diff --git a/lib/src/main/resources/com/diffplug/spotless/npm/tsfmt-serve.js b/lib/src/main/resources/com/diffplug/spotless/npm/tsfmt-serve.js index ffbb36c8a4..f536afad5d 100644 --- a/lib/src/main/resources/com/diffplug/spotless/npm/tsfmt-serve.js +++ b/lib/src/main/resources/com/diffplug/spotless/npm/tsfmt-serve.js @@ -1,7 +1,7 @@ -const tsfmt = require("typescript-formatter"); +import tsfmt from 'typescript-formatter'; app.post("/tsfmt/format", (req, res) => { - var format_data = req.body; + let format_data = req.body; tsfmt.processString("spotless-format-string.ts", format_data.file_content, format_data.config_options).then(resultMap => { /* export interface ResultMap { diff --git a/plugin-maven/src/test/java/com/diffplug/spotless/maven/npm/NpmTestsWithDynamicallyInstalledNpmInstallationTest.java b/plugin-maven/src/test/java/com/diffplug/spotless/maven/npm/NpmTestsWithDynamicallyInstalledNpmInstallationTest.java index 78830bf09d..eeb6929f3b 100644 --- a/plugin-maven/src/test/java/com/diffplug/spotless/maven/npm/NpmTestsWithDynamicallyInstalledNpmInstallationTest.java +++ b/plugin-maven/src/test/java/com/diffplug/spotless/maven/npm/NpmTestsWithDynamicallyInstalledNpmInstallationTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2023 DiffPlug + * Copyright 2023-2025 DiffPlug * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -25,6 +25,8 @@ public class NpmTestsWithDynamicallyInstalledNpmInstallationTest extends MavenIntegrationHarness { + public static final String TS = "typescript"; + @Test void useDownloadedNpmInstallation() throws Exception { writePomWithPrettierSteps( @@ -34,15 +36,11 @@ void useDownloadedNpmInstallation() throws Exception { " " + installedNpmPath() + "", ""); - String kind = "typescript"; - String suffix = "ts"; - String configPath = ".prettierrc.yml"; - setFile(configPath).toResource("npm/prettier/filetypes/" + kind + "/" + ".prettierrc.yml"); - String path = "src/main/" + kind + "/test." + suffix; - setFile(path).toResource("npm/prettier/filetypes/" + kind + "/" + kind + ".dirty"); - + String path = "src/main/" + TS + "/test.ts"; + setFile(path).toResource("npm/prettier/filetypes/" + TS + "/" + TS + ".dirty"); + setFile(".prettierrc.yml").toResource("npm/prettier/filetypes/" + TS + "/" + ".prettierrc.yml"); mavenRunner().withArguments(installNpmMavenGoal(), "spotless:apply").runNoError(); - assertFile(path).sameAsResource("npm/prettier/filetypes/" + kind + "/" + kind + ".clean"); + assertFile(path).sameAsResource("npm/prettier/filetypes/" + TS + "/" + TS + ".clean"); } } diff --git a/rewrite.yml b/rewrite.yml index 00f05a6fa4..6c188d0bf4 100644 --- a/rewrite.yml +++ b/rewrite.yml @@ -1,7 +1,7 @@ --- type: specs.openrewrite.org/v1beta/recipe name: com.diffplug.spotless.openrewrite.SanityCheck -displayName: Apply all Java & Gradle best practices +displayName: Apply all best practices description: Comprehensive code quality recipe combining modernization, security, and best practices. tags: - java @@ -9,6 +9,11 @@ tags: - static-analysis - cleanup recipeList: + - org.openrewrite.codemods.ESLint + - org.openrewrite.codemods.UI5 + - org.openrewrite.codemods.cleanup.javascript.EmptyBraceSpaces + - org.openrewrite.codemods.cleanup.javascript.PreferModule + - org.openrewrite.codemods.ecmascript.5to6.ECMAScript6BestPractices - org.openrewrite.gradle.EnableGradleBuildCache - org.openrewrite.gradle.EnableGradleParallelExecution - org.openrewrite.gradle.GradleBestPractices From cd3f9930ef7b36cc04d3f567734b49e767687781 Mon Sep 17 00:00:00 2001 From: Vincent Potucek Date: Sun, 30 Nov 2025 12:44:57 +0100 Subject: [PATCH 02/20] [ECMAScript6BestPractices] prerequisite fix `common-serve.js` Signed-off-by: Vincent Potucek --- .../com/diffplug/spotless/npm/common-serve.js | 93 ++++++++----------- .../diffplug/spotless/npm/prettier-serve.js | 9 +- .../com/diffplug/spotless/npm/tsfmt-serve.js | 18 +--- ...namicallyInstalledNpmInstallationTest.java | 16 ++-- testlib/src/main/resources/clang/example.js | 6 +- 5 files changed, 53 insertions(+), 89 deletions(-) diff --git a/lib/src/main/resources/com/diffplug/spotless/npm/common-serve.js b/lib/src/main/resources/com/diffplug/spotless/npm/common-serve.js index edce61465a..ced5c6559e 100644 --- a/lib/src/main/resources/com/diffplug/spotless/npm/common-serve.js +++ b/lib/src/main/resources/com/diffplug/spotless/npm/common-serve.js @@ -1,65 +1,50 @@ -// this file will be glued to the top of the specific xy-serve.js file -const debug_serve = false; // set to true for debug log output in node process -const shutdownServer = require("http-graceful-shutdown"); const express = require("express"); const app = express(); - -app.use(express.json({limit: "50mb"})); - const fs = require("fs"); +const shutdownServer = require("http-graceful-shutdown"); -function debugLog() { - if (debug_serve) { - console.log.apply(this, arguments) - } -} +// this file will be glued to the top of the specific xy-serve.js file -function getInstanceId() { - const args = process.argv.slice(2); +app.use(express.json({ limit: "50mb" })); - // Look for the --node-server-instance-id option - let instanceId; +const server = app.listen(0, "127.0.0.1", () => streamOutput(server, getInstanceId())); - args.forEach(arg => { - if (arg.startsWith('--node-server-instance-id=')) { - instanceId = arg.split('=')[1]; - } - }); +app.post("/shutdown", (req, res) => { + res.status(200).send("Graceful shutdown."); + setTimeout(async () => { + try { + await shutdownServer(server, { + forceExit: false, // let the event loop clear + finally: () => debugLog("graceful shutdown finished."), + })(); + } catch (err) { + console.error("Error during shutdown:", err); + } + }, 200); +}); - // throw if instanceId is not set - if (!instanceId) { - throw new Error("Missing --node-server-instance-id argument"); - } - return instanceId; +function getInstanceId() { + return process.argv.slice(2).find(arg => arg.startsWith("--node-server-instance-id="))?.split("=")[1] + || (() => { throw new Error("Missing --node-server-instance-id argument"); })(); } -var listener = app.listen(0, "127.0.0.1", () => { - const instanceId = getInstanceId(); - debugLog("Server running on port " + listener.address().port + " for instance " + instanceId); - fs.writeFile("server.port.tmp", "" + listener.address().port, function (err) { - if (err) { - return console.log(err); - } else { - fs.rename("server.port.tmp", `server-${instanceId}.port`, function (err) { - if (err) { - return console.log(err); - } - }); // try to be as atomic as possible - } - }); -}); -const shutdown = shutdownServer(listener, { - forceExit: false, // let the event loop clear - finally: () => debugLog("graceful shutdown finished."), -}); +function streamOutput(server, instanceId) { + debugLog("Server running on port " + server.address().port + " for instance " + instanceId); + fs.writeFile("server.port.tmp", "" + server.address().port, function (err) { + if (err) { + return console.log(err); + } else { + fs.rename("server.port.tmp", `server-${instanceId}.port`, function (err) { + if (err) { + return console.log(err); + } + }); + } + }); +} -app.post("/shutdown", (req, res) => { - res.status(200).send("Shutting down"); - setTimeout(async () => { - try { - await shutdown(); - } catch (err) { - console.error("Error during shutdown:", err); - } - }, 200); -}); +function debugLog() { + if (false) { // set to true for debug log output in node process + console.log.apply(this, arguments); + } +} diff --git a/lib/src/main/resources/com/diffplug/spotless/npm/prettier-serve.js b/lib/src/main/resources/com/diffplug/spotless/npm/prettier-serve.js index ac1f26790d..da3121d72f 100644 --- a/lib/src/main/resources/com/diffplug/spotless/npm/prettier-serve.js +++ b/lib/src/main/resources/com/diffplug/spotless/npm/prettier-serve.js @@ -22,16 +22,13 @@ app.post("/prettier/config-options", (req, res) => { app.post("/prettier/format", async (req, res) => { const format_data = req.body; - - let formatted_file_content = ""; try { - formatted_file_content = await prettierFormat(format_data.file_content, format_data.config_options); + res.set("Content-Type", "text/plain"); + res.send(await prettierFormat(format_data.file_content, format_data.config_options)); } catch(err) { res.status(500).send("Error while formatting: " + err); return; } - res.set("Content-Type", "text/plain"); - res.send(formatted_file_content); }); const prettierFormat = async function(file_content, config_options) { @@ -62,7 +59,7 @@ const mergeConfigOptions = function(resolved_config_options, config_options) { const extend = function() { // Variables const extended = {}; - let i = 0; + const i = 0; const length = arguments.length; // Merge the object into the extended object diff --git a/lib/src/main/resources/com/diffplug/spotless/npm/tsfmt-serve.js b/lib/src/main/resources/com/diffplug/spotless/npm/tsfmt-serve.js index ffbb36c8a4..9c3c4f29b0 100644 --- a/lib/src/main/resources/com/diffplug/spotless/npm/tsfmt-serve.js +++ b/lib/src/main/resources/com/diffplug/spotless/npm/tsfmt-serve.js @@ -1,23 +1,7 @@ const tsfmt = require("typescript-formatter"); app.post("/tsfmt/format", (req, res) => { - var format_data = req.body; - tsfmt.processString("spotless-format-string.ts", format_data.file_content, format_data.config_options).then(resultMap => { - /* - export interface ResultMap { - [fileName: string]: Result; - } - - export interface Result { - fileName: string; - settings: ts.FormatCodeSettings | null; - message: string; - error: boolean; - src: string; - dest: string; - } - */ - // result contains 'message' (String), 'error' (boolean), 'dest' (String) => formatted + tsfmt.processString("spotless-format-string.ts", req.body.file_content, req.body.config_options).then(resultMap => { if (resultMap.error !== undefined && resultMap.error) { res.status(400).send(resultMap.message); return; diff --git a/plugin-maven/src/test/java/com/diffplug/spotless/maven/npm/NpmTestsWithDynamicallyInstalledNpmInstallationTest.java b/plugin-maven/src/test/java/com/diffplug/spotless/maven/npm/NpmTestsWithDynamicallyInstalledNpmInstallationTest.java index 78830bf09d..eeb6929f3b 100644 --- a/plugin-maven/src/test/java/com/diffplug/spotless/maven/npm/NpmTestsWithDynamicallyInstalledNpmInstallationTest.java +++ b/plugin-maven/src/test/java/com/diffplug/spotless/maven/npm/NpmTestsWithDynamicallyInstalledNpmInstallationTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2023 DiffPlug + * Copyright 2023-2025 DiffPlug * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -25,6 +25,8 @@ public class NpmTestsWithDynamicallyInstalledNpmInstallationTest extends MavenIntegrationHarness { + public static final String TS = "typescript"; + @Test void useDownloadedNpmInstallation() throws Exception { writePomWithPrettierSteps( @@ -34,15 +36,11 @@ void useDownloadedNpmInstallation() throws Exception { " " + installedNpmPath() + "", ""); - String kind = "typescript"; - String suffix = "ts"; - String configPath = ".prettierrc.yml"; - setFile(configPath).toResource("npm/prettier/filetypes/" + kind + "/" + ".prettierrc.yml"); - String path = "src/main/" + kind + "/test." + suffix; - setFile(path).toResource("npm/prettier/filetypes/" + kind + "/" + kind + ".dirty"); - + String path = "src/main/" + TS + "/test.ts"; + setFile(path).toResource("npm/prettier/filetypes/" + TS + "/" + TS + ".dirty"); + setFile(".prettierrc.yml").toResource("npm/prettier/filetypes/" + TS + "/" + ".prettierrc.yml"); mavenRunner().withArguments(installNpmMavenGoal(), "spotless:apply").runNoError(); - assertFile(path).sameAsResource("npm/prettier/filetypes/" + kind + "/" + kind + ".clean"); + assertFile(path).sameAsResource("npm/prettier/filetypes/" + TS + "/" + TS + ".clean"); } } diff --git a/testlib/src/main/resources/clang/example.js b/testlib/src/main/resources/clang/example.js index 08ebafc1a2..99b023d78c 100644 --- a/testlib/src/main/resources/clang/example.js +++ b/testlib/src/main/resources/clang/example.js @@ -1,4 +1,4 @@ -var numbers=[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20, +const numbers=[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20, ]; const p = { @@ -10,9 +10,9 @@ const p = { const str = "Hello, world!" ; -var str2=str.charAt(3)+str[0]; +const str2=str.charAt(3)+str[0]; -var multilinestr = "Hello \ +const multilinestr = "Hello \ World" ; From 8c83dd9ec652c09a313b0e01acae7fb27a187b32 Mon Sep 17 00:00:00 2001 From: Vincent Potucek Date: Sun, 30 Nov 2025 13:48:21 +0100 Subject: [PATCH 03/20] [rewrite] apply `ECMAScript6BestPractices` Signed-off-by: Vincent Potucek --- gradle/rewrite.gradle | 5 +- .../com/diffplug/spotless/npm/common-serve.js | 99 ++++++++----------- .../com/diffplug/spotless/npm/eslint-serve.js | 2 +- .../diffplug/spotless/npm/prettier-serve.js | 11 +-- .../com/diffplug/spotless/npm/tsfmt-serve.js | 20 +--- ...namicallyInstalledNpmInstallationTest.java | 16 ++- rewrite.yml | 7 +- testlib/src/main/resources/clang/example.js | 6 +- 8 files changed, 68 insertions(+), 98 deletions(-) diff --git a/gradle/rewrite.gradle b/gradle/rewrite.gradle index 62f5170c46..2202453916 100644 --- a/gradle/rewrite.gradle +++ b/gradle/rewrite.gradle @@ -15,14 +15,15 @@ rewrite { '**plugin-maven/build.gradle', '**settings.gradle', '**special-tests.gradle', - '**testlib/src/main/resources**' + '**testlib/src/main/resources**', ) exportDatatables = true failOnDryRunResults = true } dependencies { - rewrite('org.openrewrite.recipe:rewrite-migrate-java:3.22.0') + rewrite('org.openrewrite.recipe:rewrite-codemods:0.22.0') rewrite('org.openrewrite.recipe:rewrite-java-security:3.22.0') + rewrite('org.openrewrite.recipe:rewrite-migrate-java:3.22.0') rewrite('org.openrewrite.recipe:rewrite-rewrite:0.16.0') rewrite('org.openrewrite.recipe:rewrite-static-analysis:2.22.0') rewrite('org.openrewrite.recipe:rewrite-third-party:0.31.2') diff --git a/lib/src/main/resources/com/diffplug/spotless/npm/common-serve.js b/lib/src/main/resources/com/diffplug/spotless/npm/common-serve.js index edce61465a..c5e671ee80 100644 --- a/lib/src/main/resources/com/diffplug/spotless/npm/common-serve.js +++ b/lib/src/main/resources/com/diffplug/spotless/npm/common-serve.js @@ -1,65 +1,50 @@ -// this file will be glued to the top of the specific xy-serve.js file -const debug_serve = false; // set to true for debug log output in node process -const shutdownServer = require("http-graceful-shutdown"); -const express = require("express"); -const app = express(); - -app.use(express.json({limit: "50mb"})); +import express from 'express'; +import fs from 'fs'; +import shutdownServer from 'http-graceful-shutdown'; -const fs = require("fs"); +// this file will be glued to the top of the specific xy-serve.js file -function debugLog() { - if (debug_serve) { - console.log.apply(this, arguments) - } +init(express()); + +function init(app) { + app.use(express.json({ limit: "50mb" })); + app.post("/shutdown", (req, res) => { + res.status(200).send("Graceful shutdown."); + setTimeout(async () => { + try { + await shutdownServer(app.listen(0, "127.0.0.1", () => streamOutput(server, getInstanceId())), { + forceExit: false, // let the event loop clear + finally: () => debugLog("graceful shutdown finished."), + })(); + } catch (err) { + console.error("Error during shutdown:", err); + } + }, 200); + }); } function getInstanceId() { - const args = process.argv.slice(2); - - // Look for the --node-server-instance-id option - let instanceId; - - args.forEach(arg => { - if (arg.startsWith('--node-server-instance-id=')) { - instanceId = arg.split('=')[1]; - } - }); - - // throw if instanceId is not set - if (!instanceId) { - throw new Error("Missing --node-server-instance-id argument"); - } - return instanceId; + return process.argv.slice(2).find(arg => arg.startsWith("--node-server-instance-id="))?.split("=")[1] + || (() => { throw new Error("Missing --node-server-instance-id argument"); })(); } -var listener = app.listen(0, "127.0.0.1", () => { - const instanceId = getInstanceId(); - debugLog("Server running on port " + listener.address().port + " for instance " + instanceId); - fs.writeFile("server.port.tmp", "" + listener.address().port, function (err) { - if (err) { - return console.log(err); - } else { - fs.rename("server.port.tmp", `server-${instanceId}.port`, function (err) { - if (err) { - return console.log(err); - } - }); // try to be as atomic as possible - } - }); -}); -const shutdown = shutdownServer(listener, { - forceExit: false, // let the event loop clear - finally: () => debugLog("graceful shutdown finished."), -}); +function streamOutput(server, instanceId) { + debugLog("Server running on port " + server.address().port + " for instance " + instanceId); + fs.writeFile("server.port.tmp", "" + server.address().port, function (err) { + if (err) { + return console.log(err); + } else { + fs.rename("server.port.tmp", `server-${instanceId}.port`, function (err) { + if (err) { + return console.log(err); + } + }); + } + }); +} -app.post("/shutdown", (req, res) => { - res.status(200).send("Shutting down"); - setTimeout(async () => { - try { - await shutdown(); - } catch (err) { - console.error("Error during shutdown:", err); - } - }, 200); -}); +function debugLog() { + if (false) { // set to true for debug log output in node process + console.log.apply(this, arguments); + } +} diff --git a/lib/src/main/resources/com/diffplug/spotless/npm/eslint-serve.js b/lib/src/main/resources/com/diffplug/spotless/npm/eslint-serve.js index 8b60e56dc8..532c481ddd 100644 --- a/lib/src/main/resources/com/diffplug/spotless/npm/eslint-serve.js +++ b/lib/src/main/resources/com/diffplug/spotless/npm/eslint-serve.js @@ -1,4 +1,4 @@ -const {ESLint} = require("eslint"); +import { ESLint } from 'eslint'; app.post("/eslint/format", async (req, res) => { try { diff --git a/lib/src/main/resources/com/diffplug/spotless/npm/prettier-serve.js b/lib/src/main/resources/com/diffplug/spotless/npm/prettier-serve.js index ac1f26790d..41b956d8df 100644 --- a/lib/src/main/resources/com/diffplug/spotless/npm/prettier-serve.js +++ b/lib/src/main/resources/com/diffplug/spotless/npm/prettier-serve.js @@ -1,4 +1,4 @@ -const prettier = require("prettier"); +import prettier from 'prettier'; app.post("/prettier/config-options", (req, res) => { const config_data = req.body; @@ -22,16 +22,13 @@ app.post("/prettier/config-options", (req, res) => { app.post("/prettier/format", async (req, res) => { const format_data = req.body; - - let formatted_file_content = ""; try { - formatted_file_content = await prettierFormat(format_data.file_content, format_data.config_options); + res.set("Content-Type", "text/plain"); + res.send(await prettierFormat(format_data.file_content, format_data.config_options)); } catch(err) { res.status(500).send("Error while formatting: " + err); return; } - res.set("Content-Type", "text/plain"); - res.send(formatted_file_content); }); const prettierFormat = async function(file_content, config_options) { @@ -62,7 +59,7 @@ const mergeConfigOptions = function(resolved_config_options, config_options) { const extend = function() { // Variables const extended = {}; - let i = 0; + const i = 0; const length = arguments.length; // Merge the object into the extended object diff --git a/lib/src/main/resources/com/diffplug/spotless/npm/tsfmt-serve.js b/lib/src/main/resources/com/diffplug/spotless/npm/tsfmt-serve.js index ffbb36c8a4..6c6cddaceb 100644 --- a/lib/src/main/resources/com/diffplug/spotless/npm/tsfmt-serve.js +++ b/lib/src/main/resources/com/diffplug/spotless/npm/tsfmt-serve.js @@ -1,23 +1,7 @@ -const tsfmt = require("typescript-formatter"); +import tsfmt from 'typescript-formatter'; app.post("/tsfmt/format", (req, res) => { - var format_data = req.body; - tsfmt.processString("spotless-format-string.ts", format_data.file_content, format_data.config_options).then(resultMap => { - /* - export interface ResultMap { - [fileName: string]: Result; - } - - export interface Result { - fileName: string; - settings: ts.FormatCodeSettings | null; - message: string; - error: boolean; - src: string; - dest: string; - } - */ - // result contains 'message' (String), 'error' (boolean), 'dest' (String) => formatted + tsfmt.processString("spotless-format-string.ts", req.body.file_content, req.body.config_options).then(resultMap => { if (resultMap.error !== undefined && resultMap.error) { res.status(400).send(resultMap.message); return; diff --git a/plugin-maven/src/test/java/com/diffplug/spotless/maven/npm/NpmTestsWithDynamicallyInstalledNpmInstallationTest.java b/plugin-maven/src/test/java/com/diffplug/spotless/maven/npm/NpmTestsWithDynamicallyInstalledNpmInstallationTest.java index 78830bf09d..eeb6929f3b 100644 --- a/plugin-maven/src/test/java/com/diffplug/spotless/maven/npm/NpmTestsWithDynamicallyInstalledNpmInstallationTest.java +++ b/plugin-maven/src/test/java/com/diffplug/spotless/maven/npm/NpmTestsWithDynamicallyInstalledNpmInstallationTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2023 DiffPlug + * Copyright 2023-2025 DiffPlug * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -25,6 +25,8 @@ public class NpmTestsWithDynamicallyInstalledNpmInstallationTest extends MavenIntegrationHarness { + public static final String TS = "typescript"; + @Test void useDownloadedNpmInstallation() throws Exception { writePomWithPrettierSteps( @@ -34,15 +36,11 @@ void useDownloadedNpmInstallation() throws Exception { " " + installedNpmPath() + "", ""); - String kind = "typescript"; - String suffix = "ts"; - String configPath = ".prettierrc.yml"; - setFile(configPath).toResource("npm/prettier/filetypes/" + kind + "/" + ".prettierrc.yml"); - String path = "src/main/" + kind + "/test." + suffix; - setFile(path).toResource("npm/prettier/filetypes/" + kind + "/" + kind + ".dirty"); - + String path = "src/main/" + TS + "/test.ts"; + setFile(path).toResource("npm/prettier/filetypes/" + TS + "/" + TS + ".dirty"); + setFile(".prettierrc.yml").toResource("npm/prettier/filetypes/" + TS + "/" + ".prettierrc.yml"); mavenRunner().withArguments(installNpmMavenGoal(), "spotless:apply").runNoError(); - assertFile(path).sameAsResource("npm/prettier/filetypes/" + kind + "/" + kind + ".clean"); + assertFile(path).sameAsResource("npm/prettier/filetypes/" + TS + "/" + TS + ".clean"); } } diff --git a/rewrite.yml b/rewrite.yml index 00f05a6fa4..6c188d0bf4 100644 --- a/rewrite.yml +++ b/rewrite.yml @@ -1,7 +1,7 @@ --- type: specs.openrewrite.org/v1beta/recipe name: com.diffplug.spotless.openrewrite.SanityCheck -displayName: Apply all Java & Gradle best practices +displayName: Apply all best practices description: Comprehensive code quality recipe combining modernization, security, and best practices. tags: - java @@ -9,6 +9,11 @@ tags: - static-analysis - cleanup recipeList: + - org.openrewrite.codemods.ESLint + - org.openrewrite.codemods.UI5 + - org.openrewrite.codemods.cleanup.javascript.EmptyBraceSpaces + - org.openrewrite.codemods.cleanup.javascript.PreferModule + - org.openrewrite.codemods.ecmascript.5to6.ECMAScript6BestPractices - org.openrewrite.gradle.EnableGradleBuildCache - org.openrewrite.gradle.EnableGradleParallelExecution - org.openrewrite.gradle.GradleBestPractices diff --git a/testlib/src/main/resources/clang/example.js b/testlib/src/main/resources/clang/example.js index 08ebafc1a2..99b023d78c 100644 --- a/testlib/src/main/resources/clang/example.js +++ b/testlib/src/main/resources/clang/example.js @@ -1,4 +1,4 @@ -var numbers=[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20, +const numbers=[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20, ]; const p = { @@ -10,9 +10,9 @@ const p = { const str = "Hello, world!" ; -var str2=str.charAt(3)+str[0]; +const str2=str.charAt(3)+str[0]; -var multilinestr = "Hello \ +const multilinestr = "Hello \ World" ; From 99a2a52b7d5bda7f45e516bbbf686d4329cf693a Mon Sep 17 00:00:00 2001 From: Vincent Potucek Date: Sun, 30 Nov 2025 13:49:36 +0100 Subject: [PATCH 04/20] [rewrite] apply `ECMAScript6BestPractices` Signed-off-by: Vincent Potucek --- .../com/diffplug/spotless/npm/common-serve.js | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/lib/src/main/resources/com/diffplug/spotless/npm/common-serve.js b/lib/src/main/resources/com/diffplug/spotless/npm/common-serve.js index c5e671ee80..fe8313eed7 100644 --- a/lib/src/main/resources/com/diffplug/spotless/npm/common-serve.js +++ b/lib/src/main/resources/com/diffplug/spotless/npm/common-serve.js @@ -23,11 +23,6 @@ function init(app) { }); } -function getInstanceId() { - return process.argv.slice(2).find(arg => arg.startsWith("--node-server-instance-id="))?.split("=")[1] - || (() => { throw new Error("Missing --node-server-instance-id argument"); })(); -} - function streamOutput(server, instanceId) { debugLog("Server running on port " + server.address().port + " for instance " + instanceId); fs.writeFile("server.port.tmp", "" + server.address().port, function (err) { @@ -43,6 +38,11 @@ function streamOutput(server, instanceId) { }); } +function getInstanceId() { + return process.argv.slice(2).find(arg => arg.startsWith("--node-server-instance-id="))?.split("=")[1] + || (() => { throw new Error("Missing --node-server-instance-id argument"); })(); +} + function debugLog() { if (false) { // set to true for debug log output in node process console.log.apply(this, arguments); From e38991b4153556ef7947af51ae62bdb4816d53b8 Mon Sep 17 00:00:00 2001 From: Vincent Potucek Date: Sun, 30 Nov 2025 13:50:28 +0100 Subject: [PATCH 05/20] [rewrite] apply `ECMAScript6BestPractices` Signed-off-by: Vincent Potucek --- .../main/resources/com/diffplug/spotless/npm/common-serve.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/src/main/resources/com/diffplug/spotless/npm/common-serve.js b/lib/src/main/resources/com/diffplug/spotless/npm/common-serve.js index fe8313eed7..bf950dafbd 100644 --- a/lib/src/main/resources/com/diffplug/spotless/npm/common-serve.js +++ b/lib/src/main/resources/com/diffplug/spotless/npm/common-serve.js @@ -9,7 +9,6 @@ init(express()); function init(app) { app.use(express.json({ limit: "50mb" })); app.post("/shutdown", (req, res) => { - res.status(200).send("Graceful shutdown."); setTimeout(async () => { try { await shutdownServer(app.listen(0, "127.0.0.1", () => streamOutput(server, getInstanceId())), { @@ -20,6 +19,7 @@ function init(app) { console.error("Error during shutdown:", err); } }, 200); + res.status(200).send("Graceful shutdown."); }); } From 777aee09dd38cbb76c687769a2998d507b2f4541 Mon Sep 17 00:00:00 2001 From: Vincent Potucek Date: Sun, 30 Nov 2025 13:51:19 +0100 Subject: [PATCH 06/20] [rewrite] apply `ECMAScript6BestPractices` Signed-off-by: Vincent Potucek --- .../main/resources/com/diffplug/spotless/npm/common-serve.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/src/main/resources/com/diffplug/spotless/npm/common-serve.js b/lib/src/main/resources/com/diffplug/spotless/npm/common-serve.js index bf950dafbd..036036a920 100644 --- a/lib/src/main/resources/com/diffplug/spotless/npm/common-serve.js +++ b/lib/src/main/resources/com/diffplug/spotless/npm/common-serve.js @@ -19,7 +19,7 @@ function init(app) { console.error("Error during shutdown:", err); } }, 200); - res.status(200).send("Graceful shutdown."); + res.ok().send("Graceful shutdown."); }); } From 7dbec54bd5dfb25452239be78c3f1e6a91e32480 Mon Sep 17 00:00:00 2001 From: Vincent Potucek Date: Sun, 30 Nov 2025 13:56:28 +0100 Subject: [PATCH 07/20] [rewrite] apply `ECMAScript6BestPractices` Signed-off-by: Vincent Potucek --- .../com/diffplug/spotless/npm/common-serve.js | 45 ++++++++++--------- 1 file changed, 23 insertions(+), 22 deletions(-) diff --git a/lib/src/main/resources/com/diffplug/spotless/npm/common-serve.js b/lib/src/main/resources/com/diffplug/spotless/npm/common-serve.js index 036036a920..9452ba0b7f 100644 --- a/lib/src/main/resources/com/diffplug/spotless/npm/common-serve.js +++ b/lib/src/main/resources/com/diffplug/spotless/npm/common-serve.js @@ -4,23 +4,29 @@ import shutdownServer from 'http-graceful-shutdown'; // this file will be glued to the top of the specific xy-serve.js file -init(express()); - -function init(app) { - app.use(express.json({ limit: "50mb" })); - app.post("/shutdown", (req, res) => { - setTimeout(async () => { - try { - await shutdownServer(app.listen(0, "127.0.0.1", () => streamOutput(server, getInstanceId())), { - forceExit: false, // let the event loop clear - finally: () => debugLog("graceful shutdown finished."), - })(); - } catch (err) { - console.error("Error during shutdown:", err); - } - }, 200); - res.ok().send("Graceful shutdown."); - }); +const app = express(); + +app.use(express.json({ limit: "50mb" })); + +const server = app.listen(0, "127.0.0.1", () => streamOutput(server, getInstanceId())); + +app.post("/shutdown", (req, res) => { + res.status(200).send("Graceful shutdown."); + setTimeout(async () => { + try { + await shutdownServer(server, { + forceExit: false, // let the event loop clear + finally: () => debugLog("graceful shutdown finished."), + })(); + } catch (err) { + console.error("Error during shutdown:", err); + } + }, 200); +}); + +function getInstanceId() { + return process.argv.slice(2).find(arg => arg.startsWith("--node-server-instance-id="))?.split("=")[1] + || (() => { throw new Error("Missing --node-server-instance-id argument"); })(); } function streamOutput(server, instanceId) { @@ -38,11 +44,6 @@ function streamOutput(server, instanceId) { }); } -function getInstanceId() { - return process.argv.slice(2).find(arg => arg.startsWith("--node-server-instance-id="))?.split("=")[1] - || (() => { throw new Error("Missing --node-server-instance-id argument"); })(); -} - function debugLog() { if (false) { // set to true for debug log output in node process console.log.apply(this, arguments); From 84680f3e07469c6f2b09edc0e503ee25296d37d3 Mon Sep 17 00:00:00 2001 From: Vincent Potucek Date: Sun, 30 Nov 2025 13:56:58 +0100 Subject: [PATCH 08/20] [rewrite] apply `ECMAScript6BestPractices` Signed-off-by: Vincent Potucek --- .../resources/com/diffplug/spotless/npm/common-serve.js | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/lib/src/main/resources/com/diffplug/spotless/npm/common-serve.js b/lib/src/main/resources/com/diffplug/spotless/npm/common-serve.js index 9452ba0b7f..57a5154df5 100644 --- a/lib/src/main/resources/com/diffplug/spotless/npm/common-serve.js +++ b/lib/src/main/resources/com/diffplug/spotless/npm/common-serve.js @@ -8,7 +8,8 @@ const app = express(); app.use(express.json({ limit: "50mb" })); -const server = app.listen(0, "127.0.0.1", () => streamOutput(server, getInstanceId())); +const server = app.listen(0, "127.0.0.1", () => streamOutput(server, process.argv.slice(2).find(arg => arg.startsWith("--node-server-instance-id="))?.split("=")[1] + || (() => { throw new Error("Missing --node-server-instance-id argument"); })())); app.post("/shutdown", (req, res) => { res.status(200).send("Graceful shutdown."); @@ -24,11 +25,6 @@ app.post("/shutdown", (req, res) => { }, 200); }); -function getInstanceId() { - return process.argv.slice(2).find(arg => arg.startsWith("--node-server-instance-id="))?.split("=")[1] - || (() => { throw new Error("Missing --node-server-instance-id argument"); })(); -} - function streamOutput(server, instanceId) { debugLog("Server running on port " + server.address().port + " for instance " + instanceId); fs.writeFile("server.port.tmp", "" + server.address().port, function (err) { From 30a7f465dc77611cad32a744d54279ff9143e374 Mon Sep 17 00:00:00 2001 From: Vincent Potucek Date: Sun, 30 Nov 2025 13:58:31 +0100 Subject: [PATCH 09/20] [rewrite] apply `ECMAScript6BestPractices` Signed-off-by: Vincent Potucek --- .../com/diffplug/spotless/npm/common-serve.js | 72 ++++++++++++------- 1 file changed, 45 insertions(+), 27 deletions(-) diff --git a/lib/src/main/resources/com/diffplug/spotless/npm/common-serve.js b/lib/src/main/resources/com/diffplug/spotless/npm/common-serve.js index 57a5154df5..ef997f6248 100644 --- a/lib/src/main/resources/com/diffplug/spotless/npm/common-serve.js +++ b/lib/src/main/resources/com/diffplug/spotless/npm/common-serve.js @@ -8,40 +8,58 @@ const app = express(); app.use(express.json({ limit: "50mb" })); -const server = app.listen(0, "127.0.0.1", () => streamOutput(server, process.argv.slice(2).find(arg => arg.startsWith("--node-server-instance-id="))?.split("=")[1] - || (() => { throw new Error("Missing --node-server-instance-id argument"); })())); +const server = app.listen( + 0, + "127.0.0.1", + () => + streamOutput( + server, + process.argv + .slice(2) + .find(arg => arg.startsWith("--node-server-instance-id=")) + ?.split("=")[1] || + (() => { + throw new Error("Missing --node-server-instance-id argument"); + })() + ) +); app.post("/shutdown", (req, res) => { - res.status(200).send("Graceful shutdown."); - setTimeout(async () => { - try { - await shutdownServer(server, { - forceExit: false, // let the event loop clear - finally: () => debugLog("graceful shutdown finished."), - })(); - } catch (err) { - console.error("Error during shutdown:", err); - } - }, 200); + res.status(200).send("Graceful shutdown."); + + setTimeout(async () => { + try { + await shutdownServer(server, { + forceExit: false, // let the event loop clear + finally: () => debugLog("graceful shutdown finished.") + })(); + } catch (err) { + console.error("Error during shutdown:", err); + } + }, 200); }); function streamOutput(server, instanceId) { - debugLog("Server running on port " + server.address().port + " for instance " + instanceId); - fs.writeFile("server.port.tmp", "" + server.address().port, function (err) { - if (err) { - return console.log(err); - } else { - fs.rename("server.port.tmp", `server-${instanceId}.port`, function (err) { - if (err) { - return console.log(err); - } - }); - } + const port = server.address().port; + + debugLog(`Server running on port ${port} for instance ${instanceId}`); + + fs.writeFile("server.port.tmp", String(port), err => { + if (err) { + console.log(err); + return; + } + + fs.rename(`server.port.tmp`, `server-${instanceId}.port`, err => { + if (err) { + console.log(err); + } }); + }); } function debugLog() { - if (false) { // set to true for debug log output in node process - console.log.apply(this, arguments); - } + if (false) { // set to true for debug log output in node process + console.log.apply(this, arguments); + } } From dd49e92058262bad14a45057438f27a21405882b Mon Sep 17 00:00:00 2001 From: Vincent Potucek Date: Sun, 30 Nov 2025 13:59:14 +0100 Subject: [PATCH 10/20] [rewrite] apply `ECMAScript6BestPractices` Signed-off-by: Vincent Potucek --- .../resources/com/diffplug/spotless/npm/common-serve.js | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/lib/src/main/resources/com/diffplug/spotless/npm/common-serve.js b/lib/src/main/resources/com/diffplug/spotless/npm/common-serve.js index ef997f6248..31d339296e 100644 --- a/lib/src/main/resources/com/diffplug/spotless/npm/common-serve.js +++ b/lib/src/main/resources/com/diffplug/spotless/npm/common-serve.js @@ -14,13 +14,8 @@ const server = app.listen( () => streamOutput( server, - process.argv - .slice(2) - .find(arg => arg.startsWith("--node-server-instance-id=")) - ?.split("=")[1] || - (() => { - throw new Error("Missing --node-server-instance-id argument"); - })() + process.argv.slice(2).find(arg => arg.startsWith("--node-server-instance-id="))?.split("=")[1] + || (() => { throw new Error("Missing --node-server-instance-id argument"); })() ) ); From 617e2bd271f78f59f6a175d70b1dd19583fb7634 Mon Sep 17 00:00:00 2001 From: Vincent Potucek Date: Sun, 30 Nov 2025 13:59:24 +0100 Subject: [PATCH 11/20] [rewrite] apply `ECMAScript6BestPractices` Signed-off-by: Vincent Potucek --- .../main/resources/com/diffplug/spotless/npm/common-serve.js | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/lib/src/main/resources/com/diffplug/spotless/npm/common-serve.js b/lib/src/main/resources/com/diffplug/spotless/npm/common-serve.js index 31d339296e..7ac483211f 100644 --- a/lib/src/main/resources/com/diffplug/spotless/npm/common-serve.js +++ b/lib/src/main/resources/com/diffplug/spotless/npm/common-serve.js @@ -8,10 +8,7 @@ const app = express(); app.use(express.json({ limit: "50mb" })); -const server = app.listen( - 0, - "127.0.0.1", - () => +const server = app.listen(0,"127.0.0.1", () => streamOutput( server, process.argv.slice(2).find(arg => arg.startsWith("--node-server-instance-id="))?.split("=")[1] From 3648a3967c64d804b885df7db4b804212dbc5667 Mon Sep 17 00:00:00 2001 From: Vincent Potucek Date: Sun, 30 Nov 2025 14:00:11 +0100 Subject: [PATCH 12/20] [rewrite] apply `ECMAScript6BestPractices` Signed-off-by: Vincent Potucek --- .../com/diffplug/spotless/npm/common-serve.js | 56 ++++++++----------- 1 file changed, 23 insertions(+), 33 deletions(-) diff --git a/lib/src/main/resources/com/diffplug/spotless/npm/common-serve.js b/lib/src/main/resources/com/diffplug/spotless/npm/common-serve.js index 7ac483211f..fcb6c53f11 100644 --- a/lib/src/main/resources/com/diffplug/spotless/npm/common-serve.js +++ b/lib/src/main/resources/com/diffplug/spotless/npm/common-serve.js @@ -10,48 +10,38 @@ app.use(express.json({ limit: "50mb" })); const server = app.listen(0,"127.0.0.1", () => streamOutput( - server, - process.argv.slice(2).find(arg => arg.startsWith("--node-server-instance-id="))?.split("=")[1] - || (() => { throw new Error("Missing --node-server-instance-id argument"); })() + server, + process.argv.slice(2).find(arg => arg.startsWith("--node-server-instance-id="))?.split("=")[1] + || (() => { throw new Error("Missing --node-server-instance-id argument"); })() ) ); app.post("/shutdown", (req, res) => { - res.status(200).send("Graceful shutdown."); - - setTimeout(async () => { - try { - await shutdownServer(server, { - forceExit: false, // let the event loop clear - finally: () => debugLog("graceful shutdown finished.") - })(); - } catch (err) { - console.error("Error during shutdown:", err); - } - }, 200); + res.status(200).send("Graceful shutdown."); + setTimeout(async () => { + try { + await shutdownServer(server, { + forceExit: false, + finally: () => debugLog("graceful shutdown finished.") + })(); + } catch (err) { + console.error("Error during shutdown:", err); + } + }, 200); }); function streamOutput(server, instanceId) { - const port = server.address().port; - - debugLog(`Server running on port ${port} for instance ${instanceId}`); - - fs.writeFile("server.port.tmp", String(port), err => { - if (err) { - console.log(err); - return; - } - - fs.rename(`server.port.tmp`, `server-${instanceId}.port`, err => { - if (err) { - console.log(err); - } + const port = server.address().port; + debugLog(`Server running on port ${port} for instance ${instanceId}`); + + fs.writeFile("server.port.tmp", String(port), err => { + if (err) return console.log(err); + fs.rename("server.port.tmp", `server-${instanceId}.port`, err => { + if (err) console.log(err); + }); }); - }); } function debugLog() { - if (false) { // set to true for debug log output in node process - console.log.apply(this, arguments); - } + if (false) console.log.apply(this, arguments); } From 7d1eb76acf80ae6aab579e77beb3f463a86bc56e Mon Sep 17 00:00:00 2001 From: Vincent Potucek Date: Sun, 30 Nov 2025 14:00:55 +0100 Subject: [PATCH 13/20] [rewrite] apply `ECMAScript6BestPractices` Signed-off-by: Vincent Potucek --- .../com/diffplug/spotless/npm/common-serve.js | 43 +++++++++---------- 1 file changed, 20 insertions(+), 23 deletions(-) diff --git a/lib/src/main/resources/com/diffplug/spotless/npm/common-serve.js b/lib/src/main/resources/com/diffplug/spotless/npm/common-serve.js index ced5c6559e..56b004927f 100644 --- a/lib/src/main/resources/com/diffplug/spotless/npm/common-serve.js +++ b/lib/src/main/resources/com/diffplug/spotless/npm/common-serve.js @@ -1,21 +1,28 @@ const express = require("express"); -const app = express(); const fs = require("fs"); const shutdownServer = require("http-graceful-shutdown"); // this file will be glued to the top of the specific xy-serve.js file +const app = express(); + app.use(express.json({ limit: "50mb" })); -const server = app.listen(0, "127.0.0.1", () => streamOutput(server, getInstanceId())); +const server = app.listen(0,"127.0.0.1", () => + streamOutput( + server, + process.argv.slice(2).find(arg => arg.startsWith("--node-server-instance-id="))?.split("=")[1] + || (() => { throw new Error("Missing --node-server-instance-id argument"); })() + ) +); app.post("/shutdown", (req, res) => { res.status(200).send("Graceful shutdown."); setTimeout(async () => { try { await shutdownServer(server, { - forceExit: false, // let the event loop clear - finally: () => debugLog("graceful shutdown finished."), + forceExit: false, + finally: () => debugLog("graceful shutdown finished.") })(); } catch (err) { console.error("Error during shutdown:", err); @@ -23,28 +30,18 @@ app.post("/shutdown", (req, res) => { }, 200); }); -function getInstanceId() { - return process.argv.slice(2).find(arg => arg.startsWith("--node-server-instance-id="))?.split("=")[1] - || (() => { throw new Error("Missing --node-server-instance-id argument"); })(); -} - function streamOutput(server, instanceId) { - debugLog("Server running on port " + server.address().port + " for instance " + instanceId); - fs.writeFile("server.port.tmp", "" + server.address().port, function (err) { - if (err) { - return console.log(err); - } else { - fs.rename("server.port.tmp", `server-${instanceId}.port`, function (err) { - if (err) { - return console.log(err); - } - }); - } + const port = server.address().port; + debugLog(`Server running on port ${port} for instance ${instanceId}`); + + fs.writeFile("server.port.tmp", String(port), err => { + if (err) return console.log(err); + fs.rename("server.port.tmp", `server-${instanceId}.port`, err => { + if (err) console.log(err); + }); }); } function debugLog() { - if (false) { // set to true for debug log output in node process - console.log.apply(this, arguments); - } + if (false) console.log.apply(this, arguments); } From 6cc4dcc71fe071d213ebb327b4c0e4d9655061be Mon Sep 17 00:00:00 2001 From: Vincent Potucek Date: Sun, 30 Nov 2025 14:02:05 +0100 Subject: [PATCH 14/20] [rewrite] apply `ECMAScript6BestPractices` Signed-off-by: Vincent Potucek --- .../resources/com/diffplug/spotless/npm/common-serve.js | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/lib/src/main/resources/com/diffplug/spotless/npm/common-serve.js b/lib/src/main/resources/com/diffplug/spotless/npm/common-serve.js index 56b004927f..bd5bb651f6 100644 --- a/lib/src/main/resources/com/diffplug/spotless/npm/common-serve.js +++ b/lib/src/main/resources/com/diffplug/spotless/npm/common-serve.js @@ -10,9 +10,9 @@ app.use(express.json({ limit: "50mb" })); const server = app.listen(0,"127.0.0.1", () => streamOutput( - server, process.argv.slice(2).find(arg => arg.startsWith("--node-server-instance-id="))?.split("=")[1] - || (() => { throw new Error("Missing --node-server-instance-id argument"); })() + || (() => { throw new Error("Missing --node-server-instance-id argument"); })(), + server.address().port ) ); @@ -30,10 +30,8 @@ app.post("/shutdown", (req, res) => { }, 200); }); -function streamOutput(server, instanceId) { - const port = server.address().port; +function streamOutput(instanceId, port) { debugLog(`Server running on port ${port} for instance ${instanceId}`); - fs.writeFile("server.port.tmp", String(port), err => { if (err) return console.log(err); fs.rename("server.port.tmp", `server-${instanceId}.port`, err => { From b48205f1c03515a973fa768212bc212f56bb012e Mon Sep 17 00:00:00 2001 From: Vincent Potucek Date: Sun, 30 Nov 2025 14:05:07 +0100 Subject: [PATCH 15/20] [rewrite] apply `ECMAScript6BestPractices` Signed-off-by: Vincent Potucek --- .../main/resources/com/diffplug/spotless/npm/common-serve.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/src/main/resources/com/diffplug/spotless/npm/common-serve.js b/lib/src/main/resources/com/diffplug/spotless/npm/common-serve.js index bd5bb651f6..f1defe2b90 100644 --- a/lib/src/main/resources/com/diffplug/spotless/npm/common-serve.js +++ b/lib/src/main/resources/com/diffplug/spotless/npm/common-serve.js @@ -32,7 +32,7 @@ app.post("/shutdown", (req, res) => { function streamOutput(instanceId, port) { debugLog(`Server running on port ${port} for instance ${instanceId}`); - fs.writeFile("server.port.tmp", String(port), err => { + fs.writeFile("server.port.tmp", port, err => { if (err) return console.log(err); fs.rename("server.port.tmp", `server-${instanceId}.port`, err => { if (err) console.log(err); From eb979964f0a44f3c970b1a90437ee06a87596234 Mon Sep 17 00:00:00 2001 From: Vincent Potucek Date: Sun, 30 Nov 2025 14:06:29 +0100 Subject: [PATCH 16/20] [rewrite] apply `ECMAScript6BestPractices` Signed-off-by: Vincent Potucek --- .../com/diffplug/spotless/npm/common-serve.js | 32 +++++++++---------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/lib/src/main/resources/com/diffplug/spotless/npm/common-serve.js b/lib/src/main/resources/com/diffplug/spotless/npm/common-serve.js index f1defe2b90..ca440d635d 100644 --- a/lib/src/main/resources/com/diffplug/spotless/npm/common-serve.js +++ b/lib/src/main/resources/com/diffplug/spotless/npm/common-serve.js @@ -4,12 +4,26 @@ const shutdownServer = require("http-graceful-shutdown"); // this file will be glued to the top of the specific xy-serve.js file +function streamServerOutput(instanceId, port) { + debugLog(`Server running on port ${port} for instance ${instanceId}`); + fs.writeFile("server.port.tmp", port, err => { + if (err) return console.log(err); + fs.rename("server.port.tmp", `server-${instanceId}.port`, err => { + if (err) console.log(err); + }); + }); +} + +function debugLog() { + if (false) console.log.apply(this, arguments); +} + const app = express(); app.use(express.json({ limit: "50mb" })); const server = app.listen(0,"127.0.0.1", () => - streamOutput( + streamServerOutput( process.argv.slice(2).find(arg => arg.startsWith("--node-server-instance-id="))?.split("=")[1] || (() => { throw new Error("Missing --node-server-instance-id argument"); })(), server.address().port @@ -17,7 +31,6 @@ const server = app.listen(0,"127.0.0.1", () => ); app.post("/shutdown", (req, res) => { - res.status(200).send("Graceful shutdown."); setTimeout(async () => { try { await shutdownServer(server, { @@ -28,18 +41,5 @@ app.post("/shutdown", (req, res) => { console.error("Error during shutdown:", err); } }, 200); + res.status(200).send("Graceful shutdown."); }); - -function streamOutput(instanceId, port) { - debugLog(`Server running on port ${port} for instance ${instanceId}`); - fs.writeFile("server.port.tmp", port, err => { - if (err) return console.log(err); - fs.rename("server.port.tmp", `server-${instanceId}.port`, err => { - if (err) console.log(err); - }); - }); -} - -function debugLog() { - if (false) console.log.apply(this, arguments); -} From 15fd4030f96217dd52e23ad49c692a0dc13f8e6f Mon Sep 17 00:00:00 2001 From: Vincent Potucek Date: Sun, 30 Nov 2025 14:07:17 +0100 Subject: [PATCH 17/20] [rewrite] apply `ECMAScript6BestPractices` Signed-off-by: Vincent Potucek --- .../main/resources/com/diffplug/spotless/npm/common-serve.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/src/main/resources/com/diffplug/spotless/npm/common-serve.js b/lib/src/main/resources/com/diffplug/spotless/npm/common-serve.js index ca440d635d..4cb4f97732 100644 --- a/lib/src/main/resources/com/diffplug/spotless/npm/common-serve.js +++ b/lib/src/main/resources/com/diffplug/spotless/npm/common-serve.js @@ -41,5 +41,5 @@ app.post("/shutdown", (req, res) => { console.error("Error during shutdown:", err); } }, 200); - res.status(200).send("Graceful shutdown."); + res.ok().send("Graceful shutdown."); }); From e2dfdc4807eac82d6f03a64dd4ad356399553f93 Mon Sep 17 00:00:00 2001 From: Vincent Potucek Date: Sun, 30 Nov 2025 14:37:27 +0100 Subject: [PATCH 18/20] [rewrite] apply `ECMAScript6BestPractices` Signed-off-by: Vincent Potucek --- .../com/diffplug/spotless/npm/common-serve.js | 42 +++++++++++-------- 1 file changed, 24 insertions(+), 18 deletions(-) diff --git a/lib/src/main/resources/com/diffplug/spotless/npm/common-serve.js b/lib/src/main/resources/com/diffplug/spotless/npm/common-serve.js index 4cb4f97732..1af902c2c5 100644 --- a/lib/src/main/resources/com/diffplug/spotless/npm/common-serve.js +++ b/lib/src/main/resources/com/diffplug/spotless/npm/common-serve.js @@ -4,42 +4,48 @@ const shutdownServer = require("http-graceful-shutdown"); // this file will be glued to the top of the specific xy-serve.js file -function streamServerOutput(instanceId, port) { - debugLog(`Server running on port ${port} for instance ${instanceId}`); - fs.writeFile("server.port.tmp", port, err => { - if (err) return console.log(err); - fs.rename("server.port.tmp", `server-${instanceId}.port`, err => { - if (err) console.log(err); - }); +function getInstanceId() { + return process.argv.slice(2).find(arg => arg.startsWith("--node-server-instance-id="))?.split("=")[1] + || (() => { throw new Error("Missing --node-server-instance-id argument"); })(); +} + +function streamOutput(port, instanceId) { + debugLog("Server running on port " + port + " for instance " + instanceId); + fs.writeFile("server.port.tmp", "" + port, function (err) { + if (err) { + return console.log(err); + } else { + fs.rename("server.port.tmp", `server-${instanceId}.port`, function (err) { + if (err) { + return console.log(err); + } + }); + } }); } function debugLog() { - if (false) console.log.apply(this, arguments); + if (false) { // set to true for debug log output in node process + console.log.apply(this, arguments); + } } const app = express(); app.use(express.json({ limit: "50mb" })); -const server = app.listen(0,"127.0.0.1", () => - streamServerOutput( - process.argv.slice(2).find(arg => arg.startsWith("--node-server-instance-id="))?.split("=")[1] - || (() => { throw new Error("Missing --node-server-instance-id argument"); })(), - server.address().port - ) -); +const server = app.listen(0, "127.0.0.1", () => streamOutput(server.address().port, getInstanceId())); app.post("/shutdown", (req, res) => { setTimeout(async () => { try { await shutdownServer(server, { - forceExit: false, - finally: () => debugLog("graceful shutdown finished.") + forceExit: false, // let the event loop clear + finally: () => debugLog("graceful shutdown finished."), })(); } catch (err) { console.error("Error during shutdown:", err); } }, 200); - res.ok().send("Graceful shutdown."); + res.ok(200).send("Graceful shutdown."); }); From e5d81a3eca1b8101c0ef62ed72be27f7b6aa1981 Mon Sep 17 00:00:00 2001 From: Vincent Potucek Date: Sun, 30 Nov 2025 14:53:22 +0100 Subject: [PATCH 19/20] [rewrite] apply `ECMAScript6BestPractices` Signed-off-by: Vincent Potucek --- gradle/error-prone.gradle | 1 - .../com/diffplug/spotless/npm/common-serve.js | 92 ++++++++----------- .../diffplug/spotless/npm/prettier-serve.js | 9 +- .../com/diffplug/spotless/npm/tsfmt-serve.js | 18 +--- ...namicallyInstalledNpmInstallationTest.java | 16 ++-- testlib/src/main/resources/clang/example.js | 6 +- 6 files changed, 53 insertions(+), 89 deletions(-) diff --git a/gradle/error-prone.gradle b/gradle/error-prone.gradle index b834bac630..377b91e3de 100644 --- a/gradle/error-prone.gradle +++ b/gradle/error-prone.gradle @@ -17,7 +17,6 @@ tasks.withType(JavaCompile).configureEach { 'ReturnValueIgnored', // We don`t want to use ErrorProne's annotations. ) error( - 'ReturnValueIgnored', 'SelfAssignment', 'StringJoin', 'UnnecessarilyFullyQualified', diff --git a/lib/src/main/resources/com/diffplug/spotless/npm/common-serve.js b/lib/src/main/resources/com/diffplug/spotless/npm/common-serve.js index edce61465a..1d1409697f 100644 --- a/lib/src/main/resources/com/diffplug/spotless/npm/common-serve.js +++ b/lib/src/main/resources/com/diffplug/spotless/npm/common-serve.js @@ -1,65 +1,51 @@ -// this file will be glued to the top of the specific xy-serve.js file -const debug_serve = false; // set to true for debug log output in node process -const shutdownServer = require("http-graceful-shutdown"); const express = require("express"); -const app = express(); - -app.use(express.json({limit: "50mb"})); - const fs = require("fs"); +const shutdownServer = require("http-graceful-shutdown"); -function debugLog() { - if (debug_serve) { - console.log.apply(this, arguments) - } -} +// this file will be glued to the top of the specific xy-serve.js file function getInstanceId() { - const args = process.argv.slice(2); - - // Look for the --node-server-instance-id option - let instanceId; + return process.argv.slice(2).find(arg => arg.startsWith("--node-server-instance-id="))?.split("=")[1] + || (() => { throw new Error("Missing --node-server-instance-id argument"); })(); +} - args.forEach(arg => { - if (arg.startsWith('--node-server-instance-id=')) { - instanceId = arg.split('=')[1]; - } - }); +function streamOutput(port, instanceId) { + debugLog("Server running on port " + port + " for instance " + instanceId); + fs.writeFile("server.port.tmp", "" + port, function (err) { + if (err) { + return console.log(err); + } else { + fs.rename("server.port.tmp", `server-${instanceId}.port`, function (err) { + if (err) { + return console.log(err); + } + }); + } + }); +} - // throw if instanceId is not set - if (!instanceId) { - throw new Error("Missing --node-server-instance-id argument"); - } - return instanceId; +function debugLog() { + if (false) { // set to true for debug log output in node process + console.log.apply(this, arguments); + } } -var listener = app.listen(0, "127.0.0.1", () => { - const instanceId = getInstanceId(); - debugLog("Server running on port " + listener.address().port + " for instance " + instanceId); - fs.writeFile("server.port.tmp", "" + listener.address().port, function (err) { - if (err) { - return console.log(err); - } else { - fs.rename("server.port.tmp", `server-${instanceId}.port`, function (err) { - if (err) { - return console.log(err); - } - }); // try to be as atomic as possible - } - }); -}); -const shutdown = shutdownServer(listener, { - forceExit: false, // let the event loop clear - finally: () => debugLog("graceful shutdown finished."), -}); +const app = express(); + +app.use(express.json({ limit: "50mb" })); + +const server = app.listen(0, "127.0.0.1", () => streamOutput(server.address().port, getInstanceId())); app.post("/shutdown", (req, res) => { - res.status(200).send("Shutting down"); - setTimeout(async () => { - try { - await shutdown(); - } catch (err) { - console.error("Error during shutdown:", err); - } - }, 200); + setTimeout(async () => { + try { + await shutdownServer(server, { + forceExit: false, // let the event loop clear + finally: () => debugLog("graceful shutdown finished."), + })(); + } catch (err) { + console.error("Error during shutdown:", err); + } + }, 200); + res.ok().send("Graceful shutdown."); }); diff --git a/lib/src/main/resources/com/diffplug/spotless/npm/prettier-serve.js b/lib/src/main/resources/com/diffplug/spotless/npm/prettier-serve.js index ac1f26790d..da3121d72f 100644 --- a/lib/src/main/resources/com/diffplug/spotless/npm/prettier-serve.js +++ b/lib/src/main/resources/com/diffplug/spotless/npm/prettier-serve.js @@ -22,16 +22,13 @@ app.post("/prettier/config-options", (req, res) => { app.post("/prettier/format", async (req, res) => { const format_data = req.body; - - let formatted_file_content = ""; try { - formatted_file_content = await prettierFormat(format_data.file_content, format_data.config_options); + res.set("Content-Type", "text/plain"); + res.send(await prettierFormat(format_data.file_content, format_data.config_options)); } catch(err) { res.status(500).send("Error while formatting: " + err); return; } - res.set("Content-Type", "text/plain"); - res.send(formatted_file_content); }); const prettierFormat = async function(file_content, config_options) { @@ -62,7 +59,7 @@ const mergeConfigOptions = function(resolved_config_options, config_options) { const extend = function() { // Variables const extended = {}; - let i = 0; + const i = 0; const length = arguments.length; // Merge the object into the extended object diff --git a/lib/src/main/resources/com/diffplug/spotless/npm/tsfmt-serve.js b/lib/src/main/resources/com/diffplug/spotless/npm/tsfmt-serve.js index ffbb36c8a4..9c3c4f29b0 100644 --- a/lib/src/main/resources/com/diffplug/spotless/npm/tsfmt-serve.js +++ b/lib/src/main/resources/com/diffplug/spotless/npm/tsfmt-serve.js @@ -1,23 +1,7 @@ const tsfmt = require("typescript-formatter"); app.post("/tsfmt/format", (req, res) => { - var format_data = req.body; - tsfmt.processString("spotless-format-string.ts", format_data.file_content, format_data.config_options).then(resultMap => { - /* - export interface ResultMap { - [fileName: string]: Result; - } - - export interface Result { - fileName: string; - settings: ts.FormatCodeSettings | null; - message: string; - error: boolean; - src: string; - dest: string; - } - */ - // result contains 'message' (String), 'error' (boolean), 'dest' (String) => formatted + tsfmt.processString("spotless-format-string.ts", req.body.file_content, req.body.config_options).then(resultMap => { if (resultMap.error !== undefined && resultMap.error) { res.status(400).send(resultMap.message); return; diff --git a/plugin-maven/src/test/java/com/diffplug/spotless/maven/npm/NpmTestsWithDynamicallyInstalledNpmInstallationTest.java b/plugin-maven/src/test/java/com/diffplug/spotless/maven/npm/NpmTestsWithDynamicallyInstalledNpmInstallationTest.java index 78830bf09d..eeb6929f3b 100644 --- a/plugin-maven/src/test/java/com/diffplug/spotless/maven/npm/NpmTestsWithDynamicallyInstalledNpmInstallationTest.java +++ b/plugin-maven/src/test/java/com/diffplug/spotless/maven/npm/NpmTestsWithDynamicallyInstalledNpmInstallationTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2023 DiffPlug + * Copyright 2023-2025 DiffPlug * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -25,6 +25,8 @@ public class NpmTestsWithDynamicallyInstalledNpmInstallationTest extends MavenIntegrationHarness { + public static final String TS = "typescript"; + @Test void useDownloadedNpmInstallation() throws Exception { writePomWithPrettierSteps( @@ -34,15 +36,11 @@ void useDownloadedNpmInstallation() throws Exception { " " + installedNpmPath() + "", ""); - String kind = "typescript"; - String suffix = "ts"; - String configPath = ".prettierrc.yml"; - setFile(configPath).toResource("npm/prettier/filetypes/" + kind + "/" + ".prettierrc.yml"); - String path = "src/main/" + kind + "/test." + suffix; - setFile(path).toResource("npm/prettier/filetypes/" + kind + "/" + kind + ".dirty"); - + String path = "src/main/" + TS + "/test.ts"; + setFile(path).toResource("npm/prettier/filetypes/" + TS + "/" + TS + ".dirty"); + setFile(".prettierrc.yml").toResource("npm/prettier/filetypes/" + TS + "/" + ".prettierrc.yml"); mavenRunner().withArguments(installNpmMavenGoal(), "spotless:apply").runNoError(); - assertFile(path).sameAsResource("npm/prettier/filetypes/" + kind + "/" + kind + ".clean"); + assertFile(path).sameAsResource("npm/prettier/filetypes/" + TS + "/" + TS + ".clean"); } } diff --git a/testlib/src/main/resources/clang/example.js b/testlib/src/main/resources/clang/example.js index 08ebafc1a2..99b023d78c 100644 --- a/testlib/src/main/resources/clang/example.js +++ b/testlib/src/main/resources/clang/example.js @@ -1,4 +1,4 @@ -var numbers=[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20, +const numbers=[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20, ]; const p = { @@ -10,9 +10,9 @@ const p = { const str = "Hello, world!" ; -var str2=str.charAt(3)+str[0]; +const str2=str.charAt(3)+str[0]; -var multilinestr = "Hello \ +const multilinestr = "Hello \ World" ; From b6439c16a59d9c5ba8e7d3a794c790acfaf29644 Mon Sep 17 00:00:00 2001 From: Vincent Potucek Date: Sun, 30 Nov 2025 14:56:42 +0100 Subject: [PATCH 20/20] [rewrite] apply `ECMAScript6BestPractices` Signed-off-by: Vincent Potucek --- .../resources/com/diffplug/spotless/npm/common-serve.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/src/main/resources/com/diffplug/spotless/npm/common-serve.js b/lib/src/main/resources/com/diffplug/spotless/npm/common-serve.js index 1d1409697f..bcc0638c8b 100644 --- a/lib/src/main/resources/com/diffplug/spotless/npm/common-serve.js +++ b/lib/src/main/resources/com/diffplug/spotless/npm/common-serve.js @@ -1,6 +1,6 @@ -const express = require("express"); -const fs = require("fs"); -const shutdownServer = require("http-graceful-shutdown"); +import express from 'express'; +import fs from 'fs'; +import shutdownServer from 'http-graceful-shutdown'; // this file will be glued to the top of the specific xy-serve.js file