@linkup-ai/abap-ai 2.0.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 (114) hide show
  1. package/README.md +384 -0
  2. package/dist/adt-client.js +364 -0
  3. package/dist/cli/activate.js +113 -0
  4. package/dist/cli/init.js +333 -0
  5. package/dist/cli/remove.js +80 -0
  6. package/dist/cli/status.js +229 -0
  7. package/dist/cli/systems.js +68 -0
  8. package/dist/cli.js +81 -0
  9. package/dist/index.js +1318 -0
  10. package/dist/knowledge/abap/abap-dictionary.md +199 -0
  11. package/dist/knowledge/abap/abap-sql.md +296 -0
  12. package/dist/knowledge/abap/amdp.md +273 -0
  13. package/dist/knowledge/abap/clean-code.md +293 -0
  14. package/dist/knowledge/abap/cloud-background-processing.md +250 -0
  15. package/dist/knowledge/abap/cloud-communication.md +265 -0
  16. package/dist/knowledge/abap/cloud-development.md +176 -0
  17. package/dist/knowledge/abap/cloud-extensibility.md +252 -0
  18. package/dist/knowledge/abap/cloud-released-apis.md +261 -0
  19. package/dist/knowledge/abap/constructor-expressions.md +289 -0
  20. package/dist/knowledge/abap/enhancements.md +232 -0
  21. package/dist/knowledge/abap/exceptions.md +271 -0
  22. package/dist/knowledge/abap/internal-tables.md +205 -0
  23. package/dist/knowledge/abap/object-orientation.md +298 -0
  24. package/dist/knowledge/abap/performance.md +216 -0
  25. package/dist/knowledge/abap/rap-abstract-entities.md +206 -0
  26. package/dist/knowledge/abap/rap-business-events.md +216 -0
  27. package/dist/knowledge/abap/rap-draft.md +191 -0
  28. package/dist/knowledge/abap/rap-eml.md +453 -0
  29. package/dist/knowledge/abap/rap-end-to-end.md +486 -0
  30. package/dist/knowledge/abap/rap-feature-control.md +185 -0
  31. package/dist/knowledge/abap/rap-numbering.md +280 -0
  32. package/dist/knowledge/abap/rap-service-exposure.md +163 -0
  33. package/dist/knowledge/abap/rap-unmanaged.md +468 -0
  34. package/dist/knowledge/abap/string-processing.md +180 -0
  35. package/dist/knowledge/abap/unit-testing.md +303 -0
  36. package/dist/knowledge/abap-cds/access-control.md +241 -0
  37. package/dist/knowledge/abap-cds/annotations.md +331 -0
  38. package/dist/knowledge/abap-cds/associations.md +254 -0
  39. package/dist/knowledge/abap-cds/expressions.md +230 -0
  40. package/dist/knowledge/abap-cds/functions.md +245 -0
  41. package/dist/knowledge/abap-cds/metadata-extensions.md +294 -0
  42. package/dist/knowledge/cap/authentication.md +278 -0
  43. package/dist/knowledge/cap/cdl-syntax.md +247 -0
  44. package/dist/knowledge/cap/cql-queries.md +266 -0
  45. package/dist/knowledge/cap/deployment.md +343 -0
  46. package/dist/knowledge/cap/event-handlers.md +287 -0
  47. package/dist/knowledge/cap/fiori-integration.md +303 -0
  48. package/dist/knowledge/cap/service-definitions.md +287 -0
  49. package/dist/knowledge/fiori/annotations.md +347 -0
  50. package/dist/knowledge/fiori/deployment.md +340 -0
  51. package/dist/knowledge/fiori/fiori-elements.md +332 -0
  52. package/dist/knowledge/fiori/fiori-side-effects.md +107 -0
  53. package/dist/knowledge/fiori/fiori-valuelist.md +144 -0
  54. package/dist/knowledge/fiori/ui5-controllers.md +358 -0
  55. package/dist/knowledge/fiori/ui5-data-binding.md +311 -0
  56. package/dist/knowledge/fiori/ui5-fragments-dialogs.md +330 -0
  57. package/dist/knowledge/fiori/ui5-manifest.md +411 -0
  58. package/dist/knowledge/fiori/ui5-routing.md +303 -0
  59. package/dist/knowledge/fiori/ui5-xml-views.md +294 -0
  60. package/dist/logger.js +114 -0
  61. package/dist/system-profile.js +207 -0
  62. package/dist/tools/abap-doc.js +72 -0
  63. package/dist/tools/abapgit.js +161 -0
  64. package/dist/tools/activate.js +68 -0
  65. package/dist/tools/atc-check.js +117 -0
  66. package/dist/tools/auth-object.js +56 -0
  67. package/dist/tools/breakpoints.js +76 -0
  68. package/dist/tools/call-hierarchy.js +84 -0
  69. package/dist/tools/cds-annotations.js +98 -0
  70. package/dist/tools/cds-dependencies.js +65 -0
  71. package/dist/tools/check.js +47 -0
  72. package/dist/tools/code-completion.js +70 -0
  73. package/dist/tools/code-coverage.js +111 -0
  74. package/dist/tools/create-amdp.js +111 -0
  75. package/dist/tools/create-dcl.js +81 -0
  76. package/dist/tools/create-transport.js +38 -0
  77. package/dist/tools/create.js +285 -0
  78. package/dist/tools/data-preview.js +37 -0
  79. package/dist/tools/delete.js +45 -0
  80. package/dist/tools/deploy-bsp.js +298 -0
  81. package/dist/tools/discovery.js +59 -0
  82. package/dist/tools/element-info.js +93 -0
  83. package/dist/tools/enhancements.js +186 -0
  84. package/dist/tools/extract-method.js +44 -0
  85. package/dist/tools/function-group.js +59 -0
  86. package/dist/tools/knowledge.js +275 -0
  87. package/dist/tools/lock-object.js +75 -0
  88. package/dist/tools/message-class.js +67 -0
  89. package/dist/tools/navigate.js +80 -0
  90. package/dist/tools/number-range.js +57 -0
  91. package/dist/tools/object-documentation.js +43 -0
  92. package/dist/tools/object-structure.js +78 -0
  93. package/dist/tools/object-versions.js +57 -0
  94. package/dist/tools/package-contents.js +60 -0
  95. package/dist/tools/pretty-printer.js +35 -0
  96. package/dist/tools/publish-binding.js +49 -0
  97. package/dist/tools/quick-fix.js +69 -0
  98. package/dist/tools/read.js +167 -0
  99. package/dist/tools/refactor-rename.js +60 -0
  100. package/dist/tools/release-transport.js +24 -0
  101. package/dist/tools/released-apis.js +51 -0
  102. package/dist/tools/repository-tree.js +90 -0
  103. package/dist/tools/scaffold-rap.js +642 -0
  104. package/dist/tools/search.js +73 -0
  105. package/dist/tools/shared/data-format.js +101 -0
  106. package/dist/tools/sql-console.js +17 -0
  107. package/dist/tools/system-info.js +270 -0
  108. package/dist/tools/traces.js +66 -0
  109. package/dist/tools/transport-contents.js +83 -0
  110. package/dist/tools/transports.js +67 -0
  111. package/dist/tools/unit-test.js +135 -0
  112. package/dist/tools/where-used.js +59 -0
  113. package/dist/tools/write.js +101 -0
  114. package/package.json +49 -0
@@ -0,0 +1,347 @@
1
+ # Fiori Annotations — XML and CDS Reference
2
+
3
+ ## XML Annotation File Setup
4
+
5
+ ```json
6
+ // manifest.json — dataSources configuration
7
+ {
8
+ "sap.app": {
9
+ "dataSources": {
10
+ "mainService": {
11
+ "uri": "/sap/opu/odata/sap/SERVICE/",
12
+ "type": "OData",
13
+ "settings": {
14
+ "localUri": "localService/metadata.xml",
15
+ "annotations": ["annotation"]
16
+ }
17
+ },
18
+ "annotation": {
19
+ "type": "ODataAnnotation",
20
+ "uri": "annotations/annotation.xml"
21
+ }
22
+ }
23
+ }
24
+ }
25
+ ```
26
+
27
+ File location: `webapp/annotations/annotation.xml`
28
+
29
+ Prerequisites: local metadata.xml copy, single `EntityContainer`, valid `<edmx:DataServices/Schema>` nodes.
30
+
31
+ ## LineItem — Table Columns
32
+
33
+ ```xml
34
+ <Annotations Target="Namespace.EntityType">
35
+ <Annotation Term="UI.LineItem">
36
+ <Collection>
37
+ <Record Type="UI.DataField">
38
+ <PropertyValue Property="Value" Path="PropertyName"/>
39
+ <PropertyValue Property="Label" String="Column Label"/>
40
+ </Record>
41
+ <Record Type="UI.DataField">
42
+ <PropertyValue Property="Value" Path="Price"/>
43
+ <PropertyValue Property="Criticality" Path="PriceCriticality"/>
44
+ </Record>
45
+ <Record Type="UI.DataFieldForAnnotation">
46
+ <PropertyValue Property="Target" AnnotationPath="@UI.DataPoint#Rating"/>
47
+ <PropertyValue Property="Label" String="Rating"/>
48
+ </Record>
49
+ <Record Type="UI.DataFieldForAction">
50
+ <PropertyValue Property="Label" String="Approve"/>
51
+ <PropertyValue Property="Action" String="Namespace.Approve"/>
52
+ </Record>
53
+ </Collection>
54
+ </Annotation>
55
+ </Annotations>
56
+ ```
57
+
58
+ ## SelectionFields — Filter Bar
59
+
60
+ ```xml
61
+ <Annotation Term="UI.SelectionFields">
62
+ <Collection>
63
+ <PropertyPath>Property1</PropertyPath>
64
+ <PropertyPath>Property2</PropertyPath>
65
+ <PropertyPath>Property3</PropertyPath>
66
+ </Collection>
67
+ </Annotation>
68
+ ```
69
+
70
+ ## HeaderInfo — Object Page Title Area
71
+
72
+ ```xml
73
+ <Annotation Term="UI.HeaderInfo">
74
+ <Record Type="UI.HeaderInfoType">
75
+ <PropertyValue Property="TypeName" String="Sales Order"/>
76
+ <PropertyValue Property="TypeNamePlural" String="Sales Orders"/>
77
+ <PropertyValue Property="Title">
78
+ <Record Type="UI.DataField">
79
+ <PropertyValue Property="Value" Path="OrderID"/>
80
+ </Record>
81
+ </PropertyValue>
82
+ <PropertyValue Property="Description">
83
+ <Record Type="UI.DataField">
84
+ <PropertyValue Property="Value" Path="CustomerName"/>
85
+ </Record>
86
+ </PropertyValue>
87
+ <PropertyValue Property="ImageUrl" Path="ProductImage"/>
88
+ </Record>
89
+ </Annotation>
90
+ ```
91
+
92
+ ## Facets — Object Page Sections
93
+
94
+ ```xml
95
+ <Annotation Term="UI.Facets">
96
+ <Collection>
97
+ <!-- Grouped section with sub-facets -->
98
+ <Record Type="UI.CollectionFacet">
99
+ <PropertyValue Property="Label" String="General"/>
100
+ <PropertyValue Property="ID" String="GeneralSection"/>
101
+ <PropertyValue Property="Facets">
102
+ <Collection>
103
+ <Record Type="UI.ReferenceFacet">
104
+ <PropertyValue Property="Target"
105
+ AnnotationPath="@UI.FieldGroup#Basic"/>
106
+ </Record>
107
+ <Record Type="UI.ReferenceFacet">
108
+ <PropertyValue Property="Target"
109
+ AnnotationPath="@UI.FieldGroup#Dates"/>
110
+ </Record>
111
+ </Collection>
112
+ </PropertyValue>
113
+ </Record>
114
+ <!-- Navigation property table section -->
115
+ <Record Type="UI.ReferenceFacet">
116
+ <PropertyValue Property="Label" String="Items"/>
117
+ <PropertyValue Property="ID" String="ItemsSection"/>
118
+ <PropertyValue Property="Target"
119
+ AnnotationPath="to_Items/@UI.LineItem"/>
120
+ </Record>
121
+ </Collection>
122
+ </Annotation>
123
+ ```
124
+
125
+ ## FieldGroup — Grouped Form Fields
126
+
127
+ ```xml
128
+ <Annotation Term="UI.FieldGroup" Qualifier="Basic">
129
+ <Record Type="UI.FieldGroupType">
130
+ <PropertyValue Property="Data">
131
+ <Collection>
132
+ <Record Type="UI.DataField">
133
+ <PropertyValue Property="Value" Path="OrderID"/>
134
+ </Record>
135
+ <Record Type="UI.DataField">
136
+ <PropertyValue Property="Value" Path="Status"/>
137
+ <PropertyValue Property="Criticality" Path="StatusCriticality"/>
138
+ </Record>
139
+ <Record Type="UI.DataFieldWithUrl">
140
+ <PropertyValue Property="Value" Path="WebsiteUrl"/>
141
+ <PropertyValue Property="Url" Path="WebsiteUrl"/>
142
+ </Record>
143
+ </Collection>
144
+ </PropertyValue>
145
+ </Record>
146
+ </Annotation>
147
+ ```
148
+
149
+ ## DataPoint — KPI / Header Values
150
+
151
+ ```xml
152
+ <Annotation Term="UI.DataPoint" Qualifier="Revenue">
153
+ <Record Type="UI.DataPointType">
154
+ <PropertyValue Property="Value" Path="TotalRevenue"/>
155
+ <PropertyValue Property="Title" String="Revenue"/>
156
+ <PropertyValue Property="Criticality" Path="RevenueCriticality"/>
157
+ <PropertyValue Property="TargetValue" Path="RevenueTarget"/>
158
+ <PropertyValue Property="Visualization"
159
+ EnumMember="UI.VisualizationType/Progress"/>
160
+ </Record>
161
+ </Annotation>
162
+ ```
163
+
164
+ ## ValueList — Value Help (F4)
165
+
166
+ ```xml
167
+ <Annotations Target="Namespace.EntityType/CategoryID">
168
+ <Annotation Term="Common.ValueList">
169
+ <Record Type="Common.ValueListType">
170
+ <PropertyValue Property="CollectionPath" String="Categories"/>
171
+ <PropertyValue Property="Parameters">
172
+ <Collection>
173
+ <Record Type="Common.ValueListParameterInOut">
174
+ <PropertyValue Property="LocalDataProperty"
175
+ PropertyPath="CategoryID"/>
176
+ <PropertyValue Property="ValueListProperty" String="ID"/>
177
+ </Record>
178
+ <Record Type="Common.ValueListParameterDisplayOnly">
179
+ <PropertyValue Property="ValueListProperty"
180
+ String="Description"/>
181
+ </Record>
182
+ </Collection>
183
+ </PropertyValue>
184
+ </Record>
185
+ </Annotation>
186
+ </Annotations>
187
+ ```
188
+
189
+ ## Common.Text — Display Text for Coded Values
190
+
191
+ ```xml
192
+ <Annotations Target="Namespace.EntityType/StatusCode">
193
+ <Annotation Term="Common.Text" Path="StatusText"/>
194
+ <Annotation Term="Common.TextArrangement"
195
+ EnumMember="UI.TextArrangementType/TextFirst"/>
196
+ </Annotations>
197
+ ```
198
+
199
+ ## Chart
200
+
201
+ ```xml
202
+ <Annotation Term="UI.Chart" Qualifier="SalesChart">
203
+ <Record Type="UI.ChartDefinitionType">
204
+ <PropertyValue Property="Title" String="Sales Overview"/>
205
+ <PropertyValue Property="ChartType" EnumMember="UI.ChartType/Column"/>
206
+ <PropertyValue Property="Dimensions">
207
+ <Collection><PropertyPath>Region</PropertyPath></Collection>
208
+ </PropertyValue>
209
+ <PropertyValue Property="DimensionAttributes">
210
+ <Collection>
211
+ <Record Type="UI.ChartDimensionAttributeType">
212
+ <PropertyValue Property="Dimension" PropertyPath="Region"/>
213
+ <PropertyValue Property="Role"
214
+ EnumMember="UI.ChartDimensionRoleType/Category"/>
215
+ </Record>
216
+ </Collection>
217
+ </PropertyValue>
218
+ <PropertyValue Property="Measures">
219
+ <Collection><PropertyPath>Amount</PropertyPath></Collection>
220
+ </PropertyValue>
221
+ <PropertyValue Property="MeasureAttributes">
222
+ <Collection>
223
+ <Record Type="UI.ChartMeasureAttributeType">
224
+ <PropertyValue Property="Measure" PropertyPath="Amount"/>
225
+ <PropertyValue Property="Role"
226
+ EnumMember="UI.ChartMeasureRoleType/Axis1"/>
227
+ </Record>
228
+ </Collection>
229
+ </PropertyValue>
230
+ </Record>
231
+ </Annotation>
232
+ ```
233
+
234
+ ## CDS Equivalents (CAP)
235
+
236
+ ```cds
237
+ annotate CatalogService.Orders with @(
238
+ UI: {
239
+ SelectionFields: [ status, customer, createdAt ],
240
+ LineItem: [
241
+ { Value: orderNo },
242
+ { Value: customer, Label: 'Customer' },
243
+ { Value: totalAmount },
244
+ { Value: status, Criticality: statusCriticality },
245
+ { $Type: 'UI.DataFieldForAction', Action: 'approve', Label: 'Approve' }
246
+ ],
247
+ HeaderInfo: {
248
+ TypeName: 'Order',
249
+ TypeNamePlural: 'Orders',
250
+ Title: { Value: orderNo },
251
+ Description: { Value: customer }
252
+ },
253
+ Facets: [
254
+ {
255
+ $Type: 'UI.CollectionFacet', ID: 'General', Label: 'General',
256
+ Facets: [
257
+ { $Type: 'UI.ReferenceFacet', Target: '@UI.FieldGroup#Main' }
258
+ ]
259
+ },
260
+ { $Type: 'UI.ReferenceFacet', Target: 'items/@UI.LineItem', Label: 'Items' }
261
+ ],
262
+ FieldGroup#Main: {
263
+ Data: [
264
+ { Value: orderNo },
265
+ { Value: status, Criticality: statusCriticality },
266
+ { Value: totalAmount }
267
+ ]
268
+ }
269
+ }
270
+ );
271
+
272
+ // Value help
273
+ annotate CatalogService.Orders with {
274
+ status @Common.ValueList: {
275
+ CollectionPath: 'StatusCodes',
276
+ Parameters: [
277
+ { $Type: 'Common.ValueListParameterInOut', LocalDataProperty: status,
278
+ ValueListProperty: 'code' },
279
+ { $Type: 'Common.ValueListParameterDisplayOnly',
280
+ ValueListProperty: 'description' }
281
+ ]
282
+ };
283
+ status @Common.Text: statusText @Common.TextArrangement: #TextFirst;
284
+ };
285
+ ```
286
+
287
+ ## Vocabulary Quick Reference
288
+
289
+ | Annotation | Purpose |
290
+ |---|---|
291
+ | `UI.LineItem` | Table columns |
292
+ | `UI.SelectionFields` | Filter bar fields |
293
+ | `UI.HeaderInfo` | Object page title/subtitle |
294
+ | `UI.HeaderFacets` | Object page header KPIs |
295
+ | `UI.Facets` | Object page sections |
296
+ | `UI.FieldGroup#Qualifier` | Form field grouping |
297
+ | `UI.DataPoint#Qualifier` | KPI / progress / rating |
298
+ | `UI.Chart` | Chart definition |
299
+ | `UI.PresentationVariant` | Default sort + visualization |
300
+ | `UI.SelectionVariant` | Default filter values |
301
+ | `UI.Identification` | Object page footer actions |
302
+ | `Common.Label` | Property display label |
303
+ | `Common.Text` | Display text for code/ID fields |
304
+ | `Common.TextArrangement` | Text display order (TextFirst, TextOnly) |
305
+ | `Common.ValueList` | Value help / F4 |
306
+ | `Common.SemanticObject` | Intent-based navigation target |
307
+ | `Common.DraftRoot` | Draft handling root entity |
308
+ | `Capabilities.InsertRestrictions` | Create permission |
309
+ | `Capabilities.UpdateRestrictions` | Edit permission |
310
+ | `Capabilities.DeleteRestrictions` | Delete permission |
311
+ | `Capabilities.FilterRestrictions` | Filter limitations |
312
+
313
+ ## Criticality Values
314
+
315
+ | Value | CDS | Rendering |
316
+ |---|---|---|
317
+ | 0 | `Neutral` | Grey (default) |
318
+ | 1 | `Negative` | Red (error) |
319
+ | 2 | `Critical` | Orange (warning) |
320
+ | 3 | `Positive` | Green (success) |
321
+ | 5 | `Information` | Blue (info) |
322
+
323
+ ## Rules
324
+
325
+ - Local annotation files override backend annotations (same term + qualifier + target)
326
+ - Annotation file must be referenced in `manifest.json` `dataSources.*.settings.annotations`
327
+ - Use `Qualifier` to define multiple instances of same annotation term (e.g., `FieldGroup#Basic`, `FieldGroup#Dates`)
328
+ - `Path` resolves at runtime from entity data; `String` is static text
329
+ - `PropertyPath` is used inside `Collection` elements; `Path` is used inside `Record` property values
330
+ - `AnnotationPath` navigates to other annotations (e.g., `@UI.FieldGroup#Basic`)
331
+ - Navigation properties in annotation paths use `/` separator: `to_Items/@UI.LineItem`
332
+ - Always pair `Common.Text` with `Common.TextArrangement` for readable ID fields
333
+ - i18n keys: use camelCase for non-CAP, PascalCase for CAP projects
334
+ - Handle i18n externalization near project end to minimize unused entries
335
+
336
+ ## Anti-Patterns
337
+
338
+ | Anti-Pattern | Correct Approach |
339
+ |---|---|
340
+ | Editing backend annotation files directly | Create local annotation overrides |
341
+ | Missing `Common.Text` on code/ID fields | Always add `Text` + `TextArrangement` |
342
+ | Using `String` for dynamic values | Use `Path` to bind to entity properties |
343
+ | Omitting `Qualifier` on multiple FieldGroups | Each FieldGroup needs unique qualifier |
344
+ | Putting actions in `UI.FieldGroup` | Use `UI.DataFieldForAction` in `LineItem` or `Identification` |
345
+ | Defining ValueList without `InOut` parameter | At least one `ValueListParameterInOut` required |
346
+ | Annotations in metadata.xml directly | Use separate annotation.xml files |
347
+ | Ignoring diagnostics warnings in IDE | Fix all warnings before deployment |
@@ -0,0 +1,340 @@
1
+ # Fiori Deployment — ABAP and Cloud Foundry
2
+
3
+ ## ABAP Deployment — ui5-deploy.yaml
4
+
5
+ ```yaml
6
+ specVersion: "2.4"
7
+ metadata:
8
+ name: project-name
9
+ type: application
10
+ builder:
11
+ resources:
12
+ excludes:
13
+ - /test/**
14
+ - /localService/**
15
+ deploy:
16
+ target:
17
+ url: https://system.example.com
18
+ client: "100"
19
+ scp: false
20
+ params:
21
+ sap-language: EN
22
+ app:
23
+ name: ZAPP_NAME
24
+ package: ZPACKAGE
25
+ description: Application description
26
+ transport: DEVK900123
27
+ ```
28
+
29
+ ```json
30
+ // package.json — deploy script
31
+ {
32
+ "scripts": {
33
+ "deploy": "fiori deploy --config ui5-deploy.yaml"
34
+ }
35
+ }
36
+ ```
37
+
38
+ ```bash
39
+ # Generate deploy config
40
+ npx fiori add deploy-config
41
+
42
+ # Execute deployment
43
+ npm run deploy
44
+
45
+ # Undeploy
46
+ npx fiori undeploy --config ui5-deploy.yaml
47
+
48
+ # Debug deployment issues
49
+ DEBUG=ux-odata-client npm run deploy
50
+ ```
51
+
52
+ ### ABAP Prerequisites
53
+
54
+ | Requirement | Minimum |
55
+ |---|---|
56
+ | SAP_UI Component | 7.53+ |
57
+ | ABAP Repository Service | `/sap/opu/odata/UI5/ABAP_REPOSITORY_SRV` active |
58
+ | Authorization | `S_DEVELOP` with required activities |
59
+ | Transport | Required unless `$TMP` / local package |
60
+
61
+ ### Authentication
62
+
63
+ | Method | On-Premise | BTP ABAP |
64
+ |---|---|---|
65
+ | Basic Auth | Yes | No |
66
+ | Reentrance Ticket | No | Yes |
67
+ | OAuth 2.0 | No | Deprecated |
68
+
69
+ ## Cloud Foundry Deployment — mta.yaml
70
+
71
+ ```yaml
72
+ _schema-version: "3.2"
73
+ ID: project-name
74
+ version: 0.0.1
75
+ modules:
76
+ - name: project-name-destination-content
77
+ type: com.sap.application.content
78
+ requires:
79
+ - name: project-name-destination-service
80
+ parameters:
81
+ content-target: true
82
+ - name: project-name-repo-host
83
+ parameters:
84
+ service-key:
85
+ name: project-name-repo-host-key
86
+ - name: project-name-uaa
87
+ parameters:
88
+ service-key:
89
+ name: project-name-uaa-key
90
+ parameters:
91
+ content:
92
+ instance:
93
+ destinations:
94
+ - Name: project-name-repo-host
95
+ ServiceInstanceName: project-name-html5-srv
96
+ ServiceKeyName: project-name-repo-host-key
97
+ sap.cloud.service: project-name
98
+ - Authentication: OAuth2UserTokenExchange
99
+ Name: project-name-uaa
100
+ ServiceInstanceName: project-name-xsuaa
101
+ ServiceKeyName: project-name-uaa-key
102
+ sap.cloud.service: project-name
103
+ existing_destinations_policy: update
104
+
105
+ - name: project-name
106
+ type: html5
107
+ path: .
108
+ build-parameters:
109
+ build-result: dist
110
+ builder: custom
111
+ commands:
112
+ - npm install
113
+ - npm run build:cf
114
+
115
+ resources:
116
+ - name: project-name-repo-host
117
+ type: org.cloudfoundry.managed-service
118
+ parameters:
119
+ service: html5-apps-repo
120
+ service-plan: app-host
121
+ - name: project-name-destination-service
122
+ type: org.cloudfoundry.managed-service
123
+ parameters:
124
+ service: destination
125
+ service-plan: lite
126
+ - name: project-name-uaa
127
+ type: org.cloudfoundry.managed-service
128
+ parameters:
129
+ service: xsuaa
130
+ service-plan: application
131
+ config:
132
+ xsappname: project-name
133
+ tenant-mode: dedicated
134
+ ```
135
+
136
+ ### xs-app.json — App Router
137
+
138
+ ```json
139
+ {
140
+ "welcomeFile": "/index.html",
141
+ "authenticationMethod": "route",
142
+ "routes": [
143
+ {
144
+ "source": "^/sap/opu/odata/(.*)$",
145
+ "target": "/sap/opu/odata/$1",
146
+ "destination": "backend-destination",
147
+ "authenticationType": "xsuaa"
148
+ },
149
+ {
150
+ "source": "^(.*)$",
151
+ "target": "$1",
152
+ "service": "html5-apps-repo-rt",
153
+ "authenticationType": "xsuaa"
154
+ }
155
+ ]
156
+ }
157
+ ```
158
+
159
+ ```bash
160
+ # CF prerequisites
161
+ npm install -g mta
162
+ cf install-plugin -r CF-Community "multiapps"
163
+
164
+ # Build MTA archive
165
+ mbt build
166
+
167
+ # Deploy to CF
168
+ cf deploy mta_archives/project-name_0.0.1.mtar
169
+
170
+ # Undeploy from CF
171
+ cf undeploy project-name --delete-services
172
+ ```
173
+
174
+ ## Fiori Launchpad Configuration
175
+
176
+ ```json
177
+ // manifest.json — crossNavigation inbound
178
+ {
179
+ "sap.app": {
180
+ "crossNavigation": {
181
+ "inbounds": {
182
+ "intent1": {
183
+ "semanticObject": "Product",
184
+ "action": "display",
185
+ "title": "{{appTitle}}",
186
+ "subTitle": "{{appSubTitle}}",
187
+ "signature": {
188
+ "parameters": {},
189
+ "additionalParameters": "allowed"
190
+ }
191
+ }
192
+ }
193
+ }
194
+ }
195
+ }
196
+ ```
197
+
198
+ ```bash
199
+ # Generate FLP config
200
+ npx fiori add flp-config
201
+ ```
202
+
203
+ | Parameter | Description | Example |
204
+ |---|---|---|
205
+ | Semantic Object | Business object identifier | `SalesOrder`, `Product` |
206
+ | Action | Navigation verb | `display`, `manage`, `create` |
207
+ | Title | Launchpad tile title | `Manage Products` |
208
+ | Subtitle | Tile subtitle (optional) | `Product Administration` |
209
+
210
+ ## Complete manifest.json — Data Sources
211
+
212
+ ```json
213
+ {
214
+ "sap.app": {
215
+ "id": "com.mycompany.products",
216
+ "type": "application",
217
+ "applicationVersion": { "version": "1.0.0" },
218
+ "dataSources": {
219
+ "mainService": {
220
+ "uri": "/sap/opu/odata/sap/PRODUCT_SRV/",
221
+ "type": "OData",
222
+ "settings": {
223
+ "annotations": ["annotation"],
224
+ "localUri": "localService/metadata.xml",
225
+ "odataVersion": "2.0"
226
+ }
227
+ },
228
+ "annotation": {
229
+ "type": "ODataAnnotation",
230
+ "uri": "annotations/annotation.xml",
231
+ "settings": {
232
+ "localUri": "annotations/annotation.xml"
233
+ }
234
+ }
235
+ }
236
+ },
237
+ "sap.ui5": {
238
+ "dependencies": {
239
+ "minUI5Version": "1.120.0",
240
+ "libs": { "sap.fe.templates": {} }
241
+ },
242
+ "models": {
243
+ "i18n": {
244
+ "type": "sap.ui.model.resource.ResourceModel",
245
+ "settings": {
246
+ "bundleName": "com.mycompany.products.i18n.i18n"
247
+ }
248
+ },
249
+ "": {
250
+ "dataSource": "mainService",
251
+ "preload": true,
252
+ "settings": {
253
+ "defaultBindingMode": "TwoWay",
254
+ "defaultCountMode": "Inline",
255
+ "refreshAfterChange": false
256
+ }
257
+ }
258
+ }
259
+ },
260
+ "sap.fiori": {
261
+ "registrationIds": [],
262
+ "archeType": "transactional"
263
+ }
264
+ }
265
+ ```
266
+
267
+ ## Required OData Services (ABAP)
268
+
269
+ | Service | Path |
270
+ |---|---|
271
+ | SAPUI5 Repository | `/sap/opu/odata/UI5/ABAP_REPOSITORY_SRV` |
272
+ | OData V2 Catalog | `/sap/opu/odata/IWFND/CATALOGSERVICE;v=2` |
273
+ | OData V4 Catalog (dev) | `/sap/opu/odata4/iwfnd/config/default/iwfnd/catalog/0001` |
274
+ | OData V4 Catalog (prod) | `/sap/opu/odata4/iwfnd/config/default/iwfnd/catalog/0002` |
275
+ | ATO Settings | `/sap/bc/adt/ato/settings` |
276
+
277
+ ## Transport Request Options
278
+
279
+ | Option | When to Use |
280
+ |---|---|
281
+ | Enter manually | Known transport ID |
282
+ | Choose from existing | Browse system transports |
283
+ | Create new | Generate during config |
284
+ | Create during deployment | Auto-create on first deploy |
285
+
286
+ ## Project Structure (CF)
287
+
288
+ ```
289
+ project/
290
+ ├── webapp/
291
+ │ ├── manifest.json
292
+ │ ├── annotations/
293
+ │ │ └── annotation.xml
294
+ │ └── i18n/
295
+ │ └── i18n.properties
296
+ ├── mta.yaml
297
+ ├── xs-app.json
298
+ ├── xs-security.json
299
+ ├── ui5.yaml
300
+ ├── ui5-deploy.yaml
301
+ └── package.json
302
+ ```
303
+
304
+ ## Rules
305
+
306
+ - Always exclude `/test/**` and `/localService/**` from deployment builds
307
+ - ABAP app name (`ZAPP_NAME`) must follow customer namespace (Z/Y prefix)
308
+ - Package must exist before deployment; transport must be modifiable
309
+ - For BTP ABAP, use reentrance tickets (not basic auth)
310
+ - CF deployment requires `mta` CLI v1.0+ and `multiapps` CF plugin
311
+ - Set `scp: false` for on-premise ABAP; `scp: true` for BTP ABAP Environment
312
+ - `crossNavigation.inbounds` is required for Fiori Launchpad tile registration
313
+ - Semantic object + action must be unique across the Fiori Launchpad
314
+ - Use `odataVersion: "2.0"` or `"4.0"` explicitly in dataSources settings
315
+ - `existing_destinations_policy: update` in mta.yaml prevents destination conflicts on redeploy
316
+
317
+ ## Anti-Patterns
318
+
319
+ | Anti-Pattern | Correct Approach |
320
+ |---|---|
321
+ | Deploying without transport in non-local package | Always assign modifiable transport request |
322
+ | Using basic auth for BTP ABAP | Use reentrance tickets |
323
+ | Missing `localUri` for metadata | Always provide local metadata copy |
324
+ | Deploying test files to production | Exclude `/test/**` in builder resources |
325
+ | Hardcoding service URL in xs-app.json | Use BTP destination name |
326
+ | Omitting `crossNavigation` for launchpad apps | Add FLP config before deployment |
327
+ | Skipping `multiapps` plugin for CF deploy | Install: `cf install-plugin -r CF-Community "multiapps"` |
328
+ | Using `scp: true` for on-premise systems | Set `scp: false` for on-premise ABAP |
329
+ | Missing `html5-apps-repo` resource in mta.yaml | Required for HTML5 repository hosting |
330
+ | Deploying without checking `/IWFND/ERROR_LOG` on failures | Always check error log for 400 errors |
331
+
332
+ ## Troubleshooting
333
+
334
+ | Issue | Check |
335
+ |---|---|
336
+ | Service activation error | SAP_UI 7.53+ installed? |
337
+ | HTTP 400 on deploy | `/IWFND/ERROR_LOG` in SAP GUI |
338
+ | Virus scan failure | `/IWFND/VIRUS_SCAN` config |
339
+ | Authorization error | `S_DEVELOP` authorization object |
340
+ | CF deploy fails | `cf login` active? `multiapps` plugin installed? |