@odata-effect/odata-effect-generator 0.1.2 → 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.
- package/README.md +232 -5
- package/dist/cjs/Cli.js +5 -1
- package/dist/cjs/Cli.js.map +1 -1
- package/dist/cjs/generator/Generator.js +35 -25
- package/dist/cjs/generator/Generator.js.map +1 -1
- package/dist/cjs/generator/IndexGenerator.js +29 -80
- package/dist/cjs/generator/IndexGenerator.js.map +1 -1
- package/dist/cjs/generator/ModelsGenerator.js +2 -5
- package/dist/cjs/generator/ModelsGenerator.js.map +1 -1
- package/dist/cjs/generator/NamingHelper.js +4 -1
- package/dist/cjs/generator/NamingHelper.js.map +1 -1
- package/dist/cjs/generator/NavigationGenerator.js +370 -0
- package/dist/cjs/generator/NavigationGenerator.js.map +1 -0
- package/dist/cjs/generator/OperationsGenerator.js +384 -0
- package/dist/cjs/generator/OperationsGenerator.js.map +1 -0
- package/dist/cjs/generator/QueryModelsGenerator.js +2 -2
- package/dist/cjs/generator/QueryModelsGenerator.js.map +1 -1
- package/dist/cjs/generator/ServiceFnGenerator.js +102 -224
- package/dist/cjs/generator/ServiceFnGenerator.js.map +1 -1
- package/dist/cjs/index.js +3 -3
- package/dist/dts/Cli.d.ts.map +1 -1
- package/dist/dts/generator/Generator.d.ts +2 -0
- package/dist/dts/generator/Generator.d.ts.map +1 -1
- package/dist/dts/generator/IndexGenerator.d.ts.map +1 -1
- package/dist/dts/generator/NamingHelper.d.ts.map +1 -1
- package/dist/dts/generator/NavigationGenerator.d.ts +55 -0
- package/dist/dts/generator/NavigationGenerator.d.ts.map +1 -0
- package/dist/dts/generator/OperationsGenerator.d.ts +50 -0
- package/dist/dts/generator/OperationsGenerator.d.ts.map +1 -0
- package/dist/dts/generator/ServiceFnGenerator.d.ts +10 -11
- package/dist/dts/generator/ServiceFnGenerator.d.ts.map +1 -1
- package/dist/dts/index.d.ts +4 -4
- package/dist/dts/index.d.ts.map +1 -1
- package/dist/esm/Cli.js +5 -1
- package/dist/esm/Cli.js.map +1 -1
- package/dist/esm/generator/Generator.js +35 -25
- package/dist/esm/generator/Generator.js.map +1 -1
- package/dist/esm/generator/IndexGenerator.js +29 -80
- package/dist/esm/generator/IndexGenerator.js.map +1 -1
- package/dist/esm/generator/ModelsGenerator.js +2 -5
- package/dist/esm/generator/ModelsGenerator.js.map +1 -1
- package/dist/esm/generator/NamingHelper.js +4 -1
- package/dist/esm/generator/NamingHelper.js.map +1 -1
- package/dist/esm/generator/NavigationGenerator.js +362 -0
- package/dist/esm/generator/NavigationGenerator.js.map +1 -0
- package/dist/esm/generator/OperationsGenerator.js +375 -0
- package/dist/esm/generator/OperationsGenerator.js.map +1 -0
- package/dist/esm/generator/QueryModelsGenerator.js +2 -2
- package/dist/esm/generator/QueryModelsGenerator.js.map +1 -1
- package/dist/esm/generator/ServiceFnGenerator.js +102 -224
- package/dist/esm/generator/ServiceFnGenerator.js.map +1 -1
- package/dist/esm/index.js +4 -4
- package/dist/esm/index.js.map +1 -1
- package/generator/NavigationGenerator/package.json +6 -0
- package/generator/OperationsGenerator/package.json +6 -0
- package/package.json +17 -9
- package/src/Cli.ts +15 -2
- package/src/generator/Generator.ts +44 -23
- package/src/generator/IndexGenerator.ts +29 -80
- package/src/generator/ModelsGenerator.ts +2 -5
- package/src/generator/NamingHelper.ts +8 -1
- package/src/generator/NavigationGenerator.ts +485 -0
- package/src/generator/OperationsGenerator.ts +507 -0
- package/src/generator/QueryModelsGenerator.ts +2 -2
- package/src/generator/ServiceFnGenerator.ts +117 -265
- package/src/index.ts +4 -4
- package/dist/cjs/generator/ServiceFnPromiseGenerator.js +0 -183
- package/dist/cjs/generator/ServiceFnPromiseGenerator.js.map +0 -1
- package/dist/dts/generator/ServiceFnPromiseGenerator.d.ts +0 -40
- package/dist/dts/generator/ServiceFnPromiseGenerator.d.ts.map +0 -1
- package/dist/esm/generator/ServiceFnPromiseGenerator.js +0 -175
- package/dist/esm/generator/ServiceFnPromiseGenerator.js.map +0 -1
- package/generator/ServiceFnPromiseGenerator/package.json +0 -6
- package/src/generator/ServiceFnPromiseGenerator.ts +0 -243
package/README.md
CHANGED
|
@@ -26,16 +26,243 @@ odata-effect-gen generate ./metadata.xml ./generated
|
|
|
26
26
|
- `--service-name`: Override service name (defaults to EntityContainer name)
|
|
27
27
|
- `--package-name`: NPM package name (defaults to @template/<service-name>-effect)
|
|
28
28
|
- `--force`: Overwrite existing files
|
|
29
|
+
- `--files-only`: Generate only source files directly in output-dir (no package.json, tsconfig, src/ subdirectory)
|
|
29
30
|
|
|
30
31
|
## Generated Code
|
|
31
32
|
|
|
32
33
|
The generator produces:
|
|
33
34
|
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
35
|
+
| File | Description |
|
|
36
|
+
|------|-------------|
|
|
37
|
+
| `Models.ts` | Schema classes for entities and complex types |
|
|
38
|
+
| `QueryModels.ts` | Type-safe query paths for filtering and ordering |
|
|
39
|
+
| `Services.ts` | CRUD services for all entity sets (using crud factory) |
|
|
40
|
+
| `PathBuilders.ts` | Tree-shakable navigation path builders with `toPromise` |
|
|
41
|
+
| `Operations.ts` | Functions/Actions (if present in metadata) |
|
|
42
|
+
| `index.ts` | Re-exports all generated code |
|
|
43
|
+
|
|
44
|
+
## Two Ways to Query Data
|
|
45
|
+
|
|
46
|
+
The generator provides two complementary approaches for querying OData services:
|
|
47
|
+
|
|
48
|
+
### 1. Service Functions (Direct Operations)
|
|
49
|
+
|
|
50
|
+
Best for simple CRUD operations on a single entity set:
|
|
51
|
+
|
|
52
|
+
```typescript
|
|
53
|
+
import { ProductService } from "./generated"
|
|
54
|
+
|
|
55
|
+
// Get all products
|
|
56
|
+
const products = yield* ProductService.getAll()
|
|
57
|
+
|
|
58
|
+
// Get by ID
|
|
59
|
+
const product = yield* ProductService.getById(123)
|
|
60
|
+
|
|
61
|
+
// Create
|
|
62
|
+
const newProduct = yield* ProductService.create({ name: "Widget", price: 9.99 })
|
|
63
|
+
|
|
64
|
+
// Update
|
|
65
|
+
yield* ProductService.update(123, { price: 12.99 })
|
|
66
|
+
|
|
67
|
+
// Delete
|
|
68
|
+
yield* ProductService.delete(123)
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
### 2. Path Builders (Pipe-based Navigation)
|
|
72
|
+
|
|
73
|
+
Best for navigating relationships with full type safety. Uses branded types to ensure you can only navigate to valid properties:
|
|
74
|
+
|
|
75
|
+
```typescript
|
|
76
|
+
import { pipe } from "effect"
|
|
77
|
+
import {
|
|
78
|
+
People, byKey, trips, planItems, asFlight, bestFriend,
|
|
79
|
+
fetchCollection, fetchOne
|
|
80
|
+
} from "./generated"
|
|
81
|
+
import { Person, Trip, Flight } from "./generated"
|
|
82
|
+
|
|
83
|
+
// Navigate through relationships with pipe()
|
|
84
|
+
const flights = yield* pipe(
|
|
85
|
+
People, // Path<PersonModel, true> - collection
|
|
86
|
+
byKey("russellwhyte"), // Path<PersonModel, false> - single entity
|
|
87
|
+
trips, // Path<TripModel, true> - collection
|
|
88
|
+
byKey(0), // Path<TripModel, false> - single entity
|
|
89
|
+
planItems, // Path<PlanItemModel, true>
|
|
90
|
+
asFlight, // Path<FlightModel, true> - type cast
|
|
91
|
+
fetchCollection(Flight) // Execute the query
|
|
92
|
+
)
|
|
93
|
+
|
|
94
|
+
// Get a single entity
|
|
95
|
+
const person = yield* pipe(
|
|
96
|
+
People,
|
|
97
|
+
byKey("russellwhyte"),
|
|
98
|
+
fetchOne(Person)
|
|
99
|
+
)
|
|
100
|
+
|
|
101
|
+
// Navigate to a single related entity
|
|
102
|
+
const friend = yield* pipe(
|
|
103
|
+
People,
|
|
104
|
+
byKey("russellwhyte"),
|
|
105
|
+
bestFriend,
|
|
106
|
+
fetchOne(Person)
|
|
107
|
+
)
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
### Type Safety with Branded Types
|
|
111
|
+
|
|
112
|
+
The path builders use branded types to ensure type-safe navigation at compile time:
|
|
113
|
+
|
|
114
|
+
```typescript
|
|
115
|
+
// Path<TEntity, IsCollection> tracks what entity type you're "at"
|
|
116
|
+
type Path<TEntity, IsCollection extends boolean = false> = string & {
|
|
117
|
+
readonly _entity: TEntity
|
|
118
|
+
readonly _collection: IsCollection
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
// TypeScript prevents invalid navigation:
|
|
122
|
+
|
|
123
|
+
// ✅ Valid - trips is a navigation property on Person
|
|
124
|
+
pipe(People, byKey("russell"), trips)
|
|
125
|
+
|
|
126
|
+
// ❌ Compile error - planItems is on Trip, not Person
|
|
127
|
+
pipe(People, byKey("russell"), planItems)
|
|
128
|
+
|
|
129
|
+
// ❌ Compile error - can't byKey on a single entity (not a collection)
|
|
130
|
+
pipe(People, byKey("russell"), byKey("other"))
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
### Path Builder Features
|
|
134
|
+
|
|
135
|
+
| Feature | Example |
|
|
136
|
+
|---------|---------|
|
|
137
|
+
| Entity set root | `People` → `Path<PersonModel, true>` |
|
|
138
|
+
| Key access | `byKey("id")` → converts collection to single |
|
|
139
|
+
| Navigation | `trips` → type-safe navigation to related entity |
|
|
140
|
+
| Type casting | `asFlight` → filter to derived type |
|
|
141
|
+
| Terminal ops | `fetchCollection(Schema)`, `fetchOne(Schema)` |
|
|
142
|
+
|
|
143
|
+
### Tree-Shaking
|
|
144
|
+
|
|
145
|
+
Path builders are fully tree-shakable. Each navigation function is a separate export:
|
|
146
|
+
|
|
147
|
+
```typescript
|
|
148
|
+
// Only import what you use - unused navigation functions are removed by bundler
|
|
149
|
+
import { People, byKey, trips } from "./generated"
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
### Comparison with odata2ts
|
|
153
|
+
|
|
154
|
+
If you're familiar with odata2ts, here's how the APIs compare:
|
|
155
|
+
|
|
156
|
+
```typescript
|
|
157
|
+
// odata2ts (method chaining)
|
|
158
|
+
const response = await trippinService
|
|
159
|
+
.people("russellwhyte")
|
|
160
|
+
.trips(0)
|
|
161
|
+
.planItems()
|
|
162
|
+
.asFlightCollectionService()
|
|
163
|
+
.query()
|
|
164
|
+
|
|
165
|
+
// odata-effect (pipe composition)
|
|
166
|
+
const flights = yield* pipe(
|
|
167
|
+
People,
|
|
168
|
+
byKey("russellwhyte"),
|
|
169
|
+
trips,
|
|
170
|
+
byKey(0),
|
|
171
|
+
planItems,
|
|
172
|
+
asFlight,
|
|
173
|
+
fetchCollection(Flight)
|
|
174
|
+
)
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
## Query Options
|
|
178
|
+
|
|
179
|
+
Both service functions and path builders support OData query options:
|
|
180
|
+
|
|
181
|
+
```typescript
|
|
182
|
+
// With service functions
|
|
183
|
+
const products = yield* ProductService.getAll({
|
|
184
|
+
$filter: "price gt 10",
|
|
185
|
+
$orderby: "name",
|
|
186
|
+
$top: 10,
|
|
187
|
+
$select: "id,name,price"
|
|
188
|
+
})
|
|
189
|
+
|
|
190
|
+
// With path builders (via fetchCollection/fetchOne)
|
|
191
|
+
const myTrips = yield* pipe(
|
|
192
|
+
People,
|
|
193
|
+
byKey("russellwhyte"),
|
|
194
|
+
trips,
|
|
195
|
+
(path) => fetchCollection(Trip)(path, {
|
|
196
|
+
$filter: "budget gt 1000",
|
|
197
|
+
$orderby: "startsAt desc"
|
|
198
|
+
})
|
|
199
|
+
)
|
|
200
|
+
```
|
|
201
|
+
|
|
202
|
+
## Type-Safe Query Building
|
|
203
|
+
|
|
204
|
+
Use the generated `QueryModels` for type-safe filter and orderby construction:
|
|
205
|
+
|
|
206
|
+
```typescript
|
|
207
|
+
import { productQuery } from "./generated"
|
|
208
|
+
|
|
209
|
+
const query = productQuery()
|
|
210
|
+
.filter(q => q.price.gt(10).and(q.name.contains("Widget")))
|
|
211
|
+
.orderBy(q => q.name.asc())
|
|
212
|
+
.select("id", "name", "price")
|
|
213
|
+
.top(10)
|
|
214
|
+
.build()
|
|
215
|
+
|
|
216
|
+
const products = yield* ProductService.getAll(query)
|
|
217
|
+
```
|
|
218
|
+
|
|
219
|
+
## Promise-Based Usage
|
|
220
|
+
|
|
221
|
+
For non-Effect environments, use the `toPromise` function to convert any Effect to a Promise:
|
|
222
|
+
|
|
223
|
+
```typescript
|
|
224
|
+
import { pipe } from "effect"
|
|
225
|
+
import { createODataRuntime } from "@odata-effect/odata-effect-promise"
|
|
226
|
+
import { ProductService, toPromise, People, byKey, trips, fetchCollection, Trip } from "./generated"
|
|
227
|
+
|
|
228
|
+
const runtime = createODataRuntime({
|
|
229
|
+
baseUrl: "https://api.example.com",
|
|
230
|
+
servicePath: "/odata/v4/"
|
|
231
|
+
})
|
|
232
|
+
|
|
233
|
+
// Service functions - pipe through toPromise
|
|
234
|
+
const products = await ProductService.getAll().pipe(toPromise(runtime))
|
|
235
|
+
const product = await ProductService.getById(123).pipe(toPromise(runtime))
|
|
236
|
+
|
|
237
|
+
// Path builders - add toPromise at the end of the pipe
|
|
238
|
+
const myTrips = await pipe(
|
|
239
|
+
People,
|
|
240
|
+
byKey("russellwhyte"),
|
|
241
|
+
trips,
|
|
242
|
+
fetchCollection(Trip),
|
|
243
|
+
toPromise(runtime)
|
|
244
|
+
)
|
|
245
|
+
|
|
246
|
+
// Don't forget to dispose when done
|
|
247
|
+
await runtime.dispose()
|
|
248
|
+
```
|
|
249
|
+
|
|
250
|
+
## Operations (Functions & Actions)
|
|
251
|
+
|
|
252
|
+
If your OData service defines FunctionImports (V2) or Functions/Actions (V4), they are generated in `Operations.ts`:
|
|
253
|
+
|
|
254
|
+
```typescript
|
|
255
|
+
import { Operations } from "./generated"
|
|
256
|
+
|
|
257
|
+
// V2 FunctionImport
|
|
258
|
+
const result = yield* Operations.getProductsByRating({ rating: 5 })
|
|
259
|
+
|
|
260
|
+
// V4 Function (no side effects)
|
|
261
|
+
const airport = yield* Operations.getNearestAirport({ lat: 51.5, lon: -0.1 })
|
|
262
|
+
|
|
263
|
+
// V4 Action (may have side effects)
|
|
264
|
+
yield* Operations.resetDataSource()
|
|
265
|
+
```
|
|
39
266
|
|
|
40
267
|
## License
|
|
41
268
|
|
package/dist/cjs/Cli.js
CHANGED
|
@@ -30,6 +30,7 @@ const outputDir = /*#__PURE__*/_cli.Args.path({
|
|
|
30
30
|
const serviceName = /*#__PURE__*/_cli.Options.text("service-name").pipe(_cli.Options.optional, /*#__PURE__*/_cli.Options.withDescription("Override service name (defaults to EntityContainer name)"));
|
|
31
31
|
const packageName = /*#__PURE__*/_cli.Options.text("package-name").pipe(_cli.Options.optional, /*#__PURE__*/_cli.Options.withDescription("NPM package name (defaults to @template/<service-name>-effect)"));
|
|
32
32
|
const force = /*#__PURE__*/_cli.Options.boolean("force").pipe(/*#__PURE__*/_cli.Options.withDefault(false), /*#__PURE__*/_cli.Options.withDescription("Overwrite existing files"));
|
|
33
|
+
const filesOnly = /*#__PURE__*/_cli.Options.boolean("files-only").pipe(/*#__PURE__*/_cli.Options.withDefault(false), /*#__PURE__*/_cli.Options.withDescription("Generate only source files (no package.json, tsconfig, etc.) directly in output-dir"));
|
|
33
34
|
// ============================================================================
|
|
34
35
|
// Generate Command
|
|
35
36
|
// ============================================================================
|
|
@@ -38,8 +39,10 @@ const generateCommand = /*#__PURE__*/_cli.Command.make("generate", {
|
|
|
38
39
|
outputDir,
|
|
39
40
|
serviceName,
|
|
40
41
|
packageName,
|
|
41
|
-
force
|
|
42
|
+
force,
|
|
43
|
+
filesOnly
|
|
42
44
|
}).pipe(/*#__PURE__*/_cli.Command.withDescription("Generate Effect OData client from metadata"), /*#__PURE__*/_cli.Command.withHandler(({
|
|
45
|
+
filesOnly: onlyFiles,
|
|
43
46
|
force: forceOverwrite,
|
|
44
47
|
metadataPath: metaPath,
|
|
45
48
|
outputDir: outDir,
|
|
@@ -68,6 +71,7 @@ const generateCommand = /*#__PURE__*/_cli.Command.make("generate", {
|
|
|
68
71
|
const config = {
|
|
69
72
|
outputDir: outDir,
|
|
70
73
|
force: forceOverwrite,
|
|
74
|
+
filesOnly: onlyFiles,
|
|
71
75
|
...(svcName._tag === "Some" ? {
|
|
72
76
|
serviceName: svcName.value
|
|
73
77
|
} : {}),
|
package/dist/cjs/Cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Cli.js","names":["_cli","require","FileSystem","_interopRequireWildcard","Console","Effect","_Digester","_Generator","_XmlParser","e","t","WeakMap","r","n","__esModule","o","i","f","__proto__","default","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","metadataPath","Args","path","name","pipe","withDescription","outputDir","serviceName","Options","text","optional","packageName","force","boolean","withDefault","generateCommand","Command","make","withHandler","forceOverwrite","metaPath","outDir","pkgName","svcName","gen","fs","log","metadataContent","readFileString","mapError","error","Error","edmx","parseODataMetadata","dataModel","digestMetadata","version","namespace","entityTypes","size","complexTypes","enumTypes","entitySets","config","_tag","value","generate","rootCommand","withSubcommands","cli","exports","run"],"sources":["../../src/Cli.ts"],"sourcesContent":[null],"mappings":";;;;;;AAKA,IAAAA,IAAA,GAAAC,OAAA;AACA,IAAAC,UAAA,GAAAC,uBAAA,CAAAF,OAAA;AACA,IAAAG,OAAA,GAAAD,uBAAA,CAAAF,OAAA;AACA,IAAAI,MAAA,GAAAF,uBAAA,CAAAF,OAAA;AAEA,IAAAK,SAAA,GAAAL,OAAA;AACA,IAAAM,UAAA,GAAAN,OAAA;AACA,IAAAO,UAAA,GAAAP,OAAA;AAA0D,SAAAE,wBAAAM,CAAA,EAAAC,CAAA,6BAAAC,OAAA,MAAAC,CAAA,OAAAD,OAAA,IAAAE,CAAA,OAAAF,OAAA,YAAAR,uBAAA,YAAAA,CAAAM,CAAA,EAAAC,CAAA,SAAAA,CAAA,IAAAD,CAAA,IAAAA,CAAA,CAAAK,UAAA,SAAAL,CAAA,MAAAM,CAAA,EAAAC,CAAA,EAAAC,CAAA,KAAAC,SAAA,QAAAC,OAAA,EAAAV,CAAA,iBAAAA,CAAA,uBAAAA,CAAA,yBAAAA,CAAA,SAAAQ,CAAA,MAAAF,CAAA,GAAAL,CAAA,GAAAG,CAAA,GAAAD,CAAA,QAAAG,CAAA,CAAAK,GAAA,CAAAX,CAAA,UAAAM,CAAA,CAAAM,GAAA,CAAAZ,CAAA,GAAAM,CAAA,CAAAO,GAAA,CAAAb,CAAA,EAAAQ,CAAA,gBAAAP,CAAA,IAAAD,CAAA,gBAAAC,CAAA,OAAAa,cAAA,CAAAC,IAAA,CAAAf,CAAA,EAAAC,CAAA,OAAAM,CAAA,IAAAD,CAAA,GAAAU,MAAA,CAAAC,cAAA,KAAAD,MAAA,CAAAE,wBAAA,CAAAlB,CAAA,EAAAC,CAAA,OAAAM,CAAA,CAAAK,GAAA,IAAAL,CAAA,CAAAM,GAAA,IAAAP,CAAA,CAAAE,CAAA,EAAAP,CAAA,EAAAM,CAAA,IAAAC,CAAA,CAAAP,CAAA,IAAAD,CAAA,CAAAC,CAAA,WAAAO,CAAA,KAAAR,CAAA,EAAAC,CAAA;AAZ1D;;;;;;AAcA;AACA;AACA;AAEA,MAAMkB,YAAY,gBAAGC,SAAI,CAACC,IAAI,CAAC;EAAEC,IAAI,EAAE;AAAe,CAAE,CAAC,CAACC,IAAI,cAC5DH,SAAI,CAACI,eAAe,CAAC,iCAAiC,CAAC,CACxD;AAED,MAAMC,SAAS,gBAAGL,SAAI,CAACC,IAAI,CAAC;EAAEC,IAAI,EAAE;AAAY,CAAE,CAAC,CAACC,IAAI,cACtDH,SAAI,CAACI,eAAe,CAAC,0CAA0C,CAAC,CACjE;AAED,MAAME,WAAW,gBAAGC,YAAO,CAACC,IAAI,CAAC,cAAc,CAAC,CAACL,IAAI,CACnDI,YAAO,CAACE,QAAQ,eAChBF,YAAO,CAACH,eAAe,CAAC,0DAA0D,CAAC,CACpF;AAED,MAAMM,WAAW,gBAAGH,YAAO,CAACC,IAAI,CAAC,cAAc,CAAC,CAACL,IAAI,CACnDI,YAAO,CAACE,QAAQ,eAChBF,YAAO,CAACH,eAAe,CAAC,gEAAgE,CAAC,CAC1F;AAED,MAAMO,KAAK,gBAAGJ,YAAO,CAACK,OAAO,CAAC,OAAO,CAAC,CAACT,IAAI,cACzCI,YAAO,CAACM,WAAW,CAAC,KAAK,CAAC,eAC1BN,YAAO,CAACH,eAAe,CAAC,0BAA0B,CAAC,CACpD;AAED;AACA;AACA;AAEA,
|
|
1
|
+
{"version":3,"file":"Cli.js","names":["_cli","require","FileSystem","_interopRequireWildcard","Console","Effect","_Digester","_Generator","_XmlParser","e","t","WeakMap","r","n","__esModule","o","i","f","__proto__","default","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","metadataPath","Args","path","name","pipe","withDescription","outputDir","serviceName","Options","text","optional","packageName","force","boolean","withDefault","filesOnly","generateCommand","Command","make","withHandler","onlyFiles","forceOverwrite","metaPath","outDir","pkgName","svcName","gen","fs","log","metadataContent","readFileString","mapError","error","Error","edmx","parseODataMetadata","dataModel","digestMetadata","version","namespace","entityTypes","size","complexTypes","enumTypes","entitySets","config","_tag","value","generate","rootCommand","withSubcommands","cli","exports","run"],"sources":["../../src/Cli.ts"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
|
|
@@ -10,10 +10,11 @@ var Effect = _interopRequireWildcard(require("effect/Effect"));
|
|
|
10
10
|
var Schema = _interopRequireWildcard(require("effect/Schema"));
|
|
11
11
|
var _IndexGenerator = require("./IndexGenerator.js");
|
|
12
12
|
var _ModelsGenerator = require("./ModelsGenerator.js");
|
|
13
|
+
var _NavigationGenerator = require("./NavigationGenerator.js");
|
|
14
|
+
var _OperationsGenerator = require("./OperationsGenerator.js");
|
|
13
15
|
var _PackageGenerator = require("./PackageGenerator.js");
|
|
14
16
|
var _QueryModelsGenerator = require("./QueryModelsGenerator.js");
|
|
15
17
|
var _ServiceFnGenerator = require("./ServiceFnGenerator.js");
|
|
16
|
-
var _ServiceFnPromiseGenerator = require("./ServiceFnPromiseGenerator.js");
|
|
17
18
|
function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
|
|
18
19
|
/**
|
|
19
20
|
* Main generator that orchestrates all code generation.
|
|
@@ -44,39 +45,47 @@ const generate = (dataModel, config) => Effect.gen(function* () {
|
|
|
44
45
|
const outputDir = config.outputDir;
|
|
45
46
|
const serviceName = config.serviceName ?? dataModel.serviceName;
|
|
46
47
|
const packageName = config.packageName ?? `@template/${serviceName.toLowerCase()}-effect`;
|
|
48
|
+
const filesOnly = config.filesOnly ?? false;
|
|
49
|
+
// When filesOnly is true, output directly to outputDir; otherwise use outputDir/src
|
|
50
|
+
const sourceDir = filesOnly ? outputDir : path.join(outputDir, "src");
|
|
47
51
|
const packageConfig = {
|
|
48
52
|
packageName,
|
|
49
53
|
serviceName
|
|
50
54
|
};
|
|
51
55
|
// Generate tree-shakable service function files
|
|
52
56
|
const serviceResult = (0, _ServiceFnGenerator.generateServiceFns)(dataModel);
|
|
53
|
-
// Generate
|
|
54
|
-
const
|
|
55
|
-
// Generate
|
|
56
|
-
const
|
|
57
|
-
//
|
|
58
|
-
{
|
|
59
|
-
path: path.join(
|
|
57
|
+
// Generate operations file (FunctionImports, Functions, Actions)
|
|
58
|
+
const operationsResult = (0, _OperationsGenerator.generateOperations)(dataModel);
|
|
59
|
+
// Generate navigation builders
|
|
60
|
+
const navigationResult = (0, _NavigationGenerator.generateNavigations)(dataModel);
|
|
61
|
+
// Generate source files
|
|
62
|
+
const sourceFiles = [{
|
|
63
|
+
path: path.join(sourceDir, "Models.ts"),
|
|
60
64
|
content: (0, _ModelsGenerator.generateModels)(dataModel)
|
|
61
65
|
}, {
|
|
62
|
-
path: path.join(
|
|
66
|
+
path: path.join(sourceDir, "QueryModels.ts"),
|
|
63
67
|
content: (0, _QueryModelsGenerator.generateQueryModels)(dataModel)
|
|
64
68
|
},
|
|
65
|
-
//
|
|
66
|
-
|
|
67
|
-
path: path.join(
|
|
68
|
-
content:
|
|
69
|
-
}
|
|
70
|
-
//
|
|
71
|
-
...
|
|
72
|
-
path: path.join(
|
|
73
|
-
content:
|
|
69
|
+
// Services file (all entity CRUD services in one file)
|
|
70
|
+
{
|
|
71
|
+
path: path.join(sourceDir, serviceResult.servicesFile.fileName),
|
|
72
|
+
content: serviceResult.servicesFile.content
|
|
73
|
+
},
|
|
74
|
+
// Operations file (only if there are unbound operations)
|
|
75
|
+
...(operationsResult.operationsFile ? [{
|
|
76
|
+
path: path.join(sourceDir, operationsResult.operationsFile.fileName),
|
|
77
|
+
content: operationsResult.operationsFile.content
|
|
78
|
+
}] : []),
|
|
79
|
+
// Navigation builder files
|
|
80
|
+
...navigationResult.navigationFiles.map(nav => ({
|
|
81
|
+
path: path.join(sourceDir, nav.fileName),
|
|
82
|
+
content: nav.content
|
|
74
83
|
})), {
|
|
75
|
-
path: path.join(
|
|
84
|
+
path: path.join(sourceDir, "index.ts"),
|
|
76
85
|
content: (0, _IndexGenerator.generateIndex)(dataModel)
|
|
77
|
-
}
|
|
78
|
-
// Package configuration files
|
|
79
|
-
{
|
|
86
|
+
}];
|
|
87
|
+
// Package configuration files (only when not filesOnly)
|
|
88
|
+
const packageFiles = filesOnly ? [] : [{
|
|
80
89
|
path: path.join(outputDir, "package.json"),
|
|
81
90
|
content: (0, _PackageGenerator.generatePackageJson)(dataModel, packageConfig)
|
|
82
91
|
}, {
|
|
@@ -95,11 +104,12 @@ const generate = (dataModel, config) => Effect.gen(function* () {
|
|
|
95
104
|
path: path.join(outputDir, "vitest.config.ts"),
|
|
96
105
|
content: (0, _PackageGenerator.generateVitestConfig)()
|
|
97
106
|
}];
|
|
98
|
-
|
|
99
|
-
|
|
107
|
+
const files = [...sourceFiles, ...packageFiles];
|
|
108
|
+
// Create output directory
|
|
109
|
+
yield* fs.makeDirectory(sourceDir, {
|
|
100
110
|
recursive: true
|
|
101
111
|
}).pipe(Effect.mapError(error => new GeneratorError({
|
|
102
|
-
message: `Failed to create output directory: ${
|
|
112
|
+
message: `Failed to create output directory: ${sourceDir}`,
|
|
103
113
|
cause: error
|
|
104
114
|
})));
|
|
105
115
|
// Write all files
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Generator.js","names":["FileSystem","_interopRequireWildcard","require","Path","Effect","Schema","_IndexGenerator","_ModelsGenerator","_PackageGenerator","_QueryModelsGenerator","_ServiceFnGenerator","
|
|
1
|
+
{"version":3,"file":"Generator.js","names":["FileSystem","_interopRequireWildcard","require","Path","Effect","Schema","_IndexGenerator","_ModelsGenerator","_NavigationGenerator","_OperationsGenerator","_PackageGenerator","_QueryModelsGenerator","_ServiceFnGenerator","e","t","WeakMap","r","n","__esModule","o","i","f","__proto__","default","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","GeneratorError","TaggedError","message","String","cause","optional","Unknown","exports","generate","dataModel","config","gen","fs","path","outputDir","serviceName","packageName","toLowerCase","filesOnly","sourceDir","join","packageConfig","serviceResult","generateServiceFns","operationsResult","generateOperations","navigationResult","generateNavigations","sourceFiles","content","generateModels","generateQueryModels","servicesFile","fileName","operationsFile","navigationFiles","map","nav","generateIndex","packageFiles","generatePackageJson","generateTsconfig","generateTsconfigSrc","generateTsconfigTest","generateTsconfigBuild","generateVitestConfig","files","makeDirectory","recursive","pipe","mapError","error","file","force","exists","logWarning","writeFileString","logInfo"],"sources":["../../../src/generator/Generator.ts"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
|
|
@@ -5,7 +5,8 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
5
5
|
});
|
|
6
6
|
exports.generateIndex = void 0;
|
|
7
7
|
var _NamingHelper = require("./NamingHelper.js");
|
|
8
|
-
var
|
|
8
|
+
var _NavigationGenerator = require("./NavigationGenerator.js");
|
|
9
|
+
var _OperationsGenerator = require("./OperationsGenerator.js");
|
|
9
10
|
/**
|
|
10
11
|
* Generate the index.ts file content.
|
|
11
12
|
*
|
|
@@ -47,90 +48,38 @@ const generateIndex = dataModel => {
|
|
|
47
48
|
const isLast = i === modelExports.length - 1;
|
|
48
49
|
lines.push(` ${modelExports[i]}${isLast ? "" : ","}`);
|
|
49
50
|
}
|
|
50
|
-
lines.push(`} from "./Models
|
|
51
|
+
lines.push(`} from "./Models"`);
|
|
51
52
|
lines.push(``);
|
|
52
|
-
//
|
|
53
|
-
|
|
54
|
-
lines.push(`//
|
|
53
|
+
// Entity Services (all in one file using crud factory)
|
|
54
|
+
lines.push(`// Entity Services`);
|
|
55
|
+
lines.push(`// Use toPromise(runtime) from PathBuilders to convert Effect to Promise`);
|
|
55
56
|
lines.push(`export {`);
|
|
56
|
-
|
|
57
|
-
if (!isV4) {
|
|
58
|
-
lines.push(` SapErrorDetail,`);
|
|
59
|
-
lines.push(` SapErrorResolution,`);
|
|
60
|
-
lines.push(` SapApplication,`);
|
|
61
|
-
lines.push(` SapInnerError,`);
|
|
62
|
-
lines.push(` SapErrorMessage,`);
|
|
63
|
-
lines.push(` SapErrorBody,`);
|
|
64
|
-
lines.push(` SapErrorResponse,`);
|
|
65
|
-
lines.push(` SapError,`);
|
|
66
|
-
}
|
|
67
|
-
lines.push(` ODataError,`);
|
|
68
|
-
lines.push(` EntityNotFoundError,`);
|
|
69
|
-
lines.push(` ParseError,`);
|
|
70
|
-
if (isV4) {
|
|
71
|
-
// V4 exports
|
|
72
|
-
lines.push(` // OData V4`);
|
|
73
|
-
lines.push(` ODataV4,`);
|
|
74
|
-
lines.push(` ODataV4CollectionResponse,`);
|
|
75
|
-
lines.push(` ODataV4ValueResponse,`);
|
|
76
|
-
lines.push(` ODataV4Annotations,`);
|
|
77
|
-
lines.push(` ODataV4ClientConfig,`);
|
|
78
|
-
lines.push(` buildEntityPathV4,`);
|
|
79
|
-
lines.push(` type ODataV4QueryOptions,`);
|
|
80
|
-
lines.push(` type ODataV4RequestOptions,`);
|
|
81
|
-
lines.push(` type ODataV4ClientConfigService,`);
|
|
82
|
-
lines.push(` type PagedResultV4,`);
|
|
83
|
-
} else {
|
|
84
|
-
// V2 exports
|
|
85
|
-
lines.push(` // OData V2`);
|
|
86
|
-
lines.push(` OData,`);
|
|
87
|
-
lines.push(` ODataSingleResponse,`);
|
|
88
|
-
lines.push(` ODataCollectionResponse,`);
|
|
89
|
-
lines.push(` ODataCollectionResponseWithMeta,`);
|
|
90
|
-
lines.push(` ODataValueResponse,`);
|
|
91
|
-
lines.push(` EntityMetadata,`);
|
|
92
|
-
lines.push(` MediaMetadata,`);
|
|
93
|
-
lines.push(` DeferredContent,`);
|
|
94
|
-
lines.push(` ODataClientConfig,`);
|
|
95
|
-
lines.push(` buildEntityPath,`);
|
|
96
|
-
lines.push(` DEFAULT_HEADERS,`);
|
|
97
|
-
lines.push(` MERGE_HEADERS,`);
|
|
98
|
-
lines.push(` type ODataQueryOptions,`);
|
|
99
|
-
lines.push(` type ODataRequestOptions,`);
|
|
100
|
-
lines.push(` type ODataClientConfigService,`);
|
|
101
|
-
lines.push(` type PagedResult,`);
|
|
102
|
-
}
|
|
103
|
-
lines.push(` // Query Builder`);
|
|
104
|
-
lines.push(` FilterExpression,`);
|
|
105
|
-
lines.push(` StringPath,`);
|
|
106
|
-
lines.push(` NumberPath,`);
|
|
107
|
-
lines.push(` BooleanPath,`);
|
|
108
|
-
lines.push(` DateTimePath,`);
|
|
109
|
-
lines.push(` EntityPath,`);
|
|
110
|
-
lines.push(` CollectionPath,`);
|
|
111
|
-
lines.push(` QueryBuilder,`);
|
|
112
|
-
lines.push(` createQueryPaths,`);
|
|
113
|
-
lines.push(` createQueryBuilder,`);
|
|
114
|
-
lines.push(` type FieldToPath,`);
|
|
115
|
-
lines.push(` type QueryPaths,`);
|
|
116
|
-
lines.push(` type SelectableKeys,`);
|
|
117
|
-
lines.push(` type ExpandableKeys,`);
|
|
118
|
-
lines.push(` type BuiltQuery`);
|
|
119
|
-
lines.push(`} from "@odata-effect/odata-effect"`);
|
|
120
|
-
lines.push(``);
|
|
121
|
-
// Individual Entity Services (tree-shakable module namespace re-exports)
|
|
122
|
-
lines.push(`// Individual Entity Services (tree-shakable)`);
|
|
57
|
+
const serviceExports = [];
|
|
123
58
|
for (const entitySet of dataModel.entitySets.values()) {
|
|
124
|
-
|
|
125
|
-
lines.push(`export * as ${serviceClassName} from "./${serviceClassName}.js"`);
|
|
59
|
+
serviceExports.push((0, _NamingHelper.getServiceClassName)(entitySet.name));
|
|
126
60
|
}
|
|
61
|
+
// Also export types
|
|
62
|
+
serviceExports.push(`type CrudError`);
|
|
63
|
+
serviceExports.push(`type CrudContext`);
|
|
64
|
+
serviceExports.push(`type CrudService`);
|
|
65
|
+
for (let i = 0; i < serviceExports.length; i++) {
|
|
66
|
+
const isLast = i === serviceExports.length - 1;
|
|
67
|
+
lines.push(` ${serviceExports[i]}${isLast ? "" : ","}`);
|
|
68
|
+
}
|
|
69
|
+
lines.push(`} from "./Services"`);
|
|
127
70
|
lines.push(``);
|
|
128
|
-
//
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
71
|
+
// Operations (FunctionImports, Functions, Actions) - only if there are unbound operations
|
|
72
|
+
const hasUnboundOperations = Array.from(dataModel.operations.values()).some(op => !op.isBound);
|
|
73
|
+
if (hasUnboundOperations) {
|
|
74
|
+
lines.push(`// Operations (FunctionImports, Functions, Actions)`);
|
|
75
|
+
const operationsModuleName = (0, _OperationsGenerator.getOperationsModuleName)();
|
|
76
|
+
lines.push(`export * as ${operationsModuleName} from "./${operationsModuleName}"`);
|
|
77
|
+
lines.push(``);
|
|
133
78
|
}
|
|
79
|
+
// Path Builders (tree-shakable navigation)
|
|
80
|
+
lines.push(`// Path Builders (tree-shakable navigation)`);
|
|
81
|
+
const pathBuildersModuleName = (0, _NavigationGenerator.getPathBuildersModuleName)();
|
|
82
|
+
lines.push(`export * from "./${pathBuildersModuleName}"`);
|
|
134
83
|
lines.push(``);
|
|
135
84
|
// Query Models
|
|
136
85
|
lines.push(`// Query Models`);
|
|
@@ -157,7 +106,7 @@ const generateIndex = dataModel => {
|
|
|
157
106
|
const isLast = i === queryExports.length - 1;
|
|
158
107
|
lines.push(` ${queryExports[i]}${isLast ? "" : ","}`);
|
|
159
108
|
}
|
|
160
|
-
lines.push(`} from "./QueryModels
|
|
109
|
+
lines.push(`} from "./QueryModels"`);
|
|
161
110
|
return lines.join("\n");
|
|
162
111
|
};
|
|
163
112
|
exports.generateIndex = generateIndex;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"IndexGenerator.js","names":["_NamingHelper","require","
|
|
1
|
+
{"version":3,"file":"IndexGenerator.js","names":["_NamingHelper","require","_NavigationGenerator","_OperationsGenerator","generateIndex","dataModel","lines","push","serviceName","modelExports","enumType","enumTypes","values","name","complexType","complexTypes","getEditableTypeName","entityType","entityTypes","keys","length","getIdTypeName","i","isLast","serviceExports","entitySet","entitySets","getServiceClassName","hasUnboundOperations","Array","from","operations","some","op","isBound","operationsModuleName","getOperationsModuleName","pathBuildersModuleName","getPathBuildersModuleName","queryExports","getQueryInstanceName","getQueryInterfaceName","get","entityTypeFqName","getQueryFactoryName","join","exports"],"sources":["../../../src/generator/IndexGenerator.ts"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
|
|
@@ -179,15 +179,12 @@ const generateEntityType = (entityType, dataModel) => {
|
|
|
179
179
|
lines.push(` Schema.Struct({ ${key.name}: ${keySchema} })`);
|
|
180
180
|
lines.push(`)`);
|
|
181
181
|
} else {
|
|
182
|
-
// Composite key
|
|
182
|
+
// Composite key - only struct form makes sense
|
|
183
183
|
const keyFields = entityType.keys.map(k => {
|
|
184
184
|
const schema = getPropertySchemaType(k, false);
|
|
185
185
|
return `${k.name}: ${schema}`;
|
|
186
186
|
});
|
|
187
|
-
lines.push(`export const ${idTypeName} = Schema.
|
|
188
|
-
lines.push(` Schema.String,`);
|
|
189
|
-
lines.push(` Schema.Struct({ ${keyFields.join(", ")} })`);
|
|
190
|
-
lines.push(`)`);
|
|
187
|
+
lines.push(`export const ${idTypeName} = Schema.Struct({ ${keyFields.join(", ")} })`);
|
|
191
188
|
}
|
|
192
189
|
lines.push(`export type ${idTypeName} = Schema.Schema.Type<typeof ${idTypeName}>`);
|
|
193
190
|
}
|