rclnodejs 1.5.2 → 1.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (31) hide show
  1. package/index.js +20 -3
  2. package/lib/message_serialization.js +171 -0
  3. package/lib/node.js +15 -0
  4. package/lib/parameter.js +4 -10
  5. package/lib/subscription.js +16 -1
  6. package/lib/utils.js +287 -0
  7. package/package.json +2 -7
  8. package/prebuilds/linux-arm64/humble-jammy-arm64-rclnodejs.node +0 -0
  9. package/prebuilds/linux-arm64/jazzy-noble-arm64-rclnodejs.node +0 -0
  10. package/prebuilds/linux-arm64/kilted-noble-arm64-rclnodejs.node +0 -0
  11. package/prebuilds/linux-x64/humble-jammy-x64-rclnodejs.node +0 -0
  12. package/prebuilds/linux-x64/jazzy-noble-x64-rclnodejs.node +0 -0
  13. package/prebuilds/linux-x64/kilted-noble-x64-rclnodejs.node +0 -0
  14. package/rosidl_convertor/idl_convertor.js +3 -2
  15. package/rosidl_gen/generate_worker.js +1 -1
  16. package/rosidl_gen/idl_generator.js +11 -24
  17. package/rosidl_gen/index.js +1 -1
  18. package/rosidl_gen/templates/action-template.js +68 -0
  19. package/rosidl_gen/templates/message-template.js +1113 -0
  20. package/rosidl_gen/templates/service-event-template.js +31 -0
  21. package/rosidl_gen/templates/service-template.js +44 -0
  22. package/rosidl_parser/rosidl_parser.js +2 -2
  23. package/third_party/ref-napi/lib/ref.js +0 -45
  24. package/types/index.d.ts +17 -0
  25. package/types/node.d.ts +16 -1
  26. package/rosidl_gen/templates/CMakeLists.dot +0 -40
  27. package/rosidl_gen/templates/action.dot +0 -50
  28. package/rosidl_gen/templates/message.dot +0 -851
  29. package/rosidl_gen/templates/package.dot +0 -16
  30. package/rosidl_gen/templates/service.dot +0 -26
  31. package/rosidl_gen/templates/service_event.dot +0 -10
@@ -14,15 +14,16 @@
14
14
 
15
15
  'use strict';
16
16
 
17
+ const fs = require('fs');
17
18
  const path = require('path');
18
- const fse = require('fs-extra');
19
+ const fse = require('../lib/utils.js');
19
20
  const execFile = require('child_process').execFile;
20
21
  const pythonExecutable =
21
22
  require('../rosidl_parser/py_utils').getPythonExecutable('python3');
22
23
 
23
24
  async function convertIDLToROS2IDL(pkgName, idlFilePath, outputDir) {
24
25
  const packagePath = path.join(outputDir, pkgName);
25
- if (!fse.existsSync(packagePath)) {
26
+ if (!fs.existsSync(packagePath)) {
26
27
  fse.mkdirSync(packagePath);
27
28
  }
28
29
  return new Promise((resolve, reject) => {
@@ -12,7 +12,7 @@
12
12
  // See the License for the specific language governing permissions and
13
13
  // limitations under the License.
14
14
 
15
- const fse = require('fs-extra');
15
+ const fse = require('../lib/utils.js');
16
16
  const generateJSStructFromIDL = require('./idl_generator.js');
17
17
  const packages = require('./packages.js');
18
18
  const path = require('path');
@@ -14,20 +14,17 @@
14
14
 
15
15
  'use strict';
16
16
 
17
- const dot = require('dot');
18
- const { minify } = require('terser');
19
- const fse = require('fs-extra');
17
+ const fse = require('../lib/utils.js');
20
18
  const path = require('path');
21
19
  const parser = require('../rosidl_parser/rosidl_parser.js');
22
20
  const actionMsgs = require('./action_msgs.js');
23
21
  const DistroUtils = require('../lib/distro.js');
22
+ const generateMessage = require('./templates/message-template.js');
23
+ const generateService = require('./templates/service-template.js');
24
+ const generateAction = require('./templates/action-template.js');
25
+ const generateServiceEvent = require('./templates/service-event-template.js');
24
26
 
25
- dot.templateSettings.strip = false;
26
- dot.log = process.env.RCLNODEJS_LOG_VERBOSE || false;
27
27
  const isDebug = !!process.argv.find((arg) => arg === '--debug');
28
- const dots = dot.process({
29
- path: path.join(__dirname, '../rosidl_gen/templates'),
30
- });
31
28
 
32
29
  /**
33
30
  * Output generated code to disk. Do not overwrite
@@ -37,18 +34,8 @@ const dots = dot.process({
37
34
  * @param {string} code
38
35
  */
39
36
  async function writeGeneratedCode(dir, fileName, code) {
40
- let result = null;
41
- if (!isDebug && fileName.endsWith('.js')) {
42
- try {
43
- result = await minify(code);
44
- } catch (error) {
45
- console.error(`Error minifying ${fileName}:`, error);
46
- result = null;
47
- }
48
- }
49
-
50
37
  await fse.mkdirs(dir);
51
- await fse.writeFile(path.join(dir, fileName), result ? result.code : code);
38
+ await fse.writeFile(path.join(dir, fileName), code.replace(/^\s*\n/gm, ''));
52
39
  }
53
40
 
54
41
  async function generateServiceJSStruct(
@@ -64,7 +51,7 @@ async function generateServiceJSStruct(
64
51
  '__' +
65
52
  serviceInfo.interfaceName +
66
53
  '.js';
67
- const generatedSrvCode = dots.service({ serviceInfo: serviceInfo });
54
+ const generatedSrvCode = generateService({ serviceInfo: serviceInfo });
68
55
 
69
56
  // We are going to only generate the service JavaScript file if it meets one
70
57
  // of the followings:
@@ -85,7 +72,7 @@ async function generateServiceJSStruct(
85
72
 
86
73
  async function generateServiceEventMsg(serviceInfo, dir) {
87
74
  const fileName = serviceInfo.interfaceName + '.msg';
88
- const generatedEvent = dots.service_event({ serviceInfo: serviceInfo });
75
+ const generatedEvent = generateServiceEvent({ serviceInfo: serviceInfo });
89
76
 
90
77
  return writeGeneratedCode(dir, fileName, generatedEvent).then(() => {
91
78
  serviceInfo.interfaceName += '_Event';
@@ -118,7 +105,7 @@ async function generateServiceEventJSStruct(msgInfo, dir) {
118
105
  // const AddTwoInts_RequestWrapper = require('../../generated/example_interfaces/example_interfaces__srv__AddTwoInts_Request.js');
119
106
  // const AddTwoInts_ResponseWrapper = require('../../generated/example_interfaces/example_interfaces__srv__AddTwoInts_Response.js');
120
107
  msgInfo.isServiceEvent = true;
121
- const generatedCode = dots.message({
108
+ const generatedCode = generateMessage({
122
109
  messageInfo: msgInfo,
123
110
  spec: spec,
124
111
  json: JSON.stringify(spec, null, ' '),
@@ -146,7 +133,7 @@ function generateMessageJSStructFromSpec(messageInfo, dir, spec) {
146
133
  spec.msgName +
147
134
  '.js';
148
135
 
149
- const generatedCode = dots.message({
136
+ const generatedCode = generateMessage({
150
137
  messageInfo: messageInfo,
151
138
  spec: spec,
152
139
  json: JSON.stringify(spec, null, ' '),
@@ -286,7 +273,7 @@ async function generateActionJSStruct(actionInfo, dir) {
286
273
  '__' +
287
274
  actionInfo.interfaceName +
288
275
  '.js';
289
- const generatedCode = dots.action({ actionInfo: actionInfo });
276
+ const generatedCode = generateAction({ actionInfo: actionInfo });
290
277
  dir = path.join(dir, actionInfo.pkgName);
291
278
  const action = writeGeneratedCode(dir, fileName, generatedCode);
292
279
 
@@ -14,7 +14,7 @@
14
14
 
15
15
  'use strict';
16
16
 
17
- const fse = require('fs-extra');
17
+ const fse = require('../lib/utils.js');
18
18
  const generateJSStructFromIDL = require('./idl_generator.js');
19
19
  const packages = require('./packages.js');
20
20
  const path = require('path');
@@ -0,0 +1,68 @@
1
+ // Copyright (c) 2025, The Robot Web Tools Contributors
2
+ //
3
+ // Licensed under the Apache License, Version 2.0 (the "License");
4
+ // you may not use this file except in compliance with the License.
5
+ // You may obtain a copy of the License at
6
+ //
7
+ // http://www.apache.org/licenses/LICENSE-2.0
8
+ //
9
+ // Unless required by applicable law or agreed to in writing, software
10
+ // distributed under the License is distributed on an "AS IS" BASIS,
11
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ // See the License for the specific language governing permissions and
13
+ // limitations under the License.
14
+
15
+ function generateAction(data) {
16
+ const actionInfo = data.actionInfo;
17
+ const className = `${actionInfo.pkgName}__${actionInfo.subFolder}__${actionInfo.interfaceName}`;
18
+
19
+ return `// This file is automatically generated by rclnodejs
20
+ //
21
+ // *** DO NOT EDIT directly
22
+ //
23
+
24
+ 'use strict';
25
+
26
+ class ${className} {
27
+ static get Goal() {
28
+ return require('./${className}_Goal.js');
29
+ }
30
+
31
+ static get Result() {
32
+ return require('./${className}_Result.js');
33
+ }
34
+
35
+ static get Feedback() {
36
+ return require('./${className}_Feedback.js');
37
+ }
38
+
39
+ static get impl() {
40
+ return {
41
+ get SendGoalService() {
42
+ return require('./${className}_SendGoal.js');
43
+ },
44
+ get GetResultService() {
45
+ return require('./${className}_GetResult.js');
46
+ },
47
+ get FeedbackMessage() {
48
+ return require('./${className}_FeedbackMessage.js');
49
+ },
50
+ get CancelGoal() {
51
+ return require('../action_msgs/action_msgs__srv__CancelGoal.js');
52
+ },
53
+ get GoalStatusArray() {
54
+ return require('../action_msgs/action_msgs__msg__GoalStatusArray.js');
55
+ }
56
+ };
57
+ }
58
+
59
+ static type() {
60
+ return {pkgName: '${actionInfo.pkgName}', subFolder: '${actionInfo.subFolder}', interfaceName: '${actionInfo.interfaceName}'};
61
+ }
62
+ }
63
+
64
+ module.exports = ${className};
65
+ `;
66
+ }
67
+
68
+ module.exports = generateAction;