@open-rap/compiler 0.0.0-stage → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (227) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +21 -2
  3. package/dist/agent/server.d.ts +35 -0
  4. package/dist/agent/server.js +408 -0
  5. package/dist/agent/server.js.map +1 -0
  6. package/dist/authoring/abapgit.d.ts +38 -0
  7. package/dist/authoring/abapgit.js +242 -0
  8. package/dist/authoring/abapgit.js.map +1 -0
  9. package/dist/authoring/catalog.d.ts +48 -0
  10. package/dist/authoring/catalog.js +117 -0
  11. package/dist/authoring/catalog.js.map +1 -0
  12. package/dist/authoring/floorplan.d.ts +28 -0
  13. package/dist/authoring/floorplan.js +31 -0
  14. package/dist/authoring/floorplan.js.map +1 -0
  15. package/dist/authoring/generate.d.ts +57 -0
  16. package/dist/authoring/generate.js +630 -0
  17. package/dist/authoring/generate.js.map +1 -0
  18. package/dist/authoring/mcp.d.ts +15 -0
  19. package/dist/authoring/mcp.js +52 -0
  20. package/dist/authoring/mcp.js.map +1 -0
  21. package/dist/authoring/new.d.ts +35 -0
  22. package/dist/authoring/new.js +389 -0
  23. package/dist/authoring/new.js.map +1 -0
  24. package/dist/bdef/ast.d.ts +249 -0
  25. package/dist/bdef/ast.js +3 -0
  26. package/dist/bdef/ast.js.map +1 -0
  27. package/dist/bdef/lexer.d.ts +105 -0
  28. package/dist/bdef/lexer.js +148 -0
  29. package/dist/bdef/lexer.js.map +1 -0
  30. package/dist/bdef/parser.d.ts +22 -0
  31. package/dist/bdef/parser.js +1012 -0
  32. package/dist/bdef/parser.js.map +1 -0
  33. package/dist/build.d.ts +26 -0
  34. package/dist/build.js +62 -0
  35. package/dist/build.js.map +1 -0
  36. package/dist/cds/adapter.d.ts +91 -0
  37. package/dist/cds/adapter.js +381 -0
  38. package/dist/cds/adapter.js.map +1 -0
  39. package/dist/cds/expression-ast.d.ts +65 -0
  40. package/dist/cds/expression-ast.js +330 -0
  41. package/dist/cds/expression-ast.js.map +1 -0
  42. package/dist/cli.d.ts +9 -0
  43. package/dist/cli.js +485 -0
  44. package/dist/cli.js.map +1 -0
  45. package/dist/dcl/parser.d.ts +59 -0
  46. package/dist/dcl/parser.js +338 -0
  47. package/dist/dcl/parser.js.map +1 -0
  48. package/dist/ddic/catalog.d.ts +17 -0
  49. package/dist/ddic/catalog.js +211 -0
  50. package/dist/ddic/catalog.js.map +1 -0
  51. package/dist/ddic/cds-types.d.ts +47 -0
  52. package/dist/ddic/cds-types.js +131 -0
  53. package/dist/ddic/cds-types.js.map +1 -0
  54. package/dist/ddic/table-source.d.ts +70 -0
  55. package/dist/ddic/table-source.js +500 -0
  56. package/dist/ddic/table-source.js.map +1 -0
  57. package/dist/ddic/xml.d.ts +65 -0
  58. package/dist/ddic/xml.js +201 -0
  59. package/dist/ddic/xml.js.map +1 -0
  60. package/dist/dev.d.ts +128 -0
  61. package/dist/dev.js +434 -0
  62. package/dist/dev.js.map +1 -0
  63. package/dist/diagnostics.d.ts +33 -0
  64. package/dist/diagnostics.js +53 -0
  65. package/dist/diagnostics.js.map +1 -0
  66. package/dist/gen/abap/derived-types.d.ts +26 -0
  67. package/dist/gen/abap/derived-types.js +323 -0
  68. package/dist/gen/abap/derived-types.js.map +1 -0
  69. package/dist/gen/abap/eml.d.ts +118 -0
  70. package/dist/gen/abap/eml.js +362 -0
  71. package/dist/gen/abap/eml.js.map +1 -0
  72. package/dist/gen/abap/enums.d.ts +13 -0
  73. package/dist/gen/abap/enums.js +74 -0
  74. package/dist/gen/abap/enums.js.map +1 -0
  75. package/dist/gen/abap/framework-http.d.ts +14 -0
  76. package/dist/gen/abap/framework-http.js +1049 -0
  77. package/dist/gen/abap/framework-http.js.map +1 -0
  78. package/dist/gen/abap/framework-query.d.ts +14 -0
  79. package/dist/gen/abap/framework-query.js +225 -0
  80. package/dist/gen/abap/framework-query.js.map +1 -0
  81. package/dist/gen/abap/framework-utils.d.ts +29 -0
  82. package/dist/gen/abap/framework-utils.js +3707 -0
  83. package/dist/gen/abap/framework-utils.js.map +1 -0
  84. package/dist/gen/abap/framework.d.ts +12 -0
  85. package/dist/gen/abap/framework.js +480 -0
  86. package/dist/gen/abap/framework.js.map +1 -0
  87. package/dist/gen/abap/generate.d.ts +40 -0
  88. package/dist/gen/abap/generate.js +238 -0
  89. package/dist/gen/abap/generate.js.map +1 -0
  90. package/dist/gen/abap/rewrite.d.ts +82 -0
  91. package/dist/gen/abap/rewrite.js +957 -0
  92. package/dist/gen/abap/rewrite.js.map +1 -0
  93. package/dist/gen/abap/shadow.d.ts +25 -0
  94. package/dist/gen/abap/shadow.js +175 -0
  95. package/dist/gen/abap/shadow.js.map +1 -0
  96. package/dist/gen/abap/tokens.d.ts +33 -0
  97. package/dist/gen/abap/tokens.js +87 -0
  98. package/dist/gen/abap/tokens.js.map +1 -0
  99. package/dist/gen/app/index.d.ts +25 -0
  100. package/dist/gen/app/index.js +322 -0
  101. package/dist/gen/app/index.js.map +1 -0
  102. package/dist/gen/csdl.d.ts +11 -0
  103. package/dist/gen/csdl.js +562 -0
  104. package/dist/gen/csdl.js.map +1 -0
  105. package/dist/gen/deploy.d.ts +12 -0
  106. package/dist/gen/deploy.js +53 -0
  107. package/dist/gen/deploy.js.map +1 -0
  108. package/dist/gen/docs/index.d.ts +35 -0
  109. package/dist/gen/docs/index.js +267 -0
  110. package/dist/gen/docs/index.js.map +1 -0
  111. package/dist/gen/docs/markdown.d.ts +23 -0
  112. package/dist/gen/docs/markdown.js +187 -0
  113. package/dist/gen/docs/markdown.js.map +1 -0
  114. package/dist/gen/docs/site.d.ts +17 -0
  115. package/dist/gen/docs/site.js +106 -0
  116. package/dist/gen/docs/site.js.map +1 -0
  117. package/dist/gen/keycloak.d.ts +21 -0
  118. package/dist/gen/keycloak.js +90 -0
  119. package/dist/gen/keycloak.js.map +1 -0
  120. package/dist/gen/launchpad/index.d.ts +48 -0
  121. package/dist/gen/launchpad/index.js +302 -0
  122. package/dist/gen/launchpad/index.js.map +1 -0
  123. package/dist/gen/launchpad/ui.d.ts +14 -0
  124. package/dist/gen/launchpad/ui.js +350 -0
  125. package/dist/gen/launchpad/ui.js.map +1 -0
  126. package/dist/gen/mcp.d.ts +23 -0
  127. package/dist/gen/mcp.js +244 -0
  128. package/dist/gen/mcp.js.map +1 -0
  129. package/dist/gen/sql-expressions.d.ts +12 -0
  130. package/dist/gen/sql-expressions.js +136 -0
  131. package/dist/gen/sql-expressions.js.map +1 -0
  132. package/dist/gen/sql.d.ts +38 -0
  133. package/dist/gen/sql.js +612 -0
  134. package/dist/gen/sql.js.map +1 -0
  135. package/dist/gen/ui/index.d.ts +7 -0
  136. package/dist/gen/ui/index.js +27 -0
  137. package/dist/gen/ui/index.js.map +1 -0
  138. package/dist/gen/ui/layout.d.ts +230 -0
  139. package/dist/gen/ui/layout.js +511 -0
  140. package/dist/gen/ui/layout.js.map +1 -0
  141. package/dist/gen/ui/static.d.ts +55 -0
  142. package/dist/gen/ui/static.js +2901 -0
  143. package/dist/gen/ui/static.js.map +1 -0
  144. package/dist/gen/ui/views.d.ts +10 -0
  145. package/dist/gen/ui/views.js +511 -0
  146. package/dist/gen/ui/views.js.map +1 -0
  147. package/dist/gen/vendor.d.ts +23 -0
  148. package/dist/gen/vendor.js +68 -0
  149. package/dist/gen/vendor.js.map +1 -0
  150. package/dist/gen/xml.d.ts +9 -0
  151. package/dist/gen/xml.js +42 -0
  152. package/dist/gen/xml.js.map +1 -0
  153. package/dist/index.d.ts +20 -0
  154. package/dist/index.js +20 -0
  155. package/dist/index.js.map +1 -0
  156. package/dist/input/project.d.ts +50 -0
  157. package/dist/input/project.js +128 -0
  158. package/dist/input/project.js.map +1 -0
  159. package/dist/ir/access-controls.d.ts +11 -0
  160. package/dist/ir/access-controls.js +148 -0
  161. package/dist/ir/access-controls.js.map +1 -0
  162. package/dist/ir/authorizations.d.ts +25 -0
  163. package/dist/ir/authorizations.js +178 -0
  164. package/dist/ir/authorizations.js.map +1 -0
  165. package/dist/ir/behaviors.d.ts +16 -0
  166. package/dist/ir/behaviors.js +548 -0
  167. package/dist/ir/behaviors.js.map +1 -0
  168. package/dist/ir/builder.d.ts +20 -0
  169. package/dist/ir/builder.js +505 -0
  170. package/dist/ir/builder.js.map +1 -0
  171. package/dist/ir/config.d.ts +25 -0
  172. package/dist/ir/config.js +130 -0
  173. package/dist/ir/config.js.map +1 -0
  174. package/dist/ir/dictionary.d.ts +54 -0
  175. package/dist/ir/dictionary.js +328 -0
  176. package/dist/ir/dictionary.js.map +1 -0
  177. package/dist/ir/entities.d.ts +58 -0
  178. package/dist/ir/entities.js +676 -0
  179. package/dist/ir/entities.js.map +1 -0
  180. package/dist/ir/expressions.d.ts +33 -0
  181. package/dist/ir/expressions.js +327 -0
  182. package/dist/ir/expressions.js.map +1 -0
  183. package/dist/ir/handlers.d.ts +63 -0
  184. package/dist/ir/handlers.js +398 -0
  185. package/dist/ir/handlers.js.map +1 -0
  186. package/dist/ir/number-ranges.d.ts +24 -0
  187. package/dist/ir/number-ranges.js +74 -0
  188. package/dist/ir/number-ranges.js.map +1 -0
  189. package/dist/ir/seed.d.ts +23 -0
  190. package/dist/ir/seed.js +78 -0
  191. package/dist/ir/seed.js.map +1 -0
  192. package/dist/ir/service.d.ts +21 -0
  193. package/dist/ir/service.js +96 -0
  194. package/dist/ir/service.js.map +1 -0
  195. package/dist/launchpad/config.d.ts +47 -0
  196. package/dist/launchpad/config.js +321 -0
  197. package/dist/launchpad/config.js.map +1 -0
  198. package/dist/launchpad/workspace.d.ts +48 -0
  199. package/dist/launchpad/workspace.js +166 -0
  200. package/dist/launchpad/workspace.js.map +1 -0
  201. package/dist/srvd/parser.d.ts +36 -0
  202. package/dist/srvd/parser.js +193 -0
  203. package/dist/srvd/parser.js.map +1 -0
  204. package/dist/standard/data.d.ts +18 -0
  205. package/dist/standard/data.js +534 -0
  206. package/dist/standard/data.js.map +1 -0
  207. package/dist/standard/index.d.ts +36 -0
  208. package/dist/standard/index.js +507 -0
  209. package/dist/standard/index.js.map +1 -0
  210. package/dist/version.d.ts +2 -0
  211. package/dist/version.js +4 -0
  212. package/dist/version.js.map +1 -0
  213. package/docs/AGENTS.md +79 -0
  214. package/docs/ANNOTATIONS.md +76 -0
  215. package/docs/DECISIONS.md +1526 -0
  216. package/docs/DEPLOYMENT.md +113 -0
  217. package/docs/DIAGNOSTICS.md +116 -0
  218. package/docs/FEATURES.md +287 -0
  219. package/docs/GUIDE.md +560 -0
  220. package/docs/KNOWN_GAPS.md +216 -0
  221. package/docs/MCP.md +84 -0
  222. package/docs/PLAN.md +690 -0
  223. package/docs/README.md +148 -0
  224. package/docs/REMOTE_APIS.md +121 -0
  225. package/docs/ROADMAP.md +35 -0
  226. package/docs/UTILITIES.md +95 -0
  227. package/package.json +49 -3
package/dist/dev.js ADDED
@@ -0,0 +1,434 @@
1
+ /**
2
+ * `rapt dev`: development loop (decision D38). Builds the application from the sources, starts it
3
+ * with an embedded PGlite database, then rebuilds and restarts it on every change of the sources.
4
+ *
5
+ * The application is written without its scaffold (no vendor/, no npm install): its node_modules
6
+ * is a link to the node_modules of the @open-rap/runtime package, which holds the transpiler
7
+ * runtime, PGlite and OpenUI5. The server runs in a child process, because the transpiled ABAP
8
+ * sets global state (the `abap` object) and ES modules cannot be unloaded.
9
+ */
10
+ import { spawn } from "node:child_process";
11
+ import { existsSync, lstatSync, mkdirSync, readdirSync, readFileSync, readlinkSync, rmSync, symlinkSync, unlinkSync, watch, writeFileSync } from "node:fs";
12
+ import path from "node:path";
13
+ import { pathToFileURL } from "node:url";
14
+ import { generateApplication, writeFiles } from "./build.js";
15
+ import { countDiagnostics, formatDiagnostic } from "./diagnostics.js";
16
+ import { packageDir } from "./gen/vendor.js";
17
+ import { loadProject } from "./input/project.js";
18
+ import { generateDocsApp } from "./gen/docs/index.js";
19
+ import { generateLaunchpadUi } from "./gen/launchpad/index.js";
20
+ import { buildUiLayout } from "./gen/ui/index.js";
21
+ /** The text of an event (`rapt dev` without --json); undefined for no output. */
22
+ export function formatDevEvent(event) {
23
+ switch (event.type) {
24
+ case "building":
25
+ return { line: `rapt dev: building ${event.root}`, error: false };
26
+ case "changed":
27
+ return { line: `rapt dev: ${event.file} changed`, error: false };
28
+ case "diagnostics":
29
+ return undefined; // one line per diagnostic, see DevSession.emit
30
+ case "error":
31
+ return { line: `rapt dev: ${event.message}`, error: true };
32
+ case "failed":
33
+ return { line: event.running ? "rapt dev: build failed, the previous build keeps running" : "rapt dev: build failed, waiting for changes", error: false };
34
+ case "database-reset":
35
+ return { line: "rapt dev: the database schema changed, the development database is reset", error: false };
36
+ case "ready":
37
+ return { line: `rapt dev: ready at ${event.url}`, error: false };
38
+ case "server-failed":
39
+ return { line: "rapt dev: server failed, waiting for changes", error: false };
40
+ case "server-stopped":
41
+ return { line: `rapt dev: the server stopped (exit code ${event.code})`, error: true };
42
+ case "log":
43
+ return { line: event.line, error: event.stream === "stderr" };
44
+ }
45
+ }
46
+ /** Folders written by a build; the others (data/, node_modules) are kept between builds. */
47
+ const GENERATED = ["model", "db", "odata", "abap", "ui", "mcp", "home", "docs"];
48
+ const READY = "rapt-dev-ready";
49
+ const SCHEMA_STAMP = ".schema.sql";
50
+ export class DevSession {
51
+ options;
52
+ root;
53
+ outDir;
54
+ port;
55
+ env;
56
+ out;
57
+ err;
58
+ runtimeDir;
59
+ server;
60
+ /** One watcher per folder: the recursive fs.watch of Linux loses files replaced by a rename. */
61
+ watchers = new Map();
62
+ timer;
63
+ running;
64
+ pending = false;
65
+ closed = false;
66
+ constructor(source, options = {}) {
67
+ this.options = options;
68
+ this.root = path.resolve(source);
69
+ this.outDir = path.resolve(options.outDir ?? path.join(this.root, ".rapt", "dev"));
70
+ this.env = options.env ?? process.env;
71
+ this.port = options.port ?? Number(this.env["PORT"] ?? 8080);
72
+ this.out = options.out ?? ((line) => process.stdout.write(`${line}\n`));
73
+ this.err = options.err ?? ((line) => process.stderr.write(`${line}\n`));
74
+ this.runtimeDir = packageDir("@open-rap/runtime", "runtime", options.runtimeDir);
75
+ }
76
+ /** The URL of the development launchpad (the application, the documentation). */
77
+ get uiUrl() {
78
+ return `http://localhost:${this.port}/`;
79
+ }
80
+ /** Builds the application; on success, (re)starts the server. A failed build keeps the running server. */
81
+ async rebuild() {
82
+ this.emit({ type: "building", root: this.root });
83
+ const runtimeNodeModules = this.runtimeDir === undefined ? undefined : runtimeDependencies(this.runtimeDir);
84
+ if (runtimeNodeModules === undefined) {
85
+ this.emit({ type: "error", message: "the @open-rap/runtime package (built, with its node_modules) is needed: run pnpm install and pnpm build, or give --runtime <dir>" });
86
+ return this.failed();
87
+ }
88
+ let result;
89
+ try {
90
+ const { outDir: _out, port: _port, host: _host, env: _env, out: _o, err: _e, events: _ev, ...generate } = this.options;
91
+ result = await generateApplication(loadProject(this.root), { ...generate, scaffold: false });
92
+ }
93
+ catch (e) {
94
+ this.emit({ type: "error", message: e.message });
95
+ return this.failed();
96
+ }
97
+ const { diagnostics, files } = result;
98
+ const sorted = diagnostics.sorted();
99
+ this.emit({ type: "diagnostics", diagnostics: sorted, counts: countDiagnostics(sorted) });
100
+ if (files.length === 0) {
101
+ return this.failed(diagnostics);
102
+ }
103
+ await this.stopServer();
104
+ for (const folder of GENERATED) {
105
+ rmSync(path.join(this.outDir, folder), { recursive: true, force: true });
106
+ }
107
+ writeFiles(this.outDir, files);
108
+ if (result.model !== undefined) {
109
+ // the development launchpad and the documentation app (D49)
110
+ const launchpad = devLaunchpadModel(result.model, files.some((f) => f.path === "mcp/tools.json"));
111
+ writeFiles(path.join(this.outDir, "home"), [...generateLaunchpadUi(launchpad), { path: "launchpad.json", content: `${JSON.stringify(launchpad, null, 2)}\n` }]);
112
+ writeFiles(path.join(this.outDir, "docs"), generateDocsApp());
113
+ }
114
+ this.linkNodeModules(runtimeNodeModules);
115
+ writeFileSync(path.join(this.outDir, "dev-server.mjs"), devServer(pathToFileURL(path.join(this.runtimeDir, "dist", "index.js")).href));
116
+ this.resetDatabaseOnSchemaChange();
117
+ if (!(await this.startServer())) {
118
+ this.emit({ type: "server-failed" });
119
+ return { ok: false, diagnostics };
120
+ }
121
+ this.emit({ type: "ready", url: this.uiUrl });
122
+ return { ok: true, diagnostics };
123
+ }
124
+ /** Rebuilds once, then on every change of the sources until close(). */
125
+ async watch() {
126
+ await this.schedule();
127
+ if (this.closed) {
128
+ return;
129
+ }
130
+ this.watchFolders();
131
+ }
132
+ /** Stops watching and the server. */
133
+ async close() {
134
+ this.closed = true;
135
+ clearTimeout(this.timer);
136
+ for (const watcher of this.watchers.values()) {
137
+ watcher.close();
138
+ }
139
+ this.watchers.clear();
140
+ await this.running;
141
+ await this.stopServer();
142
+ }
143
+ emit(event) {
144
+ if (this.options.events !== undefined) {
145
+ this.options.events(event);
146
+ return;
147
+ }
148
+ if (event.type === "diagnostics") {
149
+ for (const d of event.diagnostics) {
150
+ (d.severity === "error" ? this.err : this.out)(formatDiagnostic(d));
151
+ }
152
+ this.out(`rapt dev: ${event.counts.error} error(s), ${event.counts.warning} warning(s), ${event.counts.info} info`);
153
+ return;
154
+ }
155
+ const text = formatDevEvent(event);
156
+ if (text !== undefined) {
157
+ (text.error ? this.err : this.out)(text.line);
158
+ }
159
+ }
160
+ /** Watches the folders of the project; called again on each change for new or removed folders. */
161
+ watchFolders() {
162
+ const folders = new Set();
163
+ const walk = (dir) => {
164
+ folders.add(dir);
165
+ for (const entry of readdirSync(dir, { withFileTypes: true })) {
166
+ const full = path.join(dir, entry.name);
167
+ if (entry.isDirectory() && this.isSource(path.relative(this.root, full))) {
168
+ walk(full);
169
+ }
170
+ }
171
+ };
172
+ walk(this.root);
173
+ for (const [dir, watcher] of this.watchers) {
174
+ if (!folders.has(dir)) {
175
+ watcher.close();
176
+ this.watchers.delete(dir);
177
+ }
178
+ }
179
+ for (const dir of folders) {
180
+ if (this.watchers.has(dir)) {
181
+ continue;
182
+ }
183
+ try {
184
+ const watcher = watch(dir, (_event, file) => this.changed(path.relative(this.root, path.join(dir, file?.toString() ?? ""))));
185
+ watcher.on("error", () => {
186
+ watcher.close();
187
+ this.watchers.delete(dir);
188
+ });
189
+ this.watchers.set(dir, watcher);
190
+ }
191
+ catch {
192
+ // removed in the meantime
193
+ }
194
+ }
195
+ }
196
+ changed(relative) {
197
+ if (this.closed || relative === "" || !this.isSource(relative)) {
198
+ return;
199
+ }
200
+ clearTimeout(this.timer);
201
+ this.timer = setTimeout(() => {
202
+ this.watchFolders();
203
+ this.emit({ type: "changed", file: relative.split(path.sep).join("/") });
204
+ void this.schedule();
205
+ }, 150);
206
+ }
207
+ /** Runs one rebuild at a time; changes during a rebuild give one more rebuild after it. */
208
+ async schedule() {
209
+ if (this.running !== undefined) {
210
+ this.pending = true;
211
+ return this.running;
212
+ }
213
+ this.running = (async () => {
214
+ do {
215
+ this.pending = false;
216
+ await this.rebuild();
217
+ } while (this.pending && !this.closed);
218
+ })().finally(() => {
219
+ this.running = undefined;
220
+ });
221
+ return this.running;
222
+ }
223
+ /** A file of the project (not the build folder, dot folders or node_modules). */
224
+ isSource(relative) {
225
+ const absolute = path.resolve(this.root, relative);
226
+ if (absolute === this.outDir || absolute.startsWith(this.outDir + path.sep)) {
227
+ return false;
228
+ }
229
+ const segments = relative.split(/[\\/]/);
230
+ return !segments.some((s, i) => s === "node_modules" || (s.startsWith(".") && !(i === 0 && s === ".abapgit.xml")));
231
+ }
232
+ failed(diagnostics) {
233
+ this.emit({ type: "failed", running: this.server !== undefined });
234
+ return diagnostics === undefined ? { ok: false } : { ok: false, diagnostics };
235
+ }
236
+ /** node_modules of the build: a link (a junction on Windows) to the runtime's. */
237
+ linkNodeModules(target) {
238
+ linkFolder(path.join(this.outDir, "node_modules"), target);
239
+ }
240
+ get pgliteDir() {
241
+ const url = this.env["DATABASE_URL"];
242
+ return url !== undefined && url !== "" ? undefined : path.join(this.outDir, "data");
243
+ }
244
+ /** The PGlite database is dropped when the schema changed (development data). */
245
+ resetDatabaseOnSchemaChange() {
246
+ const dir = this.pgliteDir;
247
+ if (dir === undefined) {
248
+ return;
249
+ }
250
+ const schema = readFileSync(path.join(this.outDir, "db", "schema.sql"), "utf8");
251
+ const stamp = path.join(this.outDir, SCHEMA_STAMP);
252
+ const previous = existsSync(stamp) ? readFileSync(stamp, "utf8") : undefined;
253
+ if (existsSync(dir) && previous !== schema) {
254
+ this.emit({ type: "database-reset" });
255
+ rmSync(dir, { recursive: true, force: true });
256
+ }
257
+ writeFileSync(stamp, schema);
258
+ }
259
+ startServer() {
260
+ mkdirSync(this.outDir, { recursive: true });
261
+ const dir = this.pgliteDir;
262
+ const env = {
263
+ ...this.env,
264
+ PORT: String(this.port),
265
+ HOST: this.options.host ?? this.env["HOST"] ?? "127.0.0.1",
266
+ LOG_LEVEL: this.env["LOG_LEVEL"] ?? "warn",
267
+ AUTH_MODE: this.env["AUTH_MODE"] ?? "none",
268
+ // the development OAuth 2.0 server: Web API calls with client credentials or PKCE (D60)
269
+ DEV_OAUTH: this.env["DEV_OAUTH"] ?? "on",
270
+ // seed data of rapt/seed.json, rapt/seed.sql at the first start (D42)
271
+ SEED: this.env["SEED"] ?? "auto",
272
+ ...(dir === undefined ? {} : { PGLITE_DIR: dir }),
273
+ };
274
+ const child = spawn(process.execPath, [path.join(this.outDir, "dev-server.mjs")], { cwd: this.outDir, env, stdio: ["ignore", "pipe", "pipe", "ipc"] });
275
+ this.server = child;
276
+ return new Promise((resolve) => {
277
+ let ready = false;
278
+ const forward = (stream, name) => {
279
+ let buffer = "";
280
+ stream?.setEncoding("utf8");
281
+ stream?.on("data", (chunk) => {
282
+ buffer += chunk;
283
+ const lines = buffer.split("\n");
284
+ buffer = lines.pop() ?? "";
285
+ for (const line of lines) {
286
+ if (!ready && line.startsWith(READY)) {
287
+ ready = true;
288
+ resolve(true);
289
+ }
290
+ else if (line !== "") {
291
+ this.emit({ type: "log", stream: name, line });
292
+ }
293
+ }
294
+ });
295
+ };
296
+ forward(child.stdout, "stdout");
297
+ forward(child.stderr, "stderr");
298
+ child.once("exit", (code) => {
299
+ if (this.server === child) {
300
+ this.server = undefined;
301
+ }
302
+ if (!ready) {
303
+ resolve(false);
304
+ }
305
+ else if (code !== 0 && code !== null) {
306
+ this.emit({ type: "server-stopped", code });
307
+ }
308
+ });
309
+ });
310
+ }
311
+ async stopServer() {
312
+ const child = this.server;
313
+ if (child === undefined || child.exitCode !== null) {
314
+ this.server = undefined;
315
+ return;
316
+ }
317
+ this.server = undefined;
318
+ const exited = new Promise((resolve) => child.once("exit", () => resolve()));
319
+ // a graceful close (PGlite flushes its files), then a kill
320
+ try {
321
+ child.send("close", () => undefined);
322
+ }
323
+ catch {
324
+ child.kill();
325
+ }
326
+ const timeout = setTimeout(() => child.kill(), 5000);
327
+ await exited;
328
+ clearTimeout(timeout);
329
+ }
330
+ }
331
+ /**
332
+ * The development launchpad (D49): the application (with the number of instances of its list),
333
+ * the documentation of Open RAP Runtime, the $metadata of the service and, with rapt/mcp.json, the
334
+ * MCP server.
335
+ */
336
+ export function devLaunchpadModel(model, mcp) {
337
+ const layout = buildUiLayout(model);
338
+ const tile = (t) => ({ external: false, roles: [], ...t });
339
+ // a Web API (D60) has no UI: its service document
340
+ const webApi = model.service.webApi === true;
341
+ const application = tile({
342
+ id: "app",
343
+ title: webApi ? model.service.name : layout.title,
344
+ subtitle: webApi ? "OData V4 - Web API" : model.service.name,
345
+ icon: webApi ? "sap-icon://chain-link" : "sap-icon://product",
346
+ target: webApi ? model.service.path : "/ui/index.html",
347
+ ...(webApi ? { external: true } : {}),
348
+ ...(layout.start === "" ? {} : { count: `${model.service.path}${layout.start}/$count` }),
349
+ });
350
+ const tools = [
351
+ tile({ id: "docs", title: "Documentation", subtitle: "Open RAP Runtime", icon: "sap-icon://learning-assistant", target: "/docs/index.html" }),
352
+ tile({ id: "metadata", title: "Service metadata", subtitle: "OData V4 $metadata", icon: "sap-icon://source-code", target: `${model.service.path}$metadata`, external: true }),
353
+ tile({ id: "oauth", title: "OAuth 2.0 (development)", subtitle: "Client credentials, PKCE", info: "/oauth", icon: "sap-icon://locked", target: "/oauth/.well-known/openid-configuration", external: true }),
354
+ ...(mcp ? [tile({ id: "mcp", title: "MCP server", subtitle: "Tools for AI agents", info: "/mcp", icon: "sap-icon://da", target: "/docs/index.html#/page/mcp" })] : []),
355
+ ];
356
+ const sections = [
357
+ { title: "Application", tiles: [application] },
358
+ { title: "Development tools", tiles: tools },
359
+ ];
360
+ return {
361
+ title: `${layout.title} – rapt dev`,
362
+ apps: [],
363
+ groups: sections,
364
+ spaces: [{ id: "dev", title: "Development", roles: [], pages: [{ id: "dev", title: "Development", sections }] }],
365
+ claims: [],
366
+ roles: [],
367
+ };
368
+ }
369
+ /**
370
+ * The node_modules folder that holds the dependencies of the runtime (@abaplint/runtime, OpenUI5,
371
+ * PGlite), searched like Node.js does: its own (pnpm workspace), then those of the parent folders
372
+ * (npm installation, flat, as in the VS Code extension).
373
+ */
374
+ export function runtimeDependencies(runtimeDir) {
375
+ let dir = path.resolve(runtimeDir);
376
+ for (;;) {
377
+ const candidate = path.basename(dir) === "node_modules" ? dir : path.join(dir, "node_modules");
378
+ if (existsSync(path.join(candidate, "@abaplint", "runtime"))) {
379
+ return candidate;
380
+ }
381
+ const parent = path.dirname(dir);
382
+ if (parent === dir) {
383
+ return undefined;
384
+ }
385
+ dir = parent;
386
+ }
387
+ }
388
+ /**
389
+ * Links `link` to the folder `target` (a junction on Windows), replacing a link to another folder.
390
+ * A real folder at `link` (installed by the user) is kept.
391
+ */
392
+ export function linkFolder(link, target) {
393
+ if (existsSync(link) || isLink(link)) {
394
+ if (!isLink(link)) {
395
+ return;
396
+ }
397
+ if (samePath(path.resolve(path.dirname(link), readlinkSync(link)), target)) {
398
+ return;
399
+ }
400
+ // unlinkSync removes the link itself; rmSync fails on a junction (ERR_FS_EISDIR, Node.js 24)
401
+ unlinkSync(link);
402
+ }
403
+ symlinkSync(target, link, "junction");
404
+ }
405
+ /** Paths are case-insensitive on Windows: `c:\` from VS Code, `C:\` read back from a junction. */
406
+ function samePath(a, b) {
407
+ const [x, y] = [path.resolve(a), path.resolve(b)];
408
+ return process.platform === "win32" ? x.toLowerCase() === y.toLowerCase() : x === y;
409
+ }
410
+ function isLink(file) {
411
+ try {
412
+ return lstatSync(file).isSymbolicLink();
413
+ }
414
+ catch {
415
+ return false;
416
+ }
417
+ }
418
+ /** The server of the development build: the runtime of the repository, closed on a message. */
419
+ function devServer(runtimeUrl) {
420
+ return `// Generated by rapt dev: starts the development build with the runtime of Open RAP Runtime.
421
+ import { fileURLToPath } from "node:url";
422
+ import { start } from ${JSON.stringify(runtimeUrl)};
423
+
424
+ const server = await start({ dir: fileURLToPath(new URL(".", import.meta.url)) });
425
+ const close = () => server.close().then(() => process.exit(0), () => process.exit(1));
426
+ process.on("message", (message) => message === "close" && close());
427
+ process.on("disconnect", close);
428
+ for (const signal of ["SIGINT", "SIGTERM"]) {
429
+ process.once(signal, close);
430
+ }
431
+ console.log(${JSON.stringify(READY)});
432
+ `;
433
+ }
434
+ //# sourceMappingURL=dev.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dev.js","sourceRoot":"","sources":["../src/dev.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ /** Diagnostics reported by the compiler, with their position in the sources. */
2
+ export type Severity = "error" | "warning" | "info";
3
+ export interface Diagnostic {
4
+ severity: Severity;
5
+ /** Stable code, e.g. BDEF001 (see docs/DIAGNOSTICS.md). */
6
+ code: string;
7
+ message: string;
8
+ file?: string;
9
+ /** 1-based. */
10
+ line?: number;
11
+ /** 1-based. */
12
+ column?: number;
13
+ }
14
+ export interface Location {
15
+ file?: string;
16
+ line?: number;
17
+ column?: number;
18
+ }
19
+ export declare class Diagnostics {
20
+ readonly items: Diagnostic[];
21
+ add(severity: Severity, code: string, message: string, location?: Location): void;
22
+ error(code: string, message: string, location?: Location): void;
23
+ warning(code: string, message: string, location?: Location): void;
24
+ info(code: string, message: string, location?: Location): void;
25
+ addAll(other: Diagnostics | readonly Diagnostic[]): void;
26
+ hasErrors(): boolean;
27
+ errors(): Diagnostic[];
28
+ sorted(): Diagnostic[];
29
+ }
30
+ /** `file:line:column: severity CODE message`, the format of `rapt check`. */
31
+ export declare function formatDiagnostic(d: Diagnostic): string;
32
+ /** Number of diagnostics by severity. */
33
+ export declare function countDiagnostics(diagnostics: readonly Diagnostic[]): Record<Severity, number>;
@@ -0,0 +1,53 @@
1
+ /** Diagnostics reported by the compiler, with their position in the sources. */
2
+ export class Diagnostics {
3
+ items = [];
4
+ add(severity, code, message, location) {
5
+ const diagnostic = { severity, code, message };
6
+ if (location?.file !== undefined) {
7
+ diagnostic.file = location.file;
8
+ }
9
+ if (location?.line !== undefined) {
10
+ diagnostic.line = location.line;
11
+ }
12
+ if (location?.column !== undefined) {
13
+ diagnostic.column = location.column;
14
+ }
15
+ this.items.push(diagnostic);
16
+ }
17
+ error(code, message, location) {
18
+ this.add("error", code, message, location);
19
+ }
20
+ warning(code, message, location) {
21
+ this.add("warning", code, message, location);
22
+ }
23
+ info(code, message, location) {
24
+ this.add("info", code, message, location);
25
+ }
26
+ addAll(other) {
27
+ const list = other instanceof Diagnostics ? other.items : other;
28
+ this.items.push(...list);
29
+ }
30
+ hasErrors() {
31
+ return this.items.some((d) => d.severity === "error");
32
+ }
33
+ errors() {
34
+ return this.items.filter((d) => d.severity === "error");
35
+ }
36
+ sorted() {
37
+ return [...this.items].sort((a, b) => (a.file ?? "").localeCompare(b.file ?? "") || (a.line ?? 0) - (b.line ?? 0) || (a.column ?? 0) - (b.column ?? 0));
38
+ }
39
+ }
40
+ /** `file:line:column: severity CODE message`, the format of `rapt check`. */
41
+ export function formatDiagnostic(d) {
42
+ const position = d.file === undefined ? "" : `${d.file}${d.line === undefined ? "" : `:${d.line}`}${d.column === undefined ? "" : `:${d.column}`}: `;
43
+ return `${position}${d.severity} ${d.code} ${d.message}`;
44
+ }
45
+ /** Number of diagnostics by severity. */
46
+ export function countDiagnostics(diagnostics) {
47
+ const counts = { error: 0, warning: 0, info: 0 };
48
+ for (const d of diagnostics) {
49
+ counts[d.severity]++;
50
+ }
51
+ return counts;
52
+ }
53
+ //# sourceMappingURL=diagnostics.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diagnostics.js","sourceRoot":"","sources":["../src/diagnostics.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * BDEF derived types (decision D2): for each managed BDEF, an ABAP interface with the types RAP
3
+ * derives from the behavior (`%tky`, `%control`, tables FOR CREATE/UPDATE/…, responses FAILED,
4
+ * REPORTED, MAPPED…), written with named includes so that `%tky-TravelUUID` and `TravelUUID`
5
+ * both work, as in ABAP.
6
+ */
7
+ import { type AbapType, type BehaviorModel, type EntityBehaviorModel, type Model } from "@open-rap/model";
8
+ /** ABAP type of a dictionary type, with built-in types only. */
9
+ export declare function abapTypeText(t: AbapType): string;
10
+ /** Associations of an entity whose target is in the same BDEF, numbered from 1 (`\_assoc`). */
11
+ export declare function bdefAssociations(model: Model, behavior: BehaviorModel, entity: EntityBehaviorModel): Array<{
12
+ name: string;
13
+ target: EntityBehaviorModel;
14
+ targetIndex: number;
15
+ index: number;
16
+ }>;
17
+ /** Ancestors of an entity, from its parent up to the root. */
18
+ export declare function ancestors(model: Model, behavior: BehaviorModel, entity: EntityBehaviorModel): Array<{
19
+ entity: EntityBehaviorModel;
20
+ index: number;
21
+ }>;
22
+ export interface DerivedTypes {
23
+ interfaceName: string;
24
+ source: string;
25
+ }
26
+ export declare function generateDerivedTypes(model: Model, behavior: BehaviorModel): DerivedTypes;