@open-rap/compiler 0.0.0-stage → 0.1.1

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 (227) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +21 -2
  3. package/dist/agent/server.d.ts +35 -0
  4. package/dist/agent/server.js +408 -0
  5. package/dist/agent/server.js.map +1 -0
  6. package/dist/authoring/abapgit.d.ts +38 -0
  7. package/dist/authoring/abapgit.js +242 -0
  8. package/dist/authoring/abapgit.js.map +1 -0
  9. package/dist/authoring/catalog.d.ts +48 -0
  10. package/dist/authoring/catalog.js +117 -0
  11. package/dist/authoring/catalog.js.map +1 -0
  12. package/dist/authoring/floorplan.d.ts +28 -0
  13. package/dist/authoring/floorplan.js +31 -0
  14. package/dist/authoring/floorplan.js.map +1 -0
  15. package/dist/authoring/generate.d.ts +57 -0
  16. package/dist/authoring/generate.js +630 -0
  17. package/dist/authoring/generate.js.map +1 -0
  18. package/dist/authoring/mcp.d.ts +15 -0
  19. package/dist/authoring/mcp.js +52 -0
  20. package/dist/authoring/mcp.js.map +1 -0
  21. package/dist/authoring/new.d.ts +35 -0
  22. package/dist/authoring/new.js +389 -0
  23. package/dist/authoring/new.js.map +1 -0
  24. package/dist/bdef/ast.d.ts +249 -0
  25. package/dist/bdef/ast.js +3 -0
  26. package/dist/bdef/ast.js.map +1 -0
  27. package/dist/bdef/lexer.d.ts +105 -0
  28. package/dist/bdef/lexer.js +148 -0
  29. package/dist/bdef/lexer.js.map +1 -0
  30. package/dist/bdef/parser.d.ts +22 -0
  31. package/dist/bdef/parser.js +1012 -0
  32. package/dist/bdef/parser.js.map +1 -0
  33. package/dist/build.d.ts +26 -0
  34. package/dist/build.js +62 -0
  35. package/dist/build.js.map +1 -0
  36. package/dist/cds/adapter.d.ts +91 -0
  37. package/dist/cds/adapter.js +381 -0
  38. package/dist/cds/adapter.js.map +1 -0
  39. package/dist/cds/expression-ast.d.ts +65 -0
  40. package/dist/cds/expression-ast.js +330 -0
  41. package/dist/cds/expression-ast.js.map +1 -0
  42. package/dist/cli.d.ts +9 -0
  43. package/dist/cli.js +485 -0
  44. package/dist/cli.js.map +1 -0
  45. package/dist/dcl/parser.d.ts +59 -0
  46. package/dist/dcl/parser.js +338 -0
  47. package/dist/dcl/parser.js.map +1 -0
  48. package/dist/ddic/catalog.d.ts +17 -0
  49. package/dist/ddic/catalog.js +211 -0
  50. package/dist/ddic/catalog.js.map +1 -0
  51. package/dist/ddic/cds-types.d.ts +47 -0
  52. package/dist/ddic/cds-types.js +131 -0
  53. package/dist/ddic/cds-types.js.map +1 -0
  54. package/dist/ddic/table-source.d.ts +70 -0
  55. package/dist/ddic/table-source.js +500 -0
  56. package/dist/ddic/table-source.js.map +1 -0
  57. package/dist/ddic/xml.d.ts +65 -0
  58. package/dist/ddic/xml.js +201 -0
  59. package/dist/ddic/xml.js.map +1 -0
  60. package/dist/dev.d.ts +128 -0
  61. package/dist/dev.js +434 -0
  62. package/dist/dev.js.map +1 -0
  63. package/dist/diagnostics.d.ts +33 -0
  64. package/dist/diagnostics.js +53 -0
  65. package/dist/diagnostics.js.map +1 -0
  66. package/dist/gen/abap/derived-types.d.ts +26 -0
  67. package/dist/gen/abap/derived-types.js +323 -0
  68. package/dist/gen/abap/derived-types.js.map +1 -0
  69. package/dist/gen/abap/eml.d.ts +118 -0
  70. package/dist/gen/abap/eml.js +362 -0
  71. package/dist/gen/abap/eml.js.map +1 -0
  72. package/dist/gen/abap/enums.d.ts +13 -0
  73. package/dist/gen/abap/enums.js +74 -0
  74. package/dist/gen/abap/enums.js.map +1 -0
  75. package/dist/gen/abap/framework-http.d.ts +14 -0
  76. package/dist/gen/abap/framework-http.js +1049 -0
  77. package/dist/gen/abap/framework-http.js.map +1 -0
  78. package/dist/gen/abap/framework-query.d.ts +14 -0
  79. package/dist/gen/abap/framework-query.js +225 -0
  80. package/dist/gen/abap/framework-query.js.map +1 -0
  81. package/dist/gen/abap/framework-utils.d.ts +29 -0
  82. package/dist/gen/abap/framework-utils.js +3707 -0
  83. package/dist/gen/abap/framework-utils.js.map +1 -0
  84. package/dist/gen/abap/framework.d.ts +12 -0
  85. package/dist/gen/abap/framework.js +480 -0
  86. package/dist/gen/abap/framework.js.map +1 -0
  87. package/dist/gen/abap/generate.d.ts +40 -0
  88. package/dist/gen/abap/generate.js +238 -0
  89. package/dist/gen/abap/generate.js.map +1 -0
  90. package/dist/gen/abap/rewrite.d.ts +82 -0
  91. package/dist/gen/abap/rewrite.js +957 -0
  92. package/dist/gen/abap/rewrite.js.map +1 -0
  93. package/dist/gen/abap/shadow.d.ts +25 -0
  94. package/dist/gen/abap/shadow.js +175 -0
  95. package/dist/gen/abap/shadow.js.map +1 -0
  96. package/dist/gen/abap/tokens.d.ts +33 -0
  97. package/dist/gen/abap/tokens.js +87 -0
  98. package/dist/gen/abap/tokens.js.map +1 -0
  99. package/dist/gen/app/index.d.ts +25 -0
  100. package/dist/gen/app/index.js +322 -0
  101. package/dist/gen/app/index.js.map +1 -0
  102. package/dist/gen/csdl.d.ts +11 -0
  103. package/dist/gen/csdl.js +562 -0
  104. package/dist/gen/csdl.js.map +1 -0
  105. package/dist/gen/deploy.d.ts +12 -0
  106. package/dist/gen/deploy.js +53 -0
  107. package/dist/gen/deploy.js.map +1 -0
  108. package/dist/gen/docs/index.d.ts +35 -0
  109. package/dist/gen/docs/index.js +267 -0
  110. package/dist/gen/docs/index.js.map +1 -0
  111. package/dist/gen/docs/markdown.d.ts +23 -0
  112. package/dist/gen/docs/markdown.js +187 -0
  113. package/dist/gen/docs/markdown.js.map +1 -0
  114. package/dist/gen/docs/site.d.ts +17 -0
  115. package/dist/gen/docs/site.js +106 -0
  116. package/dist/gen/docs/site.js.map +1 -0
  117. package/dist/gen/keycloak.d.ts +21 -0
  118. package/dist/gen/keycloak.js +90 -0
  119. package/dist/gen/keycloak.js.map +1 -0
  120. package/dist/gen/launchpad/index.d.ts +48 -0
  121. package/dist/gen/launchpad/index.js +302 -0
  122. package/dist/gen/launchpad/index.js.map +1 -0
  123. package/dist/gen/launchpad/ui.d.ts +14 -0
  124. package/dist/gen/launchpad/ui.js +350 -0
  125. package/dist/gen/launchpad/ui.js.map +1 -0
  126. package/dist/gen/mcp.d.ts +23 -0
  127. package/dist/gen/mcp.js +244 -0
  128. package/dist/gen/mcp.js.map +1 -0
  129. package/dist/gen/sql-expressions.d.ts +12 -0
  130. package/dist/gen/sql-expressions.js +136 -0
  131. package/dist/gen/sql-expressions.js.map +1 -0
  132. package/dist/gen/sql.d.ts +38 -0
  133. package/dist/gen/sql.js +612 -0
  134. package/dist/gen/sql.js.map +1 -0
  135. package/dist/gen/ui/index.d.ts +7 -0
  136. package/dist/gen/ui/index.js +27 -0
  137. package/dist/gen/ui/index.js.map +1 -0
  138. package/dist/gen/ui/layout.d.ts +230 -0
  139. package/dist/gen/ui/layout.js +511 -0
  140. package/dist/gen/ui/layout.js.map +1 -0
  141. package/dist/gen/ui/static.d.ts +55 -0
  142. package/dist/gen/ui/static.js +2901 -0
  143. package/dist/gen/ui/static.js.map +1 -0
  144. package/dist/gen/ui/views.d.ts +10 -0
  145. package/dist/gen/ui/views.js +511 -0
  146. package/dist/gen/ui/views.js.map +1 -0
  147. package/dist/gen/vendor.d.ts +23 -0
  148. package/dist/gen/vendor.js +68 -0
  149. package/dist/gen/vendor.js.map +1 -0
  150. package/dist/gen/xml.d.ts +9 -0
  151. package/dist/gen/xml.js +42 -0
  152. package/dist/gen/xml.js.map +1 -0
  153. package/dist/index.d.ts +20 -0
  154. package/dist/index.js +20 -0
  155. package/dist/index.js.map +1 -0
  156. package/dist/input/project.d.ts +50 -0
  157. package/dist/input/project.js +128 -0
  158. package/dist/input/project.js.map +1 -0
  159. package/dist/ir/access-controls.d.ts +11 -0
  160. package/dist/ir/access-controls.js +148 -0
  161. package/dist/ir/access-controls.js.map +1 -0
  162. package/dist/ir/authorizations.d.ts +25 -0
  163. package/dist/ir/authorizations.js +178 -0
  164. package/dist/ir/authorizations.js.map +1 -0
  165. package/dist/ir/behaviors.d.ts +16 -0
  166. package/dist/ir/behaviors.js +548 -0
  167. package/dist/ir/behaviors.js.map +1 -0
  168. package/dist/ir/builder.d.ts +20 -0
  169. package/dist/ir/builder.js +505 -0
  170. package/dist/ir/builder.js.map +1 -0
  171. package/dist/ir/config.d.ts +25 -0
  172. package/dist/ir/config.js +130 -0
  173. package/dist/ir/config.js.map +1 -0
  174. package/dist/ir/dictionary.d.ts +54 -0
  175. package/dist/ir/dictionary.js +328 -0
  176. package/dist/ir/dictionary.js.map +1 -0
  177. package/dist/ir/entities.d.ts +58 -0
  178. package/dist/ir/entities.js +676 -0
  179. package/dist/ir/entities.js.map +1 -0
  180. package/dist/ir/expressions.d.ts +33 -0
  181. package/dist/ir/expressions.js +327 -0
  182. package/dist/ir/expressions.js.map +1 -0
  183. package/dist/ir/handlers.d.ts +63 -0
  184. package/dist/ir/handlers.js +398 -0
  185. package/dist/ir/handlers.js.map +1 -0
  186. package/dist/ir/number-ranges.d.ts +24 -0
  187. package/dist/ir/number-ranges.js +74 -0
  188. package/dist/ir/number-ranges.js.map +1 -0
  189. package/dist/ir/seed.d.ts +23 -0
  190. package/dist/ir/seed.js +78 -0
  191. package/dist/ir/seed.js.map +1 -0
  192. package/dist/ir/service.d.ts +21 -0
  193. package/dist/ir/service.js +96 -0
  194. package/dist/ir/service.js.map +1 -0
  195. package/dist/launchpad/config.d.ts +47 -0
  196. package/dist/launchpad/config.js +321 -0
  197. package/dist/launchpad/config.js.map +1 -0
  198. package/dist/launchpad/workspace.d.ts +48 -0
  199. package/dist/launchpad/workspace.js +166 -0
  200. package/dist/launchpad/workspace.js.map +1 -0
  201. package/dist/srvd/parser.d.ts +36 -0
  202. package/dist/srvd/parser.js +193 -0
  203. package/dist/srvd/parser.js.map +1 -0
  204. package/dist/standard/data.d.ts +18 -0
  205. package/dist/standard/data.js +534 -0
  206. package/dist/standard/data.js.map +1 -0
  207. package/dist/standard/index.d.ts +36 -0
  208. package/dist/standard/index.js +507 -0
  209. package/dist/standard/index.js.map +1 -0
  210. package/dist/version.d.ts +2 -0
  211. package/dist/version.js +4 -0
  212. package/dist/version.js.map +1 -0
  213. package/docs/AGENTS.md +79 -0
  214. package/docs/ANNOTATIONS.md +76 -0
  215. package/docs/DECISIONS.md +1554 -0
  216. package/docs/DEPLOYMENT.md +113 -0
  217. package/docs/DIAGNOSTICS.md +116 -0
  218. package/docs/FEATURES.md +287 -0
  219. package/docs/GUIDE.md +560 -0
  220. package/docs/KNOWN_GAPS.md +216 -0
  221. package/docs/MCP.md +84 -0
  222. package/docs/PLAN.md +690 -0
  223. package/docs/README.md +148 -0
  224. package/docs/REMOTE_APIS.md +121 -0
  225. package/docs/ROADMAP.md +35 -0
  226. package/docs/UTILITIES.md +95 -0
  227. package/package.json +49 -3
@@ -0,0 +1,505 @@
1
+ /** Builds the IR (model.json) from the sources of a project. */
2
+ import { findEntityBehavior, MODEL_FORMAT_VERSION, same, sqlName, baseEntityOf, findEntity, getAnnotation, getArray, } from "@open-rap/model";
3
+ import { parseBdef } from "../bdef/parser.js";
4
+ import { readMsagXml } from "../ddic/xml.js";
5
+ import { Diagnostics } from "../diagnostics.js";
6
+ import { filesOfType, STANDARD_FOLDER } from "../input/project.js";
7
+ import { COMPILER_VERSION } from "../version.js";
8
+ import { buildBehavior } from "./behaviors.js";
9
+ import { Dictionary } from "./dictionary.js";
10
+ import { EntityResolver } from "./entities.js";
11
+ import { loadAccessControls } from "./access-controls.js";
12
+ import { checkAuthorityChecks, loadAuthorizations } from "./authorizations.js";
13
+ import { loadNumberRanges, usedServices } from "./number-ranges.js";
14
+ import { abaplintRegistry, attachHandlers, syntaxCheck } from "./handlers.js";
15
+ import { selectService } from "./service.js";
16
+ import { loadConfig } from "./config.js";
17
+ /**
18
+ * The entities of the value helps of the exposed entities (`@Consumption.valueHelpDefinition`)
19
+ * are exposed implicitly, read-only, as RAP does: the value help reads them from the service.
20
+ */
21
+ function addValueHelps(service, entities, diagnostics) {
22
+ const names = new Set(service.entitySets.map((s) => s.name.toUpperCase()));
23
+ const exposedEntities = new Set(service.entitySets.map((s) => s.entity.toUpperCase()));
24
+ for (const set of [...service.entitySets]) {
25
+ const entity = entities.resolve(set.entity);
26
+ for (const field of entity?.fields ?? []) {
27
+ for (const definition of getArray(field.annotations, "Consumption.valueHelpDefinition") ?? []) {
28
+ const target = typeof definition === "object" && definition !== null && !Array.isArray(definition) ? definition["entity"] : undefined;
29
+ const name = typeof target === "object" && target !== null && !Array.isArray(target) ? target["name"] : undefined;
30
+ if (typeof name !== "string" || exposedEntities.has(name.toUpperCase())) {
31
+ continue;
32
+ }
33
+ const resolved = entities.resolve(name);
34
+ if (resolved === undefined) {
35
+ diagnostics.warning("CDS018", `${entity?.name ?? set.entity}.${field.name}: value help entity ${name} not found, the value help is omitted`, field.src);
36
+ continue;
37
+ }
38
+ if (names.has(resolved.name.toUpperCase())) {
39
+ continue;
40
+ }
41
+ service.entitySets.push({ name: resolved.name, entity: resolved.name, valueHelp: true });
42
+ names.add(resolved.name.toUpperCase());
43
+ exposedEntities.add(resolved.name.toUpperCase());
44
+ // its text entity (`_Text` to an entity of data category #TEXT): the descriptions of the values
45
+ for (const association of resolved.associations) {
46
+ const text = entities.resolve(association.target);
47
+ if (text === undefined || getAnnotation(text.annotations, "ObjectModel.dataCategory") !== "#TEXT" || names.has(text.name.toUpperCase())) {
48
+ continue;
49
+ }
50
+ service.entitySets.push({ name: text.name, entity: text.name, valueHelp: true });
51
+ names.add(text.name.toUpperCase());
52
+ exposedEntities.add(text.name.toUpperCase());
53
+ }
54
+ }
55
+ }
56
+ }
57
+ }
58
+ /** The UI settings name entity sets of the service (D53): CFG003 otherwise. */
59
+ function checkUi(ui, service, diagnostics) {
60
+ const at = { file: "rapt/config.json", line: 1 };
61
+ const sets = new Set(service.entitySets.map((s) => s.name));
62
+ for (const set of Object.keys(ui.floorplans ?? {})) {
63
+ if (!sets.has(set))
64
+ diagnostics.error("CFG003", `rapt/config.json: ui.floorplans: no entity set ${set} in the service`, at);
65
+ }
66
+ for (const card of ui.overview?.cards ?? []) {
67
+ if (!sets.has(card.entitySet))
68
+ diagnostics.error("CFG003", `rapt/config.json: card ${card.title}: no entity set ${card.entitySet} in the service`, at);
69
+ }
70
+ return ui;
71
+ }
72
+ export function buildModel(project, options = {}) {
73
+ const diagnostics = new Diagnostics();
74
+ for (const issue of project.issues) {
75
+ diagnostics.add(issue.severity, issue.code, issue.message, { file: issue.file, line: issue.line, column: issue.column });
76
+ }
77
+ const config = loadConfig(project, diagnostics, options.mode);
78
+ const dictionary = new Dictionary(project, diagnostics);
79
+ const entities = new EntityResolver(project, dictionary, diagnostics);
80
+ // ------------------------------------------------------------------------------- service
81
+ const selection = selectService(project, options, diagnostics);
82
+ if (selection === undefined) {
83
+ return { diagnostics };
84
+ }
85
+ const { service } = selection;
86
+ // ----------------------------------------------------------------- entities, from the service
87
+ const required = new Map();
88
+ const queue = [];
89
+ if (service.webApi !== true) {
90
+ addValueHelps(service, entities, diagnostics); // a Web API has no value helps (D60)
91
+ }
92
+ const exposed = new Set(service.entitySets.map((s) => s.entity.toUpperCase()));
93
+ for (const set of service.entitySets) {
94
+ const expose = selection.ast.exposes.find((e) => same(e.entity, set.entity));
95
+ const entity = entities.resolve(set.entity);
96
+ if (entity === undefined) {
97
+ if (!entities.has(set.entity)) {
98
+ diagnostics.error("SRVD005", `exposed entity ${set.entity} not found in the sources`, {
99
+ file: selection.file.path,
100
+ line: expose?.line ?? 1,
101
+ column: expose?.column ?? 1,
102
+ });
103
+ }
104
+ continue;
105
+ }
106
+ set.entity = entity.name;
107
+ queue.push(entity.name);
108
+ }
109
+ while (queue.length > 0) {
110
+ const name = queue.shift();
111
+ if (required.has(name.toUpperCase())) {
112
+ continue;
113
+ }
114
+ const entity = entities.resolve(name);
115
+ if (entity === undefined) {
116
+ continue;
117
+ }
118
+ required.set(name.toUpperCase(), entity);
119
+ if (entity.kind === "projection" && entity.source !== undefined) {
120
+ queue.push(entity.source);
121
+ }
122
+ for (const association of entity.associations) {
123
+ // compositions and parents belong to the BO; other associations only matter when exposed
124
+ if (association.kind !== "association" || exposed.has(association.target.toUpperCase())) {
125
+ queue.push(association.target);
126
+ }
127
+ }
128
+ }
129
+ for (const entity of required.values()) {
130
+ for (const association of entity.associations) {
131
+ if (association.kind === "association" && !exposed.has(association.target.toUpperCase()) && association.src?.file.startsWith(STANDARD_FOLDER) !== true) {
132
+ diagnostics.info("SRVD006", `${entity.name}.${association.name}: target ${association.target} is not exposed, the navigation is omitted`, association.src);
133
+ }
134
+ }
135
+ }
136
+ // ------------------------------------------------------------------------------ behaviors
137
+ const bdefs = new Map();
138
+ for (const file of filesOfType(project, "BDEF").filter((f) => f.extension === "asbdef")) {
139
+ const parsed = parseBdef(file.content);
140
+ if (parsed.ast === undefined) {
141
+ for (const e of parsed.errors) {
142
+ diagnostics.error("BDEF001", e.message, { file: file.path, line: e.line, column: e.column });
143
+ }
144
+ continue;
145
+ }
146
+ bdefs.set(file.name, { ast: parsed.ast, file });
147
+ }
148
+ const behaviors = [];
149
+ const extraEntities = new Map();
150
+ const resolveForBehavior = (name) => {
151
+ const entity = entities.resolve(name);
152
+ if (entity !== undefined && !required.has(name.toUpperCase())) {
153
+ extraEntities.set(name.toUpperCase(), entity);
154
+ }
155
+ return entity;
156
+ };
157
+ for (const [name, { ast, file }] of bdefs) {
158
+ const relevant = ast.behaviors.some((b) => required.has(b.entity.text.toUpperCase()));
159
+ if (!relevant) {
160
+ continue;
161
+ }
162
+ const behavior = buildBehavior(name, ast, file, { diagnostics, dictionary, entity: resolveForBehavior, mode: config.mode });
163
+ if (behavior !== undefined) {
164
+ behaviors.push(behavior);
165
+ }
166
+ }
167
+ // entities used as action parameters or results (abstract entities) stay in the model
168
+ for (const [key, entity] of extraEntities) {
169
+ if (behaviors.some((b) => b.entities.some((e) => e.actions.some((a) => same(a.parameter ?? "", entity.name) || same(a.result?.entity ?? "", entity.name))))) {
170
+ required.set(key, entity);
171
+ }
172
+ }
173
+ // the other abstract entities of the project (types of the ABAP code: an abstract entity
174
+ // generated by a service consumption model types the data of a remote service, D31)
175
+ for (const name of entities.abstractNames()) {
176
+ if (required.has(name.toUpperCase())) {
177
+ continue;
178
+ }
179
+ const quiet = new Diagnostics();
180
+ const entity = entities.resolveInto(name, quiet);
181
+ if (entity !== undefined && !quiet.hasErrors()) {
182
+ required.set(name.toUpperCase(), entity);
183
+ }
184
+ }
185
+ checkBusinessObjects([...required.values()], behaviors, diagnostics);
186
+ // ------------------------------------------------------- authorization objects and roles (D34)
187
+ const authorizations = loadAuthorizations(project, diagnostics);
188
+ const numberRanges = loadNumberRanges(project, diagnostics);
189
+ const services = usedServices(project);
190
+ // --------------------------------------------------------------------- behavior pools (ABAP)
191
+ const pools = behaviors.flatMap((b) => [b.implementationClass, ...b.entities.map((e) => e.implementationClass)]).filter((c) => c !== undefined);
192
+ if (pools.length > 0) {
193
+ const registry = abaplintRegistry(project);
194
+ syntaxCheck(project, registry, pools, diagnostics);
195
+ for (const behavior of behaviors) {
196
+ attachHandlers(behavior, registry, project, diagnostics, [...required.values()]);
197
+ }
198
+ checkAuthorityChecks(registry, project, authorizations, diagnostics);
199
+ }
200
+ // query classes of the custom entities (D43)
201
+ const queryClasses = [...required.values()].filter((e) => e.kind === "custom" && e.queryClass !== undefined);
202
+ for (const entity of queryClasses) {
203
+ if (!project.files.some((f) => f.type === "CLAS" && f.name === entity.queryClass)) {
204
+ diagnostics.error("CDS017", `${entity.name}: query class ${entity.queryClass ?? ""} not found in the sources`, entity.src);
205
+ }
206
+ }
207
+ if (queryClasses.length > 0) {
208
+ syntaxCheck(project, abaplintRegistry(project), queryClasses.map((e) => e.queryClass ?? ""), diagnostics);
209
+ }
210
+ // --------------------------------------------------------------------------- tables, texts
211
+ const tables = new Map();
212
+ const addTable = (name) => {
213
+ if (name === undefined || tables.has(name)) {
214
+ return;
215
+ }
216
+ const table = dictionary.table(name);
217
+ if (table !== undefined) {
218
+ tables.set(name, table);
219
+ }
220
+ };
221
+ for (const entity of required.values()) {
222
+ if (entity.kind === "view" && entity.source !== undefined && dictionary.hasTable(entity.source)) {
223
+ addTable(entity.source);
224
+ }
225
+ }
226
+ for (const behavior of behaviors) {
227
+ for (const entity of behavior.entities) {
228
+ addTable(entity.persistentTable ?? entity.mapping?.table);
229
+ }
230
+ }
231
+ // the table entities of the project (D55): their tables, for the ABAP SQL of the behavior pools
232
+ for (const name of entities.tableEntityNames()) {
233
+ if (tables.has(sqlName(name))) {
234
+ continue;
235
+ }
236
+ const quiet = new Diagnostics();
237
+ const entity = entities.resolveInto(name, quiet);
238
+ if (entity !== undefined && !quiet.hasErrors()) {
239
+ addTable(entity.source);
240
+ }
241
+ else {
242
+ diagnostics.addAll(quiet);
243
+ }
244
+ }
245
+ // the other transparent tables of the project, for the ABAP SQL of the behavior pools (D26):
246
+ // one that cannot be built is left out, the BO does not need it
247
+ for (const name of dictionary.transparentTableNames()) {
248
+ const lower = sqlName(name);
249
+ if (tables.has(lower)) {
250
+ continue;
251
+ }
252
+ const quiet = new Diagnostics();
253
+ const table = dictionary.table(lower, quiet);
254
+ const problem = quiet.items.find((d) => d.severity === "error");
255
+ if (table !== undefined && problem === undefined) {
256
+ tables.set(lower, table);
257
+ }
258
+ else {
259
+ diagnostics.info("DDIC005", `${name}: not created in the database (${problem?.message ?? "not readable"}); no CDS entity or BDEF uses it`, problem?.file === undefined ? undefined : { file: problem.file, line: problem.line ?? 1 });
260
+ }
261
+ }
262
+ const messageClasses = {};
263
+ for (const file of filesOfType(project, "MSAG").filter((f) => f.extension === "xml")) {
264
+ const msag = readMsagXml(file.content);
265
+ if (msag !== undefined) {
266
+ messageClasses[msag.name.toUpperCase()] = msag.texts;
267
+ }
268
+ }
269
+ const sortedEntities = [...required.values()].sort((a, b) => a.name.localeCompare(b.name));
270
+ finalizeProjectionAssociations(sortedEntities);
271
+ deriveCompositionConditions(sortedEntities, diagnostics);
272
+ const model = {
273
+ formatVersion: MODEL_FORMAT_VERSION,
274
+ generator: { name: "open-rap-runtime", version: COMPILER_VERSION },
275
+ ...(config.mode === "enhanced" ? { mode: config.mode } : {}),
276
+ ...(config.ui === undefined ? {} : { ui: checkUi(config.ui, service, diagnostics) }),
277
+ service,
278
+ tables: [...tables.values()].sort((a, b) => a.name.localeCompare(b.name)),
279
+ entities: sortedEntities,
280
+ behaviors: behaviors.sort((a, b) => a.name.localeCompare(b.name)),
281
+ messageClasses,
282
+ ...(authorizations === undefined ? {} : { authorizations }),
283
+ ...(numberRanges === undefined ? {} : { numberRanges }),
284
+ ...(services === undefined ? {} : { services }),
285
+ };
286
+ const enumTypes = dictionary.cdsTypeEntries().flatMap((t) => (t.info.enum === undefined ? [] : [t.info.enum]));
287
+ if (enumTypes.length > 0) {
288
+ model.enumTypes = enumTypes.sort((a, b) => a.name.localeCompare(b.name));
289
+ }
290
+ checkExposedTypes(model, diagnostics);
291
+ if (model.service.webApi !== true) {
292
+ applyDraft(model, diagnostics); // a Web API exposes the active instances only (D60)
293
+ }
294
+ // access controls (DCL) of the exposed entities (D35)
295
+ const accessControls = loadAccessControls(project, model, authorizations, diagnostics);
296
+ if (accessControls.length > 0) {
297
+ model.accessControls = accessControls;
298
+ }
299
+ return diagnostics.hasErrors() ? { diagnostics, model } : { diagnostics, model };
300
+ }
301
+ /**
302
+ * CDS enumerated types in the service (D55): SAP does not expose them in RAP OData services, the
303
+ * enhanced mode exposes them as OData enumeration types. Exposed table entities need keys.
304
+ */
305
+ function checkExposedTypes(model, diagnostics) {
306
+ for (const set of model.service.entitySets) {
307
+ const entity = findEntity(model, set.entity);
308
+ if (entity === undefined) {
309
+ continue;
310
+ }
311
+ if (entity.fields.every((f) => !f.key)) {
312
+ diagnostics.error("CDS011", `${entity.name}: an exposed entity needs key elements`, entity.src);
313
+ }
314
+ if (model.mode === "enhanced") {
315
+ continue;
316
+ }
317
+ for (const field of entity.fields.filter((f) => f.type.enumType !== undefined)) {
318
+ diagnostics.error("CDS021", `${entity.name}.${field.name}: SAP does not expose CDS enumerated types (${field.type.enumType ?? ""}) in RAP OData services; set "mode": "enhanced" in rapt/config.json to expose an OData enumeration type`, field.src);
319
+ }
320
+ }
321
+ }
322
+ /** The entity of the administrative data of the drafts (D54), a table of the runtime. */
323
+ export const DRAFT_ADMIN_ENTITY = "DraftAdministrativeData";
324
+ export const DRAFT_ADMIN_TABLE = "rapt_draft_admin";
325
+ /** The users of the collaborative drafts (D59). */
326
+ export const DRAFT_USER_ENTITY = "DraftAdministrativeUser";
327
+ export const DRAFT_USER_TABLE = "rapt_draft_user";
328
+ /**
329
+ * Draft (D54): each exposed entity of a draft BO gets the key IsActiveEntity, HasActiveEntity,
330
+ * HasDraftEntity and DraftUUID (to DraftAdministrativeData), its compositions join on
331
+ * IsActiveEntity too, and it is read from a view of its active instances and its drafts.
332
+ */
333
+ function applyDraft(model, diagnostics) {
334
+ const drafted = new Map();
335
+ for (const behavior of model.behaviors.filter((b) => b.implementationType === "managed" && b.draft === true)) {
336
+ const collaborative = behavior.collaborativeDraft === true;
337
+ const root = behavior.entities.find((e) => e.root);
338
+ if (collaborative && root !== undefined && root.draftShare !== true) {
339
+ diagnostics.error("BDEF029", `${root.entity}: with collaborative draft needs the draft action Share (draft action Share;)`, root.src);
340
+ }
341
+ for (const entity of behavior.entities) {
342
+ if (entity.draftTable === undefined) {
343
+ diagnostics.error("BDEF028", `${entity.entity}: a draft BO needs a draft table for each entity (draft table <name>)`, entity.src);
344
+ continue;
345
+ }
346
+ if (entity.persistentTable === undefined) {
347
+ diagnostics.error("BDEF028", `${entity.entity}: draft needs a persistent table (not an unmanaged save)`, entity.src);
348
+ continue;
349
+ }
350
+ drafted.set(entity.entity.toUpperCase(), { table: entity.draftTable, root: entity.root, collaborative });
351
+ }
352
+ }
353
+ if (drafted.size === 0) {
354
+ return;
355
+ }
356
+ const exposed = model.service.entitySets.map((set) => findEntity(model, set.entity)).filter((e) => e !== undefined);
357
+ const isDrafted = (entity) => drafted.has(baseEntityOf(model, entity).name.toUpperCase());
358
+ const bool = { kind: "bool" };
359
+ for (const entity of exposed.filter(isDrafted)) {
360
+ const base = baseEntityOf(model, entity);
361
+ const info = drafted.get(base.name.toUpperCase());
362
+ const hidden = { ui: { hidden: true } };
363
+ entity.fields.push({ name: "IsActiveEntity", type: bool, key: true, annotations: { endusertext: { label: "Is Active" }, ...hidden }, draft: true }, { name: "HasActiveEntity", type: bool, key: false, annotations: { endusertext: { label: "Has Active" }, ...hidden }, draft: true }, { name: "HasDraftEntity", type: bool, key: false, annotations: { endusertext: { label: "Has Draft" }, ...hidden }, draft: true }, { name: "DraftUUID", type: { kind: "raw", length: 16 }, key: false, annotations: { endusertext: { label: "Draft" }, ...hidden }, draft: true });
364
+ for (const association of entity.associations) {
365
+ const target = exposed.find((e) => same(e.name, association.target));
366
+ if ((association.kind === "composition" || association.kind === "toParent") && target !== undefined && isDrafted(target)) {
367
+ association.on.push({ source: "IsActiveEntity", target: "IsActiveEntity" });
368
+ }
369
+ }
370
+ entity.associations.push({ name: DRAFT_ADMIN_ENTITY, target: DRAFT_ADMIN_ENTITY, kind: "association", cardinality: { min: 0, max: 1 }, on: [{ source: "DraftUUID", target: "DraftUUID" }] });
371
+ entity.draft = { view: `${entity.sqlView ?? sqlName(entity.name)}_all`.slice(0, 63), table: info.table, base: base.name, root: info.root, ...(info.collaborative ? { collaborative: true } : {}) };
372
+ }
373
+ const text = (length) => ({ kind: "char", length });
374
+ const stamp = { kind: "timestampl" };
375
+ const label = (l) => ({ endusertext: { label: l } });
376
+ model.entities.push({
377
+ name: DRAFT_ADMIN_ENTITY,
378
+ kind: "view",
379
+ root: false,
380
+ sqlView: DRAFT_ADMIN_TABLE,
381
+ fields: [
382
+ { name: "DraftUUID", type: { kind: "raw", length: 16 }, key: true, annotations: label("Draft") },
383
+ { name: "CreationDateTime", type: stamp, key: false, annotations: label("Draft Created On") },
384
+ { name: "CreatedByUser", type: text(12), key: false, annotations: label("Draft Created By") },
385
+ { name: "LastChangeDateTime", type: stamp, key: false, annotations: label("Draft Last Changed On") },
386
+ { name: "LastChangedByUser", type: text(12), key: false, annotations: label("Draft Last Changed By") },
387
+ { name: "InProcessByUser", type: text(12), key: false, annotations: label("Draft In Process By") },
388
+ ],
389
+ associations: [],
390
+ annotations: label("Draft Administrative Data"),
391
+ draft: { admin: true },
392
+ });
393
+ model.service.entitySets.push({ name: DRAFT_ADMIN_ENTITY, entity: DRAFT_ADMIN_ENTITY, draftAdministrativeData: true });
394
+ if ([...drafted.values()].some((d) => d.collaborative)) {
395
+ // collaborative draft (D59): the users of a draft, DraftAdministrativeData/DraftAdministrativeUser
396
+ const admin = model.entities.find((e) => e.name === DRAFT_ADMIN_ENTITY);
397
+ admin.associations.push({ name: DRAFT_USER_ENTITY, target: DRAFT_USER_ENTITY, kind: "association", cardinality: { min: 0, max: "*" }, on: [{ source: "DraftUUID", target: "DraftUUID" }] });
398
+ model.entities.push({
399
+ name: DRAFT_USER_ENTITY,
400
+ kind: "view",
401
+ root: false,
402
+ sqlView: DRAFT_USER_TABLE,
403
+ fields: [
404
+ { name: "DraftUUID", type: { kind: "raw", length: 16 }, key: true, annotations: label("Draft") },
405
+ { name: "UserID", type: text(12), key: true, annotations: label("User") },
406
+ { name: "UserDescription", type: text(80), key: false, annotations: label("User Name") },
407
+ { name: "UserAccessRole", type: text(1), key: false, annotations: label("Access Role") },
408
+ { name: "UserEditingState", type: text(1), key: false, annotations: label("Editing State") },
409
+ ],
410
+ associations: [],
411
+ annotations: label("Draft Administrative User"),
412
+ draft: { admin: true },
413
+ });
414
+ model.service.entitySets.push({ name: DRAFT_USER_ENTITY, entity: DRAFT_USER_ENTITY, draftAdministrativeData: true });
415
+ }
416
+ }
417
+ /** The ON pairs of projection associations name the target fields as the target projection does. */
418
+ function finalizeProjectionAssociations(entities) {
419
+ for (const entity of entities.filter((e) => e.kind === "projection")) {
420
+ for (const association of entity.associations) {
421
+ const target = entities.find((e) => same(e.name, association.target));
422
+ if (target === undefined) {
423
+ continue;
424
+ }
425
+ for (const pair of association.on) {
426
+ const field = target.fields.find((f) => same(f.baseField ?? f.name, pair.target) || same(f.name, pair.target));
427
+ if (field !== undefined) {
428
+ pair.target = field.name;
429
+ }
430
+ }
431
+ }
432
+ }
433
+ }
434
+ /**
435
+ * A CDS composition has no ON condition: it is the inverse of the to-parent association of the
436
+ * child (`association to parent X as _P on $projection.ParentKey = _P.Key`).
437
+ */
438
+ function deriveCompositionConditions(entities, diagnostics) {
439
+ for (const entity of entities) {
440
+ for (const composition of entity.associations.filter((a) => a.kind === "composition" && a.on.length === 0)) {
441
+ const child = entities.find((e) => same(e.name, composition.target));
442
+ const toParent = child?.associations.find((a) => a.kind === "toParent" && same(a.target, entity.name));
443
+ if (toParent === undefined) {
444
+ diagnostics.error("CDS015", `${entity.name}.${composition.name}: ${composition.target} has no association to parent ${entity.name}`, composition.src);
445
+ continue;
446
+ }
447
+ composition.on = toParent.on.map((pair) => ({ source: pair.target, target: pair.source }));
448
+ }
449
+ }
450
+ }
451
+ /** Cross-object checks: composition trees, projections against their base behavior. */
452
+ function checkBusinessObjects(entities, behaviors, diagnostics) {
453
+ const model = { behaviors };
454
+ for (const behavior of behaviors.filter((b) => b.implementationType === "managed")) {
455
+ for (const entityBehavior of behavior.entities) {
456
+ const entity = entities.find((e) => same(e.name, entityBehavior.entity));
457
+ if (entity === undefined) {
458
+ continue;
459
+ }
460
+ for (const composition of entity.associations.filter((a) => a.kind === "composition")) {
461
+ if (!behavior.entities.some((e) => same(e.entity, composition.target))) {
462
+ diagnostics.error("BDEF024", `${entity.name}.${composition.name}: the composition child ${composition.target} has no behavior in ${behavior.name}`, entityBehavior.src);
463
+ }
464
+ }
465
+ if (!entity.root && !entity.associations.some((a) => a.kind === "toParent")) {
466
+ diagnostics.error("BDEF025", `${entity.name}: a child entity needs an association to parent`, entityBehavior.src);
467
+ }
468
+ }
469
+ }
470
+ for (const behavior of behaviors.filter((b) => b.implementationType === "projection")) {
471
+ for (const projected of behavior.entities) {
472
+ const entity = entities.find((e) => same(e.name, projected.entity));
473
+ if (entity === undefined || entity.kind !== "projection" || entity.source === undefined) {
474
+ diagnostics.error("BDEF026", `${projected.entity}: a projection BDEF must be defined on a projection view`, projected.src);
475
+ continue;
476
+ }
477
+ const base = findEntityBehavior(model, entity.source);
478
+ if (base === undefined || base.behavior.implementationType !== "managed") {
479
+ diagnostics.error("BDEF026", `${projected.entity}: the projected entity ${entity.source} has no managed behavior`, projected.src);
480
+ continue;
481
+ }
482
+ for (const operation of projected.operations) {
483
+ const baseOperation = base.entity.operations.find((o) => o.kind === operation.kind);
484
+ if (baseOperation === undefined || baseOperation.internal) {
485
+ diagnostics.error("BDEF023", `${projected.entity}: use ${operation.kind}, but ${base.entity.entity} has no public ${operation.kind}`, projected.src);
486
+ }
487
+ }
488
+ for (const action of projected.actions) {
489
+ const baseAction = base.entity.actions.find((a) => same(a.name, action.name));
490
+ if (baseAction === undefined || baseAction.internal) {
491
+ diagnostics.error("BDEF023", `${projected.entity}: use ${action.kind} ${action.name}, but ${base.entity.entity} has no public ${action.kind} ${action.name}`, action.src);
492
+ }
493
+ }
494
+ for (const association of projected.associations) {
495
+ const projectedAssociation = entity.associations.find((a) => same(a.name, association.name));
496
+ const baseName = projectedAssociation?.baseAssociation ?? association.name;
497
+ const baseAssociation = base.entity.associations.find((a) => same(a.name, baseName));
498
+ if (association.create && (baseAssociation === undefined || !baseAssociation.create || baseAssociation.createInternal)) {
499
+ diagnostics.error("BDEF023", `${projected.entity}: use association ${association.name} { create; }, but the base does not allow it`, projected.src);
500
+ }
501
+ }
502
+ }
503
+ }
504
+ }
505
+ //# sourceMappingURL=builder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"builder.js","sourceRoot":"","sources":["../../src/ir/builder.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * The configuration of a project (decision D45): `rapt/config.json` next to the abapGit sources.
3
+ *
4
+ * ```json
5
+ * { "mode": "enhanced" }
6
+ * ```
7
+ *
8
+ * - `standard` (default): the sources behave as on SAP; what SAP refuses, Open RAP Runtime refuses.
9
+ * A project that builds in this mode can be imported and activated on SAP.
10
+ * - `enhanced`: Open RAP Runtime extensions that SAP does not have: a managed BO with unmanaged save
11
+ * on a custom entity (D43), `field ( mandatory )` checked when saving without a validation.
12
+ *
13
+ * `rapt … --mode standard|enhanced` overrides the file.
14
+ */
15
+ import type { ProjectMode, UiConfigModel } from "@open-rap/model";
16
+ import type { Diagnostics } from "../diagnostics.js";
17
+ import type { Project } from "../input/project.js";
18
+ export declare const CONFIG_FILE = "rapt/config.json";
19
+ export declare const MODES: readonly ProjectMode[];
20
+ export interface ProjectConfig {
21
+ mode: ProjectMode;
22
+ /** `ui` of rapt/config.json (D53), checked against the service by the IR builder. */
23
+ ui?: UiConfigModel;
24
+ }
25
+ export declare function loadConfig(project: Project, diagnostics: Diagnostics, override?: string): ProjectConfig;