@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.
- package/LICENSE +21 -0
- package/README.md +21 -2
- package/dist/agent/server.d.ts +35 -0
- package/dist/agent/server.js +408 -0
- package/dist/agent/server.js.map +1 -0
- package/dist/authoring/abapgit.d.ts +38 -0
- package/dist/authoring/abapgit.js +242 -0
- package/dist/authoring/abapgit.js.map +1 -0
- package/dist/authoring/catalog.d.ts +48 -0
- package/dist/authoring/catalog.js +117 -0
- package/dist/authoring/catalog.js.map +1 -0
- package/dist/authoring/floorplan.d.ts +28 -0
- package/dist/authoring/floorplan.js +31 -0
- package/dist/authoring/floorplan.js.map +1 -0
- package/dist/authoring/generate.d.ts +57 -0
- package/dist/authoring/generate.js +630 -0
- package/dist/authoring/generate.js.map +1 -0
- package/dist/authoring/mcp.d.ts +15 -0
- package/dist/authoring/mcp.js +52 -0
- package/dist/authoring/mcp.js.map +1 -0
- package/dist/authoring/new.d.ts +35 -0
- package/dist/authoring/new.js +389 -0
- package/dist/authoring/new.js.map +1 -0
- package/dist/bdef/ast.d.ts +249 -0
- package/dist/bdef/ast.js +3 -0
- package/dist/bdef/ast.js.map +1 -0
- package/dist/bdef/lexer.d.ts +105 -0
- package/dist/bdef/lexer.js +148 -0
- package/dist/bdef/lexer.js.map +1 -0
- package/dist/bdef/parser.d.ts +22 -0
- package/dist/bdef/parser.js +1012 -0
- package/dist/bdef/parser.js.map +1 -0
- package/dist/build.d.ts +26 -0
- package/dist/build.js +62 -0
- package/dist/build.js.map +1 -0
- package/dist/cds/adapter.d.ts +91 -0
- package/dist/cds/adapter.js +381 -0
- package/dist/cds/adapter.js.map +1 -0
- package/dist/cds/expression-ast.d.ts +65 -0
- package/dist/cds/expression-ast.js +330 -0
- package/dist/cds/expression-ast.js.map +1 -0
- package/dist/cli.d.ts +9 -0
- package/dist/cli.js +485 -0
- package/dist/cli.js.map +1 -0
- package/dist/dcl/parser.d.ts +59 -0
- package/dist/dcl/parser.js +338 -0
- package/dist/dcl/parser.js.map +1 -0
- package/dist/ddic/catalog.d.ts +17 -0
- package/dist/ddic/catalog.js +211 -0
- package/dist/ddic/catalog.js.map +1 -0
- package/dist/ddic/cds-types.d.ts +47 -0
- package/dist/ddic/cds-types.js +131 -0
- package/dist/ddic/cds-types.js.map +1 -0
- package/dist/ddic/table-source.d.ts +70 -0
- package/dist/ddic/table-source.js +500 -0
- package/dist/ddic/table-source.js.map +1 -0
- package/dist/ddic/xml.d.ts +65 -0
- package/dist/ddic/xml.js +201 -0
- package/dist/ddic/xml.js.map +1 -0
- package/dist/dev.d.ts +128 -0
- package/dist/dev.js +434 -0
- package/dist/dev.js.map +1 -0
- package/dist/diagnostics.d.ts +33 -0
- package/dist/diagnostics.js +53 -0
- package/dist/diagnostics.js.map +1 -0
- package/dist/gen/abap/derived-types.d.ts +26 -0
- package/dist/gen/abap/derived-types.js +323 -0
- package/dist/gen/abap/derived-types.js.map +1 -0
- package/dist/gen/abap/eml.d.ts +118 -0
- package/dist/gen/abap/eml.js +362 -0
- package/dist/gen/abap/eml.js.map +1 -0
- package/dist/gen/abap/enums.d.ts +13 -0
- package/dist/gen/abap/enums.js +74 -0
- package/dist/gen/abap/enums.js.map +1 -0
- package/dist/gen/abap/framework-http.d.ts +14 -0
- package/dist/gen/abap/framework-http.js +1049 -0
- package/dist/gen/abap/framework-http.js.map +1 -0
- package/dist/gen/abap/framework-query.d.ts +14 -0
- package/dist/gen/abap/framework-query.js +225 -0
- package/dist/gen/abap/framework-query.js.map +1 -0
- package/dist/gen/abap/framework-utils.d.ts +29 -0
- package/dist/gen/abap/framework-utils.js +3707 -0
- package/dist/gen/abap/framework-utils.js.map +1 -0
- package/dist/gen/abap/framework.d.ts +12 -0
- package/dist/gen/abap/framework.js +480 -0
- package/dist/gen/abap/framework.js.map +1 -0
- package/dist/gen/abap/generate.d.ts +40 -0
- package/dist/gen/abap/generate.js +238 -0
- package/dist/gen/abap/generate.js.map +1 -0
- package/dist/gen/abap/rewrite.d.ts +82 -0
- package/dist/gen/abap/rewrite.js +957 -0
- package/dist/gen/abap/rewrite.js.map +1 -0
- package/dist/gen/abap/shadow.d.ts +25 -0
- package/dist/gen/abap/shadow.js +175 -0
- package/dist/gen/abap/shadow.js.map +1 -0
- package/dist/gen/abap/tokens.d.ts +33 -0
- package/dist/gen/abap/tokens.js +87 -0
- package/dist/gen/abap/tokens.js.map +1 -0
- package/dist/gen/app/index.d.ts +25 -0
- package/dist/gen/app/index.js +322 -0
- package/dist/gen/app/index.js.map +1 -0
- package/dist/gen/csdl.d.ts +11 -0
- package/dist/gen/csdl.js +562 -0
- package/dist/gen/csdl.js.map +1 -0
- package/dist/gen/deploy.d.ts +12 -0
- package/dist/gen/deploy.js +53 -0
- package/dist/gen/deploy.js.map +1 -0
- package/dist/gen/docs/index.d.ts +35 -0
- package/dist/gen/docs/index.js +267 -0
- package/dist/gen/docs/index.js.map +1 -0
- package/dist/gen/docs/markdown.d.ts +23 -0
- package/dist/gen/docs/markdown.js +187 -0
- package/dist/gen/docs/markdown.js.map +1 -0
- package/dist/gen/docs/site.d.ts +17 -0
- package/dist/gen/docs/site.js +106 -0
- package/dist/gen/docs/site.js.map +1 -0
- package/dist/gen/keycloak.d.ts +21 -0
- package/dist/gen/keycloak.js +90 -0
- package/dist/gen/keycloak.js.map +1 -0
- package/dist/gen/launchpad/index.d.ts +48 -0
- package/dist/gen/launchpad/index.js +302 -0
- package/dist/gen/launchpad/index.js.map +1 -0
- package/dist/gen/launchpad/ui.d.ts +14 -0
- package/dist/gen/launchpad/ui.js +350 -0
- package/dist/gen/launchpad/ui.js.map +1 -0
- package/dist/gen/mcp.d.ts +23 -0
- package/dist/gen/mcp.js +244 -0
- package/dist/gen/mcp.js.map +1 -0
- package/dist/gen/sql-expressions.d.ts +12 -0
- package/dist/gen/sql-expressions.js +136 -0
- package/dist/gen/sql-expressions.js.map +1 -0
- package/dist/gen/sql.d.ts +38 -0
- package/dist/gen/sql.js +612 -0
- package/dist/gen/sql.js.map +1 -0
- package/dist/gen/ui/index.d.ts +7 -0
- package/dist/gen/ui/index.js +27 -0
- package/dist/gen/ui/index.js.map +1 -0
- package/dist/gen/ui/layout.d.ts +230 -0
- package/dist/gen/ui/layout.js +511 -0
- package/dist/gen/ui/layout.js.map +1 -0
- package/dist/gen/ui/static.d.ts +55 -0
- package/dist/gen/ui/static.js +2901 -0
- package/dist/gen/ui/static.js.map +1 -0
- package/dist/gen/ui/views.d.ts +10 -0
- package/dist/gen/ui/views.js +511 -0
- package/dist/gen/ui/views.js.map +1 -0
- package/dist/gen/vendor.d.ts +23 -0
- package/dist/gen/vendor.js +68 -0
- package/dist/gen/vendor.js.map +1 -0
- package/dist/gen/xml.d.ts +9 -0
- package/dist/gen/xml.js +42 -0
- package/dist/gen/xml.js.map +1 -0
- package/dist/index.d.ts +20 -0
- package/dist/index.js +20 -0
- package/dist/index.js.map +1 -0
- package/dist/input/project.d.ts +50 -0
- package/dist/input/project.js +128 -0
- package/dist/input/project.js.map +1 -0
- package/dist/ir/access-controls.d.ts +11 -0
- package/dist/ir/access-controls.js +148 -0
- package/dist/ir/access-controls.js.map +1 -0
- package/dist/ir/authorizations.d.ts +25 -0
- package/dist/ir/authorizations.js +178 -0
- package/dist/ir/authorizations.js.map +1 -0
- package/dist/ir/behaviors.d.ts +16 -0
- package/dist/ir/behaviors.js +548 -0
- package/dist/ir/behaviors.js.map +1 -0
- package/dist/ir/builder.d.ts +20 -0
- package/dist/ir/builder.js +505 -0
- package/dist/ir/builder.js.map +1 -0
- package/dist/ir/config.d.ts +25 -0
- package/dist/ir/config.js +130 -0
- package/dist/ir/config.js.map +1 -0
- package/dist/ir/dictionary.d.ts +54 -0
- package/dist/ir/dictionary.js +328 -0
- package/dist/ir/dictionary.js.map +1 -0
- package/dist/ir/entities.d.ts +58 -0
- package/dist/ir/entities.js +676 -0
- package/dist/ir/entities.js.map +1 -0
- package/dist/ir/expressions.d.ts +33 -0
- package/dist/ir/expressions.js +327 -0
- package/dist/ir/expressions.js.map +1 -0
- package/dist/ir/handlers.d.ts +63 -0
- package/dist/ir/handlers.js +398 -0
- package/dist/ir/handlers.js.map +1 -0
- package/dist/ir/number-ranges.d.ts +24 -0
- package/dist/ir/number-ranges.js +74 -0
- package/dist/ir/number-ranges.js.map +1 -0
- package/dist/ir/seed.d.ts +23 -0
- package/dist/ir/seed.js +78 -0
- package/dist/ir/seed.js.map +1 -0
- package/dist/ir/service.d.ts +21 -0
- package/dist/ir/service.js +96 -0
- package/dist/ir/service.js.map +1 -0
- package/dist/launchpad/config.d.ts +47 -0
- package/dist/launchpad/config.js +321 -0
- package/dist/launchpad/config.js.map +1 -0
- package/dist/launchpad/workspace.d.ts +48 -0
- package/dist/launchpad/workspace.js +166 -0
- package/dist/launchpad/workspace.js.map +1 -0
- package/dist/srvd/parser.d.ts +36 -0
- package/dist/srvd/parser.js +193 -0
- package/dist/srvd/parser.js.map +1 -0
- package/dist/standard/data.d.ts +18 -0
- package/dist/standard/data.js +534 -0
- package/dist/standard/data.js.map +1 -0
- package/dist/standard/index.d.ts +36 -0
- package/dist/standard/index.js +507 -0
- package/dist/standard/index.js.map +1 -0
- package/dist/version.d.ts +2 -0
- package/dist/version.js +4 -0
- package/dist/version.js.map +1 -0
- package/docs/AGENTS.md +79 -0
- package/docs/ANNOTATIONS.md +76 -0
- package/docs/DECISIONS.md +1554 -0
- package/docs/DEPLOYMENT.md +113 -0
- package/docs/DIAGNOSTICS.md +116 -0
- package/docs/FEATURES.md +287 -0
- package/docs/GUIDE.md +560 -0
- package/docs/KNOWN_GAPS.md +216 -0
- package/docs/MCP.md +84 -0
- package/docs/PLAN.md +690 -0
- package/docs/README.md +148 -0
- package/docs/REMOTE_APIS.md +121 -0
- package/docs/ROADMAP.md +35 -0
- package/docs/UTILITIES.md +95 -0
- 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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"}
|
package/dist/version.js
ADDED
|
@@ -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`).
|