@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.
- package/dist/cjs/Cli.js +30 -13
- package/dist/cjs/Cli.js.map +1 -1
- package/dist/cjs/generator/Generator.js +1 -1
- package/dist/cjs/generator/Generator.js.map +1 -1
- package/dist/cjs/generator/IndexGenerator.js +3 -1
- package/dist/cjs/generator/IndexGenerator.js.map +1 -1
- package/dist/cjs/generator/ModelsGenerator.js +7 -16
- package/dist/cjs/generator/ModelsGenerator.js.map +1 -1
- package/dist/cjs/generator/NavigationGenerator.js +3 -1
- package/dist/cjs/generator/NavigationGenerator.js.map +1 -1
- package/dist/cjs/generator/OperationsGenerator.js +69 -1
- package/dist/cjs/generator/OperationsGenerator.js.map +1 -1
- package/dist/cjs/generator/QueryModelsGenerator.js +3 -1
- package/dist/cjs/generator/QueryModelsGenerator.js.map +1 -1
- package/dist/cjs/generator/ServiceFnGenerator.js +1 -2
- package/dist/cjs/generator/ServiceFnGenerator.js.map +1 -1
- package/dist/cjs/model/GeneratorConfig.js.map +1 -1
- package/dist/dts/Cli.d.ts.map +1 -1
- package/dist/dts/generator/Generator.d.ts +1 -1
- package/dist/dts/generator/IndexGenerator.d.ts +2 -3
- package/dist/dts/generator/IndexGenerator.d.ts.map +1 -1
- package/dist/dts/generator/NavigationGenerator.d.ts +2 -3
- package/dist/dts/generator/NavigationGenerator.d.ts.map +1 -1
- package/dist/dts/generator/OperationsGenerator.d.ts +2 -3
- package/dist/dts/generator/OperationsGenerator.d.ts.map +1 -1
- package/dist/dts/generator/QueryModelsGenerator.d.ts +2 -3
- package/dist/dts/generator/QueryModelsGenerator.d.ts.map +1 -1
- package/dist/dts/generator/ServiceFnGenerator.d.ts +2 -3
- package/dist/dts/generator/ServiceFnGenerator.d.ts.map +1 -1
- package/dist/dts/model/GeneratorConfig.d.ts +1 -3
- package/dist/dts/model/GeneratorConfig.d.ts.map +1 -1
- package/dist/esm/Cli.js +30 -13
- package/dist/esm/Cli.js.map +1 -1
- package/dist/esm/generator/Generator.js +1 -1
- package/dist/esm/generator/Generator.js.map +1 -1
- package/dist/esm/generator/IndexGenerator.js +3 -1
- package/dist/esm/generator/IndexGenerator.js.map +1 -1
- package/dist/esm/generator/ModelsGenerator.js +7 -16
- package/dist/esm/generator/ModelsGenerator.js.map +1 -1
- package/dist/esm/generator/NavigationGenerator.js +3 -1
- package/dist/esm/generator/NavigationGenerator.js.map +1 -1
- package/dist/esm/generator/OperationsGenerator.js +69 -1
- package/dist/esm/generator/OperationsGenerator.js.map +1 -1
- package/dist/esm/generator/QueryModelsGenerator.js +3 -1
- package/dist/esm/generator/QueryModelsGenerator.js.map +1 -1
- package/dist/esm/generator/ServiceFnGenerator.js +1 -2
- package/dist/esm/generator/ServiceFnGenerator.js.map +1 -1
- package/dist/esm/model/GeneratorConfig.js.map +1 -1
- package/package.json +1 -1
- package/src/Cli.ts +41 -16
- package/src/generator/Generator.ts +2 -2
- package/src/generator/IndexGenerator.ts +3 -4
- package/src/generator/ModelsGenerator.ts +7 -17
- package/src/generator/NavigationGenerator.ts +3 -4
- package/src/generator/OperationsGenerator.ts +72 -4
- package/src/generator/QueryModelsGenerator.ts +3 -4
- package/src/generator/ServiceFnGenerator.ts +3 -5
- 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
|
|
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
|
|
97
|
+
options: OperationsGeneratorOptions
|
|
99
98
|
): OperationsGenerationResult => {
|
|
100
|
-
const esmExtensions = options
|
|
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
|
|
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
|
|
42
|
+
options: QueryModelsGeneratorOptions
|
|
44
43
|
): string => {
|
|
45
|
-
const esmExtensions = options
|
|
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
|
|
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
|
|
55
|
+
options: ServiceGeneratorOptions
|
|
57
56
|
): ServiceGenerationResult => {
|
|
58
|
-
const
|
|
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
|
-
*
|
|
18
|
-
*
|
|
19
|
-
* @default true
|
|
17
|
+
* @default false
|
|
20
18
|
*/
|
|
21
19
|
readonly esmExtensions?: boolean
|
|
22
20
|
|