@open-rap/compiler 0.0.0-stage → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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 +1526 -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,507 @@
1
+ /**
2
+ * Standard CDS views of SAP (released, content delivered by SAP) that RAP business objects use for
3
+ * value helps and associations: I_Currency, I_UnitOfMeasure, I_Country, I_Language and their
4
+ * text views. On SAP they exist in every system; here they are added to a project that names
5
+ * them and does not define them, with their tables (`rapt_*`) and their reference data (decision
6
+ * D44). The element names are those of SAP, the tables are Open RAP Runtime's own.
7
+ */
8
+ import { COUNTRIES, CURRENCIES, LANGUAGES, REGIONS, rows, TIMEZONES, UNITS } from "./data.js";
9
+ const TABLE_HEADER = (label) => `@EndUserText.label : '${label}'
10
+ @AbapCatalog.tableCategory : #TRANSPARENT
11
+ @AbapCatalog.deliveryClass : #S
12
+ @AbapCatalog.dataMaintenance : #RESTRICTED`;
13
+ const table = (name, label, fields) => ({
14
+ name: name.toUpperCase(),
15
+ type: "TABL",
16
+ fileName: `${name}.tabl.astabl`,
17
+ content: `${TABLE_HEADER(label)}
18
+ define table ${name} {
19
+ key client : abap.clnt not null;
20
+ ${fields}
21
+ }
22
+ `,
23
+ uses: [],
24
+ });
25
+ const view = (name, content, uses) => ({
26
+ name: name.toUpperCase(),
27
+ type: "DDLS",
28
+ fileName: `${name.toLowerCase()}.ddls.asddls`,
29
+ content,
30
+ uses: uses.map((u) => u.toUpperCase()),
31
+ });
32
+ export const STANDARD_OBJECTS = [
33
+ // ------------------------------------------------------------------------------- currencies
34
+ table("rapt_currency", "Currency codes (I_Currency)", ` key waers : abap.cuky not null;
35
+ isocd : abap.char(3);
36
+ altwr : abap.numc(3);
37
+ currdec : abap.int1;`),
38
+ table("rapt_currencyt", "Currency texts (I_CurrencyText)", ` key spras : abap.lang not null;
39
+ key waers : abap.cuky not null;
40
+ ktext : abap.char(15);
41
+ ltext : abap.char(40);`),
42
+ view("I_Currency", `@AccessControl.authorizationCheck: #NOT_REQUIRED
43
+ @EndUserText.label: 'Currency'
44
+ @ObjectModel.representativeKey: 'Currency'
45
+ @ObjectModel.dataCategory: #VALUE_HELP
46
+ @Search.searchable: true
47
+ define view entity I_Currency
48
+ as select from rapt_currency
49
+ association [0..*] to I_CurrencyText as _Text on $projection.Currency = _Text.Currency
50
+ {
51
+ @Search.defaultSearchElement: true
52
+ @EndUserText.label: 'Currency'
53
+ key waers as Currency,
54
+ @EndUserText.label: 'Decimals'
55
+ currdec as Decimals,
56
+ @EndUserText.label: 'ISO Code'
57
+ isocd as CurrencyISOCode,
58
+ @EndUserText.label: 'Alternative Key'
59
+ altwr as AlternativeCurrencyKey,
60
+ _Text
61
+ }
62
+ `, ["rapt_currency", "I_CurrencyText"]),
63
+ view("I_CurrencyText", `@AccessControl.authorizationCheck: #NOT_REQUIRED
64
+ @EndUserText.label: 'Currency - Text'
65
+ @ObjectModel.dataCategory: #TEXT
66
+ @ObjectModel.representativeKey: 'Currency'
67
+ @Search.searchable: true
68
+ define view entity I_CurrencyText
69
+ as select from rapt_currencyt
70
+ {
71
+ @Semantics.language: true
72
+ @EndUserText.label: 'Language'
73
+ key spras as Language,
74
+ @EndUserText.label: 'Currency'
75
+ key waers as Currency,
76
+ @Semantics.text: true
77
+ @Search.defaultSearchElement: true
78
+ @EndUserText.label: 'Description'
79
+ ltext as CurrencyName,
80
+ @EndUserText.label: 'Short Text'
81
+ ktext as CurrencyShortName
82
+ }
83
+ `, ["rapt_currencyt"]),
84
+ // ------------------------------------------------------------------------- units of measure
85
+ table("rapt_uom", "Units of measure (I_UnitOfMeasure)", ` key msehi : abap.unit(3) not null;
86
+ isocode : abap.char(3);
87
+ dimid : abap.char(6);
88
+ andec : abap.int2;`),
89
+ table("rapt_uomt", "Unit of measure texts (I_UnitOfMeasureText)", ` key spras : abap.lang not null;
90
+ key msehi : abap.unit(3) not null;
91
+ mseht : abap.char(10);
92
+ msehl : abap.char(30);`),
93
+ view("I_UnitOfMeasure", `@AccessControl.authorizationCheck: #NOT_REQUIRED
94
+ @EndUserText.label: 'Unit of Measure'
95
+ @ObjectModel.representativeKey: 'UnitOfMeasure'
96
+ @ObjectModel.dataCategory: #VALUE_HELP
97
+ @Search.searchable: true
98
+ define view entity I_UnitOfMeasure
99
+ as select from rapt_uom
100
+ association [0..*] to I_UnitOfMeasureText as _Text on $projection.UnitOfMeasure = _Text.UnitOfMeasure
101
+ {
102
+ @Search.defaultSearchElement: true
103
+ @EndUserText.label: 'Unit of Measure'
104
+ key msehi as UnitOfMeasure,
105
+ @EndUserText.label: 'ISO Code'
106
+ isocode as UnitOfMeasureISOCode,
107
+ @EndUserText.label: 'Dimension'
108
+ dimid as UnitOfMeasureDimension,
109
+ @EndUserText.label: 'Decimals'
110
+ andec as UnitOfMeasureNumberOfDecimals,
111
+ _Text
112
+ }
113
+ `, ["rapt_uom", "I_UnitOfMeasureText"]),
114
+ view("I_UnitOfMeasureText", `@AccessControl.authorizationCheck: #NOT_REQUIRED
115
+ @EndUserText.label: 'Unit of Measure - Text'
116
+ @ObjectModel.dataCategory: #TEXT
117
+ @ObjectModel.representativeKey: 'UnitOfMeasure'
118
+ @Search.searchable: true
119
+ define view entity I_UnitOfMeasureText
120
+ as select from rapt_uomt
121
+ {
122
+ @Semantics.language: true
123
+ @EndUserText.label: 'Language'
124
+ key spras as Language,
125
+ @EndUserText.label: 'Unit of Measure'
126
+ key msehi as UnitOfMeasure,
127
+ @Semantics.text: true
128
+ @Search.defaultSearchElement: true
129
+ @EndUserText.label: 'Unit of Measure Name'
130
+ msehl as UnitOfMeasureLongName,
131
+ @EndUserText.label: 'Unit of Measure Text'
132
+ mseht as UnitOfMeasureName
133
+ }
134
+ `, ["rapt_uomt"]),
135
+ // ---------------------------------------------------------------------------------- countries
136
+ table("rapt_country", "Countries (I_Country)", ` key land1 : abap.char(3) not null;
137
+ intca3 : abap.char(3);
138
+ waers : abap.cuky;
139
+ xegld : abap.char(1);`),
140
+ table("rapt_countryt", "Country texts (I_CountryText)", ` key spras : abap.lang not null;
141
+ key land1 : abap.char(3) not null;
142
+ landx50 : abap.char(50);
143
+ landx : abap.char(15);`),
144
+ view("I_Country", `@AccessControl.authorizationCheck: #NOT_REQUIRED
145
+ @EndUserText.label: 'Country/Region'
146
+ @ObjectModel.representativeKey: 'Country'
147
+ @ObjectModel.dataCategory: #VALUE_HELP
148
+ @Search.searchable: true
149
+ define view entity I_Country
150
+ as select from rapt_country
151
+ association [0..*] to I_CountryText as _Text on $projection.Country = _Text.Country
152
+ {
153
+ @Search.defaultSearchElement: true
154
+ @EndUserText.label: 'Country/Region'
155
+ key land1 as Country,
156
+ @EndUserText.label: 'ISO Code (3 letters)'
157
+ intca3 as CountryThreeLetterISOCode,
158
+ @EndUserText.label: 'Currency'
159
+ waers as CountryCurrency,
160
+ @EndUserText.label: 'EU Member'
161
+ xegld as IsEuropeanUnionMember,
162
+ _Text
163
+ }
164
+ `, ["rapt_country", "I_CountryText"]),
165
+ view("I_CountryText", `@AccessControl.authorizationCheck: #NOT_REQUIRED
166
+ @EndUserText.label: 'Country/Region - Text'
167
+ @ObjectModel.dataCategory: #TEXT
168
+ @ObjectModel.representativeKey: 'Country'
169
+ @Search.searchable: true
170
+ define view entity I_CountryText
171
+ as select from rapt_countryt
172
+ {
173
+ @Semantics.language: true
174
+ @EndUserText.label: 'Language'
175
+ key spras as Language,
176
+ @EndUserText.label: 'Country/Region'
177
+ key land1 as Country,
178
+ @Semantics.text: true
179
+ @Search.defaultSearchElement: true
180
+ @EndUserText.label: 'Country/Region Name'
181
+ landx50 as CountryName,
182
+ @EndUserText.label: 'Short Name'
183
+ landx as CountryShortName
184
+ }
185
+ `, ["rapt_countryt"]),
186
+ // ---------------------------------------------------------------------------------- languages
187
+ table("rapt_language", "Languages (I_Language)", ` key spras : abap.lang not null;
188
+ laiso : abap.char(2);`),
189
+ table("rapt_languaget", "Language texts (I_LanguageText)", ` key spras : abap.lang not null;
190
+ key sprsl : abap.lang not null;
191
+ sptxt : abap.char(16);`),
192
+ view("I_Language", `@AccessControl.authorizationCheck: #NOT_REQUIRED
193
+ @EndUserText.label: 'Language'
194
+ @ObjectModel.representativeKey: 'Language'
195
+ @ObjectModel.dataCategory: #VALUE_HELP
196
+ @Search.searchable: true
197
+ define view entity I_Language
198
+ as select from rapt_language
199
+ association [0..*] to I_LanguageText as _Text on $projection.Language = _Text.LanguageCode
200
+ {
201
+ @EndUserText.label: 'Language Key'
202
+ key spras as Language,
203
+ @Search.defaultSearchElement: true
204
+ @EndUserText.label: 'ISO Code'
205
+ laiso as LanguageISOCode,
206
+ _Text
207
+ }
208
+ `, ["rapt_language", "I_LanguageText"]),
209
+ view("I_LanguageText", `@AccessControl.authorizationCheck: #NOT_REQUIRED
210
+ @EndUserText.label: 'Language - Text'
211
+ @ObjectModel.dataCategory: #TEXT
212
+ @ObjectModel.representativeKey: 'LanguageCode'
213
+ @Search.searchable: true
214
+ define view entity I_LanguageText
215
+ as select from rapt_languaget
216
+ {
217
+ @Semantics.language: true
218
+ @EndUserText.label: 'Language of the Text'
219
+ key spras as Language,
220
+ @EndUserText.label: 'Language Key'
221
+ key sprsl as LanguageCode,
222
+ @Semantics.text: true
223
+ @Search.defaultSearchElement: true
224
+ @EndUserText.label: 'Language Name'
225
+ sptxt as LanguageName
226
+ }
227
+ `, ["rapt_languaget"]),
228
+ // ------------------------------------------------------------------------------------ regions
229
+ table("rapt_region", "Regions (I_Region)", ` key land1 : abap.char(3) not null;
230
+ key bland : abap.char(3) not null;`),
231
+ table("rapt_regiont", "Region texts (I_RegionText)", ` key spras : abap.lang not null;
232
+ key land1 : abap.char(3) not null;
233
+ key bland : abap.char(3) not null;
234
+ bezei : abap.char(20);`),
235
+ view("I_Region", `@AccessControl.authorizationCheck: #NOT_REQUIRED
236
+ @EndUserText.label: 'Region'
237
+ @ObjectModel.representativeKey: 'Region'
238
+ @ObjectModel.dataCategory: #VALUE_HELP
239
+ @Search.searchable: true
240
+ define view entity I_Region
241
+ as select from rapt_region
242
+ association [0..*] to I_RegionText as _RegionText on $projection.Country = _RegionText.Country
243
+ and $projection.Region = _RegionText.Region
244
+ association [1..1] to I_Country as _Country on $projection.Country = _Country.Country
245
+ {
246
+ @EndUserText.label: 'Country/Region'
247
+ key land1 as Country,
248
+ @Search.defaultSearchElement: true
249
+ @EndUserText.label: 'Region'
250
+ key bland as Region,
251
+ _RegionText,
252
+ _Country
253
+ }
254
+ `, ["rapt_region", "I_RegionText", "I_Country"]),
255
+ view("I_RegionText", `@AccessControl.authorizationCheck: #NOT_REQUIRED
256
+ @EndUserText.label: 'Region - Text'
257
+ @ObjectModel.dataCategory: #TEXT
258
+ @ObjectModel.representativeKey: 'Region'
259
+ @Search.searchable: true
260
+ define view entity I_RegionText
261
+ as select from rapt_regiont
262
+ {
263
+ @Semantics.language: true
264
+ @EndUserText.label: 'Language'
265
+ key spras as Language,
266
+ @EndUserText.label: 'Country/Region'
267
+ key land1 as Country,
268
+ @EndUserText.label: 'Region'
269
+ key bland as Region,
270
+ @Semantics.text: true
271
+ @Search.defaultSearchElement: true
272
+ @EndUserText.label: 'Region Name'
273
+ bezei as RegionName
274
+ }
275
+ `, ["rapt_regiont"]),
276
+ // ---------------------------------------------------------------------------------- calendar
277
+ table("rapt_calendar", "Calendar dates (I_CalendarDate)", ` key calendardate : abap.dats not null;
278
+ calendaryear : abap.numc(4);
279
+ calendarquarter : abap.numc(1);
280
+ calendarmonth : abap.numc(2);
281
+ calendarweek : abap.numc(2);
282
+ calendarday : abap.numc(2);
283
+ yearmonth : abap.numc(6);
284
+ yearquarter : abap.numc(5);
285
+ yearweek : abap.numc(6);
286
+ weekday : abap.numc(1);
287
+ dayofyear : abap.numc(3);
288
+ firstdayofweek : abap.dats;
289
+ firstdayofmonth : abap.dats;`),
290
+ view("I_CalendarDate", `@AccessControl.authorizationCheck: #NOT_REQUIRED
291
+ @EndUserText.label: 'Calendar Date'
292
+ @ObjectModel.representativeKey: 'CalendarDate'
293
+ define view entity I_CalendarDate
294
+ as select from rapt_calendar
295
+ {
296
+ @EndUserText.label: 'Calendar Date'
297
+ key calendardate as CalendarDate,
298
+ @EndUserText.label: 'Calendar Year'
299
+ calendaryear as CalendarYear,
300
+ @EndUserText.label: 'Calendar Quarter'
301
+ calendarquarter as CalendarQuarter,
302
+ @EndUserText.label: 'Calendar Month'
303
+ calendarmonth as CalendarMonth,
304
+ @EndUserText.label: 'Calendar Week'
305
+ calendarweek as CalendarWeek,
306
+ @EndUserText.label: 'Calendar Day'
307
+ calendarday as CalendarDay,
308
+ @EndUserText.label: 'Year Month'
309
+ yearmonth as YearMonth,
310
+ @EndUserText.label: 'Year Quarter'
311
+ yearquarter as YearQuarter,
312
+ @EndUserText.label: 'Year Week'
313
+ yearweek as YearWeek,
314
+ @EndUserText.label: 'Weekday'
315
+ weekday as WeekDay,
316
+ @EndUserText.label: 'Day of Year'
317
+ dayofyear as CalendarDayOfYear,
318
+ @EndUserText.label: 'First Day of Week'
319
+ firstdayofweek as FirstDayOfWeekDate,
320
+ @EndUserText.label: 'First Day of Month'
321
+ firstdayofmonth as FirstDayOfMonthDate
322
+ }
323
+ `, ["rapt_calendar"]),
324
+ // -------------------------------------------------------------------------------- time zones
325
+ table("rapt_timezone", "Time zones (I_TimeZone)", ` key tzone : abap.char(6) not null;
326
+ utcdiff : abap.char(5);
327
+ iana : abap.char(40);`),
328
+ table("rapt_timezonet", "Time zone texts (I_TimeZoneText)", ` key spras : abap.lang not null;
329
+ key tzone : abap.char(6) not null;
330
+ descript : abap.char(40);`),
331
+ view("I_TimeZone", `@AccessControl.authorizationCheck: #NOT_REQUIRED
332
+ @EndUserText.label: 'Time Zone'
333
+ @ObjectModel.representativeKey: 'TimeZoneID'
334
+ @ObjectModel.dataCategory: #VALUE_HELP
335
+ @Search.searchable: true
336
+ define view entity I_TimeZone
337
+ as select from rapt_timezone
338
+ association [0..*] to I_TimeZoneText as _Text on $projection.TimeZoneID = _Text.TimeZoneID
339
+ {
340
+ @Search.defaultSearchElement: true
341
+ @EndUserText.label: 'Time Zone'
342
+ key tzone as TimeZoneID,
343
+ @EndUserText.label: 'UTC Difference'
344
+ utcdiff as TimeZoneUTCDifference,
345
+ @EndUserText.label: 'IANA Time Zone'
346
+ iana as TimeZoneIANACode,
347
+ _Text
348
+ }
349
+ `, ["rapt_timezone", "I_TimeZoneText"]),
350
+ view("I_TimeZoneText", `@AccessControl.authorizationCheck: #NOT_REQUIRED
351
+ @EndUserText.label: 'Time Zone - Text'
352
+ @ObjectModel.dataCategory: #TEXT
353
+ @ObjectModel.representativeKey: 'TimeZoneID'
354
+ @Search.searchable: true
355
+ define view entity I_TimeZoneText
356
+ as select from rapt_timezonet
357
+ {
358
+ @Semantics.language: true
359
+ @EndUserText.label: 'Language'
360
+ key spras as Language,
361
+ @EndUserText.label: 'Time Zone'
362
+ key tzone as TimeZoneID,
363
+ @Semantics.text: true
364
+ @Search.defaultSearchElement: true
365
+ @EndUserText.label: 'Description'
366
+ descript as TimeZoneText
367
+ }
368
+ `, ["rapt_timezonet"]),
369
+ // ----------------------------------------------------------------------------- business users
370
+ table("rapt_bususer", "Business users (I_BusinessUserBasic)", ` key userid : abap.char(12) not null;
371
+ partner : abap.char(10);
372
+ fullname : abap.char(80);
373
+ firstname : abap.char(40);
374
+ lastname : abap.char(40);
375
+ email : abap.char(241);`),
376
+ view("I_BusinessUserBasic", `@AccessControl.authorizationCheck: #NOT_REQUIRED
377
+ @EndUserText.label: 'Business User'
378
+ @ObjectModel.representativeKey: 'UserID'
379
+ @ObjectModel.dataCategory: #VALUE_HELP
380
+ @Search.searchable: true
381
+ define view entity I_BusinessUserBasic
382
+ as select from rapt_bususer
383
+ {
384
+ @Search.defaultSearchElement: true
385
+ @EndUserText.label: 'User'
386
+ key userid as UserID,
387
+ @EndUserText.label: 'Business Partner'
388
+ partner as BusinessPartner,
389
+ @Semantics.text: true
390
+ @Search.defaultSearchElement: true
391
+ @EndUserText.label: 'Full Name'
392
+ fullname as PersonFullName,
393
+ @EndUserText.label: 'First Name'
394
+ firstname as FirstName,
395
+ @EndUserText.label: 'Last Name'
396
+ lastname as LastName,
397
+ @EndUserText.label: 'E-Mail Address'
398
+ email as DefaultEmailAddress
399
+ }
400
+ `, ["rapt_bususer"]),
401
+ // ----------------------------------------------------------------------------- exchange rates
402
+ table("rapt_exchrate", "Exchange rates (I_ExchangeRate)", ` key kurst : abap.char(4) not null;
403
+ key fcurr : abap.cuky not null;
404
+ key tcurr : abap.cuky not null;
405
+ key gdatu : abap.dats not null;
406
+ ukurs : abap.dec(9,5);
407
+ ffact : abap.dec(9,0);
408
+ tfact : abap.dec(9,0);`),
409
+ view("I_ExchangeRate", `@AccessControl.authorizationCheck: #NOT_REQUIRED
410
+ @EndUserText.label: 'Exchange Rate'
411
+ define view entity I_ExchangeRate
412
+ as select from rapt_exchrate
413
+ {
414
+ @EndUserText.label: 'Exchange Rate Type'
415
+ key kurst as ExchangeRateType,
416
+ @EndUserText.label: 'Source Currency'
417
+ key fcurr as SourceCurrency,
418
+ @EndUserText.label: 'Target Currency'
419
+ key tcurr as TargetCurrency,
420
+ @EndUserText.label: 'Valid From'
421
+ key gdatu as ValidityStartDate,
422
+ @EndUserText.label: 'Exchange Rate'
423
+ ukurs as ExchangeRate,
424
+ @EndUserText.label: 'Source Currency Units'
425
+ ffact as NumberOfSourceCurrencyUnits,
426
+ @EndUserText.label: 'Target Currency Units'
427
+ tfact as NumberOfTargetCurrencyUnits
428
+ }
429
+ `, ["rapt_exchrate"]),
430
+ ];
431
+ const BY_NAME = new Map(STANDARD_OBJECTS.map((o) => [o.name, o]));
432
+ /** The standard views a project may name. */
433
+ export const STANDARD_VIEW_NAMES = STANDARD_OBJECTS.filter((o) => o.type === "DDLS").map((o) => o.name);
434
+ const REFERENCE = new RegExp(`\\b(${STANDARD_VIEW_NAMES.join("|")})\\b`, "gi");
435
+ /**
436
+ * The standard objects named by sources (CDS, metadata extensions, BDEF, ABAP) and not defined by
437
+ * the project, with the objects they need.
438
+ */
439
+ export function standardObjectsFor(sources) {
440
+ const defined = new Set(sources.map((s) => `${s.type}:${s.name.toUpperCase()}`));
441
+ const needed = new Set();
442
+ const add = (name) => {
443
+ const object = BY_NAME.get(name.toUpperCase());
444
+ if (object === undefined || needed.has(object.name) || defined.has(`${object.type}:${object.name}`)) {
445
+ return;
446
+ }
447
+ needed.add(object.name);
448
+ object.uses.forEach(add);
449
+ };
450
+ for (const source of sources) {
451
+ if (!["DDLS", "DDLX", "BDEF", "CLAS", "INTF", "DCLS", "SRVD"].includes(source.type)) {
452
+ continue;
453
+ }
454
+ for (const match of source.content.matchAll(REFERENCE)) {
455
+ add(match[1] ?? "");
456
+ }
457
+ }
458
+ return STANDARD_OBJECTS.filter((o) => needed.has(o.name));
459
+ }
460
+ /** The reference data of a standard table: column → value, in the order of the table. */
461
+ export function standardRows(tableName) {
462
+ const short = (text, length) => text.slice(0, length);
463
+ switch (tableName.toLowerCase()) {
464
+ case "rapt_currency":
465
+ return rows(CURRENCIES).map(([code = "", decimals = "2"]) => ({ waers: code, isocd: code, altwr: "000", currdec: Number(decimals) }));
466
+ case "rapt_currencyt":
467
+ return rows(CURRENCIES).map(([code = "", , name = ""]) => ({ spras: "E", waers: code, ktext: short(name, 15), ltext: short(name, 40) }));
468
+ case "rapt_uom":
469
+ return rows(UNITS).map(([unit = "", iso = "", dimension = "", decimals = "0"]) => ({ msehi: unit, isocode: iso, dimid: dimension, andec: Number(decimals) }));
470
+ case "rapt_uomt":
471
+ return rows(UNITS).map(([unit = "", , , , name = ""]) => ({ spras: "E", msehi: unit, mseht: short(name, 10), msehl: short(name, 30) }));
472
+ case "rapt_country":
473
+ return rows(COUNTRIES).map(([country = "", iso3 = "", currency = "", eu = ""]) => ({ land1: country, intca3: iso3, waers: currency, xegld: eu }));
474
+ case "rapt_countryt":
475
+ return rows(COUNTRIES).map(([country = "", , , , name = ""]) => ({ spras: "E", land1: country, landx50: short(name, 50), landx: short(name, 15) }));
476
+ case "rapt_language":
477
+ return rows(LANGUAGES).map(([language = "", iso = ""]) => ({ spras: language, laiso: iso }));
478
+ case "rapt_region":
479
+ return rows(REGIONS).map(([country = "", region = ""]) => ({ land1: country, bland: region }));
480
+ case "rapt_regiont":
481
+ return rows(REGIONS).map(([country = "", region = "", name = ""]) => ({ spras: "E", land1: country, bland: region, bezei: short(name, 20) }));
482
+ case "rapt_timezone":
483
+ return rows(TIMEZONES).map(([zone = "", diff = "", iana = ""]) => ({ tzone: zone, utcdiff: diff, iana }));
484
+ case "rapt_timezonet":
485
+ return rows(TIMEZONES).map(([zone = "", , , name = ""]) => ({ spras: "E", tzone: zone, descript: short(name, 40) }));
486
+ case "rapt_languaget":
487
+ return rows(LANGUAGES).map(([language = "", , name = ""]) => ({ spras: "E", sprsl: language, sptxt: short(name, 16) }));
488
+ default:
489
+ return [];
490
+ }
491
+ }
492
+ /**
493
+ * Reference data written as SQL (too many rows to list): the calendar of I_CalendarDate, 1990 to
494
+ * 2060, computed by PostgreSQL once (ISO weeks; weekday 1 = Monday, as SAP).
495
+ */
496
+ export function standardSql(tableName) {
497
+ if (tableName.toLowerCase() !== "rapt_calendar") {
498
+ return undefined;
499
+ }
500
+ return `INSERT INTO "rapt_calendar" ("calendardate", "calendaryear", "calendarquarter", "calendarmonth", "calendarweek", "calendarday", "yearmonth", "yearquarter", "yearweek", "weekday", "dayofyear", "firstdayofweek", "firstdayofmonth")
501
+ SELECT d::date, to_char(d, 'YYYY'), to_char(d, 'Q'), to_char(d, 'MM'), to_char(d, 'IW'), to_char(d, 'DD'), to_char(d, 'YYYYMM'),
502
+ to_char(d, 'YYYY') || to_char(d, 'Q'), to_char(d, 'IYYY') || to_char(d, 'IW'), to_char(d, 'ID'), to_char(d, 'DDD'),
503
+ (d - ((extract(isodow from d)::int - 1) * interval '1 day'))::date, date_trunc('month', d)::date
504
+ FROM generate_series(date '1990-01-01', date '2060-12-31', interval '1 day') AS g(d)
505
+ WHERE NOT EXISTS (SELECT 1 FROM "rapt_calendar" LIMIT 1);`;
506
+ }
507
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/standard/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ /** The version of the @open-rap/compiler package (set from the release tag, D65). */
2
+ export declare const COMPILER_VERSION: string;
@@ -0,0 +1,4 @@
1
+ import { readFileSync } from "node:fs";
2
+ /** The version of the @open-rap/compiler package (set from the release tag, D65). */
3
+ export const COMPILER_VERSION = JSON.parse(readFileSync(new URL("../package.json", import.meta.url), "utf8")).version;
4
+ //# sourceMappingURL=version.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.js","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAEvC,qFAAqF;AACrF,MAAM,CAAC,MAAM,gBAAgB,GAAY,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,GAAG,CAAC,iBAAiB,EAAE,OAAO,IAAI,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,CAAyB,CAAC,OAAO,CAAC"}
package/docs/AGENTS.md ADDED
@@ -0,0 +1,79 @@
1
+ # AGENTS.md — working on Open RAP Runtime
2
+
3
+ Instructions for the AI agents (and the humans) who change this repository. To **use**
4
+ Open RAP Runtime in a RAP project, see section 13 of the [guide](docs/GUIDE.md); `rapt new` also
5
+ writes an `AGENTS.md` in the projects it creates.
6
+
7
+ ## The project in short
8
+
9
+ A TypeScript compiler (pnpm monorepo) that turns the sources of a RAP BO (abapGit format) into a
10
+ Node.js application: OData V4, RAP managed runtime, ABAP transpiled by abaplint, PostgreSQL,
11
+ OpenUI5 UI. Read [README.md](README.md), [docs/GUIDE.md](docs/GUIDE.md) and the list of decisions
12
+ [docs/DECISIONS.md](docs/DECISIONS.md) (D1 to D71) first.
13
+
14
+ ```
15
+ packages/model/ types of the IR (model.json) and shared derivations (OData, value helps, MCP)
16
+ packages/compiler/ rapt CLI (src/cli.ts), parsers (bdef/, cds/, srvd/, dcl/, ddic/), IR (ir/),
17
+ generators (gen/: sql, csdl, abap, ui, launchpad, docs, mcp, app),
18
+ object creation (authoring/: new, generate, abapgit, mcp), standard/ (SAP views)
19
+ packages/runtime/ Fastify server (app.ts, server.ts), OData (odata/), RAP (rap/), ABAP (abap/),
20
+ auth (auth/), launchpad (launchpad/), MCP (mcp/), UI (ui/), platform.ts
21
+ packages/vscode/ VS Code extension: calls the CLI with --json, compiles nothing
22
+ packages/cli/ npm package open-rap-runtime: the rapt command with what rapt dev needs
23
+ fixtures/travel reference BO (must stay importable and activatable on SAP)
24
+ fixtures/custom-entity custom entity, enhanced mode
25
+ fixtures/table-entity BO on a table entity, simple and enumerated types, enhanced mode
26
+ site/ project website (GitHub Pages, site.yml workflow, docs rendered by scripts/build-site.mjs)
27
+ ```
28
+
29
+ ## Commands
30
+
31
+ ```sh
32
+ pnpm install
33
+ pnpm build # tsc of each package; the compiler also copies docs/ into packages/compiler/docs
34
+ pnpm typecheck
35
+ pnpm test # vitest, ~3 min; browser tests with Playwright when it is installed
36
+ npx vitest run packages/compiler/test/ui.test.ts # one file
37
+ node packages/compiler/dist/cli.js check fixtures/travel
38
+ node packages/compiler/dist/cli.js dev fixtures/travel --port 8081
39
+ node scripts/build-site.mjs _site # the website, with the documentation pages
40
+ ```
41
+
42
+ The runtime tests import the built `@open-rap/compiler`: run `pnpm build` before running them
43
+ after a change to the compiler.
44
+
45
+ ## Rules
46
+
47
+ 1. **SAP behavior first.** In `standard` mode, a source behaves as on SAP; a deliberate
48
+ difference goes to the `enhanced` mode (D45) or into [KNOWN_GAPS.md](KNOWN_GAPS.md).
49
+ 2. **No proprietary SAP library** (no SAPUI5, no `sap.fe`, no `sap.ushell`, no CAP);
50
+ dependencies under permissive licenses, listed in [LICENSES.md](LICENSES.md), pinned versions.
51
+ 3. **Do not work around abaplint**: an ABAP feature the transpiler does not handle is documented
52
+ in KNOWN_GAPS.md (with the workaround) rather than patched.
53
+ 4. **One decision per feature**: add a `Dnn` entry to docs/DECISIONS.md (context, decision, why,
54
+ tests), update docs/FEATURES.md, docs/DIAGNOSTICS.md (new codes), KNOWN_GAPS.md and the guide.
55
+ 5. **Positioned diagnostics**: `file:line:column`, one code per problem (`CDS0xx`, `BDEF0xx`,
56
+ `ABP0xx`…), the right severity; never an uncaught exception on a wrong source.
57
+ 6. **Tests**: each feature has its tests (compiler and runtime; browser for the UI). Variants of
58
+ the fixture go through `generatedVariant` / `fixtureVariant` rather than changing
59
+ `fixtures/travel` (whose snapshots are the reference).
60
+ 7. **Generated UI**: ES5 JavaScript in TypeScript strings (`gen/ui/static.ts`); mind the escaping
61
+ (`\\d` in the TS gives `\d` in the JS). The ids of the controls are used by the browser tests.
62
+ 8. **Everything in English**: documentation, website, code, comments, messages, the README of
63
+ the generated applications, and everything around the repository: commit messages, branch
64
+ names, pull requests (title, description, review comments), issues and release notes.
65
+ 9. **Generated files**: never edit `.rapt/`, `dist/`, `packages/compiler/docs/`, nor the virtual
66
+ objects `<standard>/…` (standard views, D44).
67
+
68
+ ## Adding a feature, in practice
69
+
70
+ - CDS type (DRTY): `ddic/cds-types.ts` then `ir/dictionary.ts` (like a data element).
71
+ - CDS or BDEF construct: parser (`cds/adapter.ts`, `bdef/parser.ts`) → IR (`ir/`) → model
72
+ (`packages/model`) → generators and runtime → tests → documentation.
73
+ - Released ABAP Cloud class: clean-room implementation in `gen/abap/framework-*.ts` (public
74
+ signatures of SAP), JavaScript kernel in `runtime/src/abap/` when needed (D24, D40).
75
+ - UI annotation: `gen/ui/layout.ts` (layout.json), then views (`views.ts`) and controllers
76
+ (`static.ts`).
77
+ - CLI command: `cli.ts` (usage, options, `--json`), then the VS Code command
78
+ (`packages/vscode/src/extension.ts`, `package.json`), and the tool of `rapt agent` when an agent
79
+ needs it (`compiler/src/agent/server.ts`).