@odata2ts/odata2ts 0.29.1 → 0.31.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (42) hide show
  1. package/CHANGELOG.md +23 -0
  2. package/README.md +81 -81
  3. package/lib/FactoryFunctionModel.d.ts +1 -1
  4. package/lib/FactoryFunctionModel.js.map +1 -1
  5. package/lib/OptionModel.d.ts +54 -4
  6. package/lib/OptionModel.js.map +1 -1
  7. package/lib/app.js +1 -8
  8. package/lib/app.js.map +1 -1
  9. package/lib/data-model/DataModel.d.ts +48 -37
  10. package/lib/data-model/DataModel.js +130 -61
  11. package/lib/data-model/DataModel.js.map +1 -1
  12. package/lib/data-model/DataModelDigestion.d.ts +2 -3
  13. package/lib/data-model/DataModelDigestion.js +74 -96
  14. package/lib/data-model/DataModelDigestion.js.map +1 -1
  15. package/lib/data-model/DataModelDigestionV2.d.ts +1 -1
  16. package/lib/data-model/DataModelDigestionV2.js +30 -15
  17. package/lib/data-model/DataModelDigestionV2.js.map +1 -1
  18. package/lib/data-model/DataModelDigestionV4.js +65 -43
  19. package/lib/data-model/DataModelDigestionV4.js.map +1 -1
  20. package/lib/data-model/DataTypeModel.d.ts +10 -1
  21. package/lib/data-model/DataTypeModel.js.map +1 -1
  22. package/lib/data-model/NamingHelper.d.ts +6 -6
  23. package/lib/data-model/NamingHelper.js +14 -7
  24. package/lib/data-model/NamingHelper.js.map +1 -1
  25. package/lib/data-model/ServiceConfigHelper.d.ts +12 -3
  26. package/lib/data-model/ServiceConfigHelper.js +73 -11
  27. package/lib/data-model/ServiceConfigHelper.js.map +1 -1
  28. package/lib/defaultConfig.js +1 -0
  29. package/lib/defaultConfig.js.map +1 -1
  30. package/lib/generator/ImportContainer.d.ts +0 -1
  31. package/lib/generator/ImportContainer.js +2 -17
  32. package/lib/generator/ImportContainer.js.map +1 -1
  33. package/lib/generator/ModelGenerator.js +9 -6
  34. package/lib/generator/ModelGenerator.js.map +1 -1
  35. package/lib/generator/QueryObjectGenerator.js +12 -6
  36. package/lib/generator/QueryObjectGenerator.js.map +1 -1
  37. package/lib/generator/ServiceGenerator.js +19 -27
  38. package/lib/generator/ServiceGenerator.js.map +1 -1
  39. package/lib/project/ProjectManager.d.ts +0 -5
  40. package/lib/project/ProjectManager.js +1 -21
  41. package/lib/project/ProjectManager.js.map +1 -1
  42. package/package.json +2 -2
@@ -50,7 +50,6 @@ function getTarget(target) {
50
50
  const matchedKey = Object.keys(typescript_1.default.ScriptTarget).find((st) => st.toLowerCase() === t);
51
51
  return matchedKey ? typescript_1.default.ScriptTarget[matchedKey] : undefined;
52
52
  }
53
- const STATIC_SERVICE_DIR = "service";
54
53
  class ProjectManager {
55
54
  constructor(projectFiles, outputDir, emitMode, formatter, compilerOptions) {
56
55
  this.projectFiles = projectFiles;
@@ -58,7 +57,6 @@ class ProjectManager {
58
57
  this.emitMode = emitMode;
59
58
  this.formatter = formatter;
60
59
  this.files = {};
61
- this.serviceFiles = [];
62
60
  this.formatAndWriteFile = (file) => tslib_1.__awaiter(this, void 0, void 0, function* () {
63
61
  const fileName = file.getFilePath();
64
62
  const content = file.getFullText();
@@ -119,24 +117,6 @@ class ProjectManager {
119
117
  getMainServiceFile() {
120
118
  return this.files.mainService;
121
119
  }
122
- getServiceDir() {
123
- return path.join(this.outputDir, STATIC_SERVICE_DIR);
124
- }
125
- cleanServiceDir() {
126
- return tslib_1.__awaiter(this, void 0, void 0, function* () {
127
- return (0, fs_extra_1.emptyDir)(this.getServiceDir());
128
- });
129
- }
130
- createServiceFile(name) {
131
- return tslib_1.__awaiter(this, void 0, void 0, function* () {
132
- const file = yield this.createFile(path.join(STATIC_SERVICE_DIR, name));
133
- this.serviceFiles.push(file);
134
- return file;
135
- });
136
- }
137
- getServiceFiles() {
138
- return this.serviceFiles;
139
- }
140
120
  writeFiles() {
141
121
  return tslib_1.__awaiter(this, void 0, void 0, function* () {
142
122
  switch (this.emitMode) {
@@ -168,7 +148,7 @@ class ProjectManager {
168
148
  }
169
149
  emitTsFiles() {
170
150
  return tslib_1.__awaiter(this, void 0, void 0, function* () {
171
- const files = [this.getModelFile(), this.getQObjectFile(), this.getMainServiceFile(), ...this.getServiceFiles()];
151
+ const files = [this.getModelFile(), this.getQObjectFile(), this.getMainServiceFile()];
172
152
  console.log(`Emitting ${files.length} TS files`);
173
153
  return Promise.all([...files.filter((file) => !!file).map(this.formatAndWriteFile)]);
174
154
  });
@@ -1 +1 @@
1
- {"version":3,"file":"ProjectManager.js","sourceRoot":"","sources":["../../src/project/ProjectManager.ts"],"names":[],"mappings":"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","sourcesContent":["import { writeFile } from \"fs/promises\";\r\nimport * as path from \"path\";\r\n\r\nimport { emptyDir, remove } from \"fs-extra\";\r\nimport {\r\n CompilerOptions,\r\n ModuleKind,\r\n ModuleResolutionKind,\r\n NewLineKind,\r\n Project,\r\n ScriptTarget,\r\n SourceFile,\r\n} from \"ts-morph\";\r\nimport load from \"tsconfig-loader\";\r\nimport ts from \"typescript\";\r\n\r\nimport { ProjectFiles } from \"../data-model/DataModel\";\r\nimport { EmitModes } from \"../OptionModel\";\r\nimport { createFormatter } from \"./formatter\";\r\nimport { FileFormatter } from \"./formatter/FileFormatter\";\r\n\r\nexport async function createProjectManager(\r\n projectFiles: ProjectFiles,\r\n outputDir: string,\r\n emitMode: EmitModes,\r\n usePrettier: boolean,\r\n tsConfigPath: string = \"tsconfig.json\"\r\n): Promise<ProjectManager> {\r\n const generateDeclarations = EmitModes.js_dts === emitMode || EmitModes.dts === emitMode;\r\n const conf = load({ filename: tsConfigPath });\r\n const formatter = await createFormatter(outputDir, usePrettier);\r\n\r\n const {\r\n // ignored props\r\n noEmit, // we always want to emit\r\n importsNotUsedAsValues, // type is missing\r\n jsx,\r\n plugins,\r\n // mapped props\r\n moduleResolution,\r\n lib,\r\n module,\r\n newLine,\r\n target,\r\n rootDir,\r\n rootDirs,\r\n ...passThrough\r\n } = conf?.tsConfig.compilerOptions || {};\r\n\r\n const compilerOpts: CompilerOptions = {\r\n ...passThrough,\r\n outDir: outputDir,\r\n declaration: generateDeclarations,\r\n moduleResolution: getModuleResolutionKind(moduleResolution),\r\n module: getModuleKind(module),\r\n target: getTarget(target),\r\n lib: lib as string[],\r\n newLine:\r\n newLine?.toLowerCase() === \"crlf\"\r\n ? NewLineKind.CarriageReturnLineFeed\r\n : newLine?.toLowerCase() === \"lf\"\r\n ? NewLineKind.LineFeed\r\n : undefined,\r\n };\r\n\r\n return new ProjectManager(projectFiles, outputDir, emitMode, formatter, compilerOpts);\r\n}\r\n\r\nfunction getModuleResolutionKind(\r\n moduleResolution: string | undefined | Record<string, any>\r\n): ModuleResolutionKind | undefined {\r\n const modRes =\r\n typeof moduleResolution === \"string\"\r\n ? moduleResolution.toLowerCase() === \"node\"\r\n ? \"nodejs\"\r\n : moduleResolution.toLowerCase()\r\n : undefined;\r\n const matchedKey = Object.keys(ts.ModuleResolutionKind).find(\r\n (mk): mk is keyof typeof ModuleResolutionKind => mk.toLowerCase() === modRes\r\n );\r\n return matchedKey ? (ts.ModuleResolutionKind[matchedKey] as ModuleResolutionKind) : undefined;\r\n}\r\n\r\nfunction getModuleKind(module: string | undefined | Record<string, any>): ModuleKind | undefined {\r\n const mod = typeof module === \"string\" ? module.toLowerCase() : undefined;\r\n const matchedKey = Object.keys(ts.ModuleKind).find((mk): mk is keyof typeof ModuleKind => mk.toLowerCase() === mod);\r\n return matchedKey ? (ts.ModuleKind[matchedKey] as ModuleKind) : undefined;\r\n}\r\n\r\nfunction getTarget(target: string | undefined | Record<string, any>): ScriptTarget | undefined {\r\n const t = typeof target === \"string\" ? target.toLowerCase() : undefined;\r\n const matchedKey = Object.keys(ts.ScriptTarget).find((st): st is keyof typeof ScriptTarget => st.toLowerCase() === t);\r\n return matchedKey ? (ts.ScriptTarget[matchedKey] as ScriptTarget) : undefined;\r\n}\r\n\r\nconst STATIC_SERVICE_DIR = \"service\";\r\n\r\nexport class ProjectManager {\r\n private project!: Project;\r\n\r\n private files: { [name: string]: SourceFile } = {};\r\n private serviceFiles: Array<SourceFile> = [];\r\n\r\n constructor(\r\n private projectFiles: ProjectFiles,\r\n private outputDir: string,\r\n private emitMode: EmitModes,\r\n private formatter: FileFormatter,\r\n compilerOptions: CompilerOptions | undefined\r\n ) {\r\n // Create ts-morph project\r\n this.project = new Project({\r\n manipulationSettings: this.formatter.getSettings(),\r\n skipAddingFilesFromTsConfig: true,\r\n compilerOptions,\r\n });\r\n }\r\n\r\n private async createFile(name: string) {\r\n const fileName = path.join(this.outputDir, `${name}.ts`);\r\n await remove(fileName);\r\n return this.project.createSourceFile(fileName);\r\n }\r\n\r\n public async createModelFile() {\r\n this.files.model = await this.createFile(this.projectFiles.model);\r\n return this.getModelFile();\r\n }\r\n\r\n public getModelFile() {\r\n return this.files.model;\r\n }\r\n\r\n public async createQObjectFile() {\r\n this.files.qobject = await this.createFile(this.projectFiles.qObject);\r\n return this.getQObjectFile();\r\n }\r\n\r\n public getQObjectFile() {\r\n return this.files.qobject;\r\n }\r\n\r\n public async createMainServiceFile() {\r\n this.files.mainService = await this.createFile(this.projectFiles.service);\r\n return this.getMainServiceFile();\r\n }\r\n\r\n public getMainServiceFile() {\r\n return this.files.mainService;\r\n }\r\n\r\n public getServiceDir() {\r\n return path.join(this.outputDir, STATIC_SERVICE_DIR);\r\n }\r\n\r\n public async cleanServiceDir() {\r\n return emptyDir(this.getServiceDir());\r\n }\r\n\r\n public async createServiceFile(name: string) {\r\n const file = await this.createFile(path.join(STATIC_SERVICE_DIR, name));\r\n this.serviceFiles.push(file);\r\n\r\n return file;\r\n }\r\n\r\n public getServiceFiles() {\r\n return this.serviceFiles;\r\n }\r\n\r\n public async writeFiles() {\r\n switch (this.emitMode) {\r\n case EmitModes.js:\r\n case EmitModes.js_dts:\r\n await this.emitJsFiles();\r\n break;\r\n case EmitModes.dts:\r\n await this.emitJsFiles(true);\r\n break;\r\n case EmitModes.ts:\r\n await this.emitTsFiles();\r\n break;\r\n default:\r\n throw new Error(`Emit mode \"${this.emitMode}\" is invalid!`);\r\n }\r\n }\r\n\r\n private async emitJsFiles(declarationOnly?: boolean) {\r\n console.log(\r\n declarationOnly\r\n ? \"Emitting declaration files\"\r\n : `Emitting JS files (${this.emitMode === EmitModes.js_dts ? \"including\" : \"without\"} declaration files)`\r\n );\r\n\r\n await this.project.emit({ emitOnlyDtsFiles: !!declarationOnly });\r\n\r\n /* for (const diagnostic of this.project.getPreEmitDiagnostics()) {\r\n console.log(diagnostic.getMessageText());\r\n } */\r\n }\r\n\r\n private async emitTsFiles() {\r\n const files = [this.getModelFile(), this.getQObjectFile(), this.getMainServiceFile(), ...this.getServiceFiles()];\r\n console.log(`Emitting ${files.length} TS files`);\r\n return Promise.all([...files.filter((file) => !!file).map(this.formatAndWriteFile)]);\r\n }\r\n\r\n private formatAndWriteFile = async (file: SourceFile) => {\r\n const fileName = file.getFilePath();\r\n const content = file.getFullText();\r\n\r\n try {\r\n const formatted = await this.formatter.format(content);\r\n\r\n try {\r\n return writeFile(fileName, formatted);\r\n } catch (writeError) {\r\n console.error(`Failed to write file [/${fileName}]`, writeError);\r\n process.exit(3);\r\n }\r\n } catch (formattingError) {\r\n console.error(\"Formatting failed\");\r\n await writeFile(\"error.log\", formattingError?.toString() || \"no error message!\");\r\n process.exit(99);\r\n }\r\n };\r\n}\r\n"]}
1
+ {"version":3,"file":"ProjectManager.js","sourceRoot":"","sources":["../../src/project/ProjectManager.ts"],"names":[],"mappings":"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","sourcesContent":["import { writeFile } from \"fs/promises\";\r\nimport * as path from \"path\";\r\n\r\nimport { remove } from \"fs-extra\";\r\nimport {\r\n CompilerOptions,\r\n ModuleKind,\r\n ModuleResolutionKind,\r\n NewLineKind,\r\n Project,\r\n ScriptTarget,\r\n SourceFile,\r\n} from \"ts-morph\";\r\nimport load from \"tsconfig-loader\";\r\nimport ts from \"typescript\";\r\n\r\nimport { ProjectFiles } from \"../data-model/DataModel\";\r\nimport { EmitModes } from \"../OptionModel\";\r\nimport { createFormatter } from \"./formatter\";\r\nimport { FileFormatter } from \"./formatter/FileFormatter\";\r\n\r\nexport async function createProjectManager(\r\n projectFiles: ProjectFiles,\r\n outputDir: string,\r\n emitMode: EmitModes,\r\n usePrettier: boolean,\r\n tsConfigPath: string = \"tsconfig.json\"\r\n): Promise<ProjectManager> {\r\n const generateDeclarations = EmitModes.js_dts === emitMode || EmitModes.dts === emitMode;\r\n const conf = load({ filename: tsConfigPath });\r\n const formatter = await createFormatter(outputDir, usePrettier);\r\n\r\n const {\r\n // ignored props\r\n noEmit, // we always want to emit\r\n importsNotUsedAsValues, // type is missing\r\n jsx,\r\n plugins,\r\n // mapped props\r\n moduleResolution,\r\n lib,\r\n module,\r\n newLine,\r\n target,\r\n rootDir,\r\n rootDirs,\r\n ...passThrough\r\n } = conf?.tsConfig.compilerOptions || {};\r\n\r\n const compilerOpts: CompilerOptions = {\r\n ...passThrough,\r\n outDir: outputDir,\r\n declaration: generateDeclarations,\r\n moduleResolution: getModuleResolutionKind(moduleResolution),\r\n module: getModuleKind(module),\r\n target: getTarget(target),\r\n lib: lib as string[],\r\n newLine:\r\n newLine?.toLowerCase() === \"crlf\"\r\n ? NewLineKind.CarriageReturnLineFeed\r\n : newLine?.toLowerCase() === \"lf\"\r\n ? NewLineKind.LineFeed\r\n : undefined,\r\n };\r\n\r\n return new ProjectManager(projectFiles, outputDir, emitMode, formatter, compilerOpts);\r\n}\r\n\r\nfunction getModuleResolutionKind(\r\n moduleResolution: string | undefined | Record<string, any>\r\n): ModuleResolutionKind | undefined {\r\n const modRes =\r\n typeof moduleResolution === \"string\"\r\n ? moduleResolution.toLowerCase() === \"node\"\r\n ? \"nodejs\"\r\n : moduleResolution.toLowerCase()\r\n : undefined;\r\n const matchedKey = Object.keys(ts.ModuleResolutionKind).find(\r\n (mk): mk is keyof typeof ModuleResolutionKind => mk.toLowerCase() === modRes\r\n );\r\n return matchedKey ? (ts.ModuleResolutionKind[matchedKey] as ModuleResolutionKind) : undefined;\r\n}\r\n\r\nfunction getModuleKind(module: string | undefined | Record<string, any>): ModuleKind | undefined {\r\n const mod = typeof module === \"string\" ? module.toLowerCase() : undefined;\r\n const matchedKey = Object.keys(ts.ModuleKind).find((mk): mk is keyof typeof ModuleKind => mk.toLowerCase() === mod);\r\n return matchedKey ? (ts.ModuleKind[matchedKey] as ModuleKind) : undefined;\r\n}\r\n\r\nfunction getTarget(target: string | undefined | Record<string, any>): ScriptTarget | undefined {\r\n const t = typeof target === \"string\" ? target.toLowerCase() : undefined;\r\n const matchedKey = Object.keys(ts.ScriptTarget).find((st): st is keyof typeof ScriptTarget => st.toLowerCase() === t);\r\n return matchedKey ? (ts.ScriptTarget[matchedKey] as ScriptTarget) : undefined;\r\n}\r\n\r\nexport class ProjectManager {\r\n private project!: Project;\r\n\r\n private files: { [name: string]: SourceFile } = {};\r\n\r\n constructor(\r\n private projectFiles: ProjectFiles,\r\n private outputDir: string,\r\n private emitMode: EmitModes,\r\n private formatter: FileFormatter,\r\n compilerOptions: CompilerOptions | undefined\r\n ) {\r\n // Create ts-morph project\r\n this.project = new Project({\r\n manipulationSettings: this.formatter.getSettings(),\r\n skipAddingFilesFromTsConfig: true,\r\n compilerOptions,\r\n });\r\n }\r\n\r\n private async createFile(name: string) {\r\n const fileName = path.join(this.outputDir, `${name}.ts`);\r\n await remove(fileName);\r\n return this.project.createSourceFile(fileName);\r\n }\r\n\r\n public async createModelFile() {\r\n this.files.model = await this.createFile(this.projectFiles.model);\r\n return this.getModelFile();\r\n }\r\n\r\n public getModelFile() {\r\n return this.files.model;\r\n }\r\n\r\n public async createQObjectFile() {\r\n this.files.qobject = await this.createFile(this.projectFiles.qObject);\r\n return this.getQObjectFile();\r\n }\r\n\r\n public getQObjectFile() {\r\n return this.files.qobject;\r\n }\r\n\r\n public async createMainServiceFile() {\r\n this.files.mainService = await this.createFile(this.projectFiles.service);\r\n return this.getMainServiceFile();\r\n }\r\n\r\n public getMainServiceFile() {\r\n return this.files.mainService;\r\n }\r\n\r\n public async writeFiles() {\r\n switch (this.emitMode) {\r\n case EmitModes.js:\r\n case EmitModes.js_dts:\r\n await this.emitJsFiles();\r\n break;\r\n case EmitModes.dts:\r\n await this.emitJsFiles(true);\r\n break;\r\n case EmitModes.ts:\r\n await this.emitTsFiles();\r\n break;\r\n default:\r\n throw new Error(`Emit mode \"${this.emitMode}\" is invalid!`);\r\n }\r\n }\r\n\r\n private async emitJsFiles(declarationOnly?: boolean) {\r\n console.log(\r\n declarationOnly\r\n ? \"Emitting declaration files\"\r\n : `Emitting JS files (${this.emitMode === EmitModes.js_dts ? \"including\" : \"without\"} declaration files)`\r\n );\r\n\r\n await this.project.emit({ emitOnlyDtsFiles: !!declarationOnly });\r\n\r\n /* for (const diagnostic of this.project.getPreEmitDiagnostics()) {\r\n console.log(diagnostic.getMessageText());\r\n } */\r\n }\r\n\r\n private async emitTsFiles() {\r\n const files = [this.getModelFile(), this.getQObjectFile(), this.getMainServiceFile()];\r\n console.log(`Emitting ${files.length} TS files`);\r\n return Promise.all([...files.filter((file) => !!file).map(this.formatAndWriteFile)]);\r\n }\r\n\r\n private formatAndWriteFile = async (file: SourceFile) => {\r\n const fileName = file.getFilePath();\r\n const content = file.getFullText();\r\n\r\n try {\r\n const formatted = await this.formatter.format(content);\r\n\r\n try {\r\n return writeFile(fileName, formatted);\r\n } catch (writeError) {\r\n console.error(`Failed to write file [/${fileName}]`, writeError);\r\n process.exit(3);\r\n }\r\n } catch (formattingError) {\r\n console.error(\"Formatting failed\");\r\n await writeFile(\"error.log\", formattingError?.toString() || \"no error message!\");\r\n process.exit(99);\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.29.1",
3
+ "version": "0.31.0",
4
4
  "publishConfig": {
5
5
  "access": "public"
6
6
  },
@@ -87,6 +87,6 @@
87
87
  "typescript": "^5.1.3"
88
88
  },
89
89
  "types": "./lib/index.d.ts",
90
- "gitHead": "372172139002d0d0f4d815e58985ab23b8052243",
90
+ "gitHead": "cecca6ee336bcad3c9380c6c88d4c32225032981",
91
91
  "readme": "README.md"
92
92
  }