@aerokit/sdk 14.89.0 → 14.91.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.
@@ -34,7 +34,8 @@ __export(security_exports, {
34
34
  module.exports = __toCommonJS(security_exports);
35
35
  __reExport(security_exports, require("./user"), module.exports);
36
36
  var import_user = require("./user");
37
+ __reExport(security_exports, require("./tenants"), module.exports);
37
38
  __reExport(security_exports, require("./oauth"), module.exports);
38
39
  __reExport(security_exports, require("./decorators"), module.exports);
39
40
  var decorators = __toESM(require("./decorators"));
40
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL3NlY3VyaXR5L2luZGV4LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBtb2R1bGUgc2VjdXJpdHkvaW5kZXhcbiAqIEBwYWNrYWdlIEBhZXJva2l0L3Nkay9zZWN1cml0eVxuICogQG92ZXJ2aWV3XG4gKlxuICogUHJvdmlkZXMgc2VjdXJpdHkgaGVscGVycyBmb3IgdXNlciBhdXRoZW50aWNhdGlvbiwgT0F1dGggZmxvd3MsIGFuZCBtZXRhZGF0YSBkZWNvcmF0b3JzLlxuICogSXQgZXhwb3NlcyB1c2VyIG1hbmFnZW1lbnQgdXRpbGl0aWVzLCBPQXV0aCBpbnRlZ3JhdGlvbiwgYW5kIHVzZWZ1bCBzZWN1cml0eSBkZWNvcmF0b3JzXG4gKiBmb3IgcHJvdGVjdGVkIHJvdXRlIGhhbmRsaW5nIGFuZCByb2xlLWJhc2VkIGFjY2VzcyBjb250cm9sLlxuICpcbiAqIFRoZSBtYWluIGNvbXBvbmVudHMgb2YgdGhpcyBtb2R1bGUgYXJlOlxuICogLSBVc2VyOiBVc2VyIGlkZW50aXR5IGFuZCBhdXRoZW50aWNhdGlvbiB1dGlsaXRpZXMuXG4gKiAtIE9BdXRoOiBPQXV0aDIgaW50ZWdyYXRpb24gaGVscGVycyBmb3IgYXV0aGVudGljYXRpb24gZmxvd3MuXG4gKiAtIERlY29yYXRvcnM6IFNlY3VyaXR5IGRlY29yYXRvcnMgZm9yIGVuZHBvaW50IGFjY2VzcyBjb250cm9sLlxuICovXG5cbmV4cG9ydCAqIGZyb20gXCIuL3VzZXJcIjtcbmV4cG9ydCB7IFVzZXIgYXMgdXNlciB9IGZyb20gXCIuL3VzZXJcIjtcbmV4cG9ydCAqIGZyb20gXCIuL29hdXRoXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9kZWNvcmF0b3JzXCI7XG5leHBvcnQgKiBhcyBkZWNvcmF0b3JzIGZyb20gXCIuL2RlY29yYXRvcnNcIjtcbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFlQSw2QkFBYyxtQkFmZDtBQWdCQSxrQkFBNkI7QUFDN0IsNkJBQWMsb0JBakJkO0FBa0JBLDZCQUFjLHlCQWxCZDtBQW1CQSxpQkFBNEI7IiwKICAibmFtZXMiOiBbXQp9Cg==
41
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL3NlY3VyaXR5L2luZGV4LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBtb2R1bGUgc2VjdXJpdHkvaW5kZXhcbiAqIEBwYWNrYWdlIEBhZXJva2l0L3Nkay9zZWN1cml0eVxuICogQG92ZXJ2aWV3XG4gKlxuICogUHJvdmlkZXMgc2VjdXJpdHkgaGVscGVycyBmb3IgdXNlciBhdXRoZW50aWNhdGlvbiwgT0F1dGggZmxvd3MsIGFuZCBtZXRhZGF0YSBkZWNvcmF0b3JzLlxuICogSXQgZXhwb3NlcyB1c2VyIG1hbmFnZW1lbnQgdXRpbGl0aWVzLCBPQXV0aCBpbnRlZ3JhdGlvbiwgYW5kIHVzZWZ1bCBzZWN1cml0eSBkZWNvcmF0b3JzXG4gKiBmb3IgcHJvdGVjdGVkIHJvdXRlIGhhbmRsaW5nIGFuZCByb2xlLWJhc2VkIGFjY2VzcyBjb250cm9sLlxuICpcbiAqIFRoZSBtYWluIGNvbXBvbmVudHMgb2YgdGhpcyBtb2R1bGUgYXJlOlxuICogLSBVc2VyOiBVc2VyIGlkZW50aXR5IGFuZCBhdXRoZW50aWNhdGlvbiB1dGlsaXRpZXMuXG4gKiAtIFRlbmFudHM6IFRoZSB0ZW5hbnRzIHRoZSB1c2VyIGhvbGRzIGEgcm9sZSBpbiwgYW5kIHJ1bnMgYWNyb3NzIHRoZW0uXG4gKiAtIE9BdXRoOiBPQXV0aDIgaW50ZWdyYXRpb24gaGVscGVycyBmb3IgYXV0aGVudGljYXRpb24gZmxvd3MuXG4gKiAtIERlY29yYXRvcnM6IFNlY3VyaXR5IGRlY29yYXRvcnMgZm9yIGVuZHBvaW50IGFjY2VzcyBjb250cm9sLlxuICovXG5cbmV4cG9ydCAqIGZyb20gXCIuL3VzZXJcIjtcbmV4cG9ydCB7IFVzZXIgYXMgdXNlciB9IGZyb20gXCIuL3VzZXJcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3RlbmFudHNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL29hdXRoXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9kZWNvcmF0b3JzXCI7XG5leHBvcnQgKiBhcyBkZWNvcmF0b3JzIGZyb20gXCIuL2RlY29yYXRvcnNcIjtcbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFnQkEsNkJBQWMsbUJBaEJkO0FBaUJBLGtCQUE2QjtBQUM3Qiw2QkFBYyxzQkFsQmQ7QUFtQkEsNkJBQWMsb0JBbkJkO0FBb0JBLDZCQUFjLHlCQXBCZDtBQXFCQSxpQkFBNEI7IiwKICAibmFtZXMiOiBbXQp9Cg==
@@ -0,0 +1,63 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
3
+ var __getOwnPropNames = Object.getOwnPropertyNames;
4
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
5
+ var __export = (target, all) => {
6
+ for (var name in all)
7
+ __defProp(target, name, { get: all[name], enumerable: true });
8
+ };
9
+ var __copyProps = (to, from, except, desc) => {
10
+ if (from && typeof from === "object" || typeof from === "function") {
11
+ for (let key of __getOwnPropNames(from))
12
+ if (!__hasOwnProp.call(to, key) && key !== except)
13
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
14
+ }
15
+ return to;
16
+ };
17
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
18
+ var tenants_exports = {};
19
+ __export(tenants_exports, {
20
+ Tenants: () => Tenants
21
+ });
22
+ module.exports = __toCommonJS(tenants_exports);
23
+ const TenantsFacade = Java.type("org.eclipse.dirigible.components.api.security.TenantsFacade");
24
+ class Tenants {
25
+ /**
26
+ * Whether runs across tenants are available on this instance.
27
+ *
28
+ * @returns True with the token-groups tenant resolution.
29
+ */
30
+ static isAvailable() {
31
+ return TenantsFacade.isAvailable();
32
+ }
33
+ /**
34
+ * The tenants the current user holds a role in and can enter now.
35
+ *
36
+ * @returns The tenants, with the roles held in each.
37
+ */
38
+ static getGrantedTenants() {
39
+ return JSON.parse(TenantsFacade.getGrantedTenants());
40
+ }
41
+ /**
42
+ * Runs the work once per tenant the current user can enter, in that tenant's data and with that tenant's roles.
43
+ *
44
+ * @param operation What the run does, recorded in the audit trail (e.g. 'period-close').
45
+ * @param work The work, given the id of the tenant it runs in.
46
+ * @returns One result per tenant.
47
+ */
48
+ static forEachGrantedTenant(operation, work) {
49
+ const results = TenantsFacade.forEachGrantedTenant(operation, (tenantId) => work(tenantId));
50
+ const mapped = [];
51
+ for (let i = 0; i < results.size(); i++) {
52
+ const r = results.get(i);
53
+ mapped.push({
54
+ tenantId: r.tenantId(),
55
+ succeeded: r.succeeded(),
56
+ result: r.succeeded() ? r.result() : void 0,
57
+ error: r.error() ?? void 0
58
+ });
59
+ }
60
+ return mapped;
61
+ }
62
+ }
63
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL3NlY3VyaXR5L3RlbmFudHMudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQG1vZHVsZSBzZWN1cml0eS90ZW5hbnRzXG4gKiBAcGFja2FnZSBAYWVyb2tpdC9zZGsvc2VjdXJpdHlcbiAqIEBuYW1lIFRlbmFudHNcbiAqIEBvdmVydmlld1xuICpcbiAqIFRoZSBUZW5hbnRzIGNsYXNzIGxpc3RzIHRoZSB0ZW5hbnRzIHRoZSBjdXJyZW50IHVzZXIgaG9sZHMgYSByb2xlIGluIGFuZCBydW5zIHdvcmsgYWNyb3NzIHRoZW0uIEl0IGlzIGJ1aWx0IGZvciBhIHVzZXIgd2hvIHdvcmtzXG4gKiBmb3IgbWFueSB0ZW5hbnRzIGF0IG9uY2UgLSBhbiBhY2NvdW50aW5nIHByYWN0aWNlIGtlZXBpbmcgdGhlIGJvb2tzIG9mIGl0cyBjbGllbnRzLCBlYWNoIG9uZSBhIHRlbmFudCAtIGFuZCB3aG8gaGFzIHRvIHJ1biB0aGUgc2FtZVxuICogb3BlcmF0aW9uIChhIHBlcmlvZCBjbG9zZSwgYSBzdGF0dXRvcnkgZmlsZSkgaW4gZWFjaCBvZiB0aGVtLlxuICpcbiAqICMjIyBLZXkgRmVhdHVyZXM6XG4gKiAtICoqR3JhbnRlZCB0ZW5hbnRzKio6IHRoZSB0ZW5hbnRzIHRoZSB1c2VyJ3MgbWVtYmVyc2hpcHMgZ3JhbnQgYW5kIHRoYXQgY2FuIGJlIGVudGVyZWQgbm93LCB3aXRoIHRoZSByb2xlcyBoZWxkIGluIGVhY2guXG4gKiAtICoqUnVucyBhY3Jvc3MgdGVuYW50cyoqOiB0aGUgd29yayBydW5zIG9uY2UgcGVyIHRlbmFudCwgaW4gdGhhdCB0ZW5hbnQncyBkYXRhIGFuZCB3aXRoIHRoYXQgdGVuYW50J3Mgcm9sZXMgLSBuZXZlciB0aGUgcm9sZXMgb2YgdGhlXG4gKiAgIHRlbmFudCB0aGUgc2Vzc2lvbiBoYXMgc2VsZWN0ZWQuIEEgZmFpbHVyZSBpbiBvbmUgdGVuYW50IGlzIHJlcG9ydGVkIGZvciBpdCBhbmQgdGhlIHJ1biBjYXJyaWVzIG9uIHdpdGggdGhlIG5leHQuXG4gKiAtICoqQXVkaXQqKjogZXZlcnkgdmlzaXQgaXMgcmVjb3JkZWQgaW4gdGhlIGNyb3NzLXRlbmFudCBhdWRpdCB0cmFpbCwgcmVhZGFibGUgYnkgZWFjaCB0ZW5hbnQncyBhZG1pbmlzdHJhdG9ycy5cbiAqXG4gKiBBdmFpbGFibGUgd2l0aCB0aGUgdG9rZW4tZ3JvdXBzIHRlbmFudCByZXNvbHV0aW9uIG9ubHkgKGBESVJJR0lCTEVfVEVOQU5UX1JFU09MVVRJT05fU1RSQVRFR1k9VE9LRU5fR1JPVVBTYCk7IGNoZWNrXG4gKiBgVGVuYW50cy5pc0F2YWlsYWJsZSgpYCBmaXJzdC5cbiAqXG4gKiAjIyMgRXhhbXBsZSBVc2FnZTpcbiAqIGBgYHRzXG4gKiBpbXBvcnQgeyBUZW5hbnRzIH0gZnJvbSBcIkBhZXJva2l0L3Nkay9zZWN1cml0eVwiO1xuICpcbiAqIGNvbnN0IHJlc3VsdHMgPSBUZW5hbnRzLmZvckVhY2hHcmFudGVkVGVuYW50KFwicGVyaW9kLWNsb3NlXCIsICh0ZW5hbnRJZCkgPT4ge1xuICogICAgIC8vIHJ1bnMgd2l0aCB0aGUgZGF0YSBhbmQgdGhlIHJvbGVzIG9mIHRlbmFudElkXG4gKiAgICAgcmV0dXJuIGNsb3NlUGVyaW9kKFwiMjAyNi0wOVwiKTtcbiAqIH0pO1xuICogcmVzdWx0cy5maWx0ZXIociA9PiAhci5zdWNjZWVkZWQpLmZvckVhY2gociA9PiBjb25zb2xlLmVycm9yKGAke3IudGVuYW50SWR9OiAke3IuZXJyb3J9YCkpO1xuICogYGBgXG4gKi9cblxuY29uc3QgVGVuYW50c0ZhY2FkZSA9IEphdmEudHlwZShcIm9yZy5lY2xpcHNlLmRpcmlnaWJsZS5jb21wb25lbnRzLmFwaS5zZWN1cml0eS5UZW5hbnRzRmFjYWRlXCIpO1xuXG4vKipcbiAqIEEgdGVuYW50IHRoZSBjdXJyZW50IHVzZXIgaG9sZHMgYSByb2xlIGluLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEdyYW50ZWRUZW5hbnQge1xuICAgIC8qKiBUaGUgdGVuYW50IGlkLiAqL1xuICAgIGlkOiBzdHJpbmc7XG4gICAgLyoqIFRoZSB0ZW5hbnQgbmFtZS4gKi9cbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgLyoqIFRoZSByb2xlcyBoZWxkIGluIHRoZSB0ZW5hbnQuICovXG4gICAgcm9sZXM6IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIFdoYXQgb25lIHRlbmFudCdzIHZpc2l0IG9mIGEgcnVuIGNhbWUgdG8uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3Jvc3NUZW5hbnRSZXN1bHQ8VD4ge1xuICAgIC8qKiBUaGUgdGVuYW50IHZpc2l0ZWQuICovXG4gICAgdGVuYW50SWQ6IHN0cmluZztcbiAgICAvKiogV2hldGhlciB0aGUgd29yayByZXR1cm5lZCBub3JtYWxseS4gKi9cbiAgICBzdWNjZWVkZWQ6IGJvb2xlYW47XG4gICAgLyoqIFdoYXQgdGhlIHdvcmsgcmV0dXJuZWQ7IHVuZGVmaW5lZCBvbiBhIGZhaWx1cmUuICovXG4gICAgcmVzdWx0PzogVDtcbiAgICAvKiogV2h5IHRoZSB3b3JrIGZhaWxlZDsgdW5kZWZpbmVkIG9uIGEgc3VjY2Vzcy4gKi9cbiAgICBlcnJvcj86IHN0cmluZztcbn1cblxuLyoqXG4gKiBMaXN0cyB0aGUgdGVuYW50cyB0aGUgY3VycmVudCB1c2VyIGhvbGRzIGEgcm9sZSBpbiBhbmQgcnVucyB3b3JrIGFjcm9zcyB0aGVtLlxuICovXG5leHBvcnQgY2xhc3MgVGVuYW50cyB7XG5cbiAgICAvKipcbiAgICAgKiBXaGV0aGVyIHJ1bnMgYWNyb3NzIHRlbmFudHMgYXJlIGF2YWlsYWJsZSBvbiB0aGlzIGluc3RhbmNlLlxuICAgICAqXG4gICAgICogQHJldHVybnMgVHJ1ZSB3aXRoIHRoZSB0b2tlbi1ncm91cHMgdGVuYW50IHJlc29sdXRpb24uXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBpc0F2YWlsYWJsZSgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIFRlbmFudHNGYWNhZGUuaXNBdmFpbGFibGUoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgdGVuYW50cyB0aGUgY3VycmVudCB1c2VyIGhvbGRzIGEgcm9sZSBpbiBhbmQgY2FuIGVudGVyIG5vdy5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIFRoZSB0ZW5hbnRzLCB3aXRoIHRoZSByb2xlcyBoZWxkIGluIGVhY2guXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBnZXRHcmFudGVkVGVuYW50cygpOiBHcmFudGVkVGVuYW50W10ge1xuICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShUZW5hbnRzRmFjYWRlLmdldEdyYW50ZWRUZW5hbnRzKCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJ1bnMgdGhlIHdvcmsgb25jZSBwZXIgdGVuYW50IHRoZSBjdXJyZW50IHVzZXIgY2FuIGVudGVyLCBpbiB0aGF0IHRlbmFudCdzIGRhdGEgYW5kIHdpdGggdGhhdCB0ZW5hbnQncyByb2xlcy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBvcGVyYXRpb24gV2hhdCB0aGUgcnVuIGRvZXMsIHJlY29yZGVkIGluIHRoZSBhdWRpdCB0cmFpbCAoZS5nLiAncGVyaW9kLWNsb3NlJykuXG4gICAgICogQHBhcmFtIHdvcmsgVGhlIHdvcmssIGdpdmVuIHRoZSBpZCBvZiB0aGUgdGVuYW50IGl0IHJ1bnMgaW4uXG4gICAgICogQHJldHVybnMgT25lIHJlc3VsdCBwZXIgdGVuYW50LlxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgZm9yRWFjaEdyYW50ZWRUZW5hbnQ8VD4ob3BlcmF0aW9uOiBzdHJpbmcsIHdvcms6ICh0ZW5hbnRJZDogc3RyaW5nKSA9PiBUKTogQ3Jvc3NUZW5hbnRSZXN1bHQ8VD5bXSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdHMgPSBUZW5hbnRzRmFjYWRlLmZvckVhY2hHcmFudGVkVGVuYW50KG9wZXJhdGlvbiwgKHRlbmFudElkOiBzdHJpbmcpID0+IHdvcmsodGVuYW50SWQpKTtcbiAgICAgICAgY29uc3QgbWFwcGVkOiBDcm9zc1RlbmFudFJlc3VsdDxUPltdID0gW107XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmVzdWx0cy5zaXplKCk7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgciA9IHJlc3VsdHMuZ2V0KGkpO1xuICAgICAgICAgICAgbWFwcGVkLnB1c2goe1xuICAgICAgICAgICAgICAgIHRlbmFudElkOiByLnRlbmFudElkKCksXG4gICAgICAgICAgICAgICAgc3VjY2VlZGVkOiByLnN1Y2NlZWRlZCgpLFxuICAgICAgICAgICAgICAgIHJlc3VsdDogci5zdWNjZWVkZWQoKSA/IHIucmVzdWx0KCkgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgZXJyb3I6IHIuZXJyb3IoKSA/PyB1bmRlZmluZWRcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtYXBwZWQ7XG4gICAgfVxufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBK0JBLE1BQU0sZ0JBQWdCLEtBQUssS0FBSyw2REFBNkQ7QUErQnRGLE1BQU0sUUFBUTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU9qQixPQUFjLGNBQXVCO0FBQ2pDLFdBQU8sY0FBYyxZQUFZO0FBQUEsRUFDckM7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFPQSxPQUFjLG9CQUFxQztBQUMvQyxXQUFPLEtBQUssTUFBTSxjQUFjLGtCQUFrQixDQUFDO0FBQUEsRUFDdkQ7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBU0EsT0FBYyxxQkFBd0IsV0FBbUIsTUFBdUQ7QUFDNUcsVUFBTSxVQUFVLGNBQWMscUJBQXFCLFdBQVcsQ0FBQyxhQUFxQixLQUFLLFFBQVEsQ0FBQztBQUNsRyxVQUFNLFNBQWlDLENBQUM7QUFDeEMsYUFBUyxJQUFJLEdBQUcsSUFBSSxRQUFRLEtBQUssR0FBRyxLQUFLO0FBQ3JDLFlBQU0sSUFBSSxRQUFRLElBQUksQ0FBQztBQUN2QixhQUFPLEtBQUs7QUFBQSxRQUNSLFVBQVUsRUFBRSxTQUFTO0FBQUEsUUFDckIsV0FBVyxFQUFFLFVBQVU7QUFBQSxRQUN2QixRQUFRLEVBQUUsVUFBVSxJQUFJLEVBQUUsT0FBTyxJQUFJO0FBQUEsUUFDckMsT0FBTyxFQUFFLE1BQU0sS0FBSztBQUFBLE1BQ3hCLENBQUM7QUFBQSxJQUNMO0FBQ0EsV0FBTztBQUFBLEVBQ1g7QUFDSjsiLAogICJuYW1lcyI6IFtdCn0K
@@ -9,11 +9,13 @@
9
9
  *
10
10
  * The main components of this module are:
11
11
  * - User: User identity and authentication utilities.
12
+ * - Tenants: The tenants the user holds a role in, and runs across them.
12
13
  * - OAuth: OAuth2 integration helpers for authentication flows.
13
14
  * - Decorators: Security decorators for endpoint access control.
14
15
  */
15
16
  export * from "./user";
16
17
  export { User as user } from "./user";
18
+ export * from "./tenants";
17
19
  export * from "./oauth";
18
20
  export * from "./decorators";
19
21
  export * as decorators from "./decorators";
@@ -0,0 +1,79 @@
1
+ /**
2
+ * @module security/tenants
3
+ * @package @aerokit/sdk/security
4
+ * @name Tenants
5
+ * @overview
6
+ *
7
+ * The Tenants class lists the tenants the current user holds a role in and runs work across them. It is built for a user who works
8
+ * for many tenants at once - an accounting practice keeping the books of its clients, each one a tenant - and who has to run the same
9
+ * operation (a period close, a statutory file) in each of them.
10
+ *
11
+ * ### Key Features:
12
+ * - **Granted tenants**: the tenants the user's memberships grant and that can be entered now, with the roles held in each.
13
+ * - **Runs across tenants**: the work runs once per tenant, in that tenant's data and with that tenant's roles - never the roles of the
14
+ * tenant the session has selected. A failure in one tenant is reported for it and the run carries on with the next.
15
+ * - **Audit**: every visit is recorded in the cross-tenant audit trail, readable by each tenant's administrators.
16
+ *
17
+ * Available with the token-groups tenant resolution only (`DIRIGIBLE_TENANT_RESOLUTION_STRATEGY=TOKEN_GROUPS`); check
18
+ * `Tenants.isAvailable()` first.
19
+ *
20
+ * ### Example Usage:
21
+ * ```ts
22
+ * import { Tenants } from "@aerokit/sdk/security";
23
+ *
24
+ * const results = Tenants.forEachGrantedTenant("period-close", (tenantId) => {
25
+ * // runs with the data and the roles of tenantId
26
+ * return closePeriod("2026-09");
27
+ * });
28
+ * results.filter(r => !r.succeeded).forEach(r => console.error(`${r.tenantId}: ${r.error}`));
29
+ * ```
30
+ */
31
+ /**
32
+ * A tenant the current user holds a role in.
33
+ */
34
+ export interface GrantedTenant {
35
+ /** The tenant id. */
36
+ id: string;
37
+ /** The tenant name. */
38
+ name: string;
39
+ /** The roles held in the tenant. */
40
+ roles: string[];
41
+ }
42
+ /**
43
+ * What one tenant's visit of a run came to.
44
+ */
45
+ export interface CrossTenantResult<T> {
46
+ /** The tenant visited. */
47
+ tenantId: string;
48
+ /** Whether the work returned normally. */
49
+ succeeded: boolean;
50
+ /** What the work returned; undefined on a failure. */
51
+ result?: T;
52
+ /** Why the work failed; undefined on a success. */
53
+ error?: string;
54
+ }
55
+ /**
56
+ * Lists the tenants the current user holds a role in and runs work across them.
57
+ */
58
+ export declare class Tenants {
59
+ /**
60
+ * Whether runs across tenants are available on this instance.
61
+ *
62
+ * @returns True with the token-groups tenant resolution.
63
+ */
64
+ static isAvailable(): boolean;
65
+ /**
66
+ * The tenants the current user holds a role in and can enter now.
67
+ *
68
+ * @returns The tenants, with the roles held in each.
69
+ */
70
+ static getGrantedTenants(): GrantedTenant[];
71
+ /**
72
+ * Runs the work once per tenant the current user can enter, in that tenant's data and with that tenant's roles.
73
+ *
74
+ * @param operation What the run does, recorded in the audit trail (e.g. 'period-close').
75
+ * @param work The work, given the id of the tenant it runs in.
76
+ * @returns One result per tenant.
77
+ */
78
+ static forEachGrantedTenant<T>(operation: string, work: (tenantId: string) => T): CrossTenantResult<T>[];
79
+ }
@@ -1,5 +1,6 @@
1
1
  export * from "./user";
2
2
  import { User } from "./user";
3
+ export * from "./tenants";
3
4
  export * from "./oauth";
4
5
  export * from "./decorators";
5
6
  import * as decorators from "./decorators";
@@ -7,4 +8,4 @@ export {
7
8
  decorators,
8
9
  User as user
9
10
  };
10
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL3NlY3VyaXR5L2luZGV4LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBtb2R1bGUgc2VjdXJpdHkvaW5kZXhcbiAqIEBwYWNrYWdlIEBhZXJva2l0L3Nkay9zZWN1cml0eVxuICogQG92ZXJ2aWV3XG4gKlxuICogUHJvdmlkZXMgc2VjdXJpdHkgaGVscGVycyBmb3IgdXNlciBhdXRoZW50aWNhdGlvbiwgT0F1dGggZmxvd3MsIGFuZCBtZXRhZGF0YSBkZWNvcmF0b3JzLlxuICogSXQgZXhwb3NlcyB1c2VyIG1hbmFnZW1lbnQgdXRpbGl0aWVzLCBPQXV0aCBpbnRlZ3JhdGlvbiwgYW5kIHVzZWZ1bCBzZWN1cml0eSBkZWNvcmF0b3JzXG4gKiBmb3IgcHJvdGVjdGVkIHJvdXRlIGhhbmRsaW5nIGFuZCByb2xlLWJhc2VkIGFjY2VzcyBjb250cm9sLlxuICpcbiAqIFRoZSBtYWluIGNvbXBvbmVudHMgb2YgdGhpcyBtb2R1bGUgYXJlOlxuICogLSBVc2VyOiBVc2VyIGlkZW50aXR5IGFuZCBhdXRoZW50aWNhdGlvbiB1dGlsaXRpZXMuXG4gKiAtIE9BdXRoOiBPQXV0aDIgaW50ZWdyYXRpb24gaGVscGVycyBmb3IgYXV0aGVudGljYXRpb24gZmxvd3MuXG4gKiAtIERlY29yYXRvcnM6IFNlY3VyaXR5IGRlY29yYXRvcnMgZm9yIGVuZHBvaW50IGFjY2VzcyBjb250cm9sLlxuICovXG5cbmV4cG9ydCAqIGZyb20gXCIuL3VzZXJcIjtcbmV4cG9ydCB7IFVzZXIgYXMgdXNlciB9IGZyb20gXCIuL3VzZXJcIjtcbmV4cG9ydCAqIGZyb20gXCIuL29hdXRoXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9kZWNvcmF0b3JzXCI7XG5leHBvcnQgKiBhcyBkZWNvcmF0b3JzIGZyb20gXCIuL2RlY29yYXRvcnNcIjtcbiJdLAogICJtYXBwaW5ncyI6ICJBQWVBLGNBQWM7QUFDZCxTQUFpQixZQUFZO0FBQzdCLGNBQWM7QUFDZCxjQUFjO0FBQ2QsWUFBWSxnQkFBZ0I7IiwKICAibmFtZXMiOiBbXQp9Cg==
11
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL3NlY3VyaXR5L2luZGV4LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBtb2R1bGUgc2VjdXJpdHkvaW5kZXhcbiAqIEBwYWNrYWdlIEBhZXJva2l0L3Nkay9zZWN1cml0eVxuICogQG92ZXJ2aWV3XG4gKlxuICogUHJvdmlkZXMgc2VjdXJpdHkgaGVscGVycyBmb3IgdXNlciBhdXRoZW50aWNhdGlvbiwgT0F1dGggZmxvd3MsIGFuZCBtZXRhZGF0YSBkZWNvcmF0b3JzLlxuICogSXQgZXhwb3NlcyB1c2VyIG1hbmFnZW1lbnQgdXRpbGl0aWVzLCBPQXV0aCBpbnRlZ3JhdGlvbiwgYW5kIHVzZWZ1bCBzZWN1cml0eSBkZWNvcmF0b3JzXG4gKiBmb3IgcHJvdGVjdGVkIHJvdXRlIGhhbmRsaW5nIGFuZCByb2xlLWJhc2VkIGFjY2VzcyBjb250cm9sLlxuICpcbiAqIFRoZSBtYWluIGNvbXBvbmVudHMgb2YgdGhpcyBtb2R1bGUgYXJlOlxuICogLSBVc2VyOiBVc2VyIGlkZW50aXR5IGFuZCBhdXRoZW50aWNhdGlvbiB1dGlsaXRpZXMuXG4gKiAtIFRlbmFudHM6IFRoZSB0ZW5hbnRzIHRoZSB1c2VyIGhvbGRzIGEgcm9sZSBpbiwgYW5kIHJ1bnMgYWNyb3NzIHRoZW0uXG4gKiAtIE9BdXRoOiBPQXV0aDIgaW50ZWdyYXRpb24gaGVscGVycyBmb3IgYXV0aGVudGljYXRpb24gZmxvd3MuXG4gKiAtIERlY29yYXRvcnM6IFNlY3VyaXR5IGRlY29yYXRvcnMgZm9yIGVuZHBvaW50IGFjY2VzcyBjb250cm9sLlxuICovXG5cbmV4cG9ydCAqIGZyb20gXCIuL3VzZXJcIjtcbmV4cG9ydCB7IFVzZXIgYXMgdXNlciB9IGZyb20gXCIuL3VzZXJcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3RlbmFudHNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL29hdXRoXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9kZWNvcmF0b3JzXCI7XG5leHBvcnQgKiBhcyBkZWNvcmF0b3JzIGZyb20gXCIuL2RlY29yYXRvcnNcIjtcbiJdLAogICJtYXBwaW5ncyI6ICJBQWdCQSxjQUFjO0FBQ2QsU0FBaUIsWUFBWTtBQUM3QixjQUFjO0FBQ2QsY0FBYztBQUNkLGNBQWM7QUFDZCxZQUFZLGdCQUFnQjsiLAogICJuYW1lcyI6IFtdCn0K
@@ -0,0 +1,44 @@
1
+ const TenantsFacade = Java.type("org.eclipse.dirigible.components.api.security.TenantsFacade");
2
+ class Tenants {
3
+ /**
4
+ * Whether runs across tenants are available on this instance.
5
+ *
6
+ * @returns True with the token-groups tenant resolution.
7
+ */
8
+ static isAvailable() {
9
+ return TenantsFacade.isAvailable();
10
+ }
11
+ /**
12
+ * The tenants the current user holds a role in and can enter now.
13
+ *
14
+ * @returns The tenants, with the roles held in each.
15
+ */
16
+ static getGrantedTenants() {
17
+ return JSON.parse(TenantsFacade.getGrantedTenants());
18
+ }
19
+ /**
20
+ * Runs the work once per tenant the current user can enter, in that tenant's data and with that tenant's roles.
21
+ *
22
+ * @param operation What the run does, recorded in the audit trail (e.g. 'period-close').
23
+ * @param work The work, given the id of the tenant it runs in.
24
+ * @returns One result per tenant.
25
+ */
26
+ static forEachGrantedTenant(operation, work) {
27
+ const results = TenantsFacade.forEachGrantedTenant(operation, (tenantId) => work(tenantId));
28
+ const mapped = [];
29
+ for (let i = 0; i < results.size(); i++) {
30
+ const r = results.get(i);
31
+ mapped.push({
32
+ tenantId: r.tenantId(),
33
+ succeeded: r.succeeded(),
34
+ result: r.succeeded() ? r.result() : void 0,
35
+ error: r.error() ?? void 0
36
+ });
37
+ }
38
+ return mapped;
39
+ }
40
+ }
41
+ export {
42
+ Tenants
43
+ };
44
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL3NlY3VyaXR5L3RlbmFudHMudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQG1vZHVsZSBzZWN1cml0eS90ZW5hbnRzXG4gKiBAcGFja2FnZSBAYWVyb2tpdC9zZGsvc2VjdXJpdHlcbiAqIEBuYW1lIFRlbmFudHNcbiAqIEBvdmVydmlld1xuICpcbiAqIFRoZSBUZW5hbnRzIGNsYXNzIGxpc3RzIHRoZSB0ZW5hbnRzIHRoZSBjdXJyZW50IHVzZXIgaG9sZHMgYSByb2xlIGluIGFuZCBydW5zIHdvcmsgYWNyb3NzIHRoZW0uIEl0IGlzIGJ1aWx0IGZvciBhIHVzZXIgd2hvIHdvcmtzXG4gKiBmb3IgbWFueSB0ZW5hbnRzIGF0IG9uY2UgLSBhbiBhY2NvdW50aW5nIHByYWN0aWNlIGtlZXBpbmcgdGhlIGJvb2tzIG9mIGl0cyBjbGllbnRzLCBlYWNoIG9uZSBhIHRlbmFudCAtIGFuZCB3aG8gaGFzIHRvIHJ1biB0aGUgc2FtZVxuICogb3BlcmF0aW9uIChhIHBlcmlvZCBjbG9zZSwgYSBzdGF0dXRvcnkgZmlsZSkgaW4gZWFjaCBvZiB0aGVtLlxuICpcbiAqICMjIyBLZXkgRmVhdHVyZXM6XG4gKiAtICoqR3JhbnRlZCB0ZW5hbnRzKio6IHRoZSB0ZW5hbnRzIHRoZSB1c2VyJ3MgbWVtYmVyc2hpcHMgZ3JhbnQgYW5kIHRoYXQgY2FuIGJlIGVudGVyZWQgbm93LCB3aXRoIHRoZSByb2xlcyBoZWxkIGluIGVhY2guXG4gKiAtICoqUnVucyBhY3Jvc3MgdGVuYW50cyoqOiB0aGUgd29yayBydW5zIG9uY2UgcGVyIHRlbmFudCwgaW4gdGhhdCB0ZW5hbnQncyBkYXRhIGFuZCB3aXRoIHRoYXQgdGVuYW50J3Mgcm9sZXMgLSBuZXZlciB0aGUgcm9sZXMgb2YgdGhlXG4gKiAgIHRlbmFudCB0aGUgc2Vzc2lvbiBoYXMgc2VsZWN0ZWQuIEEgZmFpbHVyZSBpbiBvbmUgdGVuYW50IGlzIHJlcG9ydGVkIGZvciBpdCBhbmQgdGhlIHJ1biBjYXJyaWVzIG9uIHdpdGggdGhlIG5leHQuXG4gKiAtICoqQXVkaXQqKjogZXZlcnkgdmlzaXQgaXMgcmVjb3JkZWQgaW4gdGhlIGNyb3NzLXRlbmFudCBhdWRpdCB0cmFpbCwgcmVhZGFibGUgYnkgZWFjaCB0ZW5hbnQncyBhZG1pbmlzdHJhdG9ycy5cbiAqXG4gKiBBdmFpbGFibGUgd2l0aCB0aGUgdG9rZW4tZ3JvdXBzIHRlbmFudCByZXNvbHV0aW9uIG9ubHkgKGBESVJJR0lCTEVfVEVOQU5UX1JFU09MVVRJT05fU1RSQVRFR1k9VE9LRU5fR1JPVVBTYCk7IGNoZWNrXG4gKiBgVGVuYW50cy5pc0F2YWlsYWJsZSgpYCBmaXJzdC5cbiAqXG4gKiAjIyMgRXhhbXBsZSBVc2FnZTpcbiAqIGBgYHRzXG4gKiBpbXBvcnQgeyBUZW5hbnRzIH0gZnJvbSBcIkBhZXJva2l0L3Nkay9zZWN1cml0eVwiO1xuICpcbiAqIGNvbnN0IHJlc3VsdHMgPSBUZW5hbnRzLmZvckVhY2hHcmFudGVkVGVuYW50KFwicGVyaW9kLWNsb3NlXCIsICh0ZW5hbnRJZCkgPT4ge1xuICogICAgIC8vIHJ1bnMgd2l0aCB0aGUgZGF0YSBhbmQgdGhlIHJvbGVzIG9mIHRlbmFudElkXG4gKiAgICAgcmV0dXJuIGNsb3NlUGVyaW9kKFwiMjAyNi0wOVwiKTtcbiAqIH0pO1xuICogcmVzdWx0cy5maWx0ZXIociA9PiAhci5zdWNjZWVkZWQpLmZvckVhY2gociA9PiBjb25zb2xlLmVycm9yKGAke3IudGVuYW50SWR9OiAke3IuZXJyb3J9YCkpO1xuICogYGBgXG4gKi9cblxuY29uc3QgVGVuYW50c0ZhY2FkZSA9IEphdmEudHlwZShcIm9yZy5lY2xpcHNlLmRpcmlnaWJsZS5jb21wb25lbnRzLmFwaS5zZWN1cml0eS5UZW5hbnRzRmFjYWRlXCIpO1xuXG4vKipcbiAqIEEgdGVuYW50IHRoZSBjdXJyZW50IHVzZXIgaG9sZHMgYSByb2xlIGluLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEdyYW50ZWRUZW5hbnQge1xuICAgIC8qKiBUaGUgdGVuYW50IGlkLiAqL1xuICAgIGlkOiBzdHJpbmc7XG4gICAgLyoqIFRoZSB0ZW5hbnQgbmFtZS4gKi9cbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgLyoqIFRoZSByb2xlcyBoZWxkIGluIHRoZSB0ZW5hbnQuICovXG4gICAgcm9sZXM6IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIFdoYXQgb25lIHRlbmFudCdzIHZpc2l0IG9mIGEgcnVuIGNhbWUgdG8uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3Jvc3NUZW5hbnRSZXN1bHQ8VD4ge1xuICAgIC8qKiBUaGUgdGVuYW50IHZpc2l0ZWQuICovXG4gICAgdGVuYW50SWQ6IHN0cmluZztcbiAgICAvKiogV2hldGhlciB0aGUgd29yayByZXR1cm5lZCBub3JtYWxseS4gKi9cbiAgICBzdWNjZWVkZWQ6IGJvb2xlYW47XG4gICAgLyoqIFdoYXQgdGhlIHdvcmsgcmV0dXJuZWQ7IHVuZGVmaW5lZCBvbiBhIGZhaWx1cmUuICovXG4gICAgcmVzdWx0PzogVDtcbiAgICAvKiogV2h5IHRoZSB3b3JrIGZhaWxlZDsgdW5kZWZpbmVkIG9uIGEgc3VjY2Vzcy4gKi9cbiAgICBlcnJvcj86IHN0cmluZztcbn1cblxuLyoqXG4gKiBMaXN0cyB0aGUgdGVuYW50cyB0aGUgY3VycmVudCB1c2VyIGhvbGRzIGEgcm9sZSBpbiBhbmQgcnVucyB3b3JrIGFjcm9zcyB0aGVtLlxuICovXG5leHBvcnQgY2xhc3MgVGVuYW50cyB7XG5cbiAgICAvKipcbiAgICAgKiBXaGV0aGVyIHJ1bnMgYWNyb3NzIHRlbmFudHMgYXJlIGF2YWlsYWJsZSBvbiB0aGlzIGluc3RhbmNlLlxuICAgICAqXG4gICAgICogQHJldHVybnMgVHJ1ZSB3aXRoIHRoZSB0b2tlbi1ncm91cHMgdGVuYW50IHJlc29sdXRpb24uXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBpc0F2YWlsYWJsZSgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIFRlbmFudHNGYWNhZGUuaXNBdmFpbGFibGUoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgdGVuYW50cyB0aGUgY3VycmVudCB1c2VyIGhvbGRzIGEgcm9sZSBpbiBhbmQgY2FuIGVudGVyIG5vdy5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIFRoZSB0ZW5hbnRzLCB3aXRoIHRoZSByb2xlcyBoZWxkIGluIGVhY2guXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBnZXRHcmFudGVkVGVuYW50cygpOiBHcmFudGVkVGVuYW50W10ge1xuICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShUZW5hbnRzRmFjYWRlLmdldEdyYW50ZWRUZW5hbnRzKCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJ1bnMgdGhlIHdvcmsgb25jZSBwZXIgdGVuYW50IHRoZSBjdXJyZW50IHVzZXIgY2FuIGVudGVyLCBpbiB0aGF0IHRlbmFudCdzIGRhdGEgYW5kIHdpdGggdGhhdCB0ZW5hbnQncyByb2xlcy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBvcGVyYXRpb24gV2hhdCB0aGUgcnVuIGRvZXMsIHJlY29yZGVkIGluIHRoZSBhdWRpdCB0cmFpbCAoZS5nLiAncGVyaW9kLWNsb3NlJykuXG4gICAgICogQHBhcmFtIHdvcmsgVGhlIHdvcmssIGdpdmVuIHRoZSBpZCBvZiB0aGUgdGVuYW50IGl0IHJ1bnMgaW4uXG4gICAgICogQHJldHVybnMgT25lIHJlc3VsdCBwZXIgdGVuYW50LlxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgZm9yRWFjaEdyYW50ZWRUZW5hbnQ8VD4ob3BlcmF0aW9uOiBzdHJpbmcsIHdvcms6ICh0ZW5hbnRJZDogc3RyaW5nKSA9PiBUKTogQ3Jvc3NUZW5hbnRSZXN1bHQ8VD5bXSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdHMgPSBUZW5hbnRzRmFjYWRlLmZvckVhY2hHcmFudGVkVGVuYW50KG9wZXJhdGlvbiwgKHRlbmFudElkOiBzdHJpbmcpID0+IHdvcmsodGVuYW50SWQpKTtcbiAgICAgICAgY29uc3QgbWFwcGVkOiBDcm9zc1RlbmFudFJlc3VsdDxUPltdID0gW107XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmVzdWx0cy5zaXplKCk7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgciA9IHJlc3VsdHMuZ2V0KGkpO1xuICAgICAgICAgICAgbWFwcGVkLnB1c2goe1xuICAgICAgICAgICAgICAgIHRlbmFudElkOiByLnRlbmFudElkKCksXG4gICAgICAgICAgICAgICAgc3VjY2VlZGVkOiByLnN1Y2NlZWRlZCgpLFxuICAgICAgICAgICAgICAgIHJlc3VsdDogci5zdWNjZWVkZWQoKSA/IHIucmVzdWx0KCkgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgZXJyb3I6IHIuZXJyb3IoKSA/PyB1bmRlZmluZWRcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtYXBwZWQ7XG4gICAgfVxufVxuIl0sCiAgIm1hcHBpbmdzIjogIkFBK0JBLE1BQU0sZ0JBQWdCLEtBQUssS0FBSyw2REFBNkQ7QUErQnRGLE1BQU0sUUFBUTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU9qQixPQUFjLGNBQXVCO0FBQ2pDLFdBQU8sY0FBYyxZQUFZO0FBQUEsRUFDckM7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFPQSxPQUFjLG9CQUFxQztBQUMvQyxXQUFPLEtBQUssTUFBTSxjQUFjLGtCQUFrQixDQUFDO0FBQUEsRUFDdkQ7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBU0EsT0FBYyxxQkFBd0IsV0FBbUIsTUFBdUQ7QUFDNUcsVUFBTSxVQUFVLGNBQWMscUJBQXFCLFdBQVcsQ0FBQyxhQUFxQixLQUFLLFFBQVEsQ0FBQztBQUNsRyxVQUFNLFNBQWlDLENBQUM7QUFDeEMsYUFBUyxJQUFJLEdBQUcsSUFBSSxRQUFRLEtBQUssR0FBRyxLQUFLO0FBQ3JDLFlBQU0sSUFBSSxRQUFRLElBQUksQ0FBQztBQUN2QixhQUFPLEtBQUs7QUFBQSxRQUNSLFVBQVUsRUFBRSxTQUFTO0FBQUEsUUFDckIsV0FBVyxFQUFFLFVBQVU7QUFBQSxRQUN2QixRQUFRLEVBQUUsVUFBVSxJQUFJLEVBQUUsT0FBTyxJQUFJO0FBQUEsUUFDckMsT0FBTyxFQUFFLE1BQU0sS0FBSztBQUFBLE1BQ3hCLENBQUM7QUFBQSxJQUNMO0FBQ0EsV0FBTztBQUFBLEVBQ1g7QUFDSjsiLAogICJuYW1lcyI6IFtdCn0K
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aerokit/sdk",
3
- "version": "14.89.0",
3
+ "version": "14.91.0",
4
4
  "description": "Unified TypeScript SDK for modern cloud platforms.",
5
5
  "scripts": {
6
6
  "clean": "rm -rf dist",
@@ -92,7 +92,8 @@ export function crudFlow(manifest, entity, opts = {}) {
92
92
  // Save is disabled again once the re-read header is the new pristine state - leaving before
93
93
  // that would meet the unsaved-changes guard
94
94
  await expect(save).toBeDisabled();
95
- await page.getByRole('button', { name: 'Back to list', exact: true }).click();
95
+ // A clean document's dismiss is Cancel (dirigible #7770).
96
+ await page.getByRole('button', { name: 'Cancel', exact: true }).click();
96
97
  } else {
97
98
  await page.getByRole('button', { name: 'Save', exact: true }).click();
98
99
  }