@foxglove/schemas 1.7.1 → 1.7.3

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 (83) hide show
  1. package/dist/internal/exportTypeScriptSchemas.d.ts.map +1 -1
  2. package/dist/internal/exportTypeScriptSchemas.js +10 -6
  3. package/dist/internal/exportTypeScriptSchemas.js.map +1 -1
  4. package/dist/internal/generateFlatbufferSchema.d.ts +6 -2
  5. package/dist/internal/generateFlatbufferSchema.d.ts.map +1 -1
  6. package/dist/internal/generateFlatbufferSchema.js +26 -15
  7. package/dist/internal/generateFlatbufferSchema.js.map +1 -1
  8. package/dist/internal/generateJsonSchema.d.ts.map +1 -1
  9. package/dist/internal/generateJsonSchema.js +36 -24
  10. package/dist/internal/generateJsonSchema.js.map +1 -1
  11. package/dist/internal/generateOmgIdl.d.ts +2 -3
  12. package/dist/internal/generateOmgIdl.d.ts.map +1 -1
  13. package/dist/internal/generateOmgIdl.js +16 -35
  14. package/dist/internal/generateOmgIdl.js.map +1 -1
  15. package/dist/internal/generateOmgIdl.test.js +4 -6
  16. package/dist/internal/generateOmgIdl.test.js.map +1 -1
  17. package/dist/internal/generateProto.d.ts.map +1 -1
  18. package/dist/internal/generateProto.js +23 -13
  19. package/dist/internal/generateProto.js.map +1 -1
  20. package/dist/internal/generatePyclass.d.ts +1 -1
  21. package/dist/internal/generatePyclass.d.ts.map +1 -1
  22. package/dist/internal/generatePyclass.js +174 -62
  23. package/dist/internal/generatePyclass.js.map +1 -1
  24. package/dist/internal/generatePyclass.test.js +152 -140
  25. package/dist/internal/generatePyclass.test.js.map +1 -1
  26. package/dist/internal/generateRos.d.ts.map +1 -1
  27. package/dist/internal/generateRos.js +20 -9
  28. package/dist/internal/generateRos.js.map +1 -1
  29. package/dist/internal/generateSdkCpp.d.ts +4 -0
  30. package/dist/internal/generateSdkCpp.d.ts.map +1 -0
  31. package/dist/internal/generateSdkCpp.js +362 -0
  32. package/dist/internal/generateSdkCpp.js.map +1 -0
  33. package/dist/internal/generateSdkRustCTypes.d.ts +8 -0
  34. package/dist/internal/generateSdkRustCTypes.d.ts.map +1 -0
  35. package/dist/internal/generateSdkRustCTypes.js +315 -0
  36. package/dist/internal/generateSdkRustCTypes.js.map +1 -0
  37. package/dist/internal/generateTypeScript.d.ts +0 -1
  38. package/dist/internal/generateTypeScript.d.ts.map +1 -1
  39. package/dist/internal/generateTypeScript.js +10 -18
  40. package/dist/internal/generateTypeScript.js.map +1 -1
  41. package/dist/internal/schemas.d.ts +2 -0
  42. package/dist/internal/schemas.d.ts.map +1 -1
  43. package/dist/internal/schemas.js +149 -46
  44. package/dist/internal/schemas.js.map +1 -1
  45. package/dist/internal/testFixtures.d.ts.map +1 -1
  46. package/dist/internal/testFixtures.js +37 -9
  47. package/dist/internal/testFixtures.js.map +1 -1
  48. package/dist/internal/types.d.ts +3 -1
  49. package/dist/internal/types.d.ts.map +1 -1
  50. package/dist/jsonschema/index.d.ts +62 -12
  51. package/dist/jsonschema/index.d.ts.map +1 -1
  52. package/dist/jsonschema/index.js +122 -47
  53. package/dist/jsonschema/index.js.map +1 -1
  54. package/dist/types/CameraCalibration.d.ts +1 -1
  55. package/dist/types/Duration.d.ts +3 -0
  56. package/dist/types/Duration.d.ts.map +1 -1
  57. package/dist/types/Duration.js +2 -0
  58. package/dist/types/Duration.js.map +1 -1
  59. package/dist/types/Grid.d.ts +1 -1
  60. package/dist/types/Grid.d.ts.map +1 -1
  61. package/dist/types/LogLevel.d.ts +6 -0
  62. package/dist/types/LogLevel.d.ts.map +1 -1
  63. package/dist/types/LogLevel.js +6 -0
  64. package/dist/types/LogLevel.js.map +1 -1
  65. package/dist/types/NumericType.d.ts +9 -0
  66. package/dist/types/NumericType.d.ts.map +1 -1
  67. package/dist/types/NumericType.js +9 -0
  68. package/dist/types/NumericType.js.map +1 -1
  69. package/dist/types/PointsAnnotationType.d.ts +1 -0
  70. package/dist/types/PointsAnnotationType.d.ts.map +1 -1
  71. package/dist/types/PointsAnnotationType.js +1 -0
  72. package/dist/types/PointsAnnotationType.js.map +1 -1
  73. package/dist/types/PositionCovarianceType.d.ts +4 -0
  74. package/dist/types/PositionCovarianceType.d.ts.map +1 -1
  75. package/dist/types/PositionCovarianceType.js +4 -0
  76. package/dist/types/PositionCovarianceType.js.map +1 -1
  77. package/dist/types/RawImage.d.ts +58 -8
  78. package/dist/types/RawImage.d.ts.map +1 -1
  79. package/dist/types/index.d.ts +2 -0
  80. package/dist/types/index.d.ts.map +1 -1
  81. package/dist/types/index.js +2 -0
  82. package/dist/types/index.js.map +1 -1
  83. package/package.json +2 -2
@@ -0,0 +1,362 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.generateHppSchemas = generateHppSchemas;
4
+ exports.generateCppSchemas = generateCppSchemas;
5
+ const tslib_1 = require("tslib");
6
+ const assert_1 = tslib_1.__importDefault(require("assert"));
7
+ function primitiveToCpp(type) {
8
+ switch (type) {
9
+ case "int32":
10
+ return "int32_t";
11
+ case "uint32":
12
+ return "uint32_t";
13
+ case "bytes":
14
+ return "std::vector<std::byte>";
15
+ case "string":
16
+ return "std::string";
17
+ case "boolean":
18
+ return "bool";
19
+ case "float64":
20
+ return "double";
21
+ }
22
+ }
23
+ function primitiveDefaultValue(type) {
24
+ switch (type) {
25
+ case "int32":
26
+ case "uint32":
27
+ return 0;
28
+ case "boolean":
29
+ return false;
30
+ case "float64":
31
+ return 0;
32
+ case "string":
33
+ case "bytes":
34
+ return undefined;
35
+ }
36
+ }
37
+ function formatComment(comment, indent) {
38
+ const spaces = " ".repeat(indent);
39
+ return comment
40
+ .split("\n")
41
+ .map((line) => `${spaces}/// @brief ${line}`)
42
+ .join("\n");
43
+ }
44
+ function toCamelCase(name) {
45
+ return name.substring(0, 1).toLowerCase() + name.substring(1);
46
+ }
47
+ function toSnakeCase(name) {
48
+ const snakeName = name
49
+ .replace("JSON", "Json")
50
+ .replace(/([A-Z])/g, "_$1")
51
+ .toLowerCase();
52
+ return snakeName.startsWith("_") ? snakeName.substring(1) : snakeName;
53
+ }
54
+ function isSameAsCType(schema) {
55
+ return schema.fields.every((field) => field.type.type === "primitive" &&
56
+ field.type.name !== "bytes" &&
57
+ field.type.name !== "string");
58
+ }
59
+ /**
60
+ * Yield `schemas` in an order such that dependencies come before dependents, so structs don't end
61
+ * up referencing [incomplete types](https://en.cppreference.com/w/cpp/language/incomplete_type).
62
+ */
63
+ function* topologicalOrder(schemas, seenSchemaNames = new Set()) {
64
+ for (const schema of schemas) {
65
+ if (seenSchemaNames.has(schema.name)) {
66
+ continue;
67
+ }
68
+ seenSchemaNames.add(schema.name);
69
+ for (const field of schema.fields) {
70
+ if (field.type.type === "nested") {
71
+ yield* topologicalOrder([field.type.schema], seenSchemaNames);
72
+ }
73
+ }
74
+ yield schema;
75
+ }
76
+ }
77
+ /**
78
+ * SDK does not yet generate channels for Timestamp and Duration because of custom implementations
79
+ * in other languages.
80
+ */
81
+ function shouldGenerateChannel(schema) {
82
+ return schema.name !== "Timestamp" && schema.name !== "Duration";
83
+ }
84
+ function generateHppSchemas(schemas, enums) {
85
+ const enumsByParentSchema = new Map();
86
+ for (const enumSchema of enums) {
87
+ if (enumsByParentSchema.has(enumSchema.parentSchemaName)) {
88
+ throw new Error(`Multiple enums with the same parent schema not currently supported ${enumSchema.parentSchemaName}`);
89
+ }
90
+ enumsByParentSchema.set(enumSchema.parentSchemaName, enumSchema);
91
+ }
92
+ const orderedSchemas = Array.from(topologicalOrder(schemas));
93
+ if (orderedSchemas.length !== schemas.length) {
94
+ throw new Error(`Invariant: topologicalOrder should return same number of schemas (got ${orderedSchemas.length} instead of ${schemas.length})`);
95
+ }
96
+ const structDefs = orderedSchemas.map((schema) => {
97
+ let enumDef = [];
98
+ const enumSchema = enumsByParentSchema.get(schema.name);
99
+ if (enumSchema) {
100
+ enumDef = [
101
+ formatComment(enumSchema.description, 2),
102
+ ` enum class ${enumSchema.name} : uint8_t {`,
103
+ enumSchema.values
104
+ .map((value) => {
105
+ const comment = value.description != undefined ? formatComment(value.description, 4) + "\n" : "";
106
+ return `${comment} ${value.name.toUpperCase()} = ${value.value},`;
107
+ })
108
+ .join("\n"),
109
+ ` };`,
110
+ ];
111
+ }
112
+ return [
113
+ formatComment(schema.description, 0),
114
+ `struct ${schema.name} {`,
115
+ ...enumDef,
116
+ schema.fields
117
+ .map((field) => {
118
+ let fieldType;
119
+ let defaultStr = "";
120
+ switch (field.type.type) {
121
+ case "enum":
122
+ fieldType = field.type.enum.name;
123
+ break;
124
+ case "nested":
125
+ fieldType = field.type.schema.name;
126
+ break;
127
+ case "primitive": {
128
+ const defaultValue = field.array != undefined ? undefined : primitiveDefaultValue(field.type.name);
129
+ defaultStr = defaultValue != undefined ? ` = ${defaultValue.toString()}` : "";
130
+ fieldType = primitiveToCpp(field.type.name);
131
+ break;
132
+ }
133
+ }
134
+ if (typeof field.array === "number") {
135
+ fieldType = `std::array<${fieldType}, ${field.array}>`;
136
+ }
137
+ else if (field.array) {
138
+ fieldType = `std::vector<${fieldType}>`;
139
+ }
140
+ else if (field.type.type === "nested") {
141
+ fieldType = `std::optional<${fieldType}>`;
142
+ }
143
+ return `${formatComment(field.description, 2)}\n ${fieldType} ${toSnakeCase(field.name)}${defaultStr};`;
144
+ })
145
+ .join("\n\n"),
146
+ `};`,
147
+ ].join("\n");
148
+ });
149
+ const channelClasses = schemas.filter(shouldGenerateChannel).map((schema) => `/// @brief A channel for logging ${schema.name} messages to a topic.
150
+ ///
151
+ /// @note While channels are fully thread-safe, the ${schema.name} struct is not thread-safe.
152
+ /// Avoid modifying it concurrently or during a log operation.
153
+ class ${schema.name}Channel {
154
+ public:
155
+ /// @brief Create a new channel.
156
+ ///
157
+ /// @param topic The topic name. You should choose a unique topic name per channel for
158
+ /// compatibility with the Foxglove app.
159
+ /// @param context The context which associates logs to a sink. If omitted, the default context is
160
+ /// used.
161
+ static FoxgloveResult<${schema.name}Channel> create(const std::string_view& topic, const Context& context = Context());
162
+
163
+ /// @brief Log a message to the channel.
164
+ ///
165
+ /// @param msg The ${schema.name} message to log.
166
+ /// @param log_time The timestamp of the message. If omitted, the current time is used.
167
+ FoxgloveError log(const ${schema.name}& msg, std::optional<uint64_t> log_time = std::nullopt) noexcept;
168
+
169
+ /// @brief Uniquely identifies a channel in the context of this program.
170
+ ///
171
+ /// @return The ID of the channel.
172
+ [[nodiscard]] uint64_t id() const noexcept;
173
+
174
+ ${schema.name}Channel(const ${schema.name}Channel& other) noexcept = delete;
175
+ ${schema.name}Channel& operator=(const ${schema.name}Channel& other) noexcept = delete;
176
+ /// @brief Default move constructor.
177
+ ${schema.name}Channel(${schema.name}Channel&& other) noexcept = default;
178
+ /// @brief Default move assignment.
179
+ ${schema.name}Channel& operator=(${schema.name}Channel&& other) noexcept = default;
180
+ /// @brief Default destructor.
181
+ ~${schema.name}Channel() = default;
182
+
183
+ private:
184
+ explicit ${schema.name}Channel(ChannelUniquePtr&& channel)
185
+ : impl_(std::move(channel)) {}
186
+
187
+ ChannelUniquePtr impl_;
188
+ };`);
189
+ const includes = [
190
+ "#include <array>",
191
+ "#include <cstdint>",
192
+ "#include <string>",
193
+ "#include <type_traits>",
194
+ "#include <vector>",
195
+ "#include <optional>",
196
+ "#include <memory>",
197
+ "",
198
+ "#include <foxglove/error.hpp>",
199
+ "#include <foxglove/context.hpp>",
200
+ ];
201
+ const uniquePtr = [
202
+ "/// @brief A functor for freeing a channel. Used by ChannelUniquePtr. For internal use only.",
203
+ "struct ChannelDeleter {",
204
+ " /// @brief free the channel",
205
+ " void operator()(const foxglove_channel* ptr) const noexcept;",
206
+ "};",
207
+ "/// @brief A unique pointer to a C foxglove_channel pointer. For internal use only.",
208
+ "typedef std::unique_ptr<const foxglove_channel, ChannelDeleter> ChannelUniquePtr;",
209
+ ];
210
+ const outputSections = [
211
+ "// Generated by https://github.com/foxglove/foxglove-sdk",
212
+ "#pragma once",
213
+ includes.join("\n"),
214
+ "struct foxglove_channel;",
215
+ "namespace foxglove::schemas {",
216
+ uniquePtr.join("\n"),
217
+ structDefs.join("\n\n"),
218
+ channelClasses.join("\n\n"),
219
+ "} // namespace foxglove::schemas",
220
+ ].filter(Boolean);
221
+ return outputSections.join("\n\n") + "\n";
222
+ }
223
+ function cppToC(schema, copyTypes) {
224
+ return schema.fields.map((field) => {
225
+ const srcName = toSnakeCase(field.name);
226
+ const dstName = srcName;
227
+ if (field.array != undefined) {
228
+ if (typeof field.array === "number") {
229
+ return `::memcpy(dest.${dstName}, src.${srcName}.data(), src.${srcName}.size() * sizeof(*src.${srcName}.data()));`;
230
+ }
231
+ else {
232
+ if (field.type.type === "nested") {
233
+ if (copyTypes.has(field.type.schema.name)) {
234
+ return `dest.${dstName} = reinterpret_cast<const foxglove_${toSnakeCase(field.type.schema.name)}*>(src.${srcName}.data());\n dest.${dstName}_count = src.${srcName}.size();`;
235
+ }
236
+ else {
237
+ return `dest.${dstName} = arena.map<foxglove_${toSnakeCase(field.type.schema.name)}>(src.${srcName}, ${toCamelCase(field.type.schema.name)}ToC);
238
+ dest.${dstName}_count = src.${srcName}.size();`;
239
+ }
240
+ }
241
+ else if (field.type.type === "primitive") {
242
+ (0, assert_1.default)(field.type.name !== "bytes");
243
+ return `dest.${dstName} = src.${srcName}.data();\n dest.${dstName}_count = src.${srcName}.size();`;
244
+ }
245
+ else {
246
+ throw Error(`unsupported array type: ${field.type.type}`);
247
+ }
248
+ }
249
+ }
250
+ switch (field.type.type) {
251
+ case "primitive":
252
+ if (field.type.name === "string") {
253
+ return `dest.${dstName} = {src.${srcName}.data(), src.${srcName}.size()};`;
254
+ }
255
+ else if (field.type.name === "bytes") {
256
+ return `dest.${dstName} = reinterpret_cast<const unsigned char *>(src.${srcName}.data());\n dest.${dstName}_len = src.${srcName}.size();`;
257
+ }
258
+ return `dest.${dstName} = src.${srcName};`;
259
+ case "enum":
260
+ return `dest.${dstName} = static_cast<foxglove_${toSnakeCase(field.type.enum.name)}>(src.${srcName});`;
261
+ case "nested":
262
+ if (field.type.schema.name === "Timestamp") {
263
+ return `dest.${dstName} = src.${srcName} ? reinterpret_cast<const foxglove_timestamp*>(&*src.${srcName}) : nullptr;`;
264
+ }
265
+ else if (field.type.schema.name === "Duration") {
266
+ return `dest.${dstName} = src.${srcName} ? reinterpret_cast<const foxglove_duration*>(&*src.${srcName}) : nullptr;`;
267
+ }
268
+ else if (copyTypes.has(field.type.schema.name)) {
269
+ return `dest.${dstName} = src.${srcName} ? reinterpret_cast<const foxglove_${toSnakeCase(field.type.schema.name)}*>(&*src.${srcName}) : nullptr;`;
270
+ }
271
+ else {
272
+ return `dest.${dstName} = src.${srcName} ? arena.map_one<foxglove_${toSnakeCase(field.type.schema.name)}>(src.${srcName}.value(), ${toCamelCase(field.type.schema.name)}ToC) : nullptr;`;
273
+ }
274
+ }
275
+ });
276
+ }
277
+ function generateCppSchemas(schemas) {
278
+ // Sort by name
279
+ schemas.sort((a, b) => a.name.localeCompare(b.name));
280
+ const copyTypes = new Set(schemas
281
+ .map((schema) => {
282
+ return isSameAsCType(schema) ? schema.name : "";
283
+ })
284
+ .filter((name) => name.length > 0));
285
+ const conversionFuncDecls = schemas.flatMap((schema) => {
286
+ if (isSameAsCType(schema)) {
287
+ return [];
288
+ }
289
+ return [
290
+ `void ${toCamelCase(schema.name)}ToC(foxglove_${toSnakeCase(schema.name)}& dest, const ${schema.name}& src, Arena& arena);`,
291
+ ];
292
+ });
293
+ const traitSpecializations = schemas.filter(shouldGenerateChannel).flatMap((schema) => {
294
+ const snakeName = toSnakeCase(schema.name);
295
+ let conversionCode;
296
+ if (isSameAsCType(schema)) {
297
+ conversionCode = [
298
+ ` return FoxgloveError(foxglove_channel_log_${snakeName}(impl_.get(), reinterpret_cast<const foxglove_${snakeName}*>(&msg), log_time ? &*log_time : nullptr));`,
299
+ ];
300
+ }
301
+ else {
302
+ conversionCode = [
303
+ " Arena arena;",
304
+ ` foxglove_${snakeName} c_msg;`,
305
+ ` ${toCamelCase(schema.name)}ToC(c_msg, msg, arena);`,
306
+ ` return FoxgloveError(foxglove_channel_log_${snakeName}(impl_.get(), &c_msg, log_time ? &*log_time : nullptr));`,
307
+ ];
308
+ }
309
+ return [
310
+ `FoxgloveResult<${schema.name}Channel> ${schema.name}Channel::create(const std::string_view& topic, const Context& context) {`,
311
+ " const foxglove_channel* channel = nullptr;",
312
+ ` foxglove_error error = foxglove_channel_create_${snakeName}({topic.data(), topic.size()}, context.getInner(), &channel);`,
313
+ " if (error != foxglove_error::FOXGLOVE_ERROR_OK || channel == nullptr) {",
314
+ " return tl::unexpected(FoxgloveError(error));",
315
+ " }",
316
+ ` return ${schema.name}Channel(ChannelUniquePtr(channel));`,
317
+ "}\n",
318
+ `FoxgloveError ${schema.name}Channel::log(const ${schema.name}& msg, std::optional<uint64_t> log_time) noexcept {`,
319
+ ...conversionCode,
320
+ "}\n",
321
+ `uint64_t ${schema.name}Channel::id() const noexcept {`,
322
+ " return foxglove_channel_get_id(impl_.get());",
323
+ "}\n\n",
324
+ ];
325
+ });
326
+ const conversionFuncs = schemas.flatMap((schema) => {
327
+ if (isSameAsCType(schema)) {
328
+ return [];
329
+ }
330
+ return [
331
+ `void ${toCamelCase(schema.name)}ToC(foxglove_${toSnakeCase(schema.name)}& dest, const ${schema.name}& src, [[maybe_unused]] Arena& arena) {`,
332
+ ` ${cppToC(schema, copyTypes).join("\n ")}`,
333
+ "}\n",
334
+ ];
335
+ });
336
+ const channelUniquePtr = [
337
+ "void ChannelDeleter::operator()(const foxglove_channel* ptr) const noexcept {",
338
+ " foxglove_channel_free(ptr);",
339
+ "};",
340
+ ];
341
+ const systemIncludes = ["#include <optional>", "#include <cstring>"];
342
+ const includes = [
343
+ "#include <foxglove/error.hpp>",
344
+ "#include <foxglove/schemas.hpp>",
345
+ "#include <foxglove/arena.hpp>",
346
+ "#include <foxglove/context.hpp>",
347
+ ];
348
+ const outputSections = [
349
+ "// Generated by https://github.com/foxglove/foxglove-sdk",
350
+ "#include <foxglove-c/foxglove-c.h>",
351
+ includes.join("\n"),
352
+ systemIncludes.join("\n"),
353
+ "namespace foxglove::schemas {",
354
+ channelUniquePtr.join("\n"),
355
+ conversionFuncDecls.join("\n"),
356
+ traitSpecializations.join("\n"),
357
+ conversionFuncs.join("\n"),
358
+ "} // namespace foxglove::schemas",
359
+ ];
360
+ return outputSections.join("\n\n") + "\n";
361
+ }
362
+ //# sourceMappingURL=generateSdkCpp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generateSdkCpp.js","sourceRoot":"","sources":["../../src/internal/generateSdkCpp.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import { FoxgloveEnumSchema, FoxgloveMessageSchema } from "./types";
2
+ export declare function generateRustTypes(schemas: readonly FoxgloveMessageSchema[], enums: readonly FoxgloveEnumSchema[]): string;
3
+ /**
4
+ * Builds the content of the cbindgen.toml config file, based on a manually-written prelude
5
+ * and export renames for generated schema types.
6
+ */
7
+ export declare function generateBindgenConfig(schemas: readonly FoxgloveMessageSchema[], enums: readonly FoxgloveEnumSchema[], preludeFile: string): Promise<string>;
8
+ //# sourceMappingURL=generateSdkRustCTypes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generateSdkRustCTypes.d.ts","sourceRoot":"","sources":["../../src/internal/generateSdkRustCTypes.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,kBAAkB,EAAE,qBAAqB,EAAqB,MAAM,SAAS,CAAC;AA+DvF,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,SAAS,qBAAqB,EAAE,EACzC,KAAK,EAAE,SAAS,kBAAkB,EAAE,GACnC,MAAM,CAmNR;AAcD;;;GAGG;AACH,wBAAsB,qBAAqB,CACzC,OAAO,EAAE,SAAS,qBAAqB,EAAE,EACzC,KAAK,EAAE,SAAS,kBAAkB,EAAE,EACpC,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,MAAM,CAAC,CAiCjB"}