@open-rap/runtime 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 +14 -2
- package/dist/abap/background.d.ts +14 -0
- package/dist/abap/background.js +130 -0
- package/dist/abap/background.js.map +1 -0
- package/dist/abap/bridge.d.ts +62 -0
- package/dist/abap/bridge.js +402 -0
- package/dist/abap/bridge.js.map +1 -0
- package/dist/abap/convert.d.ts +26 -0
- package/dist/abap/convert.js +197 -0
- package/dist/abap/convert.js.map +1 -0
- package/dist/abap/http.d.ts +34 -0
- package/dist/abap/http.js +133 -0
- package/dist/abap/http.js.map +1 -0
- package/dist/abap/mail.d.ts +10 -0
- package/dist/abap/mail.js +83 -0
- package/dist/abap/mail.js.map +1 -0
- package/dist/abap/odata-client.d.ts +33 -0
- package/dist/abap/odata-client.js +576 -0
- package/dist/abap/odata-client.js.map +1 -0
- package/dist/abap/sql.d.ts +92 -0
- package/dist/abap/sql.js +261 -0
- package/dist/abap/sql.js.map +1 -0
- package/dist/abap/utils.d.ts +41 -0
- package/dist/abap/utils.js +976 -0
- package/dist/abap/utils.js.map +1 -0
- package/dist/app.d.ts +53 -0
- package/dist/app.js +169 -0
- package/dist/app.js.map +1 -0
- package/dist/auth/auth.d.ts +68 -0
- package/dist/auth/auth.js +140 -0
- package/dist/auth/auth.js.map +1 -0
- package/dist/auth/authorizations.d.ts +39 -0
- package/dist/auth/authorizations.js +103 -0
- package/dist/auth/authorizations.js.map +1 -0
- package/dist/auth/business-users.d.ts +15 -0
- package/dist/auth/business-users.js +36 -0
- package/dist/auth/business-users.js.map +1 -0
- package/dist/auth/dev-oauth.d.ts +38 -0
- package/dist/auth/dev-oauth.js +156 -0
- package/dist/auth/dev-oauth.js.map +1 -0
- package/dist/auth/environment.d.ts +7 -0
- package/dist/auth/environment.js +57 -0
- package/dist/auth/environment.js.map +1 -0
- package/dist/auth/session.d.ts +45 -0
- package/dist/auth/session.js +257 -0
- package/dist/auth/session.js.map +1 -0
- package/dist/auth/user.d.ts +21 -0
- package/dist/auth/user.js +12 -0
- package/dist/auth/user.js.map +1 -0
- package/dist/db/database.d.ts +30 -0
- package/dist/db/database.js +131 -0
- package/dist/db/database.js.map +1 -0
- package/dist/db/seed.d.ts +9 -0
- package/dist/db/seed.js +63 -0
- package/dist/db/seed.js.map +1 -0
- package/dist/index.d.ts +20 -0
- package/dist/index.js +21 -0
- package/dist/index.js.map +1 -0
- package/dist/launchpad/dev.d.ts +14 -0
- package/dist/launchpad/dev.js +48 -0
- package/dist/launchpad/dev.js.map +1 -0
- package/dist/launchpad/proxy.d.ts +30 -0
- package/dist/launchpad/proxy.js +98 -0
- package/dist/launchpad/proxy.js.map +1 -0
- package/dist/launchpad/server.d.ts +77 -0
- package/dist/launchpad/server.js +177 -0
- package/dist/launchpad/server.js.map +1 -0
- package/dist/mcp/server.d.ts +22 -0
- package/dist/mcp/server.js +222 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/odata/access.d.ts +31 -0
- package/dist/odata/access.js +142 -0
- package/dist/odata/access.js.map +1 -0
- package/dist/odata/batch.d.ts +36 -0
- package/dist/odata/batch.js +147 -0
- package/dist/odata/batch.js.map +1 -0
- package/dist/odata/csrf.d.ts +13 -0
- package/dist/odata/csrf.js +27 -0
- package/dist/odata/csrf.js.map +1 -0
- package/dist/odata/custom.d.ts +90 -0
- package/dist/odata/custom.js +373 -0
- package/dist/odata/custom.js.map +1 -0
- package/dist/odata/draft.d.ts +78 -0
- package/dist/odata/draft.js +590 -0
- package/dist/odata/draft.js.map +1 -0
- package/dist/odata/errors.d.ts +27 -0
- package/dist/odata/errors.js +41 -0
- package/dist/odata/errors.js.map +1 -0
- package/dist/odata/handler.d.ts +90 -0
- package/dist/odata/handler.js +312 -0
- package/dist/odata/handler.js.map +1 -0
- package/dist/odata/json.d.ts +23 -0
- package/dist/odata/json.js +85 -0
- package/dist/odata/json.js.map +1 -0
- package/dist/odata/read.d.ts +90 -0
- package/dist/odata/read.js +686 -0
- package/dist/odata/read.js.map +1 -0
- package/dist/odata/service.d.ts +45 -0
- package/dist/odata/service.js +145 -0
- package/dist/odata/service.js.map +1 -0
- package/dist/odata/uri/ast.d.ts +103 -0
- package/dist/odata/uri/ast.js +3 -0
- package/dist/odata/uri/ast.js.map +1 -0
- package/dist/odata/uri/parser.d.ts +26 -0
- package/dist/odata/uri/parser.js +697 -0
- package/dist/odata/uri/parser.js.map +1 -0
- package/dist/odata/write.d.ts +127 -0
- package/dist/odata/write.js +799 -0
- package/dist/odata/write.js.map +1 -0
- package/dist/platform.d.ts +14 -0
- package/dist/platform.js +66 -0
- package/dist/platform.js.map +1 -0
- package/dist/rap/bo.d.ts +76 -0
- package/dist/rap/bo.js +184 -0
- package/dist/rap/bo.js.map +1 -0
- package/dist/rap/kernel.d.ts +7 -0
- package/dist/rap/kernel.js +287 -0
- package/dist/rap/kernel.js.map +1 -0
- package/dist/rap/runtime.d.ts +84 -0
- package/dist/rap/runtime.js +128 -0
- package/dist/rap/runtime.js.map +1 -0
- package/dist/rap/transaction.d.ts +227 -0
- package/dist/rap/transaction.js +1385 -0
- package/dist/rap/transaction.js.map +1 -0
- package/dist/rap/types.d.ts +74 -0
- package/dist/rap/types.js +25 -0
- package/dist/rap/types.js.map +1 -0
- package/dist/server.d.ts +34 -0
- package/dist/server.js +114 -0
- package/dist/server.js.map +1 -0
- package/dist/ui/plugin.d.ts +14 -0
- package/dist/ui/plugin.js +47 -0
- package/dist/ui/plugin.js.map +1 -0
- package/dist/ui/resources.d.ts +22 -0
- package/dist/ui/resources.js +88 -0
- package/dist/ui/resources.js.map +1 -0
- package/dist/ui/variants.d.ts +25 -0
- package/dist/ui/variants.js +68 -0
- package/dist/ui/variants.js.map +1 -0
- package/dist/values.d.ts +43 -0
- package/dist/values.js +367 -0
- package/dist/values.js.map +1 -0
- package/package.json +60 -3
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The OpenUI5 resources of the generated UI, served from the npm packages of OpenUI5
|
|
3
|
+
* (`@openui5/*`, Apache-2.0) without a UI5 build: the sources of the libraries, and the theme
|
|
4
|
+
* CSS compiled on first request with less-openui5 (Apache-2.0), then cached.
|
|
5
|
+
*/
|
|
6
|
+
import { readFile } from "node:fs/promises";
|
|
7
|
+
import { createRequire } from "node:module";
|
|
8
|
+
import path from "node:path";
|
|
9
|
+
export const OPENUI5_LIBRARIES = [
|
|
10
|
+
"@openui5/sap.ui.core",
|
|
11
|
+
"@openui5/sap.m",
|
|
12
|
+
"@openui5/sap.f",
|
|
13
|
+
"@openui5/sap.uxap",
|
|
14
|
+
"@openui5/sap.ui.layout",
|
|
15
|
+
"@openui5/sap.ui.unified",
|
|
16
|
+
"@openui5/themelib_sap_horizon",
|
|
17
|
+
];
|
|
18
|
+
const TYPES = {
|
|
19
|
+
".js": "application/javascript; charset=utf-8",
|
|
20
|
+
".json": "application/json; charset=utf-8",
|
|
21
|
+
".css": "text/css; charset=utf-8",
|
|
22
|
+
".properties": "text/plain; charset=utf-8",
|
|
23
|
+
".xml": "application/xml; charset=utf-8",
|
|
24
|
+
".html": "text/html; charset=utf-8",
|
|
25
|
+
".woff2": "font/woff2",
|
|
26
|
+
".woff": "font/woff",
|
|
27
|
+
".ttf": "font/ttf",
|
|
28
|
+
".svg": "image/svg+xml",
|
|
29
|
+
".png": "image/png",
|
|
30
|
+
".gif": "image/gif",
|
|
31
|
+
".jpg": "image/jpeg",
|
|
32
|
+
};
|
|
33
|
+
export class Ui5Resources {
|
|
34
|
+
roots;
|
|
35
|
+
themes = new Map();
|
|
36
|
+
builder;
|
|
37
|
+
require;
|
|
38
|
+
/** `from`: a directory whose node_modules hold the OpenUI5 packages (the application). */
|
|
39
|
+
constructor(from, libraries = OPENUI5_LIBRARIES) {
|
|
40
|
+
this.require = createRequire(path.join(path.resolve(from), "package.json"));
|
|
41
|
+
this.roots = libraries.map((name) => path.join(path.dirname(this.require.resolve(`${name}/package.json`)), "src"));
|
|
42
|
+
}
|
|
43
|
+
/** A resource by its path below `resources/` (`sap/m/Button.js`). */
|
|
44
|
+
async get(resource) {
|
|
45
|
+
const clean = path.posix.normalize(resource).replace(/^(\.\.(\/|$))+/, "");
|
|
46
|
+
if (clean.startsWith("/") || clean.includes("\0")) {
|
|
47
|
+
return undefined;
|
|
48
|
+
}
|
|
49
|
+
const theme = /^(.+\/themes\/[^/]+)\/(library\.css|library-RTL\.css|library-parameters\.json)$/.exec(clean);
|
|
50
|
+
if (theme !== null) {
|
|
51
|
+
const build = await this.theme(theme[1]);
|
|
52
|
+
if (build !== undefined) {
|
|
53
|
+
const file = theme[2];
|
|
54
|
+
return file === "library.css" ? { body: build.css, type: TYPES[".css"] } : file === "library-RTL.css" ? { body: build.rtl, type: TYPES[".css"] } : { body: build.parameters, type: TYPES[".json"] };
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
for (const root of this.roots) {
|
|
58
|
+
try {
|
|
59
|
+
const body = await readFile(path.join(root, clean));
|
|
60
|
+
return { body, type: TYPES[path.extname(clean)] ?? "application/octet-stream" };
|
|
61
|
+
}
|
|
62
|
+
catch {
|
|
63
|
+
// next package
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
return undefined;
|
|
67
|
+
}
|
|
68
|
+
/** Compiles `<lib>/themes/<theme>/library.source.less` with all the packages as roots. */
|
|
69
|
+
theme(folder) {
|
|
70
|
+
const source = `${folder}/library.source.less`;
|
|
71
|
+
let build = this.themes.get(source);
|
|
72
|
+
if (build === undefined) {
|
|
73
|
+
// (a variable rather than `new (x as T).Builder()`: TypeScript 7.0 drops those parentheses)
|
|
74
|
+
const less = this.require("less-openui5");
|
|
75
|
+
const builder = (this.builder ??= new less.Builder());
|
|
76
|
+
build = (async () => {
|
|
77
|
+
// the library name gives its private parameters (_sap_m_…) and the inline parameters
|
|
78
|
+
const library = folder.slice(0, folder.indexOf("/themes/")).replace(/\//g, ".");
|
|
79
|
+
const result = await builder.build({ lessInputPath: source, rootPaths: this.roots, library: { name: library } });
|
|
80
|
+
return { css: result.css, rtl: result.cssRtl, parameters: JSON.stringify(result.variables) };
|
|
81
|
+
})();
|
|
82
|
+
build.catch(() => this.themes.delete(source));
|
|
83
|
+
this.themes.set(source, build);
|
|
84
|
+
}
|
|
85
|
+
return build.catch(() => undefined);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
//# sourceMappingURL=resources.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resources.js","sourceRoot":"","sources":["../../src/ui/resources.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The views (variants) of the list reports, saved per user (`$variants` of the service): the
|
|
3
|
+
* filters, the visible filters and columns, the sort order. Kept in `rapt_ui_variant`, created at
|
|
4
|
+
* the first use (it is not part of the schema of the business objects).
|
|
5
|
+
*/
|
|
6
|
+
import type { Database } from "../db/database.js";
|
|
7
|
+
export interface VariantData {
|
|
8
|
+
defaultKey?: string;
|
|
9
|
+
items: Array<{
|
|
10
|
+
key: string;
|
|
11
|
+
title: string;
|
|
12
|
+
favorite?: boolean;
|
|
13
|
+
content: unknown;
|
|
14
|
+
}>;
|
|
15
|
+
}
|
|
16
|
+
export declare class UiVariants {
|
|
17
|
+
private readonly db;
|
|
18
|
+
private ready;
|
|
19
|
+
constructor(db: () => Database);
|
|
20
|
+
private table;
|
|
21
|
+
read(user: string, page: string): Promise<VariantData>;
|
|
22
|
+
write(user: string, page: string, body: string): Promise<void>;
|
|
23
|
+
}
|
|
24
|
+
export declare class VariantError extends Error {
|
|
25
|
+
}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The views (variants) of the list reports, saved per user (`$variants` of the service): the
|
|
3
|
+
* filters, the visible filters and columns, the sort order. Kept in `rapt_ui_variant`, created at
|
|
4
|
+
* the first use (it is not part of the schema of the business objects).
|
|
5
|
+
*/
|
|
6
|
+
import { sql } from "kysely";
|
|
7
|
+
const MAX_SIZE = 256 * 1024;
|
|
8
|
+
export class UiVariants {
|
|
9
|
+
db;
|
|
10
|
+
ready;
|
|
11
|
+
constructor(db) {
|
|
12
|
+
this.db = db;
|
|
13
|
+
}
|
|
14
|
+
table() {
|
|
15
|
+
this.ready ??= sql
|
|
16
|
+
.raw("CREATE TABLE IF NOT EXISTS rapt_ui_variant (user_id text NOT NULL, page text NOT NULL, data text NOT NULL, changed_at timestamptz NOT NULL DEFAULT now(), PRIMARY KEY (user_id, page))")
|
|
17
|
+
.execute(this.db())
|
|
18
|
+
.then(() => undefined)
|
|
19
|
+
.catch((error) => {
|
|
20
|
+
this.ready = undefined;
|
|
21
|
+
throw error;
|
|
22
|
+
});
|
|
23
|
+
return this.ready;
|
|
24
|
+
}
|
|
25
|
+
async read(user, page) {
|
|
26
|
+
await this.table();
|
|
27
|
+
const result = await sql `SELECT data FROM rapt_ui_variant WHERE user_id = ${user} AND page = ${page}`.execute(this.db());
|
|
28
|
+
const row = result.rows[0];
|
|
29
|
+
return row === undefined ? { items: [] } : JSON.parse(row.data);
|
|
30
|
+
}
|
|
31
|
+
async write(user, page, body) {
|
|
32
|
+
if (body.length > MAX_SIZE) {
|
|
33
|
+
throw new VariantError("the views are too large");
|
|
34
|
+
}
|
|
35
|
+
const data = parse(body);
|
|
36
|
+
await this.table();
|
|
37
|
+
const text = JSON.stringify(data);
|
|
38
|
+
await sql `INSERT INTO rapt_ui_variant (user_id, page, data, changed_at) VALUES (${user}, ${page}, ${text}, now())
|
|
39
|
+
ON CONFLICT (user_id, page) DO UPDATE SET data = EXCLUDED.data, changed_at = EXCLUDED.changed_at`.execute(this.db());
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
export class VariantError extends Error {
|
|
43
|
+
}
|
|
44
|
+
function parse(body) {
|
|
45
|
+
let value;
|
|
46
|
+
try {
|
|
47
|
+
value = JSON.parse(body);
|
|
48
|
+
}
|
|
49
|
+
catch {
|
|
50
|
+
throw new VariantError("the body is not JSON");
|
|
51
|
+
}
|
|
52
|
+
if (typeof value !== "object" || value === null || !Array.isArray(value.items)) {
|
|
53
|
+
throw new VariantError("expected { items: [...] }");
|
|
54
|
+
}
|
|
55
|
+
const data = value;
|
|
56
|
+
const items = data.items.map((item) => {
|
|
57
|
+
if (typeof item !== "object" || item === null || typeof item.key !== "string" || typeof item.title !== "string") {
|
|
58
|
+
throw new VariantError("each view needs a key and a title");
|
|
59
|
+
}
|
|
60
|
+
return { key: item.key, title: item.title, favorite: item.favorite !== false, content: item.content ?? null };
|
|
61
|
+
});
|
|
62
|
+
const result = { items };
|
|
63
|
+
if (typeof data.defaultKey === "string") {
|
|
64
|
+
result.defaultKey = data.defaultKey;
|
|
65
|
+
}
|
|
66
|
+
return result;
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=variants.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"variants.js","sourceRoot":"","sources":["../../src/ui/variants.ts"],"names":[],"mappings":"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"}
|
package/dist/values.d.ts
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Canonical values (decision D16) and their conversions to and from SQL, OData JSON and OData
|
|
3
|
+
* URL literals.
|
|
4
|
+
*
|
|
5
|
+
* Canonical forms: strings for character-like types (trailing blanks removed), decimals and INT8;
|
|
6
|
+
* numbers for INT1/2/4 and FLTP; booleans; `YYYY-MM-DD` dates, `HH:MM:SS` times and ISO 8601 UTC
|
|
7
|
+
* time stamps with microseconds, `null` when initial; lower-case UUIDs; upper-case hex binaries.
|
|
8
|
+
*/
|
|
9
|
+
import { type AbapType, type EdmType } from "@open-rap/model";
|
|
10
|
+
export type CanonicalValue = string | number | boolean | null;
|
|
11
|
+
/** The initial value of an ABAP type, in canonical form. */
|
|
12
|
+
export declare function initialValue(t: AbapType): CanonicalValue;
|
|
13
|
+
export declare function isInitial(t: AbapType, value: CanonicalValue | undefined): boolean;
|
|
14
|
+
/** Time stamp from PostgreSQL (`2026-11-09 12:34:56.123456+00`) or ISO input → canonical ISO UTC. */
|
|
15
|
+
export declare function normalizeTimestamp(value: string | Date, precision?: number): string;
|
|
16
|
+
/** A value read from PostgreSQL → canonical. */
|
|
17
|
+
export declare function fromSql(t: AbapType, value: unknown): CanonicalValue;
|
|
18
|
+
/** Canonical → a bind parameter for PostgreSQL. */
|
|
19
|
+
export declare function toSql(t: AbapType, value: CanonicalValue): unknown;
|
|
20
|
+
/** A number written verbatim in the JSON output (decimals and Int64 without IEEE754Compatible). */
|
|
21
|
+
export declare class RawJsonNumber {
|
|
22
|
+
readonly text: string;
|
|
23
|
+
constructor(text: string);
|
|
24
|
+
}
|
|
25
|
+
export type JsonValue = string | number | boolean | null | RawJsonNumber | JsonValue[] | {
|
|
26
|
+
[key: string]: JsonValue;
|
|
27
|
+
};
|
|
28
|
+
/** The member of an enumeration type (D55) from its name or its integral value: undefined if none. */
|
|
29
|
+
export declare function enumMember(edm: EdmType, value: unknown): NonNullable<EdmType["enum"]>["members"][number] | undefined;
|
|
30
|
+
/** Canonical → OData JSON value. */
|
|
31
|
+
export declare function toJson(edm: EdmType, value: CanonicalValue, ieee754: boolean): JsonValue;
|
|
32
|
+
/** OData JSON value of a request body → canonical, with type checks. */
|
|
33
|
+
export declare function fromJson(t: AbapType, edm: EdmType, value: unknown, property: string): CanonicalValue;
|
|
34
|
+
/** Rounds a decimal to the scale of the field, half away from zero, as ABAP assigns. */
|
|
35
|
+
export declare function normalizeDecimal(text: string, scale: number | undefined, property?: string): string;
|
|
36
|
+
/** A literal of the URL ($filter, key predicates), already typed by the parser, → canonical for a property. */
|
|
37
|
+
export interface UrlLiteral {
|
|
38
|
+
/** `enum`: `Namespace.Type'MEMBER'`, the value is the member (D55). */
|
|
39
|
+
type: "string" | "int" | "decimal" | "date" | "datetime" | "time" | "guid" | "bool" | "null" | "enum";
|
|
40
|
+
value: string | boolean | null;
|
|
41
|
+
}
|
|
42
|
+
export declare function literalToCanonical(t: AbapType, edm: EdmType, literal: UrlLiteral, property: string): CanonicalValue;
|
|
43
|
+
export declare function isTimeValue(value: string): boolean;
|
package/dist/values.js
ADDED
|
@@ -0,0 +1,367 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Canonical values (decision D16) and their conversions to and from SQL, OData JSON and OData
|
|
3
|
+
* URL literals.
|
|
4
|
+
*
|
|
5
|
+
* Canonical forms: strings for character-like types (trailing blanks removed), decimals and INT8;
|
|
6
|
+
* numbers for INT1/2/4 and FLTP; booleans; `YYYY-MM-DD` dates, `HH:MM:SS` times and ISO 8601 UTC
|
|
7
|
+
* time stamps with microseconds, `null` when initial; lower-case UUIDs; upper-case hex binaries.
|
|
8
|
+
*/
|
|
9
|
+
import { isUuid } from "@open-rap/model";
|
|
10
|
+
import { ODataError } from "./odata/errors.js";
|
|
11
|
+
const DATE = /^\d{4}-\d{2}-\d{2}$/;
|
|
12
|
+
const TIME = /^\d{2}:\d{2}:\d{2}$/;
|
|
13
|
+
const GUID = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
|
|
14
|
+
/** The initial value of an ABAP type, in canonical form. */
|
|
15
|
+
export function initialValue(t) {
|
|
16
|
+
switch (t.kind) {
|
|
17
|
+
case "numc":
|
|
18
|
+
return "0".repeat(t.length ?? 1);
|
|
19
|
+
case "char":
|
|
20
|
+
case "string":
|
|
21
|
+
case "sstring":
|
|
22
|
+
case "cuky":
|
|
23
|
+
case "unit":
|
|
24
|
+
case "lang":
|
|
25
|
+
case "clnt":
|
|
26
|
+
return "";
|
|
27
|
+
case "bool":
|
|
28
|
+
return false;
|
|
29
|
+
case "int1":
|
|
30
|
+
case "int2":
|
|
31
|
+
case "int4":
|
|
32
|
+
case "fltp":
|
|
33
|
+
return 0;
|
|
34
|
+
case "int8":
|
|
35
|
+
return "0";
|
|
36
|
+
case "dec":
|
|
37
|
+
case "curr":
|
|
38
|
+
case "quan":
|
|
39
|
+
case "decfloat16":
|
|
40
|
+
case "decfloat34":
|
|
41
|
+
return t.decimals ? `0.${"0".repeat(t.decimals)}` : "0";
|
|
42
|
+
default:
|
|
43
|
+
return null;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
export function isInitial(t, value) {
|
|
47
|
+
if (value === undefined || value === null) {
|
|
48
|
+
return true;
|
|
49
|
+
}
|
|
50
|
+
if (typeof value === "string" && (t.kind === "dec" || t.kind === "curr" || t.kind === "quan" || t.kind === "int8" || t.kind === "decfloat16" || t.kind === "decfloat34")) {
|
|
51
|
+
return Number(value) === 0;
|
|
52
|
+
}
|
|
53
|
+
if (t.kind === "numc" && typeof value === "string") {
|
|
54
|
+
return /^0*$/.test(value);
|
|
55
|
+
}
|
|
56
|
+
return value === initialValue(t);
|
|
57
|
+
}
|
|
58
|
+
/** Time stamp from PostgreSQL (`2026-11-09 12:34:56.123456+00`) or ISO input → canonical ISO UTC. */
|
|
59
|
+
export function normalizeTimestamp(value, precision = 6) {
|
|
60
|
+
const text = value instanceof Date ? value.toISOString() : value;
|
|
61
|
+
const match = /^(\d{4}-\d{2}-\d{2})[ T](\d{2}:\d{2}(?::\d{2})?)(?:\.(\d+))?\s*(Z|[+-]\d{2}(?::?\d{2})?)?$/i.exec(text.trim());
|
|
62
|
+
if (match === null) {
|
|
63
|
+
throw new Error(`invalid time stamp ${text}`);
|
|
64
|
+
}
|
|
65
|
+
const [, date, time, fraction = "", zone = "Z"] = match;
|
|
66
|
+
let utc = new Date(`${date}T${time.length === 5 ? `${time}:00` : time}${normalizeZone(zone)}`);
|
|
67
|
+
if (Number.isNaN(utc.getTime())) {
|
|
68
|
+
throw new Error(`invalid time stamp ${text}`);
|
|
69
|
+
}
|
|
70
|
+
const micros = fraction.padEnd(6, "0").slice(0, 6);
|
|
71
|
+
utc = new Date(utc.getTime());
|
|
72
|
+
const base = utc.toISOString().slice(0, 19);
|
|
73
|
+
return precision === 0 ? `${base}Z` : `${base}.${micros.slice(0, Math.min(precision, 6)).padEnd(Math.min(precision, 6), "0")}Z`;
|
|
74
|
+
}
|
|
75
|
+
function normalizeZone(zone) {
|
|
76
|
+
if (zone.toUpperCase() === "Z") {
|
|
77
|
+
return "Z";
|
|
78
|
+
}
|
|
79
|
+
const m = /^([+-])(\d{2}):?(\d{2})?$/.exec(zone);
|
|
80
|
+
return m === null ? "Z" : `${m[1]}${m[2]}:${m[3] ?? "00"}`;
|
|
81
|
+
}
|
|
82
|
+
/** A value read from PostgreSQL → canonical. */
|
|
83
|
+
export function fromSql(t, value) {
|
|
84
|
+
if (value === null || value === undefined) {
|
|
85
|
+
return t.kind === "dats" || t.kind === "tims" || t.kind === "timestamp" || t.kind === "timestampl" || t.kind === "utclong" || t.kind === "raw" || t.kind === "rawstring"
|
|
86
|
+
? null
|
|
87
|
+
: initialValue(t);
|
|
88
|
+
}
|
|
89
|
+
switch (t.kind) {
|
|
90
|
+
case "char":
|
|
91
|
+
case "sstring":
|
|
92
|
+
case "cuky":
|
|
93
|
+
case "unit":
|
|
94
|
+
case "lang":
|
|
95
|
+
case "clnt":
|
|
96
|
+
return String(value).replace(/\s+$/, "");
|
|
97
|
+
case "numc":
|
|
98
|
+
case "string":
|
|
99
|
+
return String(value);
|
|
100
|
+
case "bool":
|
|
101
|
+
return value === true || value === "t" || value === "true";
|
|
102
|
+
case "int1":
|
|
103
|
+
case "int2":
|
|
104
|
+
case "int4":
|
|
105
|
+
case "fltp":
|
|
106
|
+
return Number(value);
|
|
107
|
+
case "int8":
|
|
108
|
+
case "dec":
|
|
109
|
+
case "curr":
|
|
110
|
+
case "quan":
|
|
111
|
+
case "decfloat16":
|
|
112
|
+
case "decfloat34":
|
|
113
|
+
return String(value);
|
|
114
|
+
case "dats":
|
|
115
|
+
return value instanceof Date ? value.toISOString().slice(0, 10) : String(value).slice(0, 10);
|
|
116
|
+
case "tims":
|
|
117
|
+
return String(value).slice(0, 8);
|
|
118
|
+
case "timestamp":
|
|
119
|
+
return normalizeTimestamp(value, 0);
|
|
120
|
+
case "timestampl":
|
|
121
|
+
case "utclong":
|
|
122
|
+
return normalizeTimestamp(value, 6);
|
|
123
|
+
case "raw":
|
|
124
|
+
if (isUuid(t)) {
|
|
125
|
+
return String(value).toLowerCase();
|
|
126
|
+
}
|
|
127
|
+
return value instanceof Uint8Array ? Buffer.from(value).toString("hex").toUpperCase() : String(value).toUpperCase();
|
|
128
|
+
case "rawstring":
|
|
129
|
+
return value instanceof Uint8Array ? Buffer.from(value).toString("hex").toUpperCase() : String(value).toUpperCase();
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
/** Canonical → a bind parameter for PostgreSQL. */
|
|
133
|
+
export function toSql(t, value) {
|
|
134
|
+
if (value === null) {
|
|
135
|
+
return null;
|
|
136
|
+
}
|
|
137
|
+
if ((t.kind === "raw" && !isUuid(t)) || t.kind === "rawstring") {
|
|
138
|
+
return Buffer.from(String(value), "hex");
|
|
139
|
+
}
|
|
140
|
+
return value;
|
|
141
|
+
}
|
|
142
|
+
// ---------------------------------------------------------------------------------------------
|
|
143
|
+
// OData JSON
|
|
144
|
+
/** A number written verbatim in the JSON output (decimals and Int64 without IEEE754Compatible). */
|
|
145
|
+
export class RawJsonNumber {
|
|
146
|
+
text;
|
|
147
|
+
constructor(text) {
|
|
148
|
+
this.text = text;
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
/** The member of an enumeration type (D55) from its name or its integral value: undefined if none. */
|
|
152
|
+
export function enumMember(edm, value) {
|
|
153
|
+
const members = edm.enum?.members ?? [];
|
|
154
|
+
if (typeof value === "string") {
|
|
155
|
+
const byName = members.find((m) => m.name.toUpperCase() === value.toUpperCase());
|
|
156
|
+
if (byName !== undefined || !/^-?\d+$/.test(value)) {
|
|
157
|
+
return byName;
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
return typeof value === "number" || typeof value === "string" ? members.find((m) => m.value === Number(value)) : undefined;
|
|
161
|
+
}
|
|
162
|
+
/** Canonical → OData JSON value. */
|
|
163
|
+
export function toJson(edm, value, ieee754) {
|
|
164
|
+
if (value === null) {
|
|
165
|
+
return null;
|
|
166
|
+
}
|
|
167
|
+
if (edm.enum !== undefined) {
|
|
168
|
+
// the member of the base value (D55); a value outside the enumeration is written as is
|
|
169
|
+
const member = edm.enum.members.find((m) => String(m.base) === String(value));
|
|
170
|
+
return member === undefined ? (typeof value === "boolean" ? value : String(value)) : member.name;
|
|
171
|
+
}
|
|
172
|
+
switch (edm.type) {
|
|
173
|
+
case "Edm.Decimal":
|
|
174
|
+
case "Edm.Int64":
|
|
175
|
+
return ieee754 ? String(value) : new RawJsonNumber(String(value));
|
|
176
|
+
case "Edm.DateTimeOffset": {
|
|
177
|
+
const text = String(value);
|
|
178
|
+
const precision = edm.precision ?? 0;
|
|
179
|
+
const [base, fraction = ""] = text.replace(/Z$/, "").split(".");
|
|
180
|
+
return precision === 0 ? `${base}Z` : `${base}.${fraction.padEnd(precision, "0").slice(0, precision)}Z`;
|
|
181
|
+
}
|
|
182
|
+
case "Edm.Binary":
|
|
183
|
+
return Buffer.from(String(value), "hex").toString("base64url");
|
|
184
|
+
case "Edm.Byte":
|
|
185
|
+
case "Edm.Int16":
|
|
186
|
+
case "Edm.Int32":
|
|
187
|
+
case "Edm.Double":
|
|
188
|
+
return Number(value);
|
|
189
|
+
default:
|
|
190
|
+
return value;
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
/** OData JSON value of a request body → canonical, with type checks. */
|
|
194
|
+
export function fromJson(t, edm, value, property) {
|
|
195
|
+
const bad = (expected) => new ODataError(400, "INVALID_VALUE", `Property ${property}: ${JSON.stringify(value)} is not a valid ${expected}`, property);
|
|
196
|
+
if (edm.enum !== undefined && value !== null && value !== undefined) {
|
|
197
|
+
const member = enumMember(edm, value);
|
|
198
|
+
if (member === undefined) {
|
|
199
|
+
throw new ODataError(400, "INVALID_VALUE", `Property ${property}: ${JSON.stringify(value)} is not a member of ${edm.enum.name} (${edm.enum.members.map((m) => m.name).join(", ")})`, property);
|
|
200
|
+
}
|
|
201
|
+
return member.base;
|
|
202
|
+
}
|
|
203
|
+
if (edm.enum !== undefined && value !== null && value !== undefined) {
|
|
204
|
+
const member = enumMember(edm, value);
|
|
205
|
+
if (member === undefined) {
|
|
206
|
+
throw new ODataError(400, "INVALID_VALUE", `Property ${property}: ${JSON.stringify(value)} is not a member of ${edm.enum.name} (${edm.enum.members.map((m) => m.name).join(", ")})`, property);
|
|
207
|
+
}
|
|
208
|
+
return member.base;
|
|
209
|
+
}
|
|
210
|
+
if (value === null || value === undefined) {
|
|
211
|
+
return t.kind === "dats" || t.kind === "tims" || t.kind === "timestamp" || t.kind === "timestampl" || t.kind === "utclong" || t.kind === "raw" || t.kind === "rawstring"
|
|
212
|
+
? null
|
|
213
|
+
: initialValue(t);
|
|
214
|
+
}
|
|
215
|
+
switch (edm.type) {
|
|
216
|
+
case "Edm.String": {
|
|
217
|
+
if (typeof value !== "string")
|
|
218
|
+
throw bad("string");
|
|
219
|
+
if (edm.maxLength !== undefined && value.length > edm.maxLength) {
|
|
220
|
+
throw new ODataError(400, "VALUE_TOO_LONG", `Property ${property}: the value exceeds ${edm.maxLength} characters`, property);
|
|
221
|
+
}
|
|
222
|
+
if (edm.digitSequence === true) {
|
|
223
|
+
if (!/^\d*$/.test(value))
|
|
224
|
+
throw bad("digit sequence");
|
|
225
|
+
return value === "" ? initialValue(t) : value.padStart(edm.maxLength ?? value.length, "0");
|
|
226
|
+
}
|
|
227
|
+
return t.kind === "string" ? value : value.replace(/\s+$/, "");
|
|
228
|
+
}
|
|
229
|
+
case "Edm.Boolean":
|
|
230
|
+
if (typeof value !== "boolean")
|
|
231
|
+
throw bad("boolean");
|
|
232
|
+
return value;
|
|
233
|
+
case "Edm.Byte":
|
|
234
|
+
case "Edm.Int16":
|
|
235
|
+
case "Edm.Int32": {
|
|
236
|
+
const n = typeof value === "string" ? Number(value) : value;
|
|
237
|
+
if (typeof n !== "number" || !Number.isInteger(n))
|
|
238
|
+
throw bad("integer");
|
|
239
|
+
return n;
|
|
240
|
+
}
|
|
241
|
+
case "Edm.Int64":
|
|
242
|
+
if ((typeof value !== "string" && typeof value !== "number") || !/^-?\d+$/.test(String(value)))
|
|
243
|
+
throw bad("Int64");
|
|
244
|
+
return String(value);
|
|
245
|
+
case "Edm.Decimal": {
|
|
246
|
+
if ((typeof value !== "string" && typeof value !== "number") || !/^-?\d+(\.\d+)?([eE][+-]?\d+)?$/.test(String(value)))
|
|
247
|
+
throw bad("decimal");
|
|
248
|
+
return normalizeDecimal(String(value), edm.scale, property);
|
|
249
|
+
}
|
|
250
|
+
case "Edm.Double":
|
|
251
|
+
if (typeof value !== "number" && !(typeof value === "string" && !Number.isNaN(Number(value))))
|
|
252
|
+
throw bad("number");
|
|
253
|
+
return Number(value);
|
|
254
|
+
case "Edm.Date":
|
|
255
|
+
if (typeof value !== "string" || !DATE.test(value))
|
|
256
|
+
throw bad("date (YYYY-MM-DD)");
|
|
257
|
+
return value;
|
|
258
|
+
case "Edm.TimeOfDay":
|
|
259
|
+
if (typeof value !== "string" || !/^\d{2}:\d{2}(:\d{2}(\.\d+)?)?$/.test(value))
|
|
260
|
+
throw bad("time of day (HH:MM:SS)");
|
|
261
|
+
return value.length === 5 ? `${value}:00` : value.slice(0, 8);
|
|
262
|
+
case "Edm.DateTimeOffset":
|
|
263
|
+
if (typeof value !== "string")
|
|
264
|
+
throw bad("date-time offset");
|
|
265
|
+
try {
|
|
266
|
+
return normalizeTimestamp(value, edm.precision === 0 ? 0 : 6);
|
|
267
|
+
}
|
|
268
|
+
catch {
|
|
269
|
+
throw bad("date-time offset");
|
|
270
|
+
}
|
|
271
|
+
case "Edm.Guid":
|
|
272
|
+
if (typeof value !== "string" || !GUID.test(value))
|
|
273
|
+
throw bad("GUID");
|
|
274
|
+
return value.toLowerCase();
|
|
275
|
+
case "Edm.Binary":
|
|
276
|
+
if (typeof value !== "string")
|
|
277
|
+
throw bad("base64 binary");
|
|
278
|
+
return Buffer.from(value, "base64url").toString("hex").toUpperCase();
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
/** Rounds a decimal to the scale of the field, half away from zero, as ABAP assigns. */
|
|
282
|
+
export function normalizeDecimal(text, scale, property = "") {
|
|
283
|
+
if (scale === undefined) {
|
|
284
|
+
return String(Number(text)) === text ? text : text;
|
|
285
|
+
}
|
|
286
|
+
let value = text;
|
|
287
|
+
if (/[eE]/.test(value)) {
|
|
288
|
+
value = Number(value).toFixed(scale);
|
|
289
|
+
}
|
|
290
|
+
const negative = value.startsWith("-");
|
|
291
|
+
const [intPart = "0", fracPart = ""] = (negative ? value.slice(1) : value).split(".");
|
|
292
|
+
if (fracPart.length <= scale) {
|
|
293
|
+
const result = scale === 0 ? intPart : `${intPart}.${fracPart.padEnd(scale, "0")}`;
|
|
294
|
+
return negative && Number(result) !== 0 ? `-${result}` : result;
|
|
295
|
+
}
|
|
296
|
+
const digits = BigInt(`${intPart}${fracPart.slice(0, scale)}`) + (Number(fracPart[scale]) >= 5 ? 1n : 0n);
|
|
297
|
+
const s = digits.toString().padStart(scale + 1, "0");
|
|
298
|
+
const result = scale === 0 ? s : `${s.slice(0, -scale)}.${s.slice(-scale)}`;
|
|
299
|
+
void property;
|
|
300
|
+
return negative && Number(result) !== 0 ? `-${result}` : result;
|
|
301
|
+
}
|
|
302
|
+
export function literalToCanonical(t, edm, literal, property) {
|
|
303
|
+
const bad = () => new ODataError(400, "INVALID_LITERAL", `${property}: the literal ${literal.type === "string" ? `'${String(literal.value)}'` : String(literal.value)} does not match the type ${edm.type}`);
|
|
304
|
+
if (literal.type === "null") {
|
|
305
|
+
return null;
|
|
306
|
+
}
|
|
307
|
+
if (edm.enum !== undefined) {
|
|
308
|
+
// Namespace.Type'MEMBER', 'MEMBER' or the integral value (D55)
|
|
309
|
+
const member = literal.type === "string" || literal.type === "enum" || literal.type === "int" ? enumMember(edm, literal.value) : undefined;
|
|
310
|
+
if (member === undefined) {
|
|
311
|
+
throw new ODataError(400, "INVALID_LITERAL", `${property}: ${String(literal.value)} is not a member of ${edm.enum.name}`);
|
|
312
|
+
}
|
|
313
|
+
return member.base;
|
|
314
|
+
}
|
|
315
|
+
if (literal.type === "enum") {
|
|
316
|
+
throw bad();
|
|
317
|
+
}
|
|
318
|
+
switch (edm.type) {
|
|
319
|
+
case "Edm.String":
|
|
320
|
+
if (literal.type !== "string")
|
|
321
|
+
throw bad();
|
|
322
|
+
return edm.digitSequence === true && /^\d+$/.test(String(literal.value)) ? String(literal.value).padStart(edm.maxLength ?? 0, "0") : String(literal.value);
|
|
323
|
+
case "Edm.Guid":
|
|
324
|
+
if (literal.type !== "guid" && !(literal.type === "string" && GUID.test(String(literal.value))))
|
|
325
|
+
throw bad();
|
|
326
|
+
return String(literal.value).toLowerCase();
|
|
327
|
+
case "Edm.Date":
|
|
328
|
+
if (literal.type !== "date")
|
|
329
|
+
throw bad();
|
|
330
|
+
return String(literal.value);
|
|
331
|
+
case "Edm.TimeOfDay":
|
|
332
|
+
if (literal.type !== "time")
|
|
333
|
+
throw bad();
|
|
334
|
+
return String(literal.value).slice(0, 8).padEnd(8, ":00");
|
|
335
|
+
case "Edm.DateTimeOffset":
|
|
336
|
+
if (literal.type !== "datetime" && literal.type !== "date")
|
|
337
|
+
throw bad();
|
|
338
|
+
return normalizeTimestamp(literal.type === "date" ? `${String(literal.value)}T00:00:00Z` : String(literal.value), 6);
|
|
339
|
+
case "Edm.Boolean":
|
|
340
|
+
if (literal.type !== "bool")
|
|
341
|
+
throw bad();
|
|
342
|
+
return literal.value;
|
|
343
|
+
case "Edm.Byte":
|
|
344
|
+
case "Edm.Int16":
|
|
345
|
+
case "Edm.Int32":
|
|
346
|
+
if (literal.type !== "int")
|
|
347
|
+
throw bad();
|
|
348
|
+
return Number(literal.value);
|
|
349
|
+
case "Edm.Int64":
|
|
350
|
+
if (literal.type !== "int")
|
|
351
|
+
throw bad();
|
|
352
|
+
return String(literal.value);
|
|
353
|
+
case "Edm.Decimal":
|
|
354
|
+
case "Edm.Double":
|
|
355
|
+
if (literal.type !== "int" && literal.type !== "decimal")
|
|
356
|
+
throw bad();
|
|
357
|
+
return edm.type === "Edm.Double" ? Number(literal.value) : String(literal.value);
|
|
358
|
+
case "Edm.Binary":
|
|
359
|
+
throw bad();
|
|
360
|
+
}
|
|
361
|
+
void t;
|
|
362
|
+
return null;
|
|
363
|
+
}
|
|
364
|
+
export function isTimeValue(value) {
|
|
365
|
+
return TIME.test(value);
|
|
366
|
+
}
|
|
367
|
+
//# sourceMappingURL=values.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"values.js","sourceRoot":"","sources":["../src/values.ts"],"names":[],"mappings":"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"}
|