@abhi1693/medusa-rbac 0.0.1 → 0.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (35) hide show
  1. package/.medusa/server/src/admin/index.js +43 -25
  2. package/.medusa/server/src/admin/index.mjs +43 -25
  3. package/.medusa/server/src/admin/lib/access.d.ts +6 -3
  4. package/.medusa/server/src/admin/lib/access.js +1 -1
  5. package/.medusa/server/src/api/admin/access/me/route.js +3 -1
  6. package/.medusa/server/src/api/admin/access/permissions/route.js +4 -1
  7. package/.medusa/server/src/api/middlewares/enforce-admin-access.js +49 -61
  8. package/.medusa/server/src/index.d.ts +1 -0
  9. package/.medusa/server/src/index.js +2 -1
  10. package/.medusa/server/src/lib/access/config.d.ts +6 -0
  11. package/.medusa/server/src/lib/access/config.js +110 -14
  12. package/.medusa/server/src/lib/access/explain.d.ts +1 -1
  13. package/.medusa/server/src/lib/access/explain.js +3 -2
  14. package/.medusa/server/src/lib/access/immutable-config.d.ts +2 -0
  15. package/.medusa/server/src/lib/access/immutable-config.js +17 -0
  16. package/.medusa/server/src/lib/access/native-resources.d.ts +3 -0
  17. package/.medusa/server/src/lib/access/native-resources.js +444 -0
  18. package/.medusa/server/src/lib/access/permission-key.d.ts +1 -1
  19. package/.medusa/server/src/lib/access/permission-key.js +3 -2
  20. package/.medusa/server/src/lib/access/permissions.d.ts +7 -0
  21. package/.medusa/server/src/lib/access/permissions.js +15 -2
  22. package/.medusa/server/src/lib/access/policy.d.ts +12 -3
  23. package/.medusa/server/src/lib/access/policy.js +149 -264
  24. package/.medusa/server/src/lib/access/resources.d.ts +107 -0
  25. package/.medusa/server/src/lib/access/resources.js +363 -0
  26. package/.medusa/server/src/lib/access/route-facts.d.ts +24 -0
  27. package/.medusa/server/src/lib/access/route-facts.js +77 -0
  28. package/.medusa/server/src/lib/access/write-permissions.d.ts +2 -0
  29. package/.medusa/server/src/lib/access/write-permissions.js +40 -0
  30. package/.medusa/server/src/modules/access-control/service.d.ts +4 -0
  31. package/.medusa/server/src/modules/access-control/service.js +8 -3
  32. package/.medusa/server/src/resources.d.ts +2 -0
  33. package/.medusa/server/src/resources.js +18 -0
  34. package/README.md +71 -9
  35. package/package.json +11 -7
@@ -3,20 +3,19 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.enforceAdminAccess = enforceAdminAccess;
4
4
  const utils_1 = require("@medusajs/framework/utils");
5
5
  const access_control_1 = require("../../modules/access-control");
6
+ const route_facts_1 = require("../../lib/access/route-facts");
7
+ const native_resources_1 = require("../../lib/access/native-resources");
8
+ const resources_1 = require("../../lib/access/resources");
9
+ const permissions_1 = require("../../lib/access/permissions");
6
10
  const policy_1 = require("../../lib/access/policy");
7
11
  async function enforceAdminAccess(request, res, next) {
8
12
  const req = request;
9
13
  try {
10
- const path = (0, policy_1.normalizedPath)(req.originalUrl);
11
- if (!path)
14
+ if (!(0, route_facts_1.canonicalPath)(req.originalUrl))
12
15
  return res
13
16
  .status(403)
14
17
  .json({ message: "Ambiguous Admin path is not allowed" });
15
- // This native route verifies its invitation token and accepts an unregistered identity.
16
- if (path === "/admin/invites/accept" && req.method === "POST")
17
- return next();
18
- // Medusa exposes these static capability flags before login; preserve that contract.
19
- if (path === "/admin/feature-flags" && ["GET", "HEAD"].includes(req.method))
18
+ if ((0, native_resources_1.describeNative)(req.method, req.originalUrl, req.body)?.access === "public")
20
19
  return next();
21
20
  const auth = req.auth_context;
22
21
  if (auth?.actor_type !== "user" || !auth.actor_id)
@@ -24,69 +23,58 @@ async function enforceAdminAccess(request, res, next) {
24
23
  .status(401)
25
24
  .json({ message: "An authenticated staff account is required" });
26
25
  res.setHeader("Cache-Control", "no-store");
27
- const users = req.scope.resolve(utils_1.Modules.USER);
28
- await users.retrieveUser(auth.actor_id, { select: ["id"] });
26
+ await req.scope
27
+ .resolve(utils_1.Modules.USER)
28
+ .retrieveUser(auth.actor_id, { select: ["id"] });
29
29
  const access = req.scope.resolve(access_control_1.ACCESS_CONTROL);
30
- if ((0, policy_1.isSelfProfileUpdate)(req.method, path, auth.actor_id, req.body)) {
31
- req.query.fields = "id,email,first_name,last_name,avatar_url";
30
+ const principal = await access.principal(auth.actor_id);
31
+ const native = (0, native_resources_1.describeNative)(req.method, req.originalUrl, req.body, auth.actor_id);
32
+ // The native account lookup and current persisted assignment above establish
33
+ // Superuser authority. Keep guarded account-deletion redirects below, while
34
+ // native routes and validators own all other Superuser operations.
35
+ if ((0, permissions_1.isSuperuser)(principal) && !native?.action.redirect) {
36
+ const ruleValue = (0, policy_1.nativePromotionRuleValue)(native?.resource || "", native?.params || {}, req.query);
37
+ if (ruleValue !== undefined) {
38
+ req.query.value = ruleValue;
39
+ delete req.query.id;
40
+ }
32
41
  return next();
33
42
  }
34
- const principal = await access.principal(auth.actor_id);
35
- const resource = path.split("/")[2];
36
- const selfRead = (0, policy_1.isBootstrapRead)(req.method, path);
37
- if (selfRead && path === "/admin/users/me")
38
- req.query.fields = "id,email,first_name,last_name,avatar_url";
39
- if (selfRead &&
40
- path === "/admin/stores" &&
41
- (!principal.active ||
42
- !access.allows(principal, "settings.view", await access.permissionContext(req))))
43
- req.query.fields = "id,name";
44
- if (!selfRead && !principal.active)
45
- return res
46
- .status(403)
47
- .json({ message: "Staff access is inactive or has not been assigned" });
48
- const policy = access.policyFor(req.method, path);
43
+ const descriptor = await access.resolveRequest(req);
49
44
  const context = await access.permissionContext(req);
50
45
  const allowed = (permission) => access.allows(principal, permission, context);
51
- if (!policy ||
52
- (!selfRead &&
53
- (!principal.active ||
54
- (policy.superuser && !principal.is_superuser) ||
55
- !policy.permissions.every(allowed))))
46
+ if (!descriptor || !(0, resources_1.operationAllowed)(principal, descriptor, allowed))
56
47
  return res
57
48
  .status(403)
58
49
  .json({ message: "You do not have permission for this operation" });
59
- if (["GET", "HEAD"].includes(req.method) &&
60
- !(0, policy_1.validateFieldSelection)(resource, req.query.fields)) {
61
- return res
62
- .status(403)
63
- .json({ message: "This field selection is not allowed" });
64
- }
65
- if (typeof req.query.fields === "string" &&
66
- req.query.fields.includes("inventory") &&
67
- !allowed("inventory.view")) {
68
- return res
69
- .status(403)
70
- .json({ message: "Inventory access is required for these fields" });
71
- }
72
- if (["products", "product-variants"].includes(resource) &&
73
- !["GET", "HEAD"].includes(req.method)) {
74
- if ((0, policy_1.additionalWritePermissions)(req.body, req.method === "POST" &&
75
- (path === "/admin/products" ||
76
- /^\/admin\/products\/[^/]+\/variants$/.test(path))).some((p) => !allowed(p))) {
77
- return res.status(403).json({
78
- message: "Additional permissions are required for the changed fields",
79
- });
50
+ if (descriptor.action.forceFields)
51
+ req.query.fields = descriptor.action.forceFields.join(",");
52
+ const fallback = descriptor.action.fallbackFields;
53
+ if (fallback && (!principal.active || !fallback.permissions.every(allowed)))
54
+ req.query.fields = fallback.fields.join(",");
55
+ if (["GET", "HEAD"].includes(req.method)) {
56
+ const ruleValue = (0, policy_1.nativePromotionRuleValue)(descriptor.resource, descriptor.params, req.query);
57
+ if (ruleValue !== undefined) {
58
+ req.query.value = ruleValue;
59
+ delete req.query.id;
80
60
  }
61
+ const fields = (0, policy_1.nativeFieldSelection)(descriptor.fieldResource, req.query.fields);
62
+ if (fields !== req.query.fields)
63
+ req.query.fields = fields;
64
+ if (!(0, policy_1.validateFieldSelection)(descriptor.fieldResource, req.query.fields, descriptor.fields))
65
+ return res
66
+ .status(403)
67
+ .json({ message: "This field selection is not allowed" });
81
68
  }
82
- if (req.method === "DELETE" && /^\/admin\/users\/[^/]+$/.test(path)) {
83
- // Keep native Admin actions on the guarded, compensatable public workflow.
84
- // 307 preserves DELETE; the destination independently checks authorization.
85
- const rawId = req.originalUrl
86
- .split("?")[0]
87
- .replace(/\/+$/, "")
88
- .split("/")[3];
89
- return res.redirect(307, `/admin/access/staff/${encodeURIComponent(decodeURIComponent(rawId))}`);
69
+ if (typeof req.query.fields === "string" &&
70
+ descriptor.fieldRequirements.some((requirement) => requirement.pattern.test(req.query.fields) &&
71
+ !requirement.permissions.every(allowed)))
72
+ return res.status(403).json({
73
+ message: "Additional permissions are required for these fields",
74
+ });
75
+ if (descriptor.action.redirect) {
76
+ const { destination, parameter } = descriptor.action.redirect;
77
+ return res.redirect(307, destination.replace(`:${parameter}`, encodeURIComponent(descriptor.params[parameter])));
90
78
  }
91
79
  return next();
92
80
  }
@@ -94,4 +82,4 @@ async function enforceAdminAccess(request, res, next) {
94
82
  return next(error);
95
83
  }
96
84
  }
97
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW5mb3JjZS1hZG1pbi1hY2Nlc3MuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvYXBpL21pZGRsZXdhcmVzL2VuZm9yY2UtYWRtaW4tYWNjZXNzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBa0JBLGdEQWtIQztBQTdIRCxxREFBbUQ7QUFDbkQsaUVBQTZEO0FBRTdELG9EQU1nQztBQUV6QixLQUFLLFVBQVUsa0JBQWtCLENBQ3RDLE9BQXNCLEVBQ3RCLEdBQW1CLEVBQ25CLElBQXdCO0lBRXhCLE1BQU0sR0FBRyxHQUFHLE9BQXFDLENBQUE7SUFDakQsSUFBSSxDQUFDO1FBQ0gsTUFBTSxJQUFJLEdBQUcsSUFBQSx1QkFBYyxFQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsQ0FBQTtRQUM1QyxJQUFJLENBQUMsSUFBSTtZQUNQLE9BQU8sR0FBRztpQkFDUCxNQUFNLENBQUMsR0FBRyxDQUFDO2lCQUNYLElBQUksQ0FBQyxFQUFFLE9BQU8sRUFBRSxxQ0FBcUMsRUFBRSxDQUFDLENBQUE7UUFDN0Qsd0ZBQXdGO1FBQ3hGLElBQUksSUFBSSxLQUFLLHVCQUF1QixJQUFJLEdBQUcsQ0FBQyxNQUFNLEtBQUssTUFBTTtZQUFFLE9BQU8sSUFBSSxFQUFFLENBQUE7UUFDNUUscUZBQXFGO1FBQ3JGLElBQUksSUFBSSxLQUFLLHNCQUFzQixJQUFJLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDO1lBQ3pFLE9BQU8sSUFBSSxFQUFFLENBQUE7UUFDZixNQUFNLElBQUksR0FBRyxHQUFHLENBQUMsWUFBWSxDQUFBO1FBQzdCLElBQUksSUFBSSxFQUFFLFVBQVUsS0FBSyxNQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUTtZQUMvQyxPQUFPLEdBQUc7aUJBQ1AsTUFBTSxDQUFDLEdBQUcsQ0FBQztpQkFDWCxJQUFJLENBQUMsRUFBRSxPQUFPLEVBQUUsNENB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
85
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW5mb3JjZS1hZG1pbi1hY2Nlc3MuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvYXBpL21pZGRsZXdhcmVzL2VuZm9yY2UtYWRtaW4tYWNjZXNzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBb0JBLGdEQWlIQztBQTlIRCxxREFBbUQ7QUFDbkQsaUVBQTZEO0FBRTdELDhEQUE0RDtBQUM1RCx3RUFBa0U7QUFDbEUsMERBQTZEO0FBQzdELDhEQUEwRDtBQUMxRCxvREFJZ0M7QUFFekIsS0FBSyxVQUFVLGtCQUFrQixDQUN0QyxPQUFzQixFQUN0QixHQUFtQixFQUNuQixJQUF3QjtJQUV4QixNQUFNLEdBQUcsR0FBRyxPQUFxQyxDQUFBO0lBQ2pELElBQUksQ0FBQztRQUNILElBQUksQ0FBQyxJQUFBLDJCQUFhLEVBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQztZQUNqQyxPQUFPLEdBQUc7aUJBQ1AsTUFBTSxDQUFDLEdBQUcsQ0FBQztpQkFDWCxJQUFJLENBQUMsRUFBRSxPQUFPLEVBQUUscUNBQXFDLEVBQUUsQ0FBQyxDQUFBO1FBQzdELElBQ0UsSUFBQSxpQ0FBYyxFQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsR0FBRyxDQUFDLFdBQVcsRUFBRSxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsTUFBTSxLQUFLLFFBQVE7WUFFMUUsT0FBTyxJQUFJLEVBQUUsQ0FBQTtRQUNmLE1BQU0sSUFBSSxHQUFHLEdBQUcsQ0FBQyxZQUFZLENBQUE7UUFDN0IsSUFBSSxJQUFJLEVBQUUsVUFBVSxLQUFLLE1BQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRO1lBQy9DLE9BQU8sR0FBRztpQkFDUCxNQUFNLENBQUMsR0FBRyxDQUFDO2lCQUNYLElBQUksQ0FBQyxFQUFFLE9BQU8sRUFBRSw0Q0FBNEMsRUFBRSxDQUFDLENBQUE7UUFDcEUsR0FBRyxDQUFDLFNBQVMsQ0FBQyxlQUFlLEVBQUUsVUFBVSxDQUFDLENBQUE7UUFD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
@@ -3,6 +3,7 @@ export { default as AccessControlService } from "./modules/access-control/servic
3
3
  export * from "./lib/access/permissions";
4
4
  export * from "./lib/access/config";
5
5
  export * from "./lib/access/roles";
6
+ export * from "./resources";
6
7
  export { requirePermission, requireAnyPermission, } from "./lib/access/middleware";
7
8
  export { definePermission } from "./lib/access/define-permission";
8
9
  export { explainPermission } from "./lib/access/explain";
@@ -25,6 +25,7 @@ Object.defineProperty(exports, "AccessControlService", { enumerable: true, get:
25
25
  __exportStar(require("./lib/access/permissions"), exports);
26
26
  __exportStar(require("./lib/access/config"), exports);
27
27
  __exportStar(require("./lib/access/roles"), exports);
28
+ __exportStar(require("./resources"), exports);
28
29
  var middleware_1 = require("./lib/access/middleware");
29
30
  Object.defineProperty(exports, "requirePermission", { enumerable: true, get: function () { return middleware_1.requirePermission; } });
30
31
  Object.defineProperty(exports, "requireAnyPermission", { enumerable: true, get: function () { return middleware_1.requireAnyPermission; } });
@@ -32,4 +33,4 @@ var define_permission_1 = require("./lib/access/define-permission");
32
33
  Object.defineProperty(exports, "definePermission", { enumerable: true, get: function () { return define_permission_1.definePermission; } });
33
34
  var explain_1 = require("./lib/access/explain");
34
35
  Object.defineProperty(exports, "explainPermission", { enumerable: true, get: function () { return explain_1.explainPermission; } });
35
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSwyREFBeUQ7QUFBaEQsZ0hBQUEsY0FBYyxPQUFBO0FBQ3ZCLDREQUFrRjtBQUF6RSxnSUFBQSxPQUFPLE9BQXdCO0FBQ3hDLDJEQUF3QztBQUN4QyxzREFBbUM7QUFDbkMscURBQWtDO0FBQ2xDLHNEQUdnQztBQUY5QiwrR0FBQSxpQkFBaUIsT0FBQTtBQUNqQixrSEFBQSxvQkFBb0IsT0FBQTtBQUV0QixvRUFBaUU7QUFBeEQscUhBQUEsZ0JBQWdCLE9BQUE7QUFDekIsZ0RBQXdEO0FBQS9DLDRHQUFBLGlCQUFpQixPQUFBIn0=
36
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSwyREFBeUQ7QUFBaEQsZ0hBQUEsY0FBYyxPQUFBO0FBQ3ZCLDREQUFrRjtBQUF6RSxnSUFBQSxPQUFPLE9BQXdCO0FBQ3hDLDJEQUF3QztBQUN4QyxzREFBbUM7QUFDbkMscURBQWtDO0FBQ2xDLDhDQUEyQjtBQUMzQixzREFHZ0M7QUFGOUIsK0dBQUEsaUJBQWlCLE9BQUE7QUFDakIsa0hBQUEsb0JBQW9CLE9BQUE7QUFFdEIsb0VBQWlFO0FBQXhELHFIQUFBLGdCQUFnQixPQUFBO0FBQ3pCLGdEQUF3RDtBQUEvQyw0R0FBQSxpQkFBaUIsT0FBQSJ9
@@ -1,6 +1,7 @@
1
1
  import type { MedusaRequest } from "@medusajs/framework/http";
2
2
  import { type AccessPrincipal } from "./permissions";
3
3
  import { type Policy } from "./policy";
4
+ import { type OperationDescriptor, type ResourceDefinition } from "./resources";
4
5
  import { type RoleDefinition, type ConfiguredRoleDefinition } from "./roles";
5
6
  import type { ActorProvider } from "./actors";
6
7
  export type PermissionDefinition = readonly [
@@ -26,6 +27,8 @@ export type AccessControlOptions = {
26
27
  roles?: readonly RoleDefinition[];
27
28
  /** Explicit policies for custom APIs. Native/management policies take precedence. */
28
29
  routes?: RoutePolicy[];
30
+ /** Structural capability registrations for application/plugin-owned APIs. */
31
+ resources?: readonly ResourceDefinition[];
29
32
  contextResolvers?: ((request: MedusaRequest) => PermissionContext | Promise<PermissionContext>)[];
30
33
  /** Resolvers for custom APIs only. The Admin API always requires a native user. */
31
34
  actors?: ActorProvider[];
@@ -35,8 +38,11 @@ export declare function createAccessConfig(options?: AccessControlOptions): {
35
38
  roles: ConfiguredRoleDefinition[];
36
39
  ids: string[];
37
40
  actors: ActorProvider[];
41
+ resources: ResourceDefinition[];
38
42
  contextResolvers: ((request: MedusaRequest) => PermissionContext | Promise<PermissionContext>)[];
43
+ /** Structural inspection only. Enforce resolveRequest(request) with operationAllowed. */
39
44
  policyFor(method: string, path: string): Policy | null;
45
+ resolveRequest(request: MedusaRequest): Promise<OperationDescriptor | null>;
40
46
  };
41
47
  export declare function validateRules(value: unknown, ids: readonly string[]): PermissionRule[];
42
48
  /** Priority, then exact key/namespace specificity, then condition count, then deny. */
@@ -8,10 +8,13 @@ exports.validateRules = validateRules;
8
8
  exports.evaluatePermission = evaluatePermission;
9
9
  const native_routes_json_1 = __importDefault(require("./native-routes.json"));
10
10
  const permissions_1 = require("./permissions");
11
- const policy_1 = require("./policy");
11
+ const native_resources_1 = require("./native-resources");
12
+ const route_facts_1 = require("./route-facts");
13
+ const resources_1 = require("./resources");
12
14
  const permission_key_1 = require("./permission-key");
13
15
  const roles_1 = require("./roles");
14
16
  const explain_1 = require("./explain");
17
+ const immutable_config_1 = require("./immutable-config");
15
18
  function createAccessConfig(options = {}) {
16
19
  const permissions = [...permissions_1.PERMISSIONS];
17
20
  const ids = new Set(permissions.map(([id]) => id));
@@ -55,7 +58,7 @@ function createAccessConfig(options = {}) {
55
58
  });
56
59
  const nativeRoots = new Set(native_routes_json_1.default.map((route) => route.path.split("/")[2]));
57
60
  const signatures = new Set();
58
- const routes = (options.routes || []).map((route) => {
61
+ const routes = (0, immutable_config_1.immutableConfig)((options.routes || []).map((route) => {
59
62
  const method = route.method.toUpperCase();
60
63
  const signature = `${method} ${route.path}`;
61
64
  if (!/^(GET|POST|PUT|PATCH|DELETE)$/.test(method) ||
@@ -68,9 +71,70 @@ function createAccessConfig(options = {}) {
68
71
  return {
69
72
  ...route,
70
73
  method,
71
- pattern: new RegExp(`^${route.path.replace(/:[a-z][a-z0-9_]*/g, "[^/]+")}$`),
72
74
  };
73
- });
75
+ }));
76
+ const resources = (0, resources_1.validateResources)(options.resources || [], [...ids], [
77
+ ...native_resources_1.nativeResources,
78
+ ...[...nativeRoots].map((root) => ({ key: root, root })),
79
+ ...routes.map((route) => {
80
+ const parts = route.path.split("/");
81
+ return { key: parts[2], root: parts[2], namespace: parts[1] };
82
+ }),
83
+ ]);
84
+ const resourceMatcher = (0, route_facts_1.createRouteMatcher)(resources.flatMap(resources_1.resourceRoutes));
85
+ const configuredMatcher = (0, route_facts_1.createRouteMatcher)(routes.map((route) => ({ path: route.path, methods: [route.method] })));
86
+ const resourceOwners = new Set(resources.map((resource) => `${resource.namespace || "admin"}/${resource.root}`));
87
+ const reserved = (url) => {
88
+ const path = (0, route_facts_1.canonicalPath)(url);
89
+ if (!path)
90
+ return true;
91
+ const parts = path.toLowerCase().split("/");
92
+ return (parts[1] === "admin" &&
93
+ (nativeRoots.has(parts[2]) ||
94
+ native_resources_1.nativeResources.some((resource) => resource.root === parts[2]) ||
95
+ [
96
+ "rbac",
97
+ "workflows",
98
+ "workflow-executions",
99
+ "api-keys",
100
+ "search",
101
+ "search-indexes",
102
+ ].includes(parts[2])));
103
+ };
104
+ const custom = (method, url, body, actorId) => {
105
+ if (reserved(url))
106
+ return null;
107
+ const facts = resourceMatcher(method, url);
108
+ if (facts) {
109
+ const resource = resources.find((resource) => resource.root === facts.root &&
110
+ (resource.namespace || "admin") === facts.namespace);
111
+ return (0, resources_1.describeResource)(resource, facts, body, actorId);
112
+ }
113
+ const parts = (0, route_facts_1.canonicalPath)(url).toLowerCase().split("/");
114
+ if (resourceOwners.has(`${parts[1]}/${parts[2]}`))
115
+ return null;
116
+ const route = configuredMatcher(method, url);
117
+ if (!route)
118
+ return null;
119
+ const policy = routes.find((policy) => policy.path === route.template && policy.method === route.method);
120
+ return {
121
+ facts: route,
122
+ resource: route.root,
123
+ operation: "configured",
124
+ scope: "global",
125
+ params: route.params,
126
+ fieldResource: route.root,
127
+ actorTypes: ["user"],
128
+ access: "active-principal",
129
+ self: false,
130
+ policy: {
131
+ permissions: [...policy.permissions],
132
+ ...(policy.superuser ? { superuser: true } : {}),
133
+ },
134
+ action: { operation: "configured" },
135
+ fieldRequirements: [],
136
+ };
137
+ };
74
138
  const actors = options.actors || [];
75
139
  if (new Set(actors.map((actor) => actor.type)).size !== actors.length ||
76
140
  actors.some((actor) => !actor.type ||
@@ -83,18 +147,50 @@ function createAccessConfig(options = {}) {
83
147
  roles,
84
148
  ids: [...ids],
85
149
  actors,
150
+ resources,
86
151
  contextResolvers: options.contextResolvers || [],
152
+ /** Structural inspection only. Enforce resolveRequest(request) with operationAllowed. */
87
153
  policyFor(method, path) {
88
- const native = (0, policy_1.policyFor)(method, path);
89
- if (native)
90
- return native;
91
- // Never reopen native APIs or the access-management namespace with an extension.
92
- if (/^\/admin\/(?:access|rbac|users|invites|workflows|workflow-executions|api-keys|search|search-indexes)(?:\/|$)/.test(path))
93
- return null;
94
- if (path.startsWith("/admin/") && nativeRoots.has(path.split("/")[2]))
154
+ return (((0, native_resources_1.describeNative)(method, path, {}) || custom(method, path, {}))
155
+ ?.policy || null);
156
+ },
157
+ async resolveRequest(request) {
158
+ const actorId = request
159
+ .auth_context?.actor_id;
160
+ let descriptor = (0, native_resources_1.describeNative)(request.method, request.originalUrl, request.body, actorId);
161
+ if (!descriptor && !reserved(request.originalUrl)) {
162
+ const facts = resourceMatcher(request.method, request.originalUrl);
163
+ const resource = facts &&
164
+ resources.find((resource) => resource.root === facts.root &&
165
+ (resource.namespace || "admin") === facts.namespace);
166
+ if (facts && resource?.resolveScope) {
167
+ const action = (0, resources_1.profileAction)(resource.profile, facts);
168
+ const scope = await resource.resolveScope(request, (0, immutable_config_1.immutableConfig)({
169
+ facts,
170
+ resource: resource.key,
171
+ operation: action.operation,
172
+ params: facts.params,
173
+ }));
174
+ if (scope === null ||
175
+ !["global", "personal", "shared"].includes(scope))
176
+ return null;
177
+ descriptor = (0, resources_1.describeResource)(resource, facts, request.body, actorId, scope);
178
+ }
179
+ else
180
+ descriptor = custom(request.method, request.originalUrl, request.body, actorId);
181
+ }
182
+ if (!descriptor)
95
183
  return null;
96
- const verb = method === "HEAD" ? "GET" : method;
97
- return (routes.find((route) => route.method === verb && route.pattern.test(path)) || null);
184
+ if (descriptor.action.payload) {
185
+ const permissions = await descriptor.action.payload(request, (0, immutable_config_1.immutableConfig)(descriptor));
186
+ if (!Array.isArray(permissions) ||
187
+ permissions.some((permission) => !ids.has(permission)))
188
+ return null;
189
+ descriptor.policy.permissions = [
190
+ ...new Set([...descriptor.policy.permissions, ...permissions]),
191
+ ];
192
+ }
193
+ return descriptor;
98
194
  },
99
195
  };
100
196
  }
@@ -145,4 +241,4 @@ function validateRules(value, ids) {
145
241
  function evaluatePermission(principal, permission, context = {}) {
146
242
  return (0, explain_1.explainPermission)(principal, permission, context).allowed;
147
243
  }
148
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9hY2Nlc3MvY29uZmlnLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBK0NBLGdEQXdIQztBQUVELHNDQXlEQztBQUdELGdEQU1DO0FBM09ELDhFQUErQztBQUUvQywrQ0FJc0I7QUFDdEIscUNBQWlEO0FBQ2pELHFEQUE0RTtBQUM1RSxtQ0FJZ0I7QUFDaEIsdUNBQTZDO0FBaUM3QyxTQUFnQixrQkFBa0IsQ0FBQyxVQUFnQyxFQUFFO0lBQ25FLE1BQU0sV0FBVyxHQUEyQixDQUFDLEdBQUcseUJBQVcsQ0FBQyxDQUFBO0lBQzVELE1BQU0sR0FBRyxHQUFHLElBQUksR0FBRyxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFBO0lBQ2xELEtBQUssTUFBTSxVQUFVLElBQUksT0FBTyxDQUFDLFdBQVcsSUFBSSxFQUFFLEVBQUUsQ0FBQztRQUNuRCxNQUFNLENBQUMsRUFBRSxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsR0FBRyxVQUFVLENBQUE7UUFDckMsSUFDRSxDQUFDLG9DQUFvQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDOUMsQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFO1lBQ2QsQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFO1lBQ2QsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFFWCxNQUFNLElBQUksS0FBSyxDQUFDLG9DQUFvQyxFQUFFLEVBQUUsQ0FBQyxDQUFBO1FBQzNELEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUE7UUFDWCxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFBO0lBQ3RDLENBQUM7SUFDRCxNQUFNLFFBQVEsR0FBRyxJ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
244
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9hY2Nlc3MvY29uZmlnLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBK0RBLGdEQWlRQztBQUVELHNDQXlEQztBQUdELGdEQU1DO0FBcFlELDhFQUErQztBQUsvQywrQ0FJc0I7QUFFdEIseURBQW9FO0FBQ3BFLCtDQUFpRTtBQUNqRSwyQ0FPb0I7QUFDcEIscURBQTRFO0FBQzVFLG1DQUlnQjtBQUNoQix1Q0FBNkM7QUFDN0MseURBQW9EO0FBbUNwRCxTQUFnQixrQkFBa0IsQ0FBQyxVQUFnQyxFQUFFO0lBQ25FLE1BQU0sV0FBVyxHQUEyQixDQUFDLEdBQUcseUJBQVcsQ0FBQyxDQUFBO0lBQzVELE1BQU0sR0FBRyxHQUFHLElBQUksR0FBRyxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFBO0lBQ2xELEtBQUssTUFBTSxVQUFVLElBQUksT0FBTyxDQUFDLFdBQVcsSUFBSSxFQUFFLEVBQUUsQ0FBQztRQUNuRCxNQUFNLENBQUMsRUFBRSxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsR0FBRyxVQUFVLENBQUE7UUFDckMsSUFDRSxDQUFDLG9DQUFvQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDOUMsQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFO1lBQ2QsQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFO1lBQ2QsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFFWCxNQUFNLElBQUksS0FBSyxDQUFDLG9DQUFvQyxFQUFFLEVBQUUsQ0FBQyxDQUFBO1FBQzNELEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUE7UUFDWCxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FB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
@@ -1,5 +1,5 @@
1
1
  import type { PermissionContext, PermissionRule } from "./config";
2
- import type { AccessPrincipal } from "./permissions";
2
+ import { type AccessPrincipal } from "./permissions";
3
3
  export type PermissionDecision = {
4
4
  allowed: boolean;
5
5
  reason: "inactive" | "superuser" | "no_match" | "allow" | "deny";
@@ -1,12 +1,13 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.explainPermission = explainPermission;
4
+ const permissions_1 = require("./permissions");
4
5
  const permission_key_1 = require("./permission-key");
5
6
  /** The shared decision engine used by enforcement and permission diagnostics. */
6
7
  function explainPermission(principal, permission, context = {}) {
7
8
  if (!principal.active)
8
9
  return { allowed: false, reason: "inactive", matches: [] };
9
- if (principal.is_superuser)
10
+ if ((0, permissions_1.isSuperuser)(principal))
10
11
  return { allowed: true, reason: "superuser", matches: [] };
11
12
  const matches = (principal.rules || [])
12
13
  .filter((rule) => (0, permission_key_1.permissionKeyMatches)(rule.permission, permission) &&
@@ -36,4 +37,4 @@ function explainPermission(principal, permission, context = {}) {
36
37
  matches,
37
38
  };
38
39
  }
39
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhwbGFpbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvYWNjZXNzL2V4cGxhaW4udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFXQSw4Q0E0Q0M7QUFyREQscURBQXVEO0FBUXZELGlGQUFpRjtBQUNqRixTQUFnQixpQkFBaUIsQ0FDL0IsU0FBMEIsRUFDMUIsVUFBa0IsRUFDbEIsVUFBNkIsRUFBRTtJQUUvQixJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU07UUFDbkIsT0FBTyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxPQUFPLEVBQUUsRUFBRSxFQUFFLENBQUE7SUFDNUQsSUFBSSxTQUFTLENBQUMsWUFBWTtRQUN4QixPQUFPLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsV0FBVyxFQUFFLE9BQU8sRUFBRSxFQUFFLEVBQUUsQ0FBQTtJQUM1RCxNQUFNLE9BQU8sR0FBa0MsQ0FBQyxTQUFTLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FBQztTQUNuRSxNQUFNLENBQ0wsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUNQLElBQUEscUNBQW9CLEVBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxVQUFVLENBQUM7UUFDakQsTUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsVUFBVSxJQUFJLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FDekMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxRQUFRLENBQUMsRUFBRSxFQUFFLENBQ2xCLE1BQU0sQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFLEdBQUcsQ0FBQztZQUMzQixDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDO2dCQUN0QixDQUFDLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQ2pDLENBQUMsQ0FBQyxRQUFRLEtBQUssT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQ2pDLENBQ0o7U0FDQSxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxHQUFHLElBQUksRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFBO0lBQy9DLElBQUksU0FBUyxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDO1FBQzVDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLENBQUMsQ0FBQTtJQUNyRSxNQUFNLEtBQUssR0FBRyxDQUFDLElBQW9CLEVBQUUsRUFBRSxDQUFDO1FBQ3RDLElBQUksQ0FBQyxRQUFRLElBQUksQ0FBQztRQUNsQixJQUFJLENBQUMsVUFBVSxLQUFLLFVBQVUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNO1FBQ3pFLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsSUFBSSxFQUFFLENBQUMsQ0FBQyxNQUFNO0tBQzFDLENBQUE7SUFDRCxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFO1FBQ3BCLE1BQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQTtRQUNyQixNQUFNLEtBQUssR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUE7UUFDdEIsT0FBTyxDQUNMLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDO1lBQ2xCLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDO1lBQ2xCLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDO1lBQ2xCLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxLQUFLLE1BQU0sQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxLQUFLLE1BQU0sQ0FBQyxDQUMxRCxDQUFBO0lBQ0gsQ0FBQyxDQUFDLENBQUE7SUFDRixPQUFPO1FBQ0wsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxNQUFNLEtBQUssT0FBTztRQUN2QyxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sSUFBSSxVQUFVO1FBQ3hDLE9BQU87S0FDUixDQUFBO0FBQ0gsQ0FBQyJ9
40
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhwbGFpbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvYWNjZXNzL2V4cGxhaW4udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFXQSw4Q0E0Q0M7QUF0REQsK0NBQWlFO0FBQ2pFLHFEQUF1RDtBQVF2RCxpRkFBaUY7QUFDakYsU0FBZ0IsaUJBQWlCLENBQy9CLFNBQTBCLEVBQzFCLFVBQWtCLEVBQ2xCLFVBQTZCLEVBQUU7SUFFL0IsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNO1FBQ25CLE9BQU8sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFFLEVBQUUsRUFBRSxDQUFBO0lBQzVELElBQUksSUFBQSx5QkFBVyxFQUFDLFNBQVMsQ0FBQztRQUN4QixPQUFPLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsV0FBVyxFQUFFLE9BQU8sRUFBRSxFQUFFLEVBQUUsQ0FBQTtJQUM1RCxNQUFNLE9BQU8sR0FBa0MsQ0FBQyxTQUFTLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FBQztTQUNuRSxNQUFNLENBQ0wsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUNQLElBQUEscUNBQW9CLEVBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxVQUFVLENBQUM7UUFDakQsTUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsVUFBVSxJQUFJLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FDekMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxRQUFRLENBQUMsRUFBRSxFQUFFLENBQ2xCLE1BQU0sQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFLEdBQUcsQ0FBQztZQUMzQixDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDO2dCQUN0QixDQUFDLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQ2pDLENBQUMsQ0FBQyxRQUFRLEtBQUssT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQ2pDLENBQ0o7U0FDQSxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxHQUFHLElBQUksRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFBO0lBQy9DLElBQUksU0FBUyxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDO1FBQzVDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLENBQUMsQ0FBQTtJQUNyRSxNQUFNLEtBQUssR0FBRyxDQUFDLElBQW9CLEVBQUUsRUFBRSxDQUFDO1FBQ3RDLElBQUksQ0FBQyxRQUFRLElBQUksQ0FBQztRQUNsQixJQUFJLENBQUMsVUFBVSxLQUFLLFVBQVUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNO1FBQ3pFLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsSUFBSSxFQUFFLENBQUMsQ0FBQyxNQUFNO0tBQzFDLENBQUE7SUFDRCxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFO1FBQ3BCLE1BQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQTtRQUNyQixNQUFNLEtBQUssR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUE7UUFDdEIsT0FBTyxDQUNMLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDO1lBQ2xCLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDO1lBQ2xCLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDO1lBQ2xCLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxLQUFLLE1BQU0sQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxLQUFLLE1BQU0sQ0FBQyxDQUMxRCxDQUFBO0lBQ0gsQ0FBQyxDQUFDLENBQUE7SUFDRixPQUFPO1FBQ0wsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxNQUFNLEtBQUssT0FBTztRQUN2QyxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sSUFBSSxVQUFVO1FBQ3hDLE9BQU87S0FDUixDQUFBO0FBQ0gsQ0FBQyJ9
@@ -0,0 +1,2 @@
1
+ /** Copy policy data before freezing it; callbacks retain their server-owned identity. */
2
+ export declare function immutableConfig<T>(value: T): T;
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.immutableConfig = immutableConfig;
4
+ /** Copy policy data before freezing it; callbacks retain their server-owned identity. */
5
+ function immutableConfig(value) {
6
+ if (Array.isArray(value))
7
+ return Object.freeze(value.map(immutableConfig));
8
+ if (value instanceof RegExp)
9
+ return Object.freeze(new RegExp(value.source, value.flags));
10
+ if (value && typeof value === "object")
11
+ return Object.freeze(Object.fromEntries(Object.entries(value).map(([key, child]) => [
12
+ key,
13
+ immutableConfig(child),
14
+ ])));
15
+ return value;
16
+ }
17
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW1tdXRhYmxlLWNvbmZpZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvYWNjZXNzL2ltbXV0YWJsZS1jb25maWcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFDQSwwQ0FlQztBQWhCRCx5RkFBeUY7QUFDekYsU0FBZ0IsZUFBZSxDQUFJLEtBQVE7SUFDekMsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQztRQUN0QixPQUFPLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxlQUFlLENBQUMsQ0FBTSxDQUFBO0lBQ3ZELElBQUksS0FBSyxZQUFZLE1BQU07UUFDekIsT0FBTyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksTUFBTSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFNLENBQUE7SUFDbEUsSUFBSSxLQUFLLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUTtRQUNwQyxPQUFPLE1BQU0sQ0FBQyxNQUFNLENBQ2xCLE1BQU0sQ0FBQyxXQUFXLENBQ2hCLE1BQU0sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQzFDLEdBQUc7WUFDSCxlQUFlLENBQUMsS0FBSyxDQUFDO1NBQ3ZCLENBQUMsQ0FDSCxDQUNHLENBQUE7SUFDUixPQUFPLEtBQUssQ0FBQTtBQUNkLENBQUMifQ==
@@ -0,0 +1,3 @@
1
+ import { type ResourceDefinition } from "./resources";
2
+ export declare const nativeResources: readonly ResourceDefinition[];
3
+ export declare function describeNative(method: string, url: string, body?: unknown, actorId?: string): import("./resources").OperationDescriptor | null;