@typespec/openapi3 0.58.0-dev.1 → 0.58.0-dev.5

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 (109) hide show
  1. package/README.md +1 -1
  2. package/cmd/tsp-openapi3.js +9 -0
  3. package/dist/src/cli/actions/convert/args.d.ts +5 -0
  4. package/dist/src/cli/actions/convert/args.d.ts.map +1 -0
  5. package/dist/src/cli/actions/convert/args.js +2 -0
  6. package/dist/src/cli/actions/convert/args.js.map +1 -0
  7. package/dist/src/cli/actions/convert/convert-file.d.ts +4 -0
  8. package/dist/src/cli/actions/convert/convert-file.d.ts.map +1 -0
  9. package/dist/src/cli/actions/convert/convert-file.js +26 -0
  10. package/dist/src/cli/actions/convert/convert-file.js.map +1 -0
  11. package/dist/src/cli/actions/convert/convert.d.ts +3 -0
  12. package/dist/src/cli/actions/convert/convert.d.ts.map +1 -0
  13. package/dist/src/cli/actions/convert/convert.js +7 -0
  14. package/dist/src/cli/actions/convert/convert.js.map +1 -0
  15. package/dist/src/cli/actions/convert/generators/generate-decorators.d.ts +3 -0
  16. package/dist/src/cli/actions/convert/generators/generate-decorators.d.ts.map +1 -0
  17. package/dist/src/cli/actions/convert/generators/generate-decorators.js +10 -0
  18. package/dist/src/cli/actions/convert/generators/generate-decorators.js.map +1 -0
  19. package/dist/src/cli/actions/convert/generators/generate-main.d.ts +3 -0
  20. package/dist/src/cli/actions/convert/generators/generate-main.d.ts.map +1 -0
  21. package/dist/src/cli/actions/convert/generators/generate-main.js +25 -0
  22. package/dist/src/cli/actions/convert/generators/generate-main.js.map +1 -0
  23. package/dist/src/cli/actions/convert/generators/generate-model.d.ts +3 -0
  24. package/dist/src/cli/actions/convert/generators/generate-model.d.ts.map +1 -0
  25. package/dist/src/cli/actions/convert/generators/generate-model.js +52 -0
  26. package/dist/src/cli/actions/convert/generators/generate-model.js.map +1 -0
  27. package/dist/src/cli/actions/convert/generators/generate-operation.d.ts +3 -0
  28. package/dist/src/cli/actions/convert/generators/generate-operation.d.ts.map +1 -0
  29. package/dist/src/cli/actions/convert/generators/generate-operation.js +78 -0
  30. package/dist/src/cli/actions/convert/generators/generate-operation.js.map +1 -0
  31. package/dist/src/cli/actions/convert/generators/generate-service-info.d.ts +3 -0
  32. package/dist/src/cli/actions/convert/generators/generate-service-info.d.ts.map +1 -0
  33. package/dist/src/cli/actions/convert/generators/generate-service-info.js +20 -0
  34. package/dist/src/cli/actions/convert/generators/generate-service-info.js.map +1 -0
  35. package/dist/src/cli/actions/convert/generators/generate-types.d.ts +8 -0
  36. package/dist/src/cli/actions/convert/generators/generate-types.d.ts.map +1 -0
  37. package/dist/src/cli/actions/convert/generators/generate-types.js +168 -0
  38. package/dist/src/cli/actions/convert/generators/generate-types.js.map +1 -0
  39. package/dist/src/cli/actions/convert/interfaces.d.ts +80 -0
  40. package/dist/src/cli/actions/convert/interfaces.d.ts.map +1 -0
  41. package/dist/src/cli/actions/convert/interfaces.js +2 -0
  42. package/dist/src/cli/actions/convert/interfaces.js.map +1 -0
  43. package/dist/src/cli/actions/convert/transforms/transform-component-parameters.d.ts +12 -0
  44. package/dist/src/cli/actions/convert/transforms/transform-component-parameters.d.ts.map +1 -0
  45. package/dist/src/cli/actions/convert/transforms/transform-component-parameters.js +48 -0
  46. package/dist/src/cli/actions/convert/transforms/transform-component-parameters.js.map +1 -0
  47. package/dist/src/cli/actions/convert/transforms/transform-component-schemas.d.ts +11 -0
  48. package/dist/src/cli/actions/convert/transforms/transform-component-schemas.d.ts.map +1 -0
  49. package/dist/src/cli/actions/convert/transforms/transform-component-schemas.js +76 -0
  50. package/dist/src/cli/actions/convert/transforms/transform-component-schemas.js.map +1 -0
  51. package/dist/src/cli/actions/convert/transforms/transform-operation-responses.d.ts +11 -0
  52. package/dist/src/cli/actions/convert/transforms/transform-operation-responses.d.ts.map +1 -0
  53. package/dist/src/cli/actions/convert/transforms/transform-operation-responses.js +190 -0
  54. package/dist/src/cli/actions/convert/transforms/transform-operation-responses.js.map +1 -0
  55. package/dist/src/cli/actions/convert/transforms/transform-paths.d.ts +9 -0
  56. package/dist/src/cli/actions/convert/transforms/transform-paths.d.ts.map +1 -0
  57. package/dist/src/cli/actions/convert/transforms/transform-paths.js +65 -0
  58. package/dist/src/cli/actions/convert/transforms/transform-paths.js.map +1 -0
  59. package/dist/src/cli/actions/convert/transforms/transform-service-info.d.ts +4 -0
  60. package/dist/src/cli/actions/convert/transforms/transform-service-info.d.ts.map +1 -0
  61. package/dist/src/cli/actions/convert/transforms/transform-service-info.js +12 -0
  62. package/dist/src/cli/actions/convert/transforms/transform-service-info.js.map +1 -0
  63. package/dist/src/cli/actions/convert/transforms/transforms.d.ts +4 -0
  64. package/dist/src/cli/actions/convert/transforms/transforms.d.ts.map +1 -0
  65. package/dist/src/cli/actions/convert/transforms/transforms.js +26 -0
  66. package/dist/src/cli/actions/convert/transforms/transforms.js.map +1 -0
  67. package/dist/src/cli/actions/convert/utils/convert-header-name.d.ts +2 -0
  68. package/dist/src/cli/actions/convert/utils/convert-header-name.d.ts.map +1 -0
  69. package/dist/src/cli/actions/convert/utils/convert-header-name.js +7 -0
  70. package/dist/src/cli/actions/convert/utils/convert-header-name.js.map +1 -0
  71. package/dist/src/cli/actions/convert/utils/decorators.d.ts +6 -0
  72. package/dist/src/cli/actions/convert/utils/decorators.d.ts.map +1 -0
  73. package/dist/src/cli/actions/convert/utils/decorators.js +162 -0
  74. package/dist/src/cli/actions/convert/utils/decorators.js.map +1 -0
  75. package/dist/src/cli/actions/convert/utils/docs.d.ts +3 -0
  76. package/dist/src/cli/actions/convert/utils/docs.d.ts.map +1 -0
  77. package/dist/src/cli/actions/convert/utils/docs.js +58 -0
  78. package/dist/src/cli/actions/convert/utils/docs.js.map +1 -0
  79. package/dist/src/cli/actions/convert/utils/supported-http-methods.d.ts +3 -0
  80. package/dist/src/cli/actions/convert/utils/supported-http-methods.d.ts.map +1 -0
  81. package/dist/src/cli/actions/convert/utils/supported-http-methods.js +9 -0
  82. package/dist/src/cli/actions/convert/utils/supported-http-methods.js.map +1 -0
  83. package/dist/src/cli/cli.d.ts +2 -0
  84. package/dist/src/cli/cli.d.ts.map +1 -0
  85. package/dist/src/cli/cli.js +66 -0
  86. package/dist/src/cli/cli.js.map +1 -0
  87. package/dist/src/cli/types.d.ts +45 -0
  88. package/dist/src/cli/types.d.ts.map +1 -0
  89. package/dist/src/cli/types.js +2 -0
  90. package/dist/src/cli/types.js.map +1 -0
  91. package/dist/src/cli/utils.d.ts +16 -0
  92. package/dist/src/cli/utils.d.ts.map +1 -0
  93. package/dist/src/cli/utils.js +43 -0
  94. package/dist/src/cli/utils.js.map +1 -0
  95. package/dist/src/index.d.ts +1 -0
  96. package/dist/src/index.d.ts.map +1 -1
  97. package/dist/src/index.js +1 -0
  98. package/dist/src/index.js.map +1 -1
  99. package/dist/src/lib.d.ts.map +1 -1
  100. package/dist/src/openapi.js +7 -0
  101. package/dist/src/openapi.js.map +1 -1
  102. package/dist/src/types.d.ts +6 -1
  103. package/dist/src/types.d.ts.map +1 -1
  104. package/dist/src/version.d.ts +2 -0
  105. package/dist/src/version.d.ts.map +1 -0
  106. package/dist/src/version.js +12 -0
  107. package/dist/src/version.js.map +1 -0
  108. package/dist/version.js +1 -0
  109. package/package.json +15 -7
package/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # @typespec/openapi3
2
2
 
3
- TypeSpec library for emitting OpenAPI 3.0 from the TypeSpec REST protocol binding
3
+ TypeSpec library for emitting OpenAPI 3.0 from the TypeSpec REST protocol binding and converting OpenAPI3 to TypeSpec
4
4
 
5
5
  ## Install
6
6
 
@@ -0,0 +1,9 @@
1
+ #!/usr/bin/env node
2
+ import { main } from "../dist/src/cli/cli.js";
3
+
4
+ main().catch((error) => {
5
+ // eslint-disable-next-line no-console
6
+ console.error(error);
7
+
8
+ process.exit(1);
9
+ });
@@ -0,0 +1,5 @@
1
+ export interface ConvertCliArgs {
2
+ "output-dir": string;
3
+ path: string;
4
+ }
5
+ //# sourceMappingURL=args.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"args.d.ts","sourceRoot":"","sources":["../../../../../src/cli/actions/convert/args.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,cAAc;IAC7B,YAAY,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;CACd"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=args.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"args.js","sourceRoot":"","sources":["../../../../../src/cli/actions/convert/args.ts"],"names":[],"mappings":""}
@@ -0,0 +1,4 @@
1
+ import { CliHost } from "../../types.js";
2
+ import { ConvertCliArgs } from "./args.js";
3
+ export declare function convertAction(host: CliHost, args: ConvertCliArgs): Promise<void>;
4
+ //# sourceMappingURL=convert-file.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"convert-file.d.ts","sourceRoot":"","sources":["../../../../../src/cli/actions/convert/convert-file.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAEzC,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAI3C,wBAAsB,aAAa,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,cAAc,iBAgBtE"}
@@ -0,0 +1,26 @@
1
+ import oaParser from "@readme/openapi-parser";
2
+ import { resolvePath } from "@typespec/compiler";
3
+ import { handleInternalCompilerError } from "../../utils.js";
4
+ import { generateMain } from "./generators/generate-main.js";
5
+ import { transform } from "./transforms/transforms.js";
6
+ export async function convertAction(host, args) {
7
+ // attempt to read the file
8
+ const fullPath = resolvePath(process.cwd(), args.path);
9
+ const model = await parseOpenApiFile(fullPath);
10
+ const program = transform(model);
11
+ let mainTsp;
12
+ try {
13
+ mainTsp = await generateMain(program);
14
+ }
15
+ catch (err) {
16
+ handleInternalCompilerError(err);
17
+ }
18
+ if (args["output-dir"]) {
19
+ await host.mkdirp(args["output-dir"]);
20
+ await host.writeFile(resolvePath(args["output-dir"], "main.tsp"), mainTsp);
21
+ }
22
+ }
23
+ function parseOpenApiFile(path) {
24
+ return oaParser.bundle(path);
25
+ }
26
+ //# sourceMappingURL=convert-file.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"convert-file.js","sourceRoot":"","sources":["../../../../../src/cli/actions/convert/convert-file.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,wBAAwB,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAGjD,OAAO,EAAE,2BAA2B,EAAE,MAAM,gBAAgB,CAAC;AAE7D,OAAO,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAC7D,OAAO,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;AAEvD,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,IAAa,EAAE,IAAoB;IACrE,2BAA2B;IAC3B,MAAM,QAAQ,GAAG,WAAW,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;IACvD,MAAM,KAAK,GAAG,MAAM,gBAAgB,CAAC,QAAQ,CAAC,CAAC;IAC/C,MAAM,OAAO,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC;IACjC,IAAI,OAAe,CAAC;IACpB,IAAI,CAAC;QACH,OAAO,GAAG,MAAM,YAAY,CAAC,OAAO,CAAC,CAAC;IACxC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,2BAA2B,CAAC,GAAG,CAAC,CAAC;IACnC,CAAC;IAED,IAAI,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC;QACvB,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC;QACtC,MAAM,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,UAAU,CAAC,EAAE,OAAO,CAAC,CAAC;IAC7E,CAAC;AACH,CAAC;AAED,SAAS,gBAAgB,CAAC,IAAY;IACpC,OAAO,QAAQ,CAAC,MAAM,CAAC,IAAI,CAA8B,CAAC;AAC5D,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { OpenAPI3Document } from "../../../types.js";
2
+ export declare function convertOpenAPI3Document(document: OpenAPI3Document): Promise<string>;
3
+ //# sourceMappingURL=convert.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"convert.d.ts","sourceRoot":"","sources":["../../../../../src/cli/actions/convert/convert.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAIrD,wBAAsB,uBAAuB,CAAC,QAAQ,EAAE,gBAAgB,mBAGvE"}
@@ -0,0 +1,7 @@
1
+ import { generateMain } from "./generators/generate-main.js";
2
+ import { transform } from "./transforms/transforms.js";
3
+ export async function convertOpenAPI3Document(document) {
4
+ const program = transform(document);
5
+ return await generateMain(program);
6
+ }
7
+ //# sourceMappingURL=convert.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"convert.js","sourceRoot":"","sources":["../../../../../src/cli/actions/convert/convert.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAC7D,OAAO,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;AAEvD,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAAC,QAA0B;IACtE,MAAM,OAAO,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;IACpC,OAAO,MAAM,YAAY,CAAC,OAAO,CAAC,CAAC;AACrC,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { TypeSpecDecorator } from "../interfaces.js";
2
+ export declare function generateDecorators(decorators: TypeSpecDecorator[]): string[];
3
+ //# sourceMappingURL=generate-decorators.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate-decorators.d.ts","sourceRoot":"","sources":["../../../../../../src/cli/actions/convert/generators/generate-decorators.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AASrD,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,iBAAiB,EAAE,GAAG,MAAM,EAAE,CAG5E"}
@@ -0,0 +1,10 @@
1
+ function generateDecorator({ name, args }) {
2
+ const hasArgs = args.length;
3
+ const stringifiedArguments = hasArgs ? `(${args.map((a) => JSON.stringify(a)).join(", ")})` : "";
4
+ return `@${name}${stringifiedArguments}`;
5
+ }
6
+ export function generateDecorators(decorators) {
7
+ const uniqueDecorators = new Set(decorators.map(generateDecorator));
8
+ return Array.from(uniqueDecorators);
9
+ }
10
+ //# sourceMappingURL=generate-decorators.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate-decorators.js","sourceRoot":"","sources":["../../../../../../src/cli/actions/convert/generators/generate-decorators.ts"],"names":[],"mappings":"AAEA,SAAS,iBAAiB,CAAC,EAAE,IAAI,EAAE,IAAI,EAAqB;IAC1D,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC;IAC5B,MAAM,oBAAoB,GAAG,OAAO,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;IAEjG,OAAO,IAAI,IAAI,GAAG,oBAAoB,EAAE,CAAC;AAC3C,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,UAA+B;IAChE,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAAS,UAAU,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC,CAAC;IAC5E,OAAO,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;AACtC,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { TypeSpecProgram } from "../interfaces.js";
2
+ export declare function generateMain(program: TypeSpecProgram): Promise<string>;
3
+ //# sourceMappingURL=generate-main.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate-main.d.ts","sourceRoot":"","sources":["../../../../../../src/cli/actions/convert/generators/generate-main.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAKnD,wBAAsB,YAAY,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,MAAM,CAAC,CAoB5E"}
@@ -0,0 +1,25 @@
1
+ import { formatTypeSpec } from "@typespec/compiler";
2
+ import { generateModel } from "./generate-model.js";
3
+ import { generateOperation } from "./generate-operation.js";
4
+ import { generateServiceInformation } from "./generate-service-info.js";
5
+ export async function generateMain(program) {
6
+ const content = `
7
+ import "@typespec/http";
8
+ import "@typespec/openapi";
9
+ import "@typespec/openapi3";
10
+
11
+ using Http;
12
+ using OpenAPI;
13
+
14
+ ${generateServiceInformation(program.serviceInfo)}
15
+
16
+ ${program.models.map(generateModel).join("\n\n")}
17
+
18
+ ${program.operations.map(generateOperation).join("\n\n")}
19
+ `;
20
+ return formatTypeSpec(content, {
21
+ printWidth: 100,
22
+ tabWidth: 2,
23
+ });
24
+ }
25
+ //# sourceMappingURL=generate-main.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate-main.js","sourceRoot":"","sources":["../../../../../../src/cli/actions/convert/generators/generate-main.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAEpD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,0BAA0B,EAAE,MAAM,4BAA4B,CAAC;AAExE,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,OAAwB;IACzD,MAAM,OAAO,GAAG;;;;;;;;IAQd,0BAA0B,CAAC,OAAO,CAAC,WAAW,CAAC;;IAE/C,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC;;IAE9C,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC;GACvD,CAAC;IAEF,OAAO,cAAc,CAAC,OAAO,EAAE;QAC7B,UAAU,EAAE,GAAG;QACf,QAAQ,EAAE,CAAC;KACZ,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { TypeSpecModel } from "../interfaces.js";
2
+ export declare function generateModel(model: TypeSpecModel): string;
3
+ //# sourceMappingURL=generate-model.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate-model.d.ts","sourceRoot":"","sources":["../../../../../../src/cli/actions/convert/generators/generate-model.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAyB,MAAM,kBAAkB,CAAC;AAMxE,wBAAgB,aAAa,CAAC,KAAK,EAAE,aAAa,GAAG,MAAM,CAoB1D"}
@@ -0,0 +1,52 @@
1
+ import { getDecoratorsForSchema } from "../utils/decorators.js";
2
+ import { generateDocs } from "../utils/docs.js";
3
+ import { generateDecorators } from "./generate-decorators.js";
4
+ import { generateTypeFromSchema } from "./generate-types.js";
5
+ export function generateModel(model) {
6
+ const definitions = [];
7
+ const modelDeclaration = generateModelDeclaration(model);
8
+ if (model.doc) {
9
+ definitions.push(generateDocs(model.doc));
10
+ }
11
+ definitions.push(...generateDecorators(model.decorators));
12
+ definitions.push(modelDeclaration.open);
13
+ definitions.push(...model.properties.map(generateModelProperty));
14
+ if (model.additionalProperties) {
15
+ definitions.push(`...${generateTypeFromSchema(model.additionalProperties)};`);
16
+ }
17
+ if (modelDeclaration.close)
18
+ definitions.push(modelDeclaration.close);
19
+ return definitions.join("\n");
20
+ }
21
+ function generateModelDeclaration(model) {
22
+ const modelName = model.name;
23
+ const modelType = model.type ?? "object";
24
+ if (model.is) {
25
+ return { open: `model ${modelName} is ${model.is};` };
26
+ }
27
+ if (!model.extends) {
28
+ return { open: `model ${modelName} {`, close: "}" };
29
+ }
30
+ if (modelType === "object") {
31
+ return { open: `model ${modelName} extends ${model.extends} {`, close: "}" };
32
+ }
33
+ switch (modelType) {
34
+ case "boolean":
35
+ case "integer":
36
+ case "number":
37
+ case "string":
38
+ return { open: `scalar ${modelName} extends ${model.extends};` };
39
+ }
40
+ return { open: `model ${modelName} {`, close: "}" };
41
+ }
42
+ function generateModelProperty(property) {
43
+ // Decorators will be a combination of top-level (parameters) and
44
+ // schema-level decorators.
45
+ const decorators = generateDecorators([
46
+ ...property.decorators,
47
+ ...getDecoratorsForSchema(property.schema),
48
+ ]).join(" ");
49
+ const doc = property.doc ? generateDocs(property.doc) : "";
50
+ return `${doc}${decorators} ${property.name}${property.isOptional ? "?" : ""}: ${generateTypeFromSchema(property.schema)};`;
51
+ }
52
+ //# sourceMappingURL=generate-model.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate-model.js","sourceRoot":"","sources":["../../../../../../src/cli/actions/convert/generators/generate-model.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { TypeSpecOperation } from "../interfaces.js";
2
+ export declare function generateOperation(operation: TypeSpecOperation): string;
3
+ //# sourceMappingURL=generate-operation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate-operation.d.ts","sourceRoot":"","sources":["../../../../../../src/cli/actions/convert/generators/generate-operation.ts"],"names":[],"mappings":"AACA,OAAO,EACL,iBAAiB,EAGlB,MAAM,kBAAkB,CAAC;AAM1B,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,iBAAiB,GAAG,MAAM,CAsBtE"}
@@ -0,0 +1,78 @@
1
+ import { generateResponseModelName } from "../transforms/transform-operation-responses.js";
2
+ import { generateDocs } from "../utils/docs.js";
3
+ import { generateDecorators } from "./generate-decorators.js";
4
+ import { generateTypeFromSchema, getRefName } from "./generate-types.js";
5
+ export function generateOperation(operation) {
6
+ const definitions = [];
7
+ if (operation.doc) {
8
+ definitions.push(generateDocs(operation.doc));
9
+ }
10
+ definitions.push(...operation.tags.map((t) => `@tag("${t}")`));
11
+ definitions.push(generateDecorators(operation.decorators).join(" "));
12
+ // generate parameters
13
+ const parameters = [
14
+ ...operation.parameters.map(generateOperationParameter),
15
+ ...generateRequestBodyParameters(operation.requestBodies),
16
+ ];
17
+ const responseTypes = generateResponses(operation.operationId, operation.responses);
18
+ definitions.push(`op ${operation.name}(${parameters.join(", ")}): ${responseTypes.join(" | ")};`);
19
+ return definitions.join(" ");
20
+ }
21
+ function generateOperationParameter(parameter) {
22
+ if ("$ref" in parameter) {
23
+ // check if referencing a model or a property
24
+ const refName = getRefName(parameter.$ref);
25
+ const paramName = refName.indexOf(".") >= 0 ? refName.split(".").pop() : refName;
26
+ // when refName and paramName match, we're referencing a model and can spread
27
+ // TODO: Handle optionality
28
+ return refName === paramName ? `...${refName}` : `${paramName}: ${refName}`;
29
+ }
30
+ const definitions = [];
31
+ if (parameter.doc) {
32
+ definitions.push(generateDocs(parameter.doc));
33
+ }
34
+ definitions.push(...generateDecorators(parameter.decorators));
35
+ definitions.push(`${parameter.name}${parameter.isOptional ? "?" : ""}: ${generateTypeFromSchema(parameter.schema)}`);
36
+ return definitions.join(" ");
37
+ }
38
+ function generateRequestBodyParameters(requestBodies) {
39
+ if (!requestBodies.length) {
40
+ return [];
41
+ }
42
+ const definitions = [];
43
+ // Generate the content-type header if defined content-types is not just 'application/json'
44
+ const contentTypes = requestBodies.map((r) => r.contentType);
45
+ if (!supportsOnlyJson(contentTypes)) {
46
+ definitions.push(`@header contentType: ${contentTypes.map((c) => `"${c}"`).join(" | ")}`);
47
+ }
48
+ // Get the set of referenced types
49
+ const body = Array.from(new Set(requestBodies.filter((r) => !!r.schema).map((r) => generateTypeFromSchema(r.schema)))).join(" | ");
50
+ if (body) {
51
+ definitions.push(`@bodyRoot body: ${body}`);
52
+ }
53
+ return definitions;
54
+ }
55
+ function supportsOnlyJson(contentTypes) {
56
+ return contentTypes.length === 1 && contentTypes[0] === "application/json";
57
+ }
58
+ function generateResponses(operationId, responses) {
59
+ if (!responses) {
60
+ return ["void"];
61
+ }
62
+ const definitions = [];
63
+ for (const statusCode of Object.keys(responses)) {
64
+ const response = responses[statusCode];
65
+ definitions.push(...generateResponseForStatus(operationId, statusCode, response));
66
+ }
67
+ return definitions;
68
+ }
69
+ function generateResponseForStatus(operationId, statusCode, response) {
70
+ if ("$ref" in response) {
71
+ return [getRefName(response.$ref)];
72
+ }
73
+ if (!response.content) {
74
+ return [generateResponseModelName(operationId, statusCode)];
75
+ }
76
+ return Object.keys(response.content).map((contentType) => generateResponseModelName(operationId, statusCode, contentType));
77
+ }
78
+ //# sourceMappingURL=generate-operation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate-operation.js","sourceRoot":"","sources":["../../../../../../src/cli/actions/convert/generators/generate-operation.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { TypeSpecServiceInfo } from "../interfaces.js";
2
+ export declare function generateServiceInformation(serviceInfo: TypeSpecServiceInfo): string;
3
+ //# sourceMappingURL=generate-service-info.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate-service-info.d.ts","sourceRoot":"","sources":["../../../../../../src/cli/actions/convert/generators/generate-service-info.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAGvD,wBAAgB,0BAA0B,CAAC,WAAW,EAAE,mBAAmB,GAAG,MAAM,CAmBnF"}
@@ -0,0 +1,20 @@
1
+ import { generateDocs } from "../utils/docs.js";
2
+ export function generateServiceInformation(serviceInfo) {
3
+ const definitions = [];
4
+ const { name, doc, ...info } = serviceInfo;
5
+ definitions.push(`
6
+ @service({
7
+ title: "${name}"
8
+ })
9
+ @info(${JSON.stringify(info)})
10
+ `);
11
+ if (doc) {
12
+ definitions.push(generateDocs(doc));
13
+ }
14
+ definitions.push(`namespace ${generateNamespaceName(name)};`);
15
+ return definitions.join("\n");
16
+ }
17
+ function generateNamespaceName(name) {
18
+ return name.replaceAll(/[^\w^\d_]+/g, "");
19
+ }
20
+ //# sourceMappingURL=generate-service-info.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate-service-info.js","sourceRoot":"","sources":["../../../../../../src/cli/actions/convert/generators/generate-service-info.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAEhD,MAAM,UAAU,0BAA0B,CAAC,WAAgC;IACzE,MAAM,WAAW,GAAa,EAAE,CAAC;IAEjC,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI,EAAE,GAAG,WAAW,CAAC;IAE3C,WAAW,CAAC,IAAI,CAAC;;gBAEH,IAAI;;YAER,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;KAC3B,CAAC,CAAC;IAEL,IAAI,GAAG,EAAE,CAAC;QACR,WAAW,CAAC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC;IACtC,CAAC;IAED,WAAW,CAAC,IAAI,CAAC,aAAa,qBAAqB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAE9D,OAAO,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAChC,CAAC;AAED,SAAS,qBAAqB,CAAC,IAAY;IACzC,OAAO,IAAI,CAAC,UAAU,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC;AAC5C,CAAC"}
@@ -0,0 +1,8 @@
1
+ import { OpenAPI3Schema, Refable } from "../../../../types.js";
2
+ export declare function generateTypeFromSchema(schema: Refable<OpenAPI3Schema>): string;
3
+ export declare function getRefName(ref: string): string;
4
+ export declare function getArrayType(schema: OpenAPI3Schema): string;
5
+ export declare function getIntegerType(schema: OpenAPI3Schema): string;
6
+ export declare function getNumberType(schema: OpenAPI3Schema): string;
7
+ export declare function getStringType(schema: OpenAPI3Schema): string;
8
+ //# sourceMappingURL=generate-types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate-types.d.ts","sourceRoot":"","sources":["../../../../../../src/cli/actions/convert/generators/generate-types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAI/D,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,OAAO,CAAC,cAAc,CAAC,GAAG,MAAM,CAE9E;AAyCD,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAI9C;AA0DD,wBAAgB,YAAY,CAAC,MAAM,EAAE,cAAc,GAAG,MAAM,CAY3D;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,cAAc,GAAG,MAAM,CAiB7D;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,cAAc,GAAG,MAAM,CAc5D;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,cAAc,GAAG,MAAM,CA2B5D"}
@@ -0,0 +1,168 @@
1
+ import { getDecoratorsForSchema } from "../utils/decorators.js";
2
+ import { generateDecorators } from "./generate-decorators.js";
3
+ export function generateTypeFromSchema(schema) {
4
+ return getTypeFromRefableSchema(schema);
5
+ }
6
+ function getTypeFromRefableSchema(schema) {
7
+ const hasRef = "$ref" in schema;
8
+ return hasRef ? getRefName(schema.$ref) : getTypeFromSchema(schema);
9
+ }
10
+ function getTypeFromSchema(schema) {
11
+ let type = "unknown";
12
+ if (schema.enum) {
13
+ type = getEnum(schema.enum);
14
+ }
15
+ else if (schema.anyOf) {
16
+ type = getAnyOfType(schema);
17
+ }
18
+ else if (schema.type === "array") {
19
+ type = getArrayType(schema);
20
+ }
21
+ else if (schema.type === "boolean") {
22
+ type = "boolean";
23
+ }
24
+ else if (schema.type === "integer") {
25
+ type = getIntegerType(schema);
26
+ }
27
+ else if (schema.type === "number") {
28
+ type = getNumberType(schema);
29
+ }
30
+ else if (schema.type === "object") {
31
+ type = getObjectType(schema);
32
+ }
33
+ else if (schema.oneOf) {
34
+ type = getOneOfType(schema);
35
+ }
36
+ else if (schema.type === "string") {
37
+ type = getStringType(schema);
38
+ }
39
+ if (schema.nullable) {
40
+ type += ` | null`;
41
+ }
42
+ if (schema.default) {
43
+ type += ` = ${JSON.stringify(schema.default)}`;
44
+ }
45
+ return type;
46
+ }
47
+ export function getRefName(ref) {
48
+ const name = ref.split("/").pop() ?? "";
49
+ // TODO: account for `.` in the name
50
+ return name;
51
+ }
52
+ function getAnyOfType(schema) {
53
+ const definitions = [];
54
+ for (const item of schema.anyOf ?? []) {
55
+ definitions.push(generateTypeFromSchema(item));
56
+ }
57
+ return definitions.join(" | ");
58
+ }
59
+ function getOneOfType(schema) {
60
+ const definitions = [];
61
+ for (const item of schema.oneOf ?? []) {
62
+ definitions.push(generateTypeFromSchema(item));
63
+ }
64
+ return definitions.join(" | ");
65
+ }
66
+ function getObjectType(schema) {
67
+ // If we have `additionalProperties`, treat that as an 'indexer' and convert to a record.
68
+ const recordType = typeof schema.additionalProperties === "object"
69
+ ? `Record<${getTypeFromRefableSchema(schema.additionalProperties)}>`
70
+ : "";
71
+ if (!schema.properties && recordType) {
72
+ return recordType;
73
+ }
74
+ const requiredProps = schema.required ?? [];
75
+ const props = [];
76
+ if (schema.properties) {
77
+ for (const name of Object.keys(schema.properties)) {
78
+ const decorators = generateDecorators(getDecoratorsForSchema(schema.properties[name]))
79
+ .map((d) => `${d}\n`)
80
+ .join("");
81
+ const isOptional = !requiredProps.includes(name) ? "?" : "";
82
+ props.push(`${decorators}${name}${isOptional}: ${getTypeFromRefableSchema(schema.properties[name])}`);
83
+ }
84
+ }
85
+ const propertyCount = Object.keys(props).length;
86
+ if (recordType && !propertyCount) {
87
+ return recordType;
88
+ }
89
+ else if (recordType && propertyCount) {
90
+ props.push(`...${recordType}`);
91
+ }
92
+ return `{${props.join("; ")}}`;
93
+ }
94
+ export function getArrayType(schema) {
95
+ const items = schema.items;
96
+ if (!items) {
97
+ return "unknown[]";
98
+ }
99
+ if ("$ref" in items) {
100
+ return `${getRefName(items.$ref)}[]`;
101
+ }
102
+ // Prettier will get rid of the extra parenthesis for us
103
+ return `(${getTypeFromSchema(items)})[]`;
104
+ }
105
+ export function getIntegerType(schema) {
106
+ const format = schema.format ?? "";
107
+ switch (format) {
108
+ case "int8":
109
+ case "int16":
110
+ case "int32":
111
+ case "int64":
112
+ case "uint8":
113
+ case "uint16":
114
+ case "uint32":
115
+ case "uint64":
116
+ return format;
117
+ case "double-int":
118
+ return "safeint";
119
+ default:
120
+ return "integer";
121
+ }
122
+ }
123
+ export function getNumberType(schema) {
124
+ const format = schema.format ?? "";
125
+ switch (format) {
126
+ case "decimal":
127
+ case "decimal128":
128
+ return format;
129
+ case "double":
130
+ return "float64";
131
+ case "float":
132
+ return "float32";
133
+ default:
134
+ // Could be either 'float' or 'numeric' - add FIXME?
135
+ return "numeric";
136
+ }
137
+ }
138
+ export function getStringType(schema) {
139
+ const format = schema.format ?? "";
140
+ let type = "string";
141
+ switch (format) {
142
+ case "binary":
143
+ case "byte":
144
+ type = "bytes";
145
+ break;
146
+ case "date":
147
+ type = "plainDate";
148
+ break;
149
+ case "date-time":
150
+ // Can be 'offsetDateTime' or 'utcDateTime' - needs FIXME or union?
151
+ type = "utcDateTime";
152
+ break;
153
+ case "time":
154
+ type = "plainTime";
155
+ break;
156
+ case "duration":
157
+ type = "duration";
158
+ break;
159
+ case "uri":
160
+ type = "url";
161
+ break;
162
+ }
163
+ return type;
164
+ }
165
+ function getEnum(schemaEnum) {
166
+ return schemaEnum.map((e) => JSON.stringify(e)).join(" | ");
167
+ }
168
+ //# sourceMappingURL=generate-types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate-types.js","sourceRoot":"","sources":["../../../../../../src/cli/actions/convert/generators/generate-types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,80 @@
1
+ import { Contact, License } from "@typespec/openapi";
2
+ import { OpenAPI3Encoding, OpenAPI3Responses, OpenAPI3Schema, Refable } from "../../../types.js";
3
+ export interface TypeSpecProgram {
4
+ serviceInfo: TypeSpecServiceInfo;
5
+ models: TypeSpecModel[];
6
+ augmentations: TypeSpecAugmentation[];
7
+ operations: TypeSpecOperation[];
8
+ }
9
+ export interface TypeSpecServiceInfo {
10
+ name: string;
11
+ doc?: string;
12
+ version: string;
13
+ termsOfService?: string;
14
+ contact?: Contact;
15
+ license?: License;
16
+ summary?: string;
17
+ }
18
+ export interface TypeSpecDecorator {
19
+ name: string;
20
+ args: (object | number | string)[];
21
+ }
22
+ export interface TypeSpecAugmentation extends TypeSpecDecorator {
23
+ target: string;
24
+ }
25
+ export interface TypeSpecModel {
26
+ name: string;
27
+ doc?: string;
28
+ decorators: TypeSpecDecorator[];
29
+ properties: TypeSpecModelProperty[];
30
+ additionalProperties?: Refable<OpenAPI3Schema>;
31
+ /**
32
+ * Note: Only one of `extends` or `is` should be specified.
33
+ */
34
+ extends?: string;
35
+ /**
36
+ * Note: Only one of `extends` or `is` should be specified.
37
+ */
38
+ is?: string;
39
+ /**
40
+ * Defaults to 'object'
41
+ */
42
+ type?: OpenAPI3Schema["type"];
43
+ }
44
+ export interface TypeSpecModelProperty {
45
+ name: string;
46
+ isOptional: boolean;
47
+ doc?: string;
48
+ /**
49
+ * A partial list of decorators that can't be ascertained from
50
+ * the schema.
51
+ * Example: location decorators for parameters
52
+ */
53
+ decorators: TypeSpecDecorator[];
54
+ schema: Refable<OpenAPI3Schema>;
55
+ }
56
+ export interface TypeSpecOperation {
57
+ name: string;
58
+ doc?: string;
59
+ decorators: TypeSpecDecorator[];
60
+ operationId?: string;
61
+ parameters: Refable<TypeSpecOperationParameter>[];
62
+ requestBodies: TypeSpecRequestBody[];
63
+ responses: OpenAPI3Responses;
64
+ tags: string[];
65
+ }
66
+ export interface TypeSpecOperationParameter {
67
+ name: string;
68
+ doc?: string;
69
+ decorators: TypeSpecDecorator[];
70
+ isOptional: boolean;
71
+ schema: Refable<OpenAPI3Schema>;
72
+ }
73
+ export interface TypeSpecRequestBody {
74
+ contentType: string;
75
+ doc?: string;
76
+ isOptional: boolean;
77
+ encoding?: Record<string, OpenAPI3Encoding>;
78
+ schema?: Refable<OpenAPI3Schema>;
79
+ }
80
+ //# sourceMappingURL=interfaces.d.ts.map