@odata-effect/odata-effect-generator 0.6.8 → 0.6.10

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 (58) hide show
  1. package/dist/cjs/Cli.js +30 -13
  2. package/dist/cjs/Cli.js.map +1 -1
  3. package/dist/cjs/generator/Generator.js +1 -1
  4. package/dist/cjs/generator/Generator.js.map +1 -1
  5. package/dist/cjs/generator/IndexGenerator.js +3 -1
  6. package/dist/cjs/generator/IndexGenerator.js.map +1 -1
  7. package/dist/cjs/generator/ModelsGenerator.js +7 -16
  8. package/dist/cjs/generator/ModelsGenerator.js.map +1 -1
  9. package/dist/cjs/generator/NavigationGenerator.js +3 -1
  10. package/dist/cjs/generator/NavigationGenerator.js.map +1 -1
  11. package/dist/cjs/generator/OperationsGenerator.js +69 -1
  12. package/dist/cjs/generator/OperationsGenerator.js.map +1 -1
  13. package/dist/cjs/generator/QueryModelsGenerator.js +3 -1
  14. package/dist/cjs/generator/QueryModelsGenerator.js.map +1 -1
  15. package/dist/cjs/generator/ServiceFnGenerator.js +1 -2
  16. package/dist/cjs/generator/ServiceFnGenerator.js.map +1 -1
  17. package/dist/cjs/model/GeneratorConfig.js.map +1 -1
  18. package/dist/dts/Cli.d.ts.map +1 -1
  19. package/dist/dts/generator/Generator.d.ts +1 -1
  20. package/dist/dts/generator/IndexGenerator.d.ts +2 -3
  21. package/dist/dts/generator/IndexGenerator.d.ts.map +1 -1
  22. package/dist/dts/generator/NavigationGenerator.d.ts +2 -3
  23. package/dist/dts/generator/NavigationGenerator.d.ts.map +1 -1
  24. package/dist/dts/generator/OperationsGenerator.d.ts +2 -3
  25. package/dist/dts/generator/OperationsGenerator.d.ts.map +1 -1
  26. package/dist/dts/generator/QueryModelsGenerator.d.ts +2 -3
  27. package/dist/dts/generator/QueryModelsGenerator.d.ts.map +1 -1
  28. package/dist/dts/generator/ServiceFnGenerator.d.ts +2 -3
  29. package/dist/dts/generator/ServiceFnGenerator.d.ts.map +1 -1
  30. package/dist/dts/model/GeneratorConfig.d.ts +1 -3
  31. package/dist/dts/model/GeneratorConfig.d.ts.map +1 -1
  32. package/dist/esm/Cli.js +30 -13
  33. package/dist/esm/Cli.js.map +1 -1
  34. package/dist/esm/generator/Generator.js +1 -1
  35. package/dist/esm/generator/Generator.js.map +1 -1
  36. package/dist/esm/generator/IndexGenerator.js +3 -1
  37. package/dist/esm/generator/IndexGenerator.js.map +1 -1
  38. package/dist/esm/generator/ModelsGenerator.js +7 -16
  39. package/dist/esm/generator/ModelsGenerator.js.map +1 -1
  40. package/dist/esm/generator/NavigationGenerator.js +3 -1
  41. package/dist/esm/generator/NavigationGenerator.js.map +1 -1
  42. package/dist/esm/generator/OperationsGenerator.js +69 -1
  43. package/dist/esm/generator/OperationsGenerator.js.map +1 -1
  44. package/dist/esm/generator/QueryModelsGenerator.js +3 -1
  45. package/dist/esm/generator/QueryModelsGenerator.js.map +1 -1
  46. package/dist/esm/generator/ServiceFnGenerator.js +1 -2
  47. package/dist/esm/generator/ServiceFnGenerator.js.map +1 -1
  48. package/dist/esm/model/GeneratorConfig.js.map +1 -1
  49. package/package.json +1 -1
  50. package/src/Cli.ts +41 -16
  51. package/src/generator/Generator.ts +2 -2
  52. package/src/generator/IndexGenerator.ts +3 -4
  53. package/src/generator/ModelsGenerator.ts +7 -17
  54. package/src/generator/NavigationGenerator.ts +3 -4
  55. package/src/generator/OperationsGenerator.ts +72 -4
  56. package/src/generator/QueryModelsGenerator.ts +3 -4
  57. package/src/generator/ServiceFnGenerator.ts +3 -5
  58. package/src/model/GeneratorConfig.ts +1 -3
@@ -82,9 +82,8 @@ export interface OperationsGenerationResult {
82
82
  export interface OperationsGeneratorOptions {
83
83
  /**
84
84
  * Add .js extensions to relative imports for ESM compatibility.
85
- * @default true
86
85
  */
87
- readonly esmExtensions?: boolean
86
+ readonly esmExtensions: boolean
88
87
  }
89
88
 
90
89
  /**
@@ -95,9 +94,9 @@ export interface OperationsGeneratorOptions {
95
94
  */
96
95
  export const generateOperations = (
97
96
  dataModel: DataModel,
98
- options?: OperationsGeneratorOptions
97
+ options: OperationsGeneratorOptions
99
98
  ): OperationsGenerationResult => {
100
- const esmExtensions = options?.esmExtensions ?? true
99
+ const { esmExtensions } = options
101
100
 
102
101
  // Get unbound operations only (bound operations are attached to entity services)
103
102
  const unboundOperations = Array.from(dataModel.operations.values()).filter((op) => !op.isBound)
@@ -151,6 +150,65 @@ const getReturnTypeName = (operation: OperationModel): string => {
151
150
  return isCollection ? `ReadonlyArray<${baseType}>` : baseType
152
151
  }
153
152
 
153
+ /**
154
+ * Check if any operation uses Schema.* types for primitives.
155
+ */
156
+ const needsSchemaImport = (operations: ReadonlyArray<OperationModel>, dataModel: DataModel): boolean => {
157
+ for (const operation of operations) {
158
+ // Check return type - only if it's not a model type
159
+ if (operation.returnType && !returnsModelType(operation, dataModel)) {
160
+ if (operation.returnType.typeMapping.effectSchema.startsWith("Schema.")) {
161
+ return true
162
+ }
163
+ }
164
+ // Check parameters - only if they're not model types
165
+ for (const param of operation.parameters) {
166
+ if (param.typeMapping.effectSchema.startsWith("Schema.")) {
167
+ // Check if it's not a model type
168
+ const typeName = param.typeMapping.tsType
169
+ let isModel = false
170
+ for (const [fqName] of dataModel.entityTypes) {
171
+ if (fqName.endsWith(`.${typeName}`) || fqName === typeName) {
172
+ isModel = true
173
+ break
174
+ }
175
+ }
176
+ if (!isModel) {
177
+ for (const [fqName] of dataModel.complexTypes) {
178
+ if (fqName.endsWith(`.${typeName}`) || fqName === typeName) {
179
+ isModel = true
180
+ break
181
+ }
182
+ }
183
+ }
184
+ if (!isModel) return true
185
+ }
186
+ }
187
+ }
188
+ return false
189
+ }
190
+
191
+ /**
192
+ * Check if any operation uses ODataSchema.* types.
193
+ */
194
+ const needsODataSchemaImport = (operations: ReadonlyArray<OperationModel>, dataModel: DataModel): boolean => {
195
+ for (const operation of operations) {
196
+ // Check return type - only if it's not a model type
197
+ if (operation.returnType && !returnsModelType(operation, dataModel)) {
198
+ if (operation.returnType.typeMapping.effectSchema.startsWith("ODataSchema.")) {
199
+ return true
200
+ }
201
+ }
202
+ // Check parameters
203
+ for (const param of operation.parameters) {
204
+ if (param.typeMapping.effectSchema.startsWith("ODataSchema.")) {
205
+ return true
206
+ }
207
+ }
208
+ }
209
+ return false
210
+ }
211
+
154
212
  /**
155
213
  * Collect all model types that need to be imported.
156
214
  */
@@ -200,6 +258,10 @@ const generateOperationsFile = (
200
258
  const versionConfig = getVersionConfig(dataModel.version)
201
259
  const isV4 = dataModel.version === "V4"
202
260
 
261
+ // Determine which imports are needed
262
+ const needsSchema = needsSchemaImport(operations, dataModel)
263
+ const needsODataSchema = needsODataSchemaImport(operations, dataModel)
264
+
203
265
  // Header and imports
204
266
  lines.push(`/**`)
205
267
  lines.push(` * OData operations for ${dataModel.serviceName} OData ${dataModel.version}.`)
@@ -208,6 +270,9 @@ const generateOperationsFile = (
208
270
  lines.push(` * @since 1.0.0`)
209
271
  lines.push(` */`)
210
272
  lines.push(`import * as Effect from "effect/Effect"`)
273
+ if (needsSchema) {
274
+ lines.push(`import * as Schema from "effect/Schema"`)
275
+ }
211
276
  lines.push(`import { HttpClient } from "@effect/platform"`)
212
277
  lines.push(`import type * as HttpClientError from "@effect/platform/HttpClientError"`)
213
278
  lines.push(``)
@@ -224,6 +289,9 @@ const generateOperationsFile = (
224
289
  lines.push(` type ODataError,`)
225
290
  lines.push(` type ParseError`)
226
291
  lines.push(`} from "@odata-effect/odata-effect/Errors"`)
292
+ if (needsODataSchema) {
293
+ lines.push(`import { ODataSchema } from "@odata-effect/odata-effect"`)
294
+ }
227
295
  lines.push(``)
228
296
 
229
297
  // Import model types if needed
@@ -27,9 +27,8 @@ import {
27
27
  export interface QueryModelsGeneratorOptions {
28
28
  /**
29
29
  * Add .js extensions to relative imports for ESM compatibility.
30
- * @default true
31
30
  */
32
- readonly esmExtensions?: boolean
31
+ readonly esmExtensions: boolean
33
32
  }
34
33
 
35
34
  /**
@@ -40,9 +39,9 @@ export interface QueryModelsGeneratorOptions {
40
39
  */
41
40
  export const generateQueryModels = (
42
41
  dataModel: DataModel,
43
- options?: QueryModelsGeneratorOptions
42
+ options: QueryModelsGeneratorOptions
44
43
  ): string => {
45
- const esmExtensions = options?.esmExtensions ?? true
44
+ const { esmExtensions } = options
46
45
  const lines: Array<string> = []
47
46
 
48
47
  // Collect all query path types needed
@@ -40,9 +40,8 @@ export interface ServiceGenerationResult {
40
40
  export interface ServiceGeneratorOptions {
41
41
  /**
42
42
  * Add .js extensions to relative imports for ESM compatibility.
43
- * @default true
44
43
  */
45
- readonly esmExtensions?: boolean
44
+ readonly esmExtensions: boolean
46
45
  }
47
46
 
48
47
  /**
@@ -53,10 +52,9 @@ export interface ServiceGeneratorOptions {
53
52
  */
54
53
  export const generateServiceFns = (
55
54
  dataModel: DataModel,
56
- options?: ServiceGeneratorOptions
55
+ options: ServiceGeneratorOptions
57
56
  ): ServiceGenerationResult => {
58
- const esmExtensions = options?.esmExtensions ?? true
59
- const content = generateServicesFile(dataModel, esmExtensions)
57
+ const content = generateServicesFile(dataModel, options.esmExtensions)
60
58
  return {
61
59
  servicesFile: {
62
60
  fileName: "Services.ts",
@@ -14,9 +14,7 @@ export interface GeneratorOptions {
14
14
  /**
15
15
  * Add .js extensions to relative imports for ESM compatibility.
16
16
  * Required for moduleResolution: node16/nodenext.
17
- * Default: true (recommended for ESM projects)
18
- *
19
- * @default true
17
+ * @default false
20
18
  */
21
19
  readonly esmExtensions?: boolean
22
20