@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.
- package/Cli/package.json +6 -0
- package/LICENSE +21 -0
- package/README.md +37 -0
- package/bin/package.json +6 -0
- package/digester/Digester/package.json +6 -0
- package/digester/TypeMapper/package.json +6 -0
- package/dist/cjs/Cli.js +95 -0
- package/dist/cjs/Cli.js.map +1 -0
- package/dist/cjs/bin.js +14 -0
- package/dist/cjs/bin.js.map +1 -0
- package/dist/cjs/digester/Digester.js +488 -0
- package/dist/cjs/digester/Digester.js.map +1 -0
- package/dist/cjs/digester/TypeMapper.js +262 -0
- package/dist/cjs/digester/TypeMapper.js.map +1 -0
- package/dist/cjs/generator/Generator.js +126 -0
- package/dist/cjs/generator/Generator.js.map +1 -0
- package/dist/cjs/generator/IndexGenerator.js +164 -0
- package/dist/cjs/generator/IndexGenerator.js.map +1 -0
- package/dist/cjs/generator/ModelsGenerator.js +255 -0
- package/dist/cjs/generator/ModelsGenerator.js.map +1 -0
- package/dist/cjs/generator/NamingHelper.js +164 -0
- package/dist/cjs/generator/NamingHelper.js.map +1 -0
- package/dist/cjs/generator/PackageGenerator.js +168 -0
- package/dist/cjs/generator/PackageGenerator.js.map +1 -0
- package/dist/cjs/generator/QueryModelsGenerator.js +182 -0
- package/dist/cjs/generator/QueryModelsGenerator.js.map +1 -0
- package/dist/cjs/generator/ServiceFnGenerator.js +258 -0
- package/dist/cjs/generator/ServiceFnGenerator.js.map +1 -0
- package/dist/cjs/generator/ServiceFnPromiseGenerator.js +182 -0
- package/dist/cjs/generator/ServiceFnPromiseGenerator.js.map +1 -0
- package/dist/cjs/index.js +38 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/model/DataModel.js +28 -0
- package/dist/cjs/model/DataModel.js.map +1 -0
- package/dist/cjs/parser/EdmxSchema.js +20 -0
- package/dist/cjs/parser/EdmxSchema.js.map +1 -0
- package/dist/cjs/parser/XmlParser.js +47 -0
- package/dist/cjs/parser/XmlParser.js.map +1 -0
- package/dist/dts/Cli.d.ts +9 -0
- package/dist/dts/Cli.d.ts.map +1 -0
- package/dist/dts/bin.d.ts +3 -0
- package/dist/dts/bin.d.ts.map +1 -0
- package/dist/dts/digester/Digester.d.ts +33 -0
- package/dist/dts/digester/Digester.d.ts.map +1 -0
- package/dist/dts/digester/TypeMapper.d.ts +79 -0
- package/dist/dts/digester/TypeMapper.d.ts.map +1 -0
- package/dist/dts/generator/Generator.d.ts +45 -0
- package/dist/dts/generator/Generator.d.ts.map +1 -0
- package/dist/dts/generator/IndexGenerator.d.ts +14 -0
- package/dist/dts/generator/IndexGenerator.d.ts.map +1 -0
- package/dist/dts/generator/ModelsGenerator.d.ts +14 -0
- package/dist/dts/generator/ModelsGenerator.d.ts.map +1 -0
- package/dist/dts/generator/NamingHelper.d.ts +110 -0
- package/dist/dts/generator/NamingHelper.d.ts.map +1 -0
- package/dist/dts/generator/PackageGenerator.d.ts +53 -0
- package/dist/dts/generator/PackageGenerator.d.ts.map +1 -0
- package/dist/dts/generator/QueryModelsGenerator.d.ts +14 -0
- package/dist/dts/generator/QueryModelsGenerator.d.ts.map +1 -0
- package/dist/dts/generator/ServiceFnGenerator.d.ts +37 -0
- package/dist/dts/generator/ServiceFnGenerator.d.ts.map +1 -0
- package/dist/dts/generator/ServiceFnPromiseGenerator.d.ts +40 -0
- package/dist/dts/generator/ServiceFnPromiseGenerator.d.ts.map +1 -0
- package/dist/dts/index.d.ts +101 -0
- package/dist/dts/index.d.ts.map +1 -0
- package/dist/dts/model/DataModel.d.ts +188 -0
- package/dist/dts/model/DataModel.d.ts.map +1 -0
- package/dist/dts/parser/EdmxSchema.d.ts +228 -0
- package/dist/dts/parser/EdmxSchema.d.ts.map +1 -0
- package/dist/dts/parser/XmlParser.d.ts +31 -0
- package/dist/dts/parser/XmlParser.d.ts.map +1 -0
- package/dist/esm/Cli.js +87 -0
- package/dist/esm/Cli.js.map +1 -0
- package/dist/esm/bin.js +12 -0
- package/dist/esm/bin.js.map +1 -0
- package/dist/esm/digester/Digester.js +478 -0
- package/dist/esm/digester/Digester.js.map +1 -0
- package/dist/esm/digester/TypeMapper.js +248 -0
- package/dist/esm/digester/TypeMapper.js.map +1 -0
- package/dist/esm/generator/Generator.js +116 -0
- package/dist/esm/generator/Generator.js.map +1 -0
- package/dist/esm/generator/IndexGenerator.js +157 -0
- package/dist/esm/generator/IndexGenerator.js.map +1 -0
- package/dist/esm/generator/ModelsGenerator.js +248 -0
- package/dist/esm/generator/ModelsGenerator.js.map +1 -0
- package/dist/esm/generator/NamingHelper.js +147 -0
- package/dist/esm/generator/NamingHelper.js.map +1 -0
- package/dist/esm/generator/PackageGenerator.js +156 -0
- package/dist/esm/generator/PackageGenerator.js.map +1 -0
- package/dist/esm/generator/QueryModelsGenerator.js +175 -0
- package/dist/esm/generator/QueryModelsGenerator.js.map +1 -0
- package/dist/esm/generator/ServiceFnGenerator.js +251 -0
- package/dist/esm/generator/ServiceFnGenerator.js.map +1 -0
- package/dist/esm/generator/ServiceFnPromiseGenerator.js +174 -0
- package/dist/esm/generator/ServiceFnPromiseGenerator.js.map +1 -0
- package/dist/esm/index.js +101 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/model/DataModel.js +21 -0
- package/dist/esm/model/DataModel.js.map +1 -0
- package/dist/esm/package.json +4 -0
- package/dist/esm/parser/EdmxSchema.js +13 -0
- package/dist/esm/parser/EdmxSchema.js.map +1 -0
- package/dist/esm/parser/XmlParser.js +37 -0
- package/dist/esm/parser/XmlParser.js.map +1 -0
- package/generator/Generator/package.json +6 -0
- package/generator/IndexGenerator/package.json +6 -0
- package/generator/ModelsGenerator/package.json +6 -0
- package/generator/NamingHelper/package.json +6 -0
- package/generator/PackageGenerator/package.json +6 -0
- package/generator/QueryModelsGenerator/package.json +6 -0
- package/generator/ServiceFnGenerator/package.json +6 -0
- package/generator/ServiceFnPromiseGenerator/package.json +6 -0
- package/model/DataModel/package.json +6 -0
- package/package.json +157 -0
- package/parser/EdmxSchema/package.json +6 -0
- package/parser/XmlParser/package.json +6 -0
- package/src/Cli.ts +115 -0
- package/src/bin.ts +17 -0
- package/src/digester/Digester.ts +600 -0
- package/src/digester/TypeMapper.ts +181 -0
- package/src/generator/Generator.ts +183 -0
- package/src/generator/IndexGenerator.ts +189 -0
- package/src/generator/ModelsGenerator.ts +344 -0
- package/src/generator/NamingHelper.ts +159 -0
- package/src/generator/PackageGenerator.ts +176 -0
- package/src/generator/QueryModelsGenerator.ts +228 -0
- package/src/generator/ServiceFnGenerator.ts +324 -0
- package/src/generator/ServiceFnPromiseGenerator.ts +242 -0
- package/src/index.ts +114 -0
- package/src/model/DataModel.ts +254 -0
- package/src/parser/EdmxSchema.ts +308 -0
- package/src/parser/XmlParser.ts +47 -0
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI for OData Effect Generator.
|
|
3
|
+
*
|
|
4
|
+
* @since 1.0.0
|
|
5
|
+
*/
|
|
6
|
+
export * as Cli from "./Cli.js";
|
|
7
|
+
/**
|
|
8
|
+
* CLI entry point for OData Effect Generator.
|
|
9
|
+
*
|
|
10
|
+
* @since 1.0.0
|
|
11
|
+
*/
|
|
12
|
+
export * as bin from "./bin.js";
|
|
13
|
+
/**
|
|
14
|
+
* Digester for converting parsed EDMX into a DataModel.
|
|
15
|
+
* Supports both OData V2 and V4.
|
|
16
|
+
*
|
|
17
|
+
* @since 1.0.0
|
|
18
|
+
*/
|
|
19
|
+
export * as Digester from "./digester/Digester.js";
|
|
20
|
+
/**
|
|
21
|
+
* Type mapper for converting OData types to Effect Schema types and query paths.
|
|
22
|
+
*
|
|
23
|
+
* @since 1.0.0
|
|
24
|
+
*/
|
|
25
|
+
export * as TypeMapper from "./digester/TypeMapper.js";
|
|
26
|
+
/**
|
|
27
|
+
* Main generator that orchestrates all code generation.
|
|
28
|
+
*
|
|
29
|
+
* @since 1.0.0
|
|
30
|
+
*/
|
|
31
|
+
export * as Generator from "./generator/Generator.js";
|
|
32
|
+
/**
|
|
33
|
+
* Generator for index.ts - Public API exports.
|
|
34
|
+
*
|
|
35
|
+
* @since 1.0.0
|
|
36
|
+
*/
|
|
37
|
+
export * as IndexGenerator from "./generator/IndexGenerator.js";
|
|
38
|
+
/**
|
|
39
|
+
* Generator for Models.ts - Effect Schema definitions.
|
|
40
|
+
*
|
|
41
|
+
* @since 1.0.0
|
|
42
|
+
*/
|
|
43
|
+
export * as ModelsGenerator from "./generator/ModelsGenerator.js";
|
|
44
|
+
/**
|
|
45
|
+
* Naming utilities for code generation.
|
|
46
|
+
*
|
|
47
|
+
* @since 1.0.0
|
|
48
|
+
*/
|
|
49
|
+
export * as NamingHelper from "./generator/NamingHelper.js";
|
|
50
|
+
/**
|
|
51
|
+
* Generator for package configuration files.
|
|
52
|
+
*
|
|
53
|
+
* @since 1.0.0
|
|
54
|
+
*/
|
|
55
|
+
export * as PackageGenerator from "./generator/PackageGenerator.js";
|
|
56
|
+
/**
|
|
57
|
+
* Generator for QueryModels.ts - Type-safe query paths.
|
|
58
|
+
*
|
|
59
|
+
* @since 1.0.0
|
|
60
|
+
*/
|
|
61
|
+
export * as QueryModelsGenerator from "./generator/QueryModelsGenerator.js";
|
|
62
|
+
/**
|
|
63
|
+
* Generator for tree-shakable service functions.
|
|
64
|
+
*
|
|
65
|
+
* This module generates standalone functions that can be tree-shaken.
|
|
66
|
+
* Each entity service is a module of standalone functions that use
|
|
67
|
+
* the tree-shakable OData functions directly.
|
|
68
|
+
*
|
|
69
|
+
* @since 1.0.0
|
|
70
|
+
*/
|
|
71
|
+
export * as ServiceFnGenerator from "./generator/ServiceFnGenerator.js";
|
|
72
|
+
/**
|
|
73
|
+
* Generator for Promise-based service functions.
|
|
74
|
+
*
|
|
75
|
+
* This module generates Promise-based wrappers around the Effect-based
|
|
76
|
+
* service functions, allowing usage in non-Effect environments.
|
|
77
|
+
*
|
|
78
|
+
* @since 1.0.0
|
|
79
|
+
*/
|
|
80
|
+
export * as ServiceFnPromiseGenerator from "./generator/ServiceFnPromiseGenerator.js";
|
|
81
|
+
/**
|
|
82
|
+
* Intermediate representation for OData metadata.
|
|
83
|
+
* This is the central data model that digesters create and generators consume.
|
|
84
|
+
*
|
|
85
|
+
* @since 1.0.0
|
|
86
|
+
*/
|
|
87
|
+
export * as DataModel from "./model/DataModel.js";
|
|
88
|
+
/**
|
|
89
|
+
* Common EDMX schema interfaces for OData metadata parsing.
|
|
90
|
+
* These interfaces represent the parsed XML structure from xml2js.
|
|
91
|
+
*
|
|
92
|
+
* @since 1.0.0
|
|
93
|
+
*/
|
|
94
|
+
export * as EdmxSchema from "./parser/EdmxSchema.js";
|
|
95
|
+
/**
|
|
96
|
+
* Effect-wrapped XML parser for OData metadata.
|
|
97
|
+
*
|
|
98
|
+
* @since 1.0.0
|
|
99
|
+
*/
|
|
100
|
+
export * as XmlParser from "./parser/XmlParser.js";
|
|
101
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +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":[]}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
// ============================================================================
|
|
2
|
+
// Factory Functions
|
|
3
|
+
// ============================================================================
|
|
4
|
+
/**
|
|
5
|
+
* Creates an empty data model.
|
|
6
|
+
*
|
|
7
|
+
* @since 1.0.0
|
|
8
|
+
* @category constructors
|
|
9
|
+
*/
|
|
10
|
+
export const createDataModel = (version, namespace, serviceName) => ({
|
|
11
|
+
version,
|
|
12
|
+
namespace,
|
|
13
|
+
serviceName,
|
|
14
|
+
entityTypes: new Map(),
|
|
15
|
+
complexTypes: new Map(),
|
|
16
|
+
enumTypes: new Map(),
|
|
17
|
+
entitySets: new Map(),
|
|
18
|
+
singletons: new Map(),
|
|
19
|
+
operations: new Map()
|
|
20
|
+
});
|
|
21
|
+
//# sourceMappingURL=DataModel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DataModel.js","names":["createDataModel","version","namespace","serviceName","entityTypes","Map","complexTypes","enumTypes","entitySets","singletons","operations"],"sources":["../../../src/model/DataModel.ts"],"sourcesContent":[null],"mappings":"AAqOA;AACA;AACA;AAEA;;;;;;AAMA,OAAO,MAAMA,eAAe,GAAGA,CAC7BC,OAAqB,EACrBC,SAAiB,EACjBC,WAAmB,MACJ;EACfF,OAAO;EACPC,SAAS;EACTC,WAAW;EACXC,WAAW,EAAE,IAAIC,GAAG,EAAE;EACtBC,YAAY,EAAE,IAAID,GAAG,EAAE;EACvBE,SAAS,EAAE,IAAIF,GAAG,EAAE;EACpBG,UAAU,EAAE,IAAIH,GAAG,EAAE;EACrBI,UAAU,EAAE,IAAIJ,GAAG,EAAE;EACrBK,UAAU,EAAE,IAAIL,GAAG;CACpB,CAAC","ignoreList":[]}
|
|
@@ -0,0 +1,13 @@
|
|
|
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
|
+
export const detectODataVersion = edmx => {
|
|
8
|
+
const version = edmx["edmx:Edmx"].$.Version;
|
|
9
|
+
if (version === "1.0") return "V2";
|
|
10
|
+
if (version === "4.0") return "V4";
|
|
11
|
+
throw new Error(`Unsupported EDMX version: ${version}`);
|
|
12
|
+
};
|
|
13
|
+
//# sourceMappingURL=EdmxSchema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EdmxSchema.js","names":["detectODataVersion","edmx","version","$","Version","Error"],"sources":["../../../src/parser/EdmxSchema.ts"],"sourcesContent":[null],"mappings":"AAAA;;;;;;AA8SA,OAAO,MAAMA,kBAAkB,GAAIC,IAAoB,IAAkB;EACvE,MAAMC,OAAO,GAAGD,IAAI,CAAC,WAAW,CAAC,CAACE,CAAC,CAACC,OAAO;EAC3C,IAAIF,OAAO,KAAK,KAAK,EAAE,OAAO,IAAI;EAClC,IAAIA,OAAO,KAAK,KAAK,EAAE,OAAO,IAAI;EAClC,MAAM,IAAIG,KAAK,CAAC,6BAA6BH,OAAO,EAAE,CAAC;AACzD,CAAC","ignoreList":[]}
|
|
@@ -0,0 +1,37 @@
|
|
|
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
|
+
/**
|
|
10
|
+
* Error thrown when XML parsing fails.
|
|
11
|
+
*
|
|
12
|
+
* @since 1.0.0
|
|
13
|
+
* @category errors
|
|
14
|
+
*/
|
|
15
|
+
export class XmlParseError extends /*#__PURE__*/Schema.TaggedError()("XmlParseError", {
|
|
16
|
+
message: Schema.String,
|
|
17
|
+
cause: Schema.Unknown
|
|
18
|
+
}) {}
|
|
19
|
+
/**
|
|
20
|
+
* Parse OData metadata XML content into a structured object.
|
|
21
|
+
*
|
|
22
|
+
* @since 1.0.0
|
|
23
|
+
* @category parsing
|
|
24
|
+
*/
|
|
25
|
+
export const parseODataMetadata = xmlContent => Effect.tryPromise({
|
|
26
|
+
try: () => parseStringPromise(xmlContent, {
|
|
27
|
+
explicitArray: true,
|
|
28
|
+
preserveChildrenOrder: true,
|
|
29
|
+
attrkey: "$",
|
|
30
|
+
charkey: "_"
|
|
31
|
+
}),
|
|
32
|
+
catch: error => new XmlParseError({
|
|
33
|
+
message: "Failed to parse OData metadata XML",
|
|
34
|
+
cause: error
|
|
35
|
+
})
|
|
36
|
+
});
|
|
37
|
+
//# sourceMappingURL=XmlParser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"XmlParser.js","names":["Effect","Schema","parseStringPromise","XmlParseError","TaggedError","message","String","cause","Unknown","parseODataMetadata","xmlContent","tryPromise","try","explicitArray","preserveChildrenOrder","attrkey","charkey","catch","error"],"sources":["../../../src/parser/XmlParser.ts"],"sourcesContent":[null],"mappings":"AAAA;;;;;AAKA,OAAO,KAAKA,MAAM,MAAM,eAAe;AACvC,OAAO,KAAKC,MAAM,MAAM,eAAe;AACvC,SAASC,kBAAkB,QAAQ,QAAQ;AAG3C;;;;;;AAMA,OAAM,MAAOC,aAAc,sBAAQF,MAAM,CAACG,WAAW,EAAiB,CACpE,eAAe,EACf;EACEC,OAAO,EAAEJ,MAAM,CAACK,MAAM;EACtBC,KAAK,EAAEN,MAAM,CAACO;CACf,CACF;AAED;;;;;;AAMA,OAAO,MAAMC,kBAAkB,GAC7BC,UAAkB,IAElBV,MAAM,CAACW,UAAU,CAAC;EAChBC,GAAG,EAAEA,CAAA,KACHV,kBAAkB,CAACQ,UAAU,EAAE;IAC7BG,aAAa,EAAE,IAAI;IACnBC,qBAAqB,EAAE,IAAI;IAC3BC,OAAO,EAAE,GAAG;IACZC,OAAO,EAAE;GACV,CAA4B;EAC/BC,KAAK,EAAGC,KAAK,IACX,IAAIf,aAAa,CAAC;IAChBE,OAAO,EAAE,oCAAoC;IAC7CE,KAAK,EAAEW;GACR;CACJ,CAAC","ignoreList":[]}
|
package/package.json
ADDED
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@odata-effect/odata-effect-generator",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Effect-based OData service code generator",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"repository": {
|
|
7
|
+
"type": "git",
|
|
8
|
+
"url": "https://github.com/joepjoosten/odata-effect.git",
|
|
9
|
+
"directory": "packages/odata-effect-generator"
|
|
10
|
+
},
|
|
11
|
+
"sideEffects": [],
|
|
12
|
+
"dependencies": {
|
|
13
|
+
"@effect/cli": "^0.73.0",
|
|
14
|
+
"@effect/platform": "^0.94.1",
|
|
15
|
+
"@effect/platform-node": "^0.104.0",
|
|
16
|
+
"effect": "^3.19.14",
|
|
17
|
+
"xml2js": "^0.6.2"
|
|
18
|
+
},
|
|
19
|
+
"bin": {
|
|
20
|
+
"odata-effect-gen": "./build/esm/bin.js"
|
|
21
|
+
},
|
|
22
|
+
"main": "./dist/cjs/index.js",
|
|
23
|
+
"module": "./dist/esm/index.js",
|
|
24
|
+
"types": "./dist/dts/index.d.ts",
|
|
25
|
+
"exports": {
|
|
26
|
+
"./package.json": "./package.json",
|
|
27
|
+
".": {
|
|
28
|
+
"types": "./dist/dts/index.d.ts",
|
|
29
|
+
"import": "./dist/esm/index.js",
|
|
30
|
+
"default": "./dist/cjs/index.js"
|
|
31
|
+
},
|
|
32
|
+
"./Cli": {
|
|
33
|
+
"types": "./dist/dts/Cli.d.ts",
|
|
34
|
+
"import": "./dist/esm/Cli.js",
|
|
35
|
+
"default": "./dist/cjs/Cli.js"
|
|
36
|
+
},
|
|
37
|
+
"./bin": {
|
|
38
|
+
"types": "./dist/dts/bin.d.ts",
|
|
39
|
+
"import": "./dist/esm/bin.js",
|
|
40
|
+
"default": "./dist/cjs/bin.js"
|
|
41
|
+
},
|
|
42
|
+
"./digester/Digester": {
|
|
43
|
+
"types": "./dist/dts/digester/Digester.d.ts",
|
|
44
|
+
"import": "./dist/esm/digester/Digester.js",
|
|
45
|
+
"default": "./dist/cjs/digester/Digester.js"
|
|
46
|
+
},
|
|
47
|
+
"./digester/TypeMapper": {
|
|
48
|
+
"types": "./dist/dts/digester/TypeMapper.d.ts",
|
|
49
|
+
"import": "./dist/esm/digester/TypeMapper.js",
|
|
50
|
+
"default": "./dist/cjs/digester/TypeMapper.js"
|
|
51
|
+
},
|
|
52
|
+
"./generator/Generator": {
|
|
53
|
+
"types": "./dist/dts/generator/Generator.d.ts",
|
|
54
|
+
"import": "./dist/esm/generator/Generator.js",
|
|
55
|
+
"default": "./dist/cjs/generator/Generator.js"
|
|
56
|
+
},
|
|
57
|
+
"./generator/IndexGenerator": {
|
|
58
|
+
"types": "./dist/dts/generator/IndexGenerator.d.ts",
|
|
59
|
+
"import": "./dist/esm/generator/IndexGenerator.js",
|
|
60
|
+
"default": "./dist/cjs/generator/IndexGenerator.js"
|
|
61
|
+
},
|
|
62
|
+
"./generator/ModelsGenerator": {
|
|
63
|
+
"types": "./dist/dts/generator/ModelsGenerator.d.ts",
|
|
64
|
+
"import": "./dist/esm/generator/ModelsGenerator.js",
|
|
65
|
+
"default": "./dist/cjs/generator/ModelsGenerator.js"
|
|
66
|
+
},
|
|
67
|
+
"./generator/NamingHelper": {
|
|
68
|
+
"types": "./dist/dts/generator/NamingHelper.d.ts",
|
|
69
|
+
"import": "./dist/esm/generator/NamingHelper.js",
|
|
70
|
+
"default": "./dist/cjs/generator/NamingHelper.js"
|
|
71
|
+
},
|
|
72
|
+
"./generator/PackageGenerator": {
|
|
73
|
+
"types": "./dist/dts/generator/PackageGenerator.d.ts",
|
|
74
|
+
"import": "./dist/esm/generator/PackageGenerator.js",
|
|
75
|
+
"default": "./dist/cjs/generator/PackageGenerator.js"
|
|
76
|
+
},
|
|
77
|
+
"./generator/QueryModelsGenerator": {
|
|
78
|
+
"types": "./dist/dts/generator/QueryModelsGenerator.d.ts",
|
|
79
|
+
"import": "./dist/esm/generator/QueryModelsGenerator.js",
|
|
80
|
+
"default": "./dist/cjs/generator/QueryModelsGenerator.js"
|
|
81
|
+
},
|
|
82
|
+
"./generator/ServiceFnGenerator": {
|
|
83
|
+
"types": "./dist/dts/generator/ServiceFnGenerator.d.ts",
|
|
84
|
+
"import": "./dist/esm/generator/ServiceFnGenerator.js",
|
|
85
|
+
"default": "./dist/cjs/generator/ServiceFnGenerator.js"
|
|
86
|
+
},
|
|
87
|
+
"./generator/ServiceFnPromiseGenerator": {
|
|
88
|
+
"types": "./dist/dts/generator/ServiceFnPromiseGenerator.d.ts",
|
|
89
|
+
"import": "./dist/esm/generator/ServiceFnPromiseGenerator.js",
|
|
90
|
+
"default": "./dist/cjs/generator/ServiceFnPromiseGenerator.js"
|
|
91
|
+
},
|
|
92
|
+
"./model/DataModel": {
|
|
93
|
+
"types": "./dist/dts/model/DataModel.d.ts",
|
|
94
|
+
"import": "./dist/esm/model/DataModel.js",
|
|
95
|
+
"default": "./dist/cjs/model/DataModel.js"
|
|
96
|
+
},
|
|
97
|
+
"./parser/EdmxSchema": {
|
|
98
|
+
"types": "./dist/dts/parser/EdmxSchema.d.ts",
|
|
99
|
+
"import": "./dist/esm/parser/EdmxSchema.js",
|
|
100
|
+
"default": "./dist/cjs/parser/EdmxSchema.js"
|
|
101
|
+
},
|
|
102
|
+
"./parser/XmlParser": {
|
|
103
|
+
"types": "./dist/dts/parser/XmlParser.d.ts",
|
|
104
|
+
"import": "./dist/esm/parser/XmlParser.js",
|
|
105
|
+
"default": "./dist/cjs/parser/XmlParser.js"
|
|
106
|
+
}
|
|
107
|
+
},
|
|
108
|
+
"typesVersions": {
|
|
109
|
+
"*": {
|
|
110
|
+
"Cli": [
|
|
111
|
+
"./dist/dts/Cli.d.ts"
|
|
112
|
+
],
|
|
113
|
+
"bin": [
|
|
114
|
+
"./dist/dts/bin.d.ts"
|
|
115
|
+
],
|
|
116
|
+
"digester/Digester": [
|
|
117
|
+
"./dist/dts/digester/Digester.d.ts"
|
|
118
|
+
],
|
|
119
|
+
"digester/TypeMapper": [
|
|
120
|
+
"./dist/dts/digester/TypeMapper.d.ts"
|
|
121
|
+
],
|
|
122
|
+
"generator/Generator": [
|
|
123
|
+
"./dist/dts/generator/Generator.d.ts"
|
|
124
|
+
],
|
|
125
|
+
"generator/IndexGenerator": [
|
|
126
|
+
"./dist/dts/generator/IndexGenerator.d.ts"
|
|
127
|
+
],
|
|
128
|
+
"generator/ModelsGenerator": [
|
|
129
|
+
"./dist/dts/generator/ModelsGenerator.d.ts"
|
|
130
|
+
],
|
|
131
|
+
"generator/NamingHelper": [
|
|
132
|
+
"./dist/dts/generator/NamingHelper.d.ts"
|
|
133
|
+
],
|
|
134
|
+
"generator/PackageGenerator": [
|
|
135
|
+
"./dist/dts/generator/PackageGenerator.d.ts"
|
|
136
|
+
],
|
|
137
|
+
"generator/QueryModelsGenerator": [
|
|
138
|
+
"./dist/dts/generator/QueryModelsGenerator.d.ts"
|
|
139
|
+
],
|
|
140
|
+
"generator/ServiceFnGenerator": [
|
|
141
|
+
"./dist/dts/generator/ServiceFnGenerator.d.ts"
|
|
142
|
+
],
|
|
143
|
+
"generator/ServiceFnPromiseGenerator": [
|
|
144
|
+
"./dist/dts/generator/ServiceFnPromiseGenerator.d.ts"
|
|
145
|
+
],
|
|
146
|
+
"model/DataModel": [
|
|
147
|
+
"./dist/dts/model/DataModel.d.ts"
|
|
148
|
+
],
|
|
149
|
+
"parser/EdmxSchema": [
|
|
150
|
+
"./dist/dts/parser/EdmxSchema.d.ts"
|
|
151
|
+
],
|
|
152
|
+
"parser/XmlParser": [
|
|
153
|
+
"./dist/dts/parser/XmlParser.d.ts"
|
|
154
|
+
]
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
}
|
package/src/Cli.ts
ADDED
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI for OData Effect Generator.
|
|
3
|
+
*
|
|
4
|
+
* @since 1.0.0
|
|
5
|
+
*/
|
|
6
|
+
import { Args, Command, Options } from "@effect/cli"
|
|
7
|
+
import * as FileSystem from "@effect/platform/FileSystem"
|
|
8
|
+
import * as Console from "effect/Console"
|
|
9
|
+
import * as Effect from "effect/Effect"
|
|
10
|
+
|
|
11
|
+
import { digestMetadata } from "./digester/Digester.js"
|
|
12
|
+
import { generate } from "./generator/Generator.js"
|
|
13
|
+
import { parseODataMetadata } from "./parser/XmlParser.js"
|
|
14
|
+
|
|
15
|
+
// ============================================================================
|
|
16
|
+
// Arguments and Options
|
|
17
|
+
// ============================================================================
|
|
18
|
+
|
|
19
|
+
const metadataPath = Args.path({ name: "metadata-path" }).pipe(
|
|
20
|
+
Args.withDescription("Path to OData metadata XML file")
|
|
21
|
+
)
|
|
22
|
+
|
|
23
|
+
const outputDir = Args.path({ name: "output-dir" }).pipe(
|
|
24
|
+
Args.withDescription("Directory for generated TypeScript files")
|
|
25
|
+
)
|
|
26
|
+
|
|
27
|
+
const serviceName = Options.text("service-name").pipe(
|
|
28
|
+
Options.optional,
|
|
29
|
+
Options.withDescription("Override service name (defaults to EntityContainer name)")
|
|
30
|
+
)
|
|
31
|
+
|
|
32
|
+
const packageName = Options.text("package-name").pipe(
|
|
33
|
+
Options.optional,
|
|
34
|
+
Options.withDescription("NPM package name (defaults to @template/<service-name>-effect)")
|
|
35
|
+
)
|
|
36
|
+
|
|
37
|
+
const force = Options.boolean("force").pipe(
|
|
38
|
+
Options.withDefault(false),
|
|
39
|
+
Options.withDescription("Overwrite existing files")
|
|
40
|
+
)
|
|
41
|
+
|
|
42
|
+
// ============================================================================
|
|
43
|
+
// Generate Command
|
|
44
|
+
// ============================================================================
|
|
45
|
+
|
|
46
|
+
const generateCommand = Command.make(
|
|
47
|
+
"generate",
|
|
48
|
+
{ metadataPath, outputDir, serviceName, packageName, force }
|
|
49
|
+
).pipe(
|
|
50
|
+
Command.withDescription("Generate Effect OData client from metadata"),
|
|
51
|
+
Command.withHandler((
|
|
52
|
+
{ force: forceOverwrite, metadataPath: metaPath, outputDir: outDir, packageName: pkgName, serviceName: svcName }
|
|
53
|
+
) =>
|
|
54
|
+
Effect.gen(function*() {
|
|
55
|
+
const fs = yield* FileSystem.FileSystem
|
|
56
|
+
|
|
57
|
+
yield* Console.log(`Reading metadata from: ${metaPath}`)
|
|
58
|
+
|
|
59
|
+
// Read metadata file
|
|
60
|
+
const metadataContent = yield* fs.readFileString(metaPath).pipe(
|
|
61
|
+
Effect.mapError((error) => new Error(`Failed to read metadata file: ${metaPath}. ${error}`))
|
|
62
|
+
)
|
|
63
|
+
|
|
64
|
+
yield* Console.log("Parsing metadata...")
|
|
65
|
+
|
|
66
|
+
// Parse XML
|
|
67
|
+
const edmx = yield* parseODataMetadata(metadataContent)
|
|
68
|
+
|
|
69
|
+
yield* Console.log("Digesting metadata...")
|
|
70
|
+
|
|
71
|
+
// Digest metadata
|
|
72
|
+
const dataModel = yield* digestMetadata(edmx)
|
|
73
|
+
|
|
74
|
+
yield* Console.log(`Detected OData ${dataModel.version}`)
|
|
75
|
+
yield* Console.log(`Namespace: ${dataModel.namespace}`)
|
|
76
|
+
yield* Console.log(`Service: ${dataModel.serviceName}`)
|
|
77
|
+
yield* Console.log(`Entity Types: ${dataModel.entityTypes.size}`)
|
|
78
|
+
yield* Console.log(`Complex Types: ${dataModel.complexTypes.size}`)
|
|
79
|
+
yield* Console.log(`Enum Types: ${dataModel.enumTypes.size}`)
|
|
80
|
+
yield* Console.log(`Entity Sets: ${dataModel.entitySets.size}`)
|
|
81
|
+
|
|
82
|
+
yield* Console.log(`\nGenerating code to: ${outDir}`)
|
|
83
|
+
|
|
84
|
+
// Generate code
|
|
85
|
+
const config = {
|
|
86
|
+
outputDir: outDir,
|
|
87
|
+
force: forceOverwrite,
|
|
88
|
+
...(svcName._tag === "Some" ? { serviceName: svcName.value } : {}),
|
|
89
|
+
...(pkgName._tag === "Some" ? { packageName: pkgName.value } : {})
|
|
90
|
+
}
|
|
91
|
+
yield* generate(dataModel, config)
|
|
92
|
+
|
|
93
|
+
yield* Console.log("\nDone!")
|
|
94
|
+
})
|
|
95
|
+
)
|
|
96
|
+
)
|
|
97
|
+
|
|
98
|
+
// ============================================================================
|
|
99
|
+
// Root Command
|
|
100
|
+
// ============================================================================
|
|
101
|
+
|
|
102
|
+
const rootCommand = Command.make("odata-effect-gen").pipe(
|
|
103
|
+
Command.withSubcommands([generateCommand])
|
|
104
|
+
)
|
|
105
|
+
|
|
106
|
+
/**
|
|
107
|
+
* CLI entry point.
|
|
108
|
+
*
|
|
109
|
+
* @since 1.0.0
|
|
110
|
+
* @category cli
|
|
111
|
+
*/
|
|
112
|
+
export const cli = Command.run(rootCommand, {
|
|
113
|
+
name: "OData Effect Generator",
|
|
114
|
+
version: "0.0.1"
|
|
115
|
+
})
|
package/src/bin.ts
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* CLI entry point for OData Effect Generator.
|
|
5
|
+
*
|
|
6
|
+
* @since 1.0.0
|
|
7
|
+
*/
|
|
8
|
+
import { NodeContext, NodeRuntime } from "@effect/platform-node"
|
|
9
|
+
import { Effect } from "effect"
|
|
10
|
+
import { cli } from "./Cli.js"
|
|
11
|
+
|
|
12
|
+
const MainLive = NodeContext.layer
|
|
13
|
+
|
|
14
|
+
cli(process.argv).pipe(
|
|
15
|
+
Effect.provide(MainLive),
|
|
16
|
+
NodeRuntime.runMain
|
|
17
|
+
)
|