typespec-rust-emitter 0.10.7 → 0.12.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.
@@ -1,6 +1,6 @@
1
1
  import { strictEqual } from "node:assert";
2
2
  import { describe, it } from "node:test";
3
- import { emit } from "./test-host.js";
3
+ import { emit, emitWithDiagnostics } from "./test-host.js";
4
4
  describe("Rust emitter", () => {
5
5
  it("emits basic model", async () => {
6
6
  const results = await emit(`
@@ -371,5 +371,135 @@ describe("Rust emitter", () => {
371
371
  strictEqual(server.includes("axum::response::Response"), true);
372
372
  strictEqual(server.includes("EventsStreamResponse::Ok(body) => body.into_response(),"), true);
373
373
  });
374
+ it("uses &self by default in trait methods", async () => {
375
+ const results = await emit(`
376
+ import "@typespec/http";
377
+ import "typespec-rust-emitter";
378
+ using TypeSpec.Http;
379
+
380
+ @route("/test")
381
+ namespace Test {
382
+ @get
383
+ op getItem(): { @statusCode status: 200; @body body: string };
384
+ }
385
+ `);
386
+ const server = results["server.rs"];
387
+ strictEqual(server.includes("async fn test_get_item(&self)"), true);
388
+ });
389
+ it("uses &mut self with @rustMut decorator", async () => {
390
+ const results = await emit(`
391
+ import "@typespec/http";
392
+ import "typespec-rust-emitter";
393
+ using TypeSpec.Http;
394
+
395
+ @route("/test")
396
+ namespace Test {
397
+ @rustMut
398
+ @post
399
+ op createItem(@body name: string): { @statusCode status: 200; @body body: string };
400
+ }
401
+ `);
402
+ const server = results["server.rs"];
403
+ strictEqual(server.includes("test_create_item(&mut self,"), true);
404
+ });
405
+ it("uses self with @rustOwn decorator", async () => {
406
+ const results = await emit(`
407
+ import "@typespec/http";
408
+ import "typespec-rust-emitter";
409
+ using TypeSpec.Http;
410
+
411
+ @route("/test")
412
+ namespace Test {
413
+ @rustOwn
414
+ @delete
415
+ op deleteItem(): { @statusCode status: 200; @body body: string };
416
+ }
417
+ `);
418
+ const server = results["server.rs"];
419
+ strictEqual(server.includes("test_delete_item(self)"), true);
420
+ });
421
+ it("@rustMut works with protected routes", async () => {
422
+ const results = await emit(`
423
+ import "@typespec/http";
424
+ import "typespec-rust-emitter";
425
+ using TypeSpec.Http;
426
+
427
+ @route("/test")
428
+ namespace Test {
429
+ @rustMut
430
+ @post
431
+ op createItem(@body name: string, @header Authorization: string): { @statusCode status: 200; @body body: string };
432
+ }
433
+ `);
434
+ const server = results["server.rs"];
435
+ strictEqual(server.includes("test_create_item(&mut self,"), true);
436
+ });
437
+ it("@rustOwn works with protected routes", async () => {
438
+ const results = await emit(`
439
+ import "@typespec/http";
440
+ import "typespec-rust-emitter";
441
+ using TypeSpec.Http;
442
+
443
+ @route("/test")
444
+ namespace Test {
445
+ @rustOwn
446
+ @delete
447
+ op deleteItem(@query id: string): { @statusCode status: 200; @body body: string };
448
+ }
449
+ `);
450
+ const server = results["server.rs"];
451
+ strictEqual(server.includes("test_delete_item(self,"), true);
452
+ });
453
+ it("reports error when @rustMut is applied to non-operation", async () => {
454
+ const [, diagnostics] = await emitWithDiagnostics(`
455
+ import "@typespec/http";
456
+ import "typespec-rust-emitter";
457
+ using TypeSpec.Http;
458
+
459
+ @rustMut
460
+ model Test {
461
+ name: string;
462
+ }
463
+ `);
464
+ const hasError = diagnostics.some((d) => d.code === "decorator-wrong-target");
465
+ strictEqual(hasError, true);
466
+ });
467
+ it("reports error when @rustOwn is applied to non-operation", async () => {
468
+ const [, diagnostics] = await emitWithDiagnostics(`
469
+ import "@typespec/http";
470
+ import "typespec-rust-emitter";
471
+ using TypeSpec.Http;
472
+
473
+ @rustOwn
474
+ model Test {
475
+ name: string;
476
+ }
477
+ `);
478
+ const hasError = diagnostics.some((d) => d.code === "decorator-wrong-target");
479
+ strictEqual(hasError, true);
480
+ });
481
+ it("emits multipartBody with Multipart extractor", async () => {
482
+ const results = await emit(`
483
+ import "@typespec/http";
484
+ using TypeSpec.Http;
485
+
486
+ @route("/upload")
487
+ namespace Upload {
488
+ @post
489
+ op uploadFile(
490
+ @path accountId: string,
491
+ @multipartBody body: {
492
+ image: HttpPart<File>,
493
+ },
494
+ ): {
495
+ @statusCode statusCode: 201;
496
+ @body body: string;
497
+ };
498
+ }
499
+ `);
500
+ const server = results["server.rs"];
501
+ strictEqual(server.includes("multipart: axum::extract::Multipart,"), true);
502
+ strictEqual(server.includes("body: Multipart"), true);
503
+ });
374
504
  });
375
505
  //# sourceMappingURL=hello.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"hello.test.js","sourceRoot":"","sources":["../../test/hello.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AAEtC,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE;IAC5B,EAAE,CAAC,mBAAmB,EAAE,KAAK,IAAI,EAAE;QACjC,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC;;;;;KAK1B,CAAC,CAAC;QACH,MAAM,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;QACnC,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,iBAAiB,CAAC,EAAE,IAAI,CAAC,CAAC;QACtD,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,mBAAmB,CAAC,EAAE,IAAI,CAAC,CAAC;QACxD,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,eAAe,CAAC,EAAE,IAAI,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2BAA2B,EAAE,KAAK,IAAI,EAAE;QACzC,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC;;;;;;KAM1B,CAAC,CAAC;QACH,MAAM,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;QACnC,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,gCAAgC,CAAC,EAAE,IAAI,CAAC,CAAC;QACrE,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,yBAAyB,CAAC,EAAE,IAAI,CAAC,CAAC;QAC9D,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,iCAAiC,CAAC,EAAE,IAAI,CAAC,CAAC;QACtE,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,kCAAkC,CAAC,EAAE,IAAI,CAAC,CAAC;QACvE,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,6BAA6B,CAAC,EAAE,IAAI,CAAC,CAAC;QAClE,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,+BAA+B,CAAC,EAAE,IAAI,CAAC,CAAC;QACpE,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,wBAAwB,CAAC,EAAE,IAAI,CAAC,CAAC;IAC/D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mBAAmB,EAAE,KAAK,IAAI,EAAE;QACjC,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC;;;;;;KAM1B,CAAC,CAAC;QACH,MAAM,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;QACnC,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,iBAAiB,CAAC,EAAE,IAAI,CAAC,CAAC;QACtD,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,6BAA6B,CAAC,EAAE,IAAI,CAAC,CAAC;QAClE,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,IAAI,CAAC,CAAC;QAC9C,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,IAAI,CAAC,CAAC;QAChD,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,IAAI,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iDAAiD,EAAE,KAAK,IAAI,EAAE;QAC/D,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC;;;;KAI1B,CAAC,CAAC;QACH,MAAM,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;QACnC,MAAM,yBAAyB,GAAG,MAAM,CAAC,QAAQ,CAAC,iBAAiB,CAAC,CAAC;QACrE,WAAW,CAAC,yBAAyB,EAAE,KAAK,CAAC,CAAC;IAChD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oBAAoB,EAAE,KAAK,IAAI,EAAE;QAClC,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC;;;;;;KAM1B,CAAC,CAAC;QACH,MAAM,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;QACnC,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,mBAAmB,CAAC,EAAE,IAAI,CAAC,CAAC;QACxD,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,IAAI,CAAC,CAAC;QAC/C,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,IAAI,CAAC,CAAC;QAClD,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,IAAI,CAAC,CAAC;IAClD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qBAAqB,EAAE,KAAK,IAAI,EAAE;QACnC,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC;;;;;;;;;;KAU1B,CAAC,CAAC;QACH,MAAM,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;QACnC,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,oBAAoB,CAAC,EAAE,IAAI,CAAC,CAAC;QACzD,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,iBAAiB,CAAC,EAAE,IAAI,CAAC,CAAC;QACtD,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,uBAAuB,CAAC,EAAE,IAAI,CAAC,CAAC;IAC9D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8BAA8B,EAAE,KAAK,IAAI,EAAE;QAC5C,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC;;;;KAI1B,CAAC,CAAC;QACH,MAAM,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;QACnC,WAAW,CACT,MAAM,CAAC,QAAQ,CACb,+DAA+D,CAChE,EACD,IAAI,CACL,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qBAAqB,EAAE,KAAK,IAAI,EAAE;QACnC,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC;;;;KAI1B,CAAC,CAAC;QACH,MAAM,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;QACnC,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,yBAAyB,CAAC,EAAE,IAAI,CAAC,CAAC;IAChE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uBAAuB,EAAE,KAAK,IAAI,EAAE;QACrC,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC;;;;KAI1B,CAAC,CAAC;QACH,MAAM,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;QACnC,WAAW,CACT,MAAM,CAAC,QAAQ,CAAC,2CAA2C,CAAC,EAC5D,IAAI,CACL,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gCAAgC,EAAE,KAAK,IAAI,EAAE;QAC9C,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC;;;;KAI1B,CAAC,CAAC;QACH,MAAM,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;QACnC,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,gCAAgC,CAAC,EAAE,IAAI,CAAC,CAAC;QACrE,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,iCAAiC,CAAC,EAAE,IAAI,CAAC,CAAC;IACxE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gCAAgC,EAAE,KAAK,IAAI,EAAE;QAC9C,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC;;;;;;;;KAQ1B,CAAC,CAAC;QACH,MAAM,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;QACnC,WAAW,CACT,MAAM,CAAC,QAAQ,CACb,8EAA8E,CAC/E,EACD,IAAI,CACL,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mDAAmD,EAAE,KAAK,IAAI,EAAE;QACjE,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC;;;;KAI1B,CAAC,CAAC;QACH,MAAM,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;QACnC,WAAW,CACT,MAAM,CAAC,QAAQ,CACb,+DAA+D,CAChE,EACD,IAAI,CACL,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iCAAiC,EAAE,KAAK,IAAI,EAAE;QAC/C,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC;;;;;;;;KAQ1B,CAAC,CAAC;QACH,MAAM,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;QACnC,WAAW,CACT,MAAM,CAAC,QAAQ,CACb,mHAAmH,CACpH,EACD,IAAI,CACL,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2DAA2D,EAAE,KAAK,IAAI,EAAE;QACzE,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC;;;;;;;;KAQ1B,CAAC,CAAC;QACH,MAAM,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;QACnC,WAAW,CACT,MAAM,CAAC,QAAQ,CACb,sIAAsI,CACvI,EACD,IAAI,CACL,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gCAAgC,EAAE,KAAK,IAAI,EAAE;QAC9C,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC;;;;;;;KAO1B,CAAC,CAAC;QACH,MAAM,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;QACnC,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,6BAA6B,CAAC,EAAE,IAAI,CAAC,CAAC;IACpE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kDAAkD,EAAE,KAAK,IAAI,EAAE;QAChE,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC;;;;;;;KAO1B,CAAC,CAAC;QACH,MAAM,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;QACnC,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,6BAA6B,CAAC,EAAE,IAAI,CAAC,CAAC;QAClE,WAAW,CACT,MAAM,CAAC,QAAQ,CAAC,8CAA8C,CAAC,EAC/D,IAAI,CACL,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yCAAyC,EAAE,KAAK,IAAI,EAAE;QACvD,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC;;;;;;;KAO1B,CAAC,CAAC;QACH,MAAM,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;QACnC,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,eAAe,CAAC,EAAE,IAAI,CAAC,CAAC;QACpD,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,mBAAmB,CAAC,EAAE,IAAI,CAAC,CAAC;IAC1D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qDAAqD,EAAE,KAAK,IAAI,EAAE;QACnE,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC;;;;;;;;;;;;;;KAc1B,CAAC,CAAC;QACH,MAAM,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;QACnC,WAAW,CACT,MAAM,CAAC,QAAQ,CACb,8EAA8E,CAC/E,EACD,IAAI,CACL,CAAC;QACF,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,eAAe,CAAC,EAAE,IAAI,CAAC,CAAC;QACpD,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,4BAA4B,CAAC,EAAE,IAAI,CAAC,CAAC;IACnE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+BAA+B,EAAE,KAAK,IAAI,EAAE;QAC7C,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC;;;;;;;;KAQ1B,CAAC,CAAC;QACH,MAAM,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;QACnC,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,qCAAqC,CAAC,EAAE,IAAI,CAAC,CAAC;IAC5E,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iDAAiD,EAAE,KAAK,IAAI,EAAE;QAC/D,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC;;;;;;;;KAQ1B,CAAC,CAAC;QACH,MAAM,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;QACnC,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,iCAAiC,CAAC,EAAE,IAAI,CAAC,CAAC;QACtE,WAAW,CACT,MAAM,CAAC,QAAQ,CAAC,8CAA8C,CAAC,EAC/D,IAAI,CACL,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0DAA0D,EAAE,KAAK,IAAI,EAAE;QACxE,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC;;;;;;;;KAQ1B,CAAC,CAAC;QACH,MAAM,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;QACnC,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,KAAK,CAAC,CAAC;QACxD,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,+BAA+B,CAAC,EAAE,KAAK,CAAC,CAAC;IACvE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kEAAkE,EAAE,KAAK,IAAI,EAAE;QAChF,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC;;;;;;;;;KAS1B,CAAC,CAAC;QACH,MAAM,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;QACnC,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,IAAI,CAAC,CAAC;QACvD,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,+BAA+B,CAAC,EAAE,IAAI,CAAC,CAAC;IACtE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uCAAuC,EAAE,KAAK,IAAI,EAAE;QACrD,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC;;;;;;;;KAQ1B,CAAC,CAAC;QACH,MAAM,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;QACnC,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,gCAAgC,CAAC,EAAE,IAAI,CAAC,CAAC;QACrE,WAAW,CACT,MAAM,CAAC,QAAQ,CAAC,oDAAoD,CAAC,EACrE,IAAI,CACL,CAAC;QACF,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,8BAA8B,CAAC,EAAE,IAAI,CAAC,CAAC;IACrE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wDAAwD,EAAE,KAAK,IAAI,EAAE;QACtE,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC;;;;;;;KAO1B,CAAC,CAAC;QACH,MAAM,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;QACnC,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,gCAAgC,CAAC,EAAE,KAAK,CAAC,CAAC;IACxE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oCAAoC,EAAE,KAAK,IAAI,EAAE;QAClD,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC;;;;;;;;;;;;;;;;;;;;;KAqB1B,CAAC,CAAC;QACH,MAAM,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;QACpC,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,sBAAsB,CAAC,EAAE,IAAI,CAAC,CAAC;QAC3D,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,eAAe,CAAC,EAAE,IAAI,CAAC,CAAC;QACpD,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,IAAI,CAAC,CAAC;QACrD,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,IAAI,CAAC,CAAC;QAClD,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,cAAc,CAAC,EAAE,IAAI,CAAC,CAAC;IACrD,CAAC,CAAC,CAAC;IACH,EAAE,CAAC,0BAA0B,EAAE,KAAK,IAAI,EAAE;QACxC,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC;;;;;;;;;;;;;;;;;;;;;KAqB1B,CAAC,CAAC;QACH,MAAM,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;QACpC,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,0BAA0B,CAAC,EAAE,IAAI,CAAC,CAAC;QAC/D,WAAW,CACT,MAAM,CAAC,QAAQ,CACb,yDAAyD,CAC1D,EACD,IAAI,CACL,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"hello.test.js","sourceRoot":"","sources":["../../test/hello.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,EAAE,IAAI,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAE3D,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE;IAC5B,EAAE,CAAC,mBAAmB,EAAE,KAAK,IAAI,EAAE;QACjC,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC;;;;;KAK1B,CAAC,CAAC;QACH,MAAM,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;QACnC,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,iBAAiB,CAAC,EAAE,IAAI,CAAC,CAAC;QACtD,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,mBAAmB,CAAC,EAAE,IAAI,CAAC,CAAC;QACxD,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,eAAe,CAAC,EAAE,IAAI,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2BAA2B,EAAE,KAAK,IAAI,EAAE;QACzC,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC;;;;;;KAM1B,CAAC,CAAC;QACH,MAAM,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;QACnC,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,gCAAgC,CAAC,EAAE,IAAI,CAAC,CAAC;QACrE,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,yBAAyB,CAAC,EAAE,IAAI,CAAC,CAAC;QAC9D,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,iCAAiC,CAAC,EAAE,IAAI,CAAC,CAAC;QACtE,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,kCAAkC,CAAC,EAAE,IAAI,CAAC,CAAC;QACvE,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,6BAA6B,CAAC,EAAE,IAAI,CAAC,CAAC;QAClE,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,+BAA+B,CAAC,EAAE,IAAI,CAAC,CAAC;QACpE,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,wBAAwB,CAAC,EAAE,IAAI,CAAC,CAAC;IAC/D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mBAAmB,EAAE,KAAK,IAAI,EAAE;QACjC,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC;;;;;;KAM1B,CAAC,CAAC;QACH,MAAM,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;QACnC,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,iBAAiB,CAAC,EAAE,IAAI,CAAC,CAAC;QACtD,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,6BAA6B,CAAC,EAAE,IAAI,CAAC,CAAC;QAClE,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,IAAI,CAAC,CAAC;QAC9C,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,IAAI,CAAC,CAAC;QAChD,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,IAAI,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iDAAiD,EAAE,KAAK,IAAI,EAAE;QAC/D,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC;;;;KAI1B,CAAC,CAAC;QACH,MAAM,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;QACnC,MAAM,yBAAyB,GAAG,MAAM,CAAC,QAAQ,CAAC,iBAAiB,CAAC,CAAC;QACrE,WAAW,CAAC,yBAAyB,EAAE,KAAK,CAAC,CAAC;IAChD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oBAAoB,EAAE,KAAK,IAAI,EAAE;QAClC,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC;;;;;;KAM1B,CAAC,CAAC;QACH,MAAM,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;QACnC,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,mBAAmB,CAAC,EAAE,IAAI,CAAC,CAAC;QACxD,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,IAAI,CAAC,CAAC;QAC/C,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,IAAI,CAAC,CAAC;QAClD,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,IAAI,CAAC,CAAC;IAClD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qBAAqB,EAAE,KAAK,IAAI,EAAE;QACnC,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC;;;;;;;;;;KAU1B,CAAC,CAAC;QACH,MAAM,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;QACnC,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,oBAAoB,CAAC,EAAE,IAAI,CAAC,CAAC;QACzD,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,iBAAiB,CAAC,EAAE,IAAI,CAAC,CAAC;QACtD,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,uBAAuB,CAAC,EAAE,IAAI,CAAC,CAAC;IAC9D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8BAA8B,EAAE,KAAK,IAAI,EAAE;QAC5C,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC;;;;KAI1B,CAAC,CAAC;QACH,MAAM,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;QACnC,WAAW,CACT,MAAM,CAAC,QAAQ,CACb,+DAA+D,CAChE,EACD,IAAI,CACL,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qBAAqB,EAAE,KAAK,IAAI,EAAE;QACnC,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC;;;;KAI1B,CAAC,CAAC;QACH,MAAM,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;QACnC,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,yBAAyB,CAAC,EAAE,IAAI,CAAC,CAAC;IAChE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uBAAuB,EAAE,KAAK,IAAI,EAAE;QACrC,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC;;;;KAI1B,CAAC,CAAC;QACH,MAAM,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;QACnC,WAAW,CACT,MAAM,CAAC,QAAQ,CAAC,2CAA2C,CAAC,EAC5D,IAAI,CACL,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gCAAgC,EAAE,KAAK,IAAI,EAAE;QAC9C,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC;;;;KAI1B,CAAC,CAAC;QACH,MAAM,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;QACnC,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,gCAAgC,CAAC,EAAE,IAAI,CAAC,CAAC;QACrE,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,iCAAiC,CAAC,EAAE,IAAI,CAAC,CAAC;IACxE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gCAAgC,EAAE,KAAK,IAAI,EAAE;QAC9C,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC;;;;;;;;KAQ1B,CAAC,CAAC;QACH,MAAM,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;QACnC,WAAW,CACT,MAAM,CAAC,QAAQ,CACb,8EAA8E,CAC/E,EACD,IAAI,CACL,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mDAAmD,EAAE,KAAK,IAAI,EAAE;QACjE,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC;;;;KAI1B,CAAC,CAAC;QACH,MAAM,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;QACnC,WAAW,CACT,MAAM,CAAC,QAAQ,CACb,+DAA+D,CAChE,EACD,IAAI,CACL,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iCAAiC,EAAE,KAAK,IAAI,EAAE;QAC/C,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC;;;;;;;;KAQ1B,CAAC,CAAC;QACH,MAAM,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;QACnC,WAAW,CACT,MAAM,CAAC,QAAQ,CACb,mHAAmH,CACpH,EACD,IAAI,CACL,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2DAA2D,EAAE,KAAK,IAAI,EAAE;QACzE,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC;;;;;;;;KAQ1B,CAAC,CAAC;QACH,MAAM,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;QACnC,WAAW,CACT,MAAM,CAAC,QAAQ,CACb,sIAAsI,CACvI,EACD,IAAI,CACL,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gCAAgC,EAAE,KAAK,IAAI,EAAE;QAC9C,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC;;;;;;;KAO1B,CAAC,CAAC;QACH,MAAM,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;QACnC,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,6BAA6B,CAAC,EAAE,IAAI,CAAC,CAAC;IACpE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kDAAkD,EAAE,KAAK,IAAI,EAAE;QAChE,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC;;;;;;;KAO1B,CAAC,CAAC;QACH,MAAM,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;QACnC,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,6BAA6B,CAAC,EAAE,IAAI,CAAC,CAAC;QAClE,WAAW,CACT,MAAM,CAAC,QAAQ,CAAC,8CAA8C,CAAC,EAC/D,IAAI,CACL,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yCAAyC,EAAE,KAAK,IAAI,EAAE;QACvD,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC;;;;;;;KAO1B,CAAC,CAAC;QACH,MAAM,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;QACnC,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,eAAe,CAAC,EAAE,IAAI,CAAC,CAAC;QACpD,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,mBAAmB,CAAC,EAAE,IAAI,CAAC,CAAC;IAC1D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qDAAqD,EAAE,KAAK,IAAI,EAAE;QACnE,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC;;;;;;;;;;;;;;KAc1B,CAAC,CAAC;QACH,MAAM,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;QACnC,WAAW,CACT,MAAM,CAAC,QAAQ,CACb,8EAA8E,CAC/E,EACD,IAAI,CACL,CAAC;QACF,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,eAAe,CAAC,EAAE,IAAI,CAAC,CAAC;QACpD,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,4BAA4B,CAAC,EAAE,IAAI,CAAC,CAAC;IACnE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+BAA+B,EAAE,KAAK,IAAI,EAAE;QAC7C,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC;;;;;;;;KAQ1B,CAAC,CAAC;QACH,MAAM,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;QACnC,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,qCAAqC,CAAC,EAAE,IAAI,CAAC,CAAC;IAC5E,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iDAAiD,EAAE,KAAK,IAAI,EAAE;QAC/D,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC;;;;;;;;KAQ1B,CAAC,CAAC;QACH,MAAM,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;QACnC,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,iCAAiC,CAAC,EAAE,IAAI,CAAC,CAAC;QACtE,WAAW,CACT,MAAM,CAAC,QAAQ,CAAC,8CAA8C,CAAC,EAC/D,IAAI,CACL,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0DAA0D,EAAE,KAAK,IAAI,EAAE;QACxE,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC;;;;;;;;KAQ1B,CAAC,CAAC;QACH,MAAM,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;QACnC,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,KAAK,CAAC,CAAC;QACxD,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,+BAA+B,CAAC,EAAE,KAAK,CAAC,CAAC;IACvE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kEAAkE,EAAE,KAAK,IAAI,EAAE;QAChF,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC;;;;;;;;;KAS1B,CAAC,CAAC;QACH,MAAM,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;QACnC,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,IAAI,CAAC,CAAC;QACvD,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,+BAA+B,CAAC,EAAE,IAAI,CAAC,CAAC;IACtE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uCAAuC,EAAE,KAAK,IAAI,EAAE;QACrD,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC;;;;;;;;KAQ1B,CAAC,CAAC;QACH,MAAM,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;QACnC,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,gCAAgC,CAAC,EAAE,IAAI,CAAC,CAAC;QACrE,WAAW,CACT,MAAM,CAAC,QAAQ,CAAC,oDAAoD,CAAC,EACrE,IAAI,CACL,CAAC;QACF,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,8BAA8B,CAAC,EAAE,IAAI,CAAC,CAAC;IACrE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wDAAwD,EAAE,KAAK,IAAI,EAAE;QACtE,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC;;;;;;;KAO1B,CAAC,CAAC;QACH,MAAM,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;QACnC,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,gCAAgC,CAAC,EAAE,KAAK,CAAC,CAAC;IACxE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oCAAoC,EAAE,KAAK,IAAI,EAAE;QAClD,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC;;;;;;;;;;;;;;;;;;;;;KAqB1B,CAAC,CAAC;QACH,MAAM,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;QACpC,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,sBAAsB,CAAC,EAAE,IAAI,CAAC,CAAC;QAC3D,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,eAAe,CAAC,EAAE,IAAI,CAAC,CAAC;QACpD,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,IAAI,CAAC,CAAC;QACrD,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,IAAI,CAAC,CAAC;QAClD,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,cAAc,CAAC,EAAE,IAAI,CAAC,CAAC;IACrD,CAAC,CAAC,CAAC;IACH,EAAE,CAAC,0BAA0B,EAAE,KAAK,IAAI,EAAE;QACxC,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC;;;;;;;;;;;;;;;;;;;;;KAqB1B,CAAC,CAAC;QACH,MAAM,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;QACpC,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,0BAA0B,CAAC,EAAE,IAAI,CAAC,CAAC;QAC/D,WAAW,CACT,MAAM,CAAC,QAAQ,CACb,yDAAyD,CAC1D,EACD,IAAI,CACL,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wCAAwC,EAAE,KAAK,IAAI,EAAE;QACtD,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC;;;;;;;;;;KAU1B,CAAC,CAAC;QACH,MAAM,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;QACpC,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,+BAA+B,CAAC,EAAE,IAAI,CAAC,CAAC;IACtE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wCAAwC,EAAE,KAAK,IAAI,EAAE;QACtD,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC;;;;;;;;;;;KAW1B,CAAC,CAAC;QACH,MAAM,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;QACpC,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,6BAA6B,CAAC,EAAE,IAAI,CAAC,CAAC;IACpE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mCAAmC,EAAE,KAAK,IAAI,EAAE;QACjD,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC;;;;;;;;;;;KAW1B,CAAC,CAAC;QACH,MAAM,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;QACpC,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,wBAAwB,CAAC,EAAE,IAAI,CAAC,CAAC;IAC/D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sCAAsC,EAAE,KAAK,IAAI,EAAE;QACpD,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC;;;;;;;;;;;KAW1B,CAAC,CAAC;QACH,MAAM,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;QACpC,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,6BAA6B,CAAC,EAAE,IAAI,CAAC,CAAC;IACpE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sCAAsC,EAAE,KAAK,IAAI,EAAE;QACpD,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC;;;;;;;;;;;KAW1B,CAAC,CAAC;QACH,MAAM,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;QACpC,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,wBAAwB,CAAC,EAAE,IAAI,CAAC,CAAC;IAC/D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yDAAyD,EAAE,KAAK,IAAI,EAAE;QACvE,MAAM,CAAC,EAAE,WAAW,CAAC,GAAG,MAAM,mBAAmB,CAAC;;;;;;;;;KASjD,CAAC,CAAC;QACH,MAAM,QAAQ,GAAG,WAAW,CAAC,IAAI,CAC/B,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,wBAAwB,CAC3C,CAAC;QACF,WAAW,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;IAC9B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yDAAyD,EAAE,KAAK,IAAI,EAAE;QACvE,MAAM,CAAC,EAAE,WAAW,CAAC,GAAG,MAAM,mBAAmB,CAAC;;;;;;;;;KASjD,CAAC,CAAC;QACH,MAAM,QAAQ,GAAG,WAAW,CAAC,IAAI,CAC/B,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,wBAAwB,CAC3C,CAAC;QACF,WAAW,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;IAC9B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8CAA8C,EAAE,KAAK,IAAI,EAAE;QAC5D,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC;;;;;;;;;;;;;;;;;KAiB1B,CAAC,CAAC;QACH,MAAM,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;QACpC,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,sCAAsC,CAAC,EAAE,IAAI,CAAC,CAAC;QAC3E,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,iBAAiB,CAAC,EAAE,IAAI,CAAC,CAAC;IACxD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
package/example/main.tsp CHANGED
@@ -1,6 +1,7 @@
1
1
  import "@typespec/http";
2
2
  import "@typespec/sse";
3
3
  import "@typespec/events";
4
+ import "typespec-rust-emitter";
4
5
 
5
6
  using TypeSpec.Http;
6
7
  using TypeSpec.SSE;
@@ -8,6 +9,9 @@ using TypeSpec.SSE;
8
9
  @service(#{ title: "Demo" })
9
10
  namespace Demo;
10
11
 
12
+ @format("uuid")
13
+ scalar Uuid extends string;
14
+
11
15
  model MyEventData {
12
16
  message: string;
13
17
  }
@@ -31,3 +35,58 @@ namespace Pets {
31
35
  @body body: string[];
32
36
  };
33
37
  }
38
+
39
+ model Item {
40
+ name: string;
41
+ value: int32;
42
+ }
43
+
44
+ @route("/items")
45
+ namespace Items {
46
+ @get
47
+ op getItem(@query id: string): {
48
+ @statusCode status: 200;
49
+ @body body: Item;
50
+ };
51
+
52
+ @rustMut
53
+ @post
54
+ op createItem(@body item: Item): {
55
+ @statusCode status: 201;
56
+ @body body: Item;
57
+ };
58
+
59
+ @rustMut
60
+ @put
61
+ op updateItem(@query id: string, @body item: Item): {
62
+ @statusCode status: 200;
63
+ @body body: Item;
64
+ };
65
+ }
66
+
67
+ @route("/consuming")
68
+ namespace Consuming {
69
+ @rustOwn
70
+ @delete
71
+ op consumeAndDelete(@query id: string): {
72
+ @statusCode status: 204;
73
+ };
74
+
75
+ @post
76
+ op upload(
77
+ @path accountId: Uuid,
78
+ @header `content-type`: "multipart/form-data",
79
+ @multipartBody body: {
80
+ image: HttpPart<File>;
81
+ },
82
+ ): {
83
+ @statusCode statusCode: 201;
84
+ @body body: string;
85
+ } | {
86
+ @statusCode statusCode: 400;
87
+ @body error: string;
88
+ } | {
89
+ @statusCode statusCode: 401;
90
+ @body error: string;
91
+ };
92
+ }
@@ -83,6 +83,7 @@ dependencies = [
83
83
  "matchit",
84
84
  "memchr",
85
85
  "mime",
86
+ "multer",
86
87
  "percent-encoding",
87
88
  "pin-project-lite",
88
89
  "serde_core",
@@ -313,6 +314,15 @@ dependencies = [
313
314
  "serde",
314
315
  ]
315
316
 
317
+ [[package]]
318
+ name = "encoding_rs"
319
+ version = "0.8.35"
320
+ source = "registry+https://github.com/rust-lang/crates.io-index"
321
+ checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3"
322
+ dependencies = [
323
+ "cfg-if",
324
+ ]
325
+
316
326
  [[package]]
317
327
  name = "equivalent"
318
328
  version = "1.0.2"
@@ -947,6 +957,23 @@ dependencies = [
947
957
  "windows-sys 0.61.2",
948
958
  ]
949
959
 
960
+ [[package]]
961
+ name = "multer"
962
+ version = "3.1.0"
963
+ source = "registry+https://github.com/rust-lang/crates.io-index"
964
+ checksum = "83e87776546dc87511aa5ee218730c92b666d7264ab6ed41f9d215af9cd5224b"
965
+ dependencies = [
966
+ "bytes",
967
+ "encoding_rs",
968
+ "futures-util",
969
+ "http",
970
+ "httparse",
971
+ "memchr",
972
+ "mime",
973
+ "spin",
974
+ "version_check",
975
+ ]
976
+
950
977
  [[package]]
951
978
  name = "num-bigint-dig"
952
979
  version = "0.8.6"
@@ -11,7 +11,7 @@ serde_json = "1.0.149"
11
11
  thiserror = "2.0.18"
12
12
  uuid = { version = "1.23.0", features = ["serde", "v4"] }
13
13
  sqlx = { version = "0.8", features = ["runtime-tokio", "postgres", "derive"] }
14
- axum = "0.8.8"
14
+ axum = { version = "0.8.8", features = ["multipart"] }
15
15
  eyre = "0.6"
16
16
  async-trait = "0.1"
17
17
  tokio = { version = "1.50.0", features = ["full"] }
@@ -16,6 +16,11 @@ pub trait Server: Send + Sync {
16
16
 
17
17
  async fn events_accounts_events(&self, account_id: String) -> Result<EventsAccountsEventsResponse>;
18
18
  async fn pets_list(&self, first_query: String, second_query: String) -> Result<PetsListResponse>;
19
+ async fn items_get_item(&self, id: String) -> Result<ItemsGetItemResponse>;
20
+ async fn items_create_item(&mut self, body: Item) -> Result<ItemsCreateItemResponse>;
21
+ async fn items_update_item(&mut self, id: String, body: Item) -> Result<ItemsUpdateItemResponse>;
22
+ async fn consuming_consume_and_delete(self, id: String) -> Result<ConsumingConsumeAndDeleteResponse>;
23
+ async fn consuming_upload(&self, account_id: uuid::Uuid, body: Multipart) -> Result<ConsumingUploadResponse>;
19
24
  }
20
25
  #[allow(clippy::type_complexity)]
21
26
  pub enum EventsAccountsEventsResponse {
@@ -45,8 +50,82 @@ impl IntoResponse for PetsListResponse {
45
50
  }
46
51
  }
47
52
 
48
- use axum::extract::Query;
49
- use axum::routing::{get};
53
+ #[allow(clippy::type_complexity)]
54
+ pub enum ItemsGetItemResponse {
55
+ Ok(Json<Item>),
56
+ }
57
+
58
+ impl IntoResponse for ItemsGetItemResponse {
59
+ fn into_response(self) -> axum::response::Response {
60
+ match self {
61
+
62
+ ItemsGetItemResponse::Ok(body) => (StatusCode::OK, body).into_response(),
63
+ }
64
+ }
65
+ }
66
+
67
+ #[allow(clippy::type_complexity)]
68
+ pub enum ItemsCreateItemResponse {
69
+ Ok(Json<Item>),
70
+ }
71
+
72
+ impl IntoResponse for ItemsCreateItemResponse {
73
+ fn into_response(self) -> axum::response::Response {
74
+ match self {
75
+
76
+ ItemsCreateItemResponse::Ok(body) => (StatusCode::OK, body).into_response(),
77
+ }
78
+ }
79
+ }
80
+
81
+ #[allow(clippy::type_complexity)]
82
+ pub enum ItemsUpdateItemResponse {
83
+ Ok(Json<Item>),
84
+ }
85
+
86
+ impl IntoResponse for ItemsUpdateItemResponse {
87
+ fn into_response(self) -> axum::response::Response {
88
+ match self {
89
+
90
+ ItemsUpdateItemResponse::Ok(body) => (StatusCode::OK, body).into_response(),
91
+ }
92
+ }
93
+ }
94
+
95
+ #[allow(clippy::type_complexity)]
96
+ pub enum ConsumingConsumeAndDeleteResponse {
97
+ Ok,
98
+ }
99
+
100
+ impl IntoResponse for ConsumingConsumeAndDeleteResponse {
101
+ fn into_response(self) -> axum::response::Response {
102
+ match self {
103
+
104
+ ConsumingConsumeAndDeleteResponse::Ok => StatusCode::OK.into_response(),
105
+ }
106
+ }
107
+ }
108
+
109
+ #[allow(clippy::type_complexity)]
110
+ pub enum ConsumingUploadResponse {
111
+ Created(Json<String>),
112
+ BadRequest(Json<String>),
113
+ Unauthorized(Json<String>),
114
+ }
115
+
116
+ impl IntoResponse for ConsumingUploadResponse {
117
+ fn into_response(self) -> axum::response::Response {
118
+ match self {
119
+
120
+ ConsumingUploadResponse::Created(body) => (StatusCode::CREATED, body).into_response(),
121
+ ConsumingUploadResponse::BadRequest(body) => (StatusCode::BAD_REQUEST, body).into_response(),
122
+ ConsumingUploadResponse::Unauthorized(body) => (StatusCode::UNAUTHORIZED, body).into_response(),
123
+ }
124
+ }
125
+ }
126
+
127
+ use axum::extract::{Query, Multipart};
128
+ use axum::routing::{delete, get, post, put};
50
129
  use axum::Router;
51
130
 
52
131
 
@@ -58,6 +137,24 @@ pub struct PetsListQuery {
58
137
  pub second_query: String
59
138
  }
60
139
 
140
+ #[derive(Debug, Clone, serde::Deserialize)]
141
+ pub struct ItemsGetItemQuery {
142
+ #[serde(rename = "id")]
143
+ pub id: String
144
+ }
145
+
146
+ #[derive(Debug, Clone, serde::Deserialize)]
147
+ pub struct ItemsUpdateItemQuery {
148
+ #[serde(rename = "id")]
149
+ pub id: String
150
+ }
151
+
152
+ #[derive(Debug, Clone, serde::Deserialize)]
153
+ pub struct ConsumingConsumeAndDeleteQuery {
154
+ #[serde(rename = "id")]
155
+ pub id: String
156
+ }
157
+
61
158
 
62
159
 
63
160
  pub async fn events_accounts_events_handler<S>(
@@ -65,7 +162,7 @@ pub async fn events_accounts_events_handler<S>(
65
162
  Path(account_id): Path<String>,
66
163
  ) -> impl axum::response::IntoResponse
67
164
  where
68
- S: Server + Clone + Send + Sync + 'static,
165
+ S: Server+ Clone + Send + Sync + 'static,
69
166
  S::Claims: Send + Sync + Clone + 'static,
70
167
  {
71
168
  let result = service.events_accounts_events(account_id).await;
@@ -84,7 +181,7 @@ pub async fn pets_list_handler<S>(
84
181
  Query(params): Query<PetsListQuery>,
85
182
  ) -> impl axum::response::IntoResponse
86
183
  where
87
- S: Server + Clone + Send + Sync + 'static,
184
+ S: Server+ Clone + Send + Sync + 'static,
88
185
  S::Claims: Send + Sync + Clone + 'static,
89
186
  {
90
187
  let result = service.pets_list(params.first_query, params.second_query).await;
@@ -98,6 +195,105 @@ where
98
195
  }
99
196
  }
100
197
 
198
+ pub async fn items_get_item_handler<S>(
199
+ axum::extract::State(service): axum::extract::State<S>,
200
+ Query(params): Query<ItemsGetItemQuery>,
201
+ ) -> impl axum::response::IntoResponse
202
+ where
203
+ S: Server+ Clone + Send + Sync + 'static,
204
+ S::Claims: Send + Sync + Clone + 'static,
205
+ {
206
+ let result = service.items_get_item(params.id).await;
207
+ match result {
208
+ Ok(response) => response.into_response(),
209
+ Err(e) => (
210
+ axum::http::StatusCode::INTERNAL_SERVER_ERROR,
211
+ format!("Internal error: {e}"),
212
+ )
213
+ .into_response(),
214
+ }
215
+ }
216
+
217
+ pub async fn items_create_item_handler<S>(
218
+ axum::extract::State(mut service): axum::extract::State<S>,
219
+ Json(payload): Json<Item>,
220
+ ) -> impl axum::response::IntoResponse
221
+ where
222
+ S: Server+ Clone + Send + Sync + 'static,
223
+ S::Claims: Send + Sync + Clone + 'static,
224
+ {
225
+ let result = service.items_create_item(payload).await;
226
+ match result {
227
+ Ok(response) => response.into_response(),
228
+ Err(e) => (
229
+ axum::http::StatusCode::INTERNAL_SERVER_ERROR,
230
+ format!("Internal error: {e}"),
231
+ )
232
+ .into_response(),
233
+ }
234
+ }
235
+
236
+ pub async fn items_update_item_handler<S>(
237
+ axum::extract::State(mut service): axum::extract::State<S>,
238
+ Query(params): Query<ItemsUpdateItemQuery>,
239
+ Json(payload): Json<Item>,
240
+ ) -> impl axum::response::IntoResponse
241
+ where
242
+ S: Server+ Clone + Send + Sync + 'static,
243
+ S::Claims: Send + Sync + Clone + 'static,
244
+ {
245
+ let result = service.items_update_item(params.id, payload).await;
246
+ match result {
247
+ Ok(response) => response.into_response(),
248
+ Err(e) => (
249
+ axum::http::StatusCode::INTERNAL_SERVER_ERROR,
250
+ format!("Internal error: {e}"),
251
+ )
252
+ .into_response(),
253
+ }
254
+ }
255
+
256
+ // NOTE: consuming_consume_and_delete takes self and cannot be used with the router pattern.
257
+ // It consumes the service, so you need to implement your own handler pattern.
258
+ pub async fn consuming_consume_and_delete_handler<S>(
259
+ axum::extract::State(service): axum::extract::State<S>,
260
+ Query(params): Query<ConsumingConsumeAndDeleteQuery>,
261
+ ) -> impl axum::response::IntoResponse
262
+ where
263
+ S: Server + Send + Sync + 'static,
264
+ S::Claims: Send + Sync + Clone + 'static,
265
+ {
266
+ let result = service.consuming_consume_and_delete(params.id).await;
267
+ match result {
268
+ Ok(response) => response.into_response(),
269
+ Err(e) => (
270
+ axum::http::StatusCode::INTERNAL_SERVER_ERROR,
271
+ format!("Internal error: {e}"),
272
+ )
273
+ .into_response(),
274
+ }
275
+ }
276
+
277
+ pub async fn consuming_upload_handler<S>(
278
+ axum::extract::State(service): axum::extract::State<S>,
279
+ Path(account_id): Path<uuid::Uuid>,
280
+ multipart: axum::extract::Multipart,
281
+ ) -> impl axum::response::IntoResponse
282
+ where
283
+ S: Server+ Clone + Send + Sync + 'static,
284
+ S::Claims: Send + Sync + Clone + 'static,
285
+ {
286
+ let result = service.consuming_upload(account_id, multipart).await;
287
+ match result {
288
+ Ok(response) => response.into_response(),
289
+ Err(e) => (
290
+ axum::http::StatusCode::INTERNAL_SERVER_ERROR,
291
+ format!("Internal error: {e}"),
292
+ )
293
+ .into_response(),
294
+ }
295
+ }
296
+
101
297
  pub fn create_router<S, M>(service: S, middleware: M) -> Router
102
298
  where
103
299
  S: Server + Clone + Send + Sync + 'static,
@@ -108,6 +304,10 @@ where
108
304
  let public = Router::new()
109
305
  .route("/events/{accountId}", get(events_accounts_events_handler::<S>))
110
306
  .route("/pets", get(pets_list_handler::<S>))
307
+ .route("/items", get(items_get_item_handler::<S>))
308
+ .route("/items", post(items_create_item_handler::<S>))
309
+ .route("/items", put(items_update_item_handler::<S>))
310
+ .route("/consuming", post(consuming_upload_handler::<S>))
111
311
  ;
112
312
  router = router.merge(public);
113
313
  router.with_state(service)
@@ -10,9 +10,17 @@ pub struct MyEventData {
10
10
  pub message: String,
11
11
  }
12
12
 
13
+ #[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
14
+ pub struct Item {
15
+ pub name: String,
16
+ pub value: i32,
17
+ }
18
+
13
19
  #[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
14
20
  #[serde(untagged)]
15
21
  pub enum MyEvent {
16
22
  Variant1(MyEventData),
17
23
  }
18
24
 
25
+ pub type Uuid = uuid::Uuid;
26
+
@@ -1,16 +1,19 @@
1
1
  mod generated;
2
2
 
3
3
  use async_trait::async_trait;
4
+ use axum::Json;
4
5
  use axum::response::IntoResponse;
5
6
  use axum::response::sse::{Event, KeepAlive, Sse};
6
- use generated::server::{EventsAccountsEventsResponse, Server};
7
+ use generated::server::{
8
+ ConsumingConsumeAndDeleteResponse, ConsumingUploadResponse, EventsAccountsEventsResponse,
9
+ ItemsCreateItemResponse, ItemsGetItemResponse, ItemsUpdateItemResponse, PetsListResponse,
10
+ Server,
11
+ };
7
12
  use std::convert::Infallible;
8
13
  use std::time::Duration;
9
14
  use tokio::time::interval;
10
15
  use tokio_stream::{StreamExt as _, wrappers::IntervalStream};
11
16
 
12
- use crate::generated::server::PetsListResponse;
13
-
14
17
  #[derive(Clone)]
15
18
  struct AppState;
16
19
 
@@ -24,7 +27,7 @@ impl Server for AppState {
24
27
  ) -> eyre::Result<EventsAccountsEventsResponse> {
25
28
  let stream = IntervalStream::new(interval(Duration::from_millis(100)))
26
29
  .map(|_| Ok::<_, Infallible>(Event::default().data("hi!")))
27
- .take(3); // emit 3 events
30
+ .take(3);
28
31
 
29
32
  let stream = Sse::new(stream).keep_alive(KeepAlive::default());
30
33
  Ok(EventsAccountsEventsResponse::Ok(stream.into_response()))
@@ -35,7 +38,53 @@ impl Server for AppState {
35
38
  _first_query: String,
36
39
  _second_query: String,
37
40
  ) -> eyre::Result<PetsListResponse> {
38
- todo!()
41
+ Ok(PetsListResponse::Ok(Json(vec![
42
+ "pet1".to_string(),
43
+ "pet2".to_string(),
44
+ ])))
45
+ }
46
+
47
+ async fn items_get_item(&self, _id: String) -> eyre::Result<ItemsGetItemResponse> {
48
+ Ok(ItemsGetItemResponse::Ok(Json(generated::types::Item {
49
+ name: "test".to_string(),
50
+ value: 42,
51
+ })))
52
+ }
53
+
54
+ async fn items_create_item(
55
+ &mut self,
56
+ _body: generated::types::Item,
57
+ ) -> eyre::Result<ItemsCreateItemResponse> {
58
+ Ok(ItemsCreateItemResponse::Ok(Json(generated::types::Item {
59
+ name: "created".to_string(),
60
+ value: 0,
61
+ })))
62
+ }
63
+
64
+ async fn items_update_item(
65
+ &mut self,
66
+ _id: String,
67
+ _body: generated::types::Item,
68
+ ) -> eyre::Result<ItemsUpdateItemResponse> {
69
+ Ok(ItemsUpdateItemResponse::Ok(Json(generated::types::Item {
70
+ name: "updated".to_string(),
71
+ value: 1,
72
+ })))
73
+ }
74
+
75
+ async fn consuming_consume_and_delete(
76
+ self,
77
+ _id: String,
78
+ ) -> eyre::Result<ConsumingConsumeAndDeleteResponse> {
79
+ Ok(ConsumingConsumeAndDeleteResponse::Ok)
80
+ }
81
+
82
+ async fn consuming_upload(
83
+ &self,
84
+ _account_id: uuid::Uuid,
85
+ _multipart: axum::extract::Multipart,
86
+ ) -> eyre::Result<ConsumingUploadResponse> {
87
+ Ok(ConsumingUploadResponse::Created(Json("ok".to_string())))
39
88
  }
40
89
  }
41
90
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "typespec-rust-emitter",
3
- "version": "0.10.7",
3
+ "version": "0.12.0",
4
4
  "description": "TypeSpec emitter that generates idiomatic Rust types and structs",
5
5
  "keywords": [
6
6
  "typespec",