@openapi-qraft/tanstack-query-react-plugin 2.0.0-next.8 → 2.0.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 (132) hide show
  1. package/CHANGELOG.md +124 -0
  2. package/dist/generateCode.d.ts +3 -3
  3. package/dist/generateCode.d.ts.map +1 -1
  4. package/dist/generateCode.js +3 -3
  5. package/dist/generateCode.js.map +1 -1
  6. package/dist/lib/createOperationCommonTSDoc.d.ts +3 -0
  7. package/dist/lib/createOperationCommonTSDoc.d.ts.map +1 -0
  8. package/dist/lib/createOperationCommonTSDoc.js +8 -0
  9. package/dist/lib/createOperationCommonTSDoc.js.map +1 -0
  10. package/dist/plugin.d.ts.map +1 -1
  11. package/dist/plugin.js +4 -1
  12. package/dist/plugin.js.map +1 -1
  13. package/dist/ts-factory/filterUnusedTypes.d.ts +9 -0
  14. package/dist/ts-factory/filterUnusedTypes.d.ts.map +1 -0
  15. package/dist/ts-factory/filterUnusedTypes.js +34 -0
  16. package/dist/ts-factory/filterUnusedTypes.js.map +1 -0
  17. package/dist/ts-factory/getClientFactory.d.ts +1 -1
  18. package/dist/ts-factory/getClientFactory.d.ts.map +1 -1
  19. package/dist/ts-factory/getClientFactory.js +1 -1
  20. package/dist/ts-factory/getClientFactory.js.map +1 -1
  21. package/dist/ts-factory/getIndexFactory.d.ts +1 -1
  22. package/dist/ts-factory/getIndexFactory.d.ts.map +1 -1
  23. package/dist/ts-factory/getIndexFactory.js +2 -2
  24. package/dist/ts-factory/getIndexFactory.js.map +1 -1
  25. package/dist/ts-factory/getServiceFactory.d.ts +5 -3
  26. package/dist/ts-factory/getServiceFactory.d.ts.map +1 -1
  27. package/dist/ts-factory/getServiceFactory.js +124 -72
  28. package/dist/ts-factory/getServiceFactory.js.map +1 -1
  29. package/dist/ts-factory/getServiceIndexFactory.d.ts +3 -3
  30. package/dist/ts-factory/getServiceIndexFactory.d.ts.map +1 -1
  31. package/dist/ts-factory/getServiceIndexFactory.js +1 -1
  32. package/dist/ts-factory/getServiceIndexFactory.js.map +1 -1
  33. package/dist/ts-factory/service-operation.generated/ServiceOperationFetchInfiniteQuery.d.ts.map +1 -1
  34. package/dist/ts-factory/service-operation.generated/ServiceOperationFetchInfiniteQuery.js +26 -67
  35. package/dist/ts-factory/service-operation.generated/ServiceOperationFetchInfiniteQuery.js.map +1 -1
  36. package/dist/ts-factory/service-operation.generated/ServiceOperationFetchQuery.d.ts.map +1 -1
  37. package/dist/ts-factory/service-operation.generated/ServiceOperationFetchQuery.js +16 -1
  38. package/dist/ts-factory/service-operation.generated/ServiceOperationFetchQuery.js.map +1 -1
  39. package/dist/ts-factory/service-operation.generated/ServiceOperationGetInfiniteQueryData.d.ts.map +1 -1
  40. package/dist/ts-factory/service-operation.generated/ServiceOperationGetInfiniteQueryData.js +6 -10
  41. package/dist/ts-factory/service-operation.generated/ServiceOperationGetInfiniteQueryData.js.map +1 -1
  42. package/dist/ts-factory/service-operation.generated/ServiceOperationGetQueryData.d.ts.map +1 -1
  43. package/dist/ts-factory/service-operation.generated/ServiceOperationGetQueryData.js +6 -10
  44. package/dist/ts-factory/service-operation.generated/ServiceOperationGetQueryData.js.map +1 -1
  45. package/dist/ts-factory/service-operation.generated/ServiceOperationGetQueryState.d.ts.map +1 -1
  46. package/dist/ts-factory/service-operation.generated/ServiceOperationGetQueryState.js +6 -10
  47. package/dist/ts-factory/service-operation.generated/ServiceOperationGetQueryState.js.map +1 -1
  48. package/dist/ts-factory/service-operation.generated/ServiceOperationMutationFn.d.ts.map +1 -1
  49. package/dist/ts-factory/service-operation.generated/ServiceOperationMutationFn.js +7 -4
  50. package/dist/ts-factory/service-operation.generated/ServiceOperationMutationFn.js.map +1 -1
  51. package/dist/ts-factory/service-operation.generated/ServiceOperationQueryFn.d.ts.map +1 -1
  52. package/dist/ts-factory/service-operation.generated/ServiceOperationQueryFn.js +11 -17
  53. package/dist/ts-factory/service-operation.generated/ServiceOperationQueryFn.js.map +1 -1
  54. package/dist/ts-factory/service-operation.generated/ServiceOperationSetQueryData.d.ts.map +1 -1
  55. package/dist/ts-factory/service-operation.generated/ServiceOperationSetQueryData.js +9 -3
  56. package/dist/ts-factory/service-operation.generated/ServiceOperationSetQueryData.js.map +1 -1
  57. package/dist/ts-factory/service-operation.generated/ServiceOperationUseMutation.d.ts.map +1 -1
  58. package/dist/ts-factory/service-operation.generated/ServiceOperationUseMutation.js +12 -15
  59. package/dist/ts-factory/service-operation.generated/ServiceOperationUseMutation.js.map +1 -1
  60. package/dist/ts-factory/tsdoc/createOperationMethodTSDocExample.d.ts +6 -0
  61. package/dist/ts-factory/tsdoc/createOperationMethodTSDocExample.d.ts.map +1 -0
  62. package/dist/ts-factory/tsdoc/createOperationMethodTSDocExample.js +31 -0
  63. package/dist/ts-factory/tsdoc/createOperationMethodTSDocExample.js.map +1 -0
  64. package/dist/ts-factory/tsdoc/createUseInfiniteQueryOperationTSDocExample.d.ts +5 -0
  65. package/dist/ts-factory/tsdoc/createUseInfiniteQueryOperationTSDocExample.d.ts.map +1 -0
  66. package/dist/ts-factory/tsdoc/createUseInfiniteQueryOperationTSDocExample.js +53 -0
  67. package/dist/ts-factory/tsdoc/createUseInfiniteQueryOperationTSDocExample.js.map +1 -0
  68. package/dist/ts-factory/tsdoc/createUseIsFetchingOperationTSDocExample.d.ts +3 -0
  69. package/dist/ts-factory/tsdoc/createUseIsFetchingOperationTSDocExample.d.ts.map +1 -0
  70. package/dist/ts-factory/tsdoc/createUseIsFetchingOperationTSDocExample.js +41 -0
  71. package/dist/ts-factory/tsdoc/createUseIsFetchingOperationTSDocExample.js.map +1 -0
  72. package/dist/ts-factory/tsdoc/createUseIsMutatingOperationTSDocExample.d.ts +3 -0
  73. package/dist/ts-factory/tsdoc/createUseIsMutatingOperationTSDocExample.d.ts.map +1 -0
  74. package/dist/ts-factory/tsdoc/createUseIsMutatingOperationTSDocExample.js +41 -0
  75. package/dist/ts-factory/tsdoc/createUseIsMutatingOperationTSDocExample.js.map +1 -0
  76. package/dist/ts-factory/tsdoc/createUseMutationOperationTSDocExample.d.ts +3 -0
  77. package/dist/ts-factory/tsdoc/createUseMutationOperationTSDocExample.d.ts.map +1 -0
  78. package/dist/ts-factory/tsdoc/createUseMutationOperationTSDocExample.js +44 -0
  79. package/dist/ts-factory/tsdoc/createUseMutationOperationTSDocExample.js.map +1 -0
  80. package/dist/ts-factory/tsdoc/createUseMutationStateOperationTSDocExample.d.ts +3 -0
  81. package/dist/ts-factory/tsdoc/createUseMutationStateOperationTSDocExample.d.ts.map +1 -0
  82. package/dist/ts-factory/tsdoc/createUseMutationStateOperationTSDocExample.js +55 -0
  83. package/dist/ts-factory/tsdoc/createUseMutationStateOperationTSDocExample.js.map +1 -0
  84. package/dist/ts-factory/tsdoc/createUseQueriesOperationTSDocExample.d.ts +3 -0
  85. package/dist/ts-factory/tsdoc/createUseQueriesOperationTSDocExample.d.ts.map +1 -0
  86. package/dist/ts-factory/tsdoc/createUseQueriesOperationTSDocExample.js +88 -0
  87. package/dist/ts-factory/tsdoc/createUseQueriesOperationTSDocExample.js.map +1 -0
  88. package/dist/ts-factory/tsdoc/createUseQueryOperationTSDocExample.d.ts +3 -0
  89. package/dist/ts-factory/tsdoc/createUseQueryOperationTSDocExample.d.ts.map +1 -0
  90. package/dist/ts-factory/tsdoc/createUseQueryOperationTSDocExample.js +37 -0
  91. package/dist/ts-factory/tsdoc/createUseQueryOperationTSDocExample.js.map +1 -0
  92. package/dist/ts-factory/tsdoc/createUseSuspenseInfiniteQueryOperationTSDocExample.d.ts +3 -0
  93. package/dist/ts-factory/tsdoc/createUseSuspenseInfiniteQueryOperationTSDocExample.d.ts.map +1 -0
  94. package/dist/ts-factory/tsdoc/createUseSuspenseInfiniteQueryOperationTSDocExample.js +39 -0
  95. package/dist/ts-factory/tsdoc/createUseSuspenseInfiniteQueryOperationTSDocExample.js.map +1 -0
  96. package/dist/ts-factory/tsdoc/lib/createOperationMethodCallExpressionExampleNode.d.ts +7 -0
  97. package/dist/ts-factory/tsdoc/lib/createOperationMethodCallExpressionExampleNode.d.ts.map +1 -0
  98. package/dist/ts-factory/tsdoc/lib/createOperationMethodCallExpressionExampleNode.js +6 -0
  99. package/dist/ts-factory/tsdoc/lib/createOperationMethodCallExpressionExampleNode.js.map +1 -0
  100. package/dist/ts-factory/tsdoc/lib/createOperationMethodParametersExampleNodes.d.ts +4 -0
  101. package/dist/ts-factory/tsdoc/lib/createOperationMethodParametersExampleNodes.d.ts.map +1 -0
  102. package/dist/ts-factory/tsdoc/lib/createOperationMethodParametersExampleNodes.js +47 -0
  103. package/dist/ts-factory/tsdoc/lib/createOperationMethodParametersExampleNodes.js.map +1 -0
  104. package/package.json +6 -6
  105. package/src/generateCode.ts +8 -8
  106. package/src/lib/createOperationCommonTSDoc.ts +11 -0
  107. package/src/plugin.ts +8 -3
  108. package/src/ts-factory/filterUnusedTypes.ts +49 -0
  109. package/src/ts-factory/getClientFactory.ts +2 -2
  110. package/src/ts-factory/getIndexFactory.ts +13 -4
  111. package/src/ts-factory/getServiceFactory.ts +213 -139
  112. package/src/ts-factory/getServiceIndexFactory.ts +7 -7
  113. package/src/ts-factory/service-operation.generated/ServiceOperationFetchInfiniteQuery.ts +101 -190
  114. package/src/ts-factory/service-operation.generated/ServiceOperationFetchQuery.ts +80 -0
  115. package/src/ts-factory/service-operation.generated/ServiceOperationGetInfiniteQueryData.ts +28 -41
  116. package/src/ts-factory/service-operation.generated/ServiceOperationGetQueryData.ts +28 -41
  117. package/src/ts-factory/service-operation.generated/ServiceOperationGetQueryState.ts +28 -41
  118. package/src/ts-factory/service-operation.generated/ServiceOperationMutationFn.ts +23 -22
  119. package/src/ts-factory/service-operation.generated/ServiceOperationQueryFn.ts +49 -70
  120. package/src/ts-factory/service-operation.generated/ServiceOperationSetQueryData.ts +34 -10
  121. package/src/ts-factory/service-operation.generated/ServiceOperationUseMutation.ts +42 -59
  122. package/src/ts-factory/tsdoc/createOperationMethodTSDocExample.ts +65 -0
  123. package/src/ts-factory/tsdoc/createUseInfiniteQueryOperationTSDocExample.ts +135 -0
  124. package/src/ts-factory/tsdoc/createUseIsFetchingOperationTSDocExample.ts +81 -0
  125. package/src/ts-factory/tsdoc/createUseIsMutatingOperationTSDocExample.ts +74 -0
  126. package/src/ts-factory/tsdoc/createUseMutationOperationTSDocExample.ts +88 -0
  127. package/src/ts-factory/tsdoc/createUseMutationStateOperationTSDocExample.ts +154 -0
  128. package/src/ts-factory/tsdoc/createUseQueriesOperationTSDocExample.ts +292 -0
  129. package/src/ts-factory/tsdoc/createUseQueryOperationTSDocExample.ts +76 -0
  130. package/src/ts-factory/tsdoc/createUseSuspenseInfiniteQueryOperationTSDocExample.ts +63 -0
  131. package/src/ts-factory/tsdoc/lib/createOperationMethodCallExpressionExampleNode.ts +28 -0
  132. package/src/ts-factory/tsdoc/lib/createOperationMethodParametersExampleNodes.ts +83 -0
@@ -0,0 +1,47 @@
1
+ import camelcase from 'camelcase';
2
+ import ts from 'typescript';
3
+ export const createOperationMethodParametersExampleNodes = (operation, transformOperationParameterIdentifier) => {
4
+ if (!operation.parameters)
5
+ return [];
6
+ const parametersTypeList = operation.parameters
7
+ .map((parameter) => parameter.in)
8
+ .filter((parameterKind, index, array) => array.indexOf(parameterKind) === index);
9
+ const operationRequiredParameters = operation.parameters.filter((parameter) => parameter.required);
10
+ return parametersTypeList.reduce((acc, parameterKind) => {
11
+ let operationParameters = operationRequiredParameters.filter((parameter) => parameter.in === parameterKind);
12
+ if (!operationParameters.length) {
13
+ const operationParameter = operation.parameters?.find((parameter) => parameter.in === parameterKind);
14
+ if (operationParameter) {
15
+ operationParameters = [operationParameter];
16
+ }
17
+ }
18
+ if (!operationParameters.length)
19
+ return acc;
20
+ const factory = ts.factory;
21
+ return [
22
+ ...acc,
23
+ factory.createPropertyAssignment(factory.createIdentifier(parameterKind), factory.createObjectLiteralExpression(operationParameters.map((parameter) => factory.createPropertyAssignment(isIdentifierCompatibleVariableName(parameter.name)
24
+ ? factory.createIdentifier(parameter.name)
25
+ : factory.createStringLiteral(parameter.name), parameter.example // todo:: add example type inferring
26
+ ? factory.createStringLiteral(parameter.example)
27
+ : factory.createIdentifier(transformOperationParameterIdentifier
28
+ ? transformOperationParameterIdentifier(parameter)
29
+ : camelcase(parameter.name)))), true)),
30
+ ];
31
+ }, []);
32
+ };
33
+ /**
34
+ * Checks if the given name is a valid identifier name.
35
+ *
36
+ * @example
37
+ * ```ts
38
+ * isIdentifierCompatibleVariableName('foo'); // true
39
+ * isIdentifierCompatibleVariableName('foo-bar'); // false
40
+ * isIdentifierCompatibleVariableName('foo_bar'); // true
41
+ * isIdentifierCompatibleVariableName('foo.bar'); // false
42
+ * ```
43
+ */
44
+ function isIdentifierCompatibleVariableName(name) {
45
+ return !/[^a-zA-Z0-9_$]/.test(name);
46
+ }
47
+ //# sourceMappingURL=createOperationMethodParametersExampleNodes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createOperationMethodParametersExampleNodes.js","sourceRoot":"","sources":["../../../../src/ts-factory/tsdoc/lib/createOperationMethodParametersExampleNodes.ts"],"names":[],"mappings":"AACA,OAAO,SAAS,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,MAAM,YAAY,CAAC;AAE5B,MAAM,CAAC,MAAM,2CAA2C,GAAG,CACzD,SAA2B,EAC3B,qCAEW,EACc,EAAE;IAC3B,IAAI,CAAC,SAAS,CAAC,UAAU;QAAE,OAAO,EAAE,CAAC;IAErC,MAAM,kBAAkB,GAAG,SAAS,CAAC,UAAU;SAC5C,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC;SAChC,MAAM,CACL,CAAC,aAAa,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,aAAa,CAAC,KAAK,KAAK,CACxE,CAAC;IAEJ,MAAM,2BAA2B,GAAG,SAAS,CAAC,UAAU,CAAC,MAAM,CAC7D,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,QAAQ,CAClC,CAAC;IAEF,OAAO,kBAAkB,CAAC,MAAM,CAC9B,CAAC,GAAG,EAAE,aAAa,EAAE,EAAE;QACrB,IAAI,mBAAmB,GAAG,2BAA2B,CAAC,MAAM,CAC1D,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,EAAE,KAAK,aAAa,CAC9C,CAAC;QAEF,IAAI,CAAC,mBAAmB,CAAC,MAAM,EAAE,CAAC;YAChC,MAAM,kBAAkB,GAAG,SAAS,CAAC,UAAU,EAAE,IAAI,CACnD,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,EAAE,KAAK,aAAa,CAC9C,CAAC;YACF,IAAI,kBAAkB,EAAE,CAAC;gBACvB,mBAAmB,GAAG,CAAC,kBAAkB,CAAC,CAAC;YAC7C,CAAC;QACH,CAAC;QAED,IAAI,CAAC,mBAAmB,CAAC,MAAM;YAAE,OAAO,GAAG,CAAC;QAE5C,MAAM,OAAO,GAAG,EAAE,CAAC,OAAO,CAAC;QAE3B,OAAO;YACL,GAAG,GAAG;YACN,OAAO,CAAC,wBAAwB,CAC9B,OAAO,CAAC,gBAAgB,CAAC,aAAa,CAAC,EACvC,OAAO,CAAC,6BAA6B,CACnC,mBAAmB,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CACpC,OAAO,CAAC,wBAAwB,CAC9B,kCAAkC,CAAC,SAAS,CAAC,IAAI,CAAC;gBAChD,CAAC,CAAC,OAAO,CAAC,gBAAgB,CAAC,SAAS,CAAC,IAAI,CAAC;gBAC1C,CAAC,CAAC,OAAO,CAAC,mBAAmB,CAAC,SAAS,CAAC,IAAI,CAAC,EAC/C,SAAS,CAAC,OAAO,CAAC,oCAAoC;gBACpD,CAAC,CAAC,OAAO,CAAC,mBAAmB,CAAC,SAAS,CAAC,OAAO,CAAC;gBAChD,CAAC,CAAC,OAAO,CAAC,gBAAgB,CACtB,qCAAqC;oBACnC,CAAC,CAAC,qCAAqC,CAAC,SAAS,CAAC;oBAClD,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,IAAI,CAAC,CAC9B,CACN,CACF,EACD,IAAI,CACL,CACF;SACF,CAAC;IACJ,CAAC,EACD,EAAE,CACH,CAAC;AACJ,CAAC,CAAC;AAEF;;;;;;;;;;GAUG;AACH,SAAS,kCAAkC,CAAC,IAAY;IACtD,OAAO,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACtC,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@openapi-qraft/tanstack-query-react-plugin",
3
- "version": "2.0.0-next.8",
3
+ "version": "2.0.0",
4
4
  "type": "module",
5
5
  "scripts": {
6
6
  "build": "tsc --project tsconfig.build.json",
@@ -27,18 +27,18 @@
27
27
  }
28
28
  },
29
29
  "dependencies": {
30
- "@openapi-qraft/plugin": "^2.0.0-next.8",
31
- "typescript": "^5.5.4"
30
+ "@openapi-qraft/plugin": "^2.0.0",
31
+ "typescript": "^5.6.2"
32
32
  },
33
33
  "devDependencies": {
34
34
  "@openapi-qraft/eslint-config": "1.0.0",
35
35
  "@openapi-qraft/test-fixtures": "1.0.0",
36
36
  "@openapi-qraft/ts-factory-code-generator": "1.0.0",
37
37
  "camelcase": "^8.0.0",
38
- "eslint": "^9.0.0",
39
- "memfs": "^4.9.2",
38
+ "eslint": "^9.16.0",
39
+ "memfs": "^4.11.1",
40
40
  "rimraf": "^5.0.10",
41
- "vitest": "^1.4.0"
41
+ "vitest": "^2.1.8"
42
42
  },
43
43
  "files": [
44
44
  "dist",
@@ -1,7 +1,7 @@
1
1
  import { URL } from 'node:url';
2
2
  import { formatFileHeader } from '@openapi-qraft/plugin/lib/formatFileHeader';
3
3
  import { GeneratorFile } from '@openapi-qraft/plugin/lib/GeneratorFile';
4
- import { Service } from '@openapi-qraft/plugin/lib/open-api/getServices';
4
+ import { OpenAPIService } from '@openapi-qraft/plugin/lib/open-api/OpenAPIService';
5
5
  import { OutputOptions as OutputOptionsBase } from '@openapi-qraft/plugin/lib/OutputOptions';
6
6
  import { PredefinedParametersGlob } from '@openapi-qraft/plugin/lib/predefineSchemaParameters';
7
7
  import c from 'ansi-colors';
@@ -19,7 +19,7 @@ import { getServiceIndexFactory } from './ts-factory/getServiceIndexFactory.js';
19
19
  interface OutputOptions extends OutputOptionsBase {
20
20
  fileHeader: string | undefined;
21
21
  servicesDirName: string;
22
- explicitImportExtensions: boolean;
22
+ explicitImportExtensions: '.js' | '.ts' | undefined;
23
23
  exportSchemaTypes: boolean | undefined;
24
24
  operationPredefinedParameters: Array<PredefinedParametersGlob> | undefined;
25
25
  }
@@ -31,7 +31,7 @@ export const generateCode = async ({
31
31
  output,
32
32
  }: {
33
33
  spinner: Ora;
34
- services: Service[];
34
+ services: OpenAPIService[];
35
35
  serviceImports: ServiceImportsFactoryOptions;
36
36
  output: OutputOptions;
37
37
  }) => {
@@ -58,7 +58,7 @@ const composeServicesDirPath = (
58
58
 
59
59
  const generateServices = async (
60
60
  spinner: Ora,
61
- services: Service[],
61
+ services: OpenAPIService[],
62
62
  serviceImports: ServiceImportsFactoryOptions,
63
63
  output: OutputOptions
64
64
  ) => {
@@ -112,7 +112,7 @@ const generateServices = async (
112
112
 
113
113
  const generateServiceIndex = async (
114
114
  spinner: Ora,
115
- services: Service[],
115
+ services: OpenAPIService[],
116
116
  output: OutputOptions
117
117
  ) => {
118
118
  spinner.start('Generating services index');
@@ -127,7 +127,7 @@ const generateServiceIndex = async (
127
127
  try {
128
128
  const code = astToString(
129
129
  getServiceIndexFactory(services, {
130
- explicitImportExtensions: Boolean(output.explicitImportExtensions),
130
+ explicitImportExtensions: output.explicitImportExtensions,
131
131
  })
132
132
  );
133
133
 
@@ -157,7 +157,7 @@ const generateClient = async (spinner: Ora, output: OutputOptions) => {
157
157
  const code = astToString(
158
158
  getClientFactory({
159
159
  servicesDirName: output.servicesDirName,
160
- explicitImportExtensions: Boolean(output.explicitImportExtensions),
160
+ explicitImportExtensions: output.explicitImportExtensions,
161
161
  })
162
162
  );
163
163
 
@@ -228,7 +228,7 @@ const generateIndex = async (
228
228
  const code = astToString(
229
229
  getIndexFactory({
230
230
  servicesDirName: output.servicesDirName,
231
- explicitImportExtensions: Boolean(output.explicitImportExtensions),
231
+ explicitImportExtensions: output.explicitImportExtensions,
232
232
  openapiTypesImportPath: output.exportSchemaTypes
233
233
  ? serviceImports.openapiTypesImportPath
234
234
  : undefined,
@@ -0,0 +1,11 @@
1
+ import { ServiceOperation } from '@openapi-qraft/plugin/lib/open-api/OpenAPIService';
2
+
3
+ export const createOperationCommonTSDoc = (operation: ServiceOperation) => {
4
+ return [
5
+ operation.deprecated ? '@deprecated' : null,
6
+ operation.summary ? `@summary ${operation.summary}` : null,
7
+ operation.description ? `@description ${operation.description}` : null,
8
+ ].filter((comment): comment is NonNullable<typeof comment> =>
9
+ Boolean(comment)
10
+ );
11
+ };
package/src/plugin.ts CHANGED
@@ -5,6 +5,7 @@ import {
5
5
  } from '@openapi-qraft/plugin/lib/predefineSchemaParameters';
6
6
  import { QraftCommand } from '@openapi-qraft/plugin/lib/QraftCommand';
7
7
  import { QraftCommandPlugin } from '@openapi-qraft/plugin/lib/QraftCommandPlugin';
8
+ import { Option } from 'commander';
8
9
  import { generateCode } from './generateCode.js';
9
10
 
10
11
  export const plugin: QraftCommandPlugin = {
@@ -15,9 +16,13 @@ export const plugin: QraftCommandPlugin = {
15
16
  '--openapi-types-import-path <path>',
16
17
  'Path to schema types file (.d.ts), eg: "../schema.d.ts"'
17
18
  )
18
- .option(
19
- '--explicit-import-extensions',
20
- 'All import statements will include explicit `.js` extensions. Ideal for projects using ECMAScript modules.'
19
+ .addOption(
20
+ new Option(
21
+ '--explicit-import-extensions [extension]',
22
+ 'All import statements will contain an explicit file extension. Ideal for projects using ECMAScript modules.'
23
+ )
24
+ .preset('.js')
25
+ .choices(['.js', '.ts'])
21
26
  )
22
27
  .option(
23
28
  '--export-openapi-types [bool]',
@@ -0,0 +1,49 @@
1
+ import ts from 'typescript';
2
+
3
+ /**
4
+ * Checks if a type is used in the given nodes.
5
+ * @param typeImports Record<moduleName, typeName[]>
6
+ * @param nodes
7
+ * @returns Record<moduleName, typeName[]>
8
+ */
9
+ export function filterUnusedTypes(
10
+ typeImports: Record<string, string[]>,
11
+ nodes: ts.Node[]
12
+ ): Record<string, string[]> {
13
+ const usedTypeImports: Record<string, string[]> = {};
14
+ const targetTypeNames = Object.entries(typeImports).reduce<
15
+ Record<string, string>
16
+ >(
17
+ (acc, [moduleName, typeImports]) =>
18
+ typeImports.reduce((acc, typeName) => {
19
+ acc[typeName] = moduleName;
20
+ return acc;
21
+ }, acc),
22
+ {}
23
+ );
24
+
25
+ const transformer =
26
+ (context: ts.TransformationContext) => (rootNode: ts.Node) => {
27
+ function visit(node: ts.Node): ts.Node {
28
+ if (ts.isTypeReferenceNode(node) && ts.isIdentifier(node.typeName)) {
29
+ const typeName = node.typeName.text;
30
+ const moduleName = targetTypeNames[typeName];
31
+ if (moduleName) {
32
+ usedTypeImports[moduleName] ??= [];
33
+ if (!usedTypeImports[moduleName].includes(typeName)) {
34
+ usedTypeImports[moduleName].push(typeName);
35
+ usedTypeImports[moduleName].sort();
36
+ }
37
+ }
38
+ }
39
+
40
+ return ts.visitEachChild(node, visit, context);
41
+ }
42
+
43
+ return ts.visitNode(rootNode, visit);
44
+ };
45
+
46
+ ts.transform(nodes, [transformer]).dispose();
47
+
48
+ return usedTypeImports;
49
+ }
@@ -2,7 +2,7 @@ import ts from 'typescript';
2
2
 
3
3
  type Options = {
4
4
  servicesDirName: string;
5
- explicitImportExtensions: boolean;
5
+ explicitImportExtensions: '.js' | '.ts' | undefined;
6
6
  };
7
7
 
8
8
  export const getClientFactory = (options: Options) => {
@@ -79,7 +79,7 @@ const getClientImportsFactory = ({
79
79
  ])
80
80
  ),
81
81
  factory.createStringLiteral(
82
- `./${servicesDirName}/index${explicitImportExtensions ? '.js' : ''}`
82
+ `./${servicesDirName}/index${explicitImportExtensions ?? ''}`
83
83
  ),
84
84
  undefined
85
85
  ),
@@ -8,18 +8,27 @@ export const getIndexFactory = ({
8
8
  explicitImportExtensions,
9
9
  }: {
10
10
  servicesDirName: string;
11
- explicitImportExtensions: boolean;
11
+ explicitImportExtensions: '.js' | '.ts' | undefined;
12
12
  } & Partial<Pick<ServiceImportsFactoryOptions, 'openapiTypesImportPath'>>) => {
13
13
  const factory = ts.factory;
14
- const importExtension = explicitImportExtensions ? '.js' : '';
14
+ const importExtension = explicitImportExtensions ?? '';
15
15
 
16
16
  return [
17
17
  ...(openapiTypesImportPath
18
18
  ? [
19
19
  factory.createExportDeclaration(
20
20
  undefined,
21
- openapiTypesImportPath.endsWith('.d.ts'),
22
- undefined,
21
+ true,
22
+ factory.createNamedExports(
23
+ ['$defs', 'paths', 'components', 'operations', 'webhooks'].map(
24
+ (name) =>
25
+ factory.createExportSpecifier(
26
+ false,
27
+ undefined,
28
+ factory.createIdentifier(name)
29
+ )
30
+ )
31
+ ),
23
32
  factory.createStringLiteral(
24
33
  maybeResolveImport({ openapiTypesImportPath, servicesDirName })
25
34
  ),