@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.
- package/.medusa/server/src/admin/index.js +43 -25
- package/.medusa/server/src/admin/index.mjs +43 -25
- package/.medusa/server/src/admin/lib/access.d.ts +6 -3
- package/.medusa/server/src/admin/lib/access.js +1 -1
- package/.medusa/server/src/api/admin/access/me/route.js +3 -1
- package/.medusa/server/src/api/admin/access/permissions/route.js +4 -1
- package/.medusa/server/src/api/middlewares/enforce-admin-access.js +49 -61
- package/.medusa/server/src/index.d.ts +1 -0
- package/.medusa/server/src/index.js +2 -1
- package/.medusa/server/src/lib/access/config.d.ts +6 -0
- package/.medusa/server/src/lib/access/config.js +110 -14
- package/.medusa/server/src/lib/access/explain.d.ts +1 -1
- package/.medusa/server/src/lib/access/explain.js +3 -2
- package/.medusa/server/src/lib/access/immutable-config.d.ts +2 -0
- package/.medusa/server/src/lib/access/immutable-config.js +17 -0
- package/.medusa/server/src/lib/access/native-resources.d.ts +3 -0
- package/.medusa/server/src/lib/access/native-resources.js +444 -0
- package/.medusa/server/src/lib/access/permission-key.d.ts +1 -1
- package/.medusa/server/src/lib/access/permission-key.js +3 -2
- package/.medusa/server/src/lib/access/permissions.d.ts +7 -0
- package/.medusa/server/src/lib/access/permissions.js +15 -2
- package/.medusa/server/src/lib/access/policy.d.ts +12 -3
- package/.medusa/server/src/lib/access/policy.js +149 -264
- package/.medusa/server/src/lib/access/resources.d.ts +107 -0
- package/.medusa/server/src/lib/access/resources.js +363 -0
- package/.medusa/server/src/lib/access/route-facts.d.ts +24 -0
- package/.medusa/server/src/lib/access/route-facts.js +77 -0
- package/.medusa/server/src/lib/access/write-permissions.d.ts +2 -0
- package/.medusa/server/src/lib/access/write-permissions.js +40 -0
- package/.medusa/server/src/modules/access-control/service.d.ts +4 -0
- package/.medusa/server/src/modules/access-control/service.js +8 -3
- package/.medusa/server/src/resources.d.ts +2 -0
- package/.medusa/server/src/resources.js +18 -0
- package/README.md +71 -9
- package/package.json +11 -7
|
@@ -696,13 +696,13 @@ function ActorPicker({
|
|
|
696
696
|
}
|
|
697
697
|
const reasons = {
|
|
698
698
|
inactive: "This account has no active access.",
|
|
699
|
-
superuser: "Superuser grants every registered permission.",
|
|
700
699
|
no_match: "No grant or contextual rule matches this permission and context.",
|
|
701
700
|
allow: "The highest-ranked matching rule allows this permission.",
|
|
702
701
|
deny: "The highest-ranked matching rule denies this permission."
|
|
703
702
|
};
|
|
704
703
|
function PermissionChecker({
|
|
705
704
|
permission,
|
|
705
|
+
superuserAuthority,
|
|
706
706
|
actorTypes,
|
|
707
707
|
userId,
|
|
708
708
|
onClose
|
|
@@ -835,7 +835,7 @@ function PermissionChecker({
|
|
|
835
835
|
className: "bg-ui-bg-subtle border-ui-border-base rounded-lg border p-4",
|
|
836
836
|
children: [
|
|
837
837
|
/* @__PURE__ */ jsxRuntime.jsx(ui.Badge, { color: check.data.decision.allowed ? "green" : "red", children: check.data.decision.allowed ? "Allowed" : "Denied" }),
|
|
838
|
-
/* @__PURE__ */ jsxRuntime.jsx(ui.Text, { className: "mt-3", children: reasons[check.data.decision.reason] }),
|
|
838
|
+
/* @__PURE__ */ jsxRuntime.jsx(ui.Text, { className: "mt-3", children: check.data.decision.reason === "superuser" ? superuserAuthority.description : reasons[check.data.decision.reason] }),
|
|
839
839
|
check.data.decision.matches.map((rule, index) => /* @__PURE__ */ jsxRuntime.jsxs(
|
|
840
840
|
"div",
|
|
841
841
|
{
|
|
@@ -881,7 +881,7 @@ function PermissionCatalog({
|
|
|
881
881
|
const [search, setSearch] = react.useState("");
|
|
882
882
|
const [pagination, setPagination] = react.useState({ pageIndex: 0, pageSize: 25 });
|
|
883
883
|
const [selected, setSelected] = react.useState(null);
|
|
884
|
-
const
|
|
884
|
+
const catalog = reactQuery.useQuery({
|
|
885
885
|
queryKey: ["medusa-rbac", userId, "permissions"],
|
|
886
886
|
queryFn: accessApi.permissions,
|
|
887
887
|
retry: false
|
|
@@ -918,7 +918,7 @@ function PermissionCatalog({
|
|
|
918
918
|
],
|
|
919
919
|
[superuser]
|
|
920
920
|
);
|
|
921
|
-
const rows = (
|
|
921
|
+
const rows = (catalog.data?.permissions || []).filter(
|
|
922
922
|
(permission) => `${permission.id} ${permission.label} ${permission.group}`.toLowerCase().includes(search.trim().toLowerCase())
|
|
923
923
|
);
|
|
924
924
|
const table = ui.useDataTable({
|
|
@@ -929,7 +929,7 @@ function PermissionCatalog({
|
|
|
929
929
|
columns: columns2,
|
|
930
930
|
getRowId: (permission) => permission.id,
|
|
931
931
|
rowCount: rows.length,
|
|
932
|
-
isLoading:
|
|
932
|
+
isLoading: catalog.isPending,
|
|
933
933
|
search: {
|
|
934
934
|
state: search,
|
|
935
935
|
onSearchChange: (value) => {
|
|
@@ -941,13 +941,14 @@ function PermissionCatalog({
|
|
|
941
941
|
});
|
|
942
942
|
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col gap-y-3", children: [
|
|
943
943
|
/* @__PURE__ */ jsxRuntime.jsx(ui.Text, { className: "text-ui-fg-subtle", children: "Permissions are registered by the plugin and your application. Use their identifiers in role definitions, rules and server checks." }),
|
|
944
|
+
superuser && catalog.data && /* @__PURE__ */ jsxRuntime.jsx(ui.Text, { className: "text-ui-fg-subtle", children: catalog.data.superuser_authority.description }),
|
|
944
945
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
945
946
|
SettingsTable,
|
|
946
947
|
{
|
|
947
948
|
title: "Permission catalog",
|
|
948
949
|
instance: table,
|
|
949
950
|
search: "Search permissions",
|
|
950
|
-
error:
|
|
951
|
+
error: catalog.error,
|
|
951
952
|
empty: "No permissions registered"
|
|
952
953
|
}
|
|
953
954
|
),
|
|
@@ -955,7 +956,8 @@ function PermissionCatalog({
|
|
|
955
956
|
PermissionChecker,
|
|
956
957
|
{
|
|
957
958
|
permission: selected,
|
|
958
|
-
|
|
959
|
+
superuserAuthority: catalog.data.superuser_authority,
|
|
960
|
+
actorTypes: catalog.data?.actor_types || ["user", "customer"],
|
|
959
961
|
userId,
|
|
960
962
|
onClose: () => setSelected(null)
|
|
961
963
|
}
|
|
@@ -2231,7 +2233,9 @@ const PERMISSIONS = [
|
|
|
2231
2233
|
PERMISSIONS.map(
|
|
2232
2234
|
([id]) => id
|
|
2233
2235
|
);
|
|
2234
|
-
|
|
2236
|
+
function isSuperuser(principal) {
|
|
2237
|
+
return principal.actor_type === "user" && principal.active && principal.is_superuser;
|
|
2238
|
+
}
|
|
2235
2239
|
const column = ui.createDataTableColumnHelper();
|
|
2236
2240
|
const columns = [
|
|
2237
2241
|
column.accessor("group", { header: "Area" }),
|
|
@@ -2240,12 +2244,13 @@ const columns = [
|
|
|
2240
2244
|
function MyAccess({
|
|
2241
2245
|
access,
|
|
2242
2246
|
roles,
|
|
2243
|
-
permissionCatalog
|
|
2247
|
+
permissionCatalog,
|
|
2248
|
+
superuserAuthority
|
|
2244
2249
|
}) {
|
|
2245
2250
|
const [search, setSearch] = react.useState("");
|
|
2246
2251
|
const [pagination, setPagination] = react.useState({ pageIndex: 0, pageSize: 25 });
|
|
2247
2252
|
const rows = permissionCatalog.filter(
|
|
2248
|
-
(permission) => access.permissions.includes(permission.id) && `${permission.label} ${permission.group}`.toLowerCase().includes(search.trim().toLowerCase())
|
|
2253
|
+
(permission) => (isSuperuser(access) || access.permissions.includes(permission.id)) && `${permission.label} ${permission.group}`.toLowerCase().includes(search.trim().toLowerCase())
|
|
2249
2254
|
);
|
|
2250
2255
|
const table = ui.useDataTable({
|
|
2251
2256
|
data: rows.slice(
|
|
@@ -2255,7 +2260,13 @@ function MyAccess({
|
|
|
2255
2260
|
columns,
|
|
2256
2261
|
getRowId: (permission) => permission.id,
|
|
2257
2262
|
rowCount: rows.length,
|
|
2258
|
-
search: {
|
|
2263
|
+
search: {
|
|
2264
|
+
state: search,
|
|
2265
|
+
onSearchChange: (value) => {
|
|
2266
|
+
setSearch(value);
|
|
2267
|
+
setPagination((current) => ({ ...current, pageIndex: 0 }));
|
|
2268
|
+
}
|
|
2269
|
+
},
|
|
2259
2270
|
pagination: { state: pagination, onPaginationChange: setPagination }
|
|
2260
2271
|
});
|
|
2261
2272
|
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col gap-y-3", children: [
|
|
@@ -2266,7 +2277,11 @@ function MyAccess({
|
|
|
2266
2277
|
/* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "small", children: roles ? roles.map((role) => role.name).join(", ") || "No roles assigned" : "Roles unavailable" })
|
|
2267
2278
|
] })
|
|
2268
2279
|
] }),
|
|
2269
|
-
|
|
2280
|
+
isSuperuser(access) && /* @__PURE__ */ jsxRuntime.jsxs(ui.Container, { children: [
|
|
2281
|
+
/* @__PURE__ */ jsxRuntime.jsx(ui.Heading, { level: "h2", children: "Full Admin access" }),
|
|
2282
|
+
/* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "small", className: "text-ui-fg-subtle mt-2", children: superuserAuthority.description })
|
|
2283
|
+
] }),
|
|
2284
|
+
!isSuperuser(access) && Boolean(access.rules?.length) && /* @__PURE__ */ jsxRuntime.jsx(ui.Container, { children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
2270
2285
|
PermissionRules,
|
|
2271
2286
|
{
|
|
2272
2287
|
value: ruleDrafts(access.rules),
|
|
@@ -2278,7 +2293,7 @@ function MyAccess({
|
|
|
2278
2293
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
2279
2294
|
SettingsTable,
|
|
2280
2295
|
{
|
|
2281
|
-
title: "
|
|
2296
|
+
title: isSuperuser(access) ? "All registered permissions" : "Explicit permission grants",
|
|
2282
2297
|
headingLevel: "h2",
|
|
2283
2298
|
instance: table,
|
|
2284
2299
|
empty: "No permissions assigned",
|
|
@@ -2291,7 +2306,7 @@ function permissionKeyMatches(pattern, permission) {
|
|
|
2291
2306
|
return pattern === permission || pattern === "*" || pattern.endsWith(".*") && permission.startsWith(pattern.slice(0, -1));
|
|
2292
2307
|
}
|
|
2293
2308
|
function hasPermissionCandidate(principal, permission) {
|
|
2294
|
-
return principal.active && (principal
|
|
2309
|
+
return principal.active && (isSuperuser(principal) || principal.permissions.includes(permission) || Boolean(
|
|
2295
2310
|
principal.rules?.some(
|
|
2296
2311
|
(rule) => rule.effect === "allow" && permissionKeyMatches(rule.permission, permission)
|
|
2297
2312
|
)
|
|
@@ -2354,7 +2369,8 @@ const AccessManagement = () => {
|
|
|
2354
2369
|
{
|
|
2355
2370
|
access,
|
|
2356
2371
|
roles: query.data?.roles,
|
|
2357
|
-
permissionCatalog: query.data
|
|
2372
|
+
permissionCatalog: query.data.permission_catalog,
|
|
2373
|
+
superuserAuthority: query.data.superuser_authority
|
|
2358
2374
|
}
|
|
2359
2375
|
) })
|
|
2360
2376
|
]
|
|
@@ -2367,10 +2383,11 @@ function conditionValue(value) {
|
|
|
2367
2383
|
}
|
|
2368
2384
|
function PermissionSummary({
|
|
2369
2385
|
role,
|
|
2370
|
-
permissions
|
|
2386
|
+
permissions,
|
|
2387
|
+
superuserAuthority
|
|
2371
2388
|
}) {
|
|
2372
2389
|
const grants = permissions.filter(
|
|
2373
|
-
(permission) => role.permissions.includes(permission.id)
|
|
2390
|
+
(permission) => role.is_superuser || role.permissions.includes(permission.id)
|
|
2374
2391
|
);
|
|
2375
2392
|
const groups = [...new Set(grants.map((permission) => permission.group))];
|
|
2376
2393
|
return /* @__PURE__ */ jsxRuntime.jsxs(ui.Container, { className: "divide-y p-0", children: [
|
|
@@ -2378,7 +2395,7 @@ function PermissionSummary({
|
|
|
2378
2395
|
/* @__PURE__ */ jsxRuntime.jsx(ui.Heading, { level: "h2", children: "Permissions" }),
|
|
2379
2396
|
/* @__PURE__ */ jsxRuntime.jsx(ui.Badge, { size: "2xsmall", children: role.is_superuser ? "All permissions" : `${grants.length} ${grants.length === 1 ? "grant" : "grants"}` })
|
|
2380
2397
|
] }),
|
|
2381
|
-
role.is_superuser && /* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "small", className: "text-ui-fg-subtle px-6 py-4", children:
|
|
2398
|
+
role.is_superuser && /* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "small", className: "text-ui-fg-subtle px-6 py-4", children: superuserAuthority.description }),
|
|
2382
2399
|
groups.map((group) => /* @__PURE__ */ jsxRuntime.jsxs("section", { className: "px-6 py-4", children: [
|
|
2383
2400
|
/* @__PURE__ */ jsxRuntime.jsx(ui.Heading, { level: "h3", className: "mb-3", children: group }),
|
|
2384
2401
|
/* @__PURE__ */ jsxRuntime.jsx("ul", { className: "grid gap-3 sm:grid-cols-2", children: grants.filter((permission) => permission.group === group).map((permission) => /* @__PURE__ */ jsxRuntime.jsxs(
|
|
@@ -2393,7 +2410,7 @@ function PermissionSummary({
|
|
|
2393
2410
|
permission.id
|
|
2394
2411
|
)) })
|
|
2395
2412
|
] }, group)),
|
|
2396
|
-
(role.rules || []).map((rule, index) => /* @__PURE__ */ jsxRuntime.jsx("section", { className: "px-6 py-4", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "border-ui-border-base overflow-hidden rounded-lg border", children: [
|
|
2413
|
+
(!role.is_superuser ? role.rules || [] : []).map((rule, index) => /* @__PURE__ */ jsxRuntime.jsx("section", { className: "px-6 py-4", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "border-ui-border-base overflow-hidden rounded-lg border", children: [
|
|
2397
2414
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col gap-2 px-4 py-3", children: [
|
|
2398
2415
|
/* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "small", weight: "plus", children: permissions.find(
|
|
2399
2416
|
(permission) => permission.id === rule.permission
|
|
@@ -2446,15 +2463,15 @@ function RoleDetail({ roleId }) {
|
|
|
2446
2463
|
enabled: allowed,
|
|
2447
2464
|
retry: false
|
|
2448
2465
|
});
|
|
2449
|
-
const
|
|
2466
|
+
const catalog = reactQuery.useQuery({
|
|
2450
2467
|
queryKey: ["medusa-rbac", access?.actor_id, "permissions"],
|
|
2451
2468
|
queryFn: accessApi.permissions,
|
|
2452
2469
|
enabled: allowed,
|
|
2453
2470
|
retry: false
|
|
2454
2471
|
});
|
|
2455
2472
|
const [editor, setEditor] = react.useState(null);
|
|
2456
|
-
if (current.error || detail.error ||
|
|
2457
|
-
return /* @__PURE__ */ jsxRuntime.jsx(ui.Alert, { role: "alert", variant: "error", children: errorMessage(current.error || detail.error ||
|
|
2473
|
+
if (current.error || detail.error || catalog.error)
|
|
2474
|
+
return /* @__PURE__ */ jsxRuntime.jsx(ui.Alert, { role: "alert", variant: "error", children: errorMessage(current.error || detail.error || catalog.error) });
|
|
2458
2475
|
if (current.isPending || !current.isFetchedAfterMount)
|
|
2459
2476
|
return /* @__PURE__ */ jsxRuntime.jsx(ui.Container, { children: /* @__PURE__ */ jsxRuntime.jsx(ui.Text, { role: "status", children: "Loading access…" }) });
|
|
2460
2477
|
if (!allowed)
|
|
@@ -2463,7 +2480,7 @@ function RoleDetail({ roleId }) {
|
|
|
2463
2480
|
/* @__PURE__ */ jsxRuntime.jsx(ui.Text, { className: "text-ui-fg-subtle", children: "You do not have permission to view this role." }),
|
|
2464
2481
|
/* @__PURE__ */ jsxRuntime.jsx(ui.Button, { asChild: true, variant: "secondary", size: "small", className: "mt-4", children: /* @__PURE__ */ jsxRuntime.jsx(reactRouterDom.Link, { to: "/settings/access-management?view=my-access", children: "View my access" }) })
|
|
2465
2482
|
] });
|
|
2466
|
-
if (detail.isPending ||
|
|
2483
|
+
if (detail.isPending || catalog.isPending)
|
|
2467
2484
|
return /* @__PURE__ */ jsxRuntime.jsx(ui.Container, { children: /* @__PURE__ */ jsxRuntime.jsx(ui.Text, { role: "status", children: "Loading role…" }) });
|
|
2468
2485
|
const { role, actors, actor_count, pending_invitation_count } = detail.data;
|
|
2469
2486
|
const managed = roleIsManaged(role);
|
|
@@ -2504,7 +2521,8 @@ function RoleDetail({ roleId }) {
|
|
|
2504
2521
|
PermissionSummary,
|
|
2505
2522
|
{
|
|
2506
2523
|
role,
|
|
2507
|
-
permissions:
|
|
2524
|
+
permissions: catalog.data.permissions,
|
|
2525
|
+
superuserAuthority: catalog.data.superuser_authority
|
|
2508
2526
|
}
|
|
2509
2527
|
) }),
|
|
2510
2528
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col gap-3", children: [
|
|
@@ -2621,7 +2639,7 @@ function RoleDetail({ roleId }) {
|
|
|
2621
2639
|
open: true,
|
|
2622
2640
|
role: editor.mode === "edit" ? editor.role : void 0,
|
|
2623
2641
|
initialRole: editor.mode === "copy" ? editor.role : void 0,
|
|
2624
|
-
permissions:
|
|
2642
|
+
permissions: catalog.data.permissions,
|
|
2625
2643
|
readOnly: !access.is_superuser || editor.mode === "edit" && managed,
|
|
2626
2644
|
onClose: () => setEditor(null)
|
|
2627
2645
|
},
|
|
@@ -693,13 +693,13 @@ function ActorPicker({
|
|
|
693
693
|
}
|
|
694
694
|
const reasons = {
|
|
695
695
|
inactive: "This account has no active access.",
|
|
696
|
-
superuser: "Superuser grants every registered permission.",
|
|
697
696
|
no_match: "No grant or contextual rule matches this permission and context.",
|
|
698
697
|
allow: "The highest-ranked matching rule allows this permission.",
|
|
699
698
|
deny: "The highest-ranked matching rule denies this permission."
|
|
700
699
|
};
|
|
701
700
|
function PermissionChecker({
|
|
702
701
|
permission,
|
|
702
|
+
superuserAuthority,
|
|
703
703
|
actorTypes,
|
|
704
704
|
userId,
|
|
705
705
|
onClose
|
|
@@ -832,7 +832,7 @@ function PermissionChecker({
|
|
|
832
832
|
className: "bg-ui-bg-subtle border-ui-border-base rounded-lg border p-4",
|
|
833
833
|
children: [
|
|
834
834
|
/* @__PURE__ */ jsx(Badge, { color: check.data.decision.allowed ? "green" : "red", children: check.data.decision.allowed ? "Allowed" : "Denied" }),
|
|
835
|
-
/* @__PURE__ */ jsx(Text, { className: "mt-3", children: reasons[check.data.decision.reason] }),
|
|
835
|
+
/* @__PURE__ */ jsx(Text, { className: "mt-3", children: check.data.decision.reason === "superuser" ? superuserAuthority.description : reasons[check.data.decision.reason] }),
|
|
836
836
|
check.data.decision.matches.map((rule, index) => /* @__PURE__ */ jsxs(
|
|
837
837
|
"div",
|
|
838
838
|
{
|
|
@@ -878,7 +878,7 @@ function PermissionCatalog({
|
|
|
878
878
|
const [search, setSearch] = useState("");
|
|
879
879
|
const [pagination, setPagination] = useState({ pageIndex: 0, pageSize: 25 });
|
|
880
880
|
const [selected, setSelected] = useState(null);
|
|
881
|
-
const
|
|
881
|
+
const catalog = useQuery({
|
|
882
882
|
queryKey: ["medusa-rbac", userId, "permissions"],
|
|
883
883
|
queryFn: accessApi.permissions,
|
|
884
884
|
retry: false
|
|
@@ -915,7 +915,7 @@ function PermissionCatalog({
|
|
|
915
915
|
],
|
|
916
916
|
[superuser]
|
|
917
917
|
);
|
|
918
|
-
const rows = (
|
|
918
|
+
const rows = (catalog.data?.permissions || []).filter(
|
|
919
919
|
(permission) => `${permission.id} ${permission.label} ${permission.group}`.toLowerCase().includes(search.trim().toLowerCase())
|
|
920
920
|
);
|
|
921
921
|
const table = useDataTable({
|
|
@@ -926,7 +926,7 @@ function PermissionCatalog({
|
|
|
926
926
|
columns: columns2,
|
|
927
927
|
getRowId: (permission) => permission.id,
|
|
928
928
|
rowCount: rows.length,
|
|
929
|
-
isLoading:
|
|
929
|
+
isLoading: catalog.isPending,
|
|
930
930
|
search: {
|
|
931
931
|
state: search,
|
|
932
932
|
onSearchChange: (value) => {
|
|
@@ -938,13 +938,14 @@ function PermissionCatalog({
|
|
|
938
938
|
});
|
|
939
939
|
return /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-y-3", children: [
|
|
940
940
|
/* @__PURE__ */ jsx(Text, { className: "text-ui-fg-subtle", children: "Permissions are registered by the plugin and your application. Use their identifiers in role definitions, rules and server checks." }),
|
|
941
|
+
superuser && catalog.data && /* @__PURE__ */ jsx(Text, { className: "text-ui-fg-subtle", children: catalog.data.superuser_authority.description }),
|
|
941
942
|
/* @__PURE__ */ jsx(
|
|
942
943
|
SettingsTable,
|
|
943
944
|
{
|
|
944
945
|
title: "Permission catalog",
|
|
945
946
|
instance: table,
|
|
946
947
|
search: "Search permissions",
|
|
947
|
-
error:
|
|
948
|
+
error: catalog.error,
|
|
948
949
|
empty: "No permissions registered"
|
|
949
950
|
}
|
|
950
951
|
),
|
|
@@ -952,7 +953,8 @@ function PermissionCatalog({
|
|
|
952
953
|
PermissionChecker,
|
|
953
954
|
{
|
|
954
955
|
permission: selected,
|
|
955
|
-
|
|
956
|
+
superuserAuthority: catalog.data.superuser_authority,
|
|
957
|
+
actorTypes: catalog.data?.actor_types || ["user", "customer"],
|
|
956
958
|
userId,
|
|
957
959
|
onClose: () => setSelected(null)
|
|
958
960
|
}
|
|
@@ -2228,7 +2230,9 @@ const PERMISSIONS = [
|
|
|
2228
2230
|
PERMISSIONS.map(
|
|
2229
2231
|
([id]) => id
|
|
2230
2232
|
);
|
|
2231
|
-
|
|
2233
|
+
function isSuperuser(principal) {
|
|
2234
|
+
return principal.actor_type === "user" && principal.active && principal.is_superuser;
|
|
2235
|
+
}
|
|
2232
2236
|
const column = createDataTableColumnHelper();
|
|
2233
2237
|
const columns = [
|
|
2234
2238
|
column.accessor("group", { header: "Area" }),
|
|
@@ -2237,12 +2241,13 @@ const columns = [
|
|
|
2237
2241
|
function MyAccess({
|
|
2238
2242
|
access,
|
|
2239
2243
|
roles,
|
|
2240
|
-
permissionCatalog
|
|
2244
|
+
permissionCatalog,
|
|
2245
|
+
superuserAuthority
|
|
2241
2246
|
}) {
|
|
2242
2247
|
const [search, setSearch] = useState("");
|
|
2243
2248
|
const [pagination, setPagination] = useState({ pageIndex: 0, pageSize: 25 });
|
|
2244
2249
|
const rows = permissionCatalog.filter(
|
|
2245
|
-
(permission) => access.permissions.includes(permission.id) && `${permission.label} ${permission.group}`.toLowerCase().includes(search.trim().toLowerCase())
|
|
2250
|
+
(permission) => (isSuperuser(access) || access.permissions.includes(permission.id)) && `${permission.label} ${permission.group}`.toLowerCase().includes(search.trim().toLowerCase())
|
|
2246
2251
|
);
|
|
2247
2252
|
const table = useDataTable({
|
|
2248
2253
|
data: rows.slice(
|
|
@@ -2252,7 +2257,13 @@ function MyAccess({
|
|
|
2252
2257
|
columns,
|
|
2253
2258
|
getRowId: (permission) => permission.id,
|
|
2254
2259
|
rowCount: rows.length,
|
|
2255
|
-
search: {
|
|
2260
|
+
search: {
|
|
2261
|
+
state: search,
|
|
2262
|
+
onSearchChange: (value) => {
|
|
2263
|
+
setSearch(value);
|
|
2264
|
+
setPagination((current) => ({ ...current, pageIndex: 0 }));
|
|
2265
|
+
}
|
|
2266
|
+
},
|
|
2256
2267
|
pagination: { state: pagination, onPaginationChange: setPagination }
|
|
2257
2268
|
});
|
|
2258
2269
|
return /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-y-3", children: [
|
|
@@ -2263,7 +2274,11 @@ function MyAccess({
|
|
|
2263
2274
|
/* @__PURE__ */ jsx(Text, { size: "small", children: roles ? roles.map((role) => role.name).join(", ") || "No roles assigned" : "Roles unavailable" })
|
|
2264
2275
|
] })
|
|
2265
2276
|
] }),
|
|
2266
|
-
|
|
2277
|
+
isSuperuser(access) && /* @__PURE__ */ jsxs(Container, { children: [
|
|
2278
|
+
/* @__PURE__ */ jsx(Heading, { level: "h2", children: "Full Admin access" }),
|
|
2279
|
+
/* @__PURE__ */ jsx(Text, { size: "small", className: "text-ui-fg-subtle mt-2", children: superuserAuthority.description })
|
|
2280
|
+
] }),
|
|
2281
|
+
!isSuperuser(access) && Boolean(access.rules?.length) && /* @__PURE__ */ jsx(Container, { children: /* @__PURE__ */ jsx(
|
|
2267
2282
|
PermissionRules,
|
|
2268
2283
|
{
|
|
2269
2284
|
value: ruleDrafts(access.rules),
|
|
@@ -2275,7 +2290,7 @@ function MyAccess({
|
|
|
2275
2290
|
/* @__PURE__ */ jsx(
|
|
2276
2291
|
SettingsTable,
|
|
2277
2292
|
{
|
|
2278
|
-
title: "
|
|
2293
|
+
title: isSuperuser(access) ? "All registered permissions" : "Explicit permission grants",
|
|
2279
2294
|
headingLevel: "h2",
|
|
2280
2295
|
instance: table,
|
|
2281
2296
|
empty: "No permissions assigned",
|
|
@@ -2288,7 +2303,7 @@ function permissionKeyMatches(pattern, permission) {
|
|
|
2288
2303
|
return pattern === permission || pattern === "*" || pattern.endsWith(".*") && permission.startsWith(pattern.slice(0, -1));
|
|
2289
2304
|
}
|
|
2290
2305
|
function hasPermissionCandidate(principal, permission) {
|
|
2291
|
-
return principal.active && (principal
|
|
2306
|
+
return principal.active && (isSuperuser(principal) || principal.permissions.includes(permission) || Boolean(
|
|
2292
2307
|
principal.rules?.some(
|
|
2293
2308
|
(rule) => rule.effect === "allow" && permissionKeyMatches(rule.permission, permission)
|
|
2294
2309
|
)
|
|
@@ -2351,7 +2366,8 @@ const AccessManagement = () => {
|
|
|
2351
2366
|
{
|
|
2352
2367
|
access,
|
|
2353
2368
|
roles: query.data?.roles,
|
|
2354
|
-
permissionCatalog: query.data
|
|
2369
|
+
permissionCatalog: query.data.permission_catalog,
|
|
2370
|
+
superuserAuthority: query.data.superuser_authority
|
|
2355
2371
|
}
|
|
2356
2372
|
) })
|
|
2357
2373
|
]
|
|
@@ -2364,10 +2380,11 @@ function conditionValue(value) {
|
|
|
2364
2380
|
}
|
|
2365
2381
|
function PermissionSummary({
|
|
2366
2382
|
role,
|
|
2367
|
-
permissions
|
|
2383
|
+
permissions,
|
|
2384
|
+
superuserAuthority
|
|
2368
2385
|
}) {
|
|
2369
2386
|
const grants = permissions.filter(
|
|
2370
|
-
(permission) => role.permissions.includes(permission.id)
|
|
2387
|
+
(permission) => role.is_superuser || role.permissions.includes(permission.id)
|
|
2371
2388
|
);
|
|
2372
2389
|
const groups = [...new Set(grants.map((permission) => permission.group))];
|
|
2373
2390
|
return /* @__PURE__ */ jsxs(Container, { className: "divide-y p-0", children: [
|
|
@@ -2375,7 +2392,7 @@ function PermissionSummary({
|
|
|
2375
2392
|
/* @__PURE__ */ jsx(Heading, { level: "h2", children: "Permissions" }),
|
|
2376
2393
|
/* @__PURE__ */ jsx(Badge, { size: "2xsmall", children: role.is_superuser ? "All permissions" : `${grants.length} ${grants.length === 1 ? "grant" : "grants"}` })
|
|
2377
2394
|
] }),
|
|
2378
|
-
role.is_superuser && /* @__PURE__ */ jsx(Text, { size: "small", className: "text-ui-fg-subtle px-6 py-4", children:
|
|
2395
|
+
role.is_superuser && /* @__PURE__ */ jsx(Text, { size: "small", className: "text-ui-fg-subtle px-6 py-4", children: superuserAuthority.description }),
|
|
2379
2396
|
groups.map((group) => /* @__PURE__ */ jsxs("section", { className: "px-6 py-4", children: [
|
|
2380
2397
|
/* @__PURE__ */ jsx(Heading, { level: "h3", className: "mb-3", children: group }),
|
|
2381
2398
|
/* @__PURE__ */ jsx("ul", { className: "grid gap-3 sm:grid-cols-2", children: grants.filter((permission) => permission.group === group).map((permission) => /* @__PURE__ */ jsxs(
|
|
@@ -2390,7 +2407,7 @@ function PermissionSummary({
|
|
|
2390
2407
|
permission.id
|
|
2391
2408
|
)) })
|
|
2392
2409
|
] }, group)),
|
|
2393
|
-
(role.rules || []).map((rule, index) => /* @__PURE__ */ jsx("section", { className: "px-6 py-4", children: /* @__PURE__ */ jsxs("div", { className: "border-ui-border-base overflow-hidden rounded-lg border", children: [
|
|
2410
|
+
(!role.is_superuser ? role.rules || [] : []).map((rule, index) => /* @__PURE__ */ jsx("section", { className: "px-6 py-4", children: /* @__PURE__ */ jsxs("div", { className: "border-ui-border-base overflow-hidden rounded-lg border", children: [
|
|
2394
2411
|
/* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-2 px-4 py-3", children: [
|
|
2395
2412
|
/* @__PURE__ */ jsx(Text, { size: "small", weight: "plus", children: permissions.find(
|
|
2396
2413
|
(permission) => permission.id === rule.permission
|
|
@@ -2443,15 +2460,15 @@ function RoleDetail({ roleId }) {
|
|
|
2443
2460
|
enabled: allowed,
|
|
2444
2461
|
retry: false
|
|
2445
2462
|
});
|
|
2446
|
-
const
|
|
2463
|
+
const catalog = useQuery({
|
|
2447
2464
|
queryKey: ["medusa-rbac", access?.actor_id, "permissions"],
|
|
2448
2465
|
queryFn: accessApi.permissions,
|
|
2449
2466
|
enabled: allowed,
|
|
2450
2467
|
retry: false
|
|
2451
2468
|
});
|
|
2452
2469
|
const [editor, setEditor] = useState(null);
|
|
2453
|
-
if (current.error || detail.error ||
|
|
2454
|
-
return /* @__PURE__ */ jsx(Alert, { role: "alert", variant: "error", children: errorMessage(current.error || detail.error ||
|
|
2470
|
+
if (current.error || detail.error || catalog.error)
|
|
2471
|
+
return /* @__PURE__ */ jsx(Alert, { role: "alert", variant: "error", children: errorMessage(current.error || detail.error || catalog.error) });
|
|
2455
2472
|
if (current.isPending || !current.isFetchedAfterMount)
|
|
2456
2473
|
return /* @__PURE__ */ jsx(Container, { children: /* @__PURE__ */ jsx(Text, { role: "status", children: "Loading access…" }) });
|
|
2457
2474
|
if (!allowed)
|
|
@@ -2460,7 +2477,7 @@ function RoleDetail({ roleId }) {
|
|
|
2460
2477
|
/* @__PURE__ */ jsx(Text, { className: "text-ui-fg-subtle", children: "You do not have permission to view this role." }),
|
|
2461
2478
|
/* @__PURE__ */ jsx(Button, { asChild: true, variant: "secondary", size: "small", className: "mt-4", children: /* @__PURE__ */ jsx(Link, { to: "/settings/access-management?view=my-access", children: "View my access" }) })
|
|
2462
2479
|
] });
|
|
2463
|
-
if (detail.isPending ||
|
|
2480
|
+
if (detail.isPending || catalog.isPending)
|
|
2464
2481
|
return /* @__PURE__ */ jsx(Container, { children: /* @__PURE__ */ jsx(Text, { role: "status", children: "Loading role…" }) });
|
|
2465
2482
|
const { role, actors, actor_count, pending_invitation_count } = detail.data;
|
|
2466
2483
|
const managed = roleIsManaged(role);
|
|
@@ -2501,7 +2518,8 @@ function RoleDetail({ roleId }) {
|
|
|
2501
2518
|
PermissionSummary,
|
|
2502
2519
|
{
|
|
2503
2520
|
role,
|
|
2504
|
-
permissions:
|
|
2521
|
+
permissions: catalog.data.permissions,
|
|
2522
|
+
superuserAuthority: catalog.data.superuser_authority
|
|
2505
2523
|
}
|
|
2506
2524
|
) }),
|
|
2507
2525
|
/* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-3", children: [
|
|
@@ -2618,7 +2636,7 @@ function RoleDetail({ roleId }) {
|
|
|
2618
2636
|
open: true,
|
|
2619
2637
|
role: editor.mode === "edit" ? editor.role : void 0,
|
|
2620
2638
|
initialRole: editor.mode === "copy" ? editor.role : void 0,
|
|
2621
|
-
permissions:
|
|
2639
|
+
permissions: catalog.data.permissions,
|
|
2622
2640
|
readOnly: !access.is_superuser || editor.mode === "edit" && managed,
|
|
2623
2641
|
onClose: () => setEditor(null)
|
|
2624
2642
|
},
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import Medusa from "@medusajs/js-sdk";
|
|
2
|
-
import type { AccessPrincipal, Permission } from "../../lib/access/permissions";
|
|
2
|
+
import type { AccessPrincipal, Permission, SuperuserAuthority } from "../../lib/access/permissions";
|
|
3
3
|
import type { PermissionContext } from "../../lib/access/config";
|
|
4
4
|
import type { PermissionDecision } from "../../lib/access/explain";
|
|
5
5
|
export declare const sdk: Medusa;
|
|
@@ -67,7 +67,8 @@ export declare const accessApi: {
|
|
|
67
67
|
}>;
|
|
68
68
|
me: () => Promise<{
|
|
69
69
|
access: AccessPrincipal;
|
|
70
|
-
permission_catalog
|
|
70
|
+
permission_catalog: PermissionEntry[];
|
|
71
|
+
superuser_authority: SuperuserAuthority;
|
|
71
72
|
roles?: Pick<Role, "id" | "name">[];
|
|
72
73
|
}>;
|
|
73
74
|
roles: () => Promise<{
|
|
@@ -122,6 +123,7 @@ export declare const accessApi: {
|
|
|
122
123
|
deleteUser: (id: string) => Promise<unknown>;
|
|
123
124
|
permissions: () => Promise<{
|
|
124
125
|
permissions: PermissionEntry[];
|
|
126
|
+
superuser_authority: SuperuserAuthority;
|
|
125
127
|
actor_types?: string[];
|
|
126
128
|
}>;
|
|
127
129
|
staff: (offset: number, q?: string) => Promise<{
|
|
@@ -138,7 +140,8 @@ export declare const accessApi: {
|
|
|
138
140
|
};
|
|
139
141
|
export declare function useAccess(): import("@tanstack/react-query").UseQueryResult<{
|
|
140
142
|
access: AccessPrincipal;
|
|
141
|
-
permission_catalog
|
|
143
|
+
permission_catalog: PermissionEntry[];
|
|
144
|
+
superuser_authority: SuperuserAuthority;
|
|
142
145
|
roles?: Pick<Role, "id" | "name">[];
|
|
143
146
|
}, Error>;
|
|
144
147
|
export declare function accessFingerprint(access: AccessPrincipal): string;
|
|
@@ -111,4 +111,4 @@ function errorMessage(error) {
|
|
|
111
111
|
? error.message
|
|
112
112
|
: "The request failed. Reload and try again.";
|
|
113
113
|
}
|
|
114
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
114
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWNjZXNzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2FkbWluL2xpYi9hY2Nlc3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBcUxBLDhCQXdCQztBQUVELDhDQVVDO0FBRUQsNENBR0M7QUFFRCxvQ0FJQztBQXBPRCw4REFBcUM7QUFDckMsaUNBQXlDO0FBQ3pDLHVEQUFnRTtBQWFuRCxRQUFBLEdBQUcsR0FBRyxJQUFJLGdCQUFNLENBQUM7SUFDNUIsT0FBTyxFQUNMLE9BQU8sZUFBZSxLQUFLLFFBQVE7UUFDakMsQ0FBQyxDQUFDLGVBQWU7UUFDakIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsTUFBTTtJQUM1QixJQUFJLEVBQUU7UUFDSixJQUFJLEVBQUUsT0FBTyxhQUFhLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLFNBQVM7UUFDbkUsa0JBQWtCLEVBQ2hCLE9BQU8seUJBQXlCLEtBQUssUUFBUTtZQUMzQyxDQUFDLENBQUMseUJBQXlCO1lBQzNCLENBQUMsQ0FBQyxTQUFTO0tBQ2hCO0NBQ0YsQ0FBQyxDQUFBO0FBMENGLE1BQU0sSUFBSSxHQUFHLGVBQWUsQ0FBQTtBQUNmLFFBQUEsU0FBUyxHQUFHO0lBQ3ZCLE9BQU8sRUFBRSxHQUFHLEVBQUUsQ0FDWixXQUFHLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FRYixpQkFBaUIsQ0FBQztJQUN2QixTQUFTLEVBQUUsQ0FBQyxFQUFVLEVBQUUsRUFBRSxDQUN4QixXQUFHLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBbUIsR0FBRyxJQUFJLFVBQVUsRUFBRSxFQUFFLENBQUM7SUFDM0QsRUFBRSxFQUFFLEdBQUcsRUFBRSxDQUNQLFdBQUcsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUtiLEdBQUcsSUFBSSxLQUFLLENBQUM7SUFDbEIsS0FBSyxFQUFFLEdBQUcsRUFBRSxDQUFDLFdBQUcsQ0FBQyxNQUFN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
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.GET = GET;
|
|
4
|
+
const permissions_1 = require("../../../../lib/access/permissions");
|
|
4
5
|
const access_control_1 = require("../../../../modules/access-control");
|
|
5
6
|
async function GET(req, res) {
|
|
6
7
|
const access = req.scope.resolve(access_control_1.ACCESS_CONTROL);
|
|
@@ -10,6 +11,7 @@ async function GET(req, res) {
|
|
|
10
11
|
? await access.listAccessRoles({ id: principal.role_ids }, { select: ["id", "name"], take: principal.role_ids.length })
|
|
11
12
|
: [];
|
|
12
13
|
res.json({
|
|
14
|
+
superuser_authority: permissions_1.SUPERUSER_AUTHORITY,
|
|
13
15
|
access: principal,
|
|
14
16
|
permission_catalog: access
|
|
15
17
|
.permissionDefinitions()
|
|
@@ -17,4 +19,4 @@ async function GET(req, res) {
|
|
|
17
19
|
roles: roles.map(({ id, name }) => ({ id, name })),
|
|
18
20
|
});
|
|
19
21
|
}
|
|
20
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
22
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL2FkbWluL2FjY2Vzcy9tZS9yb3V0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQVFBLGtCQXFCQztBQTdCRCxvRUFBd0U7QUFLeEUsdUVBQW1FO0FBRzVELEtBQUssVUFBVSxHQUFHLENBQ3ZCLEdBQStCLEVBQy9CLEdBQW1CO0lBRW5CLE1BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUF1QiwrQkFBYyxDQUFDLENBQUE7SUFDdEUsR0FBRyxDQUFDLFNBQVMsQ0FBQyxlQUFlLEVBQUUsVUFBVSxDQUFDLENBQUE7SUFDMUMsTUFBTSxTQUFTLEdBQUcsTUFBTSxNQUFNLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLENBQUE7SUFDbkUsTUFBTSxLQUFLLEdBQUcsU0FBUyxDQUFDLFFBQVEsQ0FBQyxNQUFNO1FBQ3JDLENBQUMsQ0FBQyxNQUFNLE1BQU0sQ0FBQyxlQUFlLENBQzFCLEVBQUUsRUFBRSxFQUFFLFNBQVMsQ0FBQyxRQUFRLEVBQUUsRUFDMUIsRUFBRSxNQUFNLEVBQUUsQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLEVBQUUsSUFBSSxFQUFFLFNBQVMsQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQzVEO1FBQ0gsQ0FBQyxDQUFDLEVBQUUsQ0FBQTtJQUNOLEdBQUcsQ0FBQyxJQUFJLENBQUM7UUFDUCxtQkFBbUIsRUFBRSxpQ0FBbUI7UUFDeEMsTUFBTSxFQUFFLFNBQVM7UUFDakIsa0JBQWtCLEVBQUUsTUFBTTthQUN2QixxQkFBcUIsRUFBRTthQUN2QixHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7UUFDdEQsS0FBSyxFQUFFLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0tBQ25ELENBQUMsQ0FBQTtBQUNKLENBQUMifQ==
|
|
@@ -1,10 +1,13 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.GET = GET;
|
|
4
|
+
const permissions_1 = require("../../../../lib/access/permissions");
|
|
4
5
|
const access_control_1 = require("../../../../modules/access-control");
|
|
5
6
|
async function GET(req, res) {
|
|
6
7
|
const access = req.scope.resolve(access_control_1.ACCESS_CONTROL);
|
|
8
|
+
res.setHeader("Cache-Control", "no-store");
|
|
7
9
|
res.json({
|
|
10
|
+
superuser_authority: permissions_1.SUPERUSER_AUTHORITY,
|
|
8
11
|
actor_types: [
|
|
9
12
|
"user",
|
|
10
13
|
"customer",
|
|
@@ -15,4 +18,4 @@ async function GET(req, res) {
|
|
|
15
18
|
.map(([id, label, group]) => ({ id, label, group })),
|
|
16
19
|
});
|
|
17
20
|
}
|
|
18
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
21
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL2FkbWluL2FjY2Vzcy9wZXJtaXNzaW9ucy9yb3V0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUlBLGtCQWNDO0FBbEJELG9FQUF3RTtBQUV4RSx1RUFBbUU7QUFFNUQsS0FBSyxVQUFVLEdBQUcsQ0FBQyxHQUFrQixFQUFFLEdBQW1CO0lBQy9ELE1BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUF1QiwrQkFBYyxDQUFDLENBQUE7SUFDdEUsR0FBRyxDQUFDLFNBQVMsQ0FBQyxlQUFlLEVBQUUsVUFBVSxDQUFDLENBQUE7SUFDMUMsR0FBRyxDQUFDLElBQUksQ0FBQztRQUNQLG1CQUFtQixFQUFFLGlDQUFtQjtRQUN4QyxXQUFXLEVBQUU7WUFDWCxNQUFNO1lBQ04sVUFBVTtZQUNWLEdBQUcsTUFBTSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDO1NBQzFEO1FBQ0QsV0FBVyxFQUFFLE1BQU07YUFDaEIscUJBQXFCLEVBQUU7YUFDdkIsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO0tBQ3ZELENBQUMsQ0FBQTtBQUNKLENBQUMifQ==
|