@odata-effect/odata-effect-generator 0.1.2 → 0.2.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 (58) hide show
  1. package/README.md +223 -5
  2. package/dist/cjs/Cli.js +6 -2
  3. package/dist/cjs/Cli.js.map +1 -1
  4. package/dist/cjs/generator/Generator.js +33 -15
  5. package/dist/cjs/generator/Generator.js.map +1 -1
  6. package/dist/cjs/generator/IndexGenerator.js +19 -73
  7. package/dist/cjs/generator/IndexGenerator.js.map +1 -1
  8. package/dist/cjs/generator/NamingHelper.js +4 -1
  9. package/dist/cjs/generator/NamingHelper.js.map +1 -1
  10. package/dist/cjs/generator/NavigationGenerator.js +338 -0
  11. package/dist/cjs/generator/NavigationGenerator.js.map +1 -0
  12. package/dist/cjs/generator/OperationsGenerator.js +384 -0
  13. package/dist/cjs/generator/OperationsGenerator.js.map +1 -0
  14. package/dist/cjs/generator/QueryModelsGenerator.js +2 -2
  15. package/dist/cjs/generator/QueryModelsGenerator.js.map +1 -1
  16. package/dist/cjs/generator/ServiceFnGenerator.js +1 -1
  17. package/dist/cjs/generator/ServiceFnGenerator.js.map +1 -1
  18. package/dist/cjs/generator/ServiceFnPromiseGenerator.js +2 -2
  19. package/dist/cjs/generator/ServiceFnPromiseGenerator.js.map +1 -1
  20. package/dist/dts/Cli.d.ts.map +1 -1
  21. package/dist/dts/generator/Generator.d.ts +2 -0
  22. package/dist/dts/generator/Generator.d.ts.map +1 -1
  23. package/dist/dts/generator/IndexGenerator.d.ts.map +1 -1
  24. package/dist/dts/generator/NamingHelper.d.ts.map +1 -1
  25. package/dist/dts/generator/NavigationGenerator.d.ts +55 -0
  26. package/dist/dts/generator/NavigationGenerator.d.ts.map +1 -0
  27. package/dist/dts/generator/OperationsGenerator.d.ts +50 -0
  28. package/dist/dts/generator/OperationsGenerator.d.ts.map +1 -0
  29. package/dist/esm/Cli.js +6 -2
  30. package/dist/esm/Cli.js.map +1 -1
  31. package/dist/esm/generator/Generator.js +33 -15
  32. package/dist/esm/generator/Generator.js.map +1 -1
  33. package/dist/esm/generator/IndexGenerator.js +19 -73
  34. package/dist/esm/generator/IndexGenerator.js.map +1 -1
  35. package/dist/esm/generator/NamingHelper.js +4 -1
  36. package/dist/esm/generator/NamingHelper.js.map +1 -1
  37. package/dist/esm/generator/NavigationGenerator.js +330 -0
  38. package/dist/esm/generator/NavigationGenerator.js.map +1 -0
  39. package/dist/esm/generator/OperationsGenerator.js +375 -0
  40. package/dist/esm/generator/OperationsGenerator.js.map +1 -0
  41. package/dist/esm/generator/QueryModelsGenerator.js +2 -2
  42. package/dist/esm/generator/QueryModelsGenerator.js.map +1 -1
  43. package/dist/esm/generator/ServiceFnGenerator.js +1 -1
  44. package/dist/esm/generator/ServiceFnGenerator.js.map +1 -1
  45. package/dist/esm/generator/ServiceFnPromiseGenerator.js +2 -2
  46. package/dist/esm/generator/ServiceFnPromiseGenerator.js.map +1 -1
  47. package/generator/NavigationGenerator/package.json +6 -0
  48. package/generator/OperationsGenerator/package.json +6 -0
  49. package/package.json +17 -1
  50. package/src/Cli.ts +8 -2
  51. package/src/generator/Generator.ts +43 -13
  52. package/src/generator/IndexGenerator.ts +21 -74
  53. package/src/generator/NamingHelper.ts +6 -1
  54. package/src/generator/NavigationGenerator.ts +451 -0
  55. package/src/generator/OperationsGenerator.ts +481 -0
  56. package/src/generator/QueryModelsGenerator.ts +2 -2
  57. package/src/generator/ServiceFnGenerator.ts +1 -1
  58. package/src/generator/ServiceFnPromiseGenerator.ts +2 -2
@@ -0,0 +1,330 @@
1
+ import { getClassName, toCamelCase } from "./NamingHelper.js";
2
+ const V2_CONFIG = {
3
+ odataNamespace: "OData",
4
+ clientModule: "ODataClient",
5
+ queryOptionsType: "ODataQueryOptions"
6
+ };
7
+ const V4_CONFIG = {
8
+ odataNamespace: "ODataV4",
9
+ clientModule: "ODataV4Client",
10
+ queryOptionsType: "ODataV4QueryOptions"
11
+ };
12
+ const getVersionConfig = version => version === "V4" ? V4_CONFIG : V2_CONFIG;
13
+ /**
14
+ * Get the path builders module name.
15
+ */
16
+ export const getPathBuildersModuleName = () => "PathBuilders";
17
+ /**
18
+ * Collect all navigation properties across all entity types.
19
+ */
20
+ const collectAllNavigationProperties = dataModel => {
21
+ const navProps = [];
22
+ for (const entityType of dataModel.entityTypes.values()) {
23
+ for (const navProp of entityType.navigationProperties) {
24
+ const targetTypeName = getClassName(navProp.targetType);
25
+ navProps.push({
26
+ propertyName: navProp.name,
27
+ odataName: navProp.odataName,
28
+ sourceEntityName: entityType.name,
29
+ targetEntityName: targetTypeName,
30
+ isCollection: navProp.isCollection
31
+ });
32
+ }
33
+ }
34
+ return navProps;
35
+ };
36
+ /**
37
+ * Check if a navigation property name has collisions (same name, different source entities).
38
+ */
39
+ const findCollisions = navProps => {
40
+ const collisions = new Set();
41
+ const seen = new Map();
42
+ for (const prop of navProps) {
43
+ const existing = seen.get(prop.propertyName);
44
+ if (existing) {
45
+ // Collision if same name but different source entity
46
+ if (existing.sourceEntityName !== prop.sourceEntityName) {
47
+ collisions.add(prop.propertyName);
48
+ }
49
+ } else {
50
+ seen.set(prop.propertyName, prop);
51
+ }
52
+ }
53
+ return collisions;
54
+ };
55
+ /**
56
+ * Get the function name for a navigation property.
57
+ */
58
+ const getNavFunctionName = (prop, hasCollision) => {
59
+ if (hasCollision) {
60
+ // Qualified name: personTrips, orderTrips
61
+ return toCamelCase(`${prop.sourceEntityName}_${prop.propertyName}`);
62
+ }
63
+ return toCamelCase(prop.propertyName);
64
+ };
65
+ /**
66
+ * Collect derived types for an entity type (for type casting).
67
+ */
68
+ const getDerivedTypes = (baseTypeFqName, dataModel) => {
69
+ const derived = [];
70
+ for (const entityType of dataModel.entityTypes.values()) {
71
+ if (entityType.baseType === baseTypeFqName) {
72
+ derived.push(entityType);
73
+ // Recursively get further derived types
74
+ derived.push(...getDerivedTypes(entityType.fqName, dataModel));
75
+ }
76
+ }
77
+ return derived;
78
+ };
79
+ /**
80
+ * Generate navigation builders.
81
+ *
82
+ * @since 1.0.0
83
+ * @category generation
84
+ */
85
+ export const generateNavigations = dataModel => {
86
+ const moduleName = getPathBuildersModuleName();
87
+ const content = generatePathBuildersFile(dataModel);
88
+ return {
89
+ navigationFiles: [{
90
+ fileName: `${moduleName}.ts`,
91
+ content
92
+ }]
93
+ };
94
+ };
95
+ /**
96
+ * Generate the PathBuilders.ts file.
97
+ */
98
+ const generatePathBuildersFile = dataModel => {
99
+ const lines = [];
100
+ const versionConfig = getVersionConfig(dataModel.version);
101
+ // Collect all nav properties and find collisions
102
+ const allNavProps = collectAllNavigationProperties(dataModel);
103
+ const collisions = findCollisions(allNavProps);
104
+ // Collect all entity type names that need to be referenced
105
+ const referencedTypes = collectReferencedTypes(dataModel);
106
+ // Header
107
+ lines.push(`/**`);
108
+ lines.push(` * Type-safe, tree-shakable path builders for OData navigation.`);
109
+ lines.push(` * Generated by odata-effect-gen.`);
110
+ lines.push(` *`);
111
+ lines.push(` * @example`);
112
+ lines.push(` * \`\`\`typescript`);
113
+ lines.push(` * import { pipe } from "effect"`);
114
+ lines.push(` * import { People, byKey, trips, planItems } from "./PathBuilders"`);
115
+ lines.push(` *`);
116
+ lines.push(` * const path = pipe(`);
117
+ lines.push(` * People,`);
118
+ lines.push(` * byKey("russellwhyte"),`);
119
+ lines.push(` * trips,`);
120
+ lines.push(` * byKey(0),`);
121
+ lines.push(` * planItems`);
122
+ lines.push(` * )`);
123
+ lines.push(` * \`\`\``);
124
+ lines.push(` *`);
125
+ lines.push(` * @since 1.0.0`);
126
+ lines.push(` */`);
127
+ lines.push(``);
128
+ // Imports
129
+ lines.push(`import * as ${versionConfig.odataNamespace} from "@odata-effect/odata-effect/${versionConfig.odataNamespace}"`);
130
+ lines.push(`import type { ${versionConfig.queryOptionsType} } from "@odata-effect/odata-effect/${versionConfig.clientModule}"`);
131
+ lines.push(`import type * as Schema from "effect/Schema"`);
132
+ lines.push(``);
133
+ // Import model types with Model suffix to avoid collision with entity set names
134
+ if (referencedTypes.size > 0) {
135
+ lines.push(`import type {`);
136
+ const typesList = Array.from(referencedTypes).sort();
137
+ for (let i = 0; i < typesList.length; i++) {
138
+ const isLast = i === typesList.length - 1;
139
+ lines.push(` ${typesList[i]} as ${typesList[i]}Model${isLast ? "" : ","}`);
140
+ }
141
+ lines.push(`} from "./Models"`);
142
+ lines.push(``);
143
+ }
144
+ // Path branded type
145
+ lines.push(`// ============================================================================`);
146
+ lines.push(`// Path Types`);
147
+ lines.push(`// ============================================================================`);
148
+ lines.push(``);
149
+ lines.push(`/**`);
150
+ lines.push(` * Branded path type that tracks the entity type and whether it's a collection.`);
151
+ lines.push(` * This enables type-safe navigation - you can only navigate to properties`);
152
+ lines.push(` * that exist on the current entity type.`);
153
+ lines.push(` *`);
154
+ lines.push(` * @since 1.0.0`);
155
+ lines.push(` * @category types`);
156
+ lines.push(` */`);
157
+ lines.push(`export type Path<TEntity, IsCollection extends boolean = false> = string & {`);
158
+ lines.push(` readonly _entity: TEntity`);
159
+ lines.push(` readonly _collection: IsCollection`);
160
+ lines.push(`}`);
161
+ lines.push(``);
162
+ // Entity set roots (PascalCase, types use Model suffix to avoid collision)
163
+ lines.push(`// ============================================================================`);
164
+ lines.push(`// Entity Set Roots`);
165
+ lines.push(`// ============================================================================`);
166
+ lines.push(``);
167
+ for (const entitySet of dataModel.entitySets.values()) {
168
+ const entityType = dataModel.entityTypes.get(entitySet.entityTypeFqName);
169
+ if (entityType) {
170
+ lines.push(`/**`);
171
+ lines.push(` * Root path for ${entitySet.name} entity set.`);
172
+ lines.push(` *`);
173
+ lines.push(` * @since 1.0.0`);
174
+ lines.push(` * @category entity-sets`);
175
+ lines.push(` */`);
176
+ lines.push(`export const ${entitySet.name}: Path<${entityType.name}Model, true> = "${entitySet.name}" as Path<${entityType.name}Model, true>`);
177
+ lines.push(``);
178
+ }
179
+ }
180
+ // byKey function
181
+ lines.push(`// ============================================================================`);
182
+ lines.push(`// Key Access`);
183
+ lines.push(`// ============================================================================`);
184
+ lines.push(``);
185
+ lines.push(`/**`);
186
+ lines.push(` * Navigate to a specific entity by key.`);
187
+ lines.push(` * Works on any collection path.`);
188
+ lines.push(` *`);
189
+ lines.push(` * @example`);
190
+ lines.push(` * \`\`\`typescript`);
191
+ lines.push(` * pipe(People, byKey("russellwhyte")) // Path<PersonModel, false>`);
192
+ lines.push(` * pipe(Airports, byKey("KSFO")) // Path<AirportModel, false>`);
193
+ lines.push(` * \`\`\``);
194
+ lines.push(` *`);
195
+ lines.push(` * @since 1.0.0`);
196
+ lines.push(` * @category navigation`);
197
+ lines.push(` */`);
198
+ lines.push(`export const byKey = <T>(key: string | number) =>`);
199
+ lines.push(` (base: Path<T, true>): Path<T, false> =>`);
200
+ lines.push(` \`\${base}(\${typeof key === "string" ? \`'\${key}'\` : key})\` as Path<T, false>`);
201
+ lines.push(``);
202
+ // Navigation property functions
203
+ lines.push(`// ============================================================================`);
204
+ lines.push(`// Navigation Properties`);
205
+ lines.push(`// ============================================================================`);
206
+ lines.push(``);
207
+ // Group nav props by source entity for better organization
208
+ const navPropsBySource = new Map();
209
+ for (const prop of allNavProps) {
210
+ const existing = navPropsBySource.get(prop.sourceEntityName) || [];
211
+ existing.push(prop);
212
+ navPropsBySource.set(prop.sourceEntityName, existing);
213
+ }
214
+ for (const [sourceEntity, props] of navPropsBySource) {
215
+ lines.push(`// From ${sourceEntity}`);
216
+ for (const prop of props) {
217
+ const hasCollision = collisions.has(prop.propertyName);
218
+ const fnName = getNavFunctionName(prop, hasCollision);
219
+ const targetType = prop.targetEntityName;
220
+ lines.push(`/**`);
221
+ lines.push(` * Navigate to ${prop.odataName}${prop.isCollection ? " collection" : ""}.`);
222
+ lines.push(` *`);
223
+ lines.push(` * @since 1.0.0`);
224
+ lines.push(` * @category navigation`);
225
+ lines.push(` */`);
226
+ lines.push(`export const ${fnName} = (base: Path<${sourceEntity}Model, false>): Path<${targetType}Model, ${prop.isCollection}> =>`);
227
+ lines.push(` \`\${base}/${prop.odataName}\` as Path<${targetType}Model, ${prop.isCollection}>`);
228
+ lines.push(``);
229
+ }
230
+ }
231
+ // Type casting functions for derived types
232
+ const castFunctions = generateTypeCastFunctions(dataModel);
233
+ if (castFunctions.length > 0) {
234
+ lines.push(`// ============================================================================`);
235
+ lines.push(`// Type Casting (for entity inheritance)`);
236
+ lines.push(`// ============================================================================`);
237
+ lines.push(``);
238
+ lines.push(...castFunctions);
239
+ }
240
+ // Terminal operations
241
+ lines.push(`// ============================================================================`);
242
+ lines.push(`// Terminal Operations`);
243
+ lines.push(`// ============================================================================`);
244
+ lines.push(``);
245
+ lines.push(`/**`);
246
+ lines.push(` * Fetch a collection of entities at the given path.`);
247
+ lines.push(` *`);
248
+ lines.push(` * @example`);
249
+ lines.push(` * \`\`\`typescript`);
250
+ lines.push(` * const allPeople = yield* pipe(People, fetchCollection(Person))`);
251
+ lines.push(` * \`\`\``);
252
+ lines.push(` *`);
253
+ lines.push(` * @since 1.0.0`);
254
+ lines.push(` * @category operations`);
255
+ lines.push(` */`);
256
+ lines.push(`export const fetchCollection = <T, I>(schema: Schema.Schema<T, I>) =>`);
257
+ lines.push(` (path: Path<T, true>, options?: ${versionConfig.queryOptionsType}) =>`);
258
+ lines.push(` ${versionConfig.odataNamespace}.getCollection(path, schema, options)`);
259
+ lines.push(``);
260
+ lines.push(`/**`);
261
+ lines.push(` * Fetch a single entity at the given path.`);
262
+ lines.push(` *`);
263
+ lines.push(` * @example`);
264
+ lines.push(` * \`\`\`typescript`);
265
+ lines.push(` * const person = yield* pipe(People, byKey("russell"), fetchOne(Person))`);
266
+ lines.push(` * \`\`\``);
267
+ lines.push(` *`);
268
+ lines.push(` * @since 1.0.0`);
269
+ lines.push(` * @category operations`);
270
+ lines.push(` */`);
271
+ lines.push(`export const fetchOne = <T, I>(schema: Schema.Schema<T, I>) =>`);
272
+ lines.push(` (path: Path<T, false>, options?: ${versionConfig.queryOptionsType}) =>`);
273
+ lines.push(` ${versionConfig.odataNamespace}.get(path, schema, options)`);
274
+ lines.push(``);
275
+ return lines.join("\n");
276
+ };
277
+ /**
278
+ * Generate type casting functions for derived types.
279
+ */
280
+ const generateTypeCastFunctions = dataModel => {
281
+ const lines = [];
282
+ const processed = new Set();
283
+ for (const entityType of dataModel.entityTypes.values()) {
284
+ const derivedTypes = getDerivedTypes(entityType.fqName, dataModel);
285
+ for (const derived of derivedTypes) {
286
+ const fnName = `as${derived.name}`;
287
+ if (processed.has(fnName)) continue;
288
+ processed.add(fnName);
289
+ const castPath = `${dataModel.namespace}.${derived.odataName}`;
290
+ lines.push(`/**`);
291
+ lines.push(` * Cast collection to ${derived.name} (filters to derived type).`);
292
+ lines.push(` *`);
293
+ lines.push(` * @since 1.0.0`);
294
+ lines.push(` * @category casting`);
295
+ lines.push(` */`);
296
+ lines.push(`export const ${fnName} = (base: Path<${entityType.name}Model, true>): Path<${derived.name}Model, true> =>`);
297
+ lines.push(` \`\${base}/${castPath}\` as Path<${derived.name}Model, true>`);
298
+ lines.push(``);
299
+ }
300
+ }
301
+ return lines;
302
+ };
303
+ /**
304
+ * Collect all entity type names referenced in paths.
305
+ */
306
+ const collectReferencedTypes = dataModel => {
307
+ const types = new Set();
308
+ // Entity set entity types
309
+ for (const entitySet of dataModel.entitySets.values()) {
310
+ const entityType = dataModel.entityTypes.get(entitySet.entityTypeFqName);
311
+ if (entityType) {
312
+ types.add(entityType.name);
313
+ }
314
+ }
315
+ // Navigation target types
316
+ for (const entityType of dataModel.entityTypes.values()) {
317
+ for (const navProp of entityType.navigationProperties) {
318
+ types.add(getClassName(navProp.targetType));
319
+ }
320
+ }
321
+ // Derived types
322
+ for (const entityType of dataModel.entityTypes.values()) {
323
+ const derivedTypes = getDerivedTypes(entityType.fqName, dataModel);
324
+ for (const derived of derivedTypes) {
325
+ types.add(derived.name);
326
+ }
327
+ }
328
+ return types;
329
+ };
330
+ //# sourceMappingURL=NavigationGenerator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NavigationGenerator.js","names":["getClassName","toCamelCase","V2_CONFIG","odataNamespace","clientModule","queryOptionsType","V4_CONFIG","getVersionConfig","version","getPathBuildersModuleName","collectAllNavigationProperties","dataModel","navProps","entityType","entityTypes","values","navProp","navigationProperties","targetTypeName","targetType","push","propertyName","name","odataName","sourceEntityName","targetEntityName","isCollection","findCollisions","collisions","Set","seen","Map","prop","existing","get","add","set","getNavFunctionName","hasCollision","getDerivedTypes","baseTypeFqName","derived","baseType","fqName","generateNavigations","moduleName","content","generatePathBuildersFile","navigationFiles","fileName","lines","versionConfig","allNavProps","referencedTypes","collectReferencedTypes","size","typesList","Array","from","sort","i","length","isLast","entitySet","entitySets","entityTypeFqName","navPropsBySource","sourceEntity","props","has","fnName","castFunctions","generateTypeCastFunctions","join","processed","derivedTypes","castPath","namespace","types"],"sources":["../../../src/generator/NavigationGenerator.ts"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}