@odata-effect/odata-effect-generator 0.1.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 (131) hide show
  1. package/Cli/package.json +6 -0
  2. package/LICENSE +21 -0
  3. package/README.md +37 -0
  4. package/bin/package.json +6 -0
  5. package/digester/Digester/package.json +6 -0
  6. package/digester/TypeMapper/package.json +6 -0
  7. package/dist/cjs/Cli.js +95 -0
  8. package/dist/cjs/Cli.js.map +1 -0
  9. package/dist/cjs/bin.js +14 -0
  10. package/dist/cjs/bin.js.map +1 -0
  11. package/dist/cjs/digester/Digester.js +488 -0
  12. package/dist/cjs/digester/Digester.js.map +1 -0
  13. package/dist/cjs/digester/TypeMapper.js +262 -0
  14. package/dist/cjs/digester/TypeMapper.js.map +1 -0
  15. package/dist/cjs/generator/Generator.js +126 -0
  16. package/dist/cjs/generator/Generator.js.map +1 -0
  17. package/dist/cjs/generator/IndexGenerator.js +164 -0
  18. package/dist/cjs/generator/IndexGenerator.js.map +1 -0
  19. package/dist/cjs/generator/ModelsGenerator.js +255 -0
  20. package/dist/cjs/generator/ModelsGenerator.js.map +1 -0
  21. package/dist/cjs/generator/NamingHelper.js +164 -0
  22. package/dist/cjs/generator/NamingHelper.js.map +1 -0
  23. package/dist/cjs/generator/PackageGenerator.js +168 -0
  24. package/dist/cjs/generator/PackageGenerator.js.map +1 -0
  25. package/dist/cjs/generator/QueryModelsGenerator.js +182 -0
  26. package/dist/cjs/generator/QueryModelsGenerator.js.map +1 -0
  27. package/dist/cjs/generator/ServiceFnGenerator.js +258 -0
  28. package/dist/cjs/generator/ServiceFnGenerator.js.map +1 -0
  29. package/dist/cjs/generator/ServiceFnPromiseGenerator.js +182 -0
  30. package/dist/cjs/generator/ServiceFnPromiseGenerator.js.map +1 -0
  31. package/dist/cjs/index.js +38 -0
  32. package/dist/cjs/index.js.map +1 -0
  33. package/dist/cjs/model/DataModel.js +28 -0
  34. package/dist/cjs/model/DataModel.js.map +1 -0
  35. package/dist/cjs/parser/EdmxSchema.js +20 -0
  36. package/dist/cjs/parser/EdmxSchema.js.map +1 -0
  37. package/dist/cjs/parser/XmlParser.js +47 -0
  38. package/dist/cjs/parser/XmlParser.js.map +1 -0
  39. package/dist/dts/Cli.d.ts +9 -0
  40. package/dist/dts/Cli.d.ts.map +1 -0
  41. package/dist/dts/bin.d.ts +3 -0
  42. package/dist/dts/bin.d.ts.map +1 -0
  43. package/dist/dts/digester/Digester.d.ts +33 -0
  44. package/dist/dts/digester/Digester.d.ts.map +1 -0
  45. package/dist/dts/digester/TypeMapper.d.ts +79 -0
  46. package/dist/dts/digester/TypeMapper.d.ts.map +1 -0
  47. package/dist/dts/generator/Generator.d.ts +45 -0
  48. package/dist/dts/generator/Generator.d.ts.map +1 -0
  49. package/dist/dts/generator/IndexGenerator.d.ts +14 -0
  50. package/dist/dts/generator/IndexGenerator.d.ts.map +1 -0
  51. package/dist/dts/generator/ModelsGenerator.d.ts +14 -0
  52. package/dist/dts/generator/ModelsGenerator.d.ts.map +1 -0
  53. package/dist/dts/generator/NamingHelper.d.ts +110 -0
  54. package/dist/dts/generator/NamingHelper.d.ts.map +1 -0
  55. package/dist/dts/generator/PackageGenerator.d.ts +53 -0
  56. package/dist/dts/generator/PackageGenerator.d.ts.map +1 -0
  57. package/dist/dts/generator/QueryModelsGenerator.d.ts +14 -0
  58. package/dist/dts/generator/QueryModelsGenerator.d.ts.map +1 -0
  59. package/dist/dts/generator/ServiceFnGenerator.d.ts +37 -0
  60. package/dist/dts/generator/ServiceFnGenerator.d.ts.map +1 -0
  61. package/dist/dts/generator/ServiceFnPromiseGenerator.d.ts +40 -0
  62. package/dist/dts/generator/ServiceFnPromiseGenerator.d.ts.map +1 -0
  63. package/dist/dts/index.d.ts +101 -0
  64. package/dist/dts/index.d.ts.map +1 -0
  65. package/dist/dts/model/DataModel.d.ts +188 -0
  66. package/dist/dts/model/DataModel.d.ts.map +1 -0
  67. package/dist/dts/parser/EdmxSchema.d.ts +228 -0
  68. package/dist/dts/parser/EdmxSchema.d.ts.map +1 -0
  69. package/dist/dts/parser/XmlParser.d.ts +31 -0
  70. package/dist/dts/parser/XmlParser.d.ts.map +1 -0
  71. package/dist/esm/Cli.js +87 -0
  72. package/dist/esm/Cli.js.map +1 -0
  73. package/dist/esm/bin.js +12 -0
  74. package/dist/esm/bin.js.map +1 -0
  75. package/dist/esm/digester/Digester.js +478 -0
  76. package/dist/esm/digester/Digester.js.map +1 -0
  77. package/dist/esm/digester/TypeMapper.js +248 -0
  78. package/dist/esm/digester/TypeMapper.js.map +1 -0
  79. package/dist/esm/generator/Generator.js +116 -0
  80. package/dist/esm/generator/Generator.js.map +1 -0
  81. package/dist/esm/generator/IndexGenerator.js +157 -0
  82. package/dist/esm/generator/IndexGenerator.js.map +1 -0
  83. package/dist/esm/generator/ModelsGenerator.js +248 -0
  84. package/dist/esm/generator/ModelsGenerator.js.map +1 -0
  85. package/dist/esm/generator/NamingHelper.js +147 -0
  86. package/dist/esm/generator/NamingHelper.js.map +1 -0
  87. package/dist/esm/generator/PackageGenerator.js +156 -0
  88. package/dist/esm/generator/PackageGenerator.js.map +1 -0
  89. package/dist/esm/generator/QueryModelsGenerator.js +175 -0
  90. package/dist/esm/generator/QueryModelsGenerator.js.map +1 -0
  91. package/dist/esm/generator/ServiceFnGenerator.js +251 -0
  92. package/dist/esm/generator/ServiceFnGenerator.js.map +1 -0
  93. package/dist/esm/generator/ServiceFnPromiseGenerator.js +174 -0
  94. package/dist/esm/generator/ServiceFnPromiseGenerator.js.map +1 -0
  95. package/dist/esm/index.js +101 -0
  96. package/dist/esm/index.js.map +1 -0
  97. package/dist/esm/model/DataModel.js +21 -0
  98. package/dist/esm/model/DataModel.js.map +1 -0
  99. package/dist/esm/package.json +4 -0
  100. package/dist/esm/parser/EdmxSchema.js +13 -0
  101. package/dist/esm/parser/EdmxSchema.js.map +1 -0
  102. package/dist/esm/parser/XmlParser.js +37 -0
  103. package/dist/esm/parser/XmlParser.js.map +1 -0
  104. package/generator/Generator/package.json +6 -0
  105. package/generator/IndexGenerator/package.json +6 -0
  106. package/generator/ModelsGenerator/package.json +6 -0
  107. package/generator/NamingHelper/package.json +6 -0
  108. package/generator/PackageGenerator/package.json +6 -0
  109. package/generator/QueryModelsGenerator/package.json +6 -0
  110. package/generator/ServiceFnGenerator/package.json +6 -0
  111. package/generator/ServiceFnPromiseGenerator/package.json +6 -0
  112. package/model/DataModel/package.json +6 -0
  113. package/package.json +157 -0
  114. package/parser/EdmxSchema/package.json +6 -0
  115. package/parser/XmlParser/package.json +6 -0
  116. package/src/Cli.ts +115 -0
  117. package/src/bin.ts +17 -0
  118. package/src/digester/Digester.ts +600 -0
  119. package/src/digester/TypeMapper.ts +181 -0
  120. package/src/generator/Generator.ts +183 -0
  121. package/src/generator/IndexGenerator.ts +189 -0
  122. package/src/generator/ModelsGenerator.ts +344 -0
  123. package/src/generator/NamingHelper.ts +159 -0
  124. package/src/generator/PackageGenerator.ts +176 -0
  125. package/src/generator/QueryModelsGenerator.ts +228 -0
  126. package/src/generator/ServiceFnGenerator.ts +324 -0
  127. package/src/generator/ServiceFnPromiseGenerator.ts +242 -0
  128. package/src/index.ts +114 -0
  129. package/src/model/DataModel.ts +254 -0
  130. package/src/parser/EdmxSchema.ts +308 -0
  131. package/src/parser/XmlParser.ts +47 -0
@@ -0,0 +1,308 @@
1
+ /**
2
+ * Common EDMX schema interfaces for OData metadata parsing.
3
+ * These interfaces represent the parsed XML structure from xml2js.
4
+ *
5
+ * @since 1.0.0
6
+ */
7
+
8
+ // ============================================================================
9
+ // Common Types
10
+ // ============================================================================
11
+
12
+ export interface ODataEdmxModel {
13
+ readonly "edmx:Edmx": {
14
+ readonly $: { readonly Version: string }
15
+ readonly "edmx:DataServices": ReadonlyArray<DataServices>
16
+ }
17
+ }
18
+
19
+ export interface DataServices {
20
+ readonly Schema: ReadonlyArray<Schema>
21
+ }
22
+
23
+ export interface Schema {
24
+ readonly $: {
25
+ readonly Namespace: string
26
+ readonly Alias?: string
27
+ }
28
+ readonly EntityType?: ReadonlyArray<EntityType>
29
+ readonly ComplexType?: ReadonlyArray<ComplexType>
30
+ readonly EnumType?: ReadonlyArray<EnumType>
31
+ readonly EntityContainer?: ReadonlyArray<EntityContainer>
32
+ readonly TypeDefinition?: ReadonlyArray<TypeDefinition>
33
+ readonly Association?: ReadonlyArray<Association>
34
+ readonly Function?: ReadonlyArray<Operation>
35
+ readonly Action?: ReadonlyArray<Operation>
36
+ }
37
+
38
+ // ============================================================================
39
+ // Entity Type
40
+ // ============================================================================
41
+
42
+ export interface EntityType {
43
+ readonly $: {
44
+ readonly Name: string
45
+ readonly BaseType?: string
46
+ readonly Abstract?: string
47
+ readonly OpenType?: string
48
+ }
49
+ readonly Key?: ReadonlyArray<Key>
50
+ readonly Property?: ReadonlyArray<Property>
51
+ readonly NavigationProperty?: ReadonlyArray<NavigationProperty>
52
+ }
53
+
54
+ export interface Key {
55
+ readonly PropertyRef: ReadonlyArray<PropertyRef>
56
+ }
57
+
58
+ export interface PropertyRef {
59
+ readonly $: {
60
+ readonly Name: string
61
+ }
62
+ }
63
+
64
+ export interface Property {
65
+ readonly $: {
66
+ readonly Name: string
67
+ readonly Type: string
68
+ readonly Nullable?: string
69
+ readonly MaxLength?: string
70
+ readonly Precision?: string
71
+ readonly Scale?: string
72
+ readonly DefaultValue?: string
73
+ readonly ConcurrencyMode?: string
74
+ // SAP-specific attributes
75
+ readonly "sap:label"?: string
76
+ readonly "sap:creatable"?: string
77
+ readonly "sap:updatable"?: string
78
+ readonly "sap:filterable"?: string
79
+ readonly "sap:sortable"?: string
80
+ }
81
+ }
82
+
83
+ // ============================================================================
84
+ // Navigation Property
85
+ // ============================================================================
86
+
87
+ // V2 NavigationProperty (uses Relationship/FromRole/ToRole)
88
+ export interface NavigationPropertyV2 {
89
+ readonly $: {
90
+ readonly Name: string
91
+ readonly Relationship: string
92
+ readonly FromRole: string
93
+ readonly ToRole: string
94
+ }
95
+ }
96
+
97
+ // V4 NavigationProperty (uses Type directly)
98
+ export interface NavigationPropertyV4 {
99
+ readonly $: {
100
+ readonly Name: string
101
+ readonly Type: string
102
+ readonly Nullable?: string
103
+ readonly Partner?: string
104
+ readonly ContainsTarget?: string
105
+ }
106
+ }
107
+
108
+ export type NavigationProperty = NavigationPropertyV2 | NavigationPropertyV4
109
+
110
+ // ============================================================================
111
+ // Complex Type
112
+ // ============================================================================
113
+
114
+ export interface ComplexType {
115
+ readonly $: {
116
+ readonly Name: string
117
+ readonly BaseType?: string
118
+ readonly Abstract?: string
119
+ readonly OpenType?: string
120
+ }
121
+ readonly Property?: ReadonlyArray<Property>
122
+ readonly NavigationProperty?: ReadonlyArray<NavigationProperty>
123
+ }
124
+
125
+ // ============================================================================
126
+ // Enum Type
127
+ // ============================================================================
128
+
129
+ export interface EnumType {
130
+ readonly $: {
131
+ readonly Name: string
132
+ readonly UnderlyingType?: string
133
+ readonly IsFlags?: string
134
+ }
135
+ readonly Member: ReadonlyArray<EnumMember>
136
+ }
137
+
138
+ export interface EnumMember {
139
+ readonly $: {
140
+ readonly Name: string
141
+ readonly Value?: string
142
+ }
143
+ }
144
+
145
+ // ============================================================================
146
+ // Type Definition
147
+ // ============================================================================
148
+
149
+ export interface TypeDefinition {
150
+ readonly $: {
151
+ readonly Name: string
152
+ readonly UnderlyingType: string
153
+ }
154
+ }
155
+
156
+ // ============================================================================
157
+ // Association (V2 only)
158
+ // ============================================================================
159
+
160
+ export interface Association {
161
+ readonly $: {
162
+ readonly Name: string
163
+ }
164
+ readonly End: ReadonlyArray<AssociationEnd>
165
+ readonly ReferentialConstraint?: ReadonlyArray<ReferentialConstraint>
166
+ }
167
+
168
+ export interface AssociationEnd {
169
+ readonly $: {
170
+ readonly Role: string
171
+ readonly Type: string
172
+ readonly Multiplicity: string
173
+ }
174
+ }
175
+
176
+ export interface ReferentialConstraint {
177
+ readonly Principal: ReadonlyArray<ConstraintRole>
178
+ readonly Dependent: ReadonlyArray<ConstraintRole>
179
+ }
180
+
181
+ export interface ConstraintRole {
182
+ readonly $: {
183
+ readonly Role: string
184
+ }
185
+ readonly PropertyRef: ReadonlyArray<PropertyRef>
186
+ }
187
+
188
+ // ============================================================================
189
+ // Entity Container
190
+ // ============================================================================
191
+
192
+ export interface EntityContainer {
193
+ readonly $: {
194
+ readonly Name: string
195
+ readonly "m:IsDefaultEntityContainer"?: string
196
+ }
197
+ readonly EntitySet?: ReadonlyArray<EntitySet>
198
+ readonly Singleton?: ReadonlyArray<Singleton>
199
+ readonly AssociationSet?: ReadonlyArray<AssociationSet>
200
+ readonly FunctionImport?: ReadonlyArray<FunctionImport>
201
+ readonly ActionImport?: ReadonlyArray<ActionImport>
202
+ }
203
+
204
+ export interface EntitySet {
205
+ readonly $: {
206
+ readonly Name: string
207
+ readonly EntityType: string
208
+ }
209
+ readonly NavigationPropertyBinding?: ReadonlyArray<NavigationPropertyBinding>
210
+ }
211
+
212
+ export interface Singleton {
213
+ readonly $: {
214
+ readonly Name: string
215
+ readonly Type: string
216
+ }
217
+ readonly NavigationPropertyBinding?: ReadonlyArray<NavigationPropertyBinding>
218
+ }
219
+
220
+ export interface NavigationPropertyBinding {
221
+ readonly $: {
222
+ readonly Path: string
223
+ readonly Target: string
224
+ }
225
+ }
226
+
227
+ export interface AssociationSet {
228
+ readonly $: {
229
+ readonly Name: string
230
+ readonly Association: string
231
+ }
232
+ readonly End: ReadonlyArray<AssociationSetEnd>
233
+ }
234
+
235
+ export interface AssociationSetEnd {
236
+ readonly $: {
237
+ readonly Role: string
238
+ readonly EntitySet: string
239
+ }
240
+ }
241
+
242
+ // ============================================================================
243
+ // Function / Action
244
+ // ============================================================================
245
+
246
+ export interface Operation {
247
+ readonly $: {
248
+ readonly Name: string
249
+ readonly IsBound?: string
250
+ readonly EntitySetPath?: string
251
+ }
252
+ readonly Parameter?: ReadonlyArray<OperationParameter>
253
+ readonly ReturnType?: ReadonlyArray<OperationReturnType>
254
+ }
255
+
256
+ export interface OperationParameter {
257
+ readonly $: {
258
+ readonly Name: string
259
+ readonly Type: string
260
+ readonly Nullable?: string
261
+ readonly Unicode?: string
262
+ readonly Mode?: string
263
+ }
264
+ }
265
+
266
+ export interface OperationReturnType {
267
+ readonly $?: {
268
+ readonly Type: string
269
+ readonly Nullable?: string
270
+ }
271
+ readonly Type?: string
272
+ }
273
+
274
+ // ============================================================================
275
+ // Function Import / Action Import
276
+ // ============================================================================
277
+
278
+ export interface FunctionImport {
279
+ readonly $: {
280
+ readonly Name: string
281
+ readonly Function?: string
282
+ readonly EntitySet?: string
283
+ readonly ReturnType?: string
284
+ readonly "m:HttpMethod"?: string
285
+ }
286
+ readonly Parameter?: ReadonlyArray<OperationParameter>
287
+ }
288
+
289
+ export interface ActionImport {
290
+ readonly $: {
291
+ readonly Name: string
292
+ readonly Action: string
293
+ readonly EntitySet?: string
294
+ }
295
+ }
296
+
297
+ // ============================================================================
298
+ // Version Detection
299
+ // ============================================================================
300
+
301
+ export type ODataVersion = "V2" | "V4"
302
+
303
+ export const detectODataVersion = (edmx: ODataEdmxModel): ODataVersion => {
304
+ const version = edmx["edmx:Edmx"].$.Version
305
+ if (version === "1.0") return "V2"
306
+ if (version === "4.0") return "V4"
307
+ throw new Error(`Unsupported EDMX version: ${version}`)
308
+ }
@@ -0,0 +1,47 @@
1
+ /**
2
+ * Effect-wrapped XML parser for OData metadata.
3
+ *
4
+ * @since 1.0.0
5
+ */
6
+ import * as Effect from "effect/Effect"
7
+ import * as Schema from "effect/Schema"
8
+ import { parseStringPromise } from "xml2js"
9
+ import type { ODataEdmxModel } from "./EdmxSchema.js"
10
+
11
+ /**
12
+ * Error thrown when XML parsing fails.
13
+ *
14
+ * @since 1.0.0
15
+ * @category errors
16
+ */
17
+ export class XmlParseError extends Schema.TaggedError<XmlParseError>()(
18
+ "XmlParseError",
19
+ {
20
+ message: Schema.String,
21
+ cause: Schema.Unknown
22
+ }
23
+ ) {}
24
+
25
+ /**
26
+ * Parse OData metadata XML content into a structured object.
27
+ *
28
+ * @since 1.0.0
29
+ * @category parsing
30
+ */
31
+ export const parseODataMetadata = (
32
+ xmlContent: string
33
+ ): Effect.Effect<ODataEdmxModel, XmlParseError> =>
34
+ Effect.tryPromise({
35
+ try: () =>
36
+ parseStringPromise(xmlContent, {
37
+ explicitArray: true,
38
+ preserveChildrenOrder: true,
39
+ attrkey: "$",
40
+ charkey: "_"
41
+ }) as Promise<ODataEdmxModel>,
42
+ catch: (error) =>
43
+ new XmlParseError({
44
+ message: "Failed to parse OData metadata XML",
45
+ cause: error
46
+ })
47
+ })