@open-rap/compiler 0.0.0-stage → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (227) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +21 -2
  3. package/dist/agent/server.d.ts +35 -0
  4. package/dist/agent/server.js +408 -0
  5. package/dist/agent/server.js.map +1 -0
  6. package/dist/authoring/abapgit.d.ts +38 -0
  7. package/dist/authoring/abapgit.js +242 -0
  8. package/dist/authoring/abapgit.js.map +1 -0
  9. package/dist/authoring/catalog.d.ts +48 -0
  10. package/dist/authoring/catalog.js +117 -0
  11. package/dist/authoring/catalog.js.map +1 -0
  12. package/dist/authoring/floorplan.d.ts +28 -0
  13. package/dist/authoring/floorplan.js +31 -0
  14. package/dist/authoring/floorplan.js.map +1 -0
  15. package/dist/authoring/generate.d.ts +57 -0
  16. package/dist/authoring/generate.js +630 -0
  17. package/dist/authoring/generate.js.map +1 -0
  18. package/dist/authoring/mcp.d.ts +15 -0
  19. package/dist/authoring/mcp.js +52 -0
  20. package/dist/authoring/mcp.js.map +1 -0
  21. package/dist/authoring/new.d.ts +35 -0
  22. package/dist/authoring/new.js +389 -0
  23. package/dist/authoring/new.js.map +1 -0
  24. package/dist/bdef/ast.d.ts +249 -0
  25. package/dist/bdef/ast.js +3 -0
  26. package/dist/bdef/ast.js.map +1 -0
  27. package/dist/bdef/lexer.d.ts +105 -0
  28. package/dist/bdef/lexer.js +148 -0
  29. package/dist/bdef/lexer.js.map +1 -0
  30. package/dist/bdef/parser.d.ts +22 -0
  31. package/dist/bdef/parser.js +1012 -0
  32. package/dist/bdef/parser.js.map +1 -0
  33. package/dist/build.d.ts +26 -0
  34. package/dist/build.js +62 -0
  35. package/dist/build.js.map +1 -0
  36. package/dist/cds/adapter.d.ts +91 -0
  37. package/dist/cds/adapter.js +381 -0
  38. package/dist/cds/adapter.js.map +1 -0
  39. package/dist/cds/expression-ast.d.ts +65 -0
  40. package/dist/cds/expression-ast.js +330 -0
  41. package/dist/cds/expression-ast.js.map +1 -0
  42. package/dist/cli.d.ts +9 -0
  43. package/dist/cli.js +485 -0
  44. package/dist/cli.js.map +1 -0
  45. package/dist/dcl/parser.d.ts +59 -0
  46. package/dist/dcl/parser.js +338 -0
  47. package/dist/dcl/parser.js.map +1 -0
  48. package/dist/ddic/catalog.d.ts +17 -0
  49. package/dist/ddic/catalog.js +211 -0
  50. package/dist/ddic/catalog.js.map +1 -0
  51. package/dist/ddic/cds-types.d.ts +47 -0
  52. package/dist/ddic/cds-types.js +131 -0
  53. package/dist/ddic/cds-types.js.map +1 -0
  54. package/dist/ddic/table-source.d.ts +70 -0
  55. package/dist/ddic/table-source.js +500 -0
  56. package/dist/ddic/table-source.js.map +1 -0
  57. package/dist/ddic/xml.d.ts +65 -0
  58. package/dist/ddic/xml.js +201 -0
  59. package/dist/ddic/xml.js.map +1 -0
  60. package/dist/dev.d.ts +128 -0
  61. package/dist/dev.js +434 -0
  62. package/dist/dev.js.map +1 -0
  63. package/dist/diagnostics.d.ts +33 -0
  64. package/dist/diagnostics.js +53 -0
  65. package/dist/diagnostics.js.map +1 -0
  66. package/dist/gen/abap/derived-types.d.ts +26 -0
  67. package/dist/gen/abap/derived-types.js +323 -0
  68. package/dist/gen/abap/derived-types.js.map +1 -0
  69. package/dist/gen/abap/eml.d.ts +118 -0
  70. package/dist/gen/abap/eml.js +362 -0
  71. package/dist/gen/abap/eml.js.map +1 -0
  72. package/dist/gen/abap/enums.d.ts +13 -0
  73. package/dist/gen/abap/enums.js +74 -0
  74. package/dist/gen/abap/enums.js.map +1 -0
  75. package/dist/gen/abap/framework-http.d.ts +14 -0
  76. package/dist/gen/abap/framework-http.js +1049 -0
  77. package/dist/gen/abap/framework-http.js.map +1 -0
  78. package/dist/gen/abap/framework-query.d.ts +14 -0
  79. package/dist/gen/abap/framework-query.js +225 -0
  80. package/dist/gen/abap/framework-query.js.map +1 -0
  81. package/dist/gen/abap/framework-utils.d.ts +29 -0
  82. package/dist/gen/abap/framework-utils.js +3707 -0
  83. package/dist/gen/abap/framework-utils.js.map +1 -0
  84. package/dist/gen/abap/framework.d.ts +12 -0
  85. package/dist/gen/abap/framework.js +480 -0
  86. package/dist/gen/abap/framework.js.map +1 -0
  87. package/dist/gen/abap/generate.d.ts +40 -0
  88. package/dist/gen/abap/generate.js +238 -0
  89. package/dist/gen/abap/generate.js.map +1 -0
  90. package/dist/gen/abap/rewrite.d.ts +82 -0
  91. package/dist/gen/abap/rewrite.js +957 -0
  92. package/dist/gen/abap/rewrite.js.map +1 -0
  93. package/dist/gen/abap/shadow.d.ts +25 -0
  94. package/dist/gen/abap/shadow.js +175 -0
  95. package/dist/gen/abap/shadow.js.map +1 -0
  96. package/dist/gen/abap/tokens.d.ts +33 -0
  97. package/dist/gen/abap/tokens.js +87 -0
  98. package/dist/gen/abap/tokens.js.map +1 -0
  99. package/dist/gen/app/index.d.ts +25 -0
  100. package/dist/gen/app/index.js +322 -0
  101. package/dist/gen/app/index.js.map +1 -0
  102. package/dist/gen/csdl.d.ts +11 -0
  103. package/dist/gen/csdl.js +562 -0
  104. package/dist/gen/csdl.js.map +1 -0
  105. package/dist/gen/deploy.d.ts +12 -0
  106. package/dist/gen/deploy.js +53 -0
  107. package/dist/gen/deploy.js.map +1 -0
  108. package/dist/gen/docs/index.d.ts +35 -0
  109. package/dist/gen/docs/index.js +267 -0
  110. package/dist/gen/docs/index.js.map +1 -0
  111. package/dist/gen/docs/markdown.d.ts +23 -0
  112. package/dist/gen/docs/markdown.js +187 -0
  113. package/dist/gen/docs/markdown.js.map +1 -0
  114. package/dist/gen/docs/site.d.ts +17 -0
  115. package/dist/gen/docs/site.js +106 -0
  116. package/dist/gen/docs/site.js.map +1 -0
  117. package/dist/gen/keycloak.d.ts +21 -0
  118. package/dist/gen/keycloak.js +90 -0
  119. package/dist/gen/keycloak.js.map +1 -0
  120. package/dist/gen/launchpad/index.d.ts +48 -0
  121. package/dist/gen/launchpad/index.js +302 -0
  122. package/dist/gen/launchpad/index.js.map +1 -0
  123. package/dist/gen/launchpad/ui.d.ts +14 -0
  124. package/dist/gen/launchpad/ui.js +350 -0
  125. package/dist/gen/launchpad/ui.js.map +1 -0
  126. package/dist/gen/mcp.d.ts +23 -0
  127. package/dist/gen/mcp.js +244 -0
  128. package/dist/gen/mcp.js.map +1 -0
  129. package/dist/gen/sql-expressions.d.ts +12 -0
  130. package/dist/gen/sql-expressions.js +136 -0
  131. package/dist/gen/sql-expressions.js.map +1 -0
  132. package/dist/gen/sql.d.ts +38 -0
  133. package/dist/gen/sql.js +612 -0
  134. package/dist/gen/sql.js.map +1 -0
  135. package/dist/gen/ui/index.d.ts +7 -0
  136. package/dist/gen/ui/index.js +27 -0
  137. package/dist/gen/ui/index.js.map +1 -0
  138. package/dist/gen/ui/layout.d.ts +230 -0
  139. package/dist/gen/ui/layout.js +511 -0
  140. package/dist/gen/ui/layout.js.map +1 -0
  141. package/dist/gen/ui/static.d.ts +55 -0
  142. package/dist/gen/ui/static.js +2901 -0
  143. package/dist/gen/ui/static.js.map +1 -0
  144. package/dist/gen/ui/views.d.ts +10 -0
  145. package/dist/gen/ui/views.js +511 -0
  146. package/dist/gen/ui/views.js.map +1 -0
  147. package/dist/gen/vendor.d.ts +23 -0
  148. package/dist/gen/vendor.js +68 -0
  149. package/dist/gen/vendor.js.map +1 -0
  150. package/dist/gen/xml.d.ts +9 -0
  151. package/dist/gen/xml.js +42 -0
  152. package/dist/gen/xml.js.map +1 -0
  153. package/dist/index.d.ts +20 -0
  154. package/dist/index.js +20 -0
  155. package/dist/index.js.map +1 -0
  156. package/dist/input/project.d.ts +50 -0
  157. package/dist/input/project.js +128 -0
  158. package/dist/input/project.js.map +1 -0
  159. package/dist/ir/access-controls.d.ts +11 -0
  160. package/dist/ir/access-controls.js +148 -0
  161. package/dist/ir/access-controls.js.map +1 -0
  162. package/dist/ir/authorizations.d.ts +25 -0
  163. package/dist/ir/authorizations.js +178 -0
  164. package/dist/ir/authorizations.js.map +1 -0
  165. package/dist/ir/behaviors.d.ts +16 -0
  166. package/dist/ir/behaviors.js +548 -0
  167. package/dist/ir/behaviors.js.map +1 -0
  168. package/dist/ir/builder.d.ts +20 -0
  169. package/dist/ir/builder.js +505 -0
  170. package/dist/ir/builder.js.map +1 -0
  171. package/dist/ir/config.d.ts +25 -0
  172. package/dist/ir/config.js +130 -0
  173. package/dist/ir/config.js.map +1 -0
  174. package/dist/ir/dictionary.d.ts +54 -0
  175. package/dist/ir/dictionary.js +328 -0
  176. package/dist/ir/dictionary.js.map +1 -0
  177. package/dist/ir/entities.d.ts +58 -0
  178. package/dist/ir/entities.js +676 -0
  179. package/dist/ir/entities.js.map +1 -0
  180. package/dist/ir/expressions.d.ts +33 -0
  181. package/dist/ir/expressions.js +327 -0
  182. package/dist/ir/expressions.js.map +1 -0
  183. package/dist/ir/handlers.d.ts +63 -0
  184. package/dist/ir/handlers.js +398 -0
  185. package/dist/ir/handlers.js.map +1 -0
  186. package/dist/ir/number-ranges.d.ts +24 -0
  187. package/dist/ir/number-ranges.js +74 -0
  188. package/dist/ir/number-ranges.js.map +1 -0
  189. package/dist/ir/seed.d.ts +23 -0
  190. package/dist/ir/seed.js +78 -0
  191. package/dist/ir/seed.js.map +1 -0
  192. package/dist/ir/service.d.ts +21 -0
  193. package/dist/ir/service.js +96 -0
  194. package/dist/ir/service.js.map +1 -0
  195. package/dist/launchpad/config.d.ts +47 -0
  196. package/dist/launchpad/config.js +321 -0
  197. package/dist/launchpad/config.js.map +1 -0
  198. package/dist/launchpad/workspace.d.ts +48 -0
  199. package/dist/launchpad/workspace.js +166 -0
  200. package/dist/launchpad/workspace.js.map +1 -0
  201. package/dist/srvd/parser.d.ts +36 -0
  202. package/dist/srvd/parser.js +193 -0
  203. package/dist/srvd/parser.js.map +1 -0
  204. package/dist/standard/data.d.ts +18 -0
  205. package/dist/standard/data.js +534 -0
  206. package/dist/standard/data.js.map +1 -0
  207. package/dist/standard/index.d.ts +36 -0
  208. package/dist/standard/index.js +507 -0
  209. package/dist/standard/index.js.map +1 -0
  210. package/dist/version.d.ts +2 -0
  211. package/dist/version.js +4 -0
  212. package/dist/version.js.map +1 -0
  213. package/docs/AGENTS.md +79 -0
  214. package/docs/ANNOTATIONS.md +76 -0
  215. package/docs/DECISIONS.md +1554 -0
  216. package/docs/DEPLOYMENT.md +113 -0
  217. package/docs/DIAGNOSTICS.md +116 -0
  218. package/docs/FEATURES.md +287 -0
  219. package/docs/GUIDE.md +560 -0
  220. package/docs/KNOWN_GAPS.md +216 -0
  221. package/docs/MCP.md +84 -0
  222. package/docs/PLAN.md +690 -0
  223. package/docs/README.md +148 -0
  224. package/docs/REMOTE_APIS.md +121 -0
  225. package/docs/ROADMAP.md +35 -0
  226. package/docs/UTILITIES.md +95 -0
  227. package/package.json +49 -3
@@ -0,0 +1 @@
1
+ {"version":3,"file":"seed.js","sourceRoot":"","sources":["../../src/ir/seed.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ /** Service definition (SRVD) and binding (SRVB) → IR service. */
2
+ import { type ServiceModel } from "@open-rap/model";
3
+ import type { Diagnostics } from "../diagnostics.js";
4
+ import { type Project, type SourceFile } from "../input/project.js";
5
+ import { type SrvdAst } from "../srvd/parser.js";
6
+ export interface ServiceOptions {
7
+ /** Service definition to build; required when the sources contain several. */
8
+ service?: string;
9
+ /** Service binding name; default: the SRVB of the service, else <SRVD>_O4. */
10
+ binding?: string;
11
+ /** Service root path; default: the RAP OData V4 path of the binding (decision D6). */
12
+ path?: string;
13
+ /** Binding type: ui or webapi, overriding the BINDING_TYPE_CATEGORY of the SRVB (D60). */
14
+ bindingType?: string;
15
+ }
16
+ export interface ServiceSelection {
17
+ service: ServiceModel;
18
+ ast: SrvdAst;
19
+ file: SourceFile;
20
+ }
21
+ export declare function selectService(project: Project, options: ServiceOptions, diagnostics: Diagnostics): ServiceSelection | undefined;
@@ -0,0 +1,96 @@
1
+ /** Service definition (SRVD) and binding (SRVB) → IR service. */
2
+ import { defaultServicePath, serviceNamespace } from "@open-rap/model";
3
+ import { readSrvbXml } from "../ddic/xml.js";
4
+ import { filesOfType } from "../input/project.js";
5
+ import { parseSrvd } from "../srvd/parser.js";
6
+ export function selectService(project, options, diagnostics) {
7
+ const parsed = [];
8
+ for (const file of filesOfType(project, "SRVD").filter((f) => f.extension === "srvdsrv")) {
9
+ const result = parseSrvd(file.content);
10
+ if (result.ast === undefined) {
11
+ for (const e of result.errors) {
12
+ diagnostics.error("SRVD001", e.message, { file: file.path, line: e.line, column: e.column });
13
+ }
14
+ continue;
15
+ }
16
+ parsed.push({ ast: result.ast, file });
17
+ }
18
+ let chosen;
19
+ if (options.service !== undefined) {
20
+ chosen = parsed.find((p) => p.ast.name.toUpperCase() === options.service?.toUpperCase());
21
+ if (chosen === undefined) {
22
+ diagnostics.error("PRJ002", `service definition ${options.service} not found`);
23
+ return undefined;
24
+ }
25
+ }
26
+ else if (parsed.length === 1) {
27
+ chosen = parsed[0];
28
+ }
29
+ else if (parsed.length === 0) {
30
+ diagnostics.error("PRJ001", "no service definition (SRVD) in the sources");
31
+ return undefined;
32
+ }
33
+ else {
34
+ // the service definitions of service consumption models (SCM) have no binding: the one
35
+ // with a service binding is the service of the application
36
+ const bound = parsed.filter((p) => bindingsOf(project, p.ast.name).length > 0);
37
+ if (bound.length !== 1 || bound[0] === undefined) {
38
+ diagnostics.error("PRJ001", `several service definitions, choose one with --service: ${parsed.map((p) => p.ast.name).join(", ")}`);
39
+ return undefined;
40
+ }
41
+ chosen = bound[0];
42
+ const others = parsed.filter((p) => p !== chosen).map((p) => p.ast.name);
43
+ diagnostics.info("SRVD007", `several service definitions: ${chosen.ast.name} has a service binding and is built (not built: ${others.join(", ")})`, { file: chosen.file.path, line: chosen.ast.line });
44
+ }
45
+ if (chosen === undefined) {
46
+ return undefined;
47
+ }
48
+ const name = chosen.ast.name.toUpperCase();
49
+ const bindings = bindingsOf(project, name);
50
+ const binding = bindings[0];
51
+ if (bindings.length > 1 && options.binding === undefined) {
52
+ diagnostics.warning("SRVD002", `several service bindings for ${name}, using ${binding?.file.name ?? ""}`);
53
+ }
54
+ if (binding !== undefined && binding.xml.bindingVersion !== undefined && binding.xml.bindingVersion.toUpperCase() !== "V4") {
55
+ diagnostics.warning("SRVD003", `${binding.file.name} is an OData ${binding.xml.bindingVersion} binding; the generated service is OData V4`, { file: binding.file.path, line: 1 });
56
+ }
57
+ const bindingName = (options.binding ?? binding?.xml.name ?? binding?.file.name ?? `${name}_O4`).toUpperCase();
58
+ const version = binding?.xml.version ?? "0001";
59
+ const service = {
60
+ name,
61
+ binding: bindingName,
62
+ version,
63
+ namespace: serviceNamespace(name, version),
64
+ path: normalizePath(options.path ?? defaultServicePath(bindingName, name, version)),
65
+ entitySets: chosen.ast.exposes.map((e) => ({ name: e.alias ?? e.entity, entity: e.entity })),
66
+ annotations: chosen.ast.annotations,
67
+ };
68
+ // OData V4 - Web API (D60): no UI information in the service
69
+ const bindingType = options.bindingType?.toLowerCase();
70
+ if (bindingType !== undefined && bindingType !== "ui" && bindingType !== "webapi") {
71
+ diagnostics.error("SRVD008", `--binding-type ${options.bindingType ?? ""}: ui or webapi`);
72
+ }
73
+ else if (bindingType === "webapi" || (bindingType === undefined && binding?.xml.bindingCategory === "1")) {
74
+ service.webApi = true;
75
+ }
76
+ const names = new Set();
77
+ for (const set of service.entitySets) {
78
+ if (names.has(set.name.toUpperCase())) {
79
+ diagnostics.error("SRVD004", `entity set ${set.name} is exposed twice`, { file: chosen.file.path, line: chosen.ast.line });
80
+ }
81
+ names.add(set.name.toUpperCase());
82
+ }
83
+ return { service, ast: chosen.ast, file: chosen.file };
84
+ }
85
+ /** The service bindings (SRVB) of a service definition. */
86
+ function bindingsOf(project, service) {
87
+ return filesOfType(project, "SRVB")
88
+ .filter((f) => f.extension === "xml")
89
+ .map((f) => ({ file: f, xml: readSrvbXml(f.content) }))
90
+ .filter((b) => (b.xml.serviceDefinition ?? "").toUpperCase() === service.toUpperCase());
91
+ }
92
+ function normalizePath(path) {
93
+ const withLeading = path.startsWith("/") ? path : `/${path}`;
94
+ return withLeading.endsWith("/") ? withLeading : `${withLeading}/`;
95
+ }
96
+ //# sourceMappingURL=service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service.js","sourceRoot":"","sources":["../../src/ir/service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,47 @@
1
+ /**
2
+ * `launchpad.json`, the content of a launchpad (decision D37), resolved against the applications
3
+ * generated by `rapt build`, or built from their sources by `rapt launchpad` (D69): their service
4
+ * paths, entity sets, roles and claims. The counterpart
5
+ * of the content of the SAP Fiori launchpad (catalogs, groups, tiles, target mappings), in one
6
+ * file versioned with the sources.
7
+ *
8
+ * ```json
9
+ * {
10
+ * "title": "Travel agency",
11
+ * "apps": [
12
+ * { "id": "travel", "build": "../build/travel", "url": "http://localhost:8080/" },
13
+ * { "id": "booking", "source": "booking", "url": "http://localhost:8081/" }
14
+ * ],
15
+ * "groups": [{
16
+ * "title": "Travels",
17
+ * "tiles": [{ "title": "Manage Travels", "app": "travel", "intent": "Travel-manage",
18
+ * "icon": "sap-icon://flight", "count": "Travel", "roles": ["travel_agent"] }]
19
+ * }]
20
+ * }
21
+ * ```
22
+ */
23
+ import { type LaunchpadApp, type LaunchpadModel, type Model } from "@open-rap/model";
24
+ import type { Diagnostics } from "../diagnostics.js";
25
+ /** An application built from its sources by `rapt launchpad` (D69). */
26
+ export interface BuiltApp {
27
+ dir: string;
28
+ model: Model;
29
+ title?: string;
30
+ }
31
+ export interface ResolveOptions {
32
+ /** The applications with sources already built, by id. */
33
+ built?: Map<string, BuiltApp>;
34
+ }
35
+ /** What the launchpad knows of a generated application. */
36
+ export interface ResolvedApp extends LaunchpadApp {
37
+ /** The generated folder, when given (or built from the sources). */
38
+ build?: string;
39
+ /** The folder of the sources (D69). */
40
+ source?: string;
41
+ model?: Model;
42
+ }
43
+ export interface LaunchpadResolution {
44
+ model: LaunchpadModel;
45
+ apps: ResolvedApp[];
46
+ }
47
+ export declare function resolveLaunchpad(file: string, diagnostics: Diagnostics, options?: ResolveOptions): LaunchpadResolution | undefined;
@@ -0,0 +1,321 @@
1
+ /**
2
+ * `launchpad.json`, the content of a launchpad (decision D37), resolved against the applications
3
+ * generated by `rapt build`, or built from their sources by `rapt launchpad` (D69): their service
4
+ * paths, entity sets, roles and claims. The counterpart
5
+ * of the content of the SAP Fiori launchpad (catalogs, groups, tiles, target mappings), in one
6
+ * file versioned with the sources.
7
+ *
8
+ * ```json
9
+ * {
10
+ * "title": "Travel agency",
11
+ * "apps": [
12
+ * { "id": "travel", "build": "../build/travel", "url": "http://localhost:8080/" },
13
+ * { "id": "booking", "source": "booking", "url": "http://localhost:8081/" }
14
+ * ],
15
+ * "groups": [{
16
+ * "title": "Travels",
17
+ * "tiles": [{ "title": "Manage Travels", "app": "travel", "intent": "Travel-manage",
18
+ * "icon": "sap-icon://flight", "count": "Travel", "roles": ["travel_agent"] }]
19
+ * }]
20
+ * }
21
+ * ```
22
+ */
23
+ import { existsSync, readFileSync } from "node:fs";
24
+ import path from "node:path";
25
+ import { authorizationClaims, LAUNCHPAD_RESERVED_PATHS } from "@open-rap/model";
26
+ const ID = /^[a-z][a-z0-9-]*$/;
27
+ const INTENT = /^[A-Za-z][A-Za-z0-9_]*-[A-Za-z][A-Za-z0-9_]*$/;
28
+ const text = (value) => (typeof value === "string" && value.trim() !== "" ? value.trim() : undefined);
29
+ const slug = (value) => value.toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-+|-+$/g, "") || "tile";
30
+ /** The title of a generated application: its UI (`sap.app.title`), else its service. */
31
+ function appTitle(dir, model) {
32
+ try {
33
+ const manifest = JSON.parse(readFileSync(path.join(dir, "ui", "manifest.json"), "utf8"));
34
+ const title = manifest["sap.app"]?.title;
35
+ if (typeof title === "string" && title !== "") {
36
+ return title;
37
+ }
38
+ }
39
+ catch {
40
+ // an application without UI
41
+ }
42
+ return model.service.name;
43
+ }
44
+ function resolveApp(source, base, at, diagnostics, built) {
45
+ const id = text(source.id);
46
+ if (id === undefined || !ID.test(id)) {
47
+ diagnostics.error("LPD001", `an application needs an id of lower-case letters, digits and "-" (found ${JSON.stringify(source.id)})`, at);
48
+ return undefined;
49
+ }
50
+ const url = text(source.url);
51
+ if (url === undefined || !/^https?:\/\//.test(url)) {
52
+ diagnostics.error("LPD001", `the application ${id} needs the url where the launchpad reaches it (http://host:port/)`, at);
53
+ return undefined;
54
+ }
55
+ const app = { id, title: text(source.title) ?? id, url: url.endsWith("/") ? url : `${url}/`, servicePaths: [] };
56
+ const build = text(source.build);
57
+ const sources = text(source.source);
58
+ if (source.source !== undefined && sources === undefined) {
59
+ diagnostics.error("LPD009", `the application ${id}: source is the folder of its sources, relative to launchpad.json`, at);
60
+ }
61
+ if (build !== undefined && sources !== undefined) {
62
+ diagnostics.error("LPD009", `the application ${id}: give either source (built by rapt launchpad) or build (a folder of rapt build), not both`, at);
63
+ return undefined;
64
+ }
65
+ const done = sources === undefined ? undefined : built?.get(id);
66
+ if (sources !== undefined) {
67
+ app.source = path.resolve(base, sources);
68
+ }
69
+ if (done !== undefined) {
70
+ app.build = done.dir;
71
+ app.model = done.model;
72
+ app.servicePaths = [done.model.service.path];
73
+ if (text(source.title) === undefined) {
74
+ app.title = done.title ?? done.model.service.name;
75
+ }
76
+ }
77
+ else if (build !== undefined) {
78
+ const dir = path.resolve(base, build);
79
+ const file = path.join(dir, "model", "model.json");
80
+ if (!existsSync(file)) {
81
+ diagnostics.error("LPD003", `the application ${id}: ${build} is not a folder generated by rapt build (no model/model.json)`, at);
82
+ }
83
+ else {
84
+ try {
85
+ const model = JSON.parse(readFileSync(file, "utf8"));
86
+ app.build = dir;
87
+ app.model = model;
88
+ app.servicePaths = [model.service.path];
89
+ if (text(source.title) === undefined) {
90
+ app.title = appTitle(dir, model);
91
+ }
92
+ }
93
+ catch (error) {
94
+ diagnostics.error("LPD003", `the application ${id}: ${file} cannot be read (${error.message})`, at);
95
+ }
96
+ }
97
+ }
98
+ if (source.servicePaths !== undefined) {
99
+ if (!Array.isArray(source.servicePaths) || source.servicePaths.some((p) => typeof p !== "string" || !p.startsWith("/"))) {
100
+ diagnostics.error("LPD005", `the application ${id}: servicePaths is a list of absolute paths (/sap/opu/odata4/…/)`, at);
101
+ }
102
+ else {
103
+ app.servicePaths = [...new Set([...app.servicePaths, ...source.servicePaths.map((p) => (p.endsWith("/") ? p : `${p}/`))])];
104
+ }
105
+ }
106
+ if (app.servicePaths.length === 0) {
107
+ diagnostics.warning("LPD003", sources === undefined
108
+ ? `the application ${id} has neither source, build nor servicePaths: its services are not forwarded, its UI cannot read them through the launchpad`
109
+ : `the application ${id} is not built: rapt launchpad builds it from ${sources}`, at);
110
+ }
111
+ return app;
112
+ }
113
+ /** `count`: an entity set of the service of the application, or `{ "entitySet": …, "filter": … }`. */
114
+ function countPath(tile, app, name, at, diagnostics) {
115
+ if (tile.count === undefined) {
116
+ return undefined;
117
+ }
118
+ const spec = typeof tile.count === "string" ? { entitySet: tile.count } : tile.count;
119
+ const entitySet = text(spec?.entitySet);
120
+ if (entitySet === undefined) {
121
+ diagnostics.error("LPD006", `tile ${name}: count is an entity set, or { "entitySet": …, "filter": … }`, at);
122
+ return undefined;
123
+ }
124
+ if (app === undefined || app.servicePaths.length === 0) {
125
+ diagnostics.error("LPD006", `tile ${name}: a count needs the app of the tile, whose services the launchpad knows`, at);
126
+ return undefined;
127
+ }
128
+ const servicePath = app.servicePaths[0];
129
+ if (app.model !== undefined && !app.model.service.entitySets.some((s) => s.name === entitySet)) {
130
+ diagnostics.error("LPD006", `tile ${name}: the service of ${app.id} has no entity set ${entitySet} (${app.model.service.entitySets.map((s) => s.name).join(", ")})`, at);
131
+ return undefined;
132
+ }
133
+ const filter = text(spec?.filter);
134
+ return `${servicePath}${entitySet}/$count${filter === undefined ? "" : `?$filter=${encodeURIComponent(filter)}`}`;
135
+ }
136
+ export function resolveLaunchpad(file, diagnostics, options = {}) {
137
+ const at = { file };
138
+ let source;
139
+ try {
140
+ source = JSON.parse(readFileSync(file, "utf8"));
141
+ }
142
+ catch (error) {
143
+ diagnostics.error("LPD001", `launchpad.json cannot be read: ${error.message}`, at);
144
+ return undefined;
145
+ }
146
+ if (source === null || typeof source !== "object" || (!Array.isArray(source.groups) && !Array.isArray(source.spaces))) {
147
+ diagnostics.error("LPD001", "launchpad.json needs groups (a list of { title, tiles }) or spaces (a list of { title, pages })", at);
148
+ return undefined;
149
+ }
150
+ const base = path.dirname(path.resolve(file));
151
+ const apps = [];
152
+ for (const entry of Array.isArray(source.apps) ? source.apps : []) {
153
+ const app = resolveApp(entry ?? {}, base, at, diagnostics, options.built);
154
+ if (app === undefined) {
155
+ continue;
156
+ }
157
+ if (apps.some((a) => a.id === app.id)) {
158
+ diagnostics.error("LPD001", `two applications have the id ${app.id}`, at);
159
+ continue;
160
+ }
161
+ for (const servicePath of app.servicePaths) {
162
+ const reserved = LAUNCHPAD_RESERVED_PATHS.find((p) => servicePath === `${p}/` || servicePath.startsWith(`${p}/`));
163
+ if (reserved !== undefined) {
164
+ diagnostics.error("LPD005", `the application ${app.id}: the service path ${servicePath} is below ${reserved}, a path of the launchpad`, at);
165
+ }
166
+ const other = apps.find((a) => a.servicePaths.some((p) => p.startsWith(servicePath) || servicePath.startsWith(p)));
167
+ if (other !== undefined) {
168
+ diagnostics.error("LPD005", `the applications ${other.id} and ${app.id} both serve ${servicePath}: the launchpad cannot tell their requests apart`, at);
169
+ }
170
+ }
171
+ apps.push(app);
172
+ }
173
+ // the roles of the applications (rapt/authorizations.json), for the realm and the checks of the tiles
174
+ const roles = new Map();
175
+ for (const app of apps) {
176
+ for (const role of app.model?.authorizations?.roles ?? []) {
177
+ if (!roles.has(role.name)) {
178
+ roles.set(role.name, role.description === undefined ? { name: role.name } : { name: role.name, description: role.description });
179
+ }
180
+ }
181
+ }
182
+ const knownRoles = new Set([...roles.keys(), "rapt_user"]);
183
+ // without roles in the applications, the roles of the tiles are those of the identity provider only
184
+ const checkRoles = roles.size > 0;
185
+ const ids = new Set();
186
+ const resolveGroup = (group, where) => {
187
+ const title = text(group?.title);
188
+ if (group === undefined || title === undefined || !Array.isArray(group.tiles)) {
189
+ diagnostics.error("LPD001", `${where} needs a title and tiles (a list)`, at);
190
+ return undefined;
191
+ }
192
+ const tiles = [];
193
+ for (const [t, tile] of group.tiles.entries()) {
194
+ const appId = text(tile?.app);
195
+ const app = appId === undefined ? undefined : apps.find((a) => a.id === appId);
196
+ const name = text(tile?.title) ?? text(tile?.intent) ?? `${t + 1} of ${title}`;
197
+ if (appId !== undefined && app === undefined) {
198
+ diagnostics.error("LPD002", `tile ${name}: no application ${appId} in apps`, at);
199
+ continue;
200
+ }
201
+ const url = text(tile.url);
202
+ if ((app === undefined) === (url === undefined)) {
203
+ diagnostics.error("LPD002", `tile ${name}: give either app (an application of the launchpad) or url`, at);
204
+ continue;
205
+ }
206
+ const tileTitle = text(tile.title) ?? app?.title;
207
+ if (tileTitle === undefined) {
208
+ diagnostics.error("LPD001", `tile ${t + 1} of ${title} needs a title`, at);
209
+ continue;
210
+ }
211
+ const intent = text(tile.intent);
212
+ if (tile.intent !== undefined && (intent === undefined || !INTENT.test(intent))) {
213
+ diagnostics.error("LPD004", `tile ${name}: the intent is SemanticObject-action (found ${JSON.stringify(tile.intent)})`, at);
214
+ continue;
215
+ }
216
+ if (tile.roles !== undefined && (!Array.isArray(tile.roles) || tile.roles.some((r) => typeof r !== "string" || r === ""))) {
217
+ diagnostics.error("LPD001", `tile ${name}: roles is a list of role names`, at);
218
+ continue;
219
+ }
220
+ const tileRoles = tile.roles ?? [];
221
+ for (const role of tileRoles) {
222
+ if (checkRoles && !knownRoles.has(role)) {
223
+ diagnostics.warning("LPD007", `tile ${name}: the role ${role} is in no rapt/authorizations.json of the applications; the identity provider must still give it`, at);
224
+ }
225
+ if (!roles.has(role)) {
226
+ roles.set(role, { name: role });
227
+ }
228
+ }
229
+ let id = slug(text(tile.id) ?? intent ?? tileTitle);
230
+ for (let n = 2; ids.has(id); n++) {
231
+ id = `${slug(text(tile.id) ?? intent ?? tileTitle)}-${n}`;
232
+ }
233
+ ids.add(id);
234
+ const target = app === undefined ? url : `/apps/${app.id}/ui/index.html`;
235
+ const resolved = { id, title: tileTitle, target, external: !target.startsWith("/"), roles: tileRoles };
236
+ const optional = [
237
+ ["subtitle", tile.subtitle],
238
+ ["info", tile.info],
239
+ ["icon", tile.icon],
240
+ ];
241
+ for (const [key, value] of optional) {
242
+ const v = text(value);
243
+ if (v !== undefined) {
244
+ resolved[key] = v;
245
+ }
246
+ }
247
+ if (intent !== undefined)
248
+ resolved.intent = intent;
249
+ if (app !== undefined)
250
+ resolved.app = app.id;
251
+ const count = countPath(tile, app, name, at, diagnostics);
252
+ if (count !== undefined)
253
+ resolved.count = count;
254
+ tiles.push(resolved);
255
+ }
256
+ return { title, tiles };
257
+ };
258
+ const slugged = new Set();
259
+ const uniqueSlug = (base) => {
260
+ let id = slug(base);
261
+ for (let n = 2; slugged.has(id); n++) {
262
+ id = `${slug(base)}-${n}`;
263
+ }
264
+ slugged.add(id);
265
+ return id;
266
+ };
267
+ const groups = [];
268
+ let spaces;
269
+ if (Array.isArray(source.spaces)) {
270
+ spaces = [];
271
+ for (const [s, space] of source.spaces.entries()) {
272
+ const spaceTitle = text(space?.title);
273
+ if (spaceTitle === undefined || !Array.isArray(space?.pages)) {
274
+ diagnostics.error("LPD008", `space ${s + 1} needs a title and pages (a list of { title, sections })`, at);
275
+ continue;
276
+ }
277
+ if (space.roles !== undefined && (!Array.isArray(space.roles) || space.roles.some((r) => typeof r !== "string" || r === ""))) {
278
+ diagnostics.error("LPD008", `space ${spaceTitle}: roles is a list of role names`, at);
279
+ continue;
280
+ }
281
+ const spaceRoles = space.roles ?? [];
282
+ for (const role of spaceRoles) {
283
+ if (!roles.has(role))
284
+ roles.set(role, { name: role });
285
+ }
286
+ const pages = [];
287
+ for (const [p, page] of space.pages.entries()) {
288
+ const pageTitle = text(page?.title) ?? spaceTitle;
289
+ if (!Array.isArray(page?.sections)) {
290
+ diagnostics.error("LPD008", `page ${p + 1} of the space ${spaceTitle} needs sections (a list of { title, tiles })`, at);
291
+ continue;
292
+ }
293
+ const sections = page.sections
294
+ .map((section, i) => resolveGroup(section, `section ${i + 1} of the page ${pageTitle}`))
295
+ .filter((g) => g !== undefined);
296
+ groups.push(...sections);
297
+ pages.push({ id: uniqueSlug(text(page.id) ?? `${spaceTitle}-${pageTitle}`), title: pageTitle, sections });
298
+ }
299
+ spaces.push({ id: uniqueSlug(text(space.id) ?? spaceTitle), title: spaceTitle, roles: spaceRoles, pages });
300
+ }
301
+ }
302
+ else {
303
+ for (const [g, group] of source.groups.entries()) {
304
+ const resolved = resolveGroup(group, `group ${g + 1}`);
305
+ if (resolved !== undefined)
306
+ groups.push(resolved);
307
+ }
308
+ }
309
+ const extra = Array.isArray(source.claims) ? source.claims.filter((c) => typeof c === "string" && c !== "") : [];
310
+ const claims = [...new Set([...apps.flatMap((a) => authorizationClaims(a.model?.authorizations)), ...extra])].sort();
311
+ const model = {
312
+ title: text(source.title) ?? "Launchpad",
313
+ apps: apps.map((a) => ({ id: a.id, title: a.title, url: a.url, servicePaths: a.servicePaths })),
314
+ groups,
315
+ ...(spaces === undefined ? {} : { spaces }),
316
+ claims,
317
+ roles: [...roles.values()],
318
+ };
319
+ return { model, apps };
320
+ }
321
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/launchpad/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,48 @@
1
+ /**
2
+ * The launchpad of a workspace (decision D69): one `launchpad.json` titled "Launchpad" next to
3
+ * the projects, to which each application is added when it is created (`rapt new`, `rapt
4
+ * floorplan`, `rapt launchpad add`). An application is referenced by its sources (`source`):
5
+ * `rapt launchpad` builds it with the launchpad.
6
+ */
7
+ export declare const LAUNCHPAD_FILE = "launchpad.json";
8
+ export declare const DEFAULT_LAUNCHPAD_TITLE = "Launchpad";
9
+ /** The group (or section of the first page) the tiles of the registered applications go to. */
10
+ export declare const DEFAULT_SECTION = "Applications";
11
+ export interface LaunchpadLocation {
12
+ file: string;
13
+ exists: boolean;
14
+ }
15
+ export interface RegisterOptions {
16
+ /** The launchpad.json to use, instead of the one of the workspace. */
17
+ launchpad?: string;
18
+ /** The service definition of the application (projects with several). */
19
+ service?: string;
20
+ }
21
+ export interface RegisterResult {
22
+ file: string;
23
+ /** The launchpad.json did not exist and was written. */
24
+ created: boolean;
25
+ /** The application was added; false when it was already there. */
26
+ added: boolean;
27
+ app?: {
28
+ id: string;
29
+ source: string;
30
+ url: string;
31
+ service?: string;
32
+ };
33
+ tile?: Record<string, unknown>;
34
+ error?: string;
35
+ }
36
+ /**
37
+ * The launchpad of a project: the nearest `launchpad.json` in its folder or above (up to a git
38
+ * repository root, never in the home or temporary folders); else where to create it, in the
39
+ * workspace: the parent folder of the project, or the project itself when it is a repository root
40
+ * or when its parent is a system folder.
41
+ */
42
+ export declare function findLaunchpad(projectDir: string): LaunchpadLocation;
43
+ /**
44
+ * Adds an application (its sources) and its tile to the launchpad of the workspace, created with
45
+ * the title "Launchpad" when there is none. Idempotent: an application already there (same
46
+ * sources, or same id without sources) is left as it is, and nothing the user wrote is changed.
47
+ */
48
+ export declare function registerApp(projectDir: string, options?: RegisterOptions): RegisterResult;