@odata2ts/odata2ts 0.27.0 → 0.29.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/CHANGELOG.md CHANGED
@@ -3,6 +3,36 @@
3
3
  All notable changes to this project will be documented in this file.
4
4
  See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
5
5
 
6
+ # [0.29.0](https://github.com/odata2ts/odata2ts/compare/@odata2ts/odata2ts@0.28.0...@odata2ts/odata2ts@0.29.0) (2023-08-08)
7
+
8
+ ### Bug Fixes
9
+
10
+ * **odata2ts:** downgrade prettier plugin xml to 2.2.0 ([36525f9](https://github.com/odata2ts/odata2ts/commit/36525f90e03199a0a4cce197df4662e8288493a6))
11
+
12
+ ### Features
13
+
14
+ * service generation for primitive types ([#201](https://github.com/odata2ts/odata2ts/issues/201)) ([ea9e645](https://github.com/odata2ts/odata2ts/commit/ea9e6452f6b4033c489fbceaf6b75591b550a3f1))
15
+
16
+ ### BREAKING CHANGES
17
+
18
+ * removed the public method "getQObject"
19
+
20
+ * refactor(odata2ts): use __base properties of inherited services
21
+
22
+ * feat(service): introduce PrimitiveTypeService
23
+
24
+ * feat(odata2ts): allow to generate PrimitiveTypeServices via option enablePrimitivePropertyServices
25
+
26
+ * feat(example): integration tests for primitive type services
27
+
28
+ # [0.28.0](https://github.com/odata2ts/odata2ts/compare/@odata2ts/odata2ts@0.27.0...@odata2ts/odata2ts@0.28.0) (2023-07-31)
29
+
30
+ ### Features
31
+
32
+ * **odat2ts:** v4 big number generation ([#195](https://github.com/odata2ts/odata2ts/issues/195)) ([3e5fdcd](https://github.com/odata2ts/odata2ts/commit/3e5fdcda42f893ed7d069489faa2ad10da8d7837))
33
+
34
+ * **odata2ts:** ESM support for the generator ([#198](https://github.com/odata2ts/odata2ts/issues/198)) ([6956b9c](https://github.com/odata2ts/odata2ts/commit/6956b9c8321707f04b7109653de50de0b739df3e))
35
+
6
36
  # [0.27.0](https://github.com/odata2ts/odata2ts/compare/@odata2ts/odata2ts@0.26.1...@odata2ts/odata2ts@0.27.0) (2023-07-20)
7
37
 
8
38
  ### Features
package/README.md CHANGED
@@ -2,14 +2,15 @@
2
2
 
3
3
  # odata2ts
4
4
 
5
- The basic idea of `odata2ts` is to leverage the readily available metadata of any OData service
5
+ The basic idea of `odata2ts` is to leverage the readily available metadata of any OData service
6
6
  to generate different sorts of typed artefacts which you use in your TypeScript code.
7
- This package `@odata2ts/odata2ts` realizes the generation process.
7
+ This package (`@odata2ts/odata2ts`) realizes the generation process.
8
8
 
9
- The generator is supposed to be used with a TypeScript based configuration file.
9
+ The generator is supposed to be used with a TypeScript based configuration file.
10
10
  Then it's able to handle the generation for multiple OData services.
11
11
 
12
12
  It comes with powerful configuration options. Some highlights:
13
+
13
14
  - generation of TypeScript files or compiled JS / DTS files
14
15
  - name or rename stuff
15
16
  - naming of pretty much any aspect of the generated artefacts
@@ -26,23 +27,26 @@ npm install --save-dev @odata2ts/odata2ts
26
27
  ```
27
28
 
28
29
  ### Implicit Dependencies
30
+
29
31
  Most of the generated artefacts depend on other libraries. `odata2ts` lists them as peer dependencies.
30
32
 
31
33
  Depending on your use case, you will need to add runtime dependencies matching the mentioned peer dependencies.
32
- See the [Getting Started Guide](https://odata2ts.github.io/docs/category/getting-started/) of the documentation
34
+ See the [Getting Started Guide](https://odata2ts.github.io/docs/category/getting-started/) of the documentation
33
35
  for guidance.
34
36
 
35
37
  ## Documentation
38
+
36
39
  [Generator Documentation](https://odata2ts.github.io/docs/generator/setup-and-usage)
37
40
 
38
41
  Main documentation for the odata2ts eco system:
39
42
  [https://odata2ts.github.io](https://odata2ts.github.io/)
40
43
 
41
-
42
44
  ## Examples
45
+
43
46
  See [example packages](https://github.com/odata2ts/odata2ts/tree/main/examples) for examples of how to integrate `odata2ts`.
44
47
 
45
48
  ## Tests
49
+
46
50
  See folder [test](https://github.com/odata2ts/odata2ts/tree/main/packages/odata2ts/test)
47
51
  for unit tests.
48
52
 
@@ -52,6 +56,7 @@ tests of the CLI.
52
56
  Each example package serves as integration test of the generator.
53
57
 
54
58
  ## Support, Feedback, Contributing
59
+
55
60
  This project is open to feature requests, suggestions, bug reports, usage questions etc.
56
61
  via [GitHub issues](https://github.com/odata2ts/odata2ts/issues).
57
62
 
@@ -60,15 +65,17 @@ Contributions and feedback are encouraged and always welcome.
60
65
  See the [contribution guidelines](https://github.com/odata2ts/odata2ts/blob/main/CONTRIBUTING.md) for further information.
61
66
 
62
67
  ## Spirit
68
+
63
69
  This project and this module have been created and are maintained in the following spirit:
64
70
 
65
- * adhere to the **OData specification** as much as possible
66
- * support any OData service implementation which conforms to the spec
67
- * allow to work around faulty implementations if possible
68
- * stability matters
69
- * exercise Test Driven Development
70
- * bomb the place with unit tests (code coverage > 95%)
71
- * ensure that assumptions & understanding are correct by creating integration tests
71
+ - adhere to the **OData specification** as much as possible
72
+ - support any OData service implementation which conforms to the spec
73
+ - allow to work around faulty implementations if possible
74
+ - stability matters
75
+ - exercise Test Driven Development
76
+ - bomb the place with unit tests (code coverage > 95%)
77
+ - ensure that assumptions & understanding are correct by creating integration tests
72
78
 
73
79
  ## License
80
+
74
81
  MIT - see [License](./LICENSE).
@@ -4,7 +4,7 @@ import { DataModel } from "./data-model/DataModel";
4
4
  import { Schema } from "./data-model/edmx/ODataEdmxModelBase";
5
5
  import { NamingHelper } from "./data-model/NamingHelper";
6
6
  import { RunOptions } from "./OptionModel";
7
- export type DigestionOptions = Pick<RunOptions, "converters" | "disableAutoManagedKey" | "propertiesByName" | "entitiesByName" | "v2ModelsWithExtraResultsWrapping" | "skipEditableModels" | "skipComments">;
7
+ export type DigestionOptions = Pick<RunOptions, "converters" | "disableAutoManagedKey" | "propertiesByName" | "entitiesByName" | "v2ModelsWithExtraResultsWrapping" | "v4BigNumberAsString" | "skipEditableModels" | "skipComments">;
8
8
  /**
9
9
  * Takes an EdmxSchema plus the run options and creates a DataModel.
10
10
  */
@@ -1 +1 @@
1
- {"version":3,"file":"FactoryFunctionModel.js","sourceRoot":"","sources":["../src/FactoryFunctionModel.ts"],"names":[],"mappings":"","sourcesContent":["import { ODataVersions } from \"@odata2ts/odata-core\";\r\nimport { SourceFile } from \"ts-morph\";\r\n\r\nimport { DataModel } from \"./data-model/DataModel\";\r\nimport { Schema } from \"./data-model/edmx/ODataEdmxModelBase\";\r\nimport { NamingHelper } from \"./data-model/NamingHelper\";\r\nimport { RunOptions } from \"./OptionModel\";\r\n\r\nexport type DigestionOptions = Pick<\r\n RunOptions,\r\n | \"converters\"\r\n | \"disableAutoManagedKey\"\r\n | \"propertiesByName\"\r\n | \"entitiesByName\"\r\n | \"v2ModelsWithExtraResultsWrapping\"\r\n | \"skipEditableModels\"\r\n | \"skipComments\"\r\n>;\r\n\r\n/**\r\n * Takes an EdmxSchema plus the run options and creates a DataModel.\r\n */\r\nexport type DigesterFunction<S extends Schema<any, any>> = (\r\n schema: Array<S>,\r\n options: DigestionOptions,\r\n namingHelper: NamingHelper\r\n) => Promise<DataModel>;\r\n\r\nexport type GeneratorFunctionOptions = Pick<\r\n RunOptions,\r\n \"skipEditableModels\" | \"skipIdModels\" | \"skipOperations\" | \"skipComments\" | \"v2ModelsWithExtraResultsWrapping\"\r\n>;\r\n\r\nexport type EntityBasedGeneratorFunction = (\r\n dataModel: DataModel,\r\n sourceFile: SourceFile,\r\n version: ODataVersions,\r\n options: GeneratorFunctionOptions,\r\n namingHelper: NamingHelper\r\n) => void;\r\n"]}
1
+ {"version":3,"file":"FactoryFunctionModel.js","sourceRoot":"","sources":["../src/FactoryFunctionModel.ts"],"names":[],"mappings":"","sourcesContent":["import { ODataVersions } from \"@odata2ts/odata-core\";\r\nimport { SourceFile } from \"ts-morph\";\r\n\r\nimport { DataModel } from \"./data-model/DataModel\";\r\nimport { Schema } from \"./data-model/edmx/ODataEdmxModelBase\";\r\nimport { NamingHelper } from \"./data-model/NamingHelper\";\r\nimport { RunOptions } from \"./OptionModel\";\r\n\r\nexport type DigestionOptions = Pick<\r\n RunOptions,\r\n | \"converters\"\r\n | \"disableAutoManagedKey\"\r\n | \"propertiesByName\"\r\n | \"entitiesByName\"\r\n | \"v2ModelsWithExtraResultsWrapping\"\r\n | \"v4BigNumberAsString\"\r\n | \"skipEditableModels\"\r\n | \"skipComments\"\r\n>;\r\n\r\n/**\r\n * Takes an EdmxSchema plus the run options and creates a DataModel.\r\n */\r\nexport type DigesterFunction<S extends Schema<any, any>> = (\r\n schema: Array<S>,\r\n options: DigestionOptions,\r\n namingHelper: NamingHelper\r\n) => Promise<DataModel>;\r\n\r\nexport type GeneratorFunctionOptions = Pick<\r\n RunOptions,\r\n \"skipEditableModels\" | \"skipIdModels\" | \"skipOperations\" | \"skipComments\" | \"v2ModelsWithExtraResultsWrapping\"\r\n>;\r\n\r\nexport type EntityBasedGeneratorFunction = (\r\n dataModel: DataModel,\r\n sourceFile: SourceFile,\r\n version: ODataVersions,\r\n options: GeneratorFunctionOptions,\r\n namingHelper: NamingHelper\r\n) => void;\r\n"]}
@@ -113,17 +113,10 @@ export interface CliOptions {
113
113
  * Model / class names are formatted with PascalCase; property, param, and operation names with camelCase.
114
114
  *
115
115
  * The naming configuration allows to control this and other naming related settings.
116
- * Note: Even if renaming is disabled, model prefixing / suffing still applies.
116
+ * Note: Even if renaming is disabled, model prefixing / suffixing still applies.
117
117
  */
118
118
  allowRenaming?: boolean;
119
119
  }
120
- /**
121
- * Available options for the actual generation run.
122
- * Every property is required, except the overriding service name.
123
- */
124
- export interface RunOptions extends Required<Omit<ServiceGenerationOptions, "serviceName" | "sourceUrl" | "sourceUrlConfig" | "refreshFile">>, Pick<ServiceGenerationOptions, "serviceName" | "sourceUrl" | "sourceUrlConfig" | "refreshFile"> {
125
- naming: NameSettings;
126
- }
127
120
  /**
128
121
  * Configuration options of the request to retrieve the metadata.
129
122
  * Only takes effect if `source` is a URL.
@@ -202,6 +195,14 @@ export interface ConfigFileOptions extends Omit<CliOptions, "sourceUrl" | "sourc
202
195
  * With this option you can turn that off.
203
196
  */
204
197
  skipComments?: boolean;
198
+ /**
199
+ * With OData you can read, update and delete data on a primitive property (`Edm.*`).
200
+ * Usually, you wouldn't do that, but go for a bigger request, fetching more relevant information in one go.
201
+ *
202
+ * There's one exception: Handling `Edm.Stream´ properties and Media entities. Services for stream / media
203
+ * stuff are generated regardless of this setting.
204
+ */
205
+ enablePrimitivePropertyServices?: boolean;
205
206
  /**
206
207
  * The naming options regarding the generated artefacts.
207
208
  */
@@ -220,6 +221,19 @@ export interface ConfigFileOptions extends Omit<CliOptions, "sourceUrl" | "sourc
220
221
  * to <code>models</code>; it is ignored otherwise.
221
222
  */
222
223
  v2ModelsWithExtraResultsWrapping?: boolean;
224
+ /**
225
+ * Numbers of type `Edm.Int64` and `Edm.Decimal` are represented as `number` in V4.
226
+ * However, these numbers might not fit into JS' number type, which might result in precision loss.
227
+ *
228
+ * OData offers a special IEEE754 format option to get those types as `string` instead to prevent any
229
+ * precision loss. So if you're handling very large or very small numbers (JS roughly supports 15 digits),
230
+ * then you should use this option and, probably, also an appropriate converter (see available converters).
231
+ *
232
+ * Activating this option affects the type generation and will use `string` for both mentioned types.
233
+ * All requests are executed with the "accept" header set to "application/json;IEEE754Compatible=true".
234
+ * Additionally, when sending data the very same value will be set for the "content-type" header.
235
+ */
236
+ v4BigNumberAsString?: boolean;
223
237
  }
224
238
  /**
225
239
  * Custom generation options which are dependent on a specific odata service.
@@ -234,6 +248,13 @@ export interface ServiceGenerationOptions extends Required<Pick<CliOptions, "sou
234
248
  */
235
249
  propertiesByName?: Array<PropertyGenerationOptions>;
236
250
  }
251
+ /**
252
+ * Available options for the actual generation run.
253
+ * Every property is required, except the overriding service name.
254
+ */
255
+ export interface RunOptions extends Required<Omit<ServiceGenerationOptions, "serviceName" | "sourceUrl" | "sourceUrlConfig" | "refreshFile">>, Pick<ServiceGenerationOptions, "serviceName" | "sourceUrl" | "sourceUrlConfig" | "refreshFile"> {
256
+ naming: NameSettings;
257
+ }
237
258
  /**
238
259
  * Configuration options for EntityTypes and ComplexTypes.
239
260
  * This config applies if the name matches the name of an EntityType or ComplexType as it is specified
@@ -1 +1 @@
1
- {"version":3,"file":"OptionModel.js","sourceRoot":"","sources":["../src/OptionModel.ts"],"names":[],"mappings":";;;AAKA;;GAEG;AACH,IAAY,KAKX;AALD,WAAY,KAAK;IACf,qCAAM,CAAA;IACN,yCAAQ,CAAA;IACR,uCAAO,CAAA;IACP,+BAAG,CAAA;AACL,CAAC,EALW,KAAK,qBAAL,KAAK,QAKhB;AAED;;GAEG;AACH,IAAY,SAKX;AALD,WAAY,SAAS;IACnB,sBAAS,CAAA;IACT,sBAAS,CAAA;IACT,wBAAW,CAAA;IACX,8BAAiB,CAAA;AACnB,CAAC,EALW,SAAS,yBAAT,SAAS,QAKpB","sourcesContent":["import { TypeConverterConfig } from \"@odata2ts/converter-runtime\";\r\nimport { AxiosRequestConfig } from \"axios\";\r\n\r\nimport { NameSettings, OverridableNamingOptions } from \"./NamingModel\";\r\n\r\n/**\r\n * Generation mode, by default \"all\".\r\n */\r\nexport enum Modes {\r\n models,\r\n qobjects,\r\n service,\r\n all,\r\n}\r\n\r\n/**\r\n * What kind of stuff to emit: Either raw TS or TS that has been compiled to JS / DTS.\r\n */\r\nexport enum EmitModes {\r\n ts = \"ts\",\r\n js = \"js\",\r\n dts = \"dts\",\r\n js_dts = \"js_dts\",\r\n}\r\n\r\n/**\r\n * Config options for CLI.\r\n */\r\nexport interface CliOptions {\r\n /**\r\n * The URL to the root of your OData service. The URL might end in a slash or not, it might also end\r\n * in $metadata, but we usually add this for you.\r\n *\r\n * Specifying the URL is a convenience feature to download the metadata file from the given URL.\r\n * You can configure this request via `sourceConfig` option.\r\n *\r\n * The `source` option must still be specified as it is used to store the downloaded file on your disk.\r\n * By default, the file is used once it has been downloaded.\r\n */\r\n sourceUrl?: string;\r\n /**\r\n * Downloads the metadata file and overwrites the existing one, if any.\r\n *\r\n * Only takes effect, if option `sourceUrl` is specified.\r\n */\r\n refreshFile?: boolean;\r\n /**\r\n * The source is the file to use (must be an EDMX compliant XML file) or the URL to the\r\n * metadata (ROOT_SERVICE/$metadata).\r\n *\r\n * If not specified, at least one service must be configured in config file.\r\n */\r\n source?: string;\r\n /**\r\n * Specifies the output directory for the generated stuff.\r\n *\r\n * If not specified, at least one service must be configured in config file.\r\n */\r\n output?: string;\r\n /**\r\n * Only generates the specified services.\r\n * Relies on an existing config file where these service names are maintained.\r\n */\r\n services?: Array<string>;\r\n /**\r\n * Specifies what to generate:\r\n * - {@code Modes.models} will only generate TS interfaces\r\n * - {@code Modes.qobjects} will generate functional units used in QueryBuilder and for functions and actions\r\n * - {@code Modes.service} will generate one main OData service client and one per each entity\r\n * - {@code Modes.all} the same as {@code Modes.service}\r\n *\r\n * QObjects will also generate models, and generating the service client will also generate models and QObjects.\r\n * Defaults to {@code Modes.all}\r\n */\r\n mode?: Modes;\r\n /**\r\n * Specifies the type of the output files: TypeScript, JS, DTS only, JS with DTS.\r\n * Defaults to {@code EmitModes.js_dts}\r\n */\r\n emitMode?: EmitModes;\r\n /**\r\n * Uses prettier with your local configuration to pretty print TypeScript files.\r\n * Only applies if mode is set to {@code EmitModes.ts}.\r\n */\r\n prettier?: boolean;\r\n /**\r\n * When compiling TypeScript to JS, \"tsconfig.json\" is used by default to add compilerOptions.\r\n * This option allows to specify an alternative file.\r\n *\r\n * Only takes effect, when mode is set to anything else than {@code EmitModes.ts}.\r\n */\r\n tsconfig?: string;\r\n /**\r\n * Verbose debugging information.\r\n */\r\n debug?: boolean;\r\n /**\r\n * Overrides the service name found in the source file.\r\n *\r\n * The service name is the basis for all file names and the name of the main OData client service\r\n * that serves as entry point for the user.\r\n */\r\n serviceName?: string;\r\n /**\r\n * odata2ts will automatically decide if a key prop is managed on the server side.\r\n * If managed, the property will not be editable (create, update, patch).\r\n * The following rule applies:\r\n * If a property is the only key prop of an entity, then the prop is deemed to be managed;\r\n * in ony other case the prop is unmanaged.\r\n */\r\n disableAutoManagedKey?: boolean;\r\n /**\r\n * By default, odata2ts doesn't change param, operation, property or model names.\r\n * The generated models and their properties are named exactly as advertised by the server.\r\n *\r\n * By allowing odata2ts to change these names, certain predefined formatting strategies are used:\r\n * Model / class names are formatted with PascalCase; property, param, and operation names with camelCase.\r\n *\r\n * The naming configuration allows to control this and other naming related settings.\r\n * Note: Even if renaming is disabled, model prefixing / suffing still applies.\r\n */\r\n allowRenaming?: boolean;\r\n}\r\n\r\n/**\r\n * Available options for the actual generation run.\r\n * Every property is required, except the overriding service name.\r\n */\r\nexport interface RunOptions\r\n extends Required<Omit<ServiceGenerationOptions, \"serviceName\" | \"sourceUrl\" | \"sourceUrlConfig\" | \"refreshFile\">>,\r\n Pick<ServiceGenerationOptions, \"serviceName\" | \"sourceUrl\" | \"sourceUrlConfig\" | \"refreshFile\"> {\r\n naming: NameSettings;\r\n}\r\n\r\n/**\r\n * Configuration options of the request to retrieve the metadata.\r\n * Only takes effect if `source` is a URL.\r\n */\r\nexport interface UrlSourceConfiguration {\r\n /**\r\n * Basic auth credentials: the username.\r\n * Only takes effect if `password` has also been set.\r\n */\r\n username?: string;\r\n /**\r\n * Basic auth credentials: the password.\r\n * Only takes effect if `username` has also been set.\r\n */\r\n password?: string;\r\n /**\r\n * Custom request configuration.\r\n * URL and method `GET` are set by default, but can be overwritten.\r\n */\r\n custom?: AxiosRequestConfig;\r\n}\r\n\r\n/**\r\n * Available options for configuration files, i.e. odata2ts.config.ts.\r\n */\r\nexport interface ConfigFileOptions extends Omit<CliOptions, \"sourceUrl\" | \"source\" | \"output\" | \"services\"> {\r\n /**\r\n * Configuration options of the request to retrieve the metadata.\r\n * Only takes effect if `sourceUrl` is a URL.\r\n */\r\n sourceUrlConfig?: UrlSourceConfiguration;\r\n\r\n /**\r\n * Configuration of each service.\r\n *\r\n * @example { services: { trippin: { source: \"...\", ... } }}\r\n */\r\n services?: { [serviceName: string]: ServiceGenerationOptions };\r\n\r\n /**\r\n * Specify which converters to use by their package name, e.g. \"@odata2ts/converter-v2-to-v4\".\r\n * Each converter knows which data type to map.\r\n *\r\n * To only use specific converters, the object syntax must be used, where supported converters\r\n * must be listed by their ids.\r\n */\r\n converters?: Array<string | TypeConverterConfig>;\r\n\r\n /**\r\n * For each model an editable version is generated which represents the model definition for\r\n * create, update and patch actions.\r\n *\r\n * You can skip the generation altogether, not generating editable model variants,\r\n * if the generation mode is {@code Mode.model} or {@code Mode.qobject}.\r\n */\r\n skipEditableModels?: boolean;\r\n\r\n /**\r\n * ID models are generated from entity id parameters.\r\n * The generation for one entity entails one model interface representing the id parameters and\r\n * one QId function which allows to format the parameters for URL usage and to parse parameters\r\n * from a URL string.\r\n *\r\n * You can skip the generation altogether, not generating models and QId objects, if the\r\n * generation mode is {@code Mode.model} or {@code Mode.qobject}.\r\n */\r\n skipIdModels?: boolean;\r\n /**\r\n * Operations are functions and actions of the OData service.\r\n * The generation for one operation entails one parameter model interface\r\n * and one QFunction / QAction class.\r\n *\r\n * You can skip the generation altogether, neither generating model nor query object,\r\n * if the generation mode is {@code Mode.model} or {@code Mode.qobject}.\r\n */\r\n skipOperations?: boolean;\r\n /**\r\n * Model properties have explaining comments by default.\r\n * With this option you can turn that off.\r\n */\r\n skipComments?: boolean;\r\n\r\n /**\r\n * The naming options regarding the generated artefacts.\r\n */\r\n naming?: OverridableNamingOptions;\r\n\r\n /**\r\n * Some OData V2 services generate an extra wrapping for entity collection attributes:\r\n * <code>trips: {results: [...]}</code>. So instead of directly returning an array of entities\r\n * an object with the property \"results\" is wrapped around the entity collection.\r\n *\r\n * If you're using the odata client then there's a build-in workaround in place which transforms\r\n * the results to remove this extra mapping. However, if you're only interested in the types, then\r\n * the generated models will not match that extra wrapping.\r\n *\r\n * Setting this configuration option to <code>true</code> (default: false) will add this extra\r\n * wrapping to the generated models. But this option is only valid if the generation mode is set\r\n * to <code>models</code>; it is ignored otherwise.\r\n */\r\n v2ModelsWithExtraResultsWrapping?: boolean;\r\n}\r\n\r\n/**\r\n * Custom generation options which are dependent on a specific odata service.\r\n */\r\nexport interface ServiceGenerationOptions\r\n extends Required<Pick<CliOptions, \"source\" | \"output\">>,\r\n Pick<CliOptions, \"sourceUrl\" | \"refreshFile\">,\r\n Omit<ConfigFileOptions, \"services\"> {\r\n /**\r\n * Configure generation process for EntityTypes and ComplexTypes including their keys and properties.\r\n */\r\n entitiesByName?: Array<EntityGenerationOptions>;\r\n /**\r\n * Configure generation process for individual properties based on their name.\r\n */\r\n propertiesByName?: Array<PropertyGenerationOptions>;\r\n}\r\n\r\n/**\r\n * Configuration options for EntityTypes and ComplexTypes.\r\n * This config applies if the name matches the name of an EntityType or ComplexType as it is specified\r\n * in the metadata (e.g. in EDMX <EntityType name=\"Test\" ...)\r\n */\r\nexport interface EntityGenerationOptions {\r\n /**\r\n * Name of the EntityType or ComplexType, e.g. \"Person\".\r\n * Must match exactly or can be a regular expression.\r\n */\r\n name: string | RegExp;\r\n /**\r\n * Use a different name.\r\n * If name is a regular expression, mappedName allows to specify captured groups (via $1, $2, ...).\r\n */\r\n mappedName?: string;\r\n /**\r\n * Overwrite the key specification by naming the props by their EDMX name.\r\n */\r\n keys?: Array<string>;\r\n /**\r\n * Configuration of individual properties.\r\n */\r\n properties?: Array<PropertyGenerationOptions>;\r\n\r\n // converter: string | Array<string>\r\n\r\n /**\r\n * Whether the generated service should allow for querying this model.\r\n * True by default.\r\n */\r\n // queryable?: boolean;\r\n /**\r\n * Whether the generated service should allow for creating new models (POST).\r\n * True by default.\r\n */\r\n // creatable?: boolean;\r\n /**\r\n * Whether the generated service should allow for updates (PUT).\r\n * True by default.\r\n */\r\n // updatable?: boolean;\r\n /**\r\n * Whether the generated service should allow for partial updates (PATCH).\r\n * True by default.\r\n */\r\n // patchable?: boolean;\r\n /**\r\n * Whether the generated service should allow for deletion.\r\n * True by default.\r\n */\r\n // deletable?: boolean;\r\n}\r\n\r\n/**\r\n * All configuration options for properties of models.\r\n */\r\nexport interface PropertyGenerationOptions {\r\n /**\r\n * Name of the property to match.\r\n * Must match exactly or can be a regular expression.\r\n */\r\n name: string | RegExp;\r\n /**\r\n * Use a different name.\r\n * If name is a regular expression, mappedName allows to specify captured groups (via $1, $2, ...).\r\n */\r\n mappedName?: string;\r\n /**\r\n * Managed attributes - i.e. managed by the server - cannot be created or updated.\r\n * Hence, they are left out of the editable model versions.\r\n */\r\n managed?: boolean;\r\n\r\n /**\r\n * TODO\r\n *\r\n * Each converter must specify its package name, e.g. \"@odata2ts/converter-v2-to-v4\",\r\n * as well it's i\r\n * and their ids, e.g. \"timeToDurationConverter\".\r\n *\r\n * To only use specific converters, the object syntax must be used, where supported converters\r\n * must be listed by their ids.\r\n */\r\n // converters?: Array<Required<TypeConverterConfig>>;\r\n}\r\n"]}
1
+ {"version":3,"file":"OptionModel.js","sourceRoot":"","sources":["../src/OptionModel.ts"],"names":[],"mappings":";;;AAKA;;GAEG;AACH,IAAY,KAKX;AALD,WAAY,KAAK;IACf,qCAAM,CAAA;IACN,yCAAQ,CAAA;IACR,uCAAO,CAAA;IACP,+BAAG,CAAA;AACL,CAAC,EALW,KAAK,qBAAL,KAAK,QAKhB;AAED;;GAEG;AACH,IAAY,SAKX;AALD,WAAY,SAAS;IACnB,sBAAS,CAAA;IACT,sBAAS,CAAA;IACT,wBAAW,CAAA;IACX,8BAAiB,CAAA;AACnB,CAAC,EALW,SAAS,yBAAT,SAAS,QAKpB","sourcesContent":["import { TypeConverterConfig } from \"@odata2ts/converter-runtime\";\r\nimport { AxiosRequestConfig } from \"axios\";\r\n\r\nimport { NameSettings, OverridableNamingOptions } from \"./NamingModel\";\r\n\r\n/**\r\n * Generation mode, by default \"all\".\r\n */\r\nexport enum Modes {\r\n models,\r\n qobjects,\r\n service,\r\n all,\r\n}\r\n\r\n/**\r\n * What kind of stuff to emit: Either raw TS or TS that has been compiled to JS / DTS.\r\n */\r\nexport enum EmitModes {\r\n ts = \"ts\",\r\n js = \"js\",\r\n dts = \"dts\",\r\n js_dts = \"js_dts\",\r\n}\r\n\r\n/**\r\n * Config options for CLI.\r\n */\r\nexport interface CliOptions {\r\n /**\r\n * The URL to the root of your OData service. The URL might end in a slash or not, it might also end\r\n * in $metadata, but we usually add this for you.\r\n *\r\n * Specifying the URL is a convenience feature to download the metadata file from the given URL.\r\n * You can configure this request via `sourceConfig` option.\r\n *\r\n * The `source` option must still be specified as it is used to store the downloaded file on your disk.\r\n * By default, the file is used once it has been downloaded.\r\n */\r\n sourceUrl?: string;\r\n /**\r\n * Downloads the metadata file and overwrites the existing one, if any.\r\n *\r\n * Only takes effect, if option `sourceUrl` is specified.\r\n */\r\n refreshFile?: boolean;\r\n /**\r\n * The source is the file to use (must be an EDMX compliant XML file) or the URL to the\r\n * metadata (ROOT_SERVICE/$metadata).\r\n *\r\n * If not specified, at least one service must be configured in config file.\r\n */\r\n source?: string;\r\n /**\r\n * Specifies the output directory for the generated stuff.\r\n *\r\n * If not specified, at least one service must be configured in config file.\r\n */\r\n output?: string;\r\n /**\r\n * Only generates the specified services.\r\n * Relies on an existing config file where these service names are maintained.\r\n */\r\n services?: Array<string>;\r\n /**\r\n * Specifies what to generate:\r\n * - {@code Modes.models} will only generate TS interfaces\r\n * - {@code Modes.qobjects} will generate functional units used in QueryBuilder and for functions and actions\r\n * - {@code Modes.service} will generate one main OData service client and one per each entity\r\n * - {@code Modes.all} the same as {@code Modes.service}\r\n *\r\n * QObjects will also generate models, and generating the service client will also generate models and QObjects.\r\n * Defaults to {@code Modes.all}\r\n */\r\n mode?: Modes;\r\n /**\r\n * Specifies the type of the output files: TypeScript, JS, DTS only, JS with DTS.\r\n * Defaults to {@code EmitModes.js_dts}\r\n */\r\n emitMode?: EmitModes;\r\n /**\r\n * Uses prettier with your local configuration to pretty print TypeScript files.\r\n * Only applies if mode is set to {@code EmitModes.ts}.\r\n */\r\n prettier?: boolean;\r\n /**\r\n * When compiling TypeScript to JS, \"tsconfig.json\" is used by default to add compilerOptions.\r\n * This option allows to specify an alternative file.\r\n *\r\n * Only takes effect, when mode is set to anything else than {@code EmitModes.ts}.\r\n */\r\n tsconfig?: string;\r\n /**\r\n * Verbose debugging information.\r\n */\r\n debug?: boolean;\r\n /**\r\n * Overrides the service name found in the source file.\r\n *\r\n * The service name is the basis for all file names and the name of the main OData client service\r\n * that serves as entry point for the user.\r\n */\r\n serviceName?: string;\r\n /**\r\n * odata2ts will automatically decide if a key prop is managed on the server side.\r\n * If managed, the property will not be editable (create, update, patch).\r\n * The following rule applies:\r\n * If a property is the only key prop of an entity, then the prop is deemed to be managed;\r\n * in ony other case the prop is unmanaged.\r\n */\r\n disableAutoManagedKey?: boolean;\r\n /**\r\n * By default, odata2ts doesn't change param, operation, property or model names.\r\n * The generated models and their properties are named exactly as advertised by the server.\r\n *\r\n * By allowing odata2ts to change these names, certain predefined formatting strategies are used:\r\n * Model / class names are formatted with PascalCase; property, param, and operation names with camelCase.\r\n *\r\n * The naming configuration allows to control this and other naming related settings.\r\n * Note: Even if renaming is disabled, model prefixing / suffixing still applies.\r\n */\r\n allowRenaming?: boolean;\r\n}\r\n\r\n/**\r\n * Configuration options of the request to retrieve the metadata.\r\n * Only takes effect if `source` is a URL.\r\n */\r\nexport interface UrlSourceConfiguration {\r\n /**\r\n * Basic auth credentials: the username.\r\n * Only takes effect if `password` has also been set.\r\n */\r\n username?: string;\r\n /**\r\n * Basic auth credentials: the password.\r\n * Only takes effect if `username` has also been set.\r\n */\r\n password?: string;\r\n /**\r\n * Custom request configuration.\r\n * URL and method `GET` are set by default, but can be overwritten.\r\n */\r\n custom?: AxiosRequestConfig;\r\n}\r\n\r\n/**\r\n * Available options for configuration files, i.e. odata2ts.config.ts.\r\n */\r\nexport interface ConfigFileOptions extends Omit<CliOptions, \"sourceUrl\" | \"source\" | \"output\" | \"services\"> {\r\n /**\r\n * Configuration options of the request to retrieve the metadata.\r\n * Only takes effect if `sourceUrl` is a URL.\r\n */\r\n sourceUrlConfig?: UrlSourceConfiguration;\r\n\r\n /**\r\n * Configuration of each service.\r\n *\r\n * @example { services: { trippin: { source: \"...\", ... } }}\r\n */\r\n services?: { [serviceName: string]: ServiceGenerationOptions };\r\n\r\n /**\r\n * Specify which converters to use by their package name, e.g. \"@odata2ts/converter-v2-to-v4\".\r\n * Each converter knows which data type to map.\r\n *\r\n * To only use specific converters, the object syntax must be used, where supported converters\r\n * must be listed by their ids.\r\n */\r\n converters?: Array<string | TypeConverterConfig>;\r\n\r\n /**\r\n * For each model an editable version is generated which represents the model definition for\r\n * create, update and patch actions.\r\n *\r\n * You can skip the generation altogether, not generating editable model variants,\r\n * if the generation mode is {@code Mode.model} or {@code Mode.qobject}.\r\n */\r\n skipEditableModels?: boolean;\r\n\r\n /**\r\n * ID models are generated from entity id parameters.\r\n * The generation for one entity entails one model interface representing the id parameters and\r\n * one QId function which allows to format the parameters for URL usage and to parse parameters\r\n * from a URL string.\r\n *\r\n * You can skip the generation altogether, not generating models and QId objects, if the\r\n * generation mode is {@code Mode.model} or {@code Mode.qobject}.\r\n */\r\n skipIdModels?: boolean;\r\n /**\r\n * Operations are functions and actions of the OData service.\r\n * The generation for one operation entails one parameter model interface\r\n * and one QFunction / QAction class.\r\n *\r\n * You can skip the generation altogether, neither generating model nor query object,\r\n * if the generation mode is {@code Mode.model} or {@code Mode.qobject}.\r\n */\r\n skipOperations?: boolean;\r\n /**\r\n * Model properties have explaining comments by default.\r\n * With this option you can turn that off.\r\n */\r\n skipComments?: boolean;\r\n /**\r\n * With OData you can read, update and delete data on a primitive property (`Edm.*`).\r\n * Usually, you wouldn't do that, but go for a bigger request, fetching more relevant information in one go.\r\n *\r\n * There's one exception: Handling `Edm.Stream´ properties and Media entities. Services for stream / media\r\n * stuff are generated regardless of this setting.\r\n */\r\n enablePrimitivePropertyServices?: boolean;\r\n\r\n /**\r\n * The naming options regarding the generated artefacts.\r\n */\r\n naming?: OverridableNamingOptions;\r\n\r\n /**\r\n * Some OData V2 services generate an extra wrapping for entity collection attributes:\r\n * <code>trips: {results: [...]}</code>. So instead of directly returning an array of entities\r\n * an object with the property \"results\" is wrapped around the entity collection.\r\n *\r\n * If you're using the odata client then there's a build-in workaround in place which transforms\r\n * the results to remove this extra mapping. However, if you're only interested in the types, then\r\n * the generated models will not match that extra wrapping.\r\n *\r\n * Setting this configuration option to <code>true</code> (default: false) will add this extra\r\n * wrapping to the generated models. But this option is only valid if the generation mode is set\r\n * to <code>models</code>; it is ignored otherwise.\r\n */\r\n v2ModelsWithExtraResultsWrapping?: boolean;\r\n /**\r\n * Numbers of type `Edm.Int64` and `Edm.Decimal` are represented as `number` in V4.\r\n * However, these numbers might not fit into JS' number type, which might result in precision loss.\r\n *\r\n * OData offers a special IEEE754 format option to get those types as `string` instead to prevent any\r\n * precision loss. So if you're handling very large or very small numbers (JS roughly supports 15 digits),\r\n * then you should use this option and, probably, also an appropriate converter (see available converters).\r\n *\r\n * Activating this option affects the type generation and will use `string` for both mentioned types.\r\n * All requests are executed with the \"accept\" header set to \"application/json;IEEE754Compatible=true\".\r\n * Additionally, when sending data the very same value will be set for the \"content-type\" header.\r\n */\r\n v4BigNumberAsString?: boolean;\r\n}\r\n\r\n/**\r\n * Custom generation options which are dependent on a specific odata service.\r\n */\r\nexport interface ServiceGenerationOptions\r\n extends Required<Pick<CliOptions, \"source\" | \"output\">>,\r\n Pick<CliOptions, \"sourceUrl\" | \"refreshFile\">,\r\n Omit<ConfigFileOptions, \"services\"> {\r\n /**\r\n * Configure generation process for EntityTypes and ComplexTypes including their keys and properties.\r\n */\r\n entitiesByName?: Array<EntityGenerationOptions>;\r\n /**\r\n * Configure generation process for individual properties based on their name.\r\n */\r\n propertiesByName?: Array<PropertyGenerationOptions>;\r\n}\r\n\r\n/**\r\n * Available options for the actual generation run.\r\n * Every property is required, except the overriding service name.\r\n */\r\nexport interface RunOptions\r\n extends Required<Omit<ServiceGenerationOptions, \"serviceName\" | \"sourceUrl\" | \"sourceUrlConfig\" | \"refreshFile\">>,\r\n Pick<ServiceGenerationOptions, \"serviceName\" | \"sourceUrl\" | \"sourceUrlConfig\" | \"refreshFile\"> {\r\n naming: NameSettings;\r\n}\r\n\r\n/**\r\n * Configuration options for EntityTypes and ComplexTypes.\r\n * This config applies if the name matches the name of an EntityType or ComplexType as it is specified\r\n * in the metadata (e.g. in EDMX <EntityType name=\"Test\" ...)\r\n */\r\nexport interface EntityGenerationOptions {\r\n /**\r\n * Name of the EntityType or ComplexType, e.g. \"Person\".\r\n * Must match exactly or can be a regular expression.\r\n */\r\n name: string | RegExp;\r\n /**\r\n * Use a different name.\r\n * If name is a regular expression, mappedName allows to specify captured groups (via $1, $2, ...).\r\n */\r\n mappedName?: string;\r\n /**\r\n * Overwrite the key specification by naming the props by their EDMX name.\r\n */\r\n keys?: Array<string>;\r\n /**\r\n * Configuration of individual properties.\r\n */\r\n properties?: Array<PropertyGenerationOptions>;\r\n\r\n // converter: string | Array<string>\r\n\r\n /**\r\n * Whether the generated service should allow for querying this model.\r\n * True by default.\r\n */\r\n // queryable?: boolean;\r\n /**\r\n * Whether the generated service should allow for creating new models (POST).\r\n * True by default.\r\n */\r\n // creatable?: boolean;\r\n /**\r\n * Whether the generated service should allow for updates (PUT).\r\n * True by default.\r\n */\r\n // updatable?: boolean;\r\n /**\r\n * Whether the generated service should allow for partial updates (PATCH).\r\n * True by default.\r\n */\r\n // patchable?: boolean;\r\n /**\r\n * Whether the generated service should allow for deletion.\r\n * True by default.\r\n */\r\n // deletable?: boolean;\r\n}\r\n\r\n/**\r\n * All configuration options for properties of models.\r\n */\r\nexport interface PropertyGenerationOptions {\r\n /**\r\n * Name of the property to match.\r\n * Must match exactly or can be a regular expression.\r\n */\r\n name: string | RegExp;\r\n /**\r\n * Use a different name.\r\n * If name is a regular expression, mappedName allows to specify captured groups (via $1, $2, ...).\r\n */\r\n mappedName?: string;\r\n /**\r\n * Managed attributes - i.e. managed by the server - cannot be created or updated.\r\n * Hence, they are left out of the editable model versions.\r\n */\r\n managed?: boolean;\r\n\r\n /**\r\n * TODO\r\n *\r\n * Each converter must specify its package name, e.g. \"@odata2ts/converter-v2-to-v4\",\r\n * as well it's i\r\n * and their ids, e.g. \"timeToDurationConverter\".\r\n *\r\n * To only use specific converters, the object syntax must be used, where supported converters\r\n * must be listed by their ids.\r\n */\r\n // converters?: Array<Required<TypeConverterConfig>>;\r\n}\r\n"]}
package/lib/app.js CHANGED
@@ -59,7 +59,7 @@ function runApp(metadataJson, options) {
59
59
  // Generate Individual OData-Service
60
60
  if (isServiceGen(options.mode)) {
61
61
  yield project.cleanServiceDir();
62
- yield (0, generator_1.generateServices)(dataModel, project, version, namingHelper);
62
+ yield (0, generator_1.generateServices)(dataModel, project, version, namingHelper, options);
63
63
  }
64
64
  yield project.writeFiles();
65
65
  });
package/lib/app.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"app.js","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":"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","sourcesContent":["import { ODataVersions } from \"@odata2ts/odata-core\";\r\n\r\nimport { digest as digestV2 } from \"./data-model/DataModelDigestionV2\";\r\nimport { digest as digestV4 } from \"./data-model/DataModelDigestionV4\";\r\nimport { ODataEdmxModelBase, Schema } from \"./data-model/edmx/ODataEdmxModelBase\";\r\nimport { SchemaV3 } from \"./data-model/edmx/ODataEdmxModelV3\";\r\nimport { SchemaV4 } from \"./data-model/edmx/ODataEdmxModelV4\";\r\nimport { NamingHelper } from \"./data-model/NamingHelper\";\r\nimport { generateModels, generateQueryObjects, generateServices } from \"./generator\";\r\nimport { Modes, RunOptions } from \"./OptionModel\";\r\nimport { createProjectManager } from \"./project/ProjectManager\";\r\n\r\nfunction isQObjectGen(mode: Modes) {\r\n return [Modes.qobjects, Modes.service, Modes.all].includes(mode);\r\n}\r\n\r\nfunction isServiceGen(mode: Modes) {\r\n return [Modes.service, Modes.all].includes(mode);\r\n}\r\n\r\n/**\r\n *\r\n * @param metadataJson metadata of a given OData service already parsed as JSON\r\n * @param options further options\r\n */\r\nexport async function runApp(metadataJson: ODataEdmxModelBase<any>, options: RunOptions): Promise<void> {\r\n // determine edmx edmxVersion attribute\r\n const edmxVersion = metadataJson[\"edmx:Edmx\"].$.Version;\r\n const version = edmxVersion === \"1.0\" ? ODataVersions.V2 : ODataVersions.V4;\r\n\r\n const dataService = metadataJson[\"edmx:Edmx\"][\"edmx:DataServices\"][0];\r\n const schemas = dataService.Schema as Array<SchemaV3 | SchemaV4>;\r\n\r\n const detectedSchema = schemas.find((schema) => schema.$.Namespace && schema.EntityType?.length) || schemas[0];\r\n const serviceName = options.serviceName || detectedSchema.$.Namespace;\r\n\r\n const namespaces: Array<string> = [];\r\n schemas.forEach((schema) => {\r\n namespaces.push(schema.$.Namespace);\r\n if (schema.$.Alias) {\r\n namespaces.push(schema.$.Alias);\r\n }\r\n });\r\n\r\n // encapsulate the whole naming logic\r\n const namingHelper = new NamingHelper(options, serviceName, namespaces);\r\n // parse model information from edmx into something we can really work with\r\n // => that stuff is called dataModel!\r\n const dataModel =\r\n version === ODataVersions.V2\r\n ? await digestV2(dataService.Schema as Array<SchemaV3>, options, namingHelper)\r\n : await digestV4(dataService.Schema as Array<SchemaV4>, options, namingHelper);\r\n // handling the overall generation project\r\n const project = await createProjectManager(\r\n namingHelper.getFileNames(),\r\n options.output,\r\n options.emitMode,\r\n options.prettier,\r\n options.tsconfig\r\n );\r\n\r\n // Generate Model Interfaces\r\n // supported edmx types: EntityType, ComplexType, EnumType\r\n const modelsFile = await project.createModelFile();\r\n generateModels(dataModel, modelsFile, version, options, namingHelper);\r\n\r\n // Generate Query Objects\r\n // supported edmx types: EntityType, ComplexType\r\n // supported edmx prop types: primitive types, enum types, primitive collection (incl enum types), entity collection, entity object, complex object\r\n if (isQObjectGen(options.mode)) {\r\n const qFile = await project.createQObjectFile();\r\n generateQueryObjects(dataModel, qFile, version, options, namingHelper);\r\n }\r\n\r\n // Generate Individual OData-Service\r\n if (isServiceGen(options.mode)) {\r\n await project.cleanServiceDir();\r\n await generateServices(dataModel, project, version, namingHelper);\r\n }\r\n\r\n await project.writeFiles();\r\n}\r\n"]}
1
+ {"version":3,"file":"app.js","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":"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","sourcesContent":["import { ODataVersions } from \"@odata2ts/odata-core\";\r\n\r\nimport { digest as digestV2 } from \"./data-model/DataModelDigestionV2\";\r\nimport { digest as digestV4 } from \"./data-model/DataModelDigestionV4\";\r\nimport { ODataEdmxModelBase, Schema } from \"./data-model/edmx/ODataEdmxModelBase\";\r\nimport { SchemaV3 } from \"./data-model/edmx/ODataEdmxModelV3\";\r\nimport { SchemaV4 } from \"./data-model/edmx/ODataEdmxModelV4\";\r\nimport { NamingHelper } from \"./data-model/NamingHelper\";\r\nimport { generateModels, generateQueryObjects, generateServices } from \"./generator\";\r\nimport { Modes, RunOptions } from \"./OptionModel\";\r\nimport { createProjectManager } from \"./project/ProjectManager\";\r\n\r\nfunction isQObjectGen(mode: Modes) {\r\n return [Modes.qobjects, Modes.service, Modes.all].includes(mode);\r\n}\r\n\r\nfunction isServiceGen(mode: Modes) {\r\n return [Modes.service, Modes.all].includes(mode);\r\n}\r\n\r\n/**\r\n *\r\n * @param metadataJson metadata of a given OData service already parsed as JSON\r\n * @param options further options\r\n */\r\nexport async function runApp(metadataJson: ODataEdmxModelBase<any>, options: RunOptions): Promise<void> {\r\n // determine edmx edmxVersion attribute\r\n const edmxVersion = metadataJson[\"edmx:Edmx\"].$.Version;\r\n const version = edmxVersion === \"1.0\" ? ODataVersions.V2 : ODataVersions.V4;\r\n\r\n const dataService = metadataJson[\"edmx:Edmx\"][\"edmx:DataServices\"][0];\r\n const schemas = dataService.Schema as Array<SchemaV3 | SchemaV4>;\r\n\r\n const detectedSchema = schemas.find((schema) => schema.$.Namespace && schema.EntityType?.length) || schemas[0];\r\n const serviceName = options.serviceName || detectedSchema.$.Namespace;\r\n\r\n const namespaces: Array<string> = [];\r\n schemas.forEach((schema) => {\r\n namespaces.push(schema.$.Namespace);\r\n if (schema.$.Alias) {\r\n namespaces.push(schema.$.Alias);\r\n }\r\n });\r\n\r\n // encapsulate the whole naming logic\r\n const namingHelper = new NamingHelper(options, serviceName, namespaces);\r\n // parse model information from edmx into something we can really work with\r\n // => that stuff is called dataModel!\r\n const dataModel =\r\n version === ODataVersions.V2\r\n ? await digestV2(dataService.Schema as Array<SchemaV3>, options, namingHelper)\r\n : await digestV4(dataService.Schema as Array<SchemaV4>, options, namingHelper);\r\n // handling the overall generation project\r\n const project = await createProjectManager(\r\n namingHelper.getFileNames(),\r\n options.output,\r\n options.emitMode,\r\n options.prettier,\r\n options.tsconfig\r\n );\r\n\r\n // Generate Model Interfaces\r\n // supported edmx types: EntityType, ComplexType, EnumType\r\n const modelsFile = await project.createModelFile();\r\n generateModels(dataModel, modelsFile, version, options, namingHelper);\r\n\r\n // Generate Query Objects\r\n // supported edmx types: EntityType, ComplexType\r\n // supported edmx prop types: primitive types, enum types, primitive collection (incl enum types), entity collection, entity object, complex object\r\n if (isQObjectGen(options.mode)) {\r\n const qFile = await project.createQObjectFile();\r\n generateQueryObjects(dataModel, qFile, version, options, namingHelper);\r\n }\r\n\r\n // Generate Individual OData-Service\r\n if (isServiceGen(options.mode)) {\r\n await project.cleanServiceDir();\r\n await generateServices(dataModel, project, version, namingHelper, options);\r\n }\r\n\r\n await project.writeFiles();\r\n}\r\n"]}
@@ -84,14 +84,23 @@ class DigesterV4 extends DataModelDigestion_1.Digester {
84
84
  qCollection: "QBooleanCollection",
85
85
  qParam: "QBooleanParam",
86
86
  };
87
+ case odata_core_1.ODataTypesV4.Int64:
88
+ case odata_core_1.ODataTypesV4.Decimal:
89
+ if (this.options.v4BigNumberAsString) {
90
+ return {
91
+ outputType: "string",
92
+ qPath: "QBigNumberPath",
93
+ qCollection: "QBigNumberCollection",
94
+ qParam: "QBigNumberParam",
95
+ };
96
+ }
97
+ // yes, intentional fall through!
87
98
  case odata_core_1.ODataTypesV4.Byte:
88
99
  case odata_core_1.ODataTypesV4.SByte:
89
100
  case odata_core_1.ODataTypesV4.Int16:
90
101
  case odata_core_1.ODataTypesV4.Int32:
91
- case odata_core_1.ODataTypesV4.Int64:
92
102
  case odata_core_1.ODataTypesV4.Single:
93
103
  case odata_core_1.ODataTypesV4.Double:
94
- case odata_core_1.ODataTypesV4.Decimal:
95
104
  return {
96
105
  outputType: "number",
97
106
  qPath: "QNumberPath",
@@ -1 +1 @@
1
- {"version":3,"file":"DataModelDigestionV4.js","sourceRoot":"","sources":["../../src/data-model/DataModelDigestionV4.ts"],"names":[],"mappings":"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","sourcesContent":["import { MappedConverterChains, loadConverters } from \"@odata2ts/converter-runtime\";\r\nimport { ODataTypesV4, ODataVersions } from \"@odata2ts/odata-core\";\r\n\r\nimport { DigesterFunction, DigestionOptions } from \"../FactoryFunctionModel\";\r\nimport { Digester, TypeModel } from \"./DataModelDigestion\";\r\nimport { ODataVersion, OperationType, OperationTypes, PropertyModel } from \"./DataTypeModel\";\r\nimport { ComplexType, Property } from \"./edmx/ODataEdmxModelBase\";\r\nimport { ComplexTypeV4, EntityTypeV4, Operation, SchemaV4 } from \"./edmx/ODataEdmxModelV4\";\r\nimport { NamingHelper } from \"./NamingHelper\";\r\n\r\nexport const digest: DigesterFunction<SchemaV4> = async (schemas, options, namingHelper) => {\r\n const converters = await loadConverters(ODataVersions.V2, options.converters);\r\n\r\n const digester = new DigesterV4(schemas, options, namingHelper, converters);\r\n return digester.digest();\r\n};\r\n\r\nclass DigesterV4 extends Digester<SchemaV4, EntityTypeV4, ComplexTypeV4> {\r\n constructor(\r\n schemas: Array<SchemaV4>,\r\n options: DigestionOptions,\r\n namingHelper: NamingHelper,\r\n converters?: MappedConverterChains\r\n ) {\r\n super(ODataVersion.V4, schemas, options, namingHelper, converters);\r\n }\r\n\r\n protected getNavigationProps(entityType: ComplexType | EntityTypeV4): Array<Property> {\r\n return (entityType as EntityTypeV4).NavigationProperty || [];\r\n }\r\n\r\n protected digestOperations(schema: SchemaV4) {\r\n // functions & actions\r\n this.addOperations(schema.$.Namespace, schema.Function, OperationTypes.Function);\r\n this.addOperations(schema.$.Namespace, schema.Action, OperationTypes.Action);\r\n }\r\n\r\n protected digestEntityContainer(schema: SchemaV4) {\r\n if (schema.EntityContainer && schema.EntityContainer.length) {\r\n const container = schema.EntityContainer[0];\r\n\r\n container.ActionImport?.forEach((actionImport) => {\r\n const name = this.namingHelper.getActionName(actionImport.$.Name);\r\n const operationName = this.namingHelper.getActionName(actionImport.$.Action);\r\n\r\n this.dataModel.addAction(name, {\r\n name: name,\r\n odataName: actionImport.$.Name,\r\n operation: this.getRootOperationType(operationName),\r\n });\r\n });\r\n\r\n container.FunctionImport?.forEach((funcImport) => {\r\n const name = this.namingHelper.getFunctionName(funcImport.$.Name);\r\n const operationName = this.namingHelper.getFunctionName(funcImport.$.Function);\r\n\r\n this.dataModel.addFunction(name, {\r\n name,\r\n odataName: funcImport.$.Name,\r\n operation: this.getRootOperationType(operationName),\r\n entitySet: funcImport.$.EntitySet,\r\n });\r\n });\r\n\r\n container.Singleton?.forEach((singleton) => {\r\n const name = singleton.$.Name;\r\n const navPropBindings = singleton.NavigationPropertyBinding || [];\r\n\r\n this.dataModel.addSingleton(name, {\r\n name,\r\n odataName: singleton.$.Name,\r\n entityType: this.dataModel.getModel(this.namingHelper.getModelName(singleton.$.Type)),\r\n navPropBinding: navPropBindings.map((binding) => ({\r\n path: this.namingHelper.stripServicePrefix(binding.$.Path),\r\n target: binding.$.Target,\r\n })),\r\n });\r\n });\r\n\r\n container.EntitySet?.forEach((entitySet) => {\r\n const name = entitySet.$.Name;\r\n const navPropBindings = entitySet.NavigationPropertyBinding || [];\r\n\r\n this.dataModel.addEntitySet(name, {\r\n name,\r\n odataName: entitySet.$.Name,\r\n entityType: this.dataModel.getModel(this.namingHelper.getModelName(entitySet.$.EntityType)),\r\n navPropBinding: navPropBindings.map((binding) => ({\r\n path: this.namingHelper.stripServicePrefix(binding.$.Path),\r\n target: binding.$.Target,\r\n })),\r\n });\r\n });\r\n }\r\n }\r\n\r\n protected mapODataType(type: string): TypeModel {\r\n switch (type) {\r\n case ODataTypesV4.Boolean:\r\n return {\r\n outputType: \"boolean\",\r\n qPath: \"QBooleanPath\",\r\n qCollection: \"QBooleanCollection\",\r\n qParam: \"QBooleanParam\",\r\n };\r\n case ODataTypesV4.Byte:\r\n case ODataTypesV4.SByte:\r\n case ODataTypesV4.Int16:\r\n case ODataTypesV4.Int32:\r\n case ODataTypesV4.Int64:\r\n case ODataTypesV4.Single:\r\n case ODataTypesV4.Double:\r\n case ODataTypesV4.Decimal:\r\n return {\r\n outputType: \"number\",\r\n qPath: \"QNumberPath\",\r\n qCollection: \"QNumberCollection\",\r\n qParam: \"QNumberParam\",\r\n };\r\n case ODataTypesV4.String:\r\n return {\r\n outputType: \"string\",\r\n qPath: \"QStringPath\",\r\n qCollection: \"QStringCollection\",\r\n qParam: \"QStringParam\",\r\n };\r\n case ODataTypesV4.Date:\r\n return {\r\n outputType: \"string\",\r\n qPath: \"QDatePath\",\r\n qCollection: \"QDateCollection\",\r\n qParam: \"QDateParam\",\r\n };\r\n case ODataTypesV4.TimeOfDay:\r\n return {\r\n outputType: \"string\",\r\n qPath: \"QTimeOfDayPath\",\r\n qCollection: \"QTimeOfDayCollection\",\r\n qParam: \"QTimeOfDayParam\",\r\n };\r\n case ODataTypesV4.DateTimeOffset:\r\n return {\r\n outputType: \"string\",\r\n qPath: \"QDateTimeOffsetPath\",\r\n qCollection: \"QDateTimeOffsetCollection\",\r\n qParam: \"QDateTimeOffsetParam\",\r\n };\r\n case ODataTypesV4.Binary:\r\n return {\r\n outputType: \"string\",\r\n qPath: \"QBinaryPath\",\r\n qCollection: \"QBinaryCollection\",\r\n qParam: undefined,\r\n };\r\n case ODataTypesV4.Guid:\r\n return {\r\n outputType: \"string\",\r\n qPath: \"QGuidPath\",\r\n qCollection: \"QGuidCollection\",\r\n qParam: \"QGuidParam\",\r\n };\r\n default:\r\n return {\r\n outputType: \"string\",\r\n qPath: \"QStringPath\",\r\n qCollection: \"QStringCollection\",\r\n qParam: undefined,\r\n };\r\n }\r\n }\r\n\r\n private addOperations(namespace: string, operations: Array<Operation> | undefined, type: OperationTypes) {\r\n if (!operations || !operations.length) {\r\n return;\r\n }\r\n\r\n operations.forEach((op) => {\r\n const params: Array<PropertyModel> = op.Parameter?.map((p) => this.mapProp(p)) ?? [];\r\n const returnType: PropertyModel | undefined = op.ReturnType?.map((rt) => {\r\n return this.mapProp({ ...rt, $: { Name: \"NO_NAME_BECAUSE_RETURN_TYPE\", ...rt.$ } });\r\n })[0];\r\n const isBound = op.$.IsBound === \"true\";\r\n\r\n if (isBound && !params.length) {\r\n throw new Error(`IllegalState: Operation '${op.$.Name}' is bound, but has no parameters!`);\r\n }\r\n\r\n const bindingProp = isBound ? params.shift() : undefined;\r\n const binding = bindingProp\r\n ? bindingProp.isCollection\r\n ? `Collection(${bindingProp.type})`\r\n : bindingProp.type\r\n : DigesterV4.ROOT_OPERATION;\r\n\r\n const name =\r\n type === OperationTypes.Function\r\n ? this.namingHelper.getFunctionName(op.$.Name)\r\n : this.namingHelper.getActionName(op.$.Name);\r\n const qName =\r\n type === OperationTypes.Function\r\n ? this.namingHelper.getQFunctionName(op.$.Name, bindingProp)\r\n : this.namingHelper.getQActionName(op.$.Name, bindingProp);\r\n this.dataModel.addOperationType(binding, {\r\n odataName: isBound ? `${namespace}.${op.$.Name}` : op.$.Name,\r\n name,\r\n qName,\r\n paramsModelName: this.namingHelper.getOperationParamsModelName(op.$.Name, bindingProp),\r\n type: type,\r\n parameters: params,\r\n returnType: returnType,\r\n });\r\n });\r\n }\r\n\r\n private getRootOperationType(name: string): OperationType {\r\n const rootOps = this.dataModel.getOperationTypeByBinding(DigesterV4.ROOT_OPERATION);\r\n const rootOp = rootOps.find((op) => op.name === name);\r\n if (!rootOp) {\r\n throw new Error(`Couldn't find root operation with name [${name}]`);\r\n }\r\n return rootOp;\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"DataModelDigestionV4.js","sourceRoot":"","sources":["../../src/data-model/DataModelDigestionV4.ts"],"names":[],"mappings":"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","sourcesContent":["import { MappedConverterChains, loadConverters } from \"@odata2ts/converter-runtime\";\r\nimport { ODataTypesV4, ODataVersions } from \"@odata2ts/odata-core\";\r\n\r\nimport { DigesterFunction, DigestionOptions } from \"../FactoryFunctionModel\";\r\nimport { Digester, TypeModel } from \"./DataModelDigestion\";\r\nimport { ODataVersion, OperationType, OperationTypes, PropertyModel } from \"./DataTypeModel\";\r\nimport { ComplexType, Property } from \"./edmx/ODataEdmxModelBase\";\r\nimport { ComplexTypeV4, EntityTypeV4, Operation, SchemaV4 } from \"./edmx/ODataEdmxModelV4\";\r\nimport { NamingHelper } from \"./NamingHelper\";\r\n\r\nexport const digest: DigesterFunction<SchemaV4> = async (schemas, options, namingHelper) => {\r\n const converters = await loadConverters(ODataVersions.V2, options.converters);\r\n\r\n const digester = new DigesterV4(schemas, options, namingHelper, converters);\r\n return digester.digest();\r\n};\r\n\r\nclass DigesterV4 extends Digester<SchemaV4, EntityTypeV4, ComplexTypeV4> {\r\n constructor(\r\n schemas: Array<SchemaV4>,\r\n options: DigestionOptions,\r\n namingHelper: NamingHelper,\r\n converters?: MappedConverterChains\r\n ) {\r\n super(ODataVersion.V4, schemas, options, namingHelper, converters);\r\n }\r\n\r\n protected getNavigationProps(entityType: ComplexType | EntityTypeV4): Array<Property> {\r\n return (entityType as EntityTypeV4).NavigationProperty || [];\r\n }\r\n\r\n protected digestOperations(schema: SchemaV4) {\r\n // functions & actions\r\n this.addOperations(schema.$.Namespace, schema.Function, OperationTypes.Function);\r\n this.addOperations(schema.$.Namespace, schema.Action, OperationTypes.Action);\r\n }\r\n\r\n protected digestEntityContainer(schema: SchemaV4) {\r\n if (schema.EntityContainer && schema.EntityContainer.length) {\r\n const container = schema.EntityContainer[0];\r\n\r\n container.ActionImport?.forEach((actionImport) => {\r\n const name = this.namingHelper.getActionName(actionImport.$.Name);\r\n const operationName = this.namingHelper.getActionName(actionImport.$.Action);\r\n\r\n this.dataModel.addAction(name, {\r\n name: name,\r\n odataName: actionImport.$.Name,\r\n operation: this.getRootOperationType(operationName),\r\n });\r\n });\r\n\r\n container.FunctionImport?.forEach((funcImport) => {\r\n const name = this.namingHelper.getFunctionName(funcImport.$.Name);\r\n const operationName = this.namingHelper.getFunctionName(funcImport.$.Function);\r\n\r\n this.dataModel.addFunction(name, {\r\n name,\r\n odataName: funcImport.$.Name,\r\n operation: this.getRootOperationType(operationName),\r\n entitySet: funcImport.$.EntitySet,\r\n });\r\n });\r\n\r\n container.Singleton?.forEach((singleton) => {\r\n const name = singleton.$.Name;\r\n const navPropBindings = singleton.NavigationPropertyBinding || [];\r\n\r\n this.dataModel.addSingleton(name, {\r\n name,\r\n odataName: singleton.$.Name,\r\n entityType: this.dataModel.getModel(this.namingHelper.getModelName(singleton.$.Type)),\r\n navPropBinding: navPropBindings.map((binding) => ({\r\n path: this.namingHelper.stripServicePrefix(binding.$.Path),\r\n target: binding.$.Target,\r\n })),\r\n });\r\n });\r\n\r\n container.EntitySet?.forEach((entitySet) => {\r\n const name = entitySet.$.Name;\r\n const navPropBindings = entitySet.NavigationPropertyBinding || [];\r\n\r\n this.dataModel.addEntitySet(name, {\r\n name,\r\n odataName: entitySet.$.Name,\r\n entityType: this.dataModel.getModel(this.namingHelper.getModelName(entitySet.$.EntityType)),\r\n navPropBinding: navPropBindings.map((binding) => ({\r\n path: this.namingHelper.stripServicePrefix(binding.$.Path),\r\n target: binding.$.Target,\r\n })),\r\n });\r\n });\r\n }\r\n }\r\n\r\n protected mapODataType(type: string): TypeModel {\r\n switch (type) {\r\n case ODataTypesV4.Boolean:\r\n return {\r\n outputType: \"boolean\",\r\n qPath: \"QBooleanPath\",\r\n qCollection: \"QBooleanCollection\",\r\n qParam: \"QBooleanParam\",\r\n };\r\n case ODataTypesV4.Int64:\r\n case ODataTypesV4.Decimal:\r\n if (this.options.v4BigNumberAsString) {\r\n return {\r\n outputType: \"string\",\r\n qPath: \"QBigNumberPath\",\r\n qCollection: \"QBigNumberCollection\",\r\n qParam: \"QBigNumberParam\",\r\n };\r\n }\r\n // yes, intentional fall through!\r\n case ODataTypesV4.Byte:\r\n case ODataTypesV4.SByte:\r\n case ODataTypesV4.Int16:\r\n case ODataTypesV4.Int32:\r\n case ODataTypesV4.Single:\r\n case ODataTypesV4.Double:\r\n return {\r\n outputType: \"number\",\r\n qPath: \"QNumberPath\",\r\n qCollection: \"QNumberCollection\",\r\n qParam: \"QNumberParam\",\r\n };\r\n case ODataTypesV4.String:\r\n return {\r\n outputType: \"string\",\r\n qPath: \"QStringPath\",\r\n qCollection: \"QStringCollection\",\r\n qParam: \"QStringParam\",\r\n };\r\n case ODataTypesV4.Date:\r\n return {\r\n outputType: \"string\",\r\n qPath: \"QDatePath\",\r\n qCollection: \"QDateCollection\",\r\n qParam: \"QDateParam\",\r\n };\r\n case ODataTypesV4.TimeOfDay:\r\n return {\r\n outputType: \"string\",\r\n qPath: \"QTimeOfDayPath\",\r\n qCollection: \"QTimeOfDayCollection\",\r\n qParam: \"QTimeOfDayParam\",\r\n };\r\n case ODataTypesV4.DateTimeOffset:\r\n return {\r\n outputType: \"string\",\r\n qPath: \"QDateTimeOffsetPath\",\r\n qCollection: \"QDateTimeOffsetCollection\",\r\n qParam: \"QDateTimeOffsetParam\",\r\n };\r\n case ODataTypesV4.Binary:\r\n return {\r\n outputType: \"string\",\r\n qPath: \"QBinaryPath\",\r\n qCollection: \"QBinaryCollection\",\r\n qParam: undefined,\r\n };\r\n case ODataTypesV4.Guid:\r\n return {\r\n outputType: \"string\",\r\n qPath: \"QGuidPath\",\r\n qCollection: \"QGuidCollection\",\r\n qParam: \"QGuidParam\",\r\n };\r\n default:\r\n return {\r\n outputType: \"string\",\r\n qPath: \"QStringPath\",\r\n qCollection: \"QStringCollection\",\r\n qParam: undefined,\r\n };\r\n }\r\n }\r\n\r\n private addOperations(namespace: string, operations: Array<Operation> | undefined, type: OperationTypes) {\r\n if (!operations || !operations.length) {\r\n return;\r\n }\r\n\r\n operations.forEach((op) => {\r\n const params: Array<PropertyModel> = op.Parameter?.map((p) => this.mapProp(p)) ?? [];\r\n const returnType: PropertyModel | undefined = op.ReturnType?.map((rt) => {\r\n return this.mapProp({ ...rt, $: { Name: \"NO_NAME_BECAUSE_RETURN_TYPE\", ...rt.$ } });\r\n })[0];\r\n const isBound = op.$.IsBound === \"true\";\r\n\r\n if (isBound && !params.length) {\r\n throw new Error(`IllegalState: Operation '${op.$.Name}' is bound, but has no parameters!`);\r\n }\r\n\r\n const bindingProp = isBound ? params.shift() : undefined;\r\n const binding = bindingProp\r\n ? bindingProp.isCollection\r\n ? `Collection(${bindingProp.type})`\r\n : bindingProp.type\r\n : DigesterV4.ROOT_OPERATION;\r\n\r\n const name =\r\n type === OperationTypes.Function\r\n ? this.namingHelper.getFunctionName(op.$.Name)\r\n : this.namingHelper.getActionName(op.$.Name);\r\n const qName =\r\n type === OperationTypes.Function\r\n ? this.namingHelper.getQFunctionName(op.$.Name, bindingProp)\r\n : this.namingHelper.getQActionName(op.$.Name, bindingProp);\r\n this.dataModel.addOperationType(binding, {\r\n odataName: isBound ? `${namespace}.${op.$.Name}` : op.$.Name,\r\n name,\r\n qName,\r\n paramsModelName: this.namingHelper.getOperationParamsModelName(op.$.Name, bindingProp),\r\n type: type,\r\n parameters: params,\r\n returnType: returnType,\r\n });\r\n });\r\n }\r\n\r\n private getRootOperationType(name: string): OperationType {\r\n const rootOps = this.dataModel.getOperationTypeByBinding(DigesterV4.ROOT_OPERATION);\r\n const rootOp = rootOps.find((op) => op.name === name);\r\n if (!rootOp) {\r\n throw new Error(`Couldn't find root operation with name [${name}]`);\r\n }\r\n return rootOp;\r\n }\r\n}\r\n"]}
@@ -21,9 +21,11 @@ const defaultConfig = {
21
21
  skipIdModels: false,
22
22
  skipOperations: false,
23
23
  skipComments: false,
24
+ enablePrimitivePropertyServices: false,
24
25
  disableAutoManagedKey: false,
25
26
  allowRenaming: false,
26
27
  v2ModelsWithExtraResultsWrapping: false,
28
+ v4BigNumberAsString: false,
27
29
  naming: {
28
30
  models: {
29
31
  namingStrategy: NamingModel_1.NamingStrategies.PASCAL_CASE,
@@ -1 +1 @@
1
- {"version":3,"file":"defaultConfig.js","sourceRoot":"","sources":["../src/defaultConfig.ts"],"names":[],"mappings":"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","sourcesContent":["import deepmerge from \"deepmerge\";\r\n\r\nimport { NameSettings, NamingStrategies } from \"./NamingModel\";\r\nimport { EmitModes, Modes, RunOptions } from \"./OptionModel\";\r\n\r\nexport type DefaultConfiguration = Omit<RunOptions, \"sourceUrl\" | \"source\" | \"output\" | \"serviceName\">;\r\n/**\r\n * The default configuration.\r\n */\r\nconst defaultConfig: DefaultConfiguration = {\r\n sourceUrlConfig: {},\r\n refreshFile: false,\r\n mode: Modes.all,\r\n emitMode: EmitModes.js_dts,\r\n debug: false,\r\n prettier: false,\r\n tsconfig: \"tsconfig.json\",\r\n converters: [],\r\n skipEditableModels: false,\r\n skipIdModels: false,\r\n skipOperations: false,\r\n skipComments: false,\r\n disableAutoManagedKey: false,\r\n allowRenaming: false,\r\n v2ModelsWithExtraResultsWrapping: false,\r\n naming: {\r\n models: {\r\n namingStrategy: NamingStrategies.PASCAL_CASE,\r\n propNamingStrategy: NamingStrategies.CAMEL_CASE,\r\n editableModels: {\r\n prefix: \"Editable\",\r\n suffix: \"\",\r\n applyModelNaming: true,\r\n },\r\n idModels: {\r\n prefix: \"\",\r\n suffix: \"Id\",\r\n applyModelNaming: true,\r\n },\r\n operationParamModels: {\r\n prefix: \"\",\r\n suffix: \"Params\",\r\n applyModelNaming: true,\r\n },\r\n fileName: {\r\n namingStrategy: NamingStrategies.PASCAL_CASE,\r\n prefix: \"\",\r\n suffix: \"Model\",\r\n },\r\n },\r\n queryObjects: {\r\n namingStrategy: NamingStrategies.PASCAL_CASE,\r\n propNamingStrategy: NamingStrategies.CAMEL_CASE,\r\n prefix: \"Q\",\r\n suffix: \"\",\r\n idFunctions: {\r\n prefix: \"\",\r\n suffix: \"Id\",\r\n },\r\n fileName: {\r\n namingStrategy: NamingStrategies.PASCAL_CASE,\r\n prefix: \"Q\",\r\n suffix: \"\",\r\n },\r\n },\r\n services: {\r\n prefix: \"\",\r\n suffix: \"Service\",\r\n namingStrategy: NamingStrategies.PASCAL_CASE,\r\n main: {\r\n applyServiceNaming: true,\r\n },\r\n collection: {\r\n prefix: \"\",\r\n suffix: \"Collection\",\r\n applyServiceNaming: true,\r\n },\r\n operations: {\r\n namingStrategy: NamingStrategies.CAMEL_CASE,\r\n },\r\n relatedServiceGetter: {\r\n namingStrategy: NamingStrategies.CAMEL_CASE,\r\n prefix: \"\",\r\n suffix: \"\",\r\n },\r\n privateProps: {\r\n namingStrategy: NamingStrategies.CAMEL_CASE,\r\n prefix: \"_\",\r\n suffix: \"\",\r\n },\r\n },\r\n },\r\n propertiesByName: [],\r\n entitiesByName: [],\r\n};\r\n\r\nconst { models, queryObjects, services } = defaultConfig.naming;\r\nconst minimalNamingConfig: NameSettings = {\r\n models: {\r\n fileName: {\r\n prefix: models.fileName.prefix,\r\n suffix: models.fileName.suffix,\r\n },\r\n idModels: {\r\n applyModelNaming: true,\r\n prefix: models.idModels.prefix,\r\n suffix: models.idModels.suffix,\r\n },\r\n editableModels: {\r\n applyModelNaming: true,\r\n prefix: models.editableModels.prefix,\r\n suffix: models.editableModels.suffix,\r\n },\r\n operationParamModels: {\r\n applyModelNaming: true,\r\n prefix: models.operationParamModels.prefix,\r\n suffix: models.operationParamModels.suffix,\r\n },\r\n },\r\n queryObjects: {\r\n prefix: queryObjects.prefix,\r\n suffix: queryObjects.suffix,\r\n fileName: {\r\n prefix: queryObjects.fileName.prefix,\r\n suffix: queryObjects.fileName.suffix,\r\n },\r\n idFunctions: {\r\n prefix: queryObjects.idFunctions.prefix,\r\n suffix: queryObjects.idFunctions.suffix,\r\n },\r\n },\r\n services: {\r\n prefix: services.prefix,\r\n suffix: services.suffix,\r\n main: {\r\n applyServiceNaming: true,\r\n },\r\n collection: {\r\n applyServiceNaming: true,\r\n prefix: services.collection.prefix,\r\n suffix: services.collection.suffix,\r\n },\r\n privateProps: {\r\n prefix: services.privateProps.prefix,\r\n suffix: services.privateProps.suffix,\r\n },\r\n relatedServiceGetter: {\r\n prefix: services.relatedServiceGetter.prefix,\r\n suffix: services.relatedServiceGetter.suffix,\r\n },\r\n },\r\n};\r\n\r\n/**\r\n * Creates a defensive copy of the default config.\r\n */\r\nexport function getDefaultConfig(): DefaultConfiguration {\r\n return deepmerge(defaultConfig, {});\r\n}\r\n\r\n/**\r\n * Creates a defensive copy of the minimal config: minimal in respect to naming.\r\n */\r\nexport function getMinimalConfig(): DefaultConfiguration {\r\n const { naming, ...passThrough } = defaultConfig;\r\n return deepmerge(passThrough, { naming: minimalNamingConfig });\r\n}\r\n"]}
1
+ {"version":3,"file":"defaultConfig.js","sourceRoot":"","sources":["../src/defaultConfig.ts"],"names":[],"mappings":"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","sourcesContent":["import deepmerge from \"deepmerge\";\r\n\r\nimport { NameSettings, NamingStrategies } from \"./NamingModel\";\r\nimport { EmitModes, Modes, RunOptions } from \"./OptionModel\";\r\n\r\nexport type DefaultConfiguration = Omit<RunOptions, \"sourceUrl\" | \"source\" | \"output\" | \"serviceName\">;\r\n/**\r\n * The default configuration.\r\n */\r\nconst defaultConfig: DefaultConfiguration = {\r\n sourceUrlConfig: {},\r\n refreshFile: false,\r\n mode: Modes.all,\r\n emitMode: EmitModes.js_dts,\r\n debug: false,\r\n prettier: false,\r\n tsconfig: \"tsconfig.json\",\r\n converters: [],\r\n skipEditableModels: false,\r\n skipIdModels: false,\r\n skipOperations: false,\r\n skipComments: false,\r\n enablePrimitivePropertyServices: false,\r\n disableAutoManagedKey: false,\r\n allowRenaming: false,\r\n v2ModelsWithExtraResultsWrapping: false,\r\n v4BigNumberAsString: false,\r\n naming: {\r\n models: {\r\n namingStrategy: NamingStrategies.PASCAL_CASE,\r\n propNamingStrategy: NamingStrategies.CAMEL_CASE,\r\n editableModels: {\r\n prefix: \"Editable\",\r\n suffix: \"\",\r\n applyModelNaming: true,\r\n },\r\n idModels: {\r\n prefix: \"\",\r\n suffix: \"Id\",\r\n applyModelNaming: true,\r\n },\r\n operationParamModels: {\r\n prefix: \"\",\r\n suffix: \"Params\",\r\n applyModelNaming: true,\r\n },\r\n fileName: {\r\n namingStrategy: NamingStrategies.PASCAL_CASE,\r\n prefix: \"\",\r\n suffix: \"Model\",\r\n },\r\n },\r\n queryObjects: {\r\n namingStrategy: NamingStrategies.PASCAL_CASE,\r\n propNamingStrategy: NamingStrategies.CAMEL_CASE,\r\n prefix: \"Q\",\r\n suffix: \"\",\r\n idFunctions: {\r\n prefix: \"\",\r\n suffix: \"Id\",\r\n },\r\n fileName: {\r\n namingStrategy: NamingStrategies.PASCAL_CASE,\r\n prefix: \"Q\",\r\n suffix: \"\",\r\n },\r\n },\r\n services: {\r\n prefix: \"\",\r\n suffix: \"Service\",\r\n namingStrategy: NamingStrategies.PASCAL_CASE,\r\n main: {\r\n applyServiceNaming: true,\r\n },\r\n collection: {\r\n prefix: \"\",\r\n suffix: \"Collection\",\r\n applyServiceNaming: true,\r\n },\r\n operations: {\r\n namingStrategy: NamingStrategies.CAMEL_CASE,\r\n },\r\n relatedServiceGetter: {\r\n namingStrategy: NamingStrategies.CAMEL_CASE,\r\n prefix: \"\",\r\n suffix: \"\",\r\n },\r\n privateProps: {\r\n namingStrategy: NamingStrategies.CAMEL_CASE,\r\n prefix: \"_\",\r\n suffix: \"\",\r\n },\r\n },\r\n },\r\n propertiesByName: [],\r\n entitiesByName: [],\r\n};\r\n\r\nconst { models, queryObjects, services } = defaultConfig.naming;\r\nconst minimalNamingConfig: NameSettings = {\r\n models: {\r\n fileName: {\r\n prefix: models.fileName.prefix,\r\n suffix: models.fileName.suffix,\r\n },\r\n idModels: {\r\n applyModelNaming: true,\r\n prefix: models.idModels.prefix,\r\n suffix: models.idModels.suffix,\r\n },\r\n editableModels: {\r\n applyModelNaming: true,\r\n prefix: models.editableModels.prefix,\r\n suffix: models.editableModels.suffix,\r\n },\r\n operationParamModels: {\r\n applyModelNaming: true,\r\n prefix: models.operationParamModels.prefix,\r\n suffix: models.operationParamModels.suffix,\r\n },\r\n },\r\n queryObjects: {\r\n prefix: queryObjects.prefix,\r\n suffix: queryObjects.suffix,\r\n fileName: {\r\n prefix: queryObjects.fileName.prefix,\r\n suffix: queryObjects.fileName.suffix,\r\n },\r\n idFunctions: {\r\n prefix: queryObjects.idFunctions.prefix,\r\n suffix: queryObjects.idFunctions.suffix,\r\n },\r\n },\r\n services: {\r\n prefix: services.prefix,\r\n suffix: services.suffix,\r\n main: {\r\n applyServiceNaming: true,\r\n },\r\n collection: {\r\n applyServiceNaming: true,\r\n prefix: services.collection.prefix,\r\n suffix: services.collection.suffix,\r\n },\r\n privateProps: {\r\n prefix: services.privateProps.prefix,\r\n suffix: services.privateProps.suffix,\r\n },\r\n relatedServiceGetter: {\r\n prefix: services.relatedServiceGetter.prefix,\r\n suffix: services.relatedServiceGetter.suffix,\r\n },\r\n },\r\n};\r\n\r\n/**\r\n * Creates a defensive copy of the default config.\r\n */\r\nexport function getDefaultConfig(): DefaultConfiguration {\r\n return deepmerge(defaultConfig, {});\r\n}\r\n\r\n/**\r\n * Creates a defensive copy of the minimal config: minimal in respect to naming.\r\n */\r\nexport function getMinimalConfig(): DefaultConfiguration {\r\n const { naming, ...passThrough } = defaultConfig;\r\n return deepmerge(passThrough, { naming: minimalNamingConfig });\r\n}\r\n"]}
@@ -57,7 +57,7 @@ function evaluateConfigOptions(cliOpts, configOpts) {
57
57
  if (!service) {
58
58
  throw new Error(`Specified service "${s}" doesn't exist in configuration!`);
59
59
  }
60
- const serviceDefault = ((_a = service.naming) === null || _a === void 0 ? void 0 : _a.minimalDefaults) && !((_b = configOpts === null || configOpts === void 0 ? void 0 : configOpts.naming) === null || _b === void 0 ? void 0 : _b.minimalDefaults) ? (0, defaultConfig_1.getMinimalConfig)() : defaultConfig;
60
+ const serviceDefault = ((_a = service.naming) === null || _a === void 0 ? void 0 : _a.minimalDefaults) && !((_b = configOpts.naming) === null || _b === void 0 ? void 0 : _b.minimalDefaults) ? (0, defaultConfig_1.getMinimalConfig)() : defaultConfig;
61
61
  const merged = deepmerge_1.default.all([serviceDefault, confBaseOpts, service, cliBaseOpts]);
62
62
  return safeGuardOptions(merged);
63
63
  });
@@ -1 +1 @@
1
- {"version":3,"file":"evaluateConfig.js","sourceRoot":"","sources":["../src/evaluateConfig.ts"],"names":[],"mappings":"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","sourcesContent":["import deepmerge from \"deepmerge\";\r\n\r\nimport { getDefaultConfig, getMinimalConfig } from \"./defaultConfig\";\r\nimport { CliOptions, ConfigFileOptions, Modes, RunOptions } from \"./OptionModel\";\r\n\r\n/**\r\n * Provides default values and evaluates the various config file and CLI options.\r\n * This function always returns a list of RunOptions,\r\n * whereby each item represents one generation run / one service.\r\n *\r\n * Configurations are merged in the following order (last one wins):\r\n * - default values\r\n * - config file: base settings\r\n * - config file: service specific settings\r\n * - CLI options\r\n *\r\n * If the CLI options specify source and output, then the service config is completely ignored and only the\r\n * base settings are applied from the config file.\r\n *\r\n * If the CLI options do not specify source and output, but do specify services, then these services must\r\n * exist in the config file and each service must supply values for source and output as a minimum.\r\n *\r\n * If the CLI options neither entail source nor services, then at least one service must be configured in the\r\n * config file. All configured services are returned.\r\n *\r\n * @param cliOpts CLI passed options\r\n * @param configOpts config file options\r\n */\r\nexport function evaluateConfigOptions(\r\n cliOpts: CliOptions,\r\n configOpts: ConfigFileOptions | undefined\r\n): Array<RunOptions> {\r\n const defaultConfig = configOpts?.naming?.minimalDefaults ? getMinimalConfig() : getDefaultConfig();\r\n // No config file\r\n if (!configOpts) {\r\n if (!cliOpts.source || !cliOpts.output) {\r\n throw new Error(\"Without any configuration file options --source and --output must be specified!\");\r\n }\r\n return [deepmerge(defaultConfig, cliOpts)];\r\n }\r\n\r\n const { services: cliServices, source, output, ...cliBaseOpts } = cliOpts;\r\n const { services: confServices, ...confBaseOpts } = configOpts;\r\n\r\n // No configurations of services in config file\r\n // or CLI opts specify source and output => ignore service config\r\n if ((source && output) || !confServices) {\r\n if (!source || !output) {\r\n throw new Error(\r\n \"No services were configured in config file, so options --source and --output must be specified!\"\r\n );\r\n }\r\n const merged = deepmerge.all([defaultConfig, confBaseOpts, cliOpts]) as RunOptions;\r\n return [safeGuardOptions(merged)];\r\n }\r\n\r\n // Either services are specified or we use all configured services\r\n const servicesToUse = cliServices?.length ? cliServices : Object.keys(confServices);\r\n return servicesToUse.map((s) => {\r\n const service = confServices[s];\r\n if (!service) {\r\n throw new Error(`Specified service \"${s}\" doesn't exist in configuration!`);\r\n }\r\n const serviceDefault =\r\n service.naming?.minimalDefaults && !configOpts?.naming?.minimalDefaults ? getMinimalConfig() : defaultConfig;\r\n const merged = deepmerge.all([serviceDefault, confBaseOpts, service, cliBaseOpts]) as RunOptions;\r\n return safeGuardOptions(merged);\r\n });\r\n}\r\n\r\n/**\r\n * Make sure that some options are only active if in correct mode.\r\n * @param options\r\n */\r\nfunction safeGuardOptions(options: RunOptions): RunOptions {\r\n // skip options are not valid for service generation\r\n if (options.mode === Modes.service || options.mode === Modes.all) {\r\n options.skipEditableModels = false;\r\n options.skipIdModels = false;\r\n options.skipOperations = false;\r\n }\r\n // special option which is only valid for model generation\r\n if (options.mode !== Modes.models) {\r\n options.v2ModelsWithExtraResultsWrapping = false;\r\n }\r\n\r\n return options;\r\n}\r\n"]}
1
+ {"version":3,"file":"evaluateConfig.js","sourceRoot":"","sources":["../src/evaluateConfig.ts"],"names":[],"mappings":"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","sourcesContent":["import deepmerge from \"deepmerge\";\r\n\r\nimport { getDefaultConfig, getMinimalConfig } from \"./defaultConfig\";\r\nimport { CliOptions, ConfigFileOptions, Modes, RunOptions } from \"./OptionModel\";\r\n\r\n/**\r\n * Provides default values and evaluates the various config file and CLI options.\r\n * This function always returns a list of RunOptions,\r\n * whereby each item represents one generation run / one service.\r\n *\r\n * Configurations are merged in the following order (last one wins):\r\n * - default values\r\n * - config file: base settings\r\n * - config file: service specific settings\r\n * - CLI options\r\n *\r\n * If the CLI options specify source and output, then the service config is completely ignored and only the\r\n * base settings are applied from the config file.\r\n *\r\n * If the CLI options do not specify source and output, but do specify services, then these services must\r\n * exist in the config file and each service must supply values for source and output as a minimum.\r\n *\r\n * If the CLI options neither entail source nor services, then at least one service must be configured in the\r\n * config file. All configured services are returned.\r\n *\r\n * @param cliOpts CLI passed options\r\n * @param configOpts config file options\r\n */\r\nexport function evaluateConfigOptions(\r\n cliOpts: CliOptions,\r\n configOpts: ConfigFileOptions | undefined\r\n): Array<RunOptions> {\r\n const defaultConfig = configOpts?.naming?.minimalDefaults ? getMinimalConfig() : getDefaultConfig();\r\n // No config file\r\n if (!configOpts) {\r\n if (!cliOpts.source || !cliOpts.output) {\r\n throw new Error(\"Without any configuration file options --source and --output must be specified!\");\r\n }\r\n return [deepmerge(defaultConfig, cliOpts)];\r\n }\r\n\r\n const { services: cliServices, source, output, ...cliBaseOpts } = cliOpts;\r\n const { services: confServices, ...confBaseOpts } = configOpts;\r\n\r\n // No configurations of services in config file\r\n // or CLI opts specify source and output => ignore service config\r\n if ((source && output) || !confServices) {\r\n if (!source || !output) {\r\n throw new Error(\r\n \"No services were configured in config file, so options --source and --output must be specified!\"\r\n );\r\n }\r\n const merged = deepmerge.all([defaultConfig, confBaseOpts, cliOpts]) as RunOptions;\r\n return [safeGuardOptions(merged)];\r\n }\r\n\r\n // Either services are specified or we use all configured services\r\n const servicesToUse = cliServices?.length ? cliServices : Object.keys(confServices);\r\n return servicesToUse.map((s) => {\r\n const service = confServices[s];\r\n if (!service) {\r\n throw new Error(`Specified service \"${s}\" doesn't exist in configuration!`);\r\n }\r\n const serviceDefault =\r\n service.naming?.minimalDefaults && !configOpts.naming?.minimalDefaults ? getMinimalConfig() : defaultConfig;\r\n const merged = deepmerge.all([serviceDefault, confBaseOpts, service, cliBaseOpts]) as RunOptions;\r\n return safeGuardOptions(merged);\r\n });\r\n}\r\n\r\n/**\r\n * Make sure that some options are only active if in correct mode.\r\n * @param options\r\n */\r\nfunction safeGuardOptions(options: RunOptions): RunOptions {\r\n // skip options are not valid for service generation\r\n if (options.mode === Modes.service || options.mode === Modes.all) {\r\n options.skipEditableModels = false;\r\n options.skipIdModels = false;\r\n options.skipOperations = false;\r\n }\r\n // special option which is only valid for model generation\r\n if (options.mode !== Modes.models) {\r\n options.v2ModelsWithExtraResultsWrapping = false;\r\n }\r\n\r\n return options;\r\n}\r\n"]}
@@ -2,7 +2,10 @@ import { ODataVersions } from "@odata2ts/odata-core";
2
2
  import { ClassDeclarationStructure } from "ts-morph";
3
3
  import { DataModel } from "../data-model/DataModel";
4
4
  import { NamingHelper } from "../data-model/NamingHelper";
5
+ import { ConfigFileOptions } from "../OptionModel";
5
6
  import { ProjectManager } from "../project/ProjectManager";
6
7
  export interface PropsAndOps extends Required<Pick<ClassDeclarationStructure, "properties" | "methods">> {
7
8
  }
8
- export declare function generateServices(dataModel: DataModel, project: ProjectManager, version: ODataVersions, namingHelper: NamingHelper): Promise<void>;
9
+ export interface ServiceGeneratorOptions extends Pick<ConfigFileOptions, "enablePrimitivePropertyServices" | "v4BigNumberAsString"> {
10
+ }
11
+ export declare function generateServices(dataModel: DataModel, project: ProjectManager, version: ODataVersions, namingHelper: NamingHelper, options?: ServiceGeneratorOptions): Promise<void>;
@@ -14,19 +14,20 @@ const RESPONSE_TYPES = {
14
14
  model: "ODataModelResponse",
15
15
  value: "ODataValueResponse",
16
16
  };
17
- function generateServices(dataModel, project, version, namingHelper) {
17
+ function generateServices(dataModel, project, version, namingHelper, options) {
18
18
  return tslib_1.__awaiter(this, void 0, void 0, function* () {
19
- const generator = new ServiceGenerator(dataModel, project, version, namingHelper);
19
+ const generator = new ServiceGenerator(dataModel, project, version, namingHelper, options);
20
20
  return generator.generate();
21
21
  });
22
22
  }
23
23
  exports.generateServices = generateServices;
24
24
  class ServiceGenerator {
25
- constructor(dataModel, project, version, namingHelper) {
25
+ constructor(dataModel, project, version, namingHelper, options = {}) {
26
26
  this.dataModel = dataModel;
27
27
  this.project = project;
28
28
  this.version = version;
29
29
  this.namingHelper = namingHelper;
30
+ this.options = options;
30
31
  this.generateQOperationProp = (operation) => {
31
32
  return {
32
33
  scope: ts_morph_1.Scope.Private,
@@ -36,6 +37,9 @@ class ServiceGenerator {
36
37
  };
37
38
  };
38
39
  }
40
+ isV4BigNumber() {
41
+ return this.options.v4BigNumberAsString && this.version === odata_core_1.ODataVersions.V4;
42
+ }
39
43
  generate() {
40
44
  return tslib_1.__awaiter(this, void 0, void 0, function* () {
41
45
  const sourceFile = yield this.project.createMainServiceFile();
@@ -52,14 +56,18 @@ class ServiceGenerator {
52
56
  name: serviceName,
53
57
  typeParameters: ["ClientType extends ODataHttpClient"],
54
58
  extends: `${ROOT_SERVICE}<ClientType>`,
55
- properties /*: [
56
- {
57
- scope: Scope.Private,
58
- name: this.namingHelper.getPrivatePropName("name"),
59
- type: "string",
60
- initializer: `"${this.namingHelper.getODataServiceName()}"`,
61
- },
62
- ]*/,
59
+ ctors: this.isV4BigNumber()
60
+ ? [
61
+ {
62
+ parameters: [
63
+ { name: "client", type: "ClientType" },
64
+ { name: "basePath", type: "string" },
65
+ ],
66
+ statements: [`super(client, basePath, true);`],
67
+ },
68
+ ]
69
+ : [],
70
+ properties,
63
71
  methods,
64
72
  });
65
73
  sourceFile.addImportDeclarations(importContainer.getImportDeclarations(false));
@@ -123,9 +131,10 @@ class ServiceGenerator {
123
131
  ],
124
132
  statements: [
125
133
  `const fieldName = "${odataPropName}";`,
134
+ `const { client, path } = this.__base;`,
126
135
  'return typeof id === "undefined" || id === null',
127
- `? new ${collectionName}(this.client, this.getPath(), fieldName)`,
128
- `: new ${serviceName}(this.client, this.getPath(), new ${idFunctionName}(fieldName).buildUrl(id));`,
136
+ `? new ${collectionName}(client, path, fieldName)`,
137
+ `: new ${serviceName}(client, path, new ${idFunctionName}(fieldName).buildUrl(id));`,
129
138
  ],
130
139
  };
131
140
  }
@@ -149,8 +158,9 @@ class ServiceGenerator {
149
158
  name: this.namingHelper.getRelatedServiceGetter(name),
150
159
  statements: [
151
160
  `if(!${propName}) {`,
161
+ ` const { client, path } = this.__base;`,
152
162
  // prettier-ignore
153
- ` ${propName} = new ${serviceType}(this.client, this.getPath(), "${odataName}")`,
163
+ ` ${propName} = new ${serviceType}(client, path, "${odataName}")`,
154
164
  "}",
155
165
  `return ${propName}`,
156
166
  ],
@@ -184,7 +194,7 @@ class ServiceGenerator {
184
194
  { name: "basePath", type: "string" },
185
195
  { name: "name", type: "string" },
186
196
  ],
187
- statements: [`super(client, basePath, name, ${qObjectName});`],
197
+ statements: [`super(client, basePath, name, ${qObjectName}${this.isV4BigNumber() ? ", true" : ""});`],
188
198
  },
189
199
  ],
190
200
  properties,
@@ -192,6 +202,9 @@ class ServiceGenerator {
192
202
  });
193
203
  });
194
204
  }
205
+ getPrimitiveServiceType() {
206
+ return "PrimitiveTypeService" + this.getVersionSuffix();
207
+ }
195
208
  generateServiceProperties(serviceName, props, importContainer) {
196
209
  const collectionServiceType = "CollectionService" + this.getVersionSuffix();
197
210
  const result = { properties: [], methods: [] };
@@ -212,6 +225,10 @@ class ServiceGenerator {
212
225
  result.methods.push(this.generatePrimitiveCollectionGetter(prop, collectionServiceType));
213
226
  }
214
227
  }
228
+ else if (this.options.enablePrimitivePropertyServices && prop.dataType === "PrimitiveType" /* DataTypes.PrimitiveType */) {
229
+ result.properties.push(this.generatePrimitiveTypeProp(prop, importContainer));
230
+ result.methods.push(this.generatePrimitiveTypeGetter(prop));
231
+ }
215
232
  });
216
233
  return result;
217
234
  }
@@ -251,7 +268,7 @@ class ServiceGenerator {
251
268
  generatePrimitiveCollectionProp(prop, collectionServiceType, importContainer) {
252
269
  const isEnum = prop.dataType === "EnumType" /* DataTypes.EnumType */;
253
270
  const type = isEnum ? `EnumCollection<${prop.type}>` : `${(0, upper_case_first_1.upperCaseFirst)(prop.type)}Collection`;
254
- const qType = isEnum ? "QEnumCollection" : `Q${type}`;
271
+ const qType = isEnum ? "QEnumCollection" : prop.qObject;
255
272
  const collectionType = `${collectionServiceType}<ClientType, ${type}, ${qType}>`;
256
273
  if (!prop.qObject) {
257
274
  throw new Error("Illegal State: [qObject] must be provided for Collection types!");
@@ -272,6 +289,19 @@ class ServiceGenerator {
272
289
  hasQuestionToken: true,
273
290
  };
274
291
  }
292
+ generatePrimitiveTypeProp(prop, importContainer) {
293
+ const serviceType = this.getPrimitiveServiceType();
294
+ importContainer.addFromService(serviceType);
295
+ if (prop.typeModule) {
296
+ importContainer.addCustomType(prop.typeModule, prop.type);
297
+ }
298
+ return {
299
+ scope: ts_morph_1.Scope.Private,
300
+ name: this.namingHelper.getPrivatePropName(prop.name),
301
+ type: `${serviceType}<ClientType, ${prop.type}>`,
302
+ hasQuestionToken: true,
303
+ };
304
+ }
275
305
  generateModelPropGetter(prop, collectionServiceType) {
276
306
  const complexType = this.dataModel.getComplexType(prop.type);
277
307
  const isComplexCollection = prop.isCollection && complexType;
@@ -290,8 +320,9 @@ class ServiceGenerator {
290
320
  returnType: typeWithGenerics,
291
321
  statements: [
292
322
  `if(!${privateSrvProp}) {`,
323
+ ` const { client, path } = this.__base;`,
293
324
  // prettier-ignore
294
- ` ${privateSrvProp} = new ${type}(this.client, this.getPath(), "${prop.odataName}"${isComplexCollection ? `, ${(0, processors_1.firstCharLowerCase)(complexType.qName)}` : ""})`,
325
+ ` ${privateSrvProp} = new ${type}(client, path, "${prop.odataName}"${isComplexCollection ? `, ${(0, processors_1.firstCharLowerCase)(complexType.qName)}` : ""})`,
295
326
  "}",
296
327
  `return ${privateSrvProp}`,
297
328
  ],
@@ -304,8 +335,29 @@ class ServiceGenerator {
304
335
  name: this.namingHelper.getRelatedServiceGetter(prop.name),
305
336
  statements: [
306
337
  `if(!${propName}) {`,
338
+ ` const { client, path } = this.__base;`,
307
339
  // prettier-ignore
308
- ` ${propName} = new ${collectionServiceType}(this.client, this.getPath(), "${prop.odataName}", ${(0, processors_1.firstCharLowerCase)(prop.qObject)})`,
340
+ ` ${propName} = new ${collectionServiceType}(client, path, "${prop.odataName}", ${(0, processors_1.firstCharLowerCase)(prop.qObject)}${this.isV4BigNumber() ? ", true" : ""})`,
341
+ "}",
342
+ `return ${propName}`,
343
+ ],
344
+ };
345
+ }
346
+ generatePrimitiveTypeGetter(prop) {
347
+ const serviceType = this.getPrimitiveServiceType();
348
+ const propName = "this." + this.namingHelper.getPrivatePropName(prop.name);
349
+ // for V2: mapped name must be specified
350
+ const useMappedName = this.version === odata_core_1.ODataVersions.V2 && prop.name !== prop.odataName;
351
+ // for V4: big number support
352
+ const useBigNumber = this.isV4BigNumber();
353
+ const addParamString = useMappedName ? `, "${prop.name}"` : useBigNumber ? ", true" : "";
354
+ return {
355
+ scope: ts_morph_1.Scope.Public,
356
+ name: this.namingHelper.getRelatedServiceGetter(prop.name),
357
+ statements: [
358
+ `if(!${propName}) {`,
359
+ ` const { client, path, qModel } = this.__base;`,
360
+ ` ${propName} = new ${serviceType}(client, path, "${prop.odataName}", qModel.${prop.name}.converter${addParamString})`,
309
361
  "}",
310
362
  `return ${propName}`,
311
363
  ],
@@ -334,7 +386,9 @@ class ServiceGenerator {
334
386
  { name: "basePath", type: "string" },
335
387
  { name: "name", type: "string" },
336
388
  ],
337
- statements: [`super(client, basePath, name, ${qObjectName}, new ${model.qIdFunctionName}(name));`],
389
+ statements: [
390
+ `super(client, basePath, name, ${qObjectName}, new ${model.qIdFunctionName}(name)${this.isV4BigNumber() ? ", true" : ""});`,
391
+ ],
338
392
  },
339
393
  ],
340
394
  properties,
@@ -406,15 +460,16 @@ class ServiceGenerator {
406
460
  `if(!${qOpProp}) {`,
407
461
  ` ${qOpProp} = new ${operation.qName}()`,
408
462
  "}",
409
- `const url = this.addFullPath(${qOpProp}.buildUrl(${isFunc && hasParams ? "params" : ""}));`,
410
- `${returnType ? "const response = await " : "return"} this.client.${!isFunc
463
+ `const { addFullPath, client, getDefaultHeaders } = this.__base;`,
464
+ `const url = addFullPath(${qOpProp}.buildUrl(${isFunc && hasParams ? "params" : ""}));`,
465
+ `${returnType ? "const response = await " : "return"} client.${!isFunc
411
466
  ? // actions: since V4
412
- `post(url, ${hasParams ? `${qOpProp}.convertUserParams(params)` : "{}"}, ${requestConfigParam.name})`
467
+ `post(url, ${hasParams ? `${qOpProp}.convertUserParams(params)` : "{}"}, ${requestConfigParam.name}, getDefaultHeaders())`
413
468
  : operation.usePost
414
469
  ? // V2 POST => BUT values are still query params, they are not part of the request body
415
- `post(url, undefined, ${requestConfigParam.name})`
470
+ `post(url, undefined, ${requestConfigParam.name}, getDefaultHeaders())`
416
471
  : // functions: since V2
417
- `get(url, ${requestConfigParam.name})`};`,
472
+ `get(url, ${requestConfigParam.name}, getDefaultHeaders())`};`,
418
473
  returnType ? `return ${qOpProp}.convertResponse(response);` : "",
419
474
  ],
420
475
  };
@@ -1 +1 @@
1
- {"version":3,"file":"ServiceGenerator.js","sourceRoot":"","sources":["../../src/generator/ServiceGenerator.ts"],"names":[],"mappings":";;;;AAAA,qDAAqD;AACrD,kEAAkC;AAClC,uCAOkB;AAClB,uDAAkD;AAClD,sDAA2D;AAiB3D,uDAAoD;AAEpD,MAAM,YAAY,GAAG,cAAc,CAAC;AAEpC,MAAM,cAAc,GAAG;IACrB,UAAU,EAAE,yBAAyB;IACrC,KAAK,EAAE,oBAAoB;IAC3B,KAAK,EAAE,oBAAoB;CAC5B,CAAC;AAIF,SAAsB,gBAAgB,CACpC,SAAoB,EACpB,OAAuB,EACvB,OAAsB,EACtB,YAA0B;;QAE1B,MAAM,SAAS,GAAG,IAAI,gBAAgB,CAAC,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,YAAY,CAAC,CAAC;QAClF,OAAO,SAAS,CAAC,QAAQ,EAAE,CAAC;IAC9B,CAAC;CAAA;AARD,4CAQC;AAED,MAAM,gBAAgB;IACpB,YACU,SAAoB,EACpB,OAAuB,EACvB,OAAsB,EACtB,YAA0B;QAH1B,cAAS,GAAT,SAAS,CAAW;QACpB,YAAO,GAAP,OAAO,CAAgB;QACvB,YAAO,GAAP,OAAO,CAAe;QACtB,iBAAY,GAAZ,YAAY,CAAc;QA8I5B,2BAAsB,GAAG,CAAC,SAAwB,EAAE,EAAE;YAC5D,OAAO;gBACL,KAAK,EAAE,gBAAK,CAAC,OAAO;gBACpB,IAAI,EAAE,IAAI,CAAC,YAAY,CAAC,kBAAkB,CAAC,SAAS,CAAC,KAAK,CAAC;gBAC3D,IAAI,EAAE,SAAS,CAAC,KAAK;gBACrB,gBAAgB,EAAE,IAAI;aACvB,CAAC;QACJ,CAAC,CAAC;IApJC,CAAC;IAES,QAAQ;;YACnB,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,qBAAqB,EAAE,CAAC;YAC9D,MAAM,WAAW,GAAG,IAAI,CAAC,YAAY,CAAC,kBAAkB,EAAE,CAAC;YAC3D,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,kBAAkB,EAAE,CAAC;YACtD,MAAM,iBAAiB,GAAG,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,SAAS,CAAC,EAAE,GAAG,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;YAEvG,MAAM,IAAI,CAAC,qBAAqB,EAAE,CAAC;YAEnC,MAAM,eAAe,GAAG,IAAI,iCAAe,CAAC,IAAI,CAAC,YAAY,CAAC,YAAY,EAAE,CAAC,CAAC;YAC9E,eAAe,CAAC,gBAAgB,CAAC,iBAAiB,CAAC,CAAC;YACpD,eAAe,CAAC,cAAc,CAAC,YAAY,CAAC,CAAC;YAE7C,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,GAAgB,IAAA,mBAAS,EACpD,IAAI,CAAC,6BAA6B,CAAC,SAAS,EAAE,eAAe,CAAC,EAC9D,IAAI,CAAC,6BAA6B,CAAC,iBAAiB,EAAE,eAAe,CAAC,CACvE,CAAC;YAEF,UAAU,CAAC,QAAQ,CAAC;gBAClB,UAAU,EAAE,IAAI;gBAChB,IAAI,EAAE,WAAW;gBACjB,cAAc,EAAE,CAAC,oCAAoC,CAAC;gBACtD,OAAO,EAAE,GAAG,YAAY,cAAc;gBACtC,UAAU,CAAC;;;;;;;mBAOR;gBACH,OAAO;aACR,CAAC,CAAC;YAEH,UAAU,CAAC,qBAAqB,CAAC,eAAe,CAAC,qBAAqB,CAAC,KAAK,CAAC,CAAC,CAAC;QACjF,CAAC;KAAA;IAEO,6BAA6B,CACnC,SAA+B,EAC/B,eAAgC;QAEhC,MAAM,MAAM,GAAgB,EAAE,UAAU,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;QAE5D,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,UAAU,EAAE,EAAE,EAAE;YAC9E,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,4BAA4B,CAAC,IAAI,EAAE,SAAS,EAAE,UAAU,EAAE,eAAe,CAAC,CAAC,CAAC;QACvG,CAAC,CAAC,CAAC;QAEH,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,CAAC,SAAS,EAAE,EAAE;YACxD,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,qBAAqB,CAAC,SAAS,EAAE,eAAe,CAAC,CAAC,CAAC;YAC/E,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,uBAAuB,CAAC,SAAS,CAAC,CAAC,CAAC;QAC/D,CAAC,CAAC,CAAC;QAEH,OAAO,MAAM,CAAC;IAChB,CAAC;IAEO,6BAA6B,CACnC,GAAiD,EACjD,eAAgC;QAEhC,MAAM,MAAM,GAAgB,EAAE,UAAU,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;QAE5D,GAAG,CAAC,OAAO,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,EAAE,EAAE;YAClC,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,sBAAsB,CAAC,SAAS,CAAC,CAAC,CAAC;YAC/D,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE,SAAS,EAAE,eAAe,CAAC,CAAC,CAAC;QAC7E,CAAC,CAAC,CAAC;QAEH,OAAO,MAAM,CAAC;IAChB,CAAC;IAEO,4BAA4B,CAClC,QAAgB,EAChB,aAAqB,EACrB,UAAqB,EACrB,eAAgC,EAChC,kBAA2B;QAE3B,MAAM,MAAM,GAAG,UAAU,CAAC,WAAW,CAAC;QACtC,MAAM,cAAc,GAAG,UAAU,CAAC,eAAe,CAAC;QAClD,MAAM,WAAW,GAAG,IAAI,CAAC,YAAY,CAAC,cAAc,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QACtE,MAAM,cAAc,GAAG,IAAI,CAAC,YAAY,CAAC,wBAAwB,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QAEnF,eAAe,CAAC,gBAAgB,CAAC,iBAAiB,CAAC,CAAC;QACpD,eAAe,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC;QAC1C,eAAe,CAAC,mBAAmB,CAAC,cAAc,CAAC,CAAC;QACpD,yDAAyD;QACzD,IAAI,CAAC,kBAAkB,IAAI,kBAAkB,KAAK,WAAW,EAAE;YAC7D,eAAe,CAAC,mBAAmB,CAAC,WAAW,EAAE,cAAc,EAAE,WAAW,CAAC,CAAC;SAC/E;QAED,OAAO;YACL,KAAK,EAAE,gBAAK,CAAC,MAAM;YACnB,IAAI,EAAE,IAAI,CAAC,YAAY,CAAC,uBAAuB,CAAC,QAAQ,CAAC;YACzD,UAAU,EAAE;gBACV;oBACE,IAAI,EAAE,IAAI;oBACV,IAAI,EAAE,GAAG,MAAM,cAAc;oBAC7B,gBAAgB,EAAE,IAAI;iBACvB;aACF;YACD,SAAS,EAAE;gBACT;oBACE,UAAU,EAAE,EAAE;oBACd,UAAU,EAAE,GAAG,cAAc,cAAc;iBAC5C;gBACD;oBACE,UAAU,EAAE;wBACV;4BACE,IAAI,EAAE,IAAI;4BACV,IAAI,EAAE,MAAM;yBACb;qBACF;oBACD,UAAU,EAAE,GAAG,WAAW,cAAc;iBACzC;aACF;YACD,UAAU,EAAE;gBACV,sBAAsB,aAAa,IAAI;gBACvC,iDAAiD;gBACjD,SAAS,cAAc,0CAA0C;gBACjE,SAAS,WAAW,qCAAqC,cAAc,4BAA4B;aACpG;SACF,CAAC;IACJ,CAAC;IAEO,qBAAqB,CAC3B,SAAwB,EACxB,eAAgC;QAEhC,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,SAAS,CAAC;QACvC,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY,CAAC,cAAc,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QAE/D,eAAe,CAAC,mBAAmB,CAAC,IAAI,CAAC,YAAY,CAAC,cAAc,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,CAAC;QAE7F,OAAO;YACL,KAAK,EAAE,gBAAK,CAAC,OAAO;YACpB,IAAI,EAAE,IAAI,CAAC,YAAY,CAAC,kBAAkB,CAAC,IAAI,CAAC;YAChD,IAAI,EAAE,GAAG,IAAI,cAAc;YAC3B,gBAAgB,EAAE,IAAI;SACvB,CAAC;IACJ,CAAC;IAWO,uBAAuB,CAAC,SAAwB;QACtD,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,UAAU,EAAE,GAAG,SAAS,CAAC;QAClD,MAAM,QAAQ,GAAG,OAAO,GAAG,IAAI,CAAC,YAAY,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC;QACtE,MAAM,WAAW,GAAG,IAAI,CAAC,YAAY,CAAC,cAAc,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QAEtE,OAAO;YACL,KAAK,EAAE,gBAAK,CAAC,MAAM;YACnB,IAAI,EAAE,IAAI,CAAC,YAAY,CAAC,uBAAuB,CAAC,IAAI,CAAC;YACrD,UAAU,EAAE;gBACV,OAAO,QAAQ,KAAK;gBACpB,kBAAkB;gBAClB,KAAK,QAAQ,UAAU,WAAW,kCAAkC,SAAS,IAAI;gBACjF,GAAG;gBACH,UAAU,QAAQ,EAAE;aACrB;SACF,CAAC;IACJ,CAAC;IAEO,gBAAgB;QACtB,OAAO,IAAI,CAAC,OAAO,KAAK,0BAAa,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;IACzD,CAAC;IAEa,yBAAyB,CACrC,KAAkB,EAClB,WAAmB,EACnB,WAAuB,EACvB,eAAgC;;YAEhC,MAAM,iBAAiB,GAAG,mBAAmB,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAC;YAExE,MAAM,iBAAiB,GAAG,KAAK,CAAC,YAAY,CAAC;YAC7C,MAAM,WAAW,GAAG,IAAA,+BAAkB,EAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YACpD,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,yBAAyB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACxE,MAAM,KAAK,GAAG,CAAC,GAAG,KAAK,CAAC,SAAS,EAAE,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC;YAEnD,eAAe,CAAC,cAAc,CAAC,iBAAiB,CAAC,CAAC;YAClD,eAAe,CAAC,gBAAgB,CAAC,iBAAiB,CAAC,CAAC;YACpD,eAAe,CAAC,iBAAiB,CAAC,KAAK,CAAC,IAAI,EAAE,iBAAiB,CAAC,CAAC;YACjE,eAAe,CAAC,mBAAmB,CAAC,KAAK,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;YAE9D,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,GAAgB,IAAA,mBAAS,EACpD,IAAI,CAAC,yBAAyB,CAAC,WAAW,EAAE,KAAK,EAAE,eAAe,CAAC,EACnE,IAAI,CAAC,yBAAyB,CAAC,UAAU,EAAE,eAAe,CAAC,CAC5D,CAAC;YAEF,6BAA6B;YAC7B,WAAW,CAAC,QAAQ,CAAC;gBACnB,UAAU,EAAE,IAAI;gBAChB,IAAI,EAAE,WAAW;gBACjB,cAAc,EAAE,CAAC,oCAAoC,CAAC;gBACtD,OAAO,EAAE,iBAAiB,GAAG,gBAAgB,KAAK,CAAC,IAAI,KAAK,iBAAiB,KAAK,KAAK,CAAC,KAAK,GAAG;gBAChG,KAAK,EAAE;oBACL;wBACE,UAAU,EAAE;4BACV,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,YAAY,EAAE;4BACtC,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,QAAQ,EAAE;4BACpC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE;yBACjC;wBACD,UAAU,EAAE,CAAC,iCAAiC,WAAW,IAAI,CAAC;qBAC/D;iBACF;gBACD,UAAU;gBACV,OAAO;aACR,CAAC,CAAC;QACL,CAAC;KAAA;IAEO,yBAAyB,CAC/B,WAAmB,EACnB,KAA2B,EAC3B,eAAgC;QAEhC,MAAM,qBAAqB,GAAG,mBAAmB,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAC;QAC5E,MAAM,MAAM,GAAgB,EAAE,UAAU,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;QAE5D,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;YACrB,IAAI,CAAC,IAAI,CAAC,QAAQ,0CAAwB,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,IAAI,CAAC,QAAQ,8CAA0B,EAAE;gBAC5G,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,IAAI,EAAE,qBAAqB,EAAE,WAAW,EAAE,eAAe,CAAC,CAAC,CAAC;gBAC1G,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,uBAAuB,CAAC,IAAI,EAAE,qBAAqB,CAAC,CAAC,CAAC;aAChF;iBAAM,IAAI,IAAI,CAAC,YAAY,EAAE;gBAC5B,6BAA6B;gBAC7B,IAAI,IAAI,CAAC,QAAQ,0CAAwB,EAAE;oBACzC,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;oBACtD,MAAM,CAAC,OAAO,CAAC,IAAI,CACjB,IAAI,CAAC,4BAA4B,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,EAAE,UAAU,EAAE,eAAe,EAAE,WAAW,CAAC,CACvG,CAAC;iBACH;gBACD,2CAA2C;qBACtC;oBACH,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,+BAA+B,CAAC,IAAI,EAAE,qBAAqB,EAAE,eAAe,CAAC,CAAC,CAAC;oBAC3G,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,iCAAiC,CAAC,IAAI,EAAE,qBAAqB,CAAC,CAAC,CAAC;iBAC1F;aACF;QACH,CAAC,CAAC,CAAC;QAEH,OAAO,MAAM,CAAC;IAChB,CAAC;IAEO,yBAAyB,CAAC,UAAgC,EAAE,eAAgC;QAClG,MAAM,MAAM,GAAgB,EAAE,UAAU,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;QAE5D,UAAU,CAAC,OAAO,CAAC,CAAC,SAAS,EAAE,EAAE;YAC/B,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,sBAAsB,CAAC,SAAS,CAAC,CAAC,CAAC;YAC/D,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,IAAI,EAAE,SAAS,EAAE,eAAe,CAAC,CAAC,CAAC;QACvF,CAAC,CAAC,CAAC;QAEH,OAAO,MAAM,CAAC;IAChB,CAAC;IAEO,iBAAiB,CACvB,IAAmB,EACnB,qBAA6B,EAC7B,WAAmB,EACnB,eAAgC;QAEhC,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC7D,MAAM,GAAG,GAAG,IAAI,CAAC,YAAY,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACxD,IAAI,aAAa,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,wBAAwB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;QAEpG,IAAI,IAAI,CAAC,YAAY,IAAI,WAAW,EAAE;YACpC,MAAM,YAAY,GAAG,WAAW,CAAC,YAAY,CAAC;YAC9C,eAAe,CAAC,cAAc,CAAC,qBAAqB,CAAC,CAAC;YACtD,eAAe,CAAC,iBAAiB,CAAC,WAAW,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;YAClE,eAAe,CAAC,mBAAmB,CAAC,WAAW,CAAC,KAAK,EAAE,IAAA,+BAAkB,EAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC;YAC9F,aAAa,GAAG,GAAG,qBAAqB,gBAAgB,WAAW,CAAC,IAAI,KAAK,WAAW,CAAC,KAAK,KAAK,YAAY,GAAG,CAAC;SACpH;aAAM;YACL,sCAAsC;YACtC,IAAI,WAAW,KAAK,GAAG,EAAE;gBACvB,eAAe,CAAC,mBAAmB,CAAC,GAAG,EAAE,aAAa,CAAC,CAAC;aACzD;YAED,aAAa,GAAG,GAAG,aAAa,cAAc,CAAC;SAChD;QAED,OAAO;YACL,KAAK,EAAE,gBAAK,CAAC,OAAO;YACpB,IAAI,EAAE,IAAI,CAAC,YAAY,CAAC,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC;YACrD,IAAI,EAAE,aAAa;YACnB,gBAAgB,EAAE,IAAI;SACS,CAAC;IACpC,CAAC;IAEO,+BAA+B,CACrC,IAAmB,EACnB,qBAA6B,EAC7B,eAAgC;QAEhC,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,wCAAuB,CAAC;QACpD,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,kBAAkB,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,GAAG,IAAA,iCAAc,EAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC;QAChG,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC;QACtD,MAAM,cAAc,GAAG,GAAG,qBAAqB,gBAAgB,IAAI,KAAK,KAAK,GAAG,CAAC;QAEjF,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE;YACjB,MAAM,IAAI,KAAK,CAAC,iEAAiE,CAAC,CAAC;SACpF;QAED,eAAe,CAAC,cAAc,CAAC,qBAAqB,CAAC,CAAC;QACtD,eAAe,CAAC,cAAc,CAAC,IAAI,CAAC,OAAO,EAAE,IAAA,+BAAkB,EAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;QAC/E,IAAI,MAAM,EAAE;YACV,eAAe,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC7C,eAAe,CAAC,cAAc,CAAC,gBAAgB,CAAC,CAAC;SAClD;aAAM;YACL,eAAe,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;SACtC;QAED,OAAO;YACL,KAAK,EAAE,gBAAK,CAAC,OAAO;YACpB,IAAI,EAAE,IAAI,CAAC,YAAY,CAAC,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC;YACrD,IAAI,EAAE,GAAG,cAAc,EAAE;YACzB,gBAAgB,EAAE,IAAI;SACvB,CAAC;IACJ,CAAC;IAEO,uBAAuB,CAC7B,IAAmB,EACnB,qBAA6B;QAE7B,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC7D,MAAM,mBAAmB,GAAG,IAAI,CAAC,YAAY,IAAI,WAAW,CAAC;QAC7D,MAAM,IAAI,GAAG,mBAAmB;YAC9B,CAAC,CAAC,qBAAqB;YACvB,CAAC,CAAC,IAAI,CAAC,YAAY;gBACnB,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,wBAAwB,CAAC,IAAI,CAAC,IAAI,CAAC;gBACvD,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAChD,MAAM,gBAAgB,GAAG,mBAAmB;YAC1C,CAAC,CAAC,GAAG,qBAAqB,gBAAgB,WAAW,CAAC,IAAI,KAAK,WAAW,CAAC,KAAK,KAAK,WAAW,CAAC,YAAY,GAAG;YAChH,CAAC,CAAC,GAAG,IAAI,cAAc,CAAC;QAE1B,MAAM,cAAc,GAAG,OAAO,GAAG,IAAI,CAAC,YAAY,CAAC,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAEjF,OAAO;YACL,KAAK,EAAE,gBAAK,CAAC,MAAM;YACnB,IAAI,EAAE,IAAI,CAAC,YAAY,CAAC,uBAAuB,CAAC,IAAI,CAAC,IAAI,CAAC;YAC1D,UAAU,EAAE,gBAAgB;YAC5B,UAAU,EAAE;gBACV,OAAO,cAAc,KAAK;gBAC1B,kBAAkB;gBAClB,KAAK,cAAc,UAAU,IAAI,kCAAkC,IAAI,CAAC,SAAS,IAAI,mBAAmB,CAAC,CAAC,CAAC,KAAK,IAAA,+BAAkB,EAAC,WAAW,CAAC,KAAK,CAAC,EAAE,CAAA,CAAC,CAAC,EAAE,GAAG;gBAC9J,GAAG;gBACH,UAAU,cAAc,EAAE;aAC3B;SACF,CAAC;IACJ,CAAC;IAEO,iCAAiC,CACvC,IAAmB,EACnB,qBAA6B;QAE7B,MAAM,QAAQ,GAAG,OAAO,GAAG,IAAI,CAAC,YAAY,CAAC,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC3E,OAAO;YACL,KAAK,EAAE,gBAAK,CAAC,MAAM;YACnB,IAAI,EAAE,IAAI,CAAC,YAAY,CAAC,uBAAuB,CAAC,IAAI,CAAC,IAAI,CAAC;YAC1D,UAAU,EAAE;gBACV,OAAO,QAAQ,KAAK;gBACpB,kBAAkB;gBAClB,KAAK,QAAQ,UAAU,qBAAqB,kCAAkC,IAAI,CAAC,SAAS,MAAM,IAAA,+BAAkB,EAAC,IAAI,CAAC,OAAQ,CAAC,GAAG;gBACtI,GAAG;gBACH,UAAU,QAAQ,EAAE;aACrB;SACF,CAAC;IACJ,CAAC;IAEa,+BAA+B,CAC3C,KAAgB,EAChB,WAAuB,EACvB,eAAgC;;YAEhC,MAAM,oBAAoB,GAAG,kBAAkB,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAC;YAC1E,MAAM,iBAAiB,GAAG,KAAK,CAAC,YAAY,CAAC;YAC7C,MAAM,WAAW,GAAG,IAAA,+BAAkB,EAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YAEpD,eAAe,CAAC,cAAc,CAAC,oBAAoB,CAAC,CAAC;YACrD,eAAe,CAAC,iBAAiB,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;YACrD,eAAe,CAAC,mBAAmB,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;YAE3D,MAAM,oBAAoB,GAAG,IAAI,CAAC,SAAS,CAAC,yBAAyB,CAAC,cAAc,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC;YAEnG,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC,yBAAyB,CAAC,oBAAoB,EAAE,eAAe,CAAC,CAAC;YAEtG,WAAW,CAAC,QAAQ,CAAC;gBACnB,UAAU,EAAE,IAAI;gBAChB,IAAI,EAAE,IAAI,CAAC,YAAY,CAAC,wBAAwB,CAAC,KAAK,CAAC,IAAI,CAAC;gBAC5D,cAAc,EAAE,CAAC,oCAAoC,CAAC;gBACtD,OAAO,EACL,oBAAoB;oBACpB,gBAAgB,KAAK,CAAC,IAAI,KAAK,iBAAiB,KAAK,KAAK,CAAC,KAAK,KAAK,KAAK,CAAC,WAAW,GAAG;gBAC3F,KAAK,EAAE;oBACL;wBACE,UAAU,EAAE;4BACV,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,YAAY,EAAE;4BACtC,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,QAAQ,EAAE;4BACpC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE;yBACjC;wBACD,UAAU,EAAE,CAAC,iCAAiC,WAAW,SAAS,KAAK,CAAC,eAAe,UAAU,CAAC;qBACnG;iBACF;gBACD,UAAU;gBACV,OAAO;aACR,CAAC,CAAC;QACL,CAAC;KAAA;IAEa,qBAAqB;;YACjC,gGAAgG;YAChG,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,SAAS,CAAC,SAAS,EAAE,EAAE;gBAC9C,MAAM,WAAW,GAAG,IAAI,CAAC,YAAY,CAAC,cAAc,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBACjE,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,iBAAiB,CAAC,WAAW,CAAC,CAAC;gBACtE,MAAM,eAAe,GAAG,IAAI,iCAAe,CAAC,IAAI,CAAC,YAAY,CAAC,YAAY,EAAE,CAAC,CAAC;gBAE9E,sBAAsB;gBACtB,MAAM,IAAI,CAAC,yBAAyB,CAAC,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,eAAe,CAAC,CAAC;gBAEvF,4BAA4B;gBAC5B,MAAM,IAAI,CAAC,+BAA+B,CAAC,KAAK,EAAE,WAAW,EAAE,eAAe,CAAC,CAAC;gBAEhF,WAAW,CAAC,qBAAqB,CAAC,eAAe,CAAC,qBAAqB,CAAC,IAAI,CAAC,CAAC,CAAC;aAChF;YAED,uCAAuC;YACvC,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,SAAS,CAAC,eAAe,EAAE,EAAE;gBACpD,MAAM,WAAW,GAAG,IAAI,CAAC,YAAY,CAAC,cAAc,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBACjE,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,iBAAiB,CAAC,WAAW,CAAC,CAAC;gBACtE,MAAM,eAAe,GAAG,IAAI,iCAAe,CAAC,IAAI,CAAC,YAAY,CAAC,YAAY,EAAE,CAAC,CAAC;gBAE9E,sBAAsB;gBACtB,MAAM,IAAI,CAAC,yBAAyB,CAAC,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,eAAe,CAAC,CAAC;gBACvF,WAAW,CAAC,qBAAqB,CAAC,eAAe,CAAC,qBAAqB,CAAC,IAAI,CAAC,CAAC,CAAC;aAChF;QACH,CAAC;KAAA;IAEO,cAAc,CACpB,IAAY,EACZ,SAAwB,EACxB,eAAgC;;QAEhC,MAAM,MAAM,GAAG,SAAS,CAAC,IAAI,6CAA4B,CAAC;QAC1D,MAAM,SAAS,GAAG,CAAA,MAAA,SAAS,CAAC,UAAU,0CAAE,YAAY;YAClD,CAAC,CAAC,cAAc,CAAC,UAAU,GAAG,IAAI,CAAC,gBAAgB,EAAE;YACrD,CAAC,CAAC,CAAA,MAAA,SAAS,CAAC,UAAU,0CAAE,QAAQ,mDAA4B;gBAC5D,CAAC,CAAC,cAAc,CAAC,KAAK,GAAG,IAAI,CAAC,gBAAgB,EAAE;gBAChD,CAAC,CAAC,cAAc,CAAC,KAAK,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACnD,MAAM,UAAU,GAAG,SAAS,CAAC,UAAU,CAAC;QACxC,MAAM,kBAAkB,GAAG;YACzB,IAAI,EAAE,eAAe;YACrB,gBAAgB,EAAE,IAAI;YACtB,IAAI,EAAE,mCAAmC;SAC1C,CAAC;QACF,MAAM,SAAS,GAAG,SAAS,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC;QAElD,yBAAyB;QACzB,eAAe,CAAC,gBAAgB,CAAC,uBAAuB,EAAE,eAAe,CAAC,CAAC;QAC3E,eAAe,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;QACvC,IAAI,UAAU,aAAV,UAAU,uBAAV,UAAU,CAAE,IAAI,EAAE;YACpB,IAAI,uHAAgE,CAAC,QAAQ,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE;gBAClG,eAAe,CAAC,iBAAiB,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;aACpD;SACF;QACD,eAAe,CAAC,mBAAmB,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QACrD,IAAI,SAAS,EAAE;YACb,eAAe,CAAC,iBAAiB,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC;SAC9D;QAED,MAAM,OAAO,GAAG,OAAO,GAAG,IAAI,CAAC,YAAY,CAAC,kBAAkB,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QAEhF,OAAO;YACL,KAAK,EAAE,gBAAK,CAAC,MAAM;YACnB,OAAO,EAAE,IAAI;YACb,IAAI;YACJ,UAAU,EAAE,SAAS;gBACnB,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,CAAC,eAAe,EAAE,EAAE,kBAAkB,CAAC;gBAC3E,CAAC,CAAC,CAAC,kBAAkB,CAAC;YACxB,UAAU,EAAE,iBAAiB,SAAS,IAAI,CAAA,UAAU,aAAV,UAAU,uBAAV,UAAU,CAAE,IAAI,KAAI,MAAM,IAAI;YACxE,UAAU,EAAE;gBACV,OAAO,OAAO,KAAK;gBACnB,KAAK,OAAO,UAAU,SAAS,CAAC,KAAK,IAAI;gBACzC,GAAG;gBAEH,gCAAgC,OAAO,aAAa,MAAM,IAAI,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,KAAK;gBAC5F,GAAG,UAAU,CAAC,CAAC,CAAC,yBAAyB,CAAC,CAAC,CAAC,QAAQ,gBAClD,CAAC,MAAM;oBACL,CAAC,CAAC,oBAAoB;wBACpB,aAAa,SAAS,CAAC,CAAC,CAAC,GAAG,OAAO,4BAA4B,CAAC,CAAC,CAAC,IAAI,KAAK,kBAAkB,CAAC,IAAI,GAAG;oBACvG,CAAC,CAAC,SAAS,CAAC,OAAO;wBACnB,CAAC,CAAC,sFAAsF;4BACtF,wBAAwB,kBAAkB,CAAC,IAAI,GAAG;wBACpD,CAAC,CAAC,sBAAsB;4BACtB,YAAY,kBAAkB,CAAC,IAAI,GACzC,GAAG;gBACH,UAAU,CAAC,CAAC,CAAC,UAAU,OAAO,6BAA6B,CAAC,CAAC,CAAC,EAAE;aACjE;SACF,CAAC;IACJ,CAAC;CACF","sourcesContent":["import { ODataVersions } from \"@odata2ts/odata-core\";\r\nimport deepmerge from \"deepmerge\";\r\nimport {\r\n ClassDeclarationStructure,\r\n MethodDeclarationStructure,\r\n OptionalKind,\r\n PropertyDeclarationStructure,\r\n Scope,\r\n SourceFile,\r\n} from \"ts-morph\";\r\nimport { upperCaseFirst } from \"upper-case-first\";\r\nimport { firstCharLowerCase } from \"xml2js/lib/processors\";\r\n\r\nimport { DataModel } from \"../data-model/DataModel\";\r\nimport {\r\n ActionImportType,\r\n ComplexType,\r\n DataTypes,\r\n EntityContainerModel,\r\n FunctionImportType,\r\n ModelType,\r\n OperationType,\r\n OperationTypes,\r\n PropertyModel,\r\n SingletonType,\r\n} from \"../data-model/DataTypeModel\";\r\nimport { NamingHelper } from \"../data-model/NamingHelper\";\r\nimport { ProjectManager } from \"../project/ProjectManager\";\r\nimport { ImportContainer } from \"./ImportContainer\";\r\n\r\nconst ROOT_SERVICE = \"ODataService\";\r\n\r\nconst RESPONSE_TYPES = {\r\n collection: \"ODataCollectionResponse\",\r\n model: \"ODataModelResponse\",\r\n value: \"ODataValueResponse\",\r\n};\r\n\r\nexport interface PropsAndOps extends Required<Pick<ClassDeclarationStructure, \"properties\" | \"methods\">> {}\r\n\r\nexport async function generateServices(\r\n dataModel: DataModel,\r\n project: ProjectManager,\r\n version: ODataVersions,\r\n namingHelper: NamingHelper\r\n) {\r\n const generator = new ServiceGenerator(dataModel, project, version, namingHelper);\r\n return generator.generate();\r\n}\r\n\r\nclass ServiceGenerator {\r\n constructor(\r\n private dataModel: DataModel,\r\n private project: ProjectManager,\r\n private version: ODataVersions,\r\n private namingHelper: NamingHelper\r\n ) {}\r\n\r\n public async generate(): Promise<void> {\r\n const sourceFile = await this.project.createMainServiceFile();\r\n const serviceName = this.namingHelper.getMainServiceName();\r\n const container = this.dataModel.getEntityContainer();\r\n const unboundOperations = [...Object.values(container.functions), ...Object.values(container.actions)];\r\n\r\n await this.generateModelServices();\r\n\r\n const importContainer = new ImportContainer(this.namingHelper.getFileNames());\r\n importContainer.addFromClientApi(\"ODataHttpClient\");\r\n importContainer.addFromService(ROOT_SERVICE);\r\n\r\n const { properties, methods }: PropsAndOps = deepmerge(\r\n this.generateMainServiceProperties(container, importContainer),\r\n this.generateMainServiceOperations(unboundOperations, importContainer)\r\n );\r\n\r\n sourceFile.addClass({\r\n isExported: true,\r\n name: serviceName,\r\n typeParameters: [\"ClientType extends ODataHttpClient\"],\r\n extends: `${ROOT_SERVICE}<ClientType>`,\r\n properties /*: [\r\n {\r\n scope: Scope.Private,\r\n name: this.namingHelper.getPrivatePropName(\"name\"),\r\n type: \"string\",\r\n initializer: `\"${this.namingHelper.getODataServiceName()}\"`,\r\n },\r\n ]*/,\r\n methods,\r\n });\r\n\r\n sourceFile.addImportDeclarations(importContainer.getImportDeclarations(false));\r\n }\r\n\r\n private generateMainServiceProperties(\r\n container: EntityContainerModel,\r\n importContainer: ImportContainer\r\n ): PropsAndOps {\r\n const result: PropsAndOps = { properties: [], methods: [] };\r\n\r\n Object.values(container.entitySets).forEach(({ name, odataName, entityType }) => {\r\n result.methods.push(this.generateRelatedServiceGetter(name, odataName, entityType, importContainer));\r\n });\r\n\r\n Object.values(container.singletons).forEach((singleton) => {\r\n result.properties.push(this.generateSingletonProp(singleton, importContainer));\r\n result.methods.push(this.generateSingletonGetter(singleton));\r\n });\r\n\r\n return result;\r\n }\r\n\r\n private generateMainServiceOperations(\r\n ops: Array<FunctionImportType | ActionImportType>,\r\n importContainer: ImportContainer\r\n ): PropsAndOps {\r\n const result: PropsAndOps = { properties: [], methods: [] };\r\n\r\n ops.forEach(({ operation, name }) => {\r\n result.properties.push(this.generateQOperationProp(operation));\r\n result.methods.push(this.generateMethod(name, operation, importContainer));\r\n });\r\n\r\n return result;\r\n }\r\n\r\n private generateRelatedServiceGetter(\r\n propName: string,\r\n odataPropName: string,\r\n entityType: ModelType,\r\n importContainer: ImportContainer,\r\n currentServiceName?: string\r\n ): OptionalKind<MethodDeclarationStructure> {\r\n const idName = entityType.idModelName;\r\n const idFunctionName = entityType.qIdFunctionName;\r\n const serviceName = this.namingHelper.getServiceName(entityType.name);\r\n const collectionName = this.namingHelper.getCollectionServiceName(entityType.name);\r\n\r\n importContainer.addFromClientApi(\"ODataHttpClient\");\r\n importContainer.addGeneratedModel(idName);\r\n importContainer.addGeneratedQObject(idFunctionName);\r\n // make sure to not falsely import self-referential stuff\r\n if (!currentServiceName || currentServiceName !== serviceName) {\r\n importContainer.addGeneratedService(serviceName, collectionName, serviceName);\r\n }\r\n\r\n return {\r\n scope: Scope.Public,\r\n name: this.namingHelper.getRelatedServiceGetter(propName),\r\n parameters: [\r\n {\r\n name: \"id\",\r\n type: `${idName} | undefined`,\r\n hasQuestionToken: true,\r\n },\r\n ],\r\n overloads: [\r\n {\r\n parameters: [],\r\n returnType: `${collectionName}<ClientType>`,\r\n },\r\n {\r\n parameters: [\r\n {\r\n name: \"id\",\r\n type: idName,\r\n },\r\n ],\r\n returnType: `${serviceName}<ClientType>`,\r\n },\r\n ],\r\n statements: [\r\n `const fieldName = \"${odataPropName}\";`,\r\n 'return typeof id === \"undefined\" || id === null',\r\n `? new ${collectionName}(this.client, this.getPath(), fieldName)`,\r\n `: new ${serviceName}(this.client, this.getPath(), new ${idFunctionName}(fieldName).buildUrl(id));`,\r\n ],\r\n };\r\n }\r\n\r\n private generateSingletonProp(\r\n singleton: SingletonType,\r\n importContainer: ImportContainer\r\n ): OptionalKind<PropertyDeclarationStructure> {\r\n const { name, entityType } = singleton;\r\n const type = this.namingHelper.getServiceName(entityType.name);\r\n\r\n importContainer.addGeneratedService(this.namingHelper.getServiceName(entityType.name), type);\r\n\r\n return {\r\n scope: Scope.Private,\r\n name: this.namingHelper.getPrivatePropName(name),\r\n type: `${type}<ClientType>`,\r\n hasQuestionToken: true,\r\n };\r\n }\r\n\r\n private generateQOperationProp = (operation: OperationType) => {\r\n return {\r\n scope: Scope.Private,\r\n name: this.namingHelper.getPrivatePropName(operation.qName),\r\n type: operation.qName,\r\n hasQuestionToken: true,\r\n };\r\n };\r\n\r\n private generateSingletonGetter(singleton: SingletonType): OptionalKind<MethodDeclarationStructure> {\r\n const { name, odataName, entityType } = singleton;\r\n const propName = \"this.\" + this.namingHelper.getPrivatePropName(name);\r\n const serviceType = this.namingHelper.getServiceName(entityType.name);\r\n\r\n return {\r\n scope: Scope.Public,\r\n name: this.namingHelper.getRelatedServiceGetter(name),\r\n statements: [\r\n `if(!${propName}) {`,\r\n // prettier-ignore\r\n ` ${propName} = new ${serviceType}(this.client, this.getPath(), \"${odataName}\")`,\r\n \"}\",\r\n `return ${propName}`,\r\n ],\r\n };\r\n }\r\n\r\n private getVersionSuffix() {\r\n return this.version === ODataVersions.V2 ? \"V2\" : \"V4\";\r\n }\r\n\r\n private async generateEntityTypeService(\r\n model: ComplexType,\r\n serviceName: string,\r\n serviceFile: SourceFile,\r\n importContainer: ImportContainer\r\n ) {\r\n const entityServiceType = \"EntityTypeService\" + this.getVersionSuffix();\r\n\r\n const editableModelName = model.editableName;\r\n const qObjectName = firstCharLowerCase(model.qName);\r\n const operations = this.dataModel.getOperationTypeByBinding(model.name);\r\n const props = [...model.baseProps, ...model.props];\r\n\r\n importContainer.addFromService(entityServiceType);\r\n importContainer.addFromClientApi(\"ODataHttpClient\");\r\n importContainer.addGeneratedModel(model.name, editableModelName);\r\n importContainer.addGeneratedQObject(model.qName, qObjectName);\r\n\r\n const { properties, methods }: PropsAndOps = deepmerge(\r\n this.generateServiceProperties(serviceName, props, importContainer),\r\n this.generateServiceOperations(operations, importContainer)\r\n );\r\n\r\n // generate EntityTypeService\r\n serviceFile.addClass({\r\n isExported: true,\r\n name: serviceName,\r\n typeParameters: [\"ClientType extends ODataHttpClient\"],\r\n extends: entityServiceType + `<ClientType, ${model.name}, ${editableModelName}, ${model.qName}>`,\r\n ctors: [\r\n {\r\n parameters: [\r\n { name: \"client\", type: \"ClientType\" },\r\n { name: \"basePath\", type: \"string\" },\r\n { name: \"name\", type: \"string\" },\r\n ],\r\n statements: [`super(client, basePath, name, ${qObjectName});`],\r\n },\r\n ],\r\n properties,\r\n methods,\r\n });\r\n }\r\n\r\n private generateServiceProperties(\r\n serviceName: string,\r\n props: Array<PropertyModel>,\r\n importContainer: ImportContainer\r\n ): PropsAndOps {\r\n const collectionServiceType = \"CollectionService\" + this.getVersionSuffix();\r\n const result: PropsAndOps = { properties: [], methods: [] };\r\n\r\n props.forEach((prop) => {\r\n if ((prop.dataType === DataTypes.ModelType && !prop.isCollection) || prop.dataType === DataTypes.ComplexType) {\r\n result.properties.push(this.generateModelProp(prop, collectionServiceType, serviceName, importContainer));\r\n result.methods.push(this.generateModelPropGetter(prop, collectionServiceType));\r\n } else if (prop.isCollection) {\r\n // collection of entity types\r\n if (prop.dataType === DataTypes.ModelType) {\r\n const entityType = this.dataModel.getModel(prop.type);\r\n result.methods.push(\r\n this.generateRelatedServiceGetter(prop.name, prop.odataName, entityType, importContainer, serviceName)\r\n );\r\n }\r\n // collection of primitive or complex types\r\n else {\r\n result.properties.push(this.generatePrimitiveCollectionProp(prop, collectionServiceType, importContainer));\r\n result.methods.push(this.generatePrimitiveCollectionGetter(prop, collectionServiceType));\r\n }\r\n }\r\n });\r\n\r\n return result;\r\n }\r\n\r\n private generateServiceOperations(operations: Array<OperationType>, importContainer: ImportContainer): PropsAndOps {\r\n const result: PropsAndOps = { properties: [], methods: [] };\r\n\r\n operations.forEach((operation) => {\r\n result.properties.push(this.generateQOperationProp(operation));\r\n result.methods.push(this.generateMethod(operation.name, operation, importContainer));\r\n });\r\n\r\n return result;\r\n }\r\n\r\n private generateModelProp(\r\n prop: PropertyModel,\r\n collectionServiceType: string,\r\n serviceName: string,\r\n importContainer: ImportContainer\r\n ): PropertyDeclarationStructure {\r\n const complexType = this.dataModel.getComplexType(prop.type);\r\n const key = this.namingHelper.getServiceName(prop.type);\r\n let propModelType = prop.isCollection ? this.namingHelper.getCollectionServiceName(prop.type) : key;\r\n\r\n if (prop.isCollection && complexType) {\r\n const editableName = complexType.editableName;\r\n importContainer.addFromService(collectionServiceType);\r\n importContainer.addGeneratedModel(complexType.name, editableName);\r\n importContainer.addGeneratedQObject(complexType.qName, firstCharLowerCase(complexType.qName));\r\n propModelType = `${collectionServiceType}<ClientType, ${complexType.name}, ${complexType.qName}, ${editableName}>`;\r\n } else {\r\n // don't include imports for this type\r\n if (serviceName !== key) {\r\n importContainer.addGeneratedService(key, propModelType);\r\n }\r\n\r\n propModelType = `${propModelType}<ClientType>`;\r\n }\r\n\r\n return {\r\n scope: Scope.Private,\r\n name: this.namingHelper.getPrivatePropName(prop.name),\r\n type: propModelType,\r\n hasQuestionToken: true,\r\n } as PropertyDeclarationStructure;\r\n }\r\n\r\n private generatePrimitiveCollectionProp(\r\n prop: PropertyModel,\r\n collectionServiceType: string,\r\n importContainer: ImportContainer\r\n ): OptionalKind<PropertyDeclarationStructure> {\r\n const isEnum = prop.dataType === DataTypes.EnumType;\r\n const type = isEnum ? `EnumCollection<${prop.type}>` : `${upperCaseFirst(prop.type)}Collection`;\r\n const qType = isEnum ? \"QEnumCollection\" : `Q${type}`;\r\n const collectionType = `${collectionServiceType}<ClientType, ${type}, ${qType}>`;\r\n\r\n if (!prop.qObject) {\r\n throw new Error(\"Illegal State: [qObject] must be provided for Collection types!\");\r\n }\r\n\r\n importContainer.addFromService(collectionServiceType);\r\n importContainer.addFromQObject(prop.qObject, firstCharLowerCase(prop.qObject));\r\n if (isEnum) {\r\n importContainer.addGeneratedModel(prop.type);\r\n importContainer.addFromQObject(\"EnumCollection\");\r\n } else {\r\n importContainer.addFromQObject(type);\r\n }\r\n\r\n return {\r\n scope: Scope.Private,\r\n name: this.namingHelper.getPrivatePropName(prop.name),\r\n type: `${collectionType}`,\r\n hasQuestionToken: true,\r\n };\r\n }\r\n\r\n private generateModelPropGetter(\r\n prop: PropertyModel,\r\n collectionServiceType: string\r\n ): OptionalKind<MethodDeclarationStructure> {\r\n const complexType = this.dataModel.getComplexType(prop.type);\r\n const isComplexCollection = prop.isCollection && complexType;\r\n const type = isComplexCollection\r\n ? collectionServiceType\r\n : prop.isCollection\r\n ? this.namingHelper.getCollectionServiceName(prop.type)\r\n : this.namingHelper.getServiceName(prop.type);\r\n const typeWithGenerics = isComplexCollection\r\n ? `${collectionServiceType}<ClientType, ${complexType.name}, ${complexType.qName}, ${complexType.editableName}>`\r\n : `${type}<ClientType>`;\r\n\r\n const privateSrvProp = \"this.\" + this.namingHelper.getPrivatePropName(prop.name);\r\n\r\n return {\r\n scope: Scope.Public,\r\n name: this.namingHelper.getRelatedServiceGetter(prop.name),\r\n returnType: typeWithGenerics,\r\n statements: [\r\n `if(!${privateSrvProp}) {`,\r\n // prettier-ignore\r\n ` ${privateSrvProp} = new ${type}(this.client, this.getPath(), \"${prop.odataName}\"${isComplexCollection ? `, ${firstCharLowerCase(complexType.qName)}`: \"\"})`,\r\n \"}\",\r\n `return ${privateSrvProp}`,\r\n ],\r\n };\r\n }\r\n\r\n private generatePrimitiveCollectionGetter(\r\n prop: PropertyModel,\r\n collectionServiceType: string\r\n ): OptionalKind<MethodDeclarationStructure> {\r\n const propName = \"this.\" + this.namingHelper.getPrivatePropName(prop.name);\r\n return {\r\n scope: Scope.Public,\r\n name: this.namingHelper.getRelatedServiceGetter(prop.name),\r\n statements: [\r\n `if(!${propName}) {`,\r\n // prettier-ignore\r\n ` ${propName} = new ${collectionServiceType}(this.client, this.getPath(), \"${prop.odataName}\", ${firstCharLowerCase(prop.qObject!)})`,\r\n \"}\",\r\n `return ${propName}`,\r\n ],\r\n };\r\n }\r\n\r\n private async generateEntityCollectionService(\r\n model: ModelType,\r\n serviceFile: SourceFile,\r\n importContainer: ImportContainer\r\n ) {\r\n const entitySetServiceType = \"EntitySetService\" + this.getVersionSuffix();\r\n const editableModelName = model.editableName;\r\n const qObjectName = firstCharLowerCase(model.qName);\r\n\r\n importContainer.addFromService(entitySetServiceType);\r\n importContainer.addGeneratedModel(model.idModelName);\r\n importContainer.addGeneratedQObject(model.qIdFunctionName);\r\n\r\n const collectionOperations = this.dataModel.getOperationTypeByBinding(`Collection(${model.name})`);\r\n\r\n const { properties, methods } = this.generateServiceOperations(collectionOperations, importContainer);\r\n\r\n serviceFile.addClass({\r\n isExported: true,\r\n name: this.namingHelper.getCollectionServiceName(model.name),\r\n typeParameters: [\"ClientType extends ODataHttpClient\"],\r\n extends:\r\n entitySetServiceType +\r\n `<ClientType, ${model.name}, ${editableModelName}, ${model.qName}, ${model.idModelName}>`,\r\n ctors: [\r\n {\r\n parameters: [\r\n { name: \"client\", type: \"ClientType\" },\r\n { name: \"basePath\", type: \"string\" },\r\n { name: \"name\", type: \"string\" },\r\n ],\r\n statements: [`super(client, basePath, name, ${qObjectName}, new ${model.qIdFunctionName}(name));`],\r\n },\r\n ],\r\n properties,\r\n methods,\r\n });\r\n }\r\n\r\n private async generateModelServices() {\r\n // build service file for each entity, consisting of EntityTypeService & EntityCollectionService\r\n for (const model of this.dataModel.getModels()) {\r\n const serviceName = this.namingHelper.getServiceName(model.name);\r\n const serviceFile = await this.project.createServiceFile(serviceName);\r\n const importContainer = new ImportContainer(this.namingHelper.getFileNames());\r\n\r\n // entity type service\r\n await this.generateEntityTypeService(model, serviceName, serviceFile, importContainer);\r\n\r\n // entity collection service\r\n await this.generateEntityCollectionService(model, serviceFile, importContainer);\r\n\r\n serviceFile.addImportDeclarations(importContainer.getImportDeclarations(true));\r\n }\r\n\r\n // build service file for complex types\r\n for (const model of this.dataModel.getComplexTypes()) {\r\n const serviceName = this.namingHelper.getServiceName(model.name);\r\n const serviceFile = await this.project.createServiceFile(serviceName);\r\n const importContainer = new ImportContainer(this.namingHelper.getFileNames());\r\n\r\n // entity type service\r\n await this.generateEntityTypeService(model, serviceName, serviceFile, importContainer);\r\n serviceFile.addImportDeclarations(importContainer.getImportDeclarations(true));\r\n }\r\n }\r\n\r\n private generateMethod(\r\n name: string,\r\n operation: OperationType,\r\n importContainer: ImportContainer\r\n ): OptionalKind<MethodDeclarationStructure> {\r\n const isFunc = operation.type === OperationTypes.Function;\r\n const odataType = operation.returnType?.isCollection\r\n ? RESPONSE_TYPES.collection + this.getVersionSuffix()\r\n : operation.returnType?.dataType === DataTypes.PrimitiveType\r\n ? RESPONSE_TYPES.value + this.getVersionSuffix()\r\n : RESPONSE_TYPES.model + this.getVersionSuffix();\r\n const returnType = operation.returnType;\r\n const requestConfigParam = {\r\n name: \"requestConfig\",\r\n hasQuestionToken: true,\r\n type: \"ODataHttpClientConfig<ClientType>\",\r\n };\r\n const hasParams = operation.parameters.length > 0;\r\n\r\n // importing dependencies\r\n importContainer.addFromClientApi(\"ODataHttpClientConfig\", \"ODataResponse\");\r\n importContainer.addFromCore(odataType);\r\n if (returnType?.type) {\r\n if ([DataTypes.EnumType, DataTypes.ModelType, DataTypes.ComplexType].includes(returnType.dataType)) {\r\n importContainer.addGeneratedModel(returnType.type);\r\n }\r\n }\r\n importContainer.addGeneratedQObject(operation.qName);\r\n if (hasParams) {\r\n importContainer.addGeneratedModel(operation.paramsModelName);\r\n }\r\n\r\n const qOpProp = \"this.\" + this.namingHelper.getPrivatePropName(operation.qName);\r\n\r\n return {\r\n scope: Scope.Public,\r\n isAsync: true,\r\n name,\r\n parameters: hasParams\r\n ? [{ name: \"params\", type: operation.paramsModelName }, requestConfigParam]\r\n : [requestConfigParam],\r\n returnType: `ODataResponse<${odataType}<${returnType?.type || \"void\"}>>`,\r\n statements: [\r\n `if(!${qOpProp}) {`,\r\n ` ${qOpProp} = new ${operation.qName}()`,\r\n \"}\",\r\n\r\n `const url = this.addFullPath(${qOpProp}.buildUrl(${isFunc && hasParams ? \"params\" : \"\"}));`,\r\n `${returnType ? \"const response = await \" : \"return\"} this.client.${\r\n !isFunc\r\n ? // actions: since V4\r\n `post(url, ${hasParams ? `${qOpProp}.convertUserParams(params)` : \"{}\"}, ${requestConfigParam.name})`\r\n : operation.usePost\r\n ? // V2 POST => BUT values are still query params, they are not part of the request body\r\n `post(url, undefined, ${requestConfigParam.name})`\r\n : // functions: since V2\r\n `get(url, ${requestConfigParam.name})`\r\n };`,\r\n returnType ? `return ${qOpProp}.convertResponse(response);` : \"\",\r\n ],\r\n };\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"ServiceGenerator.js","sourceRoot":"","sources":["../../src/generator/ServiceGenerator.ts"],"names":[],"mappings":";;;;AAAA,qDAAqD;AACrD,kEAAkC;AAClC,uCAOkB;AAClB,uDAAkD;AAClD,sDAA2D;AAkB3D,uDAAoD;AAEpD,MAAM,YAAY,GAAG,cAAc,CAAC;AAEpC,MAAM,cAAc,GAAG;IACrB,UAAU,EAAE,yBAAyB;IACrC,KAAK,EAAE,oBAAoB;IAC3B,KAAK,EAAE,oBAAoB;CAC5B,CAAC;AAOF,SAAsB,gBAAgB,CACpC,SAAoB,EACpB,OAAuB,EACvB,OAAsB,EACtB,YAA0B,EAC1B,OAAiC;;QAEjC,MAAM,SAAS,GAAG,IAAI,gBAAgB,CAAC,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,OAAO,CAAC,CAAC;QAC3F,OAAO,SAAS,CAAC,QAAQ,EAAE,CAAC;IAC9B,CAAC;CAAA;AATD,4CASC;AAED,MAAM,gBAAgB;IACpB,YACU,SAAoB,EACpB,OAAuB,EACvB,OAAsB,EACtB,YAA0B,EAC1B,UAAmC,EAAE;QAJrC,cAAS,GAAT,SAAS,CAAW;QACpB,YAAO,GAAP,OAAO,CAAgB;QACvB,YAAO,GAAP,OAAO,CAAe;QACtB,iBAAY,GAAZ,YAAY,CAAc;QAC1B,YAAO,GAAP,OAAO,CAA8B;QAuJvC,2BAAsB,GAAG,CAAC,SAAwB,EAAE,EAAE;YAC5D,OAAO;gBACL,KAAK,EAAE,gBAAK,CAAC,OAAO;gBACpB,IAAI,EAAE,IAAI,CAAC,YAAY,CAAC,kBAAkB,CAAC,SAAS,CAAC,KAAK,CAAC;gBAC3D,IAAI,EAAE,SAAS,CAAC,KAAK;gBACrB,gBAAgB,EAAE,IAAI;aACvB,CAAC;QACJ,CAAC,CAAC;IA7JC,CAAC;IAEI,aAAa;QACnB,OAAO,IAAI,CAAC,OAAO,CAAC,mBAAmB,IAAI,IAAI,CAAC,OAAO,KAAK,0BAAa,CAAC,EAAE,CAAC;IAC/E,CAAC;IAEY,QAAQ;;YACnB,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,qBAAqB,EAAE,CAAC;YAC9D,MAAM,WAAW,GAAG,IAAI,CAAC,YAAY,CAAC,kBAAkB,EAAE,CAAC;YAC3D,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,kBAAkB,EAAE,CAAC;YACtD,MAAM,iBAAiB,GAAG,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,SAAS,CAAC,EAAE,GAAG,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;YAEvG,MAAM,IAAI,CAAC,qBAAqB,EAAE,CAAC;YAEnC,MAAM,eAAe,GAAG,IAAI,iCAAe,CAAC,IAAI,CAAC,YAAY,CAAC,YAAY,EAAE,CAAC,CAAC;YAC9E,eAAe,CAAC,gBAAgB,CAAC,iBAAiB,CAAC,CAAC;YACpD,eAAe,CAAC,cAAc,CAAC,YAAY,CAAC,CAAC;YAE7C,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,GAAgB,IAAA,mBAAS,EACpD,IAAI,CAAC,6BAA6B,CAAC,SAAS,EAAE,eAAe,CAAC,EAC9D,IAAI,CAAC,6BAA6B,CAAC,iBAAiB,EAAE,eAAe,CAAC,CACvE,CAAC;YAEF,UAAU,CAAC,QAAQ,CAAC;gBAClB,UAAU,EAAE,IAAI;gBAChB,IAAI,EAAE,WAAW;gBACjB,cAAc,EAAE,CAAC,oCAAoC,CAAC;gBACtD,OAAO,EAAE,GAAG,YAAY,cAAc;gBACtC,KAAK,EAAE,IAAI,CAAC,aAAa,EAAE;oBACzB,CAAC,CAAC;wBACE;4BACE,UAAU,EAAE;gCACV,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,YAAY,EAAE;gCACtC,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,QAAQ,EAAE;6BACrC;4BACD,UAAU,EAAE,CAAC,gCAAgC,CAAC;yBAC/C;qBACF;oBACH,CAAC,CAAC,EAAE;gBACN,UAAU;gBACV,OAAO;aACR,CAAC,CAAC;YAEH,UAAU,CAAC,qBAAqB,CAAC,eAAe,CAAC,qBAAqB,CAAC,KAAK,CAAC,CAAC,CAAC;QACjF,CAAC;KAAA;IAEO,6BAA6B,CACnC,SAA+B,EAC/B,eAAgC;QAEhC,MAAM,MAAM,GAAgB,EAAE,UAAU,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;QAE5D,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,UAAU,EAAE,EAAE,EAAE;YAC9E,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,4BAA4B,CAAC,IAAI,EAAE,SAAS,EAAE,UAAU,EAAE,eAAe,CAAC,CAAC,CAAC;QACvG,CAAC,CAAC,CAAC;QAEH,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,CAAC,SAAS,EAAE,EAAE;YACxD,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,qBAAqB,CAAC,SAAS,EAAE,eAAe,CAAC,CAAC,CAAC;YAC/E,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,uBAAuB,CAAC,SAAS,CAAC,CAAC,CAAC;QAC/D,CAAC,CAAC,CAAC;QAEH,OAAO,MAAM,CAAC;IAChB,CAAC;IAEO,6BAA6B,CACnC,GAAiD,EACjD,eAAgC;QAEhC,MAAM,MAAM,GAAgB,EAAE,UAAU,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;QAE5D,GAAG,CAAC,OAAO,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,EAAE,EAAE;YAClC,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,sBAAsB,CAAC,SAAS,CAAC,CAAC,CAAC;YAC/D,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE,SAAS,EAAE,eAAe,CAAC,CAAC,CAAC;QAC7E,CAAC,CAAC,CAAC;QAEH,OAAO,MAAM,CAAC;IAChB,CAAC;IAEO,4BAA4B,CAClC,QAAgB,EAChB,aAAqB,EACrB,UAAqB,EACrB,eAAgC,EAChC,kBAA2B;QAE3B,MAAM,MAAM,GAAG,UAAU,CAAC,WAAW,CAAC;QACtC,MAAM,cAAc,GAAG,UAAU,CAAC,eAAe,CAAC;QAClD,MAAM,WAAW,GAAG,IAAI,CAAC,YAAY,CAAC,cAAc,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QACtE,MAAM,cAAc,GAAG,IAAI,CAAC,YAAY,CAAC,wBAAwB,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QAEnF,eAAe,CAAC,gBAAgB,CAAC,iBAAiB,CAAC,CAAC;QACpD,eAAe,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC;QAC1C,eAAe,CAAC,mBAAmB,CAAC,cAAc,CAAC,CAAC;QACpD,yDAAyD;QACzD,IAAI,CAAC,kBAAkB,IAAI,kBAAkB,KAAK,WAAW,EAAE;YAC7D,eAAe,CAAC,mBAAmB,CAAC,WAAW,EAAE,cAAc,EAAE,WAAW,CAAC,CAAC;SAC/E;QAED,OAAO;YACL,KAAK,EAAE,gBAAK,CAAC,MAAM;YACnB,IAAI,EAAE,IAAI,CAAC,YAAY,CAAC,uBAAuB,CAAC,QAAQ,CAAC;YACzD,UAAU,EAAE;gBACV;oBACE,IAAI,EAAE,IAAI;oBACV,IAAI,EAAE,GAAG,MAAM,cAAc;oBAC7B,gBAAgB,EAAE,IAAI;iBACvB;aACF;YACD,SAAS,EAAE;gBACT;oBACE,UAAU,EAAE,EAAE;oBACd,UAAU,EAAE,GAAG,cAAc,cAAc;iBAC5C;gBACD;oBACE,UAAU,EAAE;wBACV;4BACE,IAAI,EAAE,IAAI;4BACV,IAAI,EAAE,MAAM;yBACb;qBACF;oBACD,UAAU,EAAE,GAAG,WAAW,cAAc;iBACzC;aACF;YACD,UAAU,EAAE;gBACV,sBAAsB,aAAa,IAAI;gBACvC,uCAAuC;gBACvC,iDAAiD;gBACjD,SAAS,cAAc,2BAA2B;gBAClD,SAAS,WAAW,sBAAsB,cAAc,4BAA4B;aACrF;SACF,CAAC;IACJ,CAAC;IAEO,qBAAqB,CAC3B,SAAwB,EACxB,eAAgC;QAEhC,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,SAAS,CAAC;QACvC,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY,CAAC,cAAc,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QAE/D,eAAe,CAAC,mBAAmB,CAAC,IAAI,CAAC,YAAY,CAAC,cAAc,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,CAAC;QAE7F,OAAO;YACL,KAAK,EAAE,gBAAK,CAAC,OAAO;YACpB,IAAI,EAAE,IAAI,CAAC,YAAY,CAAC,kBAAkB,CAAC,IAAI,CAAC;YAChD,IAAI,EAAE,GAAG,IAAI,cAAc;YAC3B,gBAAgB,EAAE,IAAI;SACvB,CAAC;IACJ,CAAC;IAWO,uBAAuB,CAAC,SAAwB;QACtD,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,UAAU,EAAE,GAAG,SAAS,CAAC;QAClD,MAAM,QAAQ,GAAG,OAAO,GAAG,IAAI,CAAC,YAAY,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC;QACtE,MAAM,WAAW,GAAG,IAAI,CAAC,YAAY,CAAC,cAAc,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QAEtE,OAAO;YACL,KAAK,EAAE,gBAAK,CAAC,MAAM;YACnB,IAAI,EAAE,IAAI,CAAC,YAAY,CAAC,uBAAuB,CAAC,IAAI,CAAC;YACrD,UAAU,EAAE;gBACV,OAAO,QAAQ,KAAK;gBACpB,yCAAyC;gBACzC,kBAAkB;gBAClB,KAAK,QAAQ,UAAU,WAAW,mBAAmB,SAAS,IAAI;gBAClE,GAAG;gBACH,UAAU,QAAQ,EAAE;aACrB;SACF,CAAC;IACJ,CAAC;IAEO,gBAAgB;QACtB,OAAO,IAAI,CAAC,OAAO,KAAK,0BAAa,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;IACzD,CAAC;IAEa,yBAAyB,CACrC,KAAkB,EAClB,WAAmB,EACnB,WAAuB,EACvB,eAAgC;;YAEhC,MAAM,iBAAiB,GAAG,mBAAmB,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAC;YAExE,MAAM,iBAAiB,GAAG,KAAK,CAAC,YAAY,CAAC;YAC7C,MAAM,WAAW,GAAG,IAAA,+BAAkB,EAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YACpD,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,yBAAyB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACxE,MAAM,KAAK,GAAG,CAAC,GAAG,KAAK,CAAC,SAAS,EAAE,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC;YAEnD,eAAe,CAAC,cAAc,CAAC,iBAAiB,CAAC,CAAC;YAClD,eAAe,CAAC,gBAAgB,CAAC,iBAAiB,CAAC,CAAC;YACpD,eAAe,CAAC,iBAAiB,CAAC,KAAK,CAAC,IAAI,EAAE,iBAAiB,CAAC,CAAC;YACjE,eAAe,CAAC,mBAAmB,CAAC,KAAK,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;YAE9D,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,GAAgB,IAAA,mBAAS,EACpD,IAAI,CAAC,yBAAyB,CAAC,WAAW,EAAE,KAAK,EAAE,eAAe,CAAC,EACnE,IAAI,CAAC,yBAAyB,CAAC,UAAU,EAAE,eAAe,CAAC,CAC5D,CAAC;YAEF,6BAA6B;YAC7B,WAAW,CAAC,QAAQ,CAAC;gBACnB,UAAU,EAAE,IAAI;gBAChB,IAAI,EAAE,WAAW;gBACjB,cAAc,EAAE,CAAC,oCAAoC,CAAC;gBACtD,OAAO,EAAE,iBAAiB,GAAG,gBAAgB,KAAK,CAAC,IAAI,KAAK,iBAAiB,KAAK,KAAK,CAAC,KAAK,GAAG;gBAChG,KAAK,EAAE;oBACL;wBACE,UAAU,EAAE;4BACV,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,YAAY,EAAE;4BACtC,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,QAAQ,EAAE;4BACpC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE;yBACjC;wBACD,UAAU,EAAE,CAAC,iCAAiC,WAAW,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC;qBACtG;iBACF;gBACD,UAAU;gBACV,OAAO;aACR,CAAC,CAAC;QACL,CAAC;KAAA;IAEO,uBAAuB;QAC7B,OAAO,sBAAsB,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAC;IAC1D,CAAC;IAEO,yBAAyB,CAC/B,WAAmB,EACnB,KAA2B,EAC3B,eAAgC;QAEhC,MAAM,qBAAqB,GAAG,mBAAmB,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAC;QAC5E,MAAM,MAAM,GAAgB,EAAE,UAAU,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;QAE5D,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;YACrB,IAAI,CAAC,IAAI,CAAC,QAAQ,0CAAwB,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,IAAI,CAAC,QAAQ,8CAA0B,EAAE;gBAC5G,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,IAAI,EAAE,qBAAqB,EAAE,WAAW,EAAE,eAAe,CAAC,CAAC,CAAC;gBAC1G,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,uBAAuB,CAAC,IAAI,EAAE,qBAAqB,CAAC,CAAC,CAAC;aAChF;iBAAM,IAAI,IAAI,CAAC,YAAY,EAAE;gBAC5B,6BAA6B;gBAC7B,IAAI,IAAI,CAAC,QAAQ,0CAAwB,EAAE;oBACzC,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;oBACtD,MAAM,CAAC,OAAO,CAAC,IAAI,CACjB,IAAI,CAAC,4BAA4B,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,EAAE,UAAU,EAAE,eAAe,EAAE,WAAW,CAAC,CACvG,CAAC;iBACH;gBACD,2CAA2C;qBACtC;oBACH,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,+BAA+B,CAAC,IAAI,EAAE,qBAAqB,EAAE,eAAe,CAAC,CAAC,CAAC;oBAC3G,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,iCAAiC,CAAC,IAAI,EAAE,qBAAqB,CAAC,CAAC,CAAC;iBAC1F;aACF;iBAAM,IAAI,IAAI,CAAC,OAAO,CAAC,+BAA+B,IAAI,IAAI,CAAC,QAAQ,kDAA4B,EAAE;gBACpG,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,yBAAyB,CAAC,IAAI,EAAE,eAAe,CAAC,CAAC,CAAC;gBAC9E,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,2BAA2B,CAAC,IAAI,CAAC,CAAC,CAAC;aAC7D;QACH,CAAC,CAAC,CAAC;QAEH,OAAO,MAAM,CAAC;IAChB,CAAC;IAEO,yBAAyB,CAAC,UAAgC,EAAE,eAAgC;QAClG,MAAM,MAAM,GAAgB,EAAE,UAAU,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;QAE5D,UAAU,CAAC,OAAO,CAAC,CAAC,SAAS,EAAE,EAAE;YAC/B,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,sBAAsB,CAAC,SAAS,CAAC,CAAC,CAAC;YAC/D,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,IAAI,EAAE,SAAS,EAAE,eAAe,CAAC,CAAC,CAAC;QACvF,CAAC,CAAC,CAAC;QAEH,OAAO,MAAM,CAAC;IAChB,CAAC;IAEO,iBAAiB,CACvB,IAAmB,EACnB,qBAA6B,EAC7B,WAAmB,EACnB,eAAgC;QAEhC,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC7D,MAAM,GAAG,GAAG,IAAI,CAAC,YAAY,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACxD,IAAI,aAAa,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,wBAAwB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;QAEpG,IAAI,IAAI,CAAC,YAAY,IAAI,WAAW,EAAE;YACpC,MAAM,YAAY,GAAG,WAAW,CAAC,YAAY,CAAC;YAC9C,eAAe,CAAC,cAAc,CAAC,qBAAqB,CAAC,CAAC;YACtD,eAAe,CAAC,iBAAiB,CAAC,WAAW,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;YAClE,eAAe,CAAC,mBAAmB,CAAC,WAAW,CAAC,KAAK,EAAE,IAAA,+BAAkB,EAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC;YAC9F,aAAa,GAAG,GAAG,qBAAqB,gBAAgB,WAAW,CAAC,IAAI,KAAK,WAAW,CAAC,KAAK,KAAK,YAAY,GAAG,CAAC;SACpH;aAAM;YACL,sCAAsC;YACtC,IAAI,WAAW,KAAK,GAAG,EAAE;gBACvB,eAAe,CAAC,mBAAmB,CAAC,GAAG,EAAE,aAAa,CAAC,CAAC;aACzD;YAED,aAAa,GAAG,GAAG,aAAa,cAAc,CAAC;SAChD;QAED,OAAO;YACL,KAAK,EAAE,gBAAK,CAAC,OAAO;YACpB,IAAI,EAAE,IAAI,CAAC,YAAY,CAAC,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC;YACrD,IAAI,EAAE,aAAa;YACnB,gBAAgB,EAAE,IAAI;SACS,CAAC;IACpC,CAAC;IAEO,+BAA+B,CACrC,IAAmB,EACnB,qBAA6B,EAC7B,eAAgC;QAEhC,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,wCAAuB,CAAC;QACpD,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,kBAAkB,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,GAAG,IAAA,iCAAc,EAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC;QAChG,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC;QACxD,MAAM,cAAc,GAAG,GAAG,qBAAqB,gBAAgB,IAAI,KAAK,KAAK,GAAG,CAAC;QAEjF,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE;YACjB,MAAM,IAAI,KAAK,CAAC,iEAAiE,CAAC,CAAC;SACpF;QAED,eAAe,CAAC,cAAc,CAAC,qBAAqB,CAAC,CAAC;QACtD,eAAe,CAAC,cAAc,CAAC,IAAI,CAAC,OAAO,EAAE,IAAA,+BAAkB,EAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;QAC/E,IAAI,MAAM,EAAE;YACV,eAAe,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC7C,eAAe,CAAC,cAAc,CAAC,gBAAgB,CAAC,CAAC;SAClD;aAAM;YACL,eAAe,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;SACtC;QAED,OAAO;YACL,KAAK,EAAE,gBAAK,CAAC,OAAO;YACpB,IAAI,EAAE,IAAI,CAAC,YAAY,CAAC,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC;YACrD,IAAI,EAAE,GAAG,cAAc,EAAE;YACzB,gBAAgB,EAAE,IAAI;SACvB,CAAC;IACJ,CAAC;IAEO,yBAAyB,CAC/B,IAAmB,EACnB,eAAgC;QAEhC,MAAM,WAAW,GAAG,IAAI,CAAC,uBAAuB,EAAE,CAAC;QACnD,eAAe,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC;QAC5C,IAAI,IAAI,CAAC,UAAU,EAAE;YACnB,eAAe,CAAC,aAAa,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;SAC3D;QAED,OAAO;YACL,KAAK,EAAE,gBAAK,CAAC,OAAO;YACpB,IAAI,EAAE,IAAI,CAAC,YAAY,CAAC,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC;YACrD,IAAI,EAAE,GAAG,WAAW,gBAAgB,IAAI,CAAC,IAAI,GAAG;YAChD,gBAAgB,EAAE,IAAI;SACvB,CAAC;IACJ,CAAC;IAEO,uBAAuB,CAC7B,IAAmB,EACnB,qBAA6B;QAE7B,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC7D,MAAM,mBAAmB,GAAG,IAAI,CAAC,YAAY,IAAI,WAAW,CAAC;QAC7D,MAAM,IAAI,GAAG,mBAAmB;YAC9B,CAAC,CAAC,qBAAqB;YACvB,CAAC,CAAC,IAAI,CAAC,YAAY;gBACnB,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,wBAAwB,CAAC,IAAI,CAAC,IAAI,CAAC;gBACvD,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAChD,MAAM,gBAAgB,GAAG,mBAAmB;YAC1C,CAAC,CAAC,GAAG,qBAAqB,gBAAgB,WAAW,CAAC,IAAI,KAAK,WAAW,CAAC,KAAK,KAAK,WAAW,CAAC,YAAY,GAAG;YAChH,CAAC,CAAC,GAAG,IAAI,cAAc,CAAC;QAE1B,MAAM,cAAc,GAAG,OAAO,GAAG,IAAI,CAAC,YAAY,CAAC,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAEjF,OAAO;YACL,KAAK,EAAE,gBAAK,CAAC,MAAM;YACnB,IAAI,EAAE,IAAI,CAAC,YAAY,CAAC,uBAAuB,CAAC,IAAI,CAAC,IAAI,CAAC;YAC1D,UAAU,EAAE,gBAAgB;YAC5B,UAAU,EAAE;gBACV,OAAO,cAAc,KAAK;gBAC1B,yCAAyC;gBACzC,kBAAkB;gBAClB,KAAK,cAAc,UAAU,IAAI,mBAAmB,IAAI,CAAC,SAAS,IAAI,mBAAmB,CAAC,CAAC,CAAC,KAAK,IAAA,+BAAkB,EAAC,WAAW,CAAC,KAAK,CAAC,EAAE,CAAA,CAAC,CAAC,EAAE,GAAG;gBAC/I,GAAG;gBACH,UAAU,cAAc,EAAE;aAC3B;SACF,CAAC;IACJ,CAAC;IAEO,iCAAiC,CACvC,IAAmB,EACnB,qBAA6B;QAE7B,MAAM,QAAQ,GAAG,OAAO,GAAG,IAAI,CAAC,YAAY,CAAC,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC3E,OAAO;YACL,KAAK,EAAE,gBAAK,CAAC,MAAM;YACnB,IAAI,EAAE,IAAI,CAAC,YAAY,CAAC,uBAAuB,CAAC,IAAI,CAAC,IAAI,CAAC;YAC1D,UAAU,EAAE;gBACV,OAAO,QAAQ,KAAK;gBACpB,yCAAyC;gBACzC,kBAAkB;gBAClB,KAAK,QAAQ,UAAU,qBAAqB,mBAAmB,IAAI,CAAC,SAAS,MAAM,IAAA,+BAAkB,EAAC,IAAI,CAAC,OAAQ,CAAC,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAA,CAAC,CAAC,EAAE,GAAG;gBAC7J,GAAG;gBACH,UAAU,QAAQ,EAAE;aACrB;SACF,CAAC;IACJ,CAAC;IAEO,2BAA2B,CAAC,IAAmB;QACrD,MAAM,WAAW,GAAG,IAAI,CAAC,uBAAuB,EAAE,CAAC;QACnD,MAAM,QAAQ,GAAG,OAAO,GAAG,IAAI,CAAC,YAAY,CAAC,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC3E,wCAAwC;QACxC,MAAM,aAAa,GAAG,IAAI,CAAC,OAAO,KAAK,0BAAa,CAAC,EAAE,IAAI,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,SAAS,CAAC;QACxF,6BAA6B;QAC7B,MAAM,YAAY,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;QAC1C,MAAM,cAAc,GAAG,aAAa,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;QAEzF,OAAO;YACL,KAAK,EAAE,gBAAK,CAAC,MAAM;YACnB,IAAI,EAAE,IAAI,CAAC,YAAY,CAAC,uBAAuB,CAAC,IAAI,CAAC,IAAI,CAAC;YAC1D,UAAU,EAAE;gBACV,OAAO,QAAQ,KAAK;gBACpB,iDAAiD;gBACjD,KAAK,QAAQ,UAAU,WAAW,mBAAmB,IAAI,CAAC,SAAS,aAAa,IAAI,CAAC,IAAI,aAAa,cAAc,GAAG;gBACvH,GAAG;gBACH,UAAU,QAAQ,EAAE;aACrB;SACF,CAAC;IACJ,CAAC;IAEa,+BAA+B,CAC3C,KAAgB,EAChB,WAAuB,EACvB,eAAgC;;YAEhC,MAAM,oBAAoB,GAAG,kBAAkB,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAC;YAC1E,MAAM,iBAAiB,GAAG,KAAK,CAAC,YAAY,CAAC;YAC7C,MAAM,WAAW,GAAG,IAAA,+BAAkB,EAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YAEpD,eAAe,CAAC,cAAc,CAAC,oBAAoB,CAAC,CAAC;YACrD,eAAe,CAAC,iBAAiB,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;YACrD,eAAe,CAAC,mBAAmB,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;YAE3D,MAAM,oBAAoB,GAAG,IAAI,CAAC,SAAS,CAAC,yBAAyB,CAAC,cAAc,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC;YAEnG,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC,yBAAyB,CAAC,oBAAoB,EAAE,eAAe,CAAC,CAAC;YAEtG,WAAW,CAAC,QAAQ,CAAC;gBACnB,UAAU,EAAE,IAAI;gBAChB,IAAI,EAAE,IAAI,CAAC,YAAY,CAAC,wBAAwB,CAAC,KAAK,CAAC,IAAI,CAAC;gBAC5D,cAAc,EAAE,CAAC,oCAAoC,CAAC;gBACtD,OAAO,EACL,oBAAoB;oBACpB,gBAAgB,KAAK,CAAC,IAAI,KAAK,iBAAiB,KAAK,KAAK,CAAC,KAAK,KAAK,KAAK,CAAC,WAAW,GAAG;gBAC3F,KAAK,EAAE;oBACL;wBACE,UAAU,EAAE;4BACV,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,YAAY,EAAE;4BACtC,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,QAAQ,EAAE;4BACpC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE;yBACjC;wBACD,UAAU,EAAE;4BACV,iCAAiC,WAAW,SAAS,KAAK,CAAC,eAAe,SACxE,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EACpC,IAAI;yBACL;qBACF;iBACF;gBACD,UAAU;gBACV,OAAO;aACR,CAAC,CAAC;QACL,CAAC;KAAA;IAEa,qBAAqB;;YACjC,gGAAgG;YAChG,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,SAAS,CAAC,SAAS,EAAE,EAAE;gBAC9C,MAAM,WAAW,GAAG,IAAI,CAAC,YAAY,CAAC,cAAc,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBACjE,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,iBAAiB,CAAC,WAAW,CAAC,CAAC;gBACtE,MAAM,eAAe,GAAG,IAAI,iCAAe,CAAC,IAAI,CAAC,YAAY,CAAC,YAAY,EAAE,CAAC,CAAC;gBAE9E,sBAAsB;gBACtB,MAAM,IAAI,CAAC,yBAAyB,CAAC,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,eAAe,CAAC,CAAC;gBAEvF,4BAA4B;gBAC5B,MAAM,IAAI,CAAC,+BAA+B,CAAC,KAAK,EAAE,WAAW,EAAE,eAAe,CAAC,CAAC;gBAEhF,WAAW,CAAC,qBAAqB,CAAC,eAAe,CAAC,qBAAqB,CAAC,IAAI,CAAC,CAAC,CAAC;aAChF;YAED,uCAAuC;YACvC,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,SAAS,CAAC,eAAe,EAAE,EAAE;gBACpD,MAAM,WAAW,GAAG,IAAI,CAAC,YAAY,CAAC,cAAc,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBACjE,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,iBAAiB,CAAC,WAAW,CAAC,CAAC;gBACtE,MAAM,eAAe,GAAG,IAAI,iCAAe,CAAC,IAAI,CAAC,YAAY,CAAC,YAAY,EAAE,CAAC,CAAC;gBAE9E,sBAAsB;gBACtB,MAAM,IAAI,CAAC,yBAAyB,CAAC,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,eAAe,CAAC,CAAC;gBACvF,WAAW,CAAC,qBAAqB,CAAC,eAAe,CAAC,qBAAqB,CAAC,IAAI,CAAC,CAAC,CAAC;aAChF;QACH,CAAC;KAAA;IAEO,cAAc,CACpB,IAAY,EACZ,SAAwB,EACxB,eAAgC;;QAEhC,MAAM,MAAM,GAAG,SAAS,CAAC,IAAI,6CAA4B,CAAC;QAC1D,MAAM,SAAS,GAAG,CAAA,MAAA,SAAS,CAAC,UAAU,0CAAE,YAAY;YAClD,CAAC,CAAC,cAAc,CAAC,UAAU,GAAG,IAAI,CAAC,gBAAgB,EAAE;YACrD,CAAC,CAAC,CAAA,MAAA,SAAS,CAAC,UAAU,0CAAE,QAAQ,mDAA4B;gBAC5D,CAAC,CAAC,cAAc,CAAC,KAAK,GAAG,IAAI,CAAC,gBAAgB,EAAE;gBAChD,CAAC,CAAC,cAAc,CAAC,KAAK,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACnD,MAAM,UAAU,GAAG,SAAS,CAAC,UAAU,CAAC;QACxC,MAAM,kBAAkB,GAAG;YACzB,IAAI,EAAE,eAAe;YACrB,gBAAgB,EAAE,IAAI;YACtB,IAAI,EAAE,mCAAmC;SAC1C,CAAC;QACF,MAAM,SAAS,GAAG,SAAS,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC;QAElD,yBAAyB;QACzB,eAAe,CAAC,gBAAgB,CAAC,uBAAuB,EAAE,eAAe,CAAC,CAAC;QAC3E,eAAe,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;QACvC,IAAI,UAAU,aAAV,UAAU,uBAAV,UAAU,CAAE,IAAI,EAAE;YACpB,IAAI,uHAAgE,CAAC,QAAQ,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE;gBAClG,eAAe,CAAC,iBAAiB,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;aACpD;SACF;QACD,eAAe,CAAC,mBAAmB,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QACrD,IAAI,SAAS,EAAE;YACb,eAAe,CAAC,iBAAiB,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC;SAC9D;QAED,MAAM,OAAO,GAAG,OAAO,GAAG,IAAI,CAAC,YAAY,CAAC,kBAAkB,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QAEhF,OAAO;YACL,KAAK,EAAE,gBAAK,CAAC,MAAM;YACnB,OAAO,EAAE,IAAI;YACb,IAAI;YACJ,UAAU,EAAE,SAAS;gBACnB,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,CAAC,eAAe,EAAE,EAAE,kBAAkB,CAAC;gBAC3E,CAAC,CAAC,CAAC,kBAAkB,CAAC;YACxB,UAAU,EAAE,iBAAiB,SAAS,IAAI,CAAA,UAAU,aAAV,UAAU,uBAAV,UAAU,CAAE,IAAI,KAAI,MAAM,IAAI;YACxE,UAAU,EAAE;gBACV,OAAO,OAAO,KAAK;gBACnB,KAAK,OAAO,UAAU,SAAS,CAAC,KAAK,IAAI;gBACzC,GAAG;gBAEH,iEAAiE;gBACjE,2BAA2B,OAAO,aAAa,MAAM,IAAI,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,KAAK;gBACvF,GAAG,UAAU,CAAC,CAAC,CAAC,yBAAyB,CAAC,CAAC,CAAC,QAAQ,WAClD,CAAC,MAAM;oBACL,CAAC,CAAC,oBAAoB;wBACpB,aAAa,SAAS,CAAC,CAAC,CAAC,GAAG,OAAO,4BAA4B,CAAC,CAAC,CAAC,IAAI,KACpE,kBAAkB,CAAC,IACrB,wBAAwB;oBAC1B,CAAC,CAAC,SAAS,CAAC,OAAO;wBACnB,CAAC,CAAC,sFAAsF;4BACtF,wBAAwB,kBAAkB,CAAC,IAAI,wBAAwB;wBACzE,CAAC,CAAC,sBAAsB;4BACtB,YAAY,kBAAkB,CAAC,IAAI,wBACzC,GAAG;gBACH,UAAU,CAAC,CAAC,CAAC,UAAU,OAAO,6BAA6B,CAAC,CAAC,CAAC,EAAE;aACjE;SACF,CAAC;IACJ,CAAC;CACF","sourcesContent":["import { ODataVersions } from \"@odata2ts/odata-core\";\r\nimport deepmerge from \"deepmerge\";\r\nimport {\r\n ClassDeclarationStructure,\r\n MethodDeclarationStructure,\r\n OptionalKind,\r\n PropertyDeclarationStructure,\r\n Scope,\r\n SourceFile,\r\n} from \"ts-morph\";\r\nimport { upperCaseFirst } from \"upper-case-first\";\r\nimport { firstCharLowerCase } from \"xml2js/lib/processors\";\r\n\r\nimport { DataModel } from \"../data-model/DataModel\";\r\nimport {\r\n ActionImportType,\r\n ComplexType,\r\n DataTypes,\r\n EntityContainerModel,\r\n FunctionImportType,\r\n ModelType,\r\n OperationType,\r\n OperationTypes,\r\n PropertyModel,\r\n SingletonType,\r\n} from \"../data-model/DataTypeModel\";\r\nimport { NamingHelper } from \"../data-model/NamingHelper\";\r\nimport { ConfigFileOptions } from \"../OptionModel\";\r\nimport { ProjectManager } from \"../project/ProjectManager\";\r\nimport { ImportContainer } from \"./ImportContainer\";\r\n\r\nconst ROOT_SERVICE = \"ODataService\";\r\n\r\nconst RESPONSE_TYPES = {\r\n collection: \"ODataCollectionResponse\",\r\n model: \"ODataModelResponse\",\r\n value: \"ODataValueResponse\",\r\n};\r\n\r\nexport interface PropsAndOps extends Required<Pick<ClassDeclarationStructure, \"properties\" | \"methods\">> {}\r\n\r\nexport interface ServiceGeneratorOptions\r\n extends Pick<ConfigFileOptions, \"enablePrimitivePropertyServices\" | \"v4BigNumberAsString\"> {}\r\n\r\nexport async function generateServices(\r\n dataModel: DataModel,\r\n project: ProjectManager,\r\n version: ODataVersions,\r\n namingHelper: NamingHelper,\r\n options?: ServiceGeneratorOptions\r\n) {\r\n const generator = new ServiceGenerator(dataModel, project, version, namingHelper, options);\r\n return generator.generate();\r\n}\r\n\r\nclass ServiceGenerator {\r\n constructor(\r\n private dataModel: DataModel,\r\n private project: ProjectManager,\r\n private version: ODataVersions,\r\n private namingHelper: NamingHelper,\r\n private options: ServiceGeneratorOptions = {}\r\n ) {}\r\n\r\n private isV4BigNumber() {\r\n return this.options.v4BigNumberAsString && this.version === ODataVersions.V4;\r\n }\r\n\r\n public async generate(): Promise<void> {\r\n const sourceFile = await this.project.createMainServiceFile();\r\n const serviceName = this.namingHelper.getMainServiceName();\r\n const container = this.dataModel.getEntityContainer();\r\n const unboundOperations = [...Object.values(container.functions), ...Object.values(container.actions)];\r\n\r\n await this.generateModelServices();\r\n\r\n const importContainer = new ImportContainer(this.namingHelper.getFileNames());\r\n importContainer.addFromClientApi(\"ODataHttpClient\");\r\n importContainer.addFromService(ROOT_SERVICE);\r\n\r\n const { properties, methods }: PropsAndOps = deepmerge(\r\n this.generateMainServiceProperties(container, importContainer),\r\n this.generateMainServiceOperations(unboundOperations, importContainer)\r\n );\r\n\r\n sourceFile.addClass({\r\n isExported: true,\r\n name: serviceName,\r\n typeParameters: [\"ClientType extends ODataHttpClient\"],\r\n extends: `${ROOT_SERVICE}<ClientType>`,\r\n ctors: this.isV4BigNumber()\r\n ? [\r\n {\r\n parameters: [\r\n { name: \"client\", type: \"ClientType\" },\r\n { name: \"basePath\", type: \"string\" },\r\n ],\r\n statements: [`super(client, basePath, true);`],\r\n },\r\n ]\r\n : [],\r\n properties,\r\n methods,\r\n });\r\n\r\n sourceFile.addImportDeclarations(importContainer.getImportDeclarations(false));\r\n }\r\n\r\n private generateMainServiceProperties(\r\n container: EntityContainerModel,\r\n importContainer: ImportContainer\r\n ): PropsAndOps {\r\n const result: PropsAndOps = { properties: [], methods: [] };\r\n\r\n Object.values(container.entitySets).forEach(({ name, odataName, entityType }) => {\r\n result.methods.push(this.generateRelatedServiceGetter(name, odataName, entityType, importContainer));\r\n });\r\n\r\n Object.values(container.singletons).forEach((singleton) => {\r\n result.properties.push(this.generateSingletonProp(singleton, importContainer));\r\n result.methods.push(this.generateSingletonGetter(singleton));\r\n });\r\n\r\n return result;\r\n }\r\n\r\n private generateMainServiceOperations(\r\n ops: Array<FunctionImportType | ActionImportType>,\r\n importContainer: ImportContainer\r\n ): PropsAndOps {\r\n const result: PropsAndOps = { properties: [], methods: [] };\r\n\r\n ops.forEach(({ operation, name }) => {\r\n result.properties.push(this.generateQOperationProp(operation));\r\n result.methods.push(this.generateMethod(name, operation, importContainer));\r\n });\r\n\r\n return result;\r\n }\r\n\r\n private generateRelatedServiceGetter(\r\n propName: string,\r\n odataPropName: string,\r\n entityType: ModelType,\r\n importContainer: ImportContainer,\r\n currentServiceName?: string\r\n ): OptionalKind<MethodDeclarationStructure> {\r\n const idName = entityType.idModelName;\r\n const idFunctionName = entityType.qIdFunctionName;\r\n const serviceName = this.namingHelper.getServiceName(entityType.name);\r\n const collectionName = this.namingHelper.getCollectionServiceName(entityType.name);\r\n\r\n importContainer.addFromClientApi(\"ODataHttpClient\");\r\n importContainer.addGeneratedModel(idName);\r\n importContainer.addGeneratedQObject(idFunctionName);\r\n // make sure to not falsely import self-referential stuff\r\n if (!currentServiceName || currentServiceName !== serviceName) {\r\n importContainer.addGeneratedService(serviceName, collectionName, serviceName);\r\n }\r\n\r\n return {\r\n scope: Scope.Public,\r\n name: this.namingHelper.getRelatedServiceGetter(propName),\r\n parameters: [\r\n {\r\n name: \"id\",\r\n type: `${idName} | undefined`,\r\n hasQuestionToken: true,\r\n },\r\n ],\r\n overloads: [\r\n {\r\n parameters: [],\r\n returnType: `${collectionName}<ClientType>`,\r\n },\r\n {\r\n parameters: [\r\n {\r\n name: \"id\",\r\n type: idName,\r\n },\r\n ],\r\n returnType: `${serviceName}<ClientType>`,\r\n },\r\n ],\r\n statements: [\r\n `const fieldName = \"${odataPropName}\";`,\r\n `const { client, path } = this.__base;`,\r\n 'return typeof id === \"undefined\" || id === null',\r\n `? new ${collectionName}(client, path, fieldName)`,\r\n `: new ${serviceName}(client, path, new ${idFunctionName}(fieldName).buildUrl(id));`,\r\n ],\r\n };\r\n }\r\n\r\n private generateSingletonProp(\r\n singleton: SingletonType,\r\n importContainer: ImportContainer\r\n ): OptionalKind<PropertyDeclarationStructure> {\r\n const { name, entityType } = singleton;\r\n const type = this.namingHelper.getServiceName(entityType.name);\r\n\r\n importContainer.addGeneratedService(this.namingHelper.getServiceName(entityType.name), type);\r\n\r\n return {\r\n scope: Scope.Private,\r\n name: this.namingHelper.getPrivatePropName(name),\r\n type: `${type}<ClientType>`,\r\n hasQuestionToken: true,\r\n };\r\n }\r\n\r\n private generateQOperationProp = (operation: OperationType) => {\r\n return {\r\n scope: Scope.Private,\r\n name: this.namingHelper.getPrivatePropName(operation.qName),\r\n type: operation.qName,\r\n hasQuestionToken: true,\r\n };\r\n };\r\n\r\n private generateSingletonGetter(singleton: SingletonType): OptionalKind<MethodDeclarationStructure> {\r\n const { name, odataName, entityType } = singleton;\r\n const propName = \"this.\" + this.namingHelper.getPrivatePropName(name);\r\n const serviceType = this.namingHelper.getServiceName(entityType.name);\r\n\r\n return {\r\n scope: Scope.Public,\r\n name: this.namingHelper.getRelatedServiceGetter(name),\r\n statements: [\r\n `if(!${propName}) {`,\r\n ` const { client, path } = this.__base;`,\r\n // prettier-ignore\r\n ` ${propName} = new ${serviceType}(client, path, \"${odataName}\")`,\r\n \"}\",\r\n `return ${propName}`,\r\n ],\r\n };\r\n }\r\n\r\n private getVersionSuffix() {\r\n return this.version === ODataVersions.V2 ? \"V2\" : \"V4\";\r\n }\r\n\r\n private async generateEntityTypeService(\r\n model: ComplexType,\r\n serviceName: string,\r\n serviceFile: SourceFile,\r\n importContainer: ImportContainer\r\n ) {\r\n const entityServiceType = \"EntityTypeService\" + this.getVersionSuffix();\r\n\r\n const editableModelName = model.editableName;\r\n const qObjectName = firstCharLowerCase(model.qName);\r\n const operations = this.dataModel.getOperationTypeByBinding(model.name);\r\n const props = [...model.baseProps, ...model.props];\r\n\r\n importContainer.addFromService(entityServiceType);\r\n importContainer.addFromClientApi(\"ODataHttpClient\");\r\n importContainer.addGeneratedModel(model.name, editableModelName);\r\n importContainer.addGeneratedQObject(model.qName, qObjectName);\r\n\r\n const { properties, methods }: PropsAndOps = deepmerge(\r\n this.generateServiceProperties(serviceName, props, importContainer),\r\n this.generateServiceOperations(operations, importContainer)\r\n );\r\n\r\n // generate EntityTypeService\r\n serviceFile.addClass({\r\n isExported: true,\r\n name: serviceName,\r\n typeParameters: [\"ClientType extends ODataHttpClient\"],\r\n extends: entityServiceType + `<ClientType, ${model.name}, ${editableModelName}, ${model.qName}>`,\r\n ctors: [\r\n {\r\n parameters: [\r\n { name: \"client\", type: \"ClientType\" },\r\n { name: \"basePath\", type: \"string\" },\r\n { name: \"name\", type: \"string\" },\r\n ],\r\n statements: [`super(client, basePath, name, ${qObjectName}${this.isV4BigNumber() ? \", true\" : \"\"});`],\r\n },\r\n ],\r\n properties,\r\n methods,\r\n });\r\n }\r\n\r\n private getPrimitiveServiceType() {\r\n return \"PrimitiveTypeService\" + this.getVersionSuffix();\r\n }\r\n\r\n private generateServiceProperties(\r\n serviceName: string,\r\n props: Array<PropertyModel>,\r\n importContainer: ImportContainer\r\n ): PropsAndOps {\r\n const collectionServiceType = \"CollectionService\" + this.getVersionSuffix();\r\n const result: PropsAndOps = { properties: [], methods: [] };\r\n\r\n props.forEach((prop) => {\r\n if ((prop.dataType === DataTypes.ModelType && !prop.isCollection) || prop.dataType === DataTypes.ComplexType) {\r\n result.properties.push(this.generateModelProp(prop, collectionServiceType, serviceName, importContainer));\r\n result.methods.push(this.generateModelPropGetter(prop, collectionServiceType));\r\n } else if (prop.isCollection) {\r\n // collection of entity types\r\n if (prop.dataType === DataTypes.ModelType) {\r\n const entityType = this.dataModel.getModel(prop.type);\r\n result.methods.push(\r\n this.generateRelatedServiceGetter(prop.name, prop.odataName, entityType, importContainer, serviceName)\r\n );\r\n }\r\n // collection of primitive or complex types\r\n else {\r\n result.properties.push(this.generatePrimitiveCollectionProp(prop, collectionServiceType, importContainer));\r\n result.methods.push(this.generatePrimitiveCollectionGetter(prop, collectionServiceType));\r\n }\r\n } else if (this.options.enablePrimitivePropertyServices && prop.dataType === DataTypes.PrimitiveType) {\r\n result.properties.push(this.generatePrimitiveTypeProp(prop, importContainer));\r\n result.methods.push(this.generatePrimitiveTypeGetter(prop));\r\n }\r\n });\r\n\r\n return result;\r\n }\r\n\r\n private generateServiceOperations(operations: Array<OperationType>, importContainer: ImportContainer): PropsAndOps {\r\n const result: PropsAndOps = { properties: [], methods: [] };\r\n\r\n operations.forEach((operation) => {\r\n result.properties.push(this.generateQOperationProp(operation));\r\n result.methods.push(this.generateMethod(operation.name, operation, importContainer));\r\n });\r\n\r\n return result;\r\n }\r\n\r\n private generateModelProp(\r\n prop: PropertyModel,\r\n collectionServiceType: string,\r\n serviceName: string,\r\n importContainer: ImportContainer\r\n ): PropertyDeclarationStructure {\r\n const complexType = this.dataModel.getComplexType(prop.type);\r\n const key = this.namingHelper.getServiceName(prop.type);\r\n let propModelType = prop.isCollection ? this.namingHelper.getCollectionServiceName(prop.type) : key;\r\n\r\n if (prop.isCollection && complexType) {\r\n const editableName = complexType.editableName;\r\n importContainer.addFromService(collectionServiceType);\r\n importContainer.addGeneratedModel(complexType.name, editableName);\r\n importContainer.addGeneratedQObject(complexType.qName, firstCharLowerCase(complexType.qName));\r\n propModelType = `${collectionServiceType}<ClientType, ${complexType.name}, ${complexType.qName}, ${editableName}>`;\r\n } else {\r\n // don't include imports for this type\r\n if (serviceName !== key) {\r\n importContainer.addGeneratedService(key, propModelType);\r\n }\r\n\r\n propModelType = `${propModelType}<ClientType>`;\r\n }\r\n\r\n return {\r\n scope: Scope.Private,\r\n name: this.namingHelper.getPrivatePropName(prop.name),\r\n type: propModelType,\r\n hasQuestionToken: true,\r\n } as PropertyDeclarationStructure;\r\n }\r\n\r\n private generatePrimitiveCollectionProp(\r\n prop: PropertyModel,\r\n collectionServiceType: string,\r\n importContainer: ImportContainer\r\n ): OptionalKind<PropertyDeclarationStructure> {\r\n const isEnum = prop.dataType === DataTypes.EnumType;\r\n const type = isEnum ? `EnumCollection<${prop.type}>` : `${upperCaseFirst(prop.type)}Collection`;\r\n const qType = isEnum ? \"QEnumCollection\" : prop.qObject;\r\n const collectionType = `${collectionServiceType}<ClientType, ${type}, ${qType}>`;\r\n\r\n if (!prop.qObject) {\r\n throw new Error(\"Illegal State: [qObject] must be provided for Collection types!\");\r\n }\r\n\r\n importContainer.addFromService(collectionServiceType);\r\n importContainer.addFromQObject(prop.qObject, firstCharLowerCase(prop.qObject));\r\n if (isEnum) {\r\n importContainer.addGeneratedModel(prop.type);\r\n importContainer.addFromQObject(\"EnumCollection\");\r\n } else {\r\n importContainer.addFromQObject(type);\r\n }\r\n\r\n return {\r\n scope: Scope.Private,\r\n name: this.namingHelper.getPrivatePropName(prop.name),\r\n type: `${collectionType}`,\r\n hasQuestionToken: true,\r\n };\r\n }\r\n\r\n private generatePrimitiveTypeProp(\r\n prop: PropertyModel,\r\n importContainer: ImportContainer\r\n ): OptionalKind<PropertyDeclarationStructure> {\r\n const serviceType = this.getPrimitiveServiceType();\r\n importContainer.addFromService(serviceType);\r\n if (prop.typeModule) {\r\n importContainer.addCustomType(prop.typeModule, prop.type);\r\n }\r\n\r\n return {\r\n scope: Scope.Private,\r\n name: this.namingHelper.getPrivatePropName(prop.name),\r\n type: `${serviceType}<ClientType, ${prop.type}>`,\r\n hasQuestionToken: true,\r\n };\r\n }\r\n\r\n private generateModelPropGetter(\r\n prop: PropertyModel,\r\n collectionServiceType: string\r\n ): OptionalKind<MethodDeclarationStructure> {\r\n const complexType = this.dataModel.getComplexType(prop.type);\r\n const isComplexCollection = prop.isCollection && complexType;\r\n const type = isComplexCollection\r\n ? collectionServiceType\r\n : prop.isCollection\r\n ? this.namingHelper.getCollectionServiceName(prop.type)\r\n : this.namingHelper.getServiceName(prop.type);\r\n const typeWithGenerics = isComplexCollection\r\n ? `${collectionServiceType}<ClientType, ${complexType.name}, ${complexType.qName}, ${complexType.editableName}>`\r\n : `${type}<ClientType>`;\r\n\r\n const privateSrvProp = \"this.\" + this.namingHelper.getPrivatePropName(prop.name);\r\n\r\n return {\r\n scope: Scope.Public,\r\n name: this.namingHelper.getRelatedServiceGetter(prop.name),\r\n returnType: typeWithGenerics,\r\n statements: [\r\n `if(!${privateSrvProp}) {`,\r\n ` const { client, path } = this.__base;`,\r\n // prettier-ignore\r\n ` ${privateSrvProp} = new ${type}(client, path, \"${prop.odataName}\"${isComplexCollection ? `, ${firstCharLowerCase(complexType.qName)}`: \"\"})`,\r\n \"}\",\r\n `return ${privateSrvProp}`,\r\n ],\r\n };\r\n }\r\n\r\n private generatePrimitiveCollectionGetter(\r\n prop: PropertyModel,\r\n collectionServiceType: string\r\n ): OptionalKind<MethodDeclarationStructure> {\r\n const propName = \"this.\" + this.namingHelper.getPrivatePropName(prop.name);\r\n return {\r\n scope: Scope.Public,\r\n name: this.namingHelper.getRelatedServiceGetter(prop.name),\r\n statements: [\r\n `if(!${propName}) {`,\r\n ` const { client, path } = this.__base;`,\r\n // prettier-ignore\r\n ` ${propName} = new ${collectionServiceType}(client, path, \"${prop.odataName}\", ${firstCharLowerCase(prop.qObject!)}${this.isV4BigNumber() ? \", true\": \"\"})`,\r\n \"}\",\r\n `return ${propName}`,\r\n ],\r\n };\r\n }\r\n\r\n private generatePrimitiveTypeGetter(prop: PropertyModel): OptionalKind<MethodDeclarationStructure> {\r\n const serviceType = this.getPrimitiveServiceType();\r\n const propName = \"this.\" + this.namingHelper.getPrivatePropName(prop.name);\r\n // for V2: mapped name must be specified\r\n const useMappedName = this.version === ODataVersions.V2 && prop.name !== prop.odataName;\r\n // for V4: big number support\r\n const useBigNumber = this.isV4BigNumber();\r\n const addParamString = useMappedName ? `, \"${prop.name}\"` : useBigNumber ? \", true\" : \"\";\r\n\r\n return {\r\n scope: Scope.Public,\r\n name: this.namingHelper.getRelatedServiceGetter(prop.name),\r\n statements: [\r\n `if(!${propName}) {`,\r\n ` const { client, path, qModel } = this.__base;`,\r\n ` ${propName} = new ${serviceType}(client, path, \"${prop.odataName}\", qModel.${prop.name}.converter${addParamString})`,\r\n \"}\",\r\n `return ${propName}`,\r\n ],\r\n };\r\n }\r\n\r\n private async generateEntityCollectionService(\r\n model: ModelType,\r\n serviceFile: SourceFile,\r\n importContainer: ImportContainer\r\n ) {\r\n const entitySetServiceType = \"EntitySetService\" + this.getVersionSuffix();\r\n const editableModelName = model.editableName;\r\n const qObjectName = firstCharLowerCase(model.qName);\r\n\r\n importContainer.addFromService(entitySetServiceType);\r\n importContainer.addGeneratedModel(model.idModelName);\r\n importContainer.addGeneratedQObject(model.qIdFunctionName);\r\n\r\n const collectionOperations = this.dataModel.getOperationTypeByBinding(`Collection(${model.name})`);\r\n\r\n const { properties, methods } = this.generateServiceOperations(collectionOperations, importContainer);\r\n\r\n serviceFile.addClass({\r\n isExported: true,\r\n name: this.namingHelper.getCollectionServiceName(model.name),\r\n typeParameters: [\"ClientType extends ODataHttpClient\"],\r\n extends:\r\n entitySetServiceType +\r\n `<ClientType, ${model.name}, ${editableModelName}, ${model.qName}, ${model.idModelName}>`,\r\n ctors: [\r\n {\r\n parameters: [\r\n { name: \"client\", type: \"ClientType\" },\r\n { name: \"basePath\", type: \"string\" },\r\n { name: \"name\", type: \"string\" },\r\n ],\r\n statements: [\r\n `super(client, basePath, name, ${qObjectName}, new ${model.qIdFunctionName}(name)${\r\n this.isV4BigNumber() ? \", true\" : \"\"\r\n });`,\r\n ],\r\n },\r\n ],\r\n properties,\r\n methods,\r\n });\r\n }\r\n\r\n private async generateModelServices() {\r\n // build service file for each entity, consisting of EntityTypeService & EntityCollectionService\r\n for (const model of this.dataModel.getModels()) {\r\n const serviceName = this.namingHelper.getServiceName(model.name);\r\n const serviceFile = await this.project.createServiceFile(serviceName);\r\n const importContainer = new ImportContainer(this.namingHelper.getFileNames());\r\n\r\n // entity type service\r\n await this.generateEntityTypeService(model, serviceName, serviceFile, importContainer);\r\n\r\n // entity collection service\r\n await this.generateEntityCollectionService(model, serviceFile, importContainer);\r\n\r\n serviceFile.addImportDeclarations(importContainer.getImportDeclarations(true));\r\n }\r\n\r\n // build service file for complex types\r\n for (const model of this.dataModel.getComplexTypes()) {\r\n const serviceName = this.namingHelper.getServiceName(model.name);\r\n const serviceFile = await this.project.createServiceFile(serviceName);\r\n const importContainer = new ImportContainer(this.namingHelper.getFileNames());\r\n\r\n // entity type service\r\n await this.generateEntityTypeService(model, serviceName, serviceFile, importContainer);\r\n serviceFile.addImportDeclarations(importContainer.getImportDeclarations(true));\r\n }\r\n }\r\n\r\n private generateMethod(\r\n name: string,\r\n operation: OperationType,\r\n importContainer: ImportContainer\r\n ): OptionalKind<MethodDeclarationStructure> {\r\n const isFunc = operation.type === OperationTypes.Function;\r\n const odataType = operation.returnType?.isCollection\r\n ? RESPONSE_TYPES.collection + this.getVersionSuffix()\r\n : operation.returnType?.dataType === DataTypes.PrimitiveType\r\n ? RESPONSE_TYPES.value + this.getVersionSuffix()\r\n : RESPONSE_TYPES.model + this.getVersionSuffix();\r\n const returnType = operation.returnType;\r\n const requestConfigParam = {\r\n name: \"requestConfig\",\r\n hasQuestionToken: true,\r\n type: \"ODataHttpClientConfig<ClientType>\",\r\n };\r\n const hasParams = operation.parameters.length > 0;\r\n\r\n // importing dependencies\r\n importContainer.addFromClientApi(\"ODataHttpClientConfig\", \"ODataResponse\");\r\n importContainer.addFromCore(odataType);\r\n if (returnType?.type) {\r\n if ([DataTypes.EnumType, DataTypes.ModelType, DataTypes.ComplexType].includes(returnType.dataType)) {\r\n importContainer.addGeneratedModel(returnType.type);\r\n }\r\n }\r\n importContainer.addGeneratedQObject(operation.qName);\r\n if (hasParams) {\r\n importContainer.addGeneratedModel(operation.paramsModelName);\r\n }\r\n\r\n const qOpProp = \"this.\" + this.namingHelper.getPrivatePropName(operation.qName);\r\n\r\n return {\r\n scope: Scope.Public,\r\n isAsync: true,\r\n name,\r\n parameters: hasParams\r\n ? [{ name: \"params\", type: operation.paramsModelName }, requestConfigParam]\r\n : [requestConfigParam],\r\n returnType: `ODataResponse<${odataType}<${returnType?.type || \"void\"}>>`,\r\n statements: [\r\n `if(!${qOpProp}) {`,\r\n ` ${qOpProp} = new ${operation.qName}()`,\r\n \"}\",\r\n\r\n `const { addFullPath, client, getDefaultHeaders } = this.__base;`,\r\n `const url = addFullPath(${qOpProp}.buildUrl(${isFunc && hasParams ? \"params\" : \"\"}));`,\r\n `${returnType ? \"const response = await \" : \"return\"} client.${\r\n !isFunc\r\n ? // actions: since V4\r\n `post(url, ${hasParams ? `${qOpProp}.convertUserParams(params)` : \"{}\"}, ${\r\n requestConfigParam.name\r\n }, getDefaultHeaders())`\r\n : operation.usePost\r\n ? // V2 POST => BUT values are still query params, they are not part of the request body\r\n `post(url, undefined, ${requestConfigParam.name}, getDefaultHeaders())`\r\n : // functions: since V2\r\n `get(url, ${requestConfigParam.name}, getDefaultHeaders())`\r\n };`,\r\n returnType ? `return ${qOpProp}.convertResponse(response);` : \"\",\r\n ],\r\n };\r\n }\r\n}\r\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@odata2ts/odata2ts",
3
- "version": "0.27.0",
3
+ "version": "0.29.0",
4
4
  "publishConfig": {
5
5
  "access": "public"
6
6
  },
@@ -32,33 +32,33 @@
32
32
  "LICENSE"
33
33
  ],
34
34
  "keywords": [
35
- "odata client",
35
+ "odata2ts",
36
36
  "generator",
37
+ "cli",
38
+ "odata",
37
39
  "ts",
38
40
  "model",
39
- "interface",
40
- "odata",
41
+ "odata client",
41
42
  "typescript",
42
- "odata2ts",
43
43
  "v2",
44
- "v4",
45
- "cli"
44
+ "v4"
46
45
  ],
47
46
  "peerDependencies": {
48
- "@odata2ts/odata-query-objects": "^0.18.2",
49
- "@odata2ts/odata-service": "^0.15.2"
47
+ "@odata2ts/odata-query-objects": "^0.20.0",
48
+ "@odata2ts/odata-service": "^0.17.0"
50
49
  },
51
50
  "dependencies": {
52
51
  "@odata2ts/converter-api": "^0.1.2",
53
- "@odata2ts/converter-runtime": "^0.1.5",
54
- "@odata2ts/odata-core": "^0.3.8",
55
- "@prettier/plugin-xml": "^3.1.1",
52
+ "@odata2ts/converter-runtime": "^0.2.2",
53
+ "@odata2ts/http-client-api": "^0.4.0",
54
+ "@odata2ts/odata-core": "^0.4.0",
55
+ "@prettier/plugin-xml": "^2.2.0",
56
56
  "axios": "^1.4.0",
57
57
  "camel-case": "^4.1.2",
58
58
  "commander": "^10.0.1",
59
59
  "constant-case": "^3.0.4",
60
60
  "cosmiconfig": "^8.2.0",
61
- "cosmiconfig-typescript-loader": "^4.3.0",
61
+ "cosmiconfig-typescript-loader": "^5.0.0",
62
62
  "deepmerge": "^4.3.1",
63
63
  "fs-extra": "^11.1.1",
64
64
  "pascal-case": "^3.1.2",
@@ -72,10 +72,9 @@
72
72
  },
73
73
  "devDependencies": {
74
74
  "@odata2ts/converter-v2-to-v4": "^0.1.4",
75
- "@odata2ts/http-client-api": "^0.1.0",
76
- "@odata2ts/odata-query-objects": "^0.18.2",
77
- "@odata2ts/odata-service": "^0.15.2",
78
- "@odata2ts/test-converters": "^0.2.6",
75
+ "@odata2ts/odata-query-objects": "^0.20.0",
76
+ "@odata2ts/odata-service": "^0.17.0",
77
+ "@odata2ts/test-converters": "^0.3.0",
79
78
  "@types/fs-extra": "^11.0.1",
80
79
  "@types/jest": "^29.5.2",
81
80
  "@types/node": "^20.3.0",
@@ -88,6 +87,6 @@
88
87
  "typescript": "^5.1.3"
89
88
  },
90
89
  "types": "./lib/index.d.ts",
91
- "gitHead": "3aa112edc93601c89c86c14c991534524d1d2291",
90
+ "gitHead": "547987f6e8632c24de1f02aa9854fdba97bffc77",
92
91
  "readme": "README.md"
93
92
  }