@odata-effect/odata-effect-generator 0.2.0 → 0.3.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 (61) hide show
  1. package/README.md +17 -8
  2. package/dist/cjs/Cli.js +2 -2
  3. package/dist/cjs/Cli.js.map +1 -1
  4. package/dist/cjs/generator/Generator.js +5 -13
  5. package/dist/cjs/generator/Generator.js.map +1 -1
  6. package/dist/cjs/generator/IndexGenerator.js +14 -11
  7. package/dist/cjs/generator/IndexGenerator.js.map +1 -1
  8. package/dist/cjs/generator/ModelsGenerator.js +2 -5
  9. package/dist/cjs/generator/ModelsGenerator.js.map +1 -1
  10. package/dist/cjs/generator/NamingHelper.js.map +1 -1
  11. package/dist/cjs/generator/NavigationGenerator.js +43 -11
  12. package/dist/cjs/generator/NavigationGenerator.js.map +1 -1
  13. package/dist/cjs/generator/OperationsGenerator.js +2 -2
  14. package/dist/cjs/generator/OperationsGenerator.js.map +1 -1
  15. package/dist/cjs/generator/ServiceFnGenerator.js +102 -224
  16. package/dist/cjs/generator/ServiceFnGenerator.js.map +1 -1
  17. package/dist/cjs/index.js +3 -3
  18. package/dist/dts/Cli.d.ts.map +1 -1
  19. package/dist/dts/generator/Generator.d.ts.map +1 -1
  20. package/dist/dts/generator/IndexGenerator.d.ts.map +1 -1
  21. package/dist/dts/generator/NamingHelper.d.ts.map +1 -1
  22. package/dist/dts/generator/NavigationGenerator.d.ts.map +1 -1
  23. package/dist/dts/generator/ServiceFnGenerator.d.ts +10 -11
  24. package/dist/dts/generator/ServiceFnGenerator.d.ts.map +1 -1
  25. package/dist/dts/index.d.ts +4 -4
  26. package/dist/dts/index.d.ts.map +1 -1
  27. package/dist/esm/Cli.js +2 -2
  28. package/dist/esm/Cli.js.map +1 -1
  29. package/dist/esm/generator/Generator.js +5 -13
  30. package/dist/esm/generator/Generator.js.map +1 -1
  31. package/dist/esm/generator/IndexGenerator.js +14 -11
  32. package/dist/esm/generator/IndexGenerator.js.map +1 -1
  33. package/dist/esm/generator/ModelsGenerator.js +2 -5
  34. package/dist/esm/generator/ModelsGenerator.js.map +1 -1
  35. package/dist/esm/generator/NamingHelper.js.map +1 -1
  36. package/dist/esm/generator/NavigationGenerator.js +43 -11
  37. package/dist/esm/generator/NavigationGenerator.js.map +1 -1
  38. package/dist/esm/generator/OperationsGenerator.js +2 -2
  39. package/dist/esm/generator/OperationsGenerator.js.map +1 -1
  40. package/dist/esm/generator/ServiceFnGenerator.js +102 -224
  41. package/dist/esm/generator/ServiceFnGenerator.js.map +1 -1
  42. package/dist/esm/index.js +4 -4
  43. package/dist/esm/index.js.map +1 -1
  44. package/package.json +1 -9
  45. package/src/Cli.ts +8 -1
  46. package/src/generator/Generator.ts +8 -17
  47. package/src/generator/IndexGenerator.ts +14 -12
  48. package/src/generator/ModelsGenerator.ts +2 -5
  49. package/src/generator/NamingHelper.ts +5 -3
  50. package/src/generator/NavigationGenerator.ts +58 -24
  51. package/src/generator/OperationsGenerator.ts +40 -14
  52. package/src/generator/ServiceFnGenerator.ts +117 -265
  53. package/src/index.ts +4 -4
  54. package/dist/cjs/generator/ServiceFnPromiseGenerator.js +0 -183
  55. package/dist/cjs/generator/ServiceFnPromiseGenerator.js.map +0 -1
  56. package/dist/dts/generator/ServiceFnPromiseGenerator.d.ts +0 -40
  57. package/dist/dts/generator/ServiceFnPromiseGenerator.d.ts.map +0 -1
  58. package/dist/esm/generator/ServiceFnPromiseGenerator.js +0 -175
  59. package/dist/esm/generator/ServiceFnPromiseGenerator.js.map +0 -1
  60. package/generator/ServiceFnPromiseGenerator/package.json +0 -6
  61. package/src/generator/ServiceFnPromiseGenerator.ts +0 -243
@@ -1,262 +1,140 @@
1
1
  import { getEditableTypeName, getIdTypeName, getServiceClassName } from "./NamingHelper.js";
2
- const V2_CONFIG = {
3
- odataNamespace: "OData",
4
- buildEntityPath: "buildEntityPath",
5
- queryOptionsType: "ODataQueryOptions",
6
- clientConfigTag: "ODataClientConfig"
7
- };
8
- const V4_CONFIG = {
9
- odataNamespace: "ODataV4",
10
- buildEntityPath: "buildEntityPathV4",
11
- queryOptionsType: "ODataV4QueryOptions",
12
- clientConfigTag: "ODataV4ClientConfig"
13
- };
14
- const getVersionConfig = version => version === "V4" ? V4_CONFIG : V2_CONFIG;
15
2
  /**
16
- * Generate all tree-shakable service function files.
3
+ * Generate the Services.ts file using crud factory.
17
4
  *
18
5
  * @since 1.0.0
19
6
  * @category generation
20
7
  */
21
8
  export const generateServiceFns = dataModel => {
22
- const entityServices = [];
23
- // Generate individual entity service files
24
- for (const entitySet of dataModel.entitySets.values()) {
25
- const entityType = dataModel.entityTypes.get(entitySet.entityTypeFqName);
26
- if (entityType) {
27
- const serviceClassName = getServiceClassName(entitySet.name);
28
- entityServices.push({
29
- fileName: `${serviceClassName}.ts`,
30
- content: generateEntityServiceFnFile(entitySet, entityType, dataModel)
31
- });
32
- }
33
- }
9
+ const content = generateServicesFile(dataModel);
34
10
  return {
35
- entityServices
11
+ servicesFile: {
12
+ fileName: "Services.ts",
13
+ content
14
+ }
36
15
  };
37
16
  };
38
17
  /**
39
- * Generate a single entity service function file.
18
+ * Generate the Services.ts file content.
40
19
  */
41
- const generateEntityServiceFnFile = (entitySet, entityType, dataModel) => {
20
+ const generateServicesFile = dataModel => {
42
21
  const lines = [];
43
- const versionConfig = getVersionConfig(dataModel.version);
44
- const serviceClassName = getServiceClassName(entitySet.name);
45
- const entityName = entityType.name;
46
- const idTypeName = getIdTypeName(entityName);
47
- const editableName = getEditableTypeName(entityName);
48
- const hasKeys = entityType.keys.length > 0;
49
22
  const isV4 = dataModel.version === "V4";
50
- // Header and imports
23
+ const crudImportPath = isV4 ? "@odata-effect/odata-effect/CrudV4" : "@odata-effect/odata-effect/Crud";
24
+ // Collect all entity sets with their types
25
+ const entitySets = [];
26
+ for (const entitySet of dataModel.entitySets.values()) {
27
+ const entityType = dataModel.entityTypes.get(entitySet.entityTypeFqName);
28
+ if (entityType) {
29
+ entitySets.push({
30
+ entitySet,
31
+ entityType
32
+ });
33
+ }
34
+ }
35
+ // Header
51
36
  lines.push(`/**`);
52
- lines.push(` * Tree-shakable ${entityName} service functions for ${dataModel.serviceName} OData ${dataModel.version}.`);
37
+ lines.push(` * Entity services for ${dataModel.serviceName} OData ${dataModel.version}.`);
53
38
  lines.push(` * Generated by odata-effect-gen.`);
54
39
  lines.push(` *`);
55
- lines.push(` * @example`);
56
- lines.push(` * \`\`\`ts`);
57
- lines.push(` * // Namespace import - nice autocomplete, tree-shakable`);
58
- lines.push(` * import { ${serviceClassName} } from "@template/${dataModel.serviceName.toLowerCase()}-effect"`);
59
- lines.push(` * const items = yield* ${serviceClassName}.getAll()`);
60
- lines.push(` *`);
61
- lines.push(` * // Direct import - maximum tree-shaking`);
62
- lines.push(` * import { getAll } from "@template/${dataModel.serviceName.toLowerCase()}-effect/${serviceClassName}"`);
63
- lines.push(` * const items = yield* getAll()`);
64
- lines.push(` * \`\`\``);
40
+ lines.push(` * Uses the crud factory for minimal generated code.`);
65
41
  lines.push(` *`);
66
42
  lines.push(` * @since 1.0.0`);
67
43
  lines.push(` */`);
68
- lines.push(`import type * as Effect from "effect/Effect"`);
69
- lines.push(`import * as Schema from "effect/Schema"`);
70
- lines.push(`import type { HttpClient } from "@effect/platform"`);
71
- lines.push(`import type * as HttpClientError from "@effect/platform/HttpClientError"`);
72
- lines.push(`import type * as HttpBody from "@effect/platform/HttpBody"`);
73
- lines.push(``);
74
- // Import models
75
- lines.push(`import {`);
76
- lines.push(` ${entityName},`);
77
- if (hasKeys) {
78
- lines.push(` type ${idTypeName},`);
79
- }
80
- lines.push(` ${editableName}`);
81
- lines.push(`} from "./Models"`);
44
+ lines.push(`import { crud } from "${crudImportPath}"`);
82
45
  lines.push(``);
83
- // Import OData infrastructure (version-specific) using subpath imports for tree-shaking
84
- if (isV4) {
85
- lines.push(`import * as ${versionConfig.odataNamespace} from "@odata-effect/odata-effect/ODataV4"`);
86
- lines.push(`import {`);
87
- lines.push(` type ${versionConfig.clientConfigTag},`);
88
- lines.push(` ${versionConfig.buildEntityPath},`);
89
- lines.push(` type ${versionConfig.queryOptionsType}`);
90
- lines.push(`} from "@odata-effect/odata-effect/ODataV4Client"`);
91
- } else {
92
- lines.push(`import * as ${versionConfig.odataNamespace} from "@odata-effect/odata-effect/OData"`);
93
- lines.push(`import {`);
94
- lines.push(` type ${versionConfig.clientConfigTag},`);
95
- lines.push(` ${versionConfig.buildEntityPath},`);
96
- lines.push(` type ${versionConfig.queryOptionsType}`);
97
- lines.push(`} from "@odata-effect/odata-effect/ODataClient"`);
46
+ // Import all entity types
47
+ const modelImports = [];
48
+ for (const {
49
+ entityType
50
+ } of entitySets) {
51
+ modelImports.push(entityType.name);
52
+ if (entityType.keys.length > 0) {
53
+ modelImports.push(`type ${getIdTypeName(entityType.name)}`);
54
+ }
55
+ modelImports.push(getEditableTypeName(entityType.name));
98
56
  }
99
57
  lines.push(`import {`);
100
- if (!isV4) {
101
- lines.push(` type SapError,`);
102
- }
103
- lines.push(` type ODataError,`);
104
- lines.push(` type ParseError`);
105
- lines.push(`} from "@odata-effect/odata-effect/Errors"`);
106
- lines.push(``);
107
- // Service error type
108
- lines.push(`// ============================================================================`);
109
- lines.push(`// Types`);
110
- lines.push(`// ============================================================================`);
111
- lines.push(``);
112
- lines.push(`/**`);
113
- lines.push(` * Error type for ${entityName} service operations.`);
114
- lines.push(` *`);
115
- lines.push(` * @since 1.0.0`);
116
- lines.push(` * @category errors`);
117
- lines.push(` */`);
118
- lines.push(`export type ${serviceClassName}Error =`);
119
- lines.push(` | HttpClientError.HttpClientError`);
120
- lines.push(` | HttpBody.HttpBodyError`);
121
- lines.push(` | ParseError`);
122
- if (!isV4) {
123
- lines.push(` | SapError`);
58
+ for (let i = 0; i < modelImports.length; i++) {
59
+ const isLast = i === modelImports.length - 1;
60
+ lines.push(` ${modelImports[i]}${isLast ? "" : ","}`);
124
61
  }
125
- lines.push(` | ODataError`);
62
+ lines.push(`} from "./Models"`);
126
63
  lines.push(``);
127
- // Dependencies type
128
- lines.push(`/**`);
129
- lines.push(` * Dependencies required for ${entityName} service operations.`);
130
- lines.push(` *`);
131
- lines.push(` * @since 1.0.0`);
132
- lines.push(` * @category context`);
133
- lines.push(` */`);
134
- lines.push(`export type ${serviceClassName}Context = ${versionConfig.clientConfigTag} | HttpClient.HttpClient`);
64
+ // Re-export types from the crud module
65
+ lines.push(`// Re-export types for convenience`);
66
+ lines.push(`export type { CrudError, CrudContext, CrudService } from "${crudImportPath}"`);
135
67
  lines.push(``);
136
- // ID normalizer (if entity has keys)
137
- if (hasKeys) {
138
- lines.push(`// ============================================================================`);
139
- lines.push(`// Internal Helpers`);
140
- lines.push(`// ============================================================================`);
141
- lines.push(``);
142
- const normalizeIdFn = `normalizeId`;
143
- lines.push(`const ${normalizeIdFn} = (id: ${idTypeName}): string =>`);
144
- if (entityType.keys.length === 1) {
145
- const keyProp = entityType.keys[0];
146
- const keyTsType = keyProp.typeMapping.tsType;
147
- const primitiveCheck = keyTsType === "number" ? "number" : "string";
148
- lines.push(` typeof id === "${primitiveCheck}" ? String(id) : String(id.${keyProp.name})`);
149
- } else {
150
- const keyParts = entityType.keys.map(k => `${k.odataName}='\${String(id.${k.name})}'`).join(",");
151
- lines.push(` typeof id === "string" ? id : \`${keyParts}\``);
152
- }
153
- lines.push(``);
154
- }
155
- // Standalone functions
68
+ // Generate each service
156
69
  lines.push(`// ============================================================================`);
157
- lines.push(`// Standalone Tree-Shakable Functions`);
70
+ lines.push(`// Entity Services`);
158
71
  lines.push(`// ============================================================================`);
159
72
  lines.push(``);
160
- // getAll
161
- lines.push(`/**`);
162
- lines.push(` * Fetch all ${entityName} entities.`);
163
- lines.push(` *`);
164
- lines.push(` * @since 1.0.0`);
165
- lines.push(` * @category operations`);
166
- lines.push(` */`);
167
- lines.push(`export const getAll = (`);
168
- lines.push(` options?: ${versionConfig.queryOptionsType}`);
169
- lines.push(`): Effect.Effect<`);
170
- lines.push(` ReadonlyArray<${entityName}>,`);
171
- lines.push(` ${serviceClassName}Error,`);
172
- lines.push(` ${serviceClassName}Context`);
173
- lines.push(`> =>`);
174
- lines.push(` ${versionConfig.odataNamespace}.getCollection("${entitySet.name}", ${entityName}, options)`);
175
- lines.push(``);
176
- // getById (if entity has keys)
177
- if (hasKeys) {
178
- const keyObj = entityType.keys.length === 1 ? `{ ${entityType.keys[0].odataName}: normalizeId(id) }` : `normalizeId(id)`;
179
- lines.push(`/**`);
180
- lines.push(` * Fetch a single ${entityName} by ID.`);
181
- lines.push(` *`);
182
- lines.push(` * @since 1.0.0`);
183
- lines.push(` * @category operations`);
184
- lines.push(` */`);
185
- lines.push(`export const getById = (`);
186
- lines.push(` id: ${idTypeName}`);
187
- lines.push(`): Effect.Effect<`);
188
- lines.push(` ${entityName},`);
189
- lines.push(` ${serviceClassName}Error,`);
190
- lines.push(` ${serviceClassName}Context`);
191
- lines.push(`> =>`);
192
- lines.push(` ${versionConfig.odataNamespace}.get(`);
193
- lines.push(` ${versionConfig.buildEntityPath}("${entitySet.name}", ${keyObj}),`);
194
- lines.push(` ${entityName}`);
195
- lines.push(` )`);
196
- lines.push(``);
197
- }
198
- // create
199
- lines.push(`/**`);
200
- lines.push(` * Create a new ${entityName} entity.`);
201
- lines.push(` *`);
202
- lines.push(` * @since 1.0.0`);
203
- lines.push(` * @category operations`);
204
- lines.push(` */`);
205
- lines.push(`export const create = (`);
206
- lines.push(` entity: ${editableName}`);
207
- lines.push(`): Effect.Effect<`);
208
- lines.push(` ${entityName},`);
209
- lines.push(` ${serviceClassName}Error,`);
210
- lines.push(` ${serviceClassName}Context`);
211
- lines.push(`> =>`);
212
- lines.push(` ${versionConfig.odataNamespace}.post("${entitySet.name}", entity, ${editableName}, ${entityName})`);
213
- lines.push(``);
214
- // update (if entity has keys)
215
- if (hasKeys) {
216
- const keyObj = entityType.keys.length === 1 ? `{ ${entityType.keys[0].odataName}: normalizeId(id) }` : `normalizeId(id)`;
73
+ for (const {
74
+ entitySet,
75
+ entityType
76
+ } of entitySets) {
77
+ const serviceClassName = getServiceClassName(entitySet.name);
78
+ const entityName = entityType.name;
79
+ const editableName = getEditableTypeName(entityName);
80
+ const hasKeys = entityType.keys.length > 0;
217
81
  lines.push(`/**`);
218
- lines.push(` * Update an existing ${entityName} entity.`);
82
+ lines.push(` * CRUD service for ${entityName} entities.`);
219
83
  lines.push(` *`);
220
84
  lines.push(` * @since 1.0.0`);
221
- lines.push(` * @category operations`);
85
+ lines.push(` * @category services`);
222
86
  lines.push(` */`);
223
- lines.push(`export const update = (`);
224
- lines.push(` id: ${idTypeName},`);
225
- lines.push(` entity: Partial<${editableName}>`);
226
- lines.push(`): Effect.Effect<`);
227
- lines.push(` void,`);
228
- lines.push(` ${serviceClassName}Error,`);
229
- lines.push(` ${serviceClassName}Context`);
230
- lines.push(`> =>`);
231
- lines.push(` ${versionConfig.odataNamespace}.patch(`);
232
- lines.push(` ${versionConfig.buildEntityPath}("${entitySet.name}", ${keyObj}),`);
233
- lines.push(` entity,`);
234
- lines.push(` Schema.partial(${editableName})`);
235
- lines.push(` )`);
236
- lines.push(``);
237
- // delete
238
- lines.push(`/**`);
239
- lines.push(` * Delete a ${entityName} entity.`);
240
- lines.push(` *`);
241
- lines.push(` * @since 1.0.0`);
242
- lines.push(` * @category operations`);
243
- lines.push(` */`);
244
- lines.push(`export const del = (`);
245
- lines.push(` id: ${idTypeName}`);
246
- lines.push(`): Effect.Effect<`);
247
- lines.push(` void,`);
248
- lines.push(` ${serviceClassName}Error,`);
249
- lines.push(` ${serviceClassName}Context`);
250
- lines.push(`> =>`);
251
- lines.push(` ${versionConfig.odataNamespace}.del(`);
252
- lines.push(` ${versionConfig.buildEntityPath}("${entitySet.name}", ${keyObj})`);
253
- lines.push(` )`);
254
- lines.push(``);
255
- // Alias for nice naming
256
- lines.push(`// Alias for nice naming`);
257
- lines.push(`export { del as delete }`);
87
+ if (hasKeys) {
88
+ lines.push(`export const ${serviceClassName} = crud({`);
89
+ lines.push(` path: "${entitySet.name}",`);
90
+ lines.push(` schema: ${entityName},`);
91
+ lines.push(` editableSchema: ${editableName},`);
92
+ lines.push(` idToKey: ${generateIdToKeyFunction(entityType, dataModel.version)}`);
93
+ lines.push(`})`);
94
+ } else {
95
+ // Entity without keys - can only getAll and create
96
+ lines.push(`export const ${serviceClassName} = crud({`);
97
+ lines.push(` path: "${entitySet.name}",`);
98
+ lines.push(` schema: ${entityName},`);
99
+ lines.push(` editableSchema: ${editableName},`);
100
+ lines.push(` idToKey: (_id: never) => { throw new Error("Entity has no keys") }`);
101
+ lines.push(`})`);
102
+ }
258
103
  lines.push(``);
259
104
  }
260
105
  return lines.join("\n");
261
106
  };
107
+ /**
108
+ * Generate the idToKey function for an entity type.
109
+ */
110
+ const generateIdToKeyFunction = (entityType, version) => {
111
+ const idTypeName = getIdTypeName(entityType.name);
112
+ const isV4 = version === "V4";
113
+ if (entityType.keys.length === 1) {
114
+ const keyProp = entityType.keys[0];
115
+ const keyTsType = keyProp.typeMapping.tsType;
116
+ const primitiveCheck = keyTsType === "number" ? "number" : "string";
117
+ if (isV4) {
118
+ // V4 can use number keys directly
119
+ if (keyTsType === "number") {
120
+ return `(id: ${idTypeName}) => typeof id === "number" ? id : id.${keyProp.name}`;
121
+ } else {
122
+ return `(id: ${idTypeName}) => typeof id === "string" ? { ${keyProp.odataName}: id } : { ${keyProp.odataName}: id.${keyProp.name} }`;
123
+ }
124
+ } else {
125
+ // V2 needs string keys
126
+ return `(id: ${idTypeName}) => typeof id === "${primitiveCheck}" ? { ${keyProp.odataName}: String(id) } : { ${keyProp.odataName}: String(id.${keyProp.name}) }`;
127
+ }
128
+ } else {
129
+ // Composite key
130
+ const keyMapping = entityType.keys.map(k => {
131
+ if (isV4) {
132
+ return `${k.odataName}: id.${k.name}`;
133
+ } else {
134
+ return `${k.odataName}: String(id.${k.name})`;
135
+ }
136
+ }).join(", ");
137
+ return `(id: ${idTypeName}) => ({ ${keyMapping} })`;
138
+ }
139
+ };
262
140
  //# sourceMappingURL=ServiceFnGenerator.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ServiceFnGenerator.js","names":["getEditableTypeName","getIdTypeName","getServiceClassName","V2_CONFIG","odataNamespace","buildEntityPath","queryOptionsType","clientConfigTag","V4_CONFIG","getVersionConfig","version","generateServiceFns","dataModel","entityServices","entitySet","entitySets","values","entityType","entityTypes","get","entityTypeFqName","serviceClassName","name","push","fileName","content","generateEntityServiceFnFile","lines","versionConfig","entityName","idTypeName","editableName","hasKeys","keys","length","isV4","serviceName","toLowerCase","normalizeIdFn","keyProp","keyTsType","typeMapping","tsType","primitiveCheck","keyParts","map","k","odataName","join","keyObj"],"sources":["../../../src/generator/ServiceFnGenerator.ts"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"ServiceFnGenerator.js","names":["getEditableTypeName","getIdTypeName","getServiceClassName","generateServiceFns","dataModel","content","generateServicesFile","servicesFile","fileName","lines","isV4","version","crudImportPath","entitySets","entitySet","values","entityType","entityTypes","get","entityTypeFqName","push","serviceName","modelImports","name","keys","length","i","isLast","serviceClassName","entityName","editableName","hasKeys","generateIdToKeyFunction","join","idTypeName","keyProp","keyTsType","typeMapping","tsType","primitiveCheck","odataName","keyMapping","map","k"],"sources":["../../../src/generator/ServiceFnGenerator.ts"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
package/dist/esm/index.js CHANGED
@@ -70,14 +70,14 @@ export * as QueryModelsGenerator from "./generator/QueryModelsGenerator.js";
70
70
  */
71
71
  export * as ServiceFnGenerator from "./generator/ServiceFnGenerator.js";
72
72
  /**
73
- * Generator for Promise-based service functions.
73
+ * Generator for tree-shakable navigation path builders.
74
74
  *
75
- * This module generates Promise-based wrappers around the Effect-based
76
- * service functions, allowing usage in non-Effect environments.
75
+ * This module generates pipe-based navigation functions and the toPromise
76
+ * helper for Promise-based environments.
77
77
  *
78
78
  * @since 1.0.0
79
79
  */
80
- export * as ServiceFnPromiseGenerator from "./generator/ServiceFnPromiseGenerator.js";
80
+ export * as NavigationGenerator from "./generator/NavigationGenerator.js";
81
81
  /**
82
82
  * Intermediate representation for OData metadata.
83
83
  * This is the central data model that digesters create and generators consume.
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["Cli","bin","Digester","TypeMapper","Generator","IndexGenerator","ModelsGenerator","NamingHelper","PackageGenerator","QueryModelsGenerator","ServiceFnGenerator","ServiceFnPromiseGenerator","DataModel","EdmxSchema","XmlParser"],"sources":["../../src/index.ts"],"sourcesContent":[null],"mappings":"AAAA;;;;;AAKA,OAAO,KAAKA,GAAG,MAAM,UAAU;AAE/B;;;;;AAKA,OAAO,KAAKC,GAAG,MAAM,UAAU;AAE/B;;;;;;AAMA,OAAO,KAAKC,QAAQ,MAAM,wBAAwB;AAElD;;;;;AAKA,OAAO,KAAKC,UAAU,MAAM,0BAA0B;AAEtD;;;;;AAKA,OAAO,KAAKC,SAAS,MAAM,0BAA0B;AAErD;;;;;AAKA,OAAO,KAAKC,cAAc,MAAM,+BAA+B;AAE/D;;;;;AAKA,OAAO,KAAKC,eAAe,MAAM,gCAAgC;AAEjE;;;;;AAKA,OAAO,KAAKC,YAAY,MAAM,6BAA6B;AAE3D;;;;;AAKA,OAAO,KAAKC,gBAAgB,MAAM,iCAAiC;AAEnE;;;;;AAKA,OAAO,KAAKC,oBAAoB,MAAM,qCAAqC;AAE3E;;;;;;;;;AASA,OAAO,KAAKC,kBAAkB,MAAM,mCAAmC;AAEvE;;;;;;;;AAQA,OAAO,KAAKC,yBAAyB,MAAM,0CAA0C;AAErF;;;;;;AAMA,OAAO,KAAKC,SAAS,MAAM,sBAAsB;AAEjD;;;;;;AAMA,OAAO,KAAKC,UAAU,MAAM,wBAAwB;AAEpD;;;;;AAKA,OAAO,KAAKC,SAAS,MAAM,uBAAuB","ignoreList":[]}
1
+ {"version":3,"file":"index.js","names":["Cli","bin","Digester","TypeMapper","Generator","IndexGenerator","ModelsGenerator","NamingHelper","PackageGenerator","QueryModelsGenerator","ServiceFnGenerator","NavigationGenerator","DataModel","EdmxSchema","XmlParser"],"sources":["../../src/index.ts"],"sourcesContent":[null],"mappings":"AAAA;;;;;AAKA,OAAO,KAAKA,GAAG,MAAM,UAAU;AAE/B;;;;;AAKA,OAAO,KAAKC,GAAG,MAAM,UAAU;AAE/B;;;;;;AAMA,OAAO,KAAKC,QAAQ,MAAM,wBAAwB;AAElD;;;;;AAKA,OAAO,KAAKC,UAAU,MAAM,0BAA0B;AAEtD;;;;;AAKA,OAAO,KAAKC,SAAS,MAAM,0BAA0B;AAErD;;;;;AAKA,OAAO,KAAKC,cAAc,MAAM,+BAA+B;AAE/D;;;;;AAKA,OAAO,KAAKC,eAAe,MAAM,gCAAgC;AAEjE;;;;;AAKA,OAAO,KAAKC,YAAY,MAAM,6BAA6B;AAE3D;;;;;AAKA,OAAO,KAAKC,gBAAgB,MAAM,iCAAiC;AAEnE;;;;;AAKA,OAAO,KAAKC,oBAAoB,MAAM,qCAAqC;AAE3E;;;;;;;;;AASA,OAAO,KAAKC,kBAAkB,MAAM,mCAAmC;AAEvE;;;;;;;;AAQA,OAAO,KAAKC,mBAAmB,MAAM,oCAAoC;AAEzE;;;;;;AAMA,OAAO,KAAKC,SAAS,MAAM,sBAAsB;AAEjD;;;;;;AAMA,OAAO,KAAKC,UAAU,MAAM,wBAAwB;AAEpD;;;;;AAKA,OAAO,KAAKC,SAAS,MAAM,uBAAuB","ignoreList":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@odata-effect/odata-effect-generator",
3
- "version": "0.2.0",
3
+ "version": "0.3.0",
4
4
  "description": "Effect-based OData service code generator",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -94,11 +94,6 @@
94
94
  "import": "./dist/esm/generator/ServiceFnGenerator.js",
95
95
  "default": "./dist/cjs/generator/ServiceFnGenerator.js"
96
96
  },
97
- "./generator/ServiceFnPromiseGenerator": {
98
- "types": "./dist/dts/generator/ServiceFnPromiseGenerator.d.ts",
99
- "import": "./dist/esm/generator/ServiceFnPromiseGenerator.js",
100
- "default": "./dist/cjs/generator/ServiceFnPromiseGenerator.js"
101
- },
102
97
  "./model/DataModel": {
103
98
  "types": "./dist/dts/model/DataModel.d.ts",
104
99
  "import": "./dist/esm/model/DataModel.js",
@@ -156,9 +151,6 @@
156
151
  "generator/ServiceFnGenerator": [
157
152
  "./dist/dts/generator/ServiceFnGenerator.d.ts"
158
153
  ],
159
- "generator/ServiceFnPromiseGenerator": [
160
- "./dist/dts/generator/ServiceFnPromiseGenerator.d.ts"
161
- ],
162
154
  "model/DataModel": [
163
155
  "./dist/dts/model/DataModel.d.ts"
164
156
  ],
package/src/Cli.ts CHANGED
@@ -54,7 +54,14 @@ const generateCommand = Command.make(
54
54
  ).pipe(
55
55
  Command.withDescription("Generate Effect OData client from metadata"),
56
56
  Command.withHandler((
57
- { force: forceOverwrite, metadataPath: metaPath, outputDir: outDir, packageName: pkgName, serviceName: svcName, filesOnly: onlyFiles }
57
+ {
58
+ filesOnly: onlyFiles,
59
+ force: forceOverwrite,
60
+ metadataPath: metaPath,
61
+ outputDir: outDir,
62
+ packageName: pkgName,
63
+ serviceName: svcName
64
+ }
58
65
  ) =>
59
66
  Effect.gen(function*() {
60
67
  const fs = yield* FileSystem.FileSystem
@@ -23,7 +23,6 @@ import {
23
23
  } from "./PackageGenerator.js"
24
24
  import { generateQueryModels } from "./QueryModelsGenerator.js"
25
25
  import { generateServiceFns } from "./ServiceFnGenerator.js"
26
- import { generatePromiseServiceFns } from "./ServiceFnPromiseGenerator.js"
27
26
 
28
27
  /**
29
28
  * Generator configuration.
@@ -92,9 +91,6 @@ export const generate = (
92
91
  // Generate tree-shakable service function files
93
92
  const serviceResult = generateServiceFns(dataModel)
94
93
 
95
- // Generate Promise-based service function files
96
- const promiseServiceResult = generatePromiseServiceFns(dataModel)
97
-
98
94
  // Generate operations file (FunctionImports, Functions, Actions)
99
95
  const operationsResult = generateOperations(dataModel)
100
96
 
@@ -111,22 +107,17 @@ export const generate = (
111
107
  path: path.join(sourceDir, "QueryModels.ts"),
112
108
  content: generateQueryModels(dataModel)
113
109
  },
114
- // Individual entity service function files (tree-shakable)
115
- ...serviceResult.entityServices.map((svc) => ({
116
- path: path.join(sourceDir, svc.fileName),
117
- content: svc.content
118
- })),
119
- // Promise-based entity service function files
120
- ...promiseServiceResult.entityServices.map((svc) => ({
121
- path: path.join(sourceDir, svc.fileName),
122
- content: svc.content
123
- })),
110
+ // Services file (all entity CRUD services in one file)
111
+ {
112
+ path: path.join(sourceDir, serviceResult.servicesFile.fileName),
113
+ content: serviceResult.servicesFile.content
114
+ },
124
115
  // Operations file (only if there are unbound operations)
125
116
  ...(operationsResult.operationsFile
126
117
  ? [{
127
- path: path.join(sourceDir, operationsResult.operationsFile.fileName),
128
- content: operationsResult.operationsFile.content
129
- }]
118
+ path: path.join(sourceDir, operationsResult.operationsFile.fileName),
119
+ content: operationsResult.operationsFile.content
120
+ }]
130
121
  : []),
131
122
  // Navigation builder files
132
123
  ...navigationResult.navigationFiles.map((nav) => ({
@@ -14,7 +14,6 @@ import {
14
14
  } from "./NamingHelper.js"
15
15
  import { getPathBuildersModuleName } from "./NavigationGenerator.js"
16
16
  import { getOperationsModuleName } from "./OperationsGenerator.js"
17
- import { getPromiseServiceName } from "./ServiceFnPromiseGenerator.js"
18
17
 
19
18
  /**
20
19
  * Generate the index.ts file content.
@@ -68,20 +67,23 @@ export const generateIndex = (dataModel: DataModel): string => {
68
67
  lines.push(`} from "./Models"`)
69
68
  lines.push(``)
70
69
 
71
- // Individual Entity Services (tree-shakable module namespace re-exports)
72
- lines.push(`// Individual Entity Services (tree-shakable)`)
70
+ // Entity Services (all in one file using crud factory)
71
+ lines.push(`// Entity Services`)
72
+ lines.push(`// Use toPromise(runtime) from PathBuilders to convert Effect to Promise`)
73
+ lines.push(`export {`)
74
+ const serviceExports: Array<string> = []
73
75
  for (const entitySet of dataModel.entitySets.values()) {
74
- const serviceClassName = getServiceClassName(entitySet.name)
75
- lines.push(`export * as ${serviceClassName} from "./${serviceClassName}"`)
76
+ serviceExports.push(getServiceClassName(entitySet.name))
76
77
  }
77
- lines.push(``)
78
-
79
- // Promise-based Entity Services (for non-Effect environments)
80
- lines.push(`// Promise-based Entity Services (for non-Effect environments)`)
81
- for (const entitySet of dataModel.entitySets.values()) {
82
- const promiseServiceName = getPromiseServiceName(entitySet.name)
83
- lines.push(`export * as ${promiseServiceName} from "./${promiseServiceName}"`)
78
+ // Also export types
79
+ serviceExports.push(`type CrudError`)
80
+ serviceExports.push(`type CrudContext`)
81
+ serviceExports.push(`type CrudService`)
82
+ for (let i = 0; i < serviceExports.length; i++) {
83
+ const isLast = i === serviceExports.length - 1
84
+ lines.push(` ${serviceExports[i]}${isLast ? "" : ","}`)
84
85
  }
86
+ lines.push(`} from "./Services"`)
85
87
  lines.push(``)
86
88
 
87
89
  // Operations (FunctionImports, Functions, Actions) - only if there are unbound operations
@@ -243,15 +243,12 @@ const generateEntityType = (
243
243
  lines.push(` Schema.Struct({ ${key.name}: ${keySchema} })`)
244
244
  lines.push(`)`)
245
245
  } else {
246
- // Composite key
246
+ // Composite key - only struct form makes sense
247
247
  const keyFields = entityType.keys.map((k) => {
248
248
  const schema = getPropertySchemaType(k, false)
249
249
  return `${k.name}: ${schema}`
250
250
  })
251
- lines.push(`export const ${idTypeName} = Schema.Union(`)
252
- lines.push(` Schema.String,`)
253
- lines.push(` Schema.Struct({ ${keyFields.join(", ")} })`)
254
- lines.push(`)`)
251
+ lines.push(`export const ${idTypeName} = Schema.Struct({ ${keyFields.join(", ")} })`)
255
252
  }
256
253
  lines.push(`export type ${idTypeName} = Schema.Schema.Type<typeof ${idTypeName}>`)
257
254
  }
@@ -86,9 +86,11 @@ export const getServiceClassName = (entitySetName: string): string => {
86
86
  if (singular.endsWith("ies")) {
87
87
  // "Categories" -> "Category"
88
88
  singular = singular.slice(0, -3) + "y"
89
- } else if (singular.endsWith("xes") || singular.endsWith("ches") ||
90
- singular.endsWith("shes") || singular.endsWith("sses") ||
91
- singular.endsWith("zes")) {
89
+ } else if (
90
+ singular.endsWith("xes") || singular.endsWith("ches") ||
91
+ singular.endsWith("shes") || singular.endsWith("sses") ||
92
+ singular.endsWith("zes")
93
+ ) {
92
94
  // "Boxes" -> "Box", "Beaches" -> "Beach", etc.
93
95
  singular = singular.slice(0, -2)
94
96
  } else if (singular.endsWith("s") && !singular.endsWith("ss")) {