@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,242 @@
1
+ /**
2
+ * `rapt abapgit` (decision D42): writes the abapGit metadata (`.xml` files, `.abapgit.xml`,
3
+ * `package.devc.xml`) the sources lack, so that a project written only as source code can be
4
+ * pulled into an SAP system with abapGit.
5
+ *
6
+ * - tables written as source (`.tabl.astabl`): their XML is (re)generated from the source, and
7
+ * `.abapgit.xml` ignores the `.astabl` files (abapGit does not know them);
8
+ * - CDS entities, metadata extensions, access controls, behavior definitions, service
9
+ * definitions, classes and interfaces: the XML is created when missing (description from
10
+ * `@EndUserText.label` or the ABAP Doc short text, CDS source type from the source); an existing
11
+ * XML file is never changed.
12
+ */
13
+ import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
14
+ import path from "node:path";
15
+ import { abapGitXml, xmlElement } from "../ddic/table-source.js";
16
+ import { loadProject } from "../input/project.js";
17
+ const DESCRIPTION_LIMIT = 60;
18
+ const ASTABL_IGNORE = "*.astabl";
19
+ const DEFAULT_DOT_ABAPGIT = `<?xml version="1.0" encoding="utf-8"?>
20
+ <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
21
+ <asx:values>
22
+ <DATA>
23
+ <MASTER_LANGUAGE>E</MASTER_LANGUAGE>
24
+ <STARTING_FOLDER>/src/</STARTING_FOLDER>
25
+ <FOLDER_LOGIC>PREFIX</FOLDER_LOGIC>
26
+ <IGNORE>
27
+ <item>/.gitignore</item>
28
+ <item>/LICENSE</item>
29
+ <item>/README.md</item>
30
+ </IGNORE>
31
+ </DATA>
32
+ </asx:values>
33
+ </asx:abap>
34
+ `;
35
+ const truncate = (text) => (text.length > DESCRIPTION_LIMIT ? text.slice(0, DESCRIPTION_LIMIT) : text);
36
+ /** The AFF metadata of a CDS type (DRTY): `<name>.drty.json`, format of SAP/abap-file-formats. */
37
+ export function drtyJson(description) {
38
+ return `${JSON.stringify({ formatVersion: "1", header: { description: truncate(description), originalLanguage: "en" } }, null, 2)}\n`;
39
+ }
40
+ /** `@EndUserText.label: '…'` before the definition. */
41
+ export function cdsLabel(source) {
42
+ const header = source.split(/\bdefine\b|\bannotate\b|\bextend\b/i)[0] ?? source;
43
+ return /@EndUserText\.label\s*:\s*'((?:[^']|'')*)'/i.exec(header)?.[1]?.replace(/''/g, "'");
44
+ }
45
+ /** Source type of a CDS DDL source (DDLS-SOURCE_TYPE). */
46
+ export function ddlSourceType(source) {
47
+ const code = source.replace(/\/\/.*$/gm, "").replace(/\/\*[\s\S]*?\*\//g, "");
48
+ if (/\bdefine\s+(?:root\s+)?view\s+entity\s+\S+(?:\s+provider\s+contract\s+\w+)?\s+as\s+projection\s+on\b/i.test(code))
49
+ return "P";
50
+ if (/\bdefine\s+(?:root\s+)?view\s+entity\b/i.test(code))
51
+ return "W";
52
+ if (/\bdefine\s+(?:root\s+)?abstract\s+entity\b/i.test(code))
53
+ return "A";
54
+ if (/\bdefine\s+(?:root\s+)?custom\s+entity\b/i.test(code))
55
+ return "Q";
56
+ if (/\bdefine\s+(?:root\s+)?table\s+entity\b/i.test(code))
57
+ return "T";
58
+ if (/\bdefine\s+table\s+function\b/i.test(code))
59
+ return "F";
60
+ if (/\bdefine\s+(?:root\s+)?hierarchy\b/i.test(code))
61
+ return "H";
62
+ if (/\bdefine\s+(?:root\s+)?view\b/i.test(code))
63
+ return "V";
64
+ return undefined;
65
+ }
66
+ /** The ABAP Doc short text of a class or interface: `"! <p class="shorttext synchronized">…</p>`. */
67
+ export function abapDocShortText(source) {
68
+ return /"!\s*<p\s+class="shorttext[^"]*"[^>]*>([^<]*)<\/p>/i.exec(source)?.[1]?.trim();
69
+ }
70
+ function ddlsXml(name, source, type) {
71
+ return abapGitXml("DDLS", xmlElement("DDLS", [
72
+ ["DDLNAME", name],
73
+ ["DDLANGUAGE", "E"],
74
+ ["DDTEXT", truncate(cdsLabel(source) ?? name)],
75
+ ["SOURCE_TYPE", type],
76
+ ], 3));
77
+ }
78
+ function adtObjectXml(serializer, type, name, description, extra = []) {
79
+ return abapGitXml(serializer, xmlElement(serializer, [
80
+ ["NAME", name],
81
+ ["TYPE", type],
82
+ ["DESCRIPTION", truncate(description)],
83
+ ["DESCRIPTION_TEXT_LIMIT", String(DESCRIPTION_LIMIT)],
84
+ ["LANGUAGE", "EN"],
85
+ ...extra,
86
+ ], 3));
87
+ }
88
+ function classXml(name, files) {
89
+ const main = files.find((f) => f.extension === "abap")?.content ?? "";
90
+ const behavior = /\bfor\s+behavior\s+of\s+(\S+?)\s*[.\s]/i.exec(main)?.[1];
91
+ const description = abapDocShortText(main) ?? (behavior === undefined ? name : `Behavior pool of ${behavior.toUpperCase()}`);
92
+ const definition = /\bclass\s+\S+\s+definition\b([\s\S]*?)\./i.exec(main)?.[1] ?? "";
93
+ const exception = /\binheriting\s+from\s+c[xy]_/i.test(definition);
94
+ return abapGitXml("CLAS", xmlElement("VSEOCLASS", [
95
+ ["CLSNAME", name],
96
+ ["LANGU", "E"],
97
+ ["DESCRIPT", truncate(description)],
98
+ ["CATEGORY", exception ? "40" : undefined],
99
+ ["STATE", "1"],
100
+ ["CLSCCINCL", "X"],
101
+ ["FIXPT", "X"],
102
+ ["UNICODE", "X"],
103
+ ["WITH_UNIT_TESTS", files.some((f) => f.extension === "testclasses.abap") ? "X" : undefined],
104
+ ["ABSTRACT", /\babstract\b/i.test(definition) || behavior !== undefined ? "X" : undefined],
105
+ ], 3));
106
+ }
107
+ function interfaceXml(name, source) {
108
+ return abapGitXml("INTF", xmlElement("VSEOINTERF", [
109
+ ["CLSNAME", name],
110
+ ["LANGU", "E"],
111
+ ["DESCRIPT", truncate(abapDocShortText(source) ?? name)],
112
+ ["EXPOSURE", "2"],
113
+ ["STATE", "1"],
114
+ ["UNICODE", "X"],
115
+ ], 3));
116
+ }
117
+ /** The XML of one object, from its source files; undefined when it cannot be derived. */
118
+ function objectXml(type, name, files) {
119
+ const source = (extension) => files.find((f) => f.extension === extension)?.content;
120
+ switch (type) {
121
+ case "DDLS": {
122
+ const ddl = source("asddls") ?? "";
123
+ const sourceType = ddlSourceType(ddl);
124
+ return sourceType === undefined ? { reason: "unknown kind of CDS definition (view entity, projection, abstract, custom or table entity expected)" } : ddlsXml(name, ddl, sourceType);
125
+ }
126
+ case "DDLX": {
127
+ const ddlx = source("asddlxs") ?? "";
128
+ const target = /\bannotate\s+(?:entity|view)\s+(\S+)/i.exec(ddlx)?.[1];
129
+ return adtObjectXml("DDLX", "DDLX/EX", name, cdsLabel(ddlx) ?? `Metadata extension of ${target?.toUpperCase() ?? name}`);
130
+ }
131
+ case "DCLS": {
132
+ const dcl = source("asdcls") ?? "";
133
+ return abapGitXml("DCLS", xmlElement("DCLS", [
134
+ ["DCLNAME", name],
135
+ ["DDLANGUAGE", "E"],
136
+ ["DDTEXT", truncate(cdsLabel(dcl) ?? `Access control ${name}`)],
137
+ ], 3));
138
+ }
139
+ case "BDEF":
140
+ return adtObjectXml("BDEF", "BDEF/BDO", name, `Behavior of ${name}`);
141
+ case "SRVD": {
142
+ const srvd = source("srvdsrv") ?? "";
143
+ return adtObjectXml("SRVD", "SRVD/SRV", name, cdsLabel(srvd) ?? `Service ${name}`, [["SOURCE_TYPE", "S"]]);
144
+ }
145
+ case "CLAS":
146
+ return classXml(name, files);
147
+ case "INTF":
148
+ return interfaceXml(name, source("abap") ?? "");
149
+ default:
150
+ return { reason: `the XML of a ${type} object cannot be derived from a source: write it in ADT or with "rapt new"` };
151
+ }
152
+ }
153
+ /** Adds `*.astabl` to the ignored files of `.abapgit.xml`. */
154
+ function ignoreTableSources(xml) {
155
+ if (xml.includes(ASTABL_IGNORE)) {
156
+ return xml;
157
+ }
158
+ const folder = /<STARTING_FOLDER>([^<]*)<\/STARTING_FOLDER>/.exec(xml)?.[1] ?? "/src/";
159
+ const item = `<item>${folder}${ASTABL_IGNORE}</item>`;
160
+ if (/<IGNORE\s*\/>/.test(xml)) {
161
+ return xml.replace(/<IGNORE\s*\/>/, `<IGNORE>\n ${item}\n </IGNORE>`);
162
+ }
163
+ if (xml.includes("</IGNORE>")) {
164
+ return xml.replace(/(\n?)(\s*)<\/IGNORE>/, `\n ${item}$1$2</IGNORE>`);
165
+ }
166
+ return xml.replace(/(\s*)<\/DATA>/, `\n <IGNORE>\n ${item}\n </IGNORE>$1</DATA>`);
167
+ }
168
+ export function generateAbapGitFiles(dir, options = {}) {
169
+ const root = path.resolve(dir);
170
+ const result = { written: [], skipped: [], issues: [] };
171
+ const write = (file, content) => {
172
+ const absolute = path.join(root, file);
173
+ if (existsSync(absolute) && readFileSync(absolute, "utf8") === content) {
174
+ return;
175
+ }
176
+ result.written.push(file.split(path.sep).join("/"));
177
+ if (options.check !== true) {
178
+ mkdirSync(path.dirname(absolute), { recursive: true });
179
+ writeFileSync(absolute, content);
180
+ }
181
+ };
182
+ // .abapgit.xml, first: it gives the folder of the sources
183
+ const dotAbapGit = path.join(root, ".abapgit.xml");
184
+ const hadDotAbapGit = existsSync(dotAbapGit);
185
+ const existing = hadDotAbapGit ? readFileSync(dotAbapGit, "utf8") : DEFAULT_DOT_ABAPGIT;
186
+ let project = loadProject(root);
187
+ const hasTableSources = project.files.some((f) => f.generatedFrom === "astabl" && f.standard !== true);
188
+ write(".abapgit.xml", hasTableSources ? ignoreTableSources(existing) : existing);
189
+ if (!hadDotAbapGit && options.check !== true) {
190
+ project = loadProject(root);
191
+ }
192
+ result.issues.push(...project.issues);
193
+ const relative = (absolute) => path.relative(root, absolute);
194
+ const sourceRoot = hadDotAbapGit || options.check !== true ? project.sourceRoot : path.join(root, "src");
195
+ const packageFile = path.join(sourceRoot, "package.devc.xml");
196
+ if (!existsSync(packageFile)) {
197
+ const description = options.packageDescription ?? path.basename(root);
198
+ write(relative(packageFile), abapGitXml("DEVC", xmlElement("DEVC", [["CTEXT", truncate(description)]], 3)));
199
+ }
200
+ // objects: type:name → files
201
+ const objects = new Map();
202
+ for (const file of project.files) {
203
+ if (file.standard === true) {
204
+ continue; // a standard object of SAP (D44), not a file of the project
205
+ }
206
+ const key = `${file.type}:${file.name}`;
207
+ objects.set(key, [...(objects.get(key) ?? []), file]);
208
+ }
209
+ for (const [key, files] of objects) {
210
+ const [type = "", name = ""] = key.split(":");
211
+ const generated = files.find((f) => f.generatedFrom === "astabl");
212
+ if (generated !== undefined) {
213
+ write(relative(path.join(path.dirname(generated.absolute), generated.fileName)), generated.content);
214
+ continue;
215
+ }
216
+ if (files.some((f) => f.extension === "xml")) {
217
+ continue;
218
+ }
219
+ const main = files[0];
220
+ if (main === undefined) {
221
+ continue;
222
+ }
223
+ if (type === "DRTY") {
224
+ // a CDS type is an ABAP file format object (AFF): <name>.drty.acds and <name>.drty.json (D55)
225
+ if (!files.some((f) => f.extension === "json")) {
226
+ const source = files.find((f) => f.extension === "acds" || f.extension === "asdrty");
227
+ const baseName = main.fileName.split(".")[0] ?? name.toLowerCase();
228
+ write(relative(path.join(path.dirname(main.absolute), `${baseName}.drty.json`)), drtyJson(cdsLabel(source?.content ?? "") ?? name));
229
+ }
230
+ continue;
231
+ }
232
+ const xml = objectXml(type, name, files);
233
+ if (typeof xml !== "string") {
234
+ result.skipped.push({ file: main.path, reason: xml.reason });
235
+ continue;
236
+ }
237
+ const baseName = main.fileName.split(".")[0] ?? name.toLowerCase();
238
+ write(relative(path.join(path.dirname(main.absolute), `${baseName}.${type.toLowerCase()}.xml`)), xml);
239
+ }
240
+ return result;
241
+ }
242
+ //# sourceMappingURL=abapgit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"abapgit.js","sourceRoot":"","sources":["../../src/authoring/abapgit.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,48 @@
1
+ /**
2
+ * The catalog of the objects `rapt generate` creates (D61), grouped as in the "New ABAP Repository
3
+ * Object" wizard of ADT: what each one is, what it derives from, which inputs it asks. The VS Code
4
+ * extension builds its creation wizard from it (`rapt generate <src> --json` without a kind), so
5
+ * the command line stays the single source of truth.
6
+ *
7
+ * And the floorplans of the generated UI (D53), with what each one is for, for `rapt floorplan`.
8
+ */
9
+ export type ObjectCategory = "Business Object" | "Dictionary" | "Core Data Services" | "Behavior" | "Business Services" | "Source Code Library";
10
+ export interface ObjectInput {
11
+ /** The CLI option: --from, --for, --expose, --root, --binding-type, --type. */
12
+ option: "--from" | "--for" | "--expose" | "--root" | "--binding-type" | "--type";
13
+ label: string;
14
+ /** What to pick from: the objects of the project of that kind, or fixed values. */
15
+ of?: "table" | "entity" | "bdef" | "srvd" | "domain";
16
+ values?: string[];
17
+ required: boolean;
18
+ /** --expose: several objects. */
19
+ multiple?: boolean;
20
+ default?: string;
21
+ }
22
+ export interface CatalogEntry {
23
+ kind: string;
24
+ category: ObjectCategory;
25
+ label: string;
26
+ description: string;
27
+ /** The files written (abapGit names). */
28
+ files: string;
29
+ maxLength: number;
30
+ /** A name to start from: ZR_…, ZC_… */
31
+ namePattern: string;
32
+ inputs: ObjectInput[];
33
+ }
34
+ export declare const OBJECT_CATALOG: CatalogEntry[];
35
+ export type FloorplanName = "listReport" | "worklist" | "analyticalListPage" | "formEntry";
36
+ export declare const FLOORPLAN_CATALOG: Array<{
37
+ floorplan: FloorplanName;
38
+ label: string;
39
+ description: string;
40
+ needs: string;
41
+ }>;
42
+ /** The floorplans of rapt/config.json (`ui.floorplans`). */
43
+ export declare function readFloorplans(dir: string): Record<string, string>;
44
+ /**
45
+ * Sets the floorplan of an entity set in rapt/config.json, keeping the rest of the file. The
46
+ * default (listReport) is written too: it records that the floorplan was chosen (D63).
47
+ */
48
+ export declare function writeFloorplan(dir: string, set: string, floorplan: FloorplanName): string;
@@ -0,0 +1,117 @@
1
+ /**
2
+ * The catalog of the objects `rapt generate` creates (D61), grouped as in the "New ABAP Repository
3
+ * Object" wizard of ADT: what each one is, what it derives from, which inputs it asks. The VS Code
4
+ * extension builds its creation wizard from it (`rapt generate <src> --json` without a kind), so
5
+ * the command line stays the single source of truth.
6
+ *
7
+ * And the floorplans of the generated UI (D53), with what each one is for, for `rapt floorplan`.
8
+ */
9
+ import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
10
+ import path from "node:path";
11
+ export const OBJECT_CATALOG = [
12
+ {
13
+ kind: "bo",
14
+ category: "Business Object",
15
+ label: "Complete business object",
16
+ description: "Table, view, projection, metadata extension, BDEF, behavior pool, service and binding of a managed BO, with data (rapt new).",
17
+ files: "all the objects of the BO",
18
+ maxLength: 30,
19
+ namePattern: "Travel",
20
+ inputs: [],
21
+ },
22
+ { kind: "table", category: "Dictionary", label: "Database table", description: "Transparent table written as in ADT (define table).", files: ".tabl.astabl, .tabl.xml", maxLength: 16, namePattern: "zxx_order", inputs: [] },
23
+ {
24
+ kind: "dataelement",
25
+ category: "Dictionary",
26
+ label: "Data element",
27
+ description: "Semantic type of a field: a domain, or a built-in type, with its labels.",
28
+ files: ".dtel.xml",
29
+ maxLength: 30,
30
+ namePattern: "ZXX_ORDER_ID",
31
+ inputs: [
32
+ { option: "--from", label: "Domain (optional)", of: "domain", required: false },
33
+ { option: "--type", label: "Built-in type (no domain)", required: false, default: "abap.char(10)" },
34
+ ],
35
+ },
36
+ { kind: "domain", category: "Dictionary", label: "Domain", description: "Technical domain of a built-in type.", files: ".doma.xml", maxLength: 30, namePattern: "ZXX_STATUS", inputs: [{ option: "--type", label: "Built-in type", required: true, default: "abap.char(1)" }] },
37
+ {
38
+ kind: "view",
39
+ category: "Core Data Services",
40
+ label: "Data definition: view entity",
41
+ description: "CDS view on a table, its elements in CamelCase (define view entity).",
42
+ files: ".ddls.asddls, .ddls.xml",
43
+ maxLength: 30,
44
+ namePattern: "ZR_Order",
45
+ inputs: [
46
+ { option: "--from", label: "Source table", of: "table", required: true },
47
+ { option: "--root", label: "Root entity", required: false, values: ["true", "false"], default: "true" },
48
+ ],
49
+ },
50
+ { kind: "projection", category: "Core Data Services", label: "Data definition: projection", description: "Projection of a view (as projection on), provider contract transactional_query.", files: ".ddls.asddls, .ddls.xml", maxLength: 30, namePattern: "ZC_Order", inputs: [{ option: "--from", label: "Projected view", of: "entity", required: true }] },
51
+ {
52
+ kind: "tableentity",
53
+ category: "Core Data Services",
54
+ label: "Data definition: table entity",
55
+ description: "Table and entity in one object, the persistence of a BO (define table entity).",
56
+ files: ".ddls.asddls, .ddls.xml",
57
+ maxLength: 25,
58
+ namePattern: "ZXX_ORDER",
59
+ inputs: [{ option: "--root", label: "Root entity", required: false, values: ["true", "false"], default: "true" }],
60
+ },
61
+ { kind: "abstract", category: "Core Data Services", label: "Data definition: abstract entity", description: "Parameter or result structure of an action.", files: ".ddls.asddls, .ddls.xml", maxLength: 30, namePattern: "ZA_OrderParam", inputs: [] },
62
+ { kind: "custom", category: "Core Data Services", label: "Data definition: custom entity", description: "Entity read by an ABAP query class (if_rap_query_provider), and that class.", files: ".ddls.asddls, .clas.abap", maxLength: 30, namePattern: "ZCE_Order", inputs: [] },
63
+ { kind: "metadata", category: "Core Data Services", label: "Metadata extension", description: "UI annotations (@UI) of an entity, by layer.", files: ".ddlx.asddlxs, .ddlx.xml", maxLength: 30, namePattern: "ZC_Order", inputs: [{ option: "--from", label: "Annotated entity", of: "entity", required: true }] },
64
+ { kind: "access", category: "Core Data Services", label: "Access control (DCL)", description: "Read access control of an entity (define role).", files: ".dcls.asdcls, .dcls.xml", maxLength: 30, namePattern: "ZC_Order", inputs: [{ option: "--from", label: "Protected entity", of: "entity", required: true }] },
65
+ { kind: "type", category: "Core Data Services", label: "CDS simple type", description: "Reusable CDS type (define type x : abap.char(40)).", files: ".drty.acds, .drty.json", maxLength: 30, namePattern: "ZXX_NAME", inputs: [] },
66
+ { kind: "enum", category: "Core Data Services", label: "CDS enumerated type", description: "Named values of a base type (define type … enum).", files: ".drty.acds, .drty.json", maxLength: 30, namePattern: "ZXX_STATUS", inputs: [] },
67
+ { kind: "behavior", category: "Behavior", label: "Behavior definition", description: "Managed BDEF of a root view (with its compositions), or projection BDEF.", files: ".bdef.asbdef, .bdef.xml", maxLength: 30, namePattern: "ZR_Order", inputs: [{ option: "--from", label: "Root entity (view or projection)", of: "entity", required: true }] },
68
+ { kind: "pool", category: "Behavior", label: "Behavior pool", description: "Implementation class of a BDEF, with its handlers (determinations, validations, actions).", files: ".clas.abap, .clas.locals_imp.abap", maxLength: 30, namePattern: "ZBP_R_ORDER", inputs: [{ option: "--for", label: "Behavior definition", of: "bdef", required: true }] },
69
+ { kind: "service", category: "Business Services", label: "Service definition", description: "The entities the service exposes.", files: ".srvd.srvdsrv, .srvd.xml", maxLength: 30, namePattern: "ZUI_ORDER", inputs: [{ option: "--expose", label: "Exposed entities", of: "entity", required: true, multiple: true }] },
70
+ {
71
+ kind: "binding",
72
+ category: "Business Services",
73
+ label: "Service binding",
74
+ description: "OData V4 binding of a service definition: UI (Fiori) or Web API.",
75
+ files: ".srvb.xml",
76
+ maxLength: 30,
77
+ namePattern: "ZUI_ORDER_O4",
78
+ inputs: [
79
+ { option: "--for", label: "Service definition", of: "srvd", required: true },
80
+ { option: "--binding-type", label: "Binding type", values: ["ui", "webapi"], required: false, default: "ui" },
81
+ ],
82
+ },
83
+ { kind: "class", category: "Source Code Library", label: "ABAP class", description: "ABAP Cloud global class.", files: ".clas.abap, .clas.xml", maxLength: 30, namePattern: "ZCL_ORDER_UTIL", inputs: [] },
84
+ { kind: "interface", category: "Source Code Library", label: "ABAP interface", description: "ABAP Cloud global interface.", files: ".intf.abap, .intf.xml", maxLength: 30, namePattern: "ZIF_ORDER", inputs: [] },
85
+ ];
86
+ export const FLOORPLAN_CATALOG = [
87
+ { floorplan: "listReport", label: "List Report / Object Page", description: "Search, filter and sort objects, then open and edit them. The default.", needs: "@UI.lineItem, @UI.selectionField, @UI.facet" },
88
+ { floorplan: "worklist", label: "Worklist", description: "A list of work items to process, without a filter bar, with tabs (open, accepted…).", needs: "@UI.lineItem, qualified @UI.selectionVariant (one tab each)" },
89
+ { floorplan: "analyticalListPage", label: "Analytical List Page", description: "A chart above the list to analyze, then filter by clicking in the chart.", needs: "@UI.chart (dimension, measures), @Aggregation.default" },
90
+ { floorplan: "formEntry", label: "Form Entry Object Page", description: "A quick entry form: create an object, then another one.", needs: "@UI.facet, @UI.identification" },
91
+ ];
92
+ /** The floorplans of rapt/config.json (`ui.floorplans`). */
93
+ export function readFloorplans(dir) {
94
+ const file = path.join(dir, "rapt", "config.json");
95
+ if (!existsSync(file)) {
96
+ return {};
97
+ }
98
+ const config = JSON.parse(readFileSync(file, "utf8"));
99
+ return { ...(config.ui?.floorplans ?? {}) };
100
+ }
101
+ /**
102
+ * Sets the floorplan of an entity set in rapt/config.json, keeping the rest of the file. The
103
+ * default (listReport) is written too: it records that the floorplan was chosen (D63).
104
+ */
105
+ export function writeFloorplan(dir, set, floorplan) {
106
+ const file = path.join(dir, "rapt", "config.json");
107
+ const config = existsSync(file) ? JSON.parse(readFileSync(file, "utf8")) : {};
108
+ const ui = typeof config["ui"] === "object" && config["ui"] !== null ? config["ui"] : {};
109
+ const floorplans = typeof ui["floorplans"] === "object" && ui["floorplans"] !== null ? ui["floorplans"] : {};
110
+ floorplans[set] = floorplan;
111
+ ui["floorplans"] = floorplans;
112
+ config["ui"] = ui;
113
+ mkdirSync(path.dirname(file), { recursive: true });
114
+ writeFileSync(file, `${JSON.stringify(config, null, 2)}\n`);
115
+ return path.relative(dir, file).split(path.sep).join("/");
116
+ }
117
+ //# sourceMappingURL=catalog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"catalog.js","sourceRoot":"","sources":["../../src/authoring/catalog.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * The floorplans of a project (D53, D61): the root entity sets of the service and the floorplan of
3
+ * each, read from and written to rapt/config.json. Shared by `rapt floorplan` and `rapt agent`.
4
+ */
5
+ import { FLOORPLAN_CATALOG } from "./catalog.js";
6
+ export type FloorplanResult = {
7
+ ok: true;
8
+ root: string;
9
+ sets: Array<{
10
+ set: string;
11
+ floorplan: string;
12
+ chosen: boolean;
13
+ }>;
14
+ floorplans: typeof FLOORPLAN_CATALOG;
15
+ } | {
16
+ ok: true;
17
+ root: string;
18
+ file: string;
19
+ set: string;
20
+ floorplan: string;
21
+ label: string;
22
+ } | {
23
+ ok: false;
24
+ root: string;
25
+ error: string;
26
+ };
27
+ /** The root entity sets and their floorplan, or (with `set` and `floorplan`) sets one. */
28
+ export declare function floorplans(source: string, set?: string, floorplan?: string): FloorplanResult;
@@ -0,0 +1,31 @@
1
+ /**
2
+ * The floorplans of a project (D53, D61): the root entity sets of the service and the floorplan of
3
+ * each, read from and written to rapt/config.json. Shared by `rapt floorplan` and `rapt agent`.
4
+ */
5
+ import path from "node:path";
6
+ import { loadProject } from "../input/project.js";
7
+ import { buildModel } from "../ir/builder.js";
8
+ import { FLOORPLAN_CATALOG, readFloorplans, writeFloorplan } from "./catalog.js";
9
+ /** The root entity sets and their floorplan, or (with `set` and `floorplan`) sets one. */
10
+ export function floorplans(source, set, floorplan) {
11
+ const root = path.resolve(source);
12
+ const { model } = buildModel(loadProject(root));
13
+ const sets = (model?.service.entitySets ?? [])
14
+ .filter((s) => s.valueHelp !== true && s.draftAdministrativeData !== true && model?.entities.find((e) => e.name === s.entity)?.root === true)
15
+ .map((s) => s.name);
16
+ if (set !== undefined) {
17
+ if (!sets.includes(set)) {
18
+ return { ok: false, root, error: `${set}: not a root entity set of the service (${sets.join(", ") || "none"})` };
19
+ }
20
+ const known = FLOORPLAN_CATALOG.find((f) => f.floorplan === floorplan);
21
+ if (known === undefined) {
22
+ return { ok: false, root, error: `${floorplan ?? "?"}: one of ${FLOORPLAN_CATALOG.map((f) => f.floorplan).join(", ")}` };
23
+ }
24
+ const file = writeFloorplan(root, set, known.floorplan);
25
+ return { ok: true, root, file, set, floorplan: known.floorplan, label: known.label };
26
+ }
27
+ const current = readFloorplans(root);
28
+ // chosen: written in rapt/config.json, else the default (the extension asks before building, D66)
29
+ return { ok: true, root, sets: sets.map((s) => ({ set: s, floorplan: current[s] ?? "listReport", chosen: current[s] !== undefined })), floorplans: FLOORPLAN_CATALOG };
30
+ }
31
+ //# sourceMappingURL=floorplan.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"floorplan.js","sourceRoot":"","sources":["../../src/authoring/floorplan.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,iBAAiB,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAOjF,0FAA0F;AAC1F,MAAM,UAAU,UAAU,CAAC,MAAc,EAAE,GAAY,EAAE,SAAkB;IACzE,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IAClC,MAAM,EAAE,KAAK,EAAE,GAAG,UAAU,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC;IAChD,MAAM,IAAI,GAAG,CAAC,KAAK,EAAE,OAAO,CAAC,UAAU,IAAI,EAAE,CAAC;SAC3C,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,KAAK,IAAI,IAAI,CAAC,CAAC,uBAAuB,KAAK,IAAI,IAAI,KAAK,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,MAAM,CAAC,EAAE,IAAI,KAAK,IAAI,CAAC;SAC5I,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IACtB,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;QACtB,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YACxB,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,GAAG,2CAA2C,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,MAAM,GAAG,EAAE,CAAC;QACnH,CAAC;QACD,MAAM,KAAK,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC;QACvE,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,SAAS,IAAI,GAAG,YAAY,iBAAiB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;QAC3H,CAAC;QACD,MAAM,IAAI,GAAG,cAAc,CAAC,IAAI,EAAE,GAAG,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;QACxD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,SAAS,EAAE,KAAK,CAAC,SAAS,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,CAAC;IACvF,CAAC;IACD,MAAM,OAAO,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;IACrC,kGAAkG;IAClG,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,YAAY,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,KAAK,SAAS,EAAE,CAAC,CAAC,EAAE,UAAU,EAAE,iBAAiB,EAAE,CAAC;AACzK,CAAC"}
@@ -0,0 +1,57 @@
1
+ /**
2
+ * `rapt generate <src> <kind> <name>` (decision D46): one new object with the file names abapGit
3
+ * expects, like the creation wizards of the ABAP Development Tools. A skeleton when there is
4
+ * nothing to start from; derived from an existing object otherwise (`--from`): a view entity from
5
+ * its table, a projection from its view, a metadata extension, an access control or a behavior
6
+ * definition from an entity, a behavior pool from its behavior definition. The abapGit XML is
7
+ * written too (`rapt abapgit`). An existing file is never overwritten.
8
+ */
9
+ export declare const OBJECT_KINDS: {
10
+ readonly table: "database table (.tabl.astabl)";
11
+ readonly view: "CDS view entity, from a table with --from (.ddls.asddls)";
12
+ readonly projection: "CDS projection view, from a view with --from (.ddls.asddls)";
13
+ readonly abstract: "CDS abstract entity, e.g. an action parameter (.ddls.asddls)";
14
+ readonly custom: "CDS custom entity and its query class (.ddls.asddls, .clas.abap)";
15
+ readonly tableentity: "CDS table entity: a table and its entity, the persistence of a BO (.ddls.asddls)";
16
+ readonly type: "CDS simple type (.drty.acds)";
17
+ readonly dataelement: "data element, of a built-in type (--type abap.char(10)) or a domain (--from) (.dtel.xml)";
18
+ readonly domain: "domain of a built-in type (--type abap.char(1)) (.doma.xml)";
19
+ readonly enum: "CDS enumerated type (.drty.acds)";
20
+ readonly metadata: "metadata extension (UI annotations) of an entity (.ddlx.asddlxs)";
21
+ readonly access: "access control (DCL) of an entity (.dcls.asdcls)";
22
+ readonly behavior: "behavior definition of a root view or projection (.bdef.asbdef)";
23
+ readonly pool: "behavior pool of a behavior definition, with its handlers (.clas.abap, .clas.locals_imp.abap)";
24
+ readonly class: "ABAP class (.clas.abap)";
25
+ readonly interface: "ABAP interface (.intf.abap)";
26
+ readonly service: "service definition, exposing --expose A,B (.srvd.srvdsrv)";
27
+ readonly binding: "OData V4 UI service binding of a service definition --for (.srvb.xml)";
28
+ };
29
+ export type ObjectKind = keyof typeof OBJECT_KINDS;
30
+ export interface GenerateObjectOptions {
31
+ /** Object the new one is derived from: table (view), view (projection), entity (metadata, access, behavior). */
32
+ from?: string;
33
+ /** Behavior definition of a pool, service definition of a binding. */
34
+ for?: string;
35
+ /** Entities a service definition exposes. */
36
+ expose?: string[];
37
+ /** View entity: `define root view entity`. */
38
+ root?: boolean;
39
+ /** Binding: ui (default) or webapi (D60). */
40
+ bindingType?: string;
41
+ /** Data element, domain: the built-in type, `abap.char(10)`. */
42
+ type?: string;
43
+ description?: string;
44
+ }
45
+ export interface GenerateObjectResult {
46
+ /** Files written, relative to the project root. */
47
+ written: string[];
48
+ error?: string;
49
+ }
50
+ /** `travel_uuid` → `TravelUUID`, `agency_id` → `AgencyID`, `begin_date` → `BeginDate`. */
51
+ export declare function elementName(column: string): string;
52
+ /** `ZR_Travel` → `Travel`, `ZRT_C_Booking` → `Booking`: the alias of an entity in a BDEF. */
53
+ export declare function aliasOf(entity: string): string;
54
+ /** The behavior pool of a BDEF, as SAP names it: `ZR_TRAVEL` → `ZBP_R_TRAVEL`. */
55
+ export declare function poolName(bdef: string): string;
56
+ /** Writes a new object into the project `dir`. */
57
+ export declare function generateObject(dir: string, kind: string, name: string, options?: GenerateObjectOptions): GenerateObjectResult;