diff --git a/package.json b/package.json index b46af4a3..a0a3fab5 100644 --- a/package.json +++ b/package.json @@ -18,15 +18,15 @@ "rebuild": "npm run clean && node-gyp -j 16 rebuild", "rebuild:dev": "npm run clean && node-gyp -j 16 rebuild --debug", "generate-messages": "node scripts/generate_messages.js", - "generate-messages:dev": "node scripts/generate_messages.js --debug", + "generate-messages:dev": "node scripts/generate_messages.js --debug && npx --yes prettier --ignore-path --write generated/**/*.js", "generate-tsd-messages": "node scripts/generate_tsd.js", - "clean": "node-gyp clean && npx rimraf@6.0.1 ./generated", + "clean": "node-gyp clean && npx rimraf ./generated", "install": "npm run rebuild", "postinstall": "npm run generate-messages", "docs": "cd docs && make", - "test": "nyc node --expose-gc ./scripts/run_test.js && npx tsd", + "test": "nyc node --expose-gc ./scripts/run_test.js && tsd", "lint": "eslint && node ./scripts/cpplint.js", - "format": "clang-format -i -style=file ./src/*.cpp ./src/*.hpp && prettier --write \"{lib,rosidl_gen,rostsd_gen,rosidl_parser,types,example,test,scripts,benchmark,rostsd_gen}/**/*.{js,md,ts}\" ./*.{js,md,ts}", + "format": "clang-format -i -style=file ./src/*.cpp ./src/*.hpp && npx --yes prettier --write \"{lib,rosidl_gen,rostsd_gen,rosidl_parser,types,example,test,scripts,benchmark,rostsd_gen}/**/*.{js,md,ts}\" ./*.{js,md,ts}", "prepare": "husky", "coverage": "cat ./coverage/lcov.info | ./node_modules/coveralls/bin/coveralls.js" }, @@ -62,6 +62,7 @@ "lint-staged": "^15.2.10", "mocha": "^11.0.2", "nyc": "^17.1.0", + "rimraf": "^6.0.1", "sinon": "^19.0.2", "tree-kill": "^1.2.2", "tsd": "^0.31.2", @@ -79,7 +80,7 @@ "is-close": "^1.3.3", "json-bigint": "^1.0.0", "nan": "^2.22.0", - "prettier": "^3.4.2", + "terser": "^5.39.0", "walk": "^2.3.15" }, "husky": { diff --git a/rosidl_gen/idl_generator.js b/rosidl_gen/idl_generator.js index 8803441b..92bf1755 100644 --- a/rosidl_gen/idl_generator.js +++ b/rosidl_gen/idl_generator.js @@ -15,7 +15,7 @@ 'use strict'; const dot = require('dot'); -const prettier = require('prettier'); +const { minify } = require('terser'); const fse = require('fs-extra'); const path = require('path'); const parser = require('../rosidl_parser/rosidl_parser.js'); @@ -29,10 +29,6 @@ const dots = dot.process({ path: path.join(__dirname, '../rosidl_gen/templates'), }); -function removeEmptyLines(str) { - return str.replace(/^\s*\n/gm, ''); -} - /** * Output generated code to disk. Do not overwrite * an existing file. If file already exists do nothing. @@ -41,11 +37,18 @@ function removeEmptyLines(str) { * @param {string} code */ async function writeGeneratedCode(dir, fileName, code) { - if (fileName.endsWith('.js')) { - code = await prettier.format(code, { parser: 'babel' }); + let result = null; + if (!isDebug && fileName.endsWith('.js')) { + try { + result = await minify(code); + } catch (error) { + console.error(`Error minifying ${fileName}:`, error); + result = null; + } } + await fse.mkdirs(dir); - await fse.writeFile(path.join(dir, fileName), code); + await fse.writeFile(path.join(dir, fileName), result ? result.code : code); } async function generateServiceJSStruct( @@ -61,9 +64,7 @@ async function generateServiceJSStruct( '__' + serviceInfo.interfaceName + '.js'; - const generatedSrvCode = removeEmptyLines( - dots.service({ serviceInfo: serviceInfo }) - ); + const generatedSrvCode = dots.service({ serviceInfo: serviceInfo }); // We are going to only generate the service JavaScript file if it meets one // of the followings: @@ -84,9 +85,7 @@ async function generateServiceJSStruct( async function generateServiceEventMsg(serviceInfo, dir) { const fileName = serviceInfo.interfaceName + '.msg'; - const generatedEvent = removeEmptyLines( - dots.service_event({ serviceInfo: serviceInfo }) - ); + const generatedEvent = dots.service_event({ serviceInfo: serviceInfo }); return writeGeneratedCode(dir, fileName, generatedEvent).then(() => { serviceInfo.interfaceName += '_Event'; @@ -119,14 +118,12 @@ async function generateServiceEventJSStruct(msgInfo, dir) { // const AddTwoInts_RequestWrapper = require('../../generated/example_interfaces/example_interfaces__srv__AddTwoInts_Request.js'); // const AddTwoInts_ResponseWrapper = require('../../generated/example_interfaces/example_interfaces__srv__AddTwoInts_Response.js'); msgInfo.isServiceEvent = true; - const generatedCode = removeEmptyLines( - dots.message({ - messageInfo: msgInfo, - spec: spec, - json: JSON.stringify(spec, null, ' '), - isDebug: isDebug, - }) - ); + const generatedCode = dots.message({ + messageInfo: msgInfo, + spec: spec, + json: JSON.stringify(spec, null, ' '), + isDebug: isDebug, + }); return writeGeneratedCode(dir, eventFileName, generatedCode); } @@ -149,14 +146,12 @@ function generateMessageJSStructFromSpec(messageInfo, dir, spec) { spec.msgName + '.js'; - const generatedCode = removeEmptyLines( - dots.message({ - messageInfo: messageInfo, - spec: spec, - json: JSON.stringify(spec, null, ' '), - isDebug: isDebug, - }) - ); + const generatedCode = dots.message({ + messageInfo: messageInfo, + spec: spec, + json: JSON.stringify(spec, null, ' '), + isDebug: isDebug, + }); return writeGeneratedCode(dir, fileName, generatedCode); } @@ -291,9 +286,7 @@ async function generateActionJSStruct(actionInfo, dir) { '__' + actionInfo.interfaceName + '.js'; - const generatedCode = removeEmptyLines( - dots.action({ actionInfo: actionInfo }) - ); + const generatedCode = dots.action({ actionInfo: actionInfo }); dir = path.join(dir, actionInfo.pkgName); const action = writeGeneratedCode(dir, fileName, generatedCode);