@azure-tools/typespec-ts 0.12.0-alpha.20230502.1 → 0.13.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (135) hide show
  1. package/.rush/temp/operation/build/all.log +1 -0
  2. package/.rush/temp/operation/build/state.json +3 -0
  3. package/.rush/temp/package-deps_build.json +104 -78
  4. package/.rush/temp/shrinkwrap-deps.json +488 -471
  5. package/CHANGELOG.md +7 -0
  6. package/dist/src/index.d.ts.map +1 -1
  7. package/dist/src/index.js +2 -1
  8. package/dist/src/index.js.map +1 -1
  9. package/dist/src/modelUtils.d.ts +1 -1
  10. package/dist/src/modelUtils.d.ts.map +1 -1
  11. package/dist/src/modelUtils.js +79 -56
  12. package/dist/src/modelUtils.js.map +1 -1
  13. package/dist/src/operationUtil.d.ts.map +1 -1
  14. package/dist/src/operationUtil.js +7 -6
  15. package/dist/src/operationUtil.js.map +1 -1
  16. package/dist/src/transform/transform.d.ts.map +1 -1
  17. package/dist/src/transform/transform.js +3 -3
  18. package/dist/src/transform/transform.js.map +1 -1
  19. package/dist/src/transform/transformApiVersionInfo.d.ts.map +1 -1
  20. package/dist/src/transform/transformApiVersionInfo.js +3 -3
  21. package/dist/src/transform/transformApiVersionInfo.js.map +1 -1
  22. package/dist/src/transform/transformParameters.d.ts.map +1 -1
  23. package/dist/src/transform/transformParameters.js +23 -29
  24. package/dist/src/transform/transformParameters.js.map +1 -1
  25. package/dist/src/transform/transformPaths.d.ts.map +1 -1
  26. package/dist/src/transform/transformPaths.js +5 -5
  27. package/dist/src/transform/transformPaths.js.map +1 -1
  28. package/dist/src/transform/transformResponses.js +6 -6
  29. package/dist/src/transform/transformResponses.js.map +1 -1
  30. package/dist/src/transform/transformSchemas.js +1 -1
  31. package/dist/src/transform/transformSchemas.js.map +1 -1
  32. package/dist/tsconfig.tsbuildinfo +1 -1
  33. package/package.json +41 -39
  34. package/src/index.ts +2 -0
  35. package/src/modelUtils.ts +143 -47
  36. package/src/operationUtil.ts +4 -3
  37. package/src/transform/transform.ts +10 -2
  38. package/src/transform/transformApiVersionInfo.ts +18 -3
  39. package/src/transform/transformParameters.ts +51 -16
  40. package/src/transform/transformPaths.ts +10 -5
  41. package/src/transform/transformResponses.ts +6 -4
  42. package/src/transform/transformSchemas.ts +1 -1
  43. package/test/integration/azurecore.spec.ts +51 -11
  44. package/test/integration/generated/arrays/itemTypes/src/arrayItemTypesClient.ts +5 -1
  45. package/test/integration/generated/arrays/itemTypes/src/logger.ts +5 -0
  46. package/test/integration/generated/authentication/apiKey/package.json +1 -1
  47. package/test/integration/generated/authentication/apiKey/src/authApiKeyClient.ts +6 -2
  48. package/test/integration/generated/authentication/apiKey/src/logger.ts +5 -0
  49. package/test/integration/generated/authentication/oauth2/src/authOauth2Client.ts +6 -2
  50. package/test/integration/generated/authentication/oauth2/src/logger.ts +5 -0
  51. package/test/integration/generated/authentication/union/src/authUnionClient.ts +6 -2
  52. package/test/integration/generated/authentication/union/src/logger.ts +5 -0
  53. package/test/integration/generated/azure/core/package.json +1 -1
  54. package/test/integration/generated/azure/core/src/azureCoreClient.ts +5 -1
  55. package/test/integration/generated/azure/core/src/logger.ts +5 -0
  56. package/test/integration/generated/azure/core/src/outputModels.ts +7 -1
  57. package/test/integration/generated/azure/core-traits/package.json +1 -1
  58. package/test/integration/generated/azure/core-traits/src/azureCoreTraitsClient.ts +5 -1
  59. package/test/integration/generated/azure/core-traits/src/logger.ts +5 -0
  60. package/test/integration/generated/azure/core-traits/src/outputModels.ts +15 -0
  61. package/test/integration/generated/dictionary/package.json +1 -1
  62. package/test/integration/generated/dictionary/src/dictClient.ts +5 -1
  63. package/test/integration/generated/dictionary/src/logger.ts +5 -0
  64. package/test/integration/generated/enums/extensible/package.json +1 -1
  65. package/test/integration/generated/enums/extensible/src/logger.ts +5 -0
  66. package/test/integration/generated/enums/extensible/src/typeEnumExtensible.ts +5 -1
  67. package/test/integration/generated/enums/fixed/package.json +1 -1
  68. package/test/integration/generated/enums/fixed/src/logger.ts +5 -0
  69. package/test/integration/generated/enums/fixed/src/typeEnumFixed.ts +5 -1
  70. package/test/integration/generated/internal/src/clientDefinitions.ts +38 -12
  71. package/test/integration/generated/internal/src/index.ts +0 -1
  72. package/test/integration/generated/internal/src/internalClient.ts +5 -1
  73. package/test/integration/generated/internal/src/logger.ts +5 -0
  74. package/test/integration/generated/internal/src/outputModels.ts +9 -5
  75. package/test/integration/generated/internal/src/parameters.ts +32 -8
  76. package/test/integration/generated/internal/src/responses.ts +18 -5
  77. package/test/integration/generated/lro/lroCore/package.json +2 -2
  78. package/test/integration/generated/lro/lroCore/src/logger.ts +5 -0
  79. package/test/integration/generated/lro/lroCore/src/specsAzureCoreLroStandard.ts +5 -1
  80. package/test/integration/generated/lro/lroRPC/package.json +2 -2
  81. package/test/integration/generated/lro/lroRPC/src/logger.ts +5 -0
  82. package/test/integration/generated/lro/lroRPC/src/specsAzureCoreLroRpc.ts +5 -1
  83. package/test/integration/generated/models/inheritance/package.json +1 -1
  84. package/test/integration/generated/models/inheritance/src/logger.ts +5 -0
  85. package/test/integration/generated/models/inheritance/src/typeModelInheritance.ts +5 -1
  86. package/test/integration/generated/models/propertyNullable/package.json +1 -1
  87. package/test/integration/generated/models/propertyNullable/src/logger.ts +5 -0
  88. package/test/integration/generated/models/propertyNullable/src/typePropertyNullable.ts +5 -1
  89. package/test/integration/generated/models/propertyOptional/package.json +1 -1
  90. package/test/integration/generated/models/propertyOptional/src/logger.ts +5 -0
  91. package/test/integration/generated/models/propertyOptional/src/typePropertyOptional.ts +5 -1
  92. package/test/integration/generated/models/propertyTypes/package.json +1 -1
  93. package/test/integration/generated/models/propertyTypes/src/clientDefinitions.ts +68 -0
  94. package/test/integration/generated/models/propertyTypes/src/logger.ts +5 -0
  95. package/test/integration/generated/models/propertyTypes/src/models.ts +24 -0
  96. package/test/integration/generated/models/propertyTypes/src/outputModels.ts +24 -0
  97. package/test/integration/generated/models/propertyTypes/src/parameters.ts +40 -0
  98. package/test/integration/generated/models/propertyTypes/src/responses.ts +48 -0
  99. package/test/integration/generated/models/propertyTypes/src/typePropertyValueTypes.ts +5 -1
  100. package/test/integration/generated/models/usage/package.json +1 -1
  101. package/test/integration/generated/models/usage/src/logger.ts +5 -0
  102. package/test/integration/generated/models/usage/src/typeModelUsage.ts +5 -1
  103. package/test/integration/generated/models/visibility/package.json +1 -1
  104. package/test/integration/generated/models/visibility/src/logger.ts +5 -0
  105. package/test/integration/generated/models/visibility/src/typeModelVisibility.ts +5 -1
  106. package/test/integration/generated/parameters/collection-format/src/collectionFormatClient.ts +5 -1
  107. package/test/integration/generated/parameters/collection-format/src/logger.ts +5 -0
  108. package/test/integration/generated/parameters/spread/src/logger.ts +5 -0
  109. package/test/integration/generated/parameters/spread/src/parametersSpread.ts +5 -1
  110. package/test/integration/generated/projection/src/logger.ts +5 -0
  111. package/test/integration/generated/projection/src/projectionClient.ts +5 -1
  112. package/test/integration/generated/resiliency/srvDriven1/package.json +1 -1
  113. package/test/integration/generated/resiliency/srvDriven1/src/logger.ts +5 -0
  114. package/test/integration/generated/resiliency/srvDriven1/src/serviceDrivenOldClient.ts +6 -2
  115. package/test/integration/generated/resiliency/srvDriven2/package.json +1 -1
  116. package/test/integration/generated/resiliency/srvDriven2/src/logger.ts +5 -0
  117. package/test/integration/generated/resiliency/srvDriven2/src/serviceDrivenNewClient.ts +6 -2
  118. package/test/integration/generated/server/path/multiple/src/logger.ts +5 -0
  119. package/test/integration/generated/server/path/multiple/src/multipleParamInServerPathClient.ts +6 -2
  120. package/test/integration/generated/server/path/single/src/logger.ts +5 -0
  121. package/test/integration/generated/server/path/single/src/singleParamInServerPathClient.ts +6 -2
  122. package/test/integration/generated/specialWords/src/logger.ts +5 -0
  123. package/test/integration/generated/specialWords/src/specialWordsClient.ts +5 -1
  124. package/test/integration/generated/unions/src/logger.ts +5 -0
  125. package/test/integration/generated/unions/src/unionsClient.ts +5 -1
  126. package/test/integration/internal.spec.ts +45 -12
  127. package/test/integration/modelPropertyType.spec.ts +16 -0
  128. package/test/integration/resiliencyDpgCustomization.spec.ts +85 -24
  129. package/test/unit/apiVersion.spec.ts +19 -7
  130. package/test/unit/clientFactoryGenerator.spec.ts +44 -16
  131. package/test/unit/modelsGenerator.spec.ts +212 -2
  132. package/test/unit/util/emitUtil.ts +13 -4
  133. package/test/unit/util/testUtil.ts +7 -2
  134. package/typespec-ts.build.log +0 -1
  135. package/test/integration/generated/internal/src/models.ts +0 -8
@@ -718,8 +718,142 @@ describe("Input/output model type", () => {
718
718
  });
719
719
  });
720
720
  describe("duration generation", () => {
721
- it("should handle duration -> string", async () => {
722
- await verifyPropertyType("duration", "string");
721
+ const buildParameterDef = (type: string) => {
722
+ return `
723
+ import { RequestParameters } from "@azure-rest/core-client";
724
+
725
+ export interface GetModelQueryParamProperties {
726
+ "input": ${type};
727
+ }
728
+
729
+ export interface GetModelQueryParam {
730
+ queryParameters: GetModelQueryParamProperties;
731
+ }
732
+
733
+ export type GetModelParameters = GetModelQueryParam & RequestParameters;
734
+ `;
735
+ };
736
+
737
+ describe("as input and output model property", () => {
738
+ it("should handle duration without encode", async () => {
739
+ await verifyPropertyType("duration", "string");
740
+ });
741
+
742
+ it("should handle duration with encode `seconds`", async () => {
743
+ const schemaOutput = await emitModelsFromCadl(
744
+ `
745
+ model SimpleModel {
746
+ @encode("seconds", float64)
747
+ prop: duration;
748
+ }
749
+ @route("/duration/prop/seconds")
750
+ @get
751
+ op getModel(...SimpleModel): SimpleModel;
752
+ `,
753
+ false,
754
+ true
755
+ );
756
+ assert.ok(schemaOutput);
757
+ const { inputModelFile, outputModelFile } = schemaOutput!;
758
+ assertEqualContent(
759
+ inputModelFile?.content!,
760
+ `
761
+ export interface SimpleModel {
762
+ "prop": number;
763
+ }
764
+ `
765
+ );
766
+ assertEqualContent(
767
+ outputModelFile?.content!,
768
+ `
769
+ export interface SimpleModelOutput {
770
+ "prop": number;
771
+ }
772
+ `
773
+ );
774
+ });
775
+
776
+ it("should handle duration with encode `iso8601`", async () => {
777
+ const schemaOutput = await emitModelsFromCadl(
778
+ `
779
+ model SimpleModel {
780
+ @encode("ISO8601")
781
+ prop: duration;
782
+ }
783
+ @route("/duration/prop/iso8601")
784
+ @get
785
+ op getModel(...SimpleModel): SimpleModel;
786
+ `,
787
+ false,
788
+ true
789
+ );
790
+ assert.ok(schemaOutput);
791
+ const { inputModelFile, outputModelFile } = schemaOutput!;
792
+ assertEqualContent(
793
+ inputModelFile?.content!,
794
+ `
795
+ export interface SimpleModel {
796
+ "prop": string;
797
+ }
798
+ `
799
+ );
800
+ assertEqualContent(
801
+ outputModelFile?.content!,
802
+ `
803
+ export interface SimpleModelOutput {
804
+ "prop": string;
805
+ }
806
+ `
807
+ );
808
+ });
809
+ });
810
+
811
+ describe("as query parameter", () => {
812
+ it("should handle duration without encode", async () => {
813
+ const schemaOutput = await emitParameterFromCadl(`
814
+ @route("/duration/query/default")
815
+ @get
816
+ op getModel(@query input: duration): NoContentResponse;
817
+ `);
818
+ assert.ok(schemaOutput);
819
+ assertEqualContent(schemaOutput?.content!, buildParameterDef("string"));
820
+ });
821
+
822
+ it("should handle duration with encode `seconds`", async () => {
823
+ const schemaOutput = await emitParameterFromCadl(
824
+ `
825
+ @route("/duration/query/seconds")
826
+ @get
827
+ op getModel(
828
+ @query
829
+ @encode("seconds", float64)
830
+ input: duration): NoContentResponse;
831
+ `,
832
+ false,
833
+ false,
834
+ true
835
+ );
836
+ assert.ok(schemaOutput);
837
+ assertEqualContent(schemaOutput?.content!, buildParameterDef("number"));
838
+ });
839
+
840
+ it("should handle duration with encode `iso8601`", async () => {
841
+ const schemaOutput = await emitParameterFromCadl(
842
+ `
843
+ @route("/duration/query/iso8601")
844
+ @get
845
+ op getModel(
846
+ @query
847
+ @encode("iso8601")
848
+ input: duration): NoContentResponse;
849
+ `,
850
+ false,
851
+ false,
852
+ true
853
+ );
854
+ assert.ok(schemaOutput);
855
+ assertEqualContent(schemaOutput?.content!, buildParameterDef("string"));
856
+ });
723
857
  });
724
858
  });
725
859
  describe("datetime generation", () => {
@@ -744,6 +878,82 @@ describe("Input/output model type", () => {
744
878
  outputType
745
879
  });
746
880
  });
881
+
882
+ it("should handle offsetDateTime -> string in output model & `Date | string` in input model", async () => {
883
+ const inputType = "Date | string";
884
+ const outputType = "string";
885
+ await verifyPropertyType("offsetDateTime ", inputType, {
886
+ outputType
887
+ });
888
+ });
889
+
890
+ it("should handle datetime with encode `unixTimestamp`", async () => {
891
+ const schemaOutput = await emitModelsFromCadl(
892
+ `
893
+ model SimpleModel {
894
+ @encode("unixTimestamp", int32)
895
+ createdAt: utcDateTime;
896
+ }
897
+ @route("/datetime/prop/unixTimestamp")
898
+ @get
899
+ op getModel(...SimpleModel): SimpleModel;
900
+ `,
901
+ false,
902
+ true
903
+ );
904
+ assert.ok(schemaOutput);
905
+ const { inputModelFile, outputModelFile } = schemaOutput!;
906
+ assertEqualContent(
907
+ inputModelFile?.content!,
908
+ `
909
+ export interface SimpleModel {
910
+ "createdAt": number;
911
+ }
912
+ `
913
+ );
914
+ assertEqualContent(
915
+ outputModelFile?.content!,
916
+ `
917
+ export interface SimpleModelOutput {
918
+ "createdAt": number;
919
+ }
920
+ `
921
+ );
922
+ });
923
+
924
+ it("should handle datetime with encode `rfc3339`", async () => {
925
+ const schemaOutput = await emitModelsFromCadl(
926
+ `
927
+ model SimpleModel {
928
+ @encode("rfc3339")
929
+ createdAt: offsetDateTime;
930
+ }
931
+ @route("/datetime/prop/rfc3339")
932
+ @get
933
+ op getModel(...SimpleModel): SimpleModel;
934
+ `,
935
+ false,
936
+ true
937
+ );
938
+ assert.ok(schemaOutput);
939
+ const { inputModelFile, outputModelFile } = schemaOutput!;
940
+ assertEqualContent(
941
+ inputModelFile?.content!,
942
+ `
943
+ export interface SimpleModel {
944
+ "createdAt": Date | string;
945
+ }
946
+ `
947
+ );
948
+ assertEqualContent(
949
+ outputModelFile?.content!,
950
+ `
951
+ export interface SimpleModelOutput {
952
+ "createdAt": string;
953
+ }
954
+ `
955
+ );
956
+ });
747
957
  });
748
958
  describe("record generation", () => {
749
959
  it("should handle Record<int32> -> Record<string, number>", async () => {
@@ -19,9 +19,16 @@ import { getCredentialInfo } from "../../../src/transform/transfromRLCOptions.js
19
19
 
20
20
  export async function emitModelsFromCadl(
21
21
  cadlContent: string,
22
- needAzureCore: boolean = false
22
+ needAzureCore: boolean = false,
23
+ needTCGC: boolean = false
23
24
  ) {
24
- const context = await rlcEmitterFor(cadlContent, true, needAzureCore);
25
+ const context = await rlcEmitterFor(
26
+ cadlContent,
27
+ true,
28
+ needAzureCore,
29
+ false,
30
+ needTCGC
31
+ );
25
32
  const program = context.program;
26
33
  const dpgContext = createDpgContextTestHelper(context.program);
27
34
  const clients = listClients(dpgContext);
@@ -40,13 +47,15 @@ export async function emitModelsFromCadl(
40
47
  export async function emitParameterFromCadl(
41
48
  cadlContent: string,
42
49
  needAzureCore: boolean = false,
43
- ignoreClientApiVersion: boolean = false
50
+ ignoreClientApiVersion: boolean = false,
51
+ needTCGC: boolean = false
44
52
  ) {
45
53
  const context = await rlcEmitterFor(
46
54
  cadlContent,
47
55
  true,
48
56
  needAzureCore,
49
- ignoreClientApiVersion
57
+ ignoreClientApiVersion,
58
+ needTCGC
50
59
  );
51
60
  const program = context.program;
52
61
  const dpgContext = createDpgContextTestHelper(context.program);
@@ -5,6 +5,7 @@ import { RestTestLibrary } from "@typespec/rest/testing";
5
5
  import { HttpTestLibrary } from "@typespec/http/testing";
6
6
  import { VersioningTestLibrary } from "@typespec/versioning/testing";
7
7
  import { AzureCoreTestLibrary } from "@azure-tools/typespec-azure-core/testing";
8
+ import { SdkTestLibrary } from "@azure-tools/typespec-client-generator-core/testing";
8
9
  import { SdkContext } from "@azure-tools/typespec-client-generator-core";
9
10
  import { assert } from "chai";
10
11
  import { format } from "prettier";
@@ -16,7 +17,8 @@ export async function createRLCEmitterTestHost() {
16
17
  HttpTestLibrary,
17
18
  RestTestLibrary,
18
19
  VersioningTestLibrary,
19
- AzureCoreTestLibrary
20
+ AzureCoreTestLibrary,
21
+ SdkTestLibrary
20
22
  ]
21
23
  });
22
24
  }
@@ -25,7 +27,8 @@ export async function rlcEmitterFor(
25
27
  code: string,
26
28
  needNamespaces: boolean = true,
27
29
  needAzureCore: boolean = false,
28
- ignoreClientApiVersion: boolean = false
30
+ ignoreClientApiVersion: boolean = false,
31
+ needTCGC: boolean = false
29
32
  ): Promise<TestHost> {
30
33
  const host: TestHost = await createRLCEmitterTestHost();
31
34
  const namespace = `
@@ -34,6 +37,7 @@ export async function rlcEmitterFor(
34
37
  ${ignoreClientApiVersion ? "" : 'version: "2022-12-16-preview",'}
35
38
  })
36
39
 
40
+ ${needAzureCore ? "@useDependency(Azure.Core.Versions.v1_0_Preview_2)" : ""}
37
41
  namespace Azure.TypeScript.Testing;
38
42
  `;
39
43
  host.addTypeSpecFile(
@@ -42,6 +46,7 @@ export async function rlcEmitterFor(
42
46
  import "@typespec/http";
43
47
  import "@typespec/rest";
44
48
  import "@typespec/versioning";
49
+ ${needTCGC ? 'import "@azure-tools/typespec-client-generator-core";' : ""}
45
50
  ${needAzureCore ? 'import "@azure-tools/typespec-azure-core";' : ""}
46
51
 
47
52
  using TypeSpec.Rest;
@@ -1,2 +1 @@
1
1
  Invoking: tsc -p .
2
-
@@ -1,8 +0,0 @@
1
- // Copyright (c) Microsoft Corporation.
2
- // Licensed under the MIT license.
3
-
4
- /** This is a non-internal model only used by internal operation. */
5
- export interface ModelOnlyUsedByInternalOperation {
6
- id: string;
7
- name: string;
8
- }