@rpcbase/db 0.63.0 → 0.65.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.
- package/dist/acl/index.js +2 -1
- package/dist/acl/mongooseAclPlugin.d.ts +1 -0
- package/dist/acl/mongooseAclPlugin.d.ts.map +1 -1
- package/dist/acl/registry.d.ts +1 -0
- package/dist/acl/registry.d.ts.map +1 -1
- package/dist/{can-urGFf45M.js → can--Y-1LK22.js} +11 -11
- package/dist/can--Y-1LK22.js.map +1 -0
- package/dist/createModels.d.ts +7 -0
- package/dist/createModels.d.ts.map +1 -1
- package/dist/{index-Drge1bnG.js → index-g1_0RZ-U.js} +4 -5
- package/dist/{index-Drge1bnG.js.map → index-g1_0RZ-U.js.map} +1 -1
- package/dist/index.browser.js +1 -1
- package/dist/index.js +904 -311
- package/dist/index.js.map +1 -1
- package/dist/modelsApi.d.ts +3 -0
- package/dist/modelsApi.d.ts.map +1 -1
- package/package.json +1 -1
- package/dist/can-urGFf45M.js.map +0 -1
package/dist/modelsApi.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { AppAbility } from './acl';
|
|
1
2
|
export type LoadModelCtx = {
|
|
2
3
|
req: {
|
|
3
4
|
session?: {
|
|
@@ -6,12 +7,14 @@ export type LoadModelCtx = {
|
|
|
6
7
|
};
|
|
7
8
|
} | null;
|
|
8
9
|
};
|
|
10
|
+
ability?: AppAbility;
|
|
9
11
|
};
|
|
10
12
|
export declare const models: {
|
|
11
13
|
readonly register: ({ tenant, global }: {
|
|
12
14
|
tenant: import('./registerModels').ModelModules;
|
|
13
15
|
global?: import('./registerModels').ModelModules;
|
|
14
16
|
}) => void;
|
|
17
|
+
readonly getUnsafe: (modelName: string, ctx: LoadModelCtx) => Promise<import('mongoose').Model<any, {}, {}, {}, any, any, any>>;
|
|
15
18
|
readonly get: (modelName: string, ctx: LoadModelCtx) => Promise<import('mongoose').Model<any, {}, {}, {}, any, any, any>>;
|
|
16
19
|
readonly getGlobal: (modelName: string, ctx: LoadModelCtx) => Promise<import('mongoose').Model<any, {}, {}, {}, any, any, any>>;
|
|
17
20
|
};
|
package/dist/modelsApi.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"modelsApi.d.ts","sourceRoot":"","sources":["../src/modelsApi.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"modelsApi.d.ts","sourceRoot":"","sources":["../src/modelsApi.ts"],"names":[],"mappings":"AAKA,OAAO,EAAuB,KAAK,UAAU,EAAE,MAAM,OAAO,CAAA;AAG5D,MAAM,MAAM,YAAY,GAAG;IACzB,GAAG,EAAE;QACH,OAAO,CAAC,EAAE;YACR,IAAI,CAAC,EAAE;gBACL,eAAe,CAAC,EAAE,MAAM,CAAC;aAC1B,CAAA;SACF,GAAG,IAAI,CAAC;KACV,CAAC;IACF,OAAO,CAAC,EAAE,UAAU,CAAC;CACtB,CAAC;AA0BF,eAAO,MAAM,MAAM;;;cAiCiP,CAAC;;oCA9BtO,MAAM,OAAO,YAAY;8BAM/B,MAAM,OAAO,YAAY;oCAmBnB,MAAM,OAAO,YAAY;CAI9C,CAAA"}
|
package/package.json
CHANGED
package/dist/can-urGFf45M.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"can-urGFf45M.js","sources":["../src/acl/registry.ts","../src/acl/buildAbility.ts","../src/acl/session.ts","../src/acl/accessible.ts","../src/acl/can.ts"],"sourcesContent":["import type { AbilityBuilder } from \"@casl/ability\"\n\nimport type { AclContext, AclSubjectType, AppAbility } from \"./types\"\n\n\nexport type AclPolicy = {\n subject: Exclude<AclSubjectType, \"all\">\n define: (builder: AbilityBuilder<AppAbility>, ctx: AclContext) => void\n}\n\nconst POLICIES_GLOBAL_KEY = Symbol.for(\"@rpcbase/db/acl/policiesBySubject\")\n\nconst getGlobalPoliciesMap = (): Map<string, Set<AclPolicy[\"define\"]>> => {\n const store = globalThis as unknown as Record<symbol, unknown>\n const existing = store[POLICIES_GLOBAL_KEY]\n if (existing instanceof Map) {\n return existing as Map<string, Set<AclPolicy[\"define\"]>>\n }\n const created = new Map<string, Set<AclPolicy[\"define\"]>>()\n store[POLICIES_GLOBAL_KEY] = created\n return created\n}\n\nconst policiesBySubject = getGlobalPoliciesMap()\n\nconst isPolicy = (value: unknown): value is AclPolicy => {\n if (!value || typeof value !== \"object\") return false\n const maybe = value as Partial<AclPolicy>\n return typeof maybe.subject === \"string\" && typeof maybe.define === \"function\"\n}\n\nexport const registerPolicy = (policy: AclPolicy): void => {\n const set = policiesBySubject.get(policy.subject) ?? new Set<AclPolicy[\"define\"]>()\n set.add(policy.define)\n policiesBySubject.set(policy.subject, set)\n}\n\nexport const registerPoliciesFromModules = (modules: Record<string, unknown>): void => {\n for (const [exportName, value] of Object.entries(modules)) {\n if (!isPolicy(value)) continue\n\n if (!exportName.endsWith(\"Policy\")) {\n throw new Error(\n `Invalid policy export name \"${exportName}\". Policies must be exported as \"<ModelName>Policy\".`,\n )\n }\n\n const expectedSubject = exportName.slice(0, -(\"Policy\".length))\n if (value.subject !== expectedSubject) {\n throw new Error(\n `Invalid policy \"${exportName}\": expected subject \"${expectedSubject}\", got \"${value.subject}\".`,\n )\n }\n\n registerPolicy(value)\n }\n}\n\nexport const getRegisteredPolicies = (): Array<AclPolicy[\"define\"]> => {\n const out: Array<AclPolicy[\"define\"]> = []\n for (const set of policiesBySubject.values()) {\n for (const fn of set) out.push(fn)\n }\n return out\n}\n","import { AbilityBuilder, createMongoAbility } from \"@casl/ability\"\n\nimport { getRegisteredPolicies } from \"./registry\"\nimport type { AclContext, AppAbility } from \"./types\"\n\n\nexport const buildAbility = (ctx: AclContext): AppAbility => {\n const builder = new AbilityBuilder<AppAbility>(createMongoAbility)\n\n const { can } = builder\n\n if (ctx.roles.includes(\"owner\") || ctx.roles.includes(\"admin\")) {\n can(\"manage\", \"all\")\n }\n\n for (const define of getRegisteredPolicies()) {\n define(builder, ctx)\n }\n\n return builder.build()\n}\n\n","import { buildAbility } from \"./buildAbility\"\nimport type { AppAbility, TenantRolesByTenantId } from \"./types\"\n\n\ntype SessionUserLike = {\n id?: unknown\n signedInTenants?: unknown\n tenantRoles?: unknown\n}\n\ntype SessionLike = {\n user?: SessionUserLike\n}\n\nconst normalizeRole = (raw: unknown): string | null => {\n if (typeof raw !== \"string\") return null\n const normalized = raw.trim()\n return normalized ? normalized : null\n}\n\nconst normalizeRoles = (raw: unknown): string[] => {\n if (Array.isArray(raw)) {\n return raw.map(normalizeRole).filter((r): r is string => Boolean(r))\n }\n const role = normalizeRole(raw)\n return role ? [role] : []\n}\n\nconst normalizeRolesByTenantId = (raw: unknown): TenantRolesByTenantId | null => {\n if (!raw || typeof raw !== \"object\") return null\n if (raw instanceof Map) {\n return Object.fromEntries(Array.from(raw.entries()).map(([key, value]) => [String(key), normalizeRoles(value)]))\n }\n const obj = raw as Record<string, unknown>\n const out: TenantRolesByTenantId = {}\n for (const [key, value] of Object.entries(obj)) {\n const tenantId = String(key).trim()\n if (!tenantId) continue\n out[tenantId] = normalizeRoles(value)\n }\n return out\n}\n\nexport const getTenantRolesFromSessionUser = (user: unknown, tenantId: string): string[] => {\n if (!user || typeof user !== \"object\") return []\n const rolesByTenantId = normalizeRolesByTenantId((user as SessionUserLike).tenantRoles)\n if (!rolesByTenantId) return []\n return rolesByTenantId[tenantId]?.filter(Boolean) ?? []\n}\n\nexport const buildAbilityFromSession = ({\n tenantId,\n session,\n claims,\n}: {\n tenantId: string\n session: SessionLike | null | undefined\n claims?: Record<string, unknown>\n}): AppAbility => {\n const user = session?.user\n const userId = typeof user?.id === \"string\" ? user.id.trim() : \"\"\n const rolesByTenantId = normalizeRolesByTenantId(user?.tenantRoles)\n const hasExplicitTenantEntry = Boolean(\n rolesByTenantId && Object.prototype.hasOwnProperty.call(rolesByTenantId, tenantId),\n )\n\n const signedInTenantsRaw = user?.signedInTenants\n const signedInTenants = Array.isArray(signedInTenantsRaw) ? signedInTenantsRaw.map(String) : []\n\n const roles = hasExplicitTenantEntry\n ? rolesByTenantId![tenantId] ?? []\n : userId && signedInTenants.includes(tenantId)\n ? [\"owner\"]\n : getTenantRolesFromSessionUser(user, tenantId)\n\n return buildAbility({\n tenantId,\n userId: userId || null,\n roles,\n claims,\n })\n}\n","import { accessibleBy } from \"@casl/mongoose\"\n\nimport type { AclAction, AclSubjectType, AppAbility } from \"./types\"\n\n\nexport const getAccessibleByQuery = (\n ability: AppAbility,\n action: AclAction,\n subject: Exclude<AclSubjectType, \"all\">,\n): Record<string, unknown> => {\n return accessibleBy(ability, action).ofType(subject)\n}\n","import { subject } from \"@casl/ability\"\n\nimport type { AclAction, AclSubject, AclSubjectMap, AclSubjectType, AppAbility } from \"./types\"\n\n\nexport const can = <TSubject extends Exclude<AclSubjectType, \"all\">>(\n ability: AppAbility,\n action: AclAction,\n subjectType: TSubject,\n object?: Partial<AclSubjectMap[TSubject]> | null,\n): boolean => {\n if (object && typeof object === \"object\") {\n return ability.can(action, subject(subjectType, object) as unknown as AclSubject)\n }\n return ability.can(action, subjectType)\n}\n"],"names":["can","subject"],"mappings":"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"}
|