@foxglove/schemas 0.1.2

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 (506) hide show
  1. package/.eslintrc.js +19 -0
  2. package/.gitattributes +1 -0
  3. package/.github/workflows/ci.yml +89 -0
  4. package/.prettierignore +1 -0
  5. package/.prettierrc.yml +2 -0
  6. package/.vscode/launch.json +23 -0
  7. package/.vscode/settings.json +20 -0
  8. package/LICENSE.md +21 -0
  9. package/README.md +31 -0
  10. package/dist/cjs/schemas/typescript/CameraCalibration.d.ts +63 -0
  11. package/dist/cjs/schemas/typescript/CameraCalibration.d.ts.map +1 -0
  12. package/dist/cjs/schemas/typescript/CameraCalibration.js +4 -0
  13. package/dist/cjs/schemas/typescript/CameraCalibration.js.map +1 -0
  14. package/dist/cjs/schemas/typescript/CircleAnnotation.d.ts +19 -0
  15. package/dist/cjs/schemas/typescript/CircleAnnotation.d.ts.map +1 -0
  16. package/dist/cjs/schemas/typescript/CircleAnnotation.js +4 -0
  17. package/dist/cjs/schemas/typescript/CircleAnnotation.js.map +1 -0
  18. package/dist/cjs/schemas/typescript/Color.d.ts +12 -0
  19. package/dist/cjs/schemas/typescript/Color.d.ts.map +1 -0
  20. package/dist/cjs/schemas/typescript/Color.js +4 -0
  21. package/dist/cjs/schemas/typescript/Color.js.map +1 -0
  22. package/dist/cjs/schemas/typescript/CompressedImage.d.ts +11 -0
  23. package/dist/cjs/schemas/typescript/CompressedImage.d.ts.map +1 -0
  24. package/dist/cjs/schemas/typescript/CompressedImage.js +4 -0
  25. package/dist/cjs/schemas/typescript/CompressedImage.js.map +1 -0
  26. package/dist/cjs/schemas/typescript/Duration.d.ts +5 -0
  27. package/dist/cjs/schemas/typescript/Duration.d.ts.map +1 -0
  28. package/dist/cjs/schemas/typescript/Duration.js +3 -0
  29. package/dist/cjs/schemas/typescript/Duration.js.map +1 -0
  30. package/dist/cjs/schemas/typescript/FrameTransform.d.ts +14 -0
  31. package/dist/cjs/schemas/typescript/FrameTransform.d.ts.map +1 -0
  32. package/dist/cjs/schemas/typescript/FrameTransform.js +4 -0
  33. package/dist/cjs/schemas/typescript/FrameTransform.js.map +1 -0
  34. package/dist/cjs/schemas/typescript/GeoJSON.d.ts +6 -0
  35. package/dist/cjs/schemas/typescript/GeoJSON.d.ts.map +1 -0
  36. package/dist/cjs/schemas/typescript/GeoJSON.js +4 -0
  37. package/dist/cjs/schemas/typescript/GeoJSON.js.map +1 -0
  38. package/dist/cjs/schemas/typescript/Grid.d.ts +26 -0
  39. package/dist/cjs/schemas/typescript/Grid.d.ts.map +1 -0
  40. package/dist/cjs/schemas/typescript/Grid.js +4 -0
  41. package/dist/cjs/schemas/typescript/Grid.js.map +1 -0
  42. package/dist/cjs/schemas/typescript/ImageAnnotations.d.ts +10 -0
  43. package/dist/cjs/schemas/typescript/ImageAnnotations.d.ts.map +1 -0
  44. package/dist/cjs/schemas/typescript/ImageAnnotations.js +4 -0
  45. package/dist/cjs/schemas/typescript/ImageAnnotations.js.map +1 -0
  46. package/dist/cjs/schemas/typescript/LaserScan.d.ts +20 -0
  47. package/dist/cjs/schemas/typescript/LaserScan.d.ts.map +1 -0
  48. package/dist/cjs/schemas/typescript/LaserScan.js +4 -0
  49. package/dist/cjs/schemas/typescript/LaserScan.js.map +1 -0
  50. package/dist/cjs/schemas/typescript/LocationFix.d.ts +15 -0
  51. package/dist/cjs/schemas/typescript/LocationFix.d.ts.map +1 -0
  52. package/dist/cjs/schemas/typescript/LocationFix.js +4 -0
  53. package/dist/cjs/schemas/typescript/LocationFix.js.map +1 -0
  54. package/dist/cjs/schemas/typescript/Log.d.ts +18 -0
  55. package/dist/cjs/schemas/typescript/Log.d.ts.map +1 -0
  56. package/dist/cjs/schemas/typescript/Log.js +4 -0
  57. package/dist/cjs/schemas/typescript/Log.js.map +1 -0
  58. package/dist/cjs/schemas/typescript/LogLevel.d.ts +10 -0
  59. package/dist/cjs/schemas/typescript/LogLevel.d.ts.map +1 -0
  60. package/dist/cjs/schemas/typescript/LogLevel.js +15 -0
  61. package/dist/cjs/schemas/typescript/LogLevel.js.map +1 -0
  62. package/dist/cjs/schemas/typescript/NumericType.d.ts +13 -0
  63. package/dist/cjs/schemas/typescript/NumericType.d.ts.map +1 -0
  64. package/dist/cjs/schemas/typescript/NumericType.js +18 -0
  65. package/dist/cjs/schemas/typescript/NumericType.js.map +1 -0
  66. package/dist/cjs/schemas/typescript/PackedElementField.d.ts +11 -0
  67. package/dist/cjs/schemas/typescript/PackedElementField.d.ts.map +1 -0
  68. package/dist/cjs/schemas/typescript/PackedElementField.js +4 -0
  69. package/dist/cjs/schemas/typescript/PackedElementField.js.map +1 -0
  70. package/dist/cjs/schemas/typescript/Point2.d.ts +8 -0
  71. package/dist/cjs/schemas/typescript/Point2.d.ts.map +1 -0
  72. package/dist/cjs/schemas/typescript/Point2.js +4 -0
  73. package/dist/cjs/schemas/typescript/Point2.js.map +1 -0
  74. package/dist/cjs/schemas/typescript/Point3.d.ts +10 -0
  75. package/dist/cjs/schemas/typescript/Point3.d.ts.map +1 -0
  76. package/dist/cjs/schemas/typescript/Point3.js +4 -0
  77. package/dist/cjs/schemas/typescript/Point3.js.map +1 -0
  78. package/dist/cjs/schemas/typescript/PointCloud.d.ts +19 -0
  79. package/dist/cjs/schemas/typescript/PointCloud.d.ts.map +1 -0
  80. package/dist/cjs/schemas/typescript/PointCloud.js +4 -0
  81. package/dist/cjs/schemas/typescript/PointCloud.js.map +1 -0
  82. package/dist/cjs/schemas/typescript/PointsAnnotation.d.ts +18 -0
  83. package/dist/cjs/schemas/typescript/PointsAnnotation.d.ts.map +1 -0
  84. package/dist/cjs/schemas/typescript/PointsAnnotation.js +4 -0
  85. package/dist/cjs/schemas/typescript/PointsAnnotation.js.map +1 -0
  86. package/dist/cjs/schemas/typescript/PointsAnnotationType.d.ts +9 -0
  87. package/dist/cjs/schemas/typescript/PointsAnnotationType.d.ts.map +1 -0
  88. package/dist/cjs/schemas/typescript/PointsAnnotationType.js +14 -0
  89. package/dist/cjs/schemas/typescript/PointsAnnotationType.js.map +1 -0
  90. package/dist/cjs/schemas/typescript/Pose.d.ts +10 -0
  91. package/dist/cjs/schemas/typescript/Pose.d.ts.map +1 -0
  92. package/dist/cjs/schemas/typescript/Pose.js +4 -0
  93. package/dist/cjs/schemas/typescript/Pose.js.map +1 -0
  94. package/dist/cjs/schemas/typescript/PoseInFrame.d.ts +12 -0
  95. package/dist/cjs/schemas/typescript/PoseInFrame.d.ts.map +1 -0
  96. package/dist/cjs/schemas/typescript/PoseInFrame.js +4 -0
  97. package/dist/cjs/schemas/typescript/PoseInFrame.js.map +1 -0
  98. package/dist/cjs/schemas/typescript/PosesInFrame.d.ts +12 -0
  99. package/dist/cjs/schemas/typescript/PosesInFrame.d.ts.map +1 -0
  100. package/dist/cjs/schemas/typescript/PosesInFrame.js +4 -0
  101. package/dist/cjs/schemas/typescript/PosesInFrame.js.map +1 -0
  102. package/dist/cjs/schemas/typescript/PositionCovarianceType.d.ts +8 -0
  103. package/dist/cjs/schemas/typescript/PositionCovarianceType.d.ts.map +1 -0
  104. package/dist/cjs/schemas/typescript/PositionCovarianceType.js +13 -0
  105. package/dist/cjs/schemas/typescript/PositionCovarianceType.js.map +1 -0
  106. package/dist/cjs/schemas/typescript/Quaternion.d.ts +12 -0
  107. package/dist/cjs/schemas/typescript/Quaternion.d.ts.map +1 -0
  108. package/dist/cjs/schemas/typescript/Quaternion.js +4 -0
  109. package/dist/cjs/schemas/typescript/Quaternion.js.map +1 -0
  110. package/dist/cjs/schemas/typescript/RawImage.d.ts +17 -0
  111. package/dist/cjs/schemas/typescript/RawImage.d.ts.map +1 -0
  112. package/dist/cjs/schemas/typescript/RawImage.js +4 -0
  113. package/dist/cjs/schemas/typescript/RawImage.js.map +1 -0
  114. package/dist/cjs/schemas/typescript/Time.d.ts +5 -0
  115. package/dist/cjs/schemas/typescript/Time.d.ts.map +1 -0
  116. package/dist/cjs/schemas/typescript/Time.js +3 -0
  117. package/dist/cjs/schemas/typescript/Time.js.map +1 -0
  118. package/dist/cjs/schemas/typescript/Transform.d.ts +13 -0
  119. package/dist/cjs/schemas/typescript/Transform.d.ts.map +1 -0
  120. package/dist/cjs/schemas/typescript/Transform.js +4 -0
  121. package/dist/cjs/schemas/typescript/Transform.js.map +1 -0
  122. package/dist/cjs/schemas/typescript/Vector2.d.ts +8 -0
  123. package/dist/cjs/schemas/typescript/Vector2.d.ts.map +1 -0
  124. package/dist/cjs/schemas/typescript/Vector2.js +4 -0
  125. package/dist/cjs/schemas/typescript/Vector2.js.map +1 -0
  126. package/dist/cjs/schemas/typescript/Vector3.d.ts +10 -0
  127. package/dist/cjs/schemas/typescript/Vector3.d.ts.map +1 -0
  128. package/dist/cjs/schemas/typescript/Vector3.js +4 -0
  129. package/dist/cjs/schemas/typescript/Vector3.js.map +1 -0
  130. package/dist/cjs/schemas/typescript/index.d.ts +29 -0
  131. package/dist/cjs/schemas/typescript/index.d.ts.map +1 -0
  132. package/dist/cjs/schemas/typescript/index.js +32 -0
  133. package/dist/cjs/schemas/typescript/index.js.map +1 -0
  134. package/dist/cjs/scripts/updateGeneratedFiles.d.ts +2 -0
  135. package/dist/cjs/scripts/updateGeneratedFiles.d.ts.map +1 -0
  136. package/dist/cjs/scripts/updateGeneratedFiles.js +77 -0
  137. package/dist/cjs/scripts/updateGeneratedFiles.js.map +1 -0
  138. package/dist/cjs/src/generateJsonSchema.d.ts +3 -0
  139. package/dist/cjs/src/generateJsonSchema.d.ts.map +1 -0
  140. package/dist/cjs/src/generateJsonSchema.js +85 -0
  141. package/dist/cjs/src/generateJsonSchema.js.map +1 -0
  142. package/dist/cjs/src/generateJsonSchema.test.d.ts +2 -0
  143. package/dist/cjs/src/generateJsonSchema.test.d.ts.map +1 -0
  144. package/dist/cjs/src/generateJsonSchema.test.js +312 -0
  145. package/dist/cjs/src/generateJsonSchema.test.js.map +1 -0
  146. package/dist/cjs/src/generateProto.d.ts +3 -0
  147. package/dist/cjs/src/generateProto.d.ts.map +1 -0
  148. package/dist/cjs/src/generateProto.js +84 -0
  149. package/dist/cjs/src/generateProto.js.map +1 -0
  150. package/dist/cjs/src/generateProto.test.d.ts +2 -0
  151. package/dist/cjs/src/generateProto.test.d.ts.map +1 -0
  152. package/dist/cjs/src/generateProto.test.js +125 -0
  153. package/dist/cjs/src/generateProto.test.js.map +1 -0
  154. package/dist/cjs/src/generateRos.d.ts +20 -0
  155. package/dist/cjs/src/generateRos.d.ts.map +1 -0
  156. package/dist/cjs/src/generateRos.js +186 -0
  157. package/dist/cjs/src/generateRos.js.map +1 -0
  158. package/dist/cjs/src/generateRos.test.d.ts +2 -0
  159. package/dist/cjs/src/generateRos.test.d.ts.map +1 -0
  160. package/dist/cjs/src/generateRos.test.js +911 -0
  161. package/dist/cjs/src/generateRos.test.js.map +1 -0
  162. package/dist/cjs/src/generateTypeScript.d.ts +5 -0
  163. package/dist/cjs/src/generateTypeScript.d.ts.map +1 -0
  164. package/dist/cjs/src/generateTypeScript.js +100 -0
  165. package/dist/cjs/src/generateTypeScript.js.map +1 -0
  166. package/dist/cjs/src/generateTypeScript.test.d.ts +2 -0
  167. package/dist/cjs/src/generateTypeScript.test.d.ts.map +1 -0
  168. package/dist/cjs/src/generateTypeScript.test.js +142 -0
  169. package/dist/cjs/src/generateTypeScript.test.js.map +1 -0
  170. package/dist/cjs/src/index.d.ts +6 -0
  171. package/dist/cjs/src/index.d.ts.map +1 -0
  172. package/dist/cjs/src/index.js +9 -0
  173. package/dist/cjs/src/index.js.map +1 -0
  174. package/dist/cjs/src/schemas.d.ts +35 -0
  175. package/dist/cjs/src/schemas.d.ts.map +1 -0
  176. package/dist/cjs/src/schemas.js +820 -0
  177. package/dist/cjs/src/schemas.js.map +1 -0
  178. package/dist/cjs/src/schemas.test.d.ts +2 -0
  179. package/dist/cjs/src/schemas.test.d.ts.map +1 -0
  180. package/dist/cjs/src/schemas.test.js +24 -0
  181. package/dist/cjs/src/schemas.test.js.map +1 -0
  182. package/dist/cjs/src/testFixtures.d.ts +5 -0
  183. package/dist/cjs/src/testFixtures.d.ts.map +1 -0
  184. package/dist/cjs/src/testFixtures.js +86 -0
  185. package/dist/cjs/src/testFixtures.js.map +1 -0
  186. package/dist/cjs/src/types.d.ts +37 -0
  187. package/dist/cjs/src/types.d.ts.map +1 -0
  188. package/dist/cjs/src/types.js +3 -0
  189. package/dist/cjs/src/types.js.map +1 -0
  190. package/dist/esm/schemas/typescript/CameraCalibration.d.ts +63 -0
  191. package/dist/esm/schemas/typescript/CameraCalibration.d.ts.map +1 -0
  192. package/dist/esm/schemas/typescript/CameraCalibration.js +3 -0
  193. package/dist/esm/schemas/typescript/CameraCalibration.js.map +1 -0
  194. package/dist/esm/schemas/typescript/CircleAnnotation.d.ts +19 -0
  195. package/dist/esm/schemas/typescript/CircleAnnotation.d.ts.map +1 -0
  196. package/dist/esm/schemas/typescript/CircleAnnotation.js +3 -0
  197. package/dist/esm/schemas/typescript/CircleAnnotation.js.map +1 -0
  198. package/dist/esm/schemas/typescript/Color.d.ts +12 -0
  199. package/dist/esm/schemas/typescript/Color.d.ts.map +1 -0
  200. package/dist/esm/schemas/typescript/Color.js +3 -0
  201. package/dist/esm/schemas/typescript/Color.js.map +1 -0
  202. package/dist/esm/schemas/typescript/CompressedImage.d.ts +11 -0
  203. package/dist/esm/schemas/typescript/CompressedImage.d.ts.map +1 -0
  204. package/dist/esm/schemas/typescript/CompressedImage.js +3 -0
  205. package/dist/esm/schemas/typescript/CompressedImage.js.map +1 -0
  206. package/dist/esm/schemas/typescript/Duration.d.ts +5 -0
  207. package/dist/esm/schemas/typescript/Duration.d.ts.map +1 -0
  208. package/dist/esm/schemas/typescript/Duration.js +2 -0
  209. package/dist/esm/schemas/typescript/Duration.js.map +1 -0
  210. package/dist/esm/schemas/typescript/FrameTransform.d.ts +14 -0
  211. package/dist/esm/schemas/typescript/FrameTransform.d.ts.map +1 -0
  212. package/dist/esm/schemas/typescript/FrameTransform.js +3 -0
  213. package/dist/esm/schemas/typescript/FrameTransform.js.map +1 -0
  214. package/dist/esm/schemas/typescript/GeoJSON.d.ts +6 -0
  215. package/dist/esm/schemas/typescript/GeoJSON.d.ts.map +1 -0
  216. package/dist/esm/schemas/typescript/GeoJSON.js +3 -0
  217. package/dist/esm/schemas/typescript/GeoJSON.js.map +1 -0
  218. package/dist/esm/schemas/typescript/Grid.d.ts +26 -0
  219. package/dist/esm/schemas/typescript/Grid.d.ts.map +1 -0
  220. package/dist/esm/schemas/typescript/Grid.js +3 -0
  221. package/dist/esm/schemas/typescript/Grid.js.map +1 -0
  222. package/dist/esm/schemas/typescript/ImageAnnotations.d.ts +10 -0
  223. package/dist/esm/schemas/typescript/ImageAnnotations.d.ts.map +1 -0
  224. package/dist/esm/schemas/typescript/ImageAnnotations.js +3 -0
  225. package/dist/esm/schemas/typescript/ImageAnnotations.js.map +1 -0
  226. package/dist/esm/schemas/typescript/LaserScan.d.ts +20 -0
  227. package/dist/esm/schemas/typescript/LaserScan.d.ts.map +1 -0
  228. package/dist/esm/schemas/typescript/LaserScan.js +3 -0
  229. package/dist/esm/schemas/typescript/LaserScan.js.map +1 -0
  230. package/dist/esm/schemas/typescript/LocationFix.d.ts +15 -0
  231. package/dist/esm/schemas/typescript/LocationFix.d.ts.map +1 -0
  232. package/dist/esm/schemas/typescript/LocationFix.js +3 -0
  233. package/dist/esm/schemas/typescript/LocationFix.js.map +1 -0
  234. package/dist/esm/schemas/typescript/Log.d.ts +18 -0
  235. package/dist/esm/schemas/typescript/Log.d.ts.map +1 -0
  236. package/dist/esm/schemas/typescript/Log.js +3 -0
  237. package/dist/esm/schemas/typescript/Log.js.map +1 -0
  238. package/dist/esm/schemas/typescript/LogLevel.d.ts +10 -0
  239. package/dist/esm/schemas/typescript/LogLevel.d.ts.map +1 -0
  240. package/dist/esm/schemas/typescript/LogLevel.js +12 -0
  241. package/dist/esm/schemas/typescript/LogLevel.js.map +1 -0
  242. package/dist/esm/schemas/typescript/NumericType.d.ts +13 -0
  243. package/dist/esm/schemas/typescript/NumericType.d.ts.map +1 -0
  244. package/dist/esm/schemas/typescript/NumericType.js +15 -0
  245. package/dist/esm/schemas/typescript/NumericType.js.map +1 -0
  246. package/dist/esm/schemas/typescript/PackedElementField.d.ts +11 -0
  247. package/dist/esm/schemas/typescript/PackedElementField.d.ts.map +1 -0
  248. package/dist/esm/schemas/typescript/PackedElementField.js +3 -0
  249. package/dist/esm/schemas/typescript/PackedElementField.js.map +1 -0
  250. package/dist/esm/schemas/typescript/Point2.d.ts +8 -0
  251. package/dist/esm/schemas/typescript/Point2.d.ts.map +1 -0
  252. package/dist/esm/schemas/typescript/Point2.js +3 -0
  253. package/dist/esm/schemas/typescript/Point2.js.map +1 -0
  254. package/dist/esm/schemas/typescript/Point3.d.ts +10 -0
  255. package/dist/esm/schemas/typescript/Point3.d.ts.map +1 -0
  256. package/dist/esm/schemas/typescript/Point3.js +3 -0
  257. package/dist/esm/schemas/typescript/Point3.js.map +1 -0
  258. package/dist/esm/schemas/typescript/PointCloud.d.ts +19 -0
  259. package/dist/esm/schemas/typescript/PointCloud.d.ts.map +1 -0
  260. package/dist/esm/schemas/typescript/PointCloud.js +3 -0
  261. package/dist/esm/schemas/typescript/PointCloud.js.map +1 -0
  262. package/dist/esm/schemas/typescript/PointsAnnotation.d.ts +18 -0
  263. package/dist/esm/schemas/typescript/PointsAnnotation.d.ts.map +1 -0
  264. package/dist/esm/schemas/typescript/PointsAnnotation.js +3 -0
  265. package/dist/esm/schemas/typescript/PointsAnnotation.js.map +1 -0
  266. package/dist/esm/schemas/typescript/PointsAnnotationType.d.ts +9 -0
  267. package/dist/esm/schemas/typescript/PointsAnnotationType.d.ts.map +1 -0
  268. package/dist/esm/schemas/typescript/PointsAnnotationType.js +11 -0
  269. package/dist/esm/schemas/typescript/PointsAnnotationType.js.map +1 -0
  270. package/dist/esm/schemas/typescript/Pose.d.ts +10 -0
  271. package/dist/esm/schemas/typescript/Pose.d.ts.map +1 -0
  272. package/dist/esm/schemas/typescript/Pose.js +3 -0
  273. package/dist/esm/schemas/typescript/Pose.js.map +1 -0
  274. package/dist/esm/schemas/typescript/PoseInFrame.d.ts +12 -0
  275. package/dist/esm/schemas/typescript/PoseInFrame.d.ts.map +1 -0
  276. package/dist/esm/schemas/typescript/PoseInFrame.js +3 -0
  277. package/dist/esm/schemas/typescript/PoseInFrame.js.map +1 -0
  278. package/dist/esm/schemas/typescript/PosesInFrame.d.ts +12 -0
  279. package/dist/esm/schemas/typescript/PosesInFrame.d.ts.map +1 -0
  280. package/dist/esm/schemas/typescript/PosesInFrame.js +3 -0
  281. package/dist/esm/schemas/typescript/PosesInFrame.js.map +1 -0
  282. package/dist/esm/schemas/typescript/PositionCovarianceType.d.ts +8 -0
  283. package/dist/esm/schemas/typescript/PositionCovarianceType.d.ts.map +1 -0
  284. package/dist/esm/schemas/typescript/PositionCovarianceType.js +10 -0
  285. package/dist/esm/schemas/typescript/PositionCovarianceType.js.map +1 -0
  286. package/dist/esm/schemas/typescript/Quaternion.d.ts +12 -0
  287. package/dist/esm/schemas/typescript/Quaternion.d.ts.map +1 -0
  288. package/dist/esm/schemas/typescript/Quaternion.js +3 -0
  289. package/dist/esm/schemas/typescript/Quaternion.js.map +1 -0
  290. package/dist/esm/schemas/typescript/RawImage.d.ts +17 -0
  291. package/dist/esm/schemas/typescript/RawImage.d.ts.map +1 -0
  292. package/dist/esm/schemas/typescript/RawImage.js +3 -0
  293. package/dist/esm/schemas/typescript/RawImage.js.map +1 -0
  294. package/dist/esm/schemas/typescript/Time.d.ts +5 -0
  295. package/dist/esm/schemas/typescript/Time.d.ts.map +1 -0
  296. package/dist/esm/schemas/typescript/Time.js +2 -0
  297. package/dist/esm/schemas/typescript/Time.js.map +1 -0
  298. package/dist/esm/schemas/typescript/Transform.d.ts +13 -0
  299. package/dist/esm/schemas/typescript/Transform.d.ts.map +1 -0
  300. package/dist/esm/schemas/typescript/Transform.js +3 -0
  301. package/dist/esm/schemas/typescript/Transform.js.map +1 -0
  302. package/dist/esm/schemas/typescript/Vector2.d.ts +8 -0
  303. package/dist/esm/schemas/typescript/Vector2.d.ts.map +1 -0
  304. package/dist/esm/schemas/typescript/Vector2.js +3 -0
  305. package/dist/esm/schemas/typescript/Vector2.js.map +1 -0
  306. package/dist/esm/schemas/typescript/Vector3.d.ts +10 -0
  307. package/dist/esm/schemas/typescript/Vector3.d.ts.map +1 -0
  308. package/dist/esm/schemas/typescript/Vector3.js +3 -0
  309. package/dist/esm/schemas/typescript/Vector3.js.map +1 -0
  310. package/dist/esm/schemas/typescript/index.d.ts +29 -0
  311. package/dist/esm/schemas/typescript/index.d.ts.map +1 -0
  312. package/dist/esm/schemas/typescript/index.js +29 -0
  313. package/dist/esm/schemas/typescript/index.js.map +1 -0
  314. package/dist/esm/scripts/updateGeneratedFiles.d.ts +2 -0
  315. package/dist/esm/scripts/updateGeneratedFiles.d.ts.map +1 -0
  316. package/dist/esm/scripts/updateGeneratedFiles.js +74 -0
  317. package/dist/esm/scripts/updateGeneratedFiles.js.map +1 -0
  318. package/dist/esm/src/generateJsonSchema.d.ts +3 -0
  319. package/dist/esm/src/generateJsonSchema.d.ts.map +1 -0
  320. package/dist/esm/src/generateJsonSchema.js +81 -0
  321. package/dist/esm/src/generateJsonSchema.js.map +1 -0
  322. package/dist/esm/src/generateJsonSchema.test.d.ts +2 -0
  323. package/dist/esm/src/generateJsonSchema.test.d.ts.map +1 -0
  324. package/dist/esm/src/generateJsonSchema.test.js +309 -0
  325. package/dist/esm/src/generateJsonSchema.test.js.map +1 -0
  326. package/dist/esm/src/generateProto.d.ts +3 -0
  327. package/dist/esm/src/generateProto.d.ts.map +1 -0
  328. package/dist/esm/src/generateProto.js +80 -0
  329. package/dist/esm/src/generateProto.js.map +1 -0
  330. package/dist/esm/src/generateProto.test.d.ts +2 -0
  331. package/dist/esm/src/generateProto.test.d.ts.map +1 -0
  332. package/dist/esm/src/generateProto.test.js +122 -0
  333. package/dist/esm/src/generateProto.test.js.map +1 -0
  334. package/dist/esm/src/generateRos.d.ts +20 -0
  335. package/dist/esm/src/generateRos.d.ts.map +1 -0
  336. package/dist/esm/src/generateRos.js +180 -0
  337. package/dist/esm/src/generateRos.js.map +1 -0
  338. package/dist/esm/src/generateRos.test.d.ts +2 -0
  339. package/dist/esm/src/generateRos.test.d.ts.map +1 -0
  340. package/dist/esm/src/generateRos.test.js +909 -0
  341. package/dist/esm/src/generateRos.test.js.map +1 -0
  342. package/dist/esm/src/generateTypeScript.d.ts +5 -0
  343. package/dist/esm/src/generateTypeScript.d.ts.map +1 -0
  344. package/dist/esm/src/generateTypeScript.js +96 -0
  345. package/dist/esm/src/generateTypeScript.js.map +1 -0
  346. package/dist/esm/src/generateTypeScript.test.d.ts +2 -0
  347. package/dist/esm/src/generateTypeScript.test.d.ts.map +1 -0
  348. package/dist/esm/src/generateTypeScript.test.js +117 -0
  349. package/dist/esm/src/generateTypeScript.test.js.map +1 -0
  350. package/dist/esm/src/index.d.ts +6 -0
  351. package/dist/esm/src/index.d.ts.map +1 -0
  352. package/dist/esm/src/index.js +6 -0
  353. package/dist/esm/src/index.js.map +1 -0
  354. package/dist/esm/src/schemas.d.ts +35 -0
  355. package/dist/esm/src/schemas.d.ts.map +1 -0
  356. package/dist/esm/src/schemas.js +817 -0
  357. package/dist/esm/src/schemas.js.map +1 -0
  358. package/dist/esm/src/schemas.test.d.ts +2 -0
  359. package/dist/esm/src/schemas.test.d.ts.map +1 -0
  360. package/dist/esm/src/schemas.test.js +22 -0
  361. package/dist/esm/src/schemas.test.js.map +1 -0
  362. package/dist/esm/src/testFixtures.d.ts +5 -0
  363. package/dist/esm/src/testFixtures.d.ts.map +1 -0
  364. package/dist/esm/src/testFixtures.js +83 -0
  365. package/dist/esm/src/testFixtures.js.map +1 -0
  366. package/dist/esm/src/types.d.ts +37 -0
  367. package/dist/esm/src/types.d.ts.map +1 -0
  368. package/dist/esm/src/types.js +2 -0
  369. package/dist/esm/src/types.js.map +1 -0
  370. package/jest.config.json +16 -0
  371. package/package.json +55 -0
  372. package/schemas/jsonschema/CameraCalibration.json +72 -0
  373. package/schemas/jsonschema/CircleAnnotation.json +96 -0
  374. package/schemas/jsonschema/Color.json +24 -0
  375. package/schemas/jsonschema/CompressedImage.json +33 -0
  376. package/schemas/jsonschema/FrameTransform.json +100 -0
  377. package/schemas/jsonschema/GeoJSON.json +12 -0
  378. package/schemas/jsonschema/Grid.json +179 -0
  379. package/schemas/jsonschema/ImageAnnotations.json +234 -0
  380. package/schemas/jsonschema/LaserScan.json +102 -0
  381. package/schemas/jsonschema/LocationFix.json +51 -0
  382. package/schemas/jsonschema/Log.json +71 -0
  383. package/schemas/jsonschema/PackedElementField.json +59 -0
  384. package/schemas/jsonschema/Point2.json +16 -0
  385. package/schemas/jsonschema/Point3.json +20 -0
  386. package/schemas/jsonschema/PointCloud.json +153 -0
  387. package/schemas/jsonschema/PointsAnnotation.json +122 -0
  388. package/schemas/jsonschema/Pose.json +52 -0
  389. package/schemas/jsonschema/PoseInFrame.json +80 -0
  390. package/schemas/jsonschema/PosesInFrame.json +84 -0
  391. package/schemas/jsonschema/Quaternion.json +24 -0
  392. package/schemas/jsonschema/RawImage.json +48 -0
  393. package/schemas/jsonschema/Transform.json +68 -0
  394. package/schemas/jsonschema/Vector2.json +16 -0
  395. package/schemas/jsonschema/Vector3.json +20 -0
  396. package/schemas/proto/foxglove/CameraCalibration.proto +70 -0
  397. package/schemas/proto/foxglove/CircleAnnotation.proto +30 -0
  398. package/schemas/proto/foxglove/Color.proto +20 -0
  399. package/schemas/proto/foxglove/CompressedImage.proto +19 -0
  400. package/schemas/proto/foxglove/FrameTransform.proto +23 -0
  401. package/schemas/proto/foxglove/GeoJSON.proto +11 -0
  402. package/schemas/proto/foxglove/Grid.proto +40 -0
  403. package/schemas/proto/foxglove/ImageAnnotations.proto +17 -0
  404. package/schemas/proto/foxglove/LaserScan.proto +32 -0
  405. package/schemas/proto/foxglove/LocationFix.proto +33 -0
  406. package/schemas/proto/foxglove/Log.proto +42 -0
  407. package/schemas/proto/foxglove/PackedElementField.proto +37 -0
  408. package/schemas/proto/foxglove/Point2.proto +14 -0
  409. package/schemas/proto/foxglove/Point3.proto +17 -0
  410. package/schemas/proto/foxglove/PointCloud.proto +30 -0
  411. package/schemas/proto/foxglove/PointsAnnotation.proto +39 -0
  412. package/schemas/proto/foxglove/Pose.proto +17 -0
  413. package/schemas/proto/foxglove/PoseInFrame.proto +20 -0
  414. package/schemas/proto/foxglove/PosesInFrame.proto +20 -0
  415. package/schemas/proto/foxglove/Quaternion.proto +20 -0
  416. package/schemas/proto/foxglove/RawImage.proto +28 -0
  417. package/schemas/proto/foxglove/Transform.proto +21 -0
  418. package/schemas/proto/foxglove/Vector2.proto +14 -0
  419. package/schemas/proto/foxglove/Vector3.proto +17 -0
  420. package/schemas/ros1/CameraCalibration.msg +61 -0
  421. package/schemas/ros1/CircleAnnotation.msg +19 -0
  422. package/schemas/ros1/Color.msg +13 -0
  423. package/schemas/ros1/CompressedImage.msg +10 -0
  424. package/schemas/ros1/FrameTransform.msg +13 -0
  425. package/schemas/ros1/GeoJSON.msg +4 -0
  426. package/schemas/ros1/Grid.msg +28 -0
  427. package/schemas/ros1/ImageAnnotations.msg +7 -0
  428. package/schemas/ros1/LaserScan.msg +22 -0
  429. package/schemas/ros1/LocationFix.msg +21 -0
  430. package/schemas/ros1/Log.msg +26 -0
  431. package/schemas/ros1/PackedElementField.msg +20 -0
  432. package/schemas/ros1/Point2.msg +7 -0
  433. package/schemas/ros1/PointCloud.msg +19 -0
  434. package/schemas/ros1/PointsAnnotation.msg +22 -0
  435. package/schemas/ros1/PoseInFrame.msg +10 -0
  436. package/schemas/ros1/PosesInFrame.msg +10 -0
  437. package/schemas/ros1/RawImage.msg +19 -0
  438. package/schemas/ros1/Transform.msg +10 -0
  439. package/schemas/ros1/Vector2.msg +7 -0
  440. package/schemas/ros2/CameraCalibration.msg +61 -0
  441. package/schemas/ros2/CircleAnnotation.msg +19 -0
  442. package/schemas/ros2/Color.msg +13 -0
  443. package/schemas/ros2/CompressedImage.msg +10 -0
  444. package/schemas/ros2/FrameTransform.msg +13 -0
  445. package/schemas/ros2/GeoJSON.msg +4 -0
  446. package/schemas/ros2/Grid.msg +28 -0
  447. package/schemas/ros2/ImageAnnotations.msg +7 -0
  448. package/schemas/ros2/LaserScan.msg +22 -0
  449. package/schemas/ros2/LocationFix.msg +21 -0
  450. package/schemas/ros2/Log.msg +26 -0
  451. package/schemas/ros2/PackedElementField.msg +20 -0
  452. package/schemas/ros2/Point2.msg +7 -0
  453. package/schemas/ros2/PointCloud.msg +19 -0
  454. package/schemas/ros2/PointsAnnotation.msg +22 -0
  455. package/schemas/ros2/PoseInFrame.msg +10 -0
  456. package/schemas/ros2/PosesInFrame.msg +10 -0
  457. package/schemas/ros2/RawImage.msg +19 -0
  458. package/schemas/ros2/Transform.msg +10 -0
  459. package/schemas/ros2/Vector2.msg +7 -0
  460. package/schemas/typescript/CameraCalibration.ts +72 -0
  461. package/schemas/typescript/CircleAnnotation.ts +26 -0
  462. package/schemas/typescript/Color.ts +16 -0
  463. package/schemas/typescript/CompressedImage.ts +15 -0
  464. package/schemas/typescript/Duration.ts +4 -0
  465. package/schemas/typescript/FrameTransform.ts +19 -0
  466. package/schemas/typescript/GeoJSON.ts +7 -0
  467. package/schemas/typescript/Grid.ts +36 -0
  468. package/schemas/typescript/ImageAnnotations.ts +13 -0
  469. package/schemas/typescript/LaserScan.ts +28 -0
  470. package/schemas/typescript/LocationFix.ts +21 -0
  471. package/schemas/typescript/Log.ts +25 -0
  472. package/schemas/typescript/LogLevel.ts +16 -0
  473. package/schemas/typescript/NumericType.ts +22 -0
  474. package/schemas/typescript/PackedElementField.ts +15 -0
  475. package/schemas/typescript/Point2.ts +10 -0
  476. package/schemas/typescript/Point3.ts +13 -0
  477. package/schemas/typescript/PointCloud.ts +26 -0
  478. package/schemas/typescript/PointsAnnotation.ts +24 -0
  479. package/schemas/typescript/PointsAnnotationType.ts +14 -0
  480. package/schemas/typescript/Pose.ts +13 -0
  481. package/schemas/typescript/PoseInFrame.ts +16 -0
  482. package/schemas/typescript/PosesInFrame.ts +16 -0
  483. package/schemas/typescript/PositionCovarianceType.ts +12 -0
  484. package/schemas/typescript/Quaternion.ts +16 -0
  485. package/schemas/typescript/RawImage.ts +24 -0
  486. package/schemas/typescript/Time.ts +4 -0
  487. package/schemas/typescript/Transform.ts +17 -0
  488. package/schemas/typescript/Vector2.ts +10 -0
  489. package/schemas/typescript/Vector3.ts +13 -0
  490. package/schemas/typescript/index.ts +28 -0
  491. package/scripts/updateGeneratedFiles.ts +103 -0
  492. package/src/generateJsonSchema.test.ts +314 -0
  493. package/src/generateJsonSchema.ts +82 -0
  494. package/src/generateProto.test.ts +126 -0
  495. package/src/generateProto.ts +97 -0
  496. package/src/generateRos.test.ts +931 -0
  497. package/src/generateRos.ts +219 -0
  498. package/src/generateTypeScript.test.ts +118 -0
  499. package/src/generateTypeScript.ts +106 -0
  500. package/src/index.ts +5 -0
  501. package/src/schemas.test.ts +23 -0
  502. package/src/schemas.ts +853 -0
  503. package/src/testFixtures.ts +90 -0
  504. package/src/types.ts +40 -0
  505. package/tsconfig.cjs.json +7 -0
  506. package/tsconfig.json +9 -0
@@ -0,0 +1,219 @@
1
+ import type { RosMsgDefinition, RosMsgField } from "@foxglove/rosmsg";
2
+ import { definitions as rosCommonDefs } from "@foxglove/rosmsg-msgs-common";
3
+
4
+ import { FoxgloveMessageSchema, FoxglovePrimitive } from "./types";
5
+
6
+ type RosMsgFieldWithDescription = RosMsgField & {
7
+ description?: string;
8
+ };
9
+ type RosMsgDefinitionWithDescription = {
10
+ originalName: string;
11
+ description?: string;
12
+ qualifiedRosName: string;
13
+ fields: RosMsgFieldWithDescription[];
14
+ };
15
+
16
+ function primitiveToRos(
17
+ type: Exclude<FoxglovePrimitive, "uint32" | "bytes">,
18
+ { rosVersion }: { rosVersion: 1 | 2 },
19
+ ) {
20
+ switch (type) {
21
+ case "string":
22
+ return "string";
23
+ case "boolean":
24
+ return "bool";
25
+ case "float64":
26
+ return "float64";
27
+ case "time":
28
+ return rosVersion === 2 ? "builtin_interfaces/Time" : "time";
29
+ case "duration":
30
+ return rosVersion === 2 ? "builtin_interfaces/Duration" : "duration";
31
+ }
32
+ }
33
+
34
+ export function generateRosMsg(def: RosMsgDefinitionWithDescription): string {
35
+ let source = "";
36
+ source += `# Generated from ${def.originalName} by @foxglove/schemas\n`;
37
+ if (def.description != undefined) {
38
+ source += `# ${def.description}\n`;
39
+ }
40
+ let prevFieldHadComment = true; // start true because of top-of-file comment
41
+ for (const field of def.fields) {
42
+ if (prevFieldHadComment || field.description != undefined) {
43
+ source += "\n";
44
+ }
45
+ prevFieldHadComment = false;
46
+ if (field.description != undefined) {
47
+ source += field.description
48
+ .trim()
49
+ .split("\n")
50
+ .map((line) => `# ${line}\n`)
51
+ .join("");
52
+ prevFieldHadComment = true;
53
+ }
54
+ let constant = "";
55
+ if (field.isConstant === true) {
56
+ if (field.valueText == undefined) {
57
+ throw new Error(`Constant ${field.name} has no valueText`);
58
+ }
59
+ constant = `=${field.valueText}`;
60
+ }
61
+ source += `${field.type}${field.isArray === true ? `[${field.arrayLength ?? ""}]` : ""} ${
62
+ field.name
63
+ }${constant}\n`;
64
+ }
65
+ return source;
66
+ }
67
+
68
+ type Dependency =
69
+ | { type: "ros"; name: keyof typeof rosCommonDefs }
70
+ | { type: "foxglove"; schema: FoxgloveMessageSchema };
71
+
72
+ function dependenciesEqual(a: Dependency, b: Dependency) {
73
+ return (
74
+ (a.type === "foxglove" && b.type === "foxglove" && a.schema.name === b.schema.name) ||
75
+ (a.type === "ros" && b.type === "ros" && a.name === b.name)
76
+ );
77
+ }
78
+
79
+ function* getSchemaDependencies(schema: FoxgloveMessageSchema): Iterable<Dependency> {
80
+ for (const field of schema.fields) {
81
+ if (field.type.type === "nested") {
82
+ if (field.type.schema.rosEquivalent != undefined) {
83
+ yield { type: "ros", name: field.type.schema.rosEquivalent };
84
+ yield* getRosDependencies(rosCommonDefs[field.type.schema.rosEquivalent]);
85
+ } else {
86
+ yield { type: "foxglove", schema: field.type.schema };
87
+ yield* getSchemaDependencies(field.type.schema);
88
+ }
89
+ }
90
+ }
91
+ }
92
+ function* getRosDependencies(schema: RosMsgDefinition): Iterable<Dependency> {
93
+ for (const field of schema.definitions) {
94
+ if (field.isComplex === true) {
95
+ yield { type: "ros", name: field.type as keyof typeof rosCommonDefs };
96
+ yield* getRosDependencies(rosCommonDefs[field.type as keyof typeof rosCommonDefs]!);
97
+ }
98
+ }
99
+ }
100
+
101
+ export function generateRosMsgDefinition(
102
+ schema: FoxgloveMessageSchema,
103
+ { rosVersion }: { rosVersion: 1 | 2 },
104
+ ): RosMsgDefinitionWithDescription {
105
+ const enumFieldNames = new Set<string>();
106
+ const seenEnumNames = new Set<string>();
107
+
108
+ const fields: RosMsgFieldWithDescription[] = [];
109
+ for (const field of schema.fields) {
110
+ let isArray = field.array != undefined;
111
+ const arrayLength = typeof field.array === "number" ? field.array : undefined;
112
+ let fieldType: string;
113
+ switch (field.type.type) {
114
+ case "enum": {
115
+ // Add enum constants preceding the field so that Studio can pick them up:
116
+ // https://foxglove.dev/docs/studio/annotating-data
117
+ const enumName = field.type.enum.name;
118
+ const valueType = "uint8";
119
+ fieldType = valueType;
120
+ if (seenEnumNames.has(enumName)) {
121
+ break;
122
+ }
123
+ const enumFields: RosMsgFieldWithDescription[] = [];
124
+ for (const { name, value, description } of field.type.enum.values) {
125
+ if (enumFieldNames.has(name)) {
126
+ throw new Error(
127
+ `Enum value ${name} occurs in more than one enum referenced by ${schema.name}, this is not supported in ROS msg files`,
128
+ );
129
+ }
130
+ if (value < 0 || value > 255 || !Number.isInteger(value)) {
131
+ throw new Error(
132
+ `Only uint8 enums are currently supported; value ${name}=${value} is out of range`,
133
+ );
134
+ }
135
+ enumFieldNames.add(name);
136
+ enumFields.push({
137
+ name,
138
+ value,
139
+ isConstant: true,
140
+ valueText: value.toString(),
141
+ type: valueType,
142
+ description,
143
+ });
144
+ }
145
+ fields.push(...enumFields);
146
+ seenEnumNames.add(enumName);
147
+ break;
148
+ }
149
+
150
+ case "nested":
151
+ if (field.type.schema.rosEquivalent != undefined) {
152
+ fieldType = field.type.schema.rosEquivalent;
153
+ } else {
154
+ fieldType = `foxglove_msgs/${field.type.schema.name}`;
155
+ }
156
+ break;
157
+
158
+ case "primitive":
159
+ if (field.type.name === "bytes") {
160
+ fieldType = "uint8";
161
+ if (isArray) {
162
+ throw new Error("Array of bytes is not supported in ROS msg");
163
+ }
164
+ isArray = true;
165
+ } else if (field.type.name === "uint32") {
166
+ fieldType = "uint32";
167
+ } else {
168
+ fieldType = primitiveToRos(field.type.name, { rosVersion });
169
+ }
170
+ break;
171
+ }
172
+ fields.push({
173
+ name: rosVersion === 2 ? field.name.toLowerCase() : field.name,
174
+ type: fieldType,
175
+ isComplex: field.type.type === "nested",
176
+ isArray,
177
+ arrayLength,
178
+ description: field.description,
179
+ });
180
+ }
181
+
182
+ return {
183
+ originalName: schema.name,
184
+ qualifiedRosName: `foxglove_msgs/${schema.name}`,
185
+ fields,
186
+ };
187
+ }
188
+
189
+ export function generateRosMsgMergedSchema(
190
+ schema: FoxgloveMessageSchema,
191
+ { rosVersion }: { rosVersion: 1 | 2 },
192
+ ): string {
193
+ const dependencies: Dependency[] = [];
194
+ for (const dep of getSchemaDependencies(schema)) {
195
+ if (!dependencies.some((existing) => dependenciesEqual(existing, dep))) {
196
+ dependencies.push(dep);
197
+ }
198
+ }
199
+
200
+ let result = generateRosMsg(generateRosMsgDefinition(schema, { rosVersion }));
201
+ for (const dep of dependencies) {
202
+ let name: string;
203
+ let source: string;
204
+ if (dep.type === "ros") {
205
+ name = dep.name;
206
+ source = generateRosMsg({
207
+ originalName: dep.name,
208
+ qualifiedRosName: dep.name,
209
+ fields: rosCommonDefs[dep.name].definitions,
210
+ });
211
+ } else {
212
+ const definition = generateRosMsgDefinition(dep.schema, { rosVersion });
213
+ name = definition.qualifiedRosName;
214
+ source = generateRosMsg(definition);
215
+ }
216
+ result += `================================================================================\nMSG: ${name}\n${source}`;
217
+ }
218
+ return result;
219
+ }
@@ -0,0 +1,118 @@
1
+ import { generateTypeScript } from "./generateTypeScript";
2
+ import { exampleEnum, exampleMessage } from "./testFixtures";
3
+
4
+ describe("generateTypeScript", () => {
5
+ it("generates .d.ts files", () => {
6
+ expect(generateTypeScript(exampleEnum)).toMatchInlineSnapshot(`
7
+ "// Generated from ExampleEnum by @foxglove/schemas
8
+
9
+ /** An example enum */
10
+ export enum ExampleEnum {
11
+ /** Value A */
12
+ A = 1,
13
+
14
+ /** Value B */
15
+ B = 2,
16
+ }
17
+ "
18
+ `);
19
+ expect(generateTypeScript(exampleMessage)).toMatchInlineSnapshot(`
20
+ "// Generated from ExampleMessage by @foxglove/schemas
21
+
22
+ import { Duration } from \\"./Duration\\";
23
+ import { ExampleEnum } from \\"./ExampleEnum\\";
24
+ import { NestedMessage } from \\"./NestedMessage\\";
25
+ import { Time } from \\"./Time\\";
26
+
27
+ /** An example type */
28
+ export type ExampleMessage = {
29
+ /** duration field */
30
+ field_duration: Duration;
31
+
32
+ /** time field */
33
+ field_time: Time;
34
+
35
+ /** boolean field */
36
+ field_boolean: boolean;
37
+
38
+ /** bytes field */
39
+ field_bytes: Uint8Array;
40
+
41
+ /** float64 field */
42
+ field_float64: number;
43
+
44
+ /** uint32 field */
45
+ field_uint32: number;
46
+
47
+ /** string field */
48
+ field_string: string;
49
+
50
+ /** duration array field */
51
+ field_duration_array: Duration[];
52
+
53
+ /** time array field */
54
+ field_time_array: Time[];
55
+
56
+ /** boolean array field */
57
+ field_boolean_array: boolean[];
58
+
59
+ /** bytes array field */
60
+ field_bytes_array: Uint8Array[];
61
+
62
+ /** float64 array field */
63
+ field_float64_array: number[];
64
+
65
+ /** uint32 array field */
66
+ field_uint32_array: number[];
67
+
68
+ /** string array field */
69
+ field_string_array: string[];
70
+
71
+ /** duration fixed-length array field */
72
+ field_duration_fixed_array: [Duration, Duration, Duration];
73
+
74
+ /** time fixed-length array field */
75
+ field_time_fixed_array: [Time, Time, Time];
76
+
77
+ /** boolean fixed-length array field */
78
+ field_boolean_fixed_array: [boolean, boolean, boolean];
79
+
80
+ /** bytes fixed-length array field */
81
+ field_bytes_fixed_array: [Uint8Array, Uint8Array, Uint8Array];
82
+
83
+ /** float64 fixed-length array field */
84
+ field_float64_fixed_array: [number, number, number];
85
+
86
+ /** uint32 fixed-length array field */
87
+ field_uint32_fixed_array: [number, number, number];
88
+
89
+ /** string fixed-length array field */
90
+ field_string_fixed_array: [string, string, string];
91
+
92
+ /** An enum field */
93
+ field_enum: ExampleEnum;
94
+
95
+ /** An enum array field */
96
+ field_enum_array: ExampleEnum[];
97
+
98
+ /** A nested field */
99
+ field_nested: NestedMessage;
100
+
101
+ /**
102
+ * A nested array field
103
+ * With
104
+ * a
105
+ * very
106
+ * long
107
+ * description
108
+ */
109
+ field_nested_array: NestedMessage[];
110
+ };
111
+ "
112
+ `);
113
+ });
114
+
115
+ it("generates parseable .ts files", async () => {
116
+ await expect(import("../schemas/typescript")).resolves.not.toThrow();
117
+ });
118
+ });
@@ -0,0 +1,106 @@
1
+ import { FoxglovePrimitive, FoxgloveSchema } from "./types";
2
+
3
+ function primitiveToTypeScript(type: Exclude<FoxglovePrimitive, "time" | "duration">) {
4
+ switch (type) {
5
+ case "bytes":
6
+ return "Uint8Array";
7
+ case "string":
8
+ return "string";
9
+ case "boolean":
10
+ return "boolean";
11
+ case "float64":
12
+ case "uint32":
13
+ return "number";
14
+ }
15
+ }
16
+
17
+ export const TIME_TS = `export type Time = {
18
+ sec: number;
19
+ nsec: number;
20
+ };
21
+ `;
22
+
23
+ export const DURATION_TS = `export type Duration = {
24
+ sec: number;
25
+ nsec: number;
26
+ };
27
+ `;
28
+
29
+ export function generateTypeScript(schema: FoxgloveSchema): string {
30
+ const imports = new Set<string>();
31
+
32
+ let definition: string;
33
+ switch (schema.type) {
34
+ case "enum": {
35
+ const fields = schema.values.map(({ name, value, description }) => {
36
+ if (description != undefined) {
37
+ return `/** ${description} */\n ${name} = ${value},`;
38
+ } else {
39
+ return `${name} = ${value},`;
40
+ }
41
+ });
42
+ definition = `/** ${schema.description} */\nexport enum ${schema.name} {\n ${fields.join(
43
+ "\n\n ",
44
+ )}\n}`;
45
+ break;
46
+ }
47
+
48
+ case "message": {
49
+ const fields = schema.fields.map((field) => {
50
+ let fieldType: string;
51
+ switch (field.type.type) {
52
+ case "enum":
53
+ fieldType = field.type.enum.name;
54
+ imports.add(field.type.enum.name);
55
+ break;
56
+ case "nested":
57
+ fieldType = field.type.schema.name;
58
+ imports.add(field.type.schema.name);
59
+ break;
60
+ case "primitive":
61
+ if (field.type.name === "time") {
62
+ fieldType = "Time";
63
+ imports.add("Time");
64
+ } else if (field.type.name === "duration") {
65
+ fieldType = "Duration";
66
+ imports.add("Duration");
67
+ } else {
68
+ fieldType = primitiveToTypeScript(field.type.name);
69
+ }
70
+ break;
71
+ }
72
+ if (typeof field.array === "number") {
73
+ fieldType = `[${new Array(field.array).fill(fieldType).join(", ")}]`;
74
+ } else if (field.array != undefined) {
75
+ fieldType = `${fieldType}[]`;
76
+ }
77
+ let comment: string;
78
+ const descriptionLines = field.description.trim().split("\n");
79
+ if (descriptionLines.length === 1) {
80
+ comment = `/** ${field.description} */`;
81
+ } else {
82
+ comment = `/**\n ${descriptionLines.map((line) => ` * ${line}`).join("\n ")}\n */`;
83
+ }
84
+ return `${comment}\n ${field.name}: ${fieldType};`;
85
+ });
86
+
87
+ definition = `/** ${schema.description} */\nexport type ${schema.name} = {\n ${fields.join(
88
+ "\n\n ",
89
+ )}\n};`;
90
+ break;
91
+ }
92
+ }
93
+
94
+ const outputSections = [
95
+ `// Generated from ${schema.name} by @foxglove/schemas`,
96
+
97
+ Array.from(imports)
98
+ .sort()
99
+ .map((name) => `import { ${name} } from "./${name}";`)
100
+ .join("\n"),
101
+
102
+ definition,
103
+ ].filter(Boolean);
104
+
105
+ return outputSections.join("\n\n") + "\n";
106
+ }
package/src/index.ts ADDED
@@ -0,0 +1,5 @@
1
+ export * from "./schemas";
2
+ export * from "./types";
3
+ export * from "./generateRos";
4
+ export * from "./generateProto";
5
+ export * from "./generateJsonSchema";
@@ -0,0 +1,23 @@
1
+ import { foxgloveEnumSchemas, foxgloveMessageSchemas } from "./schemas";
2
+
3
+ describe("schemas", () => {
4
+ it("has matching names", () => {
5
+ for (const [key, value] of Object.entries(foxgloveMessageSchemas)) {
6
+ expect(key).toEqual(value.name);
7
+ }
8
+ for (const [key, value] of Object.entries(foxgloveEnumSchemas)) {
9
+ expect(key).toEqual(value.name);
10
+ expect(value.protobufParentMessageName in foxgloveMessageSchemas).toBe(true);
11
+ }
12
+ });
13
+
14
+ it("has valid descriptions", () => {
15
+ for (const schema of Object.values(foxgloveMessageSchemas)) {
16
+ // Multi-line descriptions are supported for fields, but not currently for schemas
17
+ expect(schema.description.includes("\n")).toBe(false);
18
+ for (const field of schema.fields) {
19
+ expect(field.description.includes("*/")).toBe(false);
20
+ }
21
+ }
22
+ });
23
+ });