@me1a/tool-async-api-builder 0.0.0-stage → 0.1.4

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 (66) hide show
  1. package/README.md +79 -2
  2. package/dist/application/build-pipeline.d.ts +11 -0
  3. package/dist/application/build-pipeline.d.ts.map +1 -0
  4. package/dist/application/build-pipeline.js +100 -0
  5. package/dist/application/build-pipeline.js.map +1 -0
  6. package/dist/application/resolve-config.d.ts +11 -0
  7. package/dist/application/resolve-config.d.ts.map +1 -0
  8. package/dist/application/resolve-config.js +31 -0
  9. package/dist/application/resolve-config.js.map +1 -0
  10. package/dist/application/verify-contracts.d.ts +6 -0
  11. package/dist/application/verify-contracts.d.ts.map +1 -0
  12. package/dist/application/verify-contracts.js +69 -0
  13. package/dist/application/verify-contracts.js.map +1 -0
  14. package/dist/cli/main.d.ts +3 -0
  15. package/dist/cli/main.d.ts.map +1 -0
  16. package/dist/cli/main.js +91 -0
  17. package/dist/cli/main.js.map +1 -0
  18. package/dist/domain/schema-routing.d.ts +8 -0
  19. package/dist/domain/schema-routing.d.ts.map +1 -0
  20. package/dist/domain/schema-routing.js +23 -0
  21. package/dist/domain/schema-routing.js.map +1 -0
  22. package/dist/domain/types.d.ts +56 -0
  23. package/dist/domain/types.d.ts.map +1 -0
  24. package/dist/domain/types.js +2 -0
  25. package/dist/domain/types.js.map +1 -0
  26. package/dist/index.d.ts +8 -0
  27. package/dist/index.d.ts.map +1 -0
  28. package/dist/index.js +7 -0
  29. package/dist/index.js.map +1 -0
  30. package/dist/infrastructure/buf/buf-config.d.ts +7 -0
  31. package/dist/infrastructure/buf/buf-config.d.ts.map +1 -0
  32. package/dist/infrastructure/buf/buf-config.js +109 -0
  33. package/dist/infrastructure/buf/buf-config.js.map +1 -0
  34. package/dist/infrastructure/export-json-schema.d.ts +6 -0
  35. package/dist/infrastructure/export-json-schema.d.ts.map +1 -0
  36. package/dist/infrastructure/export-json-schema.js +40 -0
  37. package/dist/infrastructure/export-json-schema.js.map +1 -0
  38. package/dist/infrastructure/export-yaml.d.ts +6 -0
  39. package/dist/infrastructure/export-yaml.d.ts.map +1 -0
  40. package/dist/infrastructure/export-yaml.js +41 -0
  41. package/dist/infrastructure/export-yaml.js.map +1 -0
  42. package/dist/infrastructure/generate-proto.d.ts +5 -0
  43. package/dist/infrastructure/generate-proto.d.ts.map +1 -0
  44. package/dist/infrastructure/generate-proto.js +367 -0
  45. package/dist/infrastructure/generate-proto.js.map +1 -0
  46. package/dist/infrastructure/generate-sdk.d.ts +6 -0
  47. package/dist/infrastructure/generate-sdk.d.ts.map +1 -0
  48. package/dist/infrastructure/generate-sdk.js +209 -0
  49. package/dist/infrastructure/generate-sdk.js.map +1 -0
  50. package/dist/infrastructure/load-contracts.d.ts +5 -0
  51. package/dist/infrastructure/load-contracts.d.ts.map +1 -0
  52. package/dist/infrastructure/load-contracts.js +39 -0
  53. package/dist/infrastructure/load-contracts.js.map +1 -0
  54. package/dist/infrastructure/templates/native-ws-ts.d.ts +7 -0
  55. package/dist/infrastructure/templates/native-ws-ts.d.ts.map +1 -0
  56. package/dist/infrastructure/templates/native-ws-ts.js +334 -0
  57. package/dist/infrastructure/templates/native-ws-ts.js.map +1 -0
  58. package/dist/infrastructure/templates/nats-rust.d.ts +7 -0
  59. package/dist/infrastructure/templates/nats-rust.d.ts.map +1 -0
  60. package/dist/infrastructure/templates/nats-rust.js +345 -0
  61. package/dist/infrastructure/templates/nats-rust.js.map +1 -0
  62. package/dist/infrastructure/templates/nats-ts.d.ts +5 -0
  63. package/dist/infrastructure/templates/nats-ts.d.ts.map +1 -0
  64. package/dist/infrastructure/templates/nats-ts.js +200 -0
  65. package/dist/infrastructure/templates/nats-ts.js.map +1 -0
  66. package/package.json +68 -4
@@ -0,0 +1,345 @@
1
+ const RUST_KEYWORDS = new Set([
2
+ "as",
3
+ "break",
4
+ "const",
5
+ "continue",
6
+ "crate",
7
+ "else",
8
+ "enum",
9
+ "extern",
10
+ "false",
11
+ "fn",
12
+ "for",
13
+ "if",
14
+ "impl",
15
+ "in",
16
+ "let",
17
+ "loop",
18
+ "match",
19
+ "mod",
20
+ "move",
21
+ "mut",
22
+ "pub",
23
+ "ref",
24
+ "return",
25
+ "self",
26
+ "Self",
27
+ "static",
28
+ "struct",
29
+ "super",
30
+ "trait",
31
+ "true",
32
+ "type",
33
+ "unsafe",
34
+ "use",
35
+ "where",
36
+ "while",
37
+ "async",
38
+ "await",
39
+ "dyn",
40
+ "abstract",
41
+ "become",
42
+ "box",
43
+ "do",
44
+ "final",
45
+ "macro",
46
+ "override",
47
+ "priv",
48
+ "typeof",
49
+ "unsized",
50
+ "virtual",
51
+ "yield",
52
+ "try",
53
+ ]);
54
+ function jsonNameToSnakeCase(jsonName) {
55
+ return jsonName
56
+ .replace(/([A-Z]+)([A-Z][a-z])/g, "$1_$2")
57
+ .replace(/([a-z0-9])([A-Z])/g, "$1_$2")
58
+ .toLowerCase();
59
+ }
60
+ function toRustFnIdent(camelOrPascal) {
61
+ return jsonNameToSnakeCase(camelOrPascal).replace(/[^a-z0-9_]/g, "_");
62
+ }
63
+ function rustFieldIdent(jsonName) {
64
+ const snake = jsonNameToSnakeCase(jsonName);
65
+ if (RUST_KEYWORDS.has(snake)) {
66
+ return `r#${snake}`;
67
+ }
68
+ return snake;
69
+ }
70
+ function jsonSchemaPropType(fieldDef) {
71
+ const t = fieldDef.type;
72
+ const primary = typeof t === "string"
73
+ ? t
74
+ : Array.isArray(t)
75
+ ? (t.find((x) => x !== "null") ?? "string")
76
+ : "string";
77
+ switch (primary) {
78
+ case "string":
79
+ return "String";
80
+ case "integer":
81
+ return "i64";
82
+ case "number":
83
+ return "f64";
84
+ case "boolean":
85
+ return "bool";
86
+ case "array":
87
+ return "Vec<serde_json::Value>";
88
+ case "object":
89
+ return "serde_json::Value";
90
+ default:
91
+ return "serde_json::Value";
92
+ }
93
+ }
94
+ function toPascalCase(str) {
95
+ return str
96
+ .split(/[-._]/)
97
+ .map((word) => word.charAt(0).toUpperCase() + word.slice(1))
98
+ .join("");
99
+ }
100
+ function subjectFnName(channelId) {
101
+ return `subject_${jsonNameToSnakeCase(channelId).replace(/__/g, "_")}`;
102
+ }
103
+ function subjectConstName(channelId) {
104
+ return `SUBJECT_${jsonNameToSnakeCase(channelId).toUpperCase().replace(/__/g, "_")}`;
105
+ }
106
+ function buildRustSubjectExpr(channelId, address) {
107
+ const addressParams = address.match(/\{([^}]+)\}/g)?.map((p) => p.slice(1, -1)) ?? [];
108
+ if (addressParams.length === 0) {
109
+ return {
110
+ paramArgsRust: "",
111
+ subjectExpr: `crate::subjects::${subjectConstName(channelId)}`,
112
+ subjectExprIsString: false,
113
+ };
114
+ }
115
+ const paramList = addressParams
116
+ .map((p) => `${rustFieldIdent(p)}: &str`)
117
+ .join(", ");
118
+ const fnName = subjectFnName(channelId);
119
+ const args = addressParams.map((p) => rustFieldIdent(p)).join(", ");
120
+ return {
121
+ paramArgsRust: paramList,
122
+ subjectExpr: `crate::subjects::${fnName}(${args})`,
123
+ subjectExprIsString: true,
124
+ };
125
+ }
126
+ function getMessageTypeNamesFromOperation(op) {
127
+ return op
128
+ .messages()
129
+ .all()
130
+ .map((m) => m.payload()?.id() ?? "serde_json::Value")
131
+ .join(" | ");
132
+ }
133
+ function primaryMessageRustType(op) {
134
+ const raw = getMessageTypeNamesFromOperation(op);
135
+ if (raw.includes(" | "))
136
+ return raw.split(" | ")[0] ?? "serde_json::Value";
137
+ return raw;
138
+ }
139
+ /** Rust structs from AsyncAPI components.messages (JSON Schema payloads). */
140
+ export function generateRustNatsTypes(doc, _crateIdent) {
141
+ const blocks = [];
142
+ const rawComponents = doc.json?.()?.components;
143
+ const messages = rawComponents?.messages ?? {};
144
+ for (const [msgName, msgDef] of Object.entries(messages)) {
145
+ const schema = msgDef.payload ?? {};
146
+ const properties = schema.properties ?? {};
147
+ const required = new Set(schema.required ?? []);
148
+ const fields = [];
149
+ for (const [fieldName, fieldDef] of Object.entries(properties)) {
150
+ const rustType = jsonSchemaPropType(fieldDef);
151
+ const isRequired = required.has(fieldName);
152
+ const rustField = rustFieldIdent(fieldName);
153
+ const serdeAttr = `#[serde(rename = "${fieldName.replace(/"/g, '\\"')}")]`;
154
+ const desc = fieldDef.description
155
+ ? ` /// ${String(fieldDef.description).replace(/\n/g, " ")}\n`
156
+ : "";
157
+ const fieldRust = isRequired ? `${rustType}` : `Option<${rustType}>`;
158
+ fields.push(`${desc} ${serdeAttr}\n pub ${rustField}: ${fieldRust},`);
159
+ }
160
+ const body = fields.length > 0 ? `\n${fields.join("\n")}\n` : "";
161
+ blocks.push(`/// ${msgName} payload\n#[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)]\npub struct ${msgName} {${body}}\n`);
162
+ }
163
+ return `// Code generated by AsyncAPI — DO NOT EDIT.
164
+
165
+ ${blocks.join("\n")}`;
166
+ }
167
+ export function generateRustNatsSubjects(_spec) {
168
+ const channels = _spec.channels ?? {};
169
+ const constLines = [];
170
+ const funcBlocks = [];
171
+ for (const [name, def] of Object.entries(channels)) {
172
+ if (!def ||
173
+ typeof def !== "object" ||
174
+ !("address" in def) ||
175
+ typeof def.address !== "string") {
176
+ continue;
177
+ }
178
+ const address = def.address;
179
+ const escaped = address.replace(/\\/g, "\\\\").replace(/"/g, '\\"');
180
+ const addressParams = address.match(/\{([^}]+)\}/g)?.map((p) => p.slice(1, -1)) ?? [];
181
+ if (addressParams.length === 0) {
182
+ constLines.push(`/// NATS subject for channel "${name}"\npub const ${subjectConstName(name)}: &str = "${escaped}";`);
183
+ }
184
+ else {
185
+ const params = addressParams
186
+ .map((p) => `${rustFieldIdent(p)}: &str`)
187
+ .join(", ");
188
+ let body = ` let mut template = "${escaped}".to_string();\n`;
189
+ for (const p of addressParams) {
190
+ const id = rustFieldIdent(p);
191
+ body += ` template = template.replace("{${p}}", ${id});\n`;
192
+ }
193
+ body += ` template`;
194
+ funcBlocks.push(`/// Resolves NATS subject pattern for channel "${name}"\npub fn ${subjectFnName(name)}(${params}) -> String {\n${body}\n}\n`);
195
+ }
196
+ }
197
+ const constBlock = constLines.length > 0 ? `${constLines.join("\n\n")}\n\n` : "";
198
+ return `// Code generated by AsyncAPI — DO NOT EDIT.
199
+
200
+ ${constBlock}${funcBlocks.join("\n")}`;
201
+ }
202
+ export function generateRustNatsProducerClient(doc, schemaName) {
203
+ const pascal = toPascalCase(schemaName);
204
+ const structName = `${pascal}ProducerClient`;
205
+ let methods = "";
206
+ for (const op of doc.operations().all()) {
207
+ if (op.action() !== "send")
208
+ continue;
209
+ const chs = op.channels();
210
+ if (chs.length === 0)
211
+ continue;
212
+ if (op.messages().all().length === 0)
213
+ continue;
214
+ const channel = chs.all()[0];
215
+ const channelName = channel.id();
216
+ const address = channel.address() ?? "";
217
+ const opIdRaw = op.id() || `publish${toPascalCase(channelName)}`;
218
+ const opId = toRustFnIdent(opIdRaw);
219
+ const msgType = primaryMessageRustType(op);
220
+ const { paramArgsRust, subjectExpr, subjectExprIsString } = buildRustSubjectExpr(channelName, address);
221
+ const publishCall = subjectExprIsString
222
+ ? `let subj = ${subjectExpr};
223
+ let data = payload.encode_to_vec();
224
+ self.nc.publish(&subj, &data)?;`
225
+ : `let data = payload.encode_to_vec();
226
+ self.nc.publish(${subjectExpr}, &data)?;`;
227
+ const sigParams = paramArgsRust
228
+ ? `&self, payload: &${msgType}, ${paramArgsRust}`
229
+ : `&self, payload: &${msgType}`;
230
+ methods += `
231
+ /// Publishes to channel ${channelName} (${address}).
232
+ pub fn ${opId}(${sigParams}) -> Result<(), Box<dyn std::error::Error + Send + Sync>> {
233
+ ${publishCall}
234
+ Ok(())
235
+ }
236
+ `;
237
+ }
238
+ methods = methods.replace(/^\n+/, "");
239
+ return `// Code generated by AsyncAPI — DO NOT EDIT.
240
+ //
241
+ // \`NatsPublisher\` can be implemented for \`nats::Connection\`, test doubles, etc.
242
+
243
+ use crate::*;
244
+ use prost::Message;
245
+ use std::sync::Arc;
246
+
247
+ /// Publishes raw bytes to a subject.
248
+ pub trait NatsPublisher: Send + Sync {
249
+ fn publish(
250
+ &self,
251
+ subj: &str,
252
+ data: &[u8],
253
+ ) -> Result<(), Box<dyn std::error::Error + Send + Sync>>;
254
+ }
255
+
256
+ /// Sends messages for schema ${schemaName}.
257
+ pub struct ${structName} {
258
+ nc: Arc<dyn NatsPublisher>,
259
+ }
260
+
261
+ impl ${structName} {
262
+ /// Creates a producer client. Pass a \`Arc<dyn NatsPublisher>\` adapter.
263
+ pub fn new(nc: Arc<dyn NatsPublisher>) -> Self {
264
+ Self { nc }
265
+ }
266
+
267
+ ${methods}
268
+ }
269
+ `;
270
+ }
271
+ export function generateRustNatsConsumerClient(doc, schemaName) {
272
+ const pascal = toPascalCase(schemaName);
273
+ const structName = `${pascal}ConsumerClient`;
274
+ let methods = "";
275
+ for (const op of doc.operations().all()) {
276
+ if (op.action() !== "receive")
277
+ continue;
278
+ const chs = op.channels();
279
+ if (chs.length === 0)
280
+ continue;
281
+ if (op.messages().all().length === 0)
282
+ continue;
283
+ const channel = chs.all()[0];
284
+ const channelName = channel.id();
285
+ const address = channel.address() ?? "";
286
+ const opIdRaw = op.id() || `subscribe${toPascalCase(channelName)}`;
287
+ const opId = toRustFnIdent(opIdRaw);
288
+ const msgType = primaryMessageRustType(op);
289
+ const { paramArgsRust, subjectExpr, subjectExprIsString } = buildRustSubjectExpr(channelName, address);
290
+ const subjOwned = subjectExprIsString
291
+ ? `let subj_owned = ${subjectExpr};`
292
+ : `let subj_owned = ${subjectExpr}.to_string();`;
293
+ const trailingParams = paramArgsRust ? `, ${paramArgsRust}` : "";
294
+ methods += `
295
+ /// Subscribes to channel ${channelName} (${address}). Callback receives decoded payload.
296
+ pub fn ${opId}<F>(
297
+ &self,
298
+ callback: F${trailingParams},
299
+ ) -> Result<Box<dyn Fn() -> Result<(), Box<dyn std::error::Error + Send + Sync>> + Send + Sync>, Box<dyn std::error::Error + Send + Sync>>
300
+ where
301
+ F: Fn(${msgType}) -> Result<(), Box<dyn std::error::Error + Send + Sync>> + Send + Sync + 'static,
302
+ {
303
+ ${subjOwned}
304
+ self.sub.subscribe(&subj_owned, Box::new(move |b| {
305
+ let out = ${msgType}::decode(&b[..])?;
306
+ callback(out)
307
+ }))
308
+ }
309
+ `;
310
+ }
311
+ methods = methods.replace(/^\n+/, "");
312
+ return `// Code generated by AsyncAPI — DO NOT EDIT.
313
+ //
314
+ // \`NatsSubscribePort\` adapts your NATS subscribe API (e.g. wrap \`nats::Connection::subscribe\`).
315
+
316
+ use crate::*;
317
+ use prost::Message;
318
+ use std::sync::Arc;
319
+
320
+ pub type RawUnsubscribe = Box<dyn Fn() -> Result<(), Box<dyn std::error::Error + Send + Sync>> + Send + Sync>;
321
+
322
+ /// Registers a handler for a subject; returns unsubscribe.
323
+ pub trait NatsSubscribePort: Send + Sync {
324
+ fn subscribe(
325
+ &self,
326
+ subj: &str,
327
+ handler: Box<dyn Fn(Vec<u8>) -> Result<(), Box<dyn std::error::Error + Send + Sync>> + Send + Sync>,
328
+ ) -> Result<RawUnsubscribe, Box<dyn std::error::Error + Send + Sync>>;
329
+ }
330
+
331
+ /// Receives messages for schema ${schemaName}.
332
+ pub struct ${structName} {
333
+ sub: Arc<dyn NatsSubscribePort>,
334
+ }
335
+
336
+ impl ${structName} {
337
+ pub fn new(sub: Arc<dyn NatsSubscribePort>) -> Self {
338
+ Self { sub }
339
+ }
340
+
341
+ ${methods}
342
+ }
343
+ `;
344
+ }
345
+ //# sourceMappingURL=nats-rust.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nats-rust.js","sourceRoot":"","sources":["../../../src/infrastructure/templates/nats-rust.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import type { AsyncAPIDocumentInterface } from "@asyncapi/parser";
2
+ export declare function generateNatsSubjects(spec: Record<string, unknown>): string;
3
+ export declare function generateNatsProducerClient(doc: AsyncAPIDocumentInterface, schemaName: string, typeNames: string[]): string;
4
+ export declare function generateNatsConsumerClient(doc: AsyncAPIDocumentInterface, schemaName: string, typeNames: string[]): string;
5
+ //# sourceMappingURL=nats-ts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nats-ts.d.ts","sourceRoot":"","sources":["../../../src/infrastructure/templates/nats-ts.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,yBAAyB,EAE1B,MAAM,kBAAkB,CAAC;AAsD1B,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CA2B1E;AAED,wBAAgB,0BAA0B,CACxC,GAAG,EAAE,yBAAyB,EAC9B,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,EAAE,GAClB,MAAM,CAkER;AAED,wBAAgB,0BAA0B,CACxC,GAAG,EAAE,yBAAyB,EAC9B,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,EAAE,GAClB,MAAM,CAoFR"}
@@ -0,0 +1,200 @@
1
+ function toPascalCase(str) {
2
+ return str
3
+ .split(/[-._]/)
4
+ .map((word) => word.charAt(0).toUpperCase() + word.slice(1))
5
+ .join("");
6
+ }
7
+ function protoPkgFromSchemaName(schemaName) {
8
+ return schemaName.replace(/[-.]/g, "_");
9
+ }
10
+ function getMessageTypeNamesFromOperation(op) {
11
+ return op
12
+ .messages()
13
+ .all()
14
+ .map((m) => m.payload()?.id() ?? "unknown")
15
+ .join(" | ");
16
+ }
17
+ function primaryPayloadSchemaName(op) {
18
+ const raw = getMessageTypeNamesFromOperation(op);
19
+ if (raw.includes(" | "))
20
+ return raw.split(" | ")[0] ?? "unknown";
21
+ return raw;
22
+ }
23
+ function buildSubjectContext(channelId, address) {
24
+ const addressParams = address.match(/\{([^}]+)\}/g)?.map((p) => p.slice(1, -1)) ?? [];
25
+ const paramArgs = addressParams.length > 0
26
+ ? addressParams.map((p) => `${p}: string`).join(", ")
27
+ : "";
28
+ let subjectExpr = `Subjects.${channelId}`;
29
+ if (addressParams.length > 0) {
30
+ let interpolated = `(Subjects.${channelId} as string)`;
31
+ for (const p of addressParams) {
32
+ interpolated = `${interpolated}.replace("{${p}}", ${p})`;
33
+ }
34
+ subjectExpr = interpolated;
35
+ }
36
+ return { addressParams, paramArgs, subjectExpr };
37
+ }
38
+ export function generateNatsSubjects(spec) {
39
+ const channels = spec.channels ?? {};
40
+ const entries = [];
41
+ for (const [name, def] of Object.entries(channels)) {
42
+ if (def &&
43
+ typeof def === "object" &&
44
+ "address" in def &&
45
+ typeof def.address === "string") {
46
+ entries.push([name, def.address]);
47
+ }
48
+ }
49
+ const body = entries.map(([k, v]) => ` ${k}: "${v}",`).join("\n");
50
+ return `/**
51
+ * This file was automatically generated.
52
+ * DO NOT MODIFY IT MANUALLY.
53
+ */
54
+
55
+ export const Subjects = {
56
+ ${body}
57
+ } as const;
58
+ `;
59
+ }
60
+ export function generateNatsProducerClient(doc, schemaName, typeNames) {
61
+ const pascal = toPascalCase(schemaName);
62
+ const className = `${pascal}ProducerClient`;
63
+ const typeImports = typeNames.join(", ");
64
+ const protoPkg = protoPkgFromSchemaName(schemaName);
65
+ const pbFile = `./${protoPkg}_pb.js`;
66
+ const schemaImports = typeNames.map((t) => `${t}Schema`).join(", ");
67
+ let methods = "";
68
+ for (const op of doc.operations().all()) {
69
+ if (op.action() !== "send")
70
+ continue;
71
+ const chs = op.channels();
72
+ if (chs.length === 0)
73
+ continue;
74
+ if (op.messages().all().length === 0)
75
+ continue;
76
+ const channel = chs.all()[0];
77
+ const channelName = channel.id();
78
+ const address = channel.address() ?? "";
79
+ const opId = op.id() || `publish${toPascalCase(channelName)}`;
80
+ const messageNames = getMessageTypeNamesFromOperation(op);
81
+ const schemaName0 = primaryPayloadSchemaName(op);
82
+ const { paramArgs, subjectExpr } = buildSubjectContext(channelName, address);
83
+ methods += `
84
+ /**
85
+ * Publish to NATS subject for ${channelName} (${address}).
86
+ */
87
+ ${opId}(payload: ${messageNames}${paramArgs ? `, ${paramArgs}` : ""}): void {
88
+ this.nc.publish(
89
+ ${subjectExpr},
90
+ toBinary(${schemaName0}Schema, payload as never)
91
+ );
92
+ }
93
+ `;
94
+ }
95
+ methods = methods.replace(/^\n+/, "");
96
+ return `/**
97
+ * This file was automatically generated.
98
+ * DO NOT MODIFY IT MANUALLY.
99
+ *
100
+ * Producer (publish) client for NATS Core (protobuf wire format).
101
+ * Inject a connected NatsConnection from the nats package; this SDK does not manage connections.
102
+ */
103
+
104
+ import type { NatsConnection } from "nats";
105
+ import { toBinary } from "@bufbuild/protobuf";
106
+ import { ${schemaImports} } from "${pbFile}";
107
+
108
+ import type { ${typeImports} } from "./types.js";
109
+ import { Subjects } from "./subjects.js";
110
+
111
+ export type { ${typeImports} };
112
+ export { Subjects };
113
+
114
+ export class ${className} {
115
+ constructor(private readonly nc: NatsConnection) {}
116
+
117
+ ${methods}
118
+ }
119
+ `;
120
+ }
121
+ export function generateNatsConsumerClient(doc, schemaName, typeNames) {
122
+ const pascal = toPascalCase(schemaName);
123
+ const className = `${pascal}ConsumerClient`;
124
+ const typeImports = typeNames.join(", ");
125
+ const protoPkg = protoPkgFromSchemaName(schemaName);
126
+ const pbFile = `./${protoPkg}_pb.js`;
127
+ const schemaImports = typeNames.map((t) => `${t}Schema`).join(", ");
128
+ let methods = "";
129
+ for (const op of doc.operations().all()) {
130
+ if (op.action() !== "receive")
131
+ continue;
132
+ const chs = op.channels();
133
+ if (chs.length === 0)
134
+ continue;
135
+ if (op.messages().all().length === 0)
136
+ continue;
137
+ const channel = chs.all()[0];
138
+ const channelName = channel.id();
139
+ const address = channel.address() ?? "";
140
+ const opId = op.id() || `subscribe${toPascalCase(channelName)}`;
141
+ const messageNames = getMessageTypeNamesFromOperation(op);
142
+ const schemaName0 = primaryPayloadSchemaName(op);
143
+ const { paramArgs, subjectExpr } = buildSubjectContext(channelName, address);
144
+ const paramList = paramArgs ? `, ${paramArgs}` : "";
145
+ methods += `
146
+ /**
147
+ * Subscribe to NATS subject for ${channelName} (${address}).
148
+ * Returns the Subscription so callers can drain() / unsubscribe().
149
+ */
150
+ ${opId}(
151
+ callback: (data: ${messageNames}, msg: Msg) => void | Promise<void>${paramList},
152
+ options?: { queue?: string }
153
+ ): Subscription {
154
+ const subOpts: SubscriptionOptions = {};
155
+ if (options?.queue) subOpts.queue = options.queue;
156
+
157
+ const sub = this.nc.subscribe(${subjectExpr}, subOpts);
158
+ void (async (): Promise<void> => {
159
+ for await (const m of sub) {
160
+ try {
161
+ const decoded = fromBinary(${schemaName0}Schema, m.data);
162
+ await callback(decoded, m);
163
+ } catch (e) {
164
+ console.error("Failed to handle NATS message on ${channelName}", e);
165
+ }
166
+ }
167
+ })().catch((err: unknown) => {
168
+ console.error("NATS subscriber loop ended with error on ${channelName}", err);
169
+ });
170
+ return sub;
171
+ }
172
+ `;
173
+ }
174
+ methods = methods.replace(/^\n+/, "");
175
+ return `/**
176
+ * This file was automatically generated.
177
+ * DO NOT MODIFY IT MANUALLY.
178
+ *
179
+ * Consumer (subscribe) client for NATS Core (protobuf wire format).
180
+ * Inject a connected NatsConnection from the nats package; this SDK does not manage connections.
181
+ */
182
+
183
+ import type { Msg, NatsConnection, Subscription, SubscriptionOptions } from "nats";
184
+ import { fromBinary } from "@bufbuild/protobuf";
185
+ import { ${schemaImports} } from "${pbFile}";
186
+
187
+ import type { ${typeImports} } from "./types.js";
188
+ import { Subjects } from "./subjects.js";
189
+
190
+ export type { ${typeImports} };
191
+ export { Subjects };
192
+
193
+ export class ${className} {
194
+ constructor(private readonly nc: NatsConnection) {}
195
+
196
+ ${methods}
197
+ }
198
+ `;
199
+ }
200
+ //# sourceMappingURL=nats-ts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nats-ts.js","sourceRoot":"","sources":["../../../src/infrastructure/templates/nats-ts.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,70 @@
1
1
  {
2
2
  "name": "@me1a/tool-async-api-builder",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
6
- }
3
+ "version": "0.1.4",
4
+ "description": "Generic AsyncAPI 3.x contract verification and SDK builder (TypeScript + Rust, NATS + WebSocket)",
5
+ "type": "module",
6
+ "main": "./dist/index.js",
7
+ "types": "./dist/index.d.ts",
8
+ "bin": {
9
+ "async-api-builder": "dist/cli/main.js"
10
+ },
11
+ "exports": {
12
+ ".": {
13
+ "types": "./dist/index.d.ts",
14
+ "default": "./dist/index.js"
15
+ }
16
+ },
17
+ "files": [
18
+ "dist",
19
+ "README.md"
20
+ ],
21
+ "scripts": {
22
+ "build": "tsc -p tsconfig.build.json",
23
+ "type-check": "tsc -p tsconfig.build.json --noEmit",
24
+ "test:unit": "NODE_OPTIONS=--experimental-vm-modules node --experimental-vm-modules node_modules/jest/bin/jest.js --config jest.config.js",
25
+ "test": "yarn run test:unit",
26
+ "prepare": "yarn run build",
27
+ "prepublishOnly": "yarn run build",
28
+ "release": "node scripts/release.mjs",
29
+ "release:patch": "node scripts/release.mjs patch",
30
+ "release:minor": "node scripts/release.mjs minor",
31
+ "release:major": "node scripts/release.mjs major"
32
+ },
33
+ "engines": {
34
+ "node": ">26.13.0"
35
+ },
36
+ "keywords": [
37
+ "asyncapi",
38
+ "sdk",
39
+ "nats",
40
+ "protobuf",
41
+ "codegen"
42
+ ],
43
+ "license": "MIT",
44
+ "publishConfig": {
45
+ "access": "public"
46
+ },
47
+ "dependencies": {
48
+ "@asyncapi/parser": "^3.6.6",
49
+ "js-yaml": "^4.1.1"
50
+ },
51
+ "devDependencies": {
52
+ "@bufbuild/buf": "^1.47.2",
53
+ "@bufbuild/protoc-gen-es": "2.13.0",
54
+ "@types/jest": "^29.5.14",
55
+ "@types/js-yaml": "^4.0.9",
56
+ "@types/node": "^22.15.3",
57
+ "jest": "^29.7.0",
58
+ "ts-jest": "^29.2.5",
59
+ "tsx": "^4.21.0",
60
+ "typescript": "^5.8.3"
61
+ },
62
+ "peerDependencies": {
63
+ "@bufbuild/protobuf": "^2.13.0"
64
+ },
65
+ "peerDependenciesMeta": {
66
+ "@bufbuild/protobuf": {
67
+ "optional": true
68
+ }
69
+ }
70
+ }