@open-rap/compiler 0.0.0-stage → 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +21 -2
- package/dist/agent/server.d.ts +35 -0
- package/dist/agent/server.js +408 -0
- package/dist/agent/server.js.map +1 -0
- package/dist/authoring/abapgit.d.ts +38 -0
- package/dist/authoring/abapgit.js +242 -0
- package/dist/authoring/abapgit.js.map +1 -0
- package/dist/authoring/catalog.d.ts +48 -0
- package/dist/authoring/catalog.js +117 -0
- package/dist/authoring/catalog.js.map +1 -0
- package/dist/authoring/floorplan.d.ts +28 -0
- package/dist/authoring/floorplan.js +31 -0
- package/dist/authoring/floorplan.js.map +1 -0
- package/dist/authoring/generate.d.ts +57 -0
- package/dist/authoring/generate.js +630 -0
- package/dist/authoring/generate.js.map +1 -0
- package/dist/authoring/mcp.d.ts +15 -0
- package/dist/authoring/mcp.js +52 -0
- package/dist/authoring/mcp.js.map +1 -0
- package/dist/authoring/new.d.ts +35 -0
- package/dist/authoring/new.js +389 -0
- package/dist/authoring/new.js.map +1 -0
- package/dist/bdef/ast.d.ts +249 -0
- package/dist/bdef/ast.js +3 -0
- package/dist/bdef/ast.js.map +1 -0
- package/dist/bdef/lexer.d.ts +105 -0
- package/dist/bdef/lexer.js +148 -0
- package/dist/bdef/lexer.js.map +1 -0
- package/dist/bdef/parser.d.ts +22 -0
- package/dist/bdef/parser.js +1012 -0
- package/dist/bdef/parser.js.map +1 -0
- package/dist/build.d.ts +26 -0
- package/dist/build.js +62 -0
- package/dist/build.js.map +1 -0
- package/dist/cds/adapter.d.ts +91 -0
- package/dist/cds/adapter.js +381 -0
- package/dist/cds/adapter.js.map +1 -0
- package/dist/cds/expression-ast.d.ts +65 -0
- package/dist/cds/expression-ast.js +330 -0
- package/dist/cds/expression-ast.js.map +1 -0
- package/dist/cli.d.ts +9 -0
- package/dist/cli.js +485 -0
- package/dist/cli.js.map +1 -0
- package/dist/dcl/parser.d.ts +59 -0
- package/dist/dcl/parser.js +338 -0
- package/dist/dcl/parser.js.map +1 -0
- package/dist/ddic/catalog.d.ts +17 -0
- package/dist/ddic/catalog.js +211 -0
- package/dist/ddic/catalog.js.map +1 -0
- package/dist/ddic/cds-types.d.ts +47 -0
- package/dist/ddic/cds-types.js +131 -0
- package/dist/ddic/cds-types.js.map +1 -0
- package/dist/ddic/table-source.d.ts +70 -0
- package/dist/ddic/table-source.js +500 -0
- package/dist/ddic/table-source.js.map +1 -0
- package/dist/ddic/xml.d.ts +65 -0
- package/dist/ddic/xml.js +201 -0
- package/dist/ddic/xml.js.map +1 -0
- package/dist/dev.d.ts +128 -0
- package/dist/dev.js +434 -0
- package/dist/dev.js.map +1 -0
- package/dist/diagnostics.d.ts +33 -0
- package/dist/diagnostics.js +53 -0
- package/dist/diagnostics.js.map +1 -0
- package/dist/gen/abap/derived-types.d.ts +26 -0
- package/dist/gen/abap/derived-types.js +323 -0
- package/dist/gen/abap/derived-types.js.map +1 -0
- package/dist/gen/abap/eml.d.ts +118 -0
- package/dist/gen/abap/eml.js +362 -0
- package/dist/gen/abap/eml.js.map +1 -0
- package/dist/gen/abap/enums.d.ts +13 -0
- package/dist/gen/abap/enums.js +74 -0
- package/dist/gen/abap/enums.js.map +1 -0
- package/dist/gen/abap/framework-http.d.ts +14 -0
- package/dist/gen/abap/framework-http.js +1049 -0
- package/dist/gen/abap/framework-http.js.map +1 -0
- package/dist/gen/abap/framework-query.d.ts +14 -0
- package/dist/gen/abap/framework-query.js +225 -0
- package/dist/gen/abap/framework-query.js.map +1 -0
- package/dist/gen/abap/framework-utils.d.ts +29 -0
- package/dist/gen/abap/framework-utils.js +3707 -0
- package/dist/gen/abap/framework-utils.js.map +1 -0
- package/dist/gen/abap/framework.d.ts +12 -0
- package/dist/gen/abap/framework.js +480 -0
- package/dist/gen/abap/framework.js.map +1 -0
- package/dist/gen/abap/generate.d.ts +40 -0
- package/dist/gen/abap/generate.js +238 -0
- package/dist/gen/abap/generate.js.map +1 -0
- package/dist/gen/abap/rewrite.d.ts +82 -0
- package/dist/gen/abap/rewrite.js +957 -0
- package/dist/gen/abap/rewrite.js.map +1 -0
- package/dist/gen/abap/shadow.d.ts +25 -0
- package/dist/gen/abap/shadow.js +175 -0
- package/dist/gen/abap/shadow.js.map +1 -0
- package/dist/gen/abap/tokens.d.ts +33 -0
- package/dist/gen/abap/tokens.js +87 -0
- package/dist/gen/abap/tokens.js.map +1 -0
- package/dist/gen/app/index.d.ts +25 -0
- package/dist/gen/app/index.js +322 -0
- package/dist/gen/app/index.js.map +1 -0
- package/dist/gen/csdl.d.ts +11 -0
- package/dist/gen/csdl.js +562 -0
- package/dist/gen/csdl.js.map +1 -0
- package/dist/gen/deploy.d.ts +12 -0
- package/dist/gen/deploy.js +53 -0
- package/dist/gen/deploy.js.map +1 -0
- package/dist/gen/docs/index.d.ts +35 -0
- package/dist/gen/docs/index.js +267 -0
- package/dist/gen/docs/index.js.map +1 -0
- package/dist/gen/docs/markdown.d.ts +23 -0
- package/dist/gen/docs/markdown.js +187 -0
- package/dist/gen/docs/markdown.js.map +1 -0
- package/dist/gen/docs/site.d.ts +17 -0
- package/dist/gen/docs/site.js +106 -0
- package/dist/gen/docs/site.js.map +1 -0
- package/dist/gen/keycloak.d.ts +21 -0
- package/dist/gen/keycloak.js +90 -0
- package/dist/gen/keycloak.js.map +1 -0
- package/dist/gen/launchpad/index.d.ts +48 -0
- package/dist/gen/launchpad/index.js +302 -0
- package/dist/gen/launchpad/index.js.map +1 -0
- package/dist/gen/launchpad/ui.d.ts +14 -0
- package/dist/gen/launchpad/ui.js +350 -0
- package/dist/gen/launchpad/ui.js.map +1 -0
- package/dist/gen/mcp.d.ts +23 -0
- package/dist/gen/mcp.js +244 -0
- package/dist/gen/mcp.js.map +1 -0
- package/dist/gen/sql-expressions.d.ts +12 -0
- package/dist/gen/sql-expressions.js +136 -0
- package/dist/gen/sql-expressions.js.map +1 -0
- package/dist/gen/sql.d.ts +38 -0
- package/dist/gen/sql.js +612 -0
- package/dist/gen/sql.js.map +1 -0
- package/dist/gen/ui/index.d.ts +7 -0
- package/dist/gen/ui/index.js +27 -0
- package/dist/gen/ui/index.js.map +1 -0
- package/dist/gen/ui/layout.d.ts +230 -0
- package/dist/gen/ui/layout.js +511 -0
- package/dist/gen/ui/layout.js.map +1 -0
- package/dist/gen/ui/static.d.ts +55 -0
- package/dist/gen/ui/static.js +2901 -0
- package/dist/gen/ui/static.js.map +1 -0
- package/dist/gen/ui/views.d.ts +10 -0
- package/dist/gen/ui/views.js +511 -0
- package/dist/gen/ui/views.js.map +1 -0
- package/dist/gen/vendor.d.ts +23 -0
- package/dist/gen/vendor.js +68 -0
- package/dist/gen/vendor.js.map +1 -0
- package/dist/gen/xml.d.ts +9 -0
- package/dist/gen/xml.js +42 -0
- package/dist/gen/xml.js.map +1 -0
- package/dist/index.d.ts +20 -0
- package/dist/index.js +20 -0
- package/dist/index.js.map +1 -0
- package/dist/input/project.d.ts +50 -0
- package/dist/input/project.js +128 -0
- package/dist/input/project.js.map +1 -0
- package/dist/ir/access-controls.d.ts +11 -0
- package/dist/ir/access-controls.js +148 -0
- package/dist/ir/access-controls.js.map +1 -0
- package/dist/ir/authorizations.d.ts +25 -0
- package/dist/ir/authorizations.js +178 -0
- package/dist/ir/authorizations.js.map +1 -0
- package/dist/ir/behaviors.d.ts +16 -0
- package/dist/ir/behaviors.js +548 -0
- package/dist/ir/behaviors.js.map +1 -0
- package/dist/ir/builder.d.ts +20 -0
- package/dist/ir/builder.js +505 -0
- package/dist/ir/builder.js.map +1 -0
- package/dist/ir/config.d.ts +25 -0
- package/dist/ir/config.js +130 -0
- package/dist/ir/config.js.map +1 -0
- package/dist/ir/dictionary.d.ts +54 -0
- package/dist/ir/dictionary.js +328 -0
- package/dist/ir/dictionary.js.map +1 -0
- package/dist/ir/entities.d.ts +58 -0
- package/dist/ir/entities.js +676 -0
- package/dist/ir/entities.js.map +1 -0
- package/dist/ir/expressions.d.ts +33 -0
- package/dist/ir/expressions.js +327 -0
- package/dist/ir/expressions.js.map +1 -0
- package/dist/ir/handlers.d.ts +63 -0
- package/dist/ir/handlers.js +398 -0
- package/dist/ir/handlers.js.map +1 -0
- package/dist/ir/number-ranges.d.ts +24 -0
- package/dist/ir/number-ranges.js +74 -0
- package/dist/ir/number-ranges.js.map +1 -0
- package/dist/ir/seed.d.ts +23 -0
- package/dist/ir/seed.js +78 -0
- package/dist/ir/seed.js.map +1 -0
- package/dist/ir/service.d.ts +21 -0
- package/dist/ir/service.js +96 -0
- package/dist/ir/service.js.map +1 -0
- package/dist/launchpad/config.d.ts +47 -0
- package/dist/launchpad/config.js +321 -0
- package/dist/launchpad/config.js.map +1 -0
- package/dist/launchpad/workspace.d.ts +48 -0
- package/dist/launchpad/workspace.js +166 -0
- package/dist/launchpad/workspace.js.map +1 -0
- package/dist/srvd/parser.d.ts +36 -0
- package/dist/srvd/parser.js +193 -0
- package/dist/srvd/parser.js.map +1 -0
- package/dist/standard/data.d.ts +18 -0
- package/dist/standard/data.js +534 -0
- package/dist/standard/data.js.map +1 -0
- package/dist/standard/index.d.ts +36 -0
- package/dist/standard/index.js +507 -0
- package/dist/standard/index.js.map +1 -0
- package/dist/version.d.ts +2 -0
- package/dist/version.js +4 -0
- package/dist/version.js.map +1 -0
- package/docs/AGENTS.md +79 -0
- package/docs/ANNOTATIONS.md +76 -0
- package/docs/DECISIONS.md +1554 -0
- package/docs/DEPLOYMENT.md +113 -0
- package/docs/DIAGNOSTICS.md +116 -0
- package/docs/FEATURES.md +287 -0
- package/docs/GUIDE.md +560 -0
- package/docs/KNOWN_GAPS.md +216 -0
- package/docs/MCP.md +84 -0
- package/docs/PLAN.md +690 -0
- package/docs/README.md +148 -0
- package/docs/REMOTE_APIS.md +121 -0
- package/docs/ROADMAP.md +35 -0
- package/docs/UTILITIES.md +95 -0
- package/package.json +49 -3
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The packages of this repository embedded in a generated folder (`vendor/`, decision D15): the
|
|
3
|
+
* application or the launchpad installs them without a private registry.
|
|
4
|
+
*/
|
|
5
|
+
import { existsSync, readdirSync, readFileSync, statSync } from "node:fs";
|
|
6
|
+
import { createRequire } from "node:module";
|
|
7
|
+
import path from "node:path";
|
|
8
|
+
import { fileURLToPath } from "node:url";
|
|
9
|
+
import { shortHash } from "@open-rap/model";
|
|
10
|
+
/** The folder of a package of this repository: installed next to the compiler, or in the monorepo. */
|
|
11
|
+
export function packageDir(name, folder, given) {
|
|
12
|
+
const candidates = [];
|
|
13
|
+
if (given !== undefined) {
|
|
14
|
+
candidates.push(path.resolve(given));
|
|
15
|
+
}
|
|
16
|
+
try {
|
|
17
|
+
let dir = path.dirname(createRequire(import.meta.url).resolve(name));
|
|
18
|
+
while (!existsSync(path.join(dir, "package.json")) && path.dirname(dir) !== dir) {
|
|
19
|
+
dir = path.dirname(dir);
|
|
20
|
+
}
|
|
21
|
+
candidates.push(dir);
|
|
22
|
+
}
|
|
23
|
+
catch {
|
|
24
|
+
// not installed: the monorepo layout
|
|
25
|
+
}
|
|
26
|
+
candidates.push(fileURLToPath(new URL(`../../../${folder}/`, import.meta.url)));
|
|
27
|
+
return candidates.find((dir) => existsSync(path.join(dir, "package.json")) && existsSync(path.join(dir, "dist")));
|
|
28
|
+
}
|
|
29
|
+
function filesBelow(root, dir = root) {
|
|
30
|
+
const result = [];
|
|
31
|
+
for (const entry of readdirSync(dir)) {
|
|
32
|
+
const full = path.join(dir, entry);
|
|
33
|
+
if (statSync(full).isDirectory()) {
|
|
34
|
+
result.push(...filesBelow(root, full));
|
|
35
|
+
}
|
|
36
|
+
else if (!entry.endsWith(".tsbuildinfo")) {
|
|
37
|
+
result.push(path.relative(root, full).split(path.sep).join("/"));
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
return result;
|
|
41
|
+
}
|
|
42
|
+
/** A package of the repository, as files of `vendor/<folder>/`: its dist and a production package.json. */
|
|
43
|
+
export function vendorPackage(dir, folder, rename) {
|
|
44
|
+
const manifest = JSON.parse(readFileSync(path.join(dir, "package.json"), "utf8"));
|
|
45
|
+
const dependencies = {};
|
|
46
|
+
for (const [name, version] of Object.entries(manifest.dependencies ?? {})) {
|
|
47
|
+
dependencies[name] = rename[name] ?? version;
|
|
48
|
+
}
|
|
49
|
+
const dist = filesBelow(path.join(dir, "dist")).map((file) => ({ path: `vendor/${folder}/dist/${file}`, content: readFileSync(path.join(dir, "dist", file), "utf8") }));
|
|
50
|
+
// a version that changes with the content: npm install updates the copy after a new rapt build
|
|
51
|
+
const version = `${manifest.version}-rapt.${shortHash(dist.map((f) => `${f.path}\n${f.content}`).join("\n"))}`;
|
|
52
|
+
const vendored = { name: manifest.name, version, license: manifest.license ?? "MIT", type: manifest.type ?? "module", dependencies };
|
|
53
|
+
if (manifest.main !== undefined)
|
|
54
|
+
vendored.main = manifest.main;
|
|
55
|
+
if (manifest.types !== undefined)
|
|
56
|
+
vendored.types = manifest.types;
|
|
57
|
+
if (manifest.exports !== undefined)
|
|
58
|
+
vendored.exports = manifest.exports;
|
|
59
|
+
if (manifest.engines !== undefined)
|
|
60
|
+
vendored.engines = manifest.engines;
|
|
61
|
+
const files = [{ path: `vendor/${folder}/package.json`, content: `${JSON.stringify(vendored, null, 2)}\n` }, ...dist];
|
|
62
|
+
const license = [path.join(dir, "LICENSE"), path.join(dir, "..", "..", "LICENSE")].find((f) => existsSync(f));
|
|
63
|
+
if (license !== undefined) {
|
|
64
|
+
files.push({ path: `vendor/${folder}/LICENSE`, content: readFileSync(license, "utf8") });
|
|
65
|
+
}
|
|
66
|
+
return files;
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=vendor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vendor.js","sourceRoot":"","sources":["../../src/gen/vendor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/** A minimal XML writer: elements, attributes, text, with escaping and indentation. */
|
|
2
|
+
export interface XmlElement {
|
|
3
|
+
name: string;
|
|
4
|
+
attributes?: Record<string, string | number | boolean | undefined>;
|
|
5
|
+
children?: Array<XmlElement | string | undefined | false>;
|
|
6
|
+
}
|
|
7
|
+
export declare function el(name: string, attributes?: XmlElement["attributes"], ...children: Array<XmlElement | string | undefined | false>): XmlElement;
|
|
8
|
+
export declare function escapeXml(text: string): string;
|
|
9
|
+
export declare function renderXml(root: XmlElement): string;
|
package/dist/gen/xml.js
ADDED
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/** A minimal XML writer: elements, attributes, text, with escaping and indentation. */
|
|
2
|
+
export function el(name, attributes, ...children) {
|
|
3
|
+
const element = { name, children };
|
|
4
|
+
if (attributes !== undefined) {
|
|
5
|
+
element.attributes = attributes;
|
|
6
|
+
}
|
|
7
|
+
return element;
|
|
8
|
+
}
|
|
9
|
+
export function escapeXml(text) {
|
|
10
|
+
return text.replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">").replace(/"/g, """);
|
|
11
|
+
}
|
|
12
|
+
export function renderXml(root) {
|
|
13
|
+
const lines = ['<?xml version="1.0" encoding="utf-8"?>'];
|
|
14
|
+
const render = (element, indent) => {
|
|
15
|
+
const attributes = Object.entries(element.attributes ?? {})
|
|
16
|
+
.filter(([, v]) => v !== undefined)
|
|
17
|
+
.map(([k, v]) => ` ${k}="${escapeXml(String(v))}"`)
|
|
18
|
+
.join("");
|
|
19
|
+
const children = (element.children ?? []).filter((c) => c !== undefined && c !== false);
|
|
20
|
+
if (children.length === 0) {
|
|
21
|
+
lines.push(`${indent}<${element.name}${attributes}/>`);
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
24
|
+
if (children.every((c) => typeof c === "string")) {
|
|
25
|
+
lines.push(`${indent}<${element.name}${attributes}>${children.map((c) => escapeXml(c)).join("")}</${element.name}>`);
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
lines.push(`${indent}<${element.name}${attributes}>`);
|
|
29
|
+
for (const child of children) {
|
|
30
|
+
if (typeof child === "string") {
|
|
31
|
+
lines.push(`${indent} ${escapeXml(child)}`);
|
|
32
|
+
}
|
|
33
|
+
else {
|
|
34
|
+
render(child, `${indent} `);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
lines.push(`${indent}</${element.name}>`);
|
|
38
|
+
};
|
|
39
|
+
render(root, "");
|
|
40
|
+
return `${lines.join("\n")}\n`;
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=xml.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"xml.js","sourceRoot":"","sources":["../../src/gen/xml.ts"],"names":[],"mappings":"AAAA,uFAAuF;AAQvF,MAAM,UAAU,EAAE,CAAC,IAAY,EAAE,UAAqC,EAAE,GAAG,QAAwD;IACjI,MAAM,OAAO,GAAe,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;IAC/C,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;QAC7B,OAAO,CAAC,UAAU,GAAG,UAAU,CAAC;IAClC,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,IAAY;IACpC,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;AACzG,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,IAAgB;IACxC,MAAM,KAAK,GAAa,CAAC,wCAAwC,CAAC,CAAC;IACnE,MAAM,MAAM,GAAG,CAAC,OAAmB,EAAE,MAAc,EAAQ,EAAE;QAC3D,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,UAAU,IAAI,EAAE,CAAC;aACxD,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,SAAS,CAAC;aAClC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;aAClD,IAAI,CAAC,EAAE,CAAC,CAAC;QACZ,MAAM,QAAQ,GAAG,CAAC,OAAO,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAA4B,EAAE,CAAC,CAAC,KAAK,SAAS,IAAI,CAAC,KAAK,KAAK,CAAC,CAAC;QAClH,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC1B,KAAK,CAAC,IAAI,CAAC,GAAG,MAAM,IAAI,OAAO,CAAC,IAAI,GAAG,UAAU,IAAI,CAAC,CAAC;YACvD,OAAO;QACT,CAAC;QACD,IAAI,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,EAAE,CAAC;YACjD,KAAK,CAAC,IAAI,CAAC,GAAG,MAAM,IAAI,OAAO,CAAC,IAAI,GAAG,UAAU,IAAI,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,CAAW,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,OAAO,CAAC,IAAI,GAAG,CAAC,CAAC;YAC/H,OAAO;QACT,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,GAAG,MAAM,IAAI,OAAO,CAAC,IAAI,GAAG,UAAU,GAAG,CAAC,CAAC;QACtD,KAAK,MAAM,KAAK,IAAI,QAAQ,EAAE,CAAC;YAC7B,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;gBAC9B,KAAK,CAAC,IAAI,CAAC,GAAG,MAAM,KAAK,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YAC/C,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,CAAC;YAC/B,CAAC;QACH,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,GAAG,MAAM,KAAK,OAAO,CAAC,IAAI,GAAG,CAAC,CAAC;IAC5C,CAAC,CAAC;IACF,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IACjB,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;AACjC,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export { parseBdef, type BdefParseResult } from "./bdef/parser.js";
|
|
2
|
+
export type * from "./bdef/ast.js";
|
|
3
|
+
export { parseCds } from "./cds/adapter.js";
|
|
4
|
+
export { Diagnostics, formatDiagnostic, type Diagnostic, type Severity } from "./diagnostics.js";
|
|
5
|
+
export { loadProject, type Project, type SourceFile } from "./input/project.js";
|
|
6
|
+
export { buildModel, type BuildOptions, type BuildResult } from "./ir/builder.js";
|
|
7
|
+
export { classifyMethodDefinition } from "./ir/handlers.js";
|
|
8
|
+
export { parseSrvd } from "./srvd/parser.js";
|
|
9
|
+
export { COMPILER_VERSION } from "./version.js";
|
|
10
|
+
export { generateApplication, writeFiles, type GeneratedFile } from "./build.js";
|
|
11
|
+
export { generateCsdl } from "./gen/csdl.js";
|
|
12
|
+
export { generateSql, quoteIdentifier, sqlType } from "./gen/sql.js";
|
|
13
|
+
export { generateUi, buildUiLayout, type UiLayout } from "./gen/ui/index.js";
|
|
14
|
+
export { buildLaunchpad, generateLaunchpad, generateLaunchpadUi, type LaunchpadBuildResult, type LaunchpadOptions, type LaunchpadResult } from "./gen/launchpad/index.js";
|
|
15
|
+
export { resolveLaunchpad, type BuiltApp, type LaunchpadResolution, type ResolvedApp } from "./launchpad/config.js";
|
|
16
|
+
export { DEFAULT_LAUNCHPAD_TITLE, findLaunchpad, registerApp, type RegisterOptions, type RegisterResult } from "./launchpad/workspace.js";
|
|
17
|
+
export { DevSession, type DevOptions, type RebuildResult } from "./dev.js";
|
|
18
|
+
export { buildMcpTools, defaultMcpTools, loadMcpConfig, MCP_FILE, type McpConfig } from "./gen/mcp.js";
|
|
19
|
+
export { writeMcpFile, type McpFileResult } from "./authoring/mcp.js";
|
|
20
|
+
export { generateObject, OBJECT_KINDS, type GenerateObjectOptions, type GenerateObjectResult, type ObjectKind } from "./authoring/generate.js";
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export { parseBdef } from "./bdef/parser.js";
|
|
2
|
+
export { parseCds } from "./cds/adapter.js";
|
|
3
|
+
export { Diagnostics, formatDiagnostic } from "./diagnostics.js";
|
|
4
|
+
export { loadProject } from "./input/project.js";
|
|
5
|
+
export { buildModel } from "./ir/builder.js";
|
|
6
|
+
export { classifyMethodDefinition } from "./ir/handlers.js";
|
|
7
|
+
export { parseSrvd } from "./srvd/parser.js";
|
|
8
|
+
export { COMPILER_VERSION } from "./version.js";
|
|
9
|
+
export { generateApplication, writeFiles } from "./build.js";
|
|
10
|
+
export { generateCsdl } from "./gen/csdl.js";
|
|
11
|
+
export { generateSql, quoteIdentifier, sqlType } from "./gen/sql.js";
|
|
12
|
+
export { generateUi, buildUiLayout } from "./gen/ui/index.js";
|
|
13
|
+
export { buildLaunchpad, generateLaunchpad, generateLaunchpadUi } from "./gen/launchpad/index.js";
|
|
14
|
+
export { resolveLaunchpad } from "./launchpad/config.js";
|
|
15
|
+
export { DEFAULT_LAUNCHPAD_TITLE, findLaunchpad, registerApp } from "./launchpad/workspace.js";
|
|
16
|
+
export { DevSession } from "./dev.js";
|
|
17
|
+
export { buildMcpTools, defaultMcpTools, loadMcpConfig, MCP_FILE } from "./gen/mcp.js";
|
|
18
|
+
export { writeMcpFile } from "./authoring/mcp.js";
|
|
19
|
+
export { generateObject, OBJECT_KINDS } from "./authoring/generate.js";
|
|
20
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAwB,MAAM,kBAAkB,CAAC;AAEnE,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAkC,MAAM,kBAAkB,CAAC;AACjG,OAAO,EAAE,WAAW,EAAiC,MAAM,oBAAoB,CAAC;AAChF,OAAO,EAAE,UAAU,EAAuC,MAAM,iBAAiB,CAAC;AAClF,OAAO,EAAE,wBAAwB,EAAE,MAAM,kBAAkB,CAAC;AAC5D,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EAAE,mBAAmB,EAAE,UAAU,EAAsB,MAAM,YAAY,CAAC;AACjF,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACrE,OAAO,EAAE,UAAU,EAAE,aAAa,EAAiB,MAAM,mBAAmB,CAAC;AAC7E,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,mBAAmB,EAA0E,MAAM,0BAA0B,CAAC;AAC1K,OAAO,EAAE,gBAAgB,EAA6D,MAAM,uBAAuB,CAAC;AACpH,OAAO,EAAE,uBAAuB,EAAE,aAAa,EAAE,WAAW,EAA6C,MAAM,0BAA0B,CAAC;AAC1I,OAAO,EAAE,UAAU,EAAuC,MAAM,UAAU,CAAC;AAC3E,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,aAAa,EAAE,QAAQ,EAAkB,MAAM,cAAc,CAAC;AACvG,OAAO,EAAE,YAAY,EAAsB,MAAM,oBAAoB,CAAC;AACtE,OAAO,EAAE,cAAc,EAAE,YAAY,EAA0E,MAAM,yBAAyB,CAAC"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/** Reads a folder in abapGit format and classifies its files by object. */
|
|
2
|
+
export interface SourceFile {
|
|
3
|
+
/** Path relative to the project root, with forward slashes (used in diagnostics). */
|
|
4
|
+
path: string;
|
|
5
|
+
absolute: string;
|
|
6
|
+
/** Object name, upper case, namespaces decoded: `/DMO/I_TRAVEL`. */
|
|
7
|
+
name: string;
|
|
8
|
+
/** Object type, upper case: TABL, DDLS, BDEF… */
|
|
9
|
+
type: string;
|
|
10
|
+
/** Rest of the file name after the type: `asddls`, `xml`, `abap`, `locals_imp.abap`… */
|
|
11
|
+
extension: string;
|
|
12
|
+
/** The abapGit file name, as abaplint expects it. */
|
|
13
|
+
fileName: string;
|
|
14
|
+
content: string;
|
|
15
|
+
/**
|
|
16
|
+
* The file is generated from another one: the abapGit XML of a table written as source
|
|
17
|
+
* (`.tabl.astabl`). `path` and `absolute` then designate the source.
|
|
18
|
+
*/
|
|
19
|
+
generatedFrom?: "astabl";
|
|
20
|
+
/** Lines of the fields in the source, for the diagnostics of a generated file. */
|
|
21
|
+
fieldLines?: Record<string, number>;
|
|
22
|
+
/**
|
|
23
|
+
* A standard object of SAP (I_Currency…) added because the sources name it (D44): not a file of
|
|
24
|
+
* the project, never written by `rapt abapgit`.
|
|
25
|
+
*/
|
|
26
|
+
standard?: true;
|
|
27
|
+
}
|
|
28
|
+
/** Folder of the standard objects in the paths of the diagnostics. */
|
|
29
|
+
export declare const STANDARD_FOLDER = "<standard>";
|
|
30
|
+
/** Problems found while reading the project (sources of tables). */
|
|
31
|
+
export interface ProjectIssue {
|
|
32
|
+
severity: "error" | "warning";
|
|
33
|
+
code: string;
|
|
34
|
+
message: string;
|
|
35
|
+
file: string;
|
|
36
|
+
line: number;
|
|
37
|
+
column: number;
|
|
38
|
+
}
|
|
39
|
+
export interface Project {
|
|
40
|
+
root: string;
|
|
41
|
+
sourceRoot: string;
|
|
42
|
+
files: SourceFile[];
|
|
43
|
+
issues: ProjectIssue[];
|
|
44
|
+
}
|
|
45
|
+
/** abapGit encodes `/` as `#` and some other characters as %xx in file names. */
|
|
46
|
+
export declare function decodeObjectName(encoded: string): string;
|
|
47
|
+
export declare function loadProject(dir: string): Project;
|
|
48
|
+
export declare function filesOfType(project: Project, type: string): SourceFile[];
|
|
49
|
+
/** The main source file of an object: `.asddls`, `.asbdef`, `.srvdsrv`, `.asddlxs` or `.xml`. */
|
|
50
|
+
export declare function mainFile(project: Project, type: string, name: string): SourceFile | undefined;
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
/** Reads a folder in abapGit format and classifies its files by object. */
|
|
2
|
+
import { existsSync, readdirSync, readFileSync, statSync } from "node:fs";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
import { parseTableSource, tableSourceToXml } from "../ddic/table-source.js";
|
|
5
|
+
import { standardObjectsFor } from "../standard/index.js";
|
|
6
|
+
/** Folder of the standard objects in the paths of the diagnostics. */
|
|
7
|
+
export const STANDARD_FOLDER = "<standard>";
|
|
8
|
+
const ABAPGIT_FILE = /^([^.]+)\.([a-z0-9]{4})(?:\.(.+))?$/i;
|
|
9
|
+
/** abapGit encodes `/` as `#` and some other characters as %xx in file names. */
|
|
10
|
+
export function decodeObjectName(encoded) {
|
|
11
|
+
return decodeURIComponent(encoded.replace(/#/g, "/").replace(/%(?![0-9a-f]{2})/gi, "%25")).toUpperCase();
|
|
12
|
+
}
|
|
13
|
+
function startingFolder(root) {
|
|
14
|
+
const descriptor = path.join(root, ".abapgit.xml");
|
|
15
|
+
if (!existsSync(descriptor)) {
|
|
16
|
+
return root;
|
|
17
|
+
}
|
|
18
|
+
const xml = readFileSync(descriptor, "utf8");
|
|
19
|
+
const folder = /<STARTING_FOLDER>([^<]*)<\/STARTING_FOLDER>/.exec(xml)?.[1] ?? "/src/";
|
|
20
|
+
return path.join(root, folder.replace(/^\/+/, ""));
|
|
21
|
+
}
|
|
22
|
+
function walk(dir, out) {
|
|
23
|
+
for (const entry of readdirSync(dir)) {
|
|
24
|
+
if (entry.startsWith(".") || entry === "node_modules") {
|
|
25
|
+
continue;
|
|
26
|
+
}
|
|
27
|
+
const full = path.join(dir, entry);
|
|
28
|
+
if (statSync(full).isDirectory()) {
|
|
29
|
+
walk(full, out);
|
|
30
|
+
}
|
|
31
|
+
else {
|
|
32
|
+
out.push(full);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
export function loadProject(dir) {
|
|
37
|
+
const root = path.resolve(dir);
|
|
38
|
+
if (!existsSync(root) || !statSync(root).isDirectory()) {
|
|
39
|
+
throw new Error(`${dir} is not a folder`);
|
|
40
|
+
}
|
|
41
|
+
const sourceRoot = startingFolder(root);
|
|
42
|
+
const all = [];
|
|
43
|
+
if (existsSync(sourceRoot)) {
|
|
44
|
+
walk(sourceRoot, all);
|
|
45
|
+
}
|
|
46
|
+
const files = [];
|
|
47
|
+
for (const absolute of all.sort()) {
|
|
48
|
+
const fileName = path.basename(absolute);
|
|
49
|
+
const match = ABAPGIT_FILE.exec(fileName);
|
|
50
|
+
if (match === null) {
|
|
51
|
+
continue;
|
|
52
|
+
}
|
|
53
|
+
files.push({
|
|
54
|
+
path: path.relative(root, absolute).split(path.sep).join("/"),
|
|
55
|
+
absolute,
|
|
56
|
+
name: decodeObjectName(match[1] ?? ""),
|
|
57
|
+
type: (match[2] ?? "").toUpperCase(),
|
|
58
|
+
extension: (match[3] ?? "").toLowerCase(),
|
|
59
|
+
fileName,
|
|
60
|
+
content: readFileSync(absolute, "utf8"),
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
const issues = [];
|
|
64
|
+
return { root, sourceRoot, files: withTableSources(withStandardObjects(root, files), issues), issues };
|
|
65
|
+
}
|
|
66
|
+
/** The standard views of SAP the sources name (I_Currency…) and their tables (D44). */
|
|
67
|
+
function withStandardObjects(root, files) {
|
|
68
|
+
const standard = standardObjectsFor(files);
|
|
69
|
+
return [
|
|
70
|
+
...files,
|
|
71
|
+
...standard.map((object) => {
|
|
72
|
+
const match = ABAPGIT_FILE.exec(object.fileName);
|
|
73
|
+
return {
|
|
74
|
+
path: `${STANDARD_FOLDER}/${object.fileName}`,
|
|
75
|
+
absolute: path.join(root, STANDARD_FOLDER, object.fileName),
|
|
76
|
+
name: object.name,
|
|
77
|
+
type: object.type,
|
|
78
|
+
extension: (match?.[3] ?? "").toLowerCase(),
|
|
79
|
+
fileName: object.fileName,
|
|
80
|
+
content: object.content,
|
|
81
|
+
standard: true,
|
|
82
|
+
};
|
|
83
|
+
}),
|
|
84
|
+
];
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Tables written as source (`name.tabl.astabl`) get their abapGit XML (`name.tabl.xml`) here:
|
|
88
|
+
* the rest of the compiler only reads the XML. The source wins over an XML file present beside it.
|
|
89
|
+
*/
|
|
90
|
+
function withTableSources(files, issues) {
|
|
91
|
+
const sources = files.filter((f) => f.type === "TABL" && f.extension === "astabl");
|
|
92
|
+
if (sources.length === 0) {
|
|
93
|
+
return files;
|
|
94
|
+
}
|
|
95
|
+
const generated = new Map();
|
|
96
|
+
for (const source of sources) {
|
|
97
|
+
const parsed = parseTableSource(source.content);
|
|
98
|
+
for (const issue of parsed.issues) {
|
|
99
|
+
issues.push({ ...issue, code: issue.severity === "error" ? "TABL001" : "TABL002", file: source.path });
|
|
100
|
+
}
|
|
101
|
+
if (parsed.table === undefined) {
|
|
102
|
+
continue;
|
|
103
|
+
}
|
|
104
|
+
if (parsed.table.name !== source.name) {
|
|
105
|
+
issues.push({ severity: "error", code: "TABL001", message: `the file defines ${parsed.table.name}, its name says ${source.name}`, file: source.path, line: 1, column: 1 });
|
|
106
|
+
}
|
|
107
|
+
generated.set(source.name, {
|
|
108
|
+
...source,
|
|
109
|
+
extension: "xml",
|
|
110
|
+
fileName: source.fileName.replace(/\.astabl$/i, ".xml"),
|
|
111
|
+
content: tableSourceToXml(parsed.table),
|
|
112
|
+
generatedFrom: "astabl",
|
|
113
|
+
fieldLines: Object.fromEntries(parsed.table.fields.map((f) => [f.name, f.line])),
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
const result = files.filter((f) => !(f.type === "TABL" && f.extension === "xml" && generated.has(f.name)));
|
|
117
|
+
return [...result, ...generated.values()];
|
|
118
|
+
}
|
|
119
|
+
export function filesOfType(project, type) {
|
|
120
|
+
return project.files.filter((f) => f.type === type);
|
|
121
|
+
}
|
|
122
|
+
/** The main source file of an object: `.asddls`, `.asbdef`, `.srvdsrv`, `.asddlxs` or `.xml`. */
|
|
123
|
+
export function mainFile(project, type, name) {
|
|
124
|
+
const candidates = project.files.filter((f) => f.type === type && f.name === name.toUpperCase());
|
|
125
|
+
const preferred = { DDLS: "asddls", DDLX: "asddlxs", BDEF: "asbdef", SRVD: "srvdsrv", CLAS: "abap", INTF: "abap" }[type];
|
|
126
|
+
return candidates.find((f) => f.extension === preferred) ?? candidates.find((f) => f.extension === "xml") ?? candidates[0];
|
|
127
|
+
}
|
|
128
|
+
//# sourceMappingURL=project.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project.js","sourceRoot":"","sources":["../../src/input/project.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The access controls of the exposed entities (decision D35): the roles of the DCL sources
|
|
3
|
+
* (DCLS objects of abapGit) resolved for each entity set of the service, their conditions
|
|
4
|
+
* written with the elements of the exposed entity. `inheriting conditions from entity B` takes
|
|
5
|
+
* the conditions of B, its elements renamed as the projection exposes them. A construct the
|
|
6
|
+
* application cannot evaluate grants nothing (fail closed) and is reported.
|
|
7
|
+
*/
|
|
8
|
+
import { type AccessControlModel, type AuthorizationsModel, type Model } from "@open-rap/model";
|
|
9
|
+
import type { Diagnostics } from "../diagnostics.js";
|
|
10
|
+
import { type Project } from "../input/project.js";
|
|
11
|
+
export declare function loadAccessControls(project: Project, model: Omit<Model, "accessControls">, authorizations: AuthorizationsModel | undefined, diagnostics: Diagnostics): AccessControlModel[];
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The access controls of the exposed entities (decision D35): the roles of the DCL sources
|
|
3
|
+
* (DCLS objects of abapGit) resolved for each entity set of the service, their conditions
|
|
4
|
+
* written with the elements of the exposed entity. `inheriting conditions from entity B` takes
|
|
5
|
+
* the conditions of B, its elements renamed as the projection exposes them. A construct the
|
|
6
|
+
* application cannot evaluate grants nothing (fail closed) and is reported.
|
|
7
|
+
*/
|
|
8
|
+
import { findEntity, projectedFieldName, same } from "@open-rap/model";
|
|
9
|
+
import { parseDcl } from "../dcl/parser.js";
|
|
10
|
+
import { filesOfType } from "../input/project.js";
|
|
11
|
+
export function loadAccessControls(project, model, authorizations, diagnostics) {
|
|
12
|
+
const grants = [];
|
|
13
|
+
for (const file of filesOfType(project, "DCLS").filter((f) => f.extension === "asdcls")) {
|
|
14
|
+
const result = parseDcl(file.content);
|
|
15
|
+
for (const error of result.errors) {
|
|
16
|
+
diagnostics.error("DCL001", `access control: ${error.message}`, { file: file.path, line: error.line });
|
|
17
|
+
}
|
|
18
|
+
for (const grant of result.role?.grants ?? []) {
|
|
19
|
+
grants.push({ ...grant, role: result.role?.name ?? file.name, file: file.path });
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
if (grants.length === 0) {
|
|
23
|
+
return [];
|
|
24
|
+
}
|
|
25
|
+
const objects = new Map((authorizations?.objects ?? []).map((o) => [o.name, o]));
|
|
26
|
+
const result = [];
|
|
27
|
+
for (const set of model.service.entitySets) {
|
|
28
|
+
const entity = findEntity(model, set.entity);
|
|
29
|
+
if (entity === undefined) {
|
|
30
|
+
continue;
|
|
31
|
+
}
|
|
32
|
+
const own = grants.filter((g) => same(g.entity, entity.name));
|
|
33
|
+
for (const grant of own) {
|
|
34
|
+
const at = { file: grant.file, line: grant.line };
|
|
35
|
+
const condition = grant.condition === undefined ? { kind: "true" } : resolve(grant.condition, entity, entity, grants, model, objects, diagnostics, at, new Set([entity.name.toUpperCase()]));
|
|
36
|
+
const existing = result.find((r) => r.role === grant.role && same(r.entity, entity.name));
|
|
37
|
+
if (existing === undefined) {
|
|
38
|
+
result.push({ role: grant.role, entity: entity.name, conditions: [condition] });
|
|
39
|
+
}
|
|
40
|
+
else {
|
|
41
|
+
existing.conditions.push(condition);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
return result;
|
|
46
|
+
}
|
|
47
|
+
/** A condition of a grant on `source`, written with the elements of the exposed entity `target`. */
|
|
48
|
+
function resolve(condition, source, target, grants, model, objects, diagnostics, at, seen) {
|
|
49
|
+
const element = (name) => {
|
|
50
|
+
const [associationName, path] = name.split(".");
|
|
51
|
+
if (path !== undefined) {
|
|
52
|
+
return pathElement(associationName, path);
|
|
53
|
+
}
|
|
54
|
+
const field = source.fields.find((f) => same(f.name, name));
|
|
55
|
+
if (field === undefined) {
|
|
56
|
+
diagnostics.warning("DCL003", `access control: ${source.name} has no element ${name}; the condition grants no row`, at);
|
|
57
|
+
return undefined;
|
|
58
|
+
}
|
|
59
|
+
if (source === target) {
|
|
60
|
+
return field.name;
|
|
61
|
+
}
|
|
62
|
+
const projected = projectedFieldName(model, target, field.name);
|
|
63
|
+
if (projected === undefined) {
|
|
64
|
+
diagnostics.warning("DCL003", `access control: ${target.name} does not expose ${source.name}.${field.name}, needed by the inherited conditions; they grant no row`, at);
|
|
65
|
+
}
|
|
66
|
+
return projected;
|
|
67
|
+
};
|
|
68
|
+
/** `_Assoc.Element`: a to-one association of the entity whose target is an entity set of the service. */
|
|
69
|
+
const pathElement = (associationName, path) => {
|
|
70
|
+
const association = source.associations.find((a) => same(a.name, associationName));
|
|
71
|
+
const sourceTarget = association === undefined ? undefined : findEntity(model, association.target);
|
|
72
|
+
const field = sourceTarget?.fields.find((f) => same(f.name, path));
|
|
73
|
+
if (association === undefined || sourceTarget === undefined || field === undefined || association.cardinality.max === "*" || association.cardinality.max > 1) {
|
|
74
|
+
diagnostics.warning("DCL003", `access control: ${source.name} has no to-one association ${associationName} with an element ${path}; the condition grants no row`, at);
|
|
75
|
+
return undefined;
|
|
76
|
+
}
|
|
77
|
+
// in the exposed entity: the association projecting this one, and the element as its target exposes it
|
|
78
|
+
const exposed = source === target ? association : target.associations.find((a) => same(a.baseAssociation ?? a.name, association.name) || same(a.name, association.name));
|
|
79
|
+
const exposedTarget = exposed === undefined ? undefined : findEntity(model, exposed.target);
|
|
80
|
+
const exposedField = exposedTarget === undefined ? undefined : source === target ? field.name : projectedFieldName(model, exposedTarget, field.name);
|
|
81
|
+
if (exposed === undefined || exposedTarget === undefined || exposedField === undefined || !model.service.entitySets.some((s) => same(s.entity, exposedTarget.name))) {
|
|
82
|
+
diagnostics.warning("DCL003", `access control: ${target.name} does not expose ${associationName}.${path} through an entity set of the service; the condition grants no row`, at);
|
|
83
|
+
return undefined;
|
|
84
|
+
}
|
|
85
|
+
return `${exposed.name}.${exposedField}`;
|
|
86
|
+
};
|
|
87
|
+
const no = { kind: "false" };
|
|
88
|
+
switch (condition.kind) {
|
|
89
|
+
case "and":
|
|
90
|
+
case "or":
|
|
91
|
+
return { kind: condition.kind, operands: condition.operands.map((o) => resolve(o, source, target, grants, model, objects, diagnostics, at, seen)) };
|
|
92
|
+
case "not":
|
|
93
|
+
return { kind: "not", operand: resolve(condition.operand, source, target, grants, model, objects, diagnostics, at, seen) };
|
|
94
|
+
case "compare": {
|
|
95
|
+
const name = element(condition.element);
|
|
96
|
+
return name === undefined ? no : { kind: "compare", element: name, operator: condition.operator, value: condition.value };
|
|
97
|
+
}
|
|
98
|
+
case "null": {
|
|
99
|
+
const name = element(condition.element);
|
|
100
|
+
return name === undefined ? no : { kind: "null", element: name, negated: condition.negated };
|
|
101
|
+
}
|
|
102
|
+
case "user": {
|
|
103
|
+
const name = element(condition.element);
|
|
104
|
+
return name === undefined ? no : { kind: "user", element: name, orInitial: condition.orInitial };
|
|
105
|
+
}
|
|
106
|
+
case "pfcg": {
|
|
107
|
+
const names = condition.elements.map(element);
|
|
108
|
+
if (names.some((n) => n === undefined)) {
|
|
109
|
+
return no;
|
|
110
|
+
}
|
|
111
|
+
const object = objects.get(condition.object);
|
|
112
|
+
if (object === undefined) {
|
|
113
|
+
diagnostics.warning("DCL004", `access control: aspect pfcg_auth( ${condition.object} ): the authorization object is neither in the sources (SUSO) nor in rapt/authorizations.json; no role grants it`, at);
|
|
114
|
+
}
|
|
115
|
+
else {
|
|
116
|
+
for (const field of [...condition.fields, ...Object.keys(condition.filters)]) {
|
|
117
|
+
if (!object.fields.includes(field)) {
|
|
118
|
+
diagnostics.error("DCL004", `access control: aspect pfcg_auth( ${condition.object} ): the object has no field ${field}`, at);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
return { kind: "pfcg", elements: names, object: condition.object, fields: condition.fields, filters: condition.filters, orInitial: condition.orInitial };
|
|
123
|
+
}
|
|
124
|
+
case "inherit": {
|
|
125
|
+
const base = findEntity(model, condition.entity);
|
|
126
|
+
if (base === undefined) {
|
|
127
|
+
diagnostics.warning("DCL003", `access control: inheriting conditions from entity ${condition.entity}: unknown entity; they grant no row`, at);
|
|
128
|
+
return no;
|
|
129
|
+
}
|
|
130
|
+
if (seen.has(base.name.toUpperCase())) {
|
|
131
|
+
diagnostics.error("DCL001", `access control: the conditions of ${base.name} inherit from themselves`, at);
|
|
132
|
+
return no;
|
|
133
|
+
}
|
|
134
|
+
const inherited = grants.filter((g) => same(g.entity, base.name));
|
|
135
|
+
if (inherited.length === 0) {
|
|
136
|
+
// the base entity has no role: no restriction to inherit (as in ABAP CDS)
|
|
137
|
+
return { kind: "true" };
|
|
138
|
+
}
|
|
139
|
+
const next = new Set([...seen, base.name.toUpperCase()]);
|
|
140
|
+
const operands = inherited.map((g) => (g.condition === undefined ? { kind: "true" } : resolve(g.condition, base, target, grants, model, objects, diagnostics, { file: g.file, line: g.line }, next)));
|
|
141
|
+
return operands.length === 1 ? operands[0] : { kind: "or", operands };
|
|
142
|
+
}
|
|
143
|
+
case "unsupported":
|
|
144
|
+
diagnostics.warning("DCL002", `access control: ${condition.text} is not evaluated by the application; this condition grants no row`, at);
|
|
145
|
+
return no;
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
//# sourceMappingURL=access-controls.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"access-controls.js","sourceRoot":"","sources":["../../src/ir/access-controls.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Authorizations of the application (decision D34): the authorization objects of the sources
|
|
3
|
+
* (SUSO objects of abapGit) and the roles of `rapt/authorizations.json`, next to the abapGit
|
|
4
|
+
* sources — the counterpart of the IAM apps, business catalogs and business roles of the ABAP
|
|
5
|
+
* environment: each role of the identity provider gives authorizations, instances of
|
|
6
|
+
* authorization objects with field values, that AUTHORITY-CHECK and the access controls read.
|
|
7
|
+
*/
|
|
8
|
+
import * as abaplint from "@abaplint/core";
|
|
9
|
+
import type { AuthorizationObjectModel, AuthorizationsModel } from "@open-rap/model";
|
|
10
|
+
import type { Diagnostics } from "../diagnostics.js";
|
|
11
|
+
import { type Project } from "../input/project.js";
|
|
12
|
+
/** The file of the roles, relative to the root of the abapGit project. */
|
|
13
|
+
export declare const AUTHORIZATIONS_FILE = "rapt/authorizations.json";
|
|
14
|
+
/** An authorization object from its abapGit serialization (TOBJ: FIEL1…FIEL0, TACTZ: activities). */
|
|
15
|
+
export declare function readSusoXml(xml: string): AuthorizationObjectModel | undefined;
|
|
16
|
+
/**
|
|
17
|
+
* The authorization objects of the sources and the roles of rapt/authorizations.json, checked
|
|
18
|
+
* against each other; undefined when the project has neither.
|
|
19
|
+
*/
|
|
20
|
+
export declare function loadAuthorizations(project: Project, diagnostics: Diagnostics): AuthorizationsModel | undefined;
|
|
21
|
+
/**
|
|
22
|
+
* The AUTHORITY-CHECK statements of the ABAP code: an authorization object of the sources must
|
|
23
|
+
* have the fields the statement checks (ABP010), and an unknown object is reported (ABP011).
|
|
24
|
+
*/
|
|
25
|
+
export declare function checkAuthorityChecks(registry: abaplint.IRegistry, project: Project, authorizations: AuthorizationsModel | undefined, diagnostics: Diagnostics): void;
|