endpoint-permissions-kit 0.1.0 → 0.2.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.
@@ -1,20 +1,22 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../../src/constants.ts", "../../src/state.ts", "../../src/errors.ts", "../../src/resolve.ts", "../../src/validators.ts", "../../src/context.ts", "../../src/registry.ts", "../../src/seal.ts", "../../src/permissions.ts", "../../src/validate.ts", "../../src/index.ts"],
3
+ "sources": ["../../src/constants.ts", "../../src/errors.ts", "../../src/identifiers.ts", "../../src/state.ts", "../../src/context.ts", "../../src/resolve.ts", "../../src/permissions.ts", "../../src/properties.ts", "../../src/definitions.ts", "../../src/registry.ts", "../../src/seal.ts", "../../src/validate.ts", "../../src/index.ts"],
4
4
  "sourcesContent": [
5
- "export const METHODS = ['find', 'update', 'create', 'remove'] as const;\n\nexport const GENERAL_ROLE = 'general';\n\nexport const GLOBAL_HOOK_OWNER = '*';\n\nexport const ALL_FIELDS = '*';\n\nexport const MODULE_SEPARATOR = '.';\n\nexport const PERMISSION_ID_SEPARATOR = '::';\n",
6
- "import type { ActionDefs, GrantDefs, HookFn, Method, NamedPermissionCatalog } from './types';\nimport { GENERAL_ROLE } from './constants';\n\nexport interface PermissionReference {\n readonly role: string;\n readonly action: string;\n readonly name: string;\n}\n\nexport interface GrantEntry {\n readonly source: PermissionReference;\n readonly actions: GrantDefs;\n}\n\nexport interface NameEntry {\n readonly actions: Map<string, ActionDefs>;\n readonly grants: Map<string, GrantEntry>;\n readonly hooks: Map<string, Map<Method, HookFn[]>>;\n}\n\nexport interface ModuleEntry {\n readonly names: Map<string, NameEntry>;\n readonly hooks: Map<Method, HookFn[]>;\n}\n\ninterface Snapshot {\n readonly named: NamedPermissionCatalog;\n readonly assignable: ReadonlySet<string>;\n}\n\nexport interface State {\n roles: Set<string>;\n readonly modules: Map<string, ModuleEntry>;\n snapshot: Snapshot | null;\n}\n\nexport function getOrCreateState(): State {\n const stateKey = Symbol.for('endpoint-permissions-kit');\n const stateHost = globalThis as typeof globalThis & { [stateKey]?: State };\n\n if (stateHost[stateKey] === undefined) {\n stateHost[stateKey] = { roles: new Set([GENERAL_ROLE]), modules: new Map(), snapshot: null };\n }\n\n return stateHost[stateKey];\n}\n",
7
- "import type { PkitErrorCode } from './types';\n\nexport type PkitError = Error & { name: 'PkitError' } & (\n | { code: Exclude<PkitErrorCode, 'PROPERTIES_NOT_ALLOWED'> }\n | { code: 'PROPERTIES_NOT_ALLOWED'; fields: readonly string[] }\n);\n\nexport function pkitError<ErrorCode extends PkitErrorCode>(code: ErrorCode, message: string): Error & {\n name: 'PkitError';\n code: ErrorCode;\n} {\n return Object.assign(new Error(message), { name: 'PkitError' as const, code });\n}\n",
8
- "import type { Authorization, Method, PermissionId, Properties } from './types';\nimport type { NameEntry } from './state';\nimport { PERMISSION_ID_SEPARATOR } from './constants';\n\nexport type Access =\n | { readonly status: 'granted'; readonly properties: Properties; readonly authorization: Authorization }\n | { readonly status: 'disabled' }\n | { readonly status: 'unassigned' };\n\nconst DIRECT_AUTHORIZATION: Authorization = Object.freeze({ direct: true, grantedBy: Object.freeze([]) });\n\nconst DISABLED_ACCESS: Access = Object.freeze({ status: 'disabled' });\n\nconst UNASSIGNED_ACCESS: Access = Object.freeze({ status: 'unassigned' });\n\nexport function permissionIdOf(role: string, action: string, name: string): PermissionId {\n return [role, action, name].join(PERMISSION_ID_SEPARATOR) as PermissionId;\n}\n\nexport function resolveAccess(nameEntry: NameEntry, permissionId: string, role: string, method: Method, assigned: ReadonlySet<string>): Access {\n if (assigned.has(permissionId)) return resolveDirectAccess(nameEntry, role, method);\n\n return resolveGrantedAccess(nameEntry, method, assigned);\n}\n\nfunction resolveDirectAccess(nameEntry: NameEntry, role: string, method: Method): Access {\n const definition = nameEntry.actions.get(role)?.[method];\n if (!definition?.enabled) return DISABLED_ACCESS;\n\n return { status: 'granted', properties: definition.properties, authorization: DIRECT_AUTHORIZATION };\n}\n\nfunction resolveGrantedAccess(nameEntry: NameEntry, method: Method, assigned: ReadonlySet<string>): Access {\n const grantedBy: PermissionId[] = [];\n const properties = new Set<string>();\n let reachable = false;\n\n for (const [enablingId, grant] of nameEntry.grants) {\n if (!assigned.has(enablingId)) continue;\n reachable = true;\n\n const definition = grant.actions[method];\n if (!definition) continue;\n\n grantedBy.push(enablingId as PermissionId);\n for (const field of definition.properties) properties.add(field);\n }\n\n if (grantedBy.length === 0) return reachable ? DISABLED_ACCESS : UNASSIGNED_ACCESS;\n\n const authorization: Authorization = Object.freeze({ direct: false, grantedBy: Object.freeze(grantedBy.sort()) });\n\n return { status: 'granted', properties: Object.freeze([...properties]), authorization };\n}\n",
9
- "import { ALL_FIELDS, GLOBAL_HOOK_OWNER, METHODS, MODULE_SEPARATOR, PERMISSION_ID_SEPARATOR } from './constants';\nimport { pkitError } from './errors';\nimport { permissionIdOf, resolveAccess } from './resolve';\nimport type { GrantEntry, ModuleEntry, NameEntry, PermissionReference, State } from './state';\nimport type { ActionDef, ActionDefs, Context, Data, FindInput, FindResult, GrantDefs, HookFn, Method, PkitErrorCode, ResolvedPermission, Role, UserAssignments, ValidateInput } from './types';\n\ninterface ValidationFailure {\n code: PkitErrorCode;\n message: string;\n}\n\ninterface StringRules extends ValidationFailure {\n minimumLength: number;\n}\n\ninterface DirectRegistration {\n action: string;\n name: string;\n role: string;\n}\n\ninterface GrantRegistration {\n action: string;\n name: string;\n permissionId: string;\n}\n\ninterface HookRegistration {\n action: string;\n name?: string;\n role?: string;\n method: Method;\n}\n\ninterface Identity {\n role: Role;\n assigned: ReadonlySet<string>;\n}\n\ninterface ValidatedRequest {\n registeredModule: ModuleEntry;\n nameEntry: NameEntry;\n permission: ResolvedPermission;\n data: Data | undefined;\n context: Context | undefined;\n result: FindResult | Data;\n}\n\nfunction validateObject(value: unknown, failure: ValidationFailure): asserts value is Data {\n if (value === null || typeof value !== 'object' || Array.isArray(value)) {\n throw pkitError(failure.code, failure.message);\n }\n}\n\nexport function validateStrings(value: unknown, rules: StringRules): asserts value is readonly string[] {\n if (!Array.isArray(value)) throw pkitError(rules.code, rules.message);\n\n for (const field of value) {\n if (typeof field !== 'string' || field.length < rules.minimumLength) {\n throw pkitError(rules.code, rules.message);\n }\n }\n}\n\nexport function validateContextKey(key: unknown): asserts key is 'roles' {\n if (key !== 'roles') throw pkitError('INVALID_DEFINITION', `unknown context key: \"${String(key)}\"`);\n}\n\nfunction validateOpenRegistry(state: State): void {\n if (state.snapshot) throw pkitError('SEALED', 'pkit.seal() was already called: no more registrations allowed');\n}\n\nexport function validateSnapshot<Snapshot>(snapshot: Snapshot | null): asserts snapshot is Snapshot {\n if (snapshot === null) {\n throw pkitError('NOT_SEALED', 'pkit.seal() has not been called: call it after importing every permission file');\n }\n}\n\nexport function validateRole(role: unknown, roles: ReadonlySet<string>, code: 'ROLE_NOT_DECLARED' | 'UNKNOWN_ROLE'): asserts role is Role {\n if (typeof role === 'string' && roles.has(role)) return;\n\n if (code === 'ROLE_NOT_DECLARED') {\n throw pkitError(code,\n `role \"${String(role)}\" is not declared. Available roles: ${[...roles].join(', ')}.\\n` +\n \"Is pkit.context.set('roles', [...]) missing from pkit.config.js, or was it imported after this file?\",\n );\n }\n\n throw pkitError(code, `role \"${String(role)}\" is not declared`);\n}\n\nexport function validateRoleCatalog(roles: unknown, state: State): asserts roles is readonly string[] {\n validateOpenRegistry(state);\n\n if (state.modules.size) {\n throw pkitError('INVALID_DEFINITION', 'roles must be declared before registering permissions: import pkit.config.js first');\n }\n\n validateStrings(roles, {\n code: 'INVALID_DEFINITION', message: 'roles must be an array of non-empty strings', minimumLength: 1,\n });\n\n if (roles.length === 0) throw pkitError('INVALID_DEFINITION', 'roles must declare at least one role');\n\n for (const role of roles) validateRoleSegment(role);\n}\n\nfunction isCleanSegment(value: string): boolean {\n return value.length > 0 && value.trim() === value && !value.includes(':');\n}\n\nexport function validateRoleSegment(role: unknown): asserts role is string {\n if (typeof role === 'string' && isCleanSegment(role) && role !== GLOBAL_HOOK_OWNER) return;\n\n throw pkitError('INVALID_DEFINITION',\n `invalid role: \"${String(role)}\" (non-empty string, no \":\" or surrounding whitespace; \"${GLOBAL_HOOK_OWNER}\" is reserved for global hooks)`,\n );\n}\n\nexport function validateModuleName(moduleName: unknown): asserts moduleName is string {\n if (typeof moduleName === 'string' && isCleanSegment(moduleName) && !moduleName.includes(MODULE_SEPARATOR)) return;\n\n throw pkitError('INVALID_DEFINITION',\n `invalid module name: \"${String(moduleName)}\" (non-empty string, no dots, no \":\" or surrounding whitespace)`,\n );\n}\n\nexport function validatePermissionName(name: unknown): asserts name is string {\n if (typeof name === 'string' && isCleanSegment(name) && name !== GLOBAL_HOOK_OWNER) return;\n\n throw pkitError('INVALID_DEFINITION',\n `invalid permission name: \"${String(name)}\" (non-empty string, no \":\" or surrounding whitespace; \"*\" is reserved)`,\n );\n}\n\nexport function parsePermissionId(value: unknown, failure: ValidationFailure): PermissionReference {\n if (typeof value !== 'string') throw pkitError(failure.code, failure.message);\n\n const parts = value.split(PERMISSION_ID_SEPARATOR);\n const [role, action, name] = parts;\n\n if (parts.length !== 3 || role === undefined || action === undefined || name === undefined) {\n throw pkitError(failure.code, failure.message);\n }\n\n const isValidRole = isCleanSegment(role) && role !== GLOBAL_HOOK_OWNER;\n const isValidName = isCleanSegment(name) && name !== GLOBAL_HOOK_OWNER;\n const isValidAction = action.split(MODULE_SEPARATOR).every(isCleanSegment);\n\n if (!isValidRole || !isValidName || !isValidAction) throw pkitError(failure.code, failure.message);\n\n return { role, action, name };\n}\n\nfunction validateMethod(method: unknown, failure: ValidationFailure): asserts method is Method {\n if ((METHODS as readonly unknown[]).includes(method)) return;\n\n throw pkitError(failure.code, `${failure.message}: method \"${String(method)}\" does not exist. Methods: ${METHODS.join(', ')}`);\n}\n\nfunction readActionDefinition(definition: unknown, permissionPath: string): ActionDef {\n validateObject(definition, { code: 'INVALID_DEFINITION', message: `${permissionPath}: must be an object` });\n\n if (typeof definition.enabled !== 'boolean') {\n throw pkitError('INVALID_DEFINITION', `${permissionPath}: enabled must be a boolean`);\n }\n\n const { properties } = definition;\n\n if (properties === ALL_FIELDS) return Object.freeze({ enabled: definition.enabled, properties });\n\n validateStrings(properties, {\n code: 'INVALID_DEFINITION', message: `${permissionPath}: properties must be string[] or '*'`, minimumLength: 1,\n });\n\n if (properties.includes(ALL_FIELDS)) {\n throw pkitError('INVALID_DEFINITION', `${permissionPath}: '${ALL_FIELDS}' is only allowed as the whole properties value`);\n }\n\n if (new Set(properties).size !== properties.length) {\n throw pkitError('INVALID_DEFINITION', `${permissionPath}: properties contains duplicate fields`);\n }\n\n return Object.freeze({ enabled: definition.enabled, properties: Object.freeze([...properties]) });\n}\n\nfunction readActionDefinitions(actions: unknown, permissionPath: string): ActionDefs {\n validateObject(actions, { code: 'INVALID_DEFINITION', message: `${permissionPath}: registerActions expects an object` });\n\n const registeredActions: ActionDefs = Object.create(null);\n\n for (const [method, definition] of Object.entries(actions)) {\n validateMethod(method, { code: 'INVALID_DEFINITION', message: permissionPath });\n registeredActions[method] = readActionDefinition(definition, `${permissionPath}.${method}`);\n }\n\n return Object.freeze(registeredActions);\n}\n\nexport function validateActions(actions: unknown, registration: DirectRegistration, state: State): ActionDefs {\n const { action, name, role } = registration;\n\n validateOpenRegistry(state);\n validateRole(role, state.roles, 'ROLE_NOT_DECLARED');\n\n if (state.modules.get(action)?.names.get(name)?.actions.has(role)) {\n throw pkitError('DUPLICATE_REGISTRATION', `\"${action}::${name}\" already has actions registered for role \"${role}\"`);\n }\n\n return readActionDefinitions(actions, `${action}::${name} [${role}]`);\n}\n\nexport function validateGrantActions(actions: unknown, registration: GrantRegistration, state: State): GrantEntry {\n const { action, name, permissionId } = registration;\n\n validateOpenRegistry(state);\n\n const source = parsePermissionId(permissionId, {\n code: 'INVALID_DEFINITION',\n message: `\"${action}::${name}\": invalid grantTo identifier: \"${String(permissionId)}\" (format role::module::name)`,\n });\n\n validateRole(source.role, state.roles, 'ROLE_NOT_DECLARED');\n\n if (source.action === action && source.name === name) {\n throw pkitError('INVALID_DEFINITION', `\"${permissionId}\" cannot grant to itself`);\n }\n\n if (state.modules.get(action)?.names.get(name)?.grants.has(permissionId)) {\n throw pkitError('DUPLICATE_REGISTRATION', `\"${action}::${name}\" already has a grant for \"${permissionId}\"`);\n }\n\n const permissionPath = `${action}::${name} [grantTo ${permissionId}]`;\n const registeredActions = readActionDefinitions(actions, permissionPath);\n\n for (const [method, definition] of Object.entries(registeredActions)) {\n if (definition.enabled !== true) {\n throw pkitError('INVALID_DEFINITION', `${permissionPath}.${method}: a grant does not allow enabled: false`);\n }\n\n if (definition.properties === ALL_FIELDS) {\n throw pkitError('INVALID_DEFINITION', `${permissionPath}.${method}: a grant requires an explicit properties list`);\n }\n }\n\n return { source, actions: registeredActions as GrantDefs };\n}\n\nexport function validateHook(hook: unknown, registration: HookRegistration, state: State): asserts hook is HookFn {\n const { action, name, role, method } = registration;\n\n validateOpenRegistry(state);\n\n if (role !== undefined && role !== GLOBAL_HOOK_OWNER) validateRole(role, state.roles, 'ROLE_NOT_DECLARED');\n\n const permissionPath = name === undefined ? action : `${action}::${name}`;\n\n validateMethod(method, { code: 'INVALID_DEFINITION', message: permissionPath });\n\n if (typeof hook !== 'function') throw pkitError('INVALID_DEFINITION', `${permissionPath}: hook(\"${method}\") expects a function`);\n}\n\nfunction declaresMethod(nameEntry: NameEntry, method: string): boolean {\n for (const actions of nameEntry.actions.values()) {\n if (Object.hasOwn(actions, method)) return true;\n }\n\n return false;\n}\n\nfunction hasAccessPath(nameEntry: NameEntry, role: string, method: Method): boolean {\n if (nameEntry.actions.get(role)?.[method]) return true;\n\n for (const grant of nameEntry.grants.values()) {\n if (grant.source.role === role && grant.actions[method]) return true;\n }\n\n return false;\n}\n\nfunction validateGrantReferences(permissionPath: string, nameEntry: NameEntry, modules: ReadonlyMap<string, ModuleEntry>): void {\n for (const [permissionId, grant] of nameEntry.grants) {\n const sourceEntry = modules.get(grant.source.action)?.names.get(grant.source.name);\n\n if (!sourceEntry?.actions.has(grant.source.role)) {\n throw pkitError('INVALID_DEFINITION', `\"${permissionPath}\": grantTo \"${permissionId}\" references a permission with no registered actions`);\n }\n\n for (const method of Object.keys(grant.actions)) {\n if (declaresMethod(nameEntry, method)) continue;\n\n throw pkitError('INVALID_DEFINITION',\n `\"${permissionPath}\": grantTo \"${permissionId}\" grants \"${method}\", which no role declares on that permission`,\n );\n }\n }\n}\n\nfunction validateRoleHooks(permissionPath: string, nameEntry: NameEntry): void {\n for (const [hookRole, methodHooks] of nameEntry.hooks) {\n if (hookRole === GLOBAL_HOOK_OWNER) continue;\n\n for (const method of methodHooks.keys()) {\n if (hasAccessPath(nameEntry, hookRole, method)) continue;\n\n throw pkitError('INVALID_DEFINITION',\n `\"${permissionPath}\": hook for \"${hookRole}\" on \"${method}\" has no registered actions or grant for that role`,\n );\n }\n }\n}\n\nexport function validateSealedRegistry(modules: ReadonlyMap<string, ModuleEntry>): void {\n for (const [action, registeredModule] of modules) {\n if (registeredModule.names.size === 0) {\n throw pkitError('INVALID_DEFINITION', `\"${action}\" has hooks but no name with registered actions`);\n }\n\n for (const [name, nameEntry] of registeredModule.names) {\n const permissionPath = `${action}::${name}`;\n\n if (nameEntry.actions.size === 0) {\n throw pkitError('INVALID_DEFINITION', `\"${permissionPath}\" has no registered actions for any role`);\n }\n\n validateGrantReferences(permissionPath, nameEntry, modules);\n validateRoleHooks(permissionPath, nameEntry);\n }\n }\n}\n\nfunction validateAssignments(permissions: unknown, role: string, assignable: ReadonlySet<string>): ReadonlySet<string> {\n validateStrings(permissions, { code: 'INVALID_INPUT', message: 'permissions must be an array of strings', minimumLength: 1 });\n\n const assigned = new Set<string>();\n\n for (const permissionId of permissions) {\n const reference = parsePermissionId(permissionId, {\n code: 'INVALID_INPUT', message: `invalid permission identifier: \"${permissionId}\" (format role::module::name)`,\n });\n\n if (reference.role !== role) {\n throw pkitError('PERMISSION_ROLE_MISMATCH', `\"${permissionId}\" belongs to role \"${reference.role}\", not the authenticated role \"${role}\"`);\n }\n\n if (!assignable.has(permissionId)) {\n throw pkitError('UNKNOWN_PERMISSION', `\"${permissionId}\" is not an assignable permission`);\n }\n\n assigned.add(permissionId);\n }\n\n return assigned;\n}\n\nexport function validateIdentity(assignments: UserAssignments, state: State): Identity {\n validateSnapshot(state.snapshot);\n\n const { role, permissions } = assignments;\n\n if (typeof role !== 'string') throw pkitError('INVALID_INPUT', 'role is required');\n validateRole(role, state.roles, 'UNKNOWN_ROLE');\n\n return { role, assigned: validateAssignments(permissions, role, state.snapshot.assignable) };\n}\n\nfunction trimSelection(select: unknown, properties: readonly string[]): readonly string[] {\n validateStrings(select, { code: 'INVALID_INPUT', message: 'select must be an array of strings', minimumLength: 0 });\n\n const selectedFields: string[] = [];\n\n for (const field of select) {\n if (properties.includes(field)) selectedFields.push(field);\n }\n\n return selectedFields;\n}\n\nfunction rejectForbiddenFields(data: Data, properties: readonly string[], permissionPath: string): void {\n const forbiddenFields: string[] = [];\n\n for (const field of Object.keys(data)) {\n if (!properties.includes(field)) forbiddenFields.push(field);\n }\n\n if (forbiddenFields.length === 0) return;\n\n throw Object.assign(\n pkitError('PROPERTIES_NOT_ALLOWED', `fields not allowed in \"${permissionPath}\": ${forbiddenFields.join(', ')}`),\n { fields: forbiddenFields },\n );\n}\n\nexport function validateRequest(input: ValidateInput, state: State): ValidatedRequest {\n validateSnapshot(state.snapshot);\n\n const { action, name, method } = input;\n\n validateMethod(method, { code: 'INVALID_INPUT', message: 'method is required' });\n if (method !== 'find' && Object.hasOwn(input, 'select')) throw pkitError('INVALID_INPUT', 'select only applies to find');\n if (typeof action !== 'string' || typeof name !== 'string') throw pkitError('INVALID_INPUT', 'action and name are required');\n\n const { role, assigned } = validateIdentity(input, state);\n\n const registeredModule = state.modules.get(action);\n\n if (!registeredModule) throw pkitError('UNKNOWN_ACTION', `module \"${action}\" is not registered`);\n\n const nameEntry = registeredModule.names.get(name);\n if (!nameEntry) throw pkitError('UNKNOWN_PERMISSION', `permission \"${action}::${name}\" is not registered`);\n\n const permissionId = permissionIdOf(role, action, name);\n const access = resolveAccess(nameEntry, permissionId, role, method, assigned);\n\n if (access.status === 'unassigned') {\n throw pkitError('PERMISSION_NOT_ASSIGNED', `\"${permissionId}\" is not assigned or granted by the user permissions`);\n }\n\n if (access.status === 'disabled') throw pkitError('METHOD_DISABLED', `\"${permissionId}.${method}\" is not enabled`);\n\n const { data, context } = input;\n\n if (context !== undefined) validateObject(context, { code: 'INVALID_INPUT', message: 'context must be an object' });\n\n const { properties, authorization } = access;\n const permission: ResolvedPermission = Object.freeze({ role, action, name, permissionId, method, enabled: true, properties, authorization });\n const request = { registeredModule, nameEntry, permission, data, context };\n\n if (method === 'find') {\n if (data !== undefined) validateObject(data, { code: 'INVALID_INPUT', message: 'data must be an object' });\n\n const { select } = input as FindInput;\n\n if (select === undefined) return { ...request, result: properties };\n if (properties === ALL_FIELDS) {\n validateStrings(select, { code: 'INVALID_INPUT', message: 'select must be an array of strings', minimumLength: 0 });\n return { ...request, result: select };\n }\n\n return { ...request, result: trimSelection(select, properties) };\n }\n\n validateObject(data, { code: 'INVALID_INPUT', message: 'data must be an object' });\n if (properties !== ALL_FIELDS) rejectForbiddenFields(data, properties, `${permissionId}.${method}`);\n\n return { ...request, result: data };\n}\n",
10
- "import { getOrCreateState } from './state';\nimport { validateContextKey, validateRoleCatalog } from './validators';\n\nfunction setRoles(key: 'roles', roles: readonly string[]): void {\n validateContextKey(key);\n\n const state = getOrCreateState();\n\n validateRoleCatalog(roles, state);\n\n state.roles = new Set(roles);\n}\n\nfunction getRoles(key: 'roles'): readonly string[] {\n validateContextKey(key);\n\n return [...getOrCreateState().roles];\n}\n\nexport const context = Object.freeze({ set: setRoles, get: getRoles });\n",
11
- "import type { ActionDefs, GrantDefs, HookFn, Method, PermissionId, Role } from './types';\nimport { GLOBAL_HOOK_OWNER, MODULE_SEPARATOR } from './constants';\nimport { getOrCreateState, type ModuleEntry, type NameEntry, type State } from './state';\nimport { validateActions, validateGrantActions, validateHook, validateModuleName, validatePermissionName, validateRoleSegment } from './validators';\n\nexport interface ModuleBuilder {\n module(segment: string): ModuleBuilder;\n name(name: string): NameBuilder;\n hook(method: Method, hook: HookFn): ModuleBuilder;\n}\n\nexport interface NameBuilder {\n role(role: Role): RoleBuilder;\n grantTo(permissionId: PermissionId): GrantBuilder;\n hook(method: Method, hook: HookFn): NameBuilder;\n}\n\nexport interface RoleBuilder {\n registerActions(actions: ActionDefs): RoleBuilder;\n hook(method: Method, hook: HookFn): RoleBuilder;\n}\n\nexport interface GrantBuilder {\n registerActions(actions: GrantDefs): GrantBuilder;\n}\n\ninterface ModuleScope {\n action: string;\n builder: ModuleBuilder;\n}\n\ninterface NameScope<Builder> {\n action: string;\n name: string;\n role: string;\n builder: Builder;\n}\n\ninterface GrantScope {\n action: string;\n name: string;\n permissionId: string;\n builder: GrantBuilder;\n}\n\nfunction appendHook(methodHooks: Map<Method, HookFn[]>, method: Method, hook: HookFn): void {\n const hooks = methodHooks.get(method) ?? [];\n\n methodHooks.set(method, hooks);\n hooks.push(hook);\n}\n\nfunction registerActions(scope: NameScope<RoleBuilder>, actions: ActionDefs): RoleBuilder {\n const state = getOrCreateState();\n const registeredActions = validateActions(actions, scope, state);\n\n ensureName(state, scope.action, scope.name).actions.set(scope.role, registeredActions);\n\n return scope.builder;\n}\n\nfunction registerGrant(scope: GrantScope, actions: GrantDefs): GrantBuilder {\n const state = getOrCreateState();\n const grant = validateGrantActions(actions, scope, state);\n\n ensureName(state, scope.action, scope.name).grants.set(scope.permissionId, grant);\n\n return scope.builder;\n}\n\nfunction registerModuleHook(scope: ModuleScope, method: Method, hook: HookFn): ModuleBuilder {\n const state = getOrCreateState();\n\n validateHook(hook, { action: scope.action, method }, state);\n\n appendHook(ensureModule(state, scope.action).hooks, method, hook);\n\n return scope.builder;\n}\n\nfunction registerNameHook<Builder>(scope: NameScope<Builder>, method: Method, hook: HookFn): Builder {\n const state = getOrCreateState();\n\n validateHook(hook, { ...scope, method }, state);\n\n const nameEntry = ensureName(state, scope.action, scope.name);\n const roleHooks = nameEntry.hooks.get(scope.role) ?? new Map<Method, HookFn[]>();\n\n nameEntry.hooks.set(scope.role, roleHooks);\n\n appendHook(roleHooks, method, hook);\n\n return scope.builder;\n}\n\nfunction createRoleBuilder(action: string, name: string, role: string): RoleBuilder {\n validateRoleSegment(role);\n\n const builder = {} as RoleBuilder;\n const scope = { action, name, role, builder };\n\n return Object.assign(builder, {\n registerActions: registerActions.bind(null, scope),\n hook: (registerNameHook<RoleBuilder>).bind(null, scope),\n });\n}\n\nfunction createGrantBuilder(action: string, name: string, permissionId: string): GrantBuilder {\n const builder = {} as GrantBuilder;\n const scope = { action, name, permissionId, builder };\n\n return Object.assign(builder, { registerActions: registerGrant.bind(null, scope) });\n}\n\nfunction createNameBuilder(action: string, name: string): NameBuilder {\n validatePermissionName(name);\n\n const builder = {} as NameBuilder;\n const scope = { action, name, role: GLOBAL_HOOK_OWNER, builder };\n\n return Object.assign(builder, {\n role: createRoleBuilder.bind(null, action, name),\n grantTo: createGrantBuilder.bind(null, action, name),\n hook: (registerNameHook<NameBuilder>).bind(null, scope),\n });\n}\n\nfunction createModuleBuilder(action: string): ModuleBuilder {\n const builder = {} as ModuleBuilder;\n const scope = { action, builder };\n\n return Object.assign(builder, {\n module: appendModule.bind(null, action),\n name: createNameBuilder.bind(null, action),\n hook: registerModuleHook.bind(null, scope),\n });\n}\n\nfunction appendModule(parentAction: string, segment: string): ModuleBuilder {\n validateModuleName(segment);\n\n return createModuleBuilder(`${parentAction}${MODULE_SEPARATOR}${segment}`);\n}\n\nexport function defineModule(segment: string): ModuleBuilder {\n validateModuleName(segment);\n\n return createModuleBuilder(segment);\n}\n\nfunction ensureModule(state: State, action: string): ModuleEntry {\n const registeredModule = state.modules.get(action);\n\n if (registeredModule) return registeredModule;\n\n const newModule: ModuleEntry = { names: new Map(), hooks: new Map() };\n\n state.modules.set(action, newModule);\n\n return newModule;\n}\n\nfunction ensureName(state: State, action: string, name: string): NameEntry {\n const registeredModule = ensureModule(state, action);\n const registeredName = registeredModule.names.get(name);\n\n if (registeredName) return registeredName;\n\n const newName: NameEntry = { actions: new Map(), grants: new Map(), hooks: new Map() };\n\n registeredModule.names.set(name, newName);\n\n return newName;\n}\n",
12
- "import type { Method, NamedPermissionCatalog, PermissionEntry } from './types';\nimport { getOrCreateState } from './state';\nimport { permissionIdOf } from './resolve';\nimport { validateSealedRegistry } from './validators';\n\nexport function seal(): void {\n const state = getOrCreateState();\n\n if (state.snapshot) return;\n\n validateSealedRegistry(state.modules);\n\n const named: Record<string, Readonly<Partial<Record<Method, PermissionEntry>>>> = Object.create(null);\n\n for (const [action, registeredModule] of state.modules) {\n for (const [name, nameEntry] of registeredModule.names) {\n for (const [role, actions] of nameEntry.actions) {\n named[permissionIdOf(role, action, name)] = actions;\n }\n }\n }\n\n state.snapshot = { named: Object.freeze(named) as NamedPermissionCatalog, assignable: new Set(Object.keys(named)) };\n}\n",
13
- "import type { MethodAccessMap, NamedPermissionCatalog, UserAssignments, UserPermissionMap } from './types';\nimport { METHODS } from './constants';\nimport { permissionIdOf, resolveAccess } from './resolve';\nimport { getOrCreateState, type NameEntry } from './state';\nimport { validateIdentity, validateSnapshot } from './validators';\n\nfunction getNamedCatalog(): NamedPermissionCatalog {\n const { snapshot } = getOrCreateState();\n\n validateSnapshot(snapshot);\n\n return snapshot.named;\n}\n\nfunction resolveMethodAccess(nameEntry: NameEntry, permissionId: string, role: string, assigned: ReadonlySet<string>): MethodAccessMap | undefined {\n const methodAccess: Record<string, boolean> = Object.create(null);\n let reachable = false;\n\n for (const method of METHODS) {\n const access = resolveAccess(nameEntry, permissionId, role, method, assigned);\n\n methodAccess[method] = access.status === 'granted';\n if (access.status !== 'unassigned') reachable = true;\n }\n\n return reachable ? Object.freeze(methodAccess) as MethodAccessMap : undefined;\n}\n\nfunction forUser(assignments: UserAssignments): UserPermissionMap {\n const state = getOrCreateState();\n const { role, assigned } = validateIdentity(assignments, state);\n\n const access: Record<string, MethodAccessMap> = Object.create(null);\n\n for (const [action, registeredModule] of state.modules) {\n for (const [name, nameEntry] of registeredModule.names) {\n const permissionId = permissionIdOf(role, action, name);\n const methodAccess = resolveMethodAccess(nameEntry, permissionId, role, assigned);\n\n if (methodAccess) access[permissionId] = methodAccess;\n }\n }\n\n return Object.freeze(access) as UserPermissionMap;\n}\n\nexport const permissions = Object.freeze(\n Object.defineProperty({ forUser }, 'named', { get: getNamedCatalog, enumerable: true, configurable: false }),\n) as {\n readonly named: NamedPermissionCatalog;\n readonly forUser: typeof forUser;\n};\n",
14
- "import type { Context, Data, FindInput, FindResult, HookFn, ResolvedPermission, ValidateInput, ValidateResult, ValidationError, WriteInput } from './types';\nimport { GLOBAL_HOOK_OWNER } from './constants';\nimport { getOrCreateState } from './state';\nimport type { PkitError } from './errors';\nimport { validateRequest } from './validators';\n\ninterface HookCall {\n data: Data | undefined;\n context: Context | undefined;\n permission: ResolvedPermission;\n}\n\nasync function invokeHook(hook: HookFn, request: HookCall): Promise<unknown> {\n return hook(request.data, request.context, request.permission);\n}\n\nfunction describeHookFailure(reason: unknown): string {\n try {\n return reason instanceof Error ? reason.message : String(reason);\n } catch {\n return 'the hook threw a value that cannot be described';\n }\n}\n\nexport function validate(input: FindInput): Promise<ValidateResult<FindResult>>;\nexport function validate<RequestData extends Data>(input: WriteInput<RequestData>): Promise<ValidateResult<RequestData>>;\nexport async function validate(input: ValidateInput): Promise<ValidateResult<FindResult | Data>> {\n try {\n const request = validateRequest(input, getOrCreateState());\n const { registeredModule, nameEntry, permission, result } = request;\n const { method, role } = permission;\n\n const hookGroups = [\n registeredModule.hooks.get(method),\n nameEntry.hooks.get(GLOBAL_HOOK_OWNER)?.get(method),\n nameEntry.hooks.get(role)?.get(method),\n ];\n\n const hookCalls: Promise<unknown>[] = [];\n\n for (const hooks of hookGroups) {\n if (!hooks) continue;\n for (const hook of hooks) hookCalls.push(invokeHook(hook, request));\n }\n\n const hookResults = await Promise.allSettled(hookCalls);\n const errors: ValidationError[] = [];\n\n for (const hookResult of hookResults) {\n if (hookResult.status === 'fulfilled') continue;\n\n const hookCause: unknown = hookResult.reason;\n errors.push({ code: 'HOOK_ERROR', message: describeHookFailure(hookCause), cause: hookCause });\n }\n\n if (errors.length) return { result: null, errors: Object.freeze(errors) };\n\n return { result, errors: Object.freeze([] as const) };\n } catch (cause) {\n if (cause instanceof Error && cause.name === 'PkitError') {\n const permissionError = cause as PkitError;\n const error: ValidationError = permissionError.code === 'PROPERTIES_NOT_ALLOWED'\n ? { code: permissionError.code, message: permissionError.message, fields: permissionError.fields }\n : { code: permissionError.code, message: permissionError.message };\n\n return { result: null, errors: Object.freeze([error]) };\n }\n\n return {\n result: null,\n errors: Object.freeze([{ code: 'VALIDATION_ERROR', message: 'permission could not be validated', cause }]),\n };\n }\n}\n",
15
- "import { context } from './context';\nimport { defineModule } from './registry';\nimport { seal } from './seal';\nimport { permissions } from './permissions';\nimport { validate } from './validate';\n\nexport type {\n ActionDef,\n ActionDefs,\n Authorization,\n Context,\n Data,\n FindInput,\n FindResult,\n GrantDef,\n GrantDefs,\n HookFn,\n Method,\n MethodAccessMap,\n NamedPermissionCatalog,\n PermissionEntry,\n PermissionId,\n PkitErrorCode,\n Properties,\n ResolvedPermission,\n Role,\n RoleRegistry,\n UserAssignments,\n UserPermissionMap,\n ValidateInput,\n ValidateResult,\n ValidationError,\n ValidationErrorCode,\n WriteInput,\n} from './types';\nexport { METHODS } from './constants';\nexport type { PkitError } from './errors';\nexport type { GrantBuilder, ModuleBuilder, NameBuilder, RoleBuilder } from './registry';\nexport { context, seal, permissions, validate, defineModule as module };\n\nexport const pkit = Object.freeze({ context, module: defineModule, seal, permissions, validate });\nexport default pkit;\n"
5
+ "const constants = {\n METHODS: Object.freeze(['find', 'update', 'create', 'remove'] as const),\n\n GENERAL_ROLE: 'general',\n\n GLOBAL_HOOK_OWNER: '*',\n\n ALL_FIELDS: '*',\n\n MODULE_SEPARATOR: '.',\n\n PERMISSION_ID_SEPARATOR: '::',\n} as const;\n\nexport default constants;\n",
6
+ "import type { PkitErrorCode } from './types';\n\nconst errors = {\n create<ErrorCode extends PkitErrorCode>(code: ErrorCode, message: string): Error & { name: 'PkitError'; code: ErrorCode } {\n return Object.assign(new Error(message), { name: 'PkitError' as const, code });\n },\n\n /**\n * Renders an untrusted value for an error message.\n * A value with no reachable `toString`, such as `Object.create(null)`, makes\n * plain interpolation throw a `TypeError` that would escape as the wrong code.\n */\n describe(value: unknown): string {\n try {\n return String(value);\n } catch {\n return typeof value;\n }\n },\n};\n\nexport default errors;\n",
7
+ "import constants from './constants';\nimport errors from './errors';\nimport type { PermissionId, PkitErrorCode } from './types';\n\n/** The three components a permission identifier is made of, already split. */\nexport interface PermissionReference {\n readonly role: string;\n readonly action: string;\n readonly name: string;\n}\n\nconst identifiers = {\n build(role: string, action: string, name: string): PermissionId {\n return `${role}${constants.PERMISSION_ID_SEPARATOR}${action}${constants.PERMISSION_ID_SEPARATOR}${name}` as PermissionId;\n },\n\n /**\n * Splits `role::module::name` and checks every component.\n * The caller supplies the code and the subject of the message because the same\n * syntax rule is reported as a definition error when registering and as an\n * input error when validating a request.\n */\n parse(value: unknown, code: PkitErrorCode, subject: string): PermissionReference {\n if (typeof value !== 'string') throw invalidIdentifier(value, code, subject);\n\n const parts = value.split(constants.PERMISSION_ID_SEPARATOR);\n const [role, action, name] = parts;\n\n if (parts.length !== 3 || role === undefined || action === undefined || name === undefined) {\n throw invalidIdentifier(value, code, subject);\n }\n\n const isValidRole = isCleanSegment(role) && role !== constants.GLOBAL_HOOK_OWNER;\n const isValidName = isCleanSegment(name) && name !== constants.GLOBAL_HOOK_OWNER;\n const isValidAction = action.split(constants.MODULE_SEPARATOR).every(isCleanSegment);\n\n if (!isValidRole || !isValidName || !isValidAction) throw invalidIdentifier(value, code, subject);\n\n return { role, action, name };\n },\n\n checkRole(role: unknown): void {\n if (typeof role === 'string' && isCleanSegment(role) && role !== constants.GLOBAL_HOOK_OWNER) return;\n\n throw errors.create('INVALID_DEFINITION',\n `invalid role: \"${errors.describe(role)}\" (non-empty string, no \":\" or surrounding whitespace; \"${constants.GLOBAL_HOOK_OWNER}\" is reserved for global hooks)`,\n );\n },\n\n checkModuleSegment(segment: unknown): void {\n if (typeof segment === 'string' && isCleanSegment(segment) && !segment.includes(constants.MODULE_SEPARATOR)) return;\n\n throw errors.create('INVALID_DEFINITION',\n `invalid module name: \"${errors.describe(segment)}\" (non-empty string, no dots, no \":\" or surrounding whitespace)`,\n );\n },\n\n checkName(name: unknown): void {\n if (typeof name === 'string' && isCleanSegment(name) && name !== constants.GLOBAL_HOOK_OWNER) return;\n\n throw errors.create('INVALID_DEFINITION',\n `invalid permission name: \"${errors.describe(name)}\" (non-empty string, no \":\" or surrounding whitespace; \"*\" is reserved)`,\n );\n },\n};\n\nfunction isCleanSegment(value: string): boolean {\n return value.length > 0 && value.trim() === value && !value.includes(':');\n}\n\nfunction invalidIdentifier(value: unknown, code: PkitErrorCode, subject: string): Error {\n return errors.create(code, `${subject}: \"${errors.describe(value)}\" (format role::module::name)`);\n}\n\nexport default identifiers;\n",
8
+ "import type { PermissionReference } from './identifiers';\nimport type { ActionDefs, GrantDefs, HookFn, Method, NamedPermissionCatalog } from './types';\nimport constants from './constants';\nimport errors from './errors';\n\ninterface GrantEntry {\n readonly source: PermissionReference;\n readonly actions: GrantDefs;\n}\n\nexport interface NameEntry {\n readonly actions: Map<string, ActionDefs>;\n readonly grants: Map<string, GrantEntry>;\n readonly hooks: Map<string, Map<Method, HookFn[]>>;\n}\n\nexport interface ModuleEntry {\n readonly names: Map<string, NameEntry>;\n readonly hooks: Map<Method, HookFn[]>;\n}\n\nexport interface Snapshot {\n readonly named: NamedPermissionCatalog;\n readonly assignable: ReadonlySet<string>;\n}\n\nexport interface State {\n roles: Set<string>;\n cropper: boolean;\n readonly modules: Map<string, ModuleEntry>;\n snapshot: Snapshot | null;\n}\n\n/**\n * The registry lives on globalThis so the ESM and CJS builds of the package\n * share one catalog inside a process.\n */\nconst STATE_KEY = Symbol.for('endpoint-permissions-kit');\n\nconst state = {\n getOrCreate(): State {\n const stateHost = globalThis as typeof globalThis & { [STATE_KEY]?: State };\n\n if (stateHost[STATE_KEY] === undefined) {\n stateHost[STATE_KEY] = { roles: new Set([constants.GENERAL_ROLE]), cropper: false, modules: new Map(), snapshot: null };\n }\n\n return stateHost[STATE_KEY];\n },\n\n /** Every write to the registry goes through this: sealing freezes the configuration. */\n requireOpen(currentState: State): void {\n if (currentState.snapshot) throw errors.create('SEALED', 'pkit.seal() was already called: no more registrations allowed');\n },\n\n /** Every read of a materialized view goes through this. */\n requireSnapshot(currentState: State): Snapshot {\n if (currentState.snapshot === null) {\n throw errors.create('NOT_SEALED', 'pkit.seal() has not been called: call it after importing every permission file');\n }\n\n return currentState.snapshot;\n },\n};\n\nexport default state;\n",
9
+ "import errors from './errors';\nimport identifiers from './identifiers';\nimport state from './state';\nimport type { ContextKey, ContextValues } from './types';\n\nconst context = Object.freeze({\n set<Key extends ContextKey>(key: Key, value: ContextValues[Key]): void {\n const contextKey = checkKey(key);\n const currentState = state.getOrCreate();\n\n state.requireOpen(currentState);\n\n if (contextKey === 'cropper') {\n if (typeof value !== 'boolean') throw errors.create('INVALID_DEFINITION', 'cropper must be a boolean');\n\n currentState.cropper = value;\n\n return;\n }\n\n currentState.roles = new Set(readRoleCatalog(value, currentState.modules.size));\n },\n\n get<Key extends ContextKey>(key: Key): ContextValues[Key] {\n const contextKey = checkKey(key);\n const currentState = state.getOrCreate();\n\n return (contextKey === 'cropper' ? currentState.cropper : [...currentState.roles]) as ContextValues[Key];\n },\n});\n\nfunction checkKey(key: unknown): ContextKey {\n if (key === 'roles' || key === 'cropper') return key;\n\n throw errors.create('INVALID_DEFINITION', `unknown context key: \"${errors.describe(key)}\"`);\n}\n\n/**\n * The catalog replaces the default `['general']` instead of extending it, so it\n * has to be declared before any permission is registered against a role.\n */\nfunction readRoleCatalog(value: unknown, registeredModuleCount: number): readonly string[] {\n if (registeredModuleCount > 0) {\n throw errors.create('INVALID_DEFINITION', 'roles must be declared before registering permissions: import pkit.config.js first');\n }\n\n if (!Array.isArray(value)) throw errors.create('INVALID_DEFINITION', 'roles must be an array of non-empty strings');\n\n for (const role of value) {\n if (typeof role !== 'string' || role.length === 0) {\n throw errors.create('INVALID_DEFINITION', 'roles must be an array of non-empty strings');\n }\n }\n\n const catalog = value as readonly string[];\n\n if (catalog.length === 0) throw errors.create('INVALID_DEFINITION', 'roles must declare at least one role');\n\n for (const role of catalog) identifiers.checkRole(role);\n\n return catalog;\n}\n\nexport default context;\n",
10
+ "import constants from './constants';\nimport errors from './errors';\nimport identifiers from './identifiers';\nimport type { ModuleEntry, NameEntry, Snapshot } from './state';\nimport type { Method, MethodAccessMap, Properties, Role, UserAssignments } from './types';\n\n/** The caller, with every assignment already checked against the sealed catalog. */\ninterface Identity {\n readonly role: Role;\n readonly assigned: ReadonlySet<string>;\n readonly names: ReadonlyMap<string, string>;\n}\n\n/** The single permission of a module an identity resolves to. */\ninterface ChosenPermission {\n readonly permissionId: string;\n readonly entry: NameEntry;\n}\n\ntype Access =\n | { readonly status: 'granted'; readonly properties: Properties }\n | { readonly status: 'disabled' }\n | { readonly status: 'unassigned' };\n\nconst DISABLED_ACCESS: Access = Object.freeze({ status: 'disabled' });\n\nconst UNASSIGNED_ACCESS: Access = Object.freeze({ status: 'unassigned' });\n\nconst resolve = {\n /**\n * Checks the identity a request or a view arrives with. Every assignment must be\n * well formed, belong to the authenticated role and exist as assignable: one\n * stale row denies everything, so it cannot silently widen or narrow access.\n *\n * It also indexes the assignments by module. A request names no permission name,\n * so two names of the same module would leave the choice to the library: that is\n * `AMBIGUOUS_PERMISSION` and it denies everything.\n */\n identity(assignments: UserAssignments, snapshot: Snapshot, roles: ReadonlySet<string>): Identity {\n if (assignments === null || typeof assignments !== 'object') throw errors.create('INVALID_INPUT', 'assignments must be an object');\n\n const { role, permissions } = assignments;\n\n if (typeof role !== 'string') throw errors.create('INVALID_INPUT', 'role is required');\n\n if (!roles.has(role)) throw errors.create('UNKNOWN_ROLE', `role \"${role}\" is not declared`);\n\n if (!Array.isArray(permissions)) throw errors.create('INVALID_INPUT', 'permissions must be an array of strings');\n\n const assigned = new Set<string>();\n const names = new Map<string, string>();\n\n for (const permissionId of permissions) {\n const reference = identifiers.parse(permissionId, 'INVALID_INPUT', 'invalid permission identifier');\n\n if (reference.role !== role) {\n throw errors.create('PERMISSION_ROLE_MISMATCH', `\"${permissionId}\" belongs to role \"${reference.role}\", not the authenticated role \"${role}\"`);\n }\n\n if (!snapshot.assignable.has(permissionId)) {\n throw errors.create('UNKNOWN_PERMISSION', `\"${permissionId}\" is not an assignable permission`);\n }\n\n const assignedName = names.get(reference.action);\n\n if (assignedName !== undefined && assignedName !== reference.name) {\n throw errors.create('AMBIGUOUS_PERMISSION',\n `\"${permissionId}\" and \"${identifiers.build(role, reference.action, assignedName)}\" are both assigned: a request names no permission name, so module \"${reference.action}\" cannot be resolved`,\n );\n }\n\n assigned.add(permissionId);\n names.set(reference.action, reference.name);\n }\n\n return { role: role as Role, assigned, names };\n },\n\n /**\n * The permission of a module this identity resolves to. The request carries no\n * name, so a direct assignment on that module decides, and without one the only\n * name its grants reach does. `undefined` means the module is out of reach.\n *\n * Two reachable names deny with `AMBIGUOUS_PERMISSION`: picking one would widen\n * or narrow the access the user was given, without anyone asking for it.\n */\n permission(registeredModule: ModuleEntry, action: string, identity: Identity): ChosenPermission | undefined {\n const assignedName = identity.names.get(action);\n\n if (assignedName !== undefined) {\n const assignedEntry = registeredModule.names.get(assignedName);\n\n if (assignedEntry === undefined) return undefined;\n\n return { permissionId: identifiers.build(identity.role, action, assignedName), entry: assignedEntry };\n }\n\n let chosen: ChosenPermission | undefined;\n\n for (const [name, nameEntry] of registeredModule.names) {\n const permissionId = identifiers.build(identity.role, action, name);\n\n if (resolve.methodAccess(nameEntry, permissionId, identity.role, identity.assigned) === undefined) continue;\n\n if (chosen !== undefined) {\n throw errors.create('AMBIGUOUS_PERMISSION',\n `grants reach \"${chosen.permissionId}\" and \"${permissionId}\": a request names no permission name, so module \"${action}\" cannot be resolved`,\n );\n }\n\n chosen = { permissionId, entry: nameEntry };\n }\n\n return chosen;\n },\n\n /**\n * Decides one `(role, module, name, method)`. A direct assignment decides\n * completely and ignores grants; without it the applicable grants are combined.\n */\n access(nameEntry: NameEntry, permissionId: string, role: string, method: Method, assigned: ReadonlySet<string>): Access {\n if (!assigned.has(permissionId)) return grantedAccess(nameEntry, method, assigned);\n\n const definition = nameEntry.actions.get(role)?.[method];\n\n if (!definition?.enabled) return DISABLED_ACCESS;\n\n return { status: 'granted', properties: definition.properties };\n },\n\n /**\n * The four methods of one permission, for the read-only views.\n * Returns `undefined` when the permission is out of reach, which is how a view\n * distinguishes \"not yours\" from \"yours but nothing enabled\".\n *\n * Mirrors the precedence of `access` in a single pass over the grants, because a\n * view needs no fields. Any change to `access` belongs here too.\n */\n methodAccess(nameEntry: NameEntry, permissionId: string, role: string, assigned: ReadonlySet<string>): MethodAccessMap | undefined {\n const methodAccess: Record<string, boolean> = Object.create(null);\n\n if (assigned.has(permissionId)) {\n const actions = nameEntry.actions.get(role);\n\n for (const method of constants.METHODS) methodAccess[method] = actions?.[method]?.enabled === true;\n\n return Object.freeze(methodAccess) as MethodAccessMap;\n }\n\n const grantedMethods = new Set<string>();\n\n let isReachable = false;\n\n for (const [enablingId, grant] of nameEntry.grants) {\n if (!assigned.has(enablingId)) continue;\n\n isReachable = true;\n\n for (const method of Object.keys(grant.actions)) grantedMethods.add(method);\n }\n\n if (!isReachable) return undefined;\n\n for (const method of constants.METHODS) methodAccess[method] = grantedMethods.has(method);\n\n return Object.freeze(methodAccess) as MethodAccessMap;\n },\n};\n\n/**\n * Grants are one hop: only an identifier the user holds directly enables a block,\n * and the effective fields are the union of the blocks that declare the method.\n */\nfunction grantedAccess(nameEntry: NameEntry, method: Method, assigned: ReadonlySet<string>): Access {\n const fields = new Set<string>();\n\n let isGranted = false;\n let isReachable = false;\n\n for (const [enablingId, grant] of nameEntry.grants) {\n if (!assigned.has(enablingId)) continue;\n\n isReachable = true;\n\n const definition = grant.actions[method];\n\n if (!definition) continue;\n\n isGranted = true;\n\n for (const field of definition.properties) fields.add(field);\n }\n\n if (!isGranted) return isReachable ? DISABLED_ACCESS : UNASSIGNED_ACCESS;\n\n return { status: 'granted', properties: Object.freeze([...fields]) };\n}\n\nexport default resolve;\n",
11
+ "import resolve from './resolve';\nimport state from './state';\nimport type { MethodAccessMap, NamedPermissionCatalog, UserAssignments, UserPermissionMap } from './types';\n\nconst permissions = Object.freeze({\n /**\n * The effective access of one identity, with the same precedence and identity\n * checks as `validate()` but without running hooks. It resolves one name per\n * module, the same one `validate()` resolves; modules out of reach are omitted.\n */\n forUser(assignments: UserAssignments): UserPermissionMap {\n const currentState = state.getOrCreate();\n const snapshot = state.requireSnapshot(currentState);\n const identity = resolve.identity(assignments, snapshot, currentState.roles);\n\n const access: Record<string, MethodAccessMap> = Object.create(null);\n\n for (const [action, registeredModule] of currentState.modules) {\n const chosen = resolve.permission(registeredModule, action, identity);\n\n if (!chosen) continue;\n\n const methodAccess = resolve.methodAccess(chosen.entry, chosen.permissionId, identity.role, identity.assigned);\n\n if (methodAccess) access[chosen.permissionId] = methodAccess;\n }\n\n return Object.freeze(access) as UserPermissionMap;\n },\n\n /** The assignable identifiers with their registered actions; grants are not listed. */\n get named(): NamedPermissionCatalog {\n return state.requireSnapshot(state.getOrCreate()).named;\n },\n});\n\nexport default permissions;\n",
12
+ "import constants from './constants';\nimport errors from './errors';\nimport type { Data, Properties } from './types';\n\n/** Marks a node the crop removed, so its parent drops the key instead of keeping an empty container. */\nconst PRUNED = Symbol('pruned');\n\n/**\n * Hard ceiling on how deep `data` may nest. Request payloads are orders of\n * magnitude shallower; the limit keeps a hostile payload from driving the walk\n * into the call stack, and it is checked instead of relying on stack size.\n */\nconst MAX_DEPTH = 1000;\n\n/** A declared property path, split into segments once so matching never re-parses it. */\ntype PathPattern = readonly string[];\n\n/**\n * State carried through one walk of `data`.\n * `segments` is the path of the node being visited, and `ancestors` holds the\n * containers currently open above it, which is how a cycle is detected.\n */\ninterface Walk {\n readonly patterns: readonly PathPattern[];\n readonly segments: string[];\n readonly ancestors: Set<object>;\n}\n\nconst properties = {\n /**\n * Checks one path declared in `registerActions`.\n * Array indexes never appear in the paths of `data` (elements share their\n * container's path), and a leading wildcard would grant that leaf under every\n * root key.\n */\n checkDeclaredPath(property: string, permissionPath: string): void {\n if (property.includes('[') || property.includes(']')) {\n throw errors.create('INVALID_DEFINITION', `${permissionPath}: array indexes are not allowed in properties: \"${property}\"`);\n }\n\n const segments = segmentsOf(property);\n\n for (const segment of segments) {\n if (segment.length === 0) throw errors.create('INVALID_DEFINITION', `${permissionPath}: empty segment in property path: \"${property}\"`);\n }\n\n if (segments[0] === constants.ALL_FIELDS) {\n throw errors.create('INVALID_DEFINITION', `${permissionPath}: a property path cannot start with \"${constants.ALL_FIELDS}\": \"${property}\"`);\n }\n },\n\n /**\n * Compares the paths of `data` with the fields the permission allows.\n * Denies the request with `PROPERTIES_NOT_ALLOWED`, or returns a cropped copy\n * when the `cropper` option is on. `data` is never mutated.\n */\n resolve(data: Data, allowed: Properties, cropper: boolean): Data {\n if (allowed === constants.ALL_FIELDS) return data;\n\n const patterns: PathPattern[] = [];\n\n for (const pattern of allowed) patterns.push(segmentsOf(pattern));\n\n const walk: Walk = { patterns, segments: [], ancestors: new Set([data]) };\n\n if (cropper) return cropData(data, walk);\n\n rejectForbiddenPaths(data, walk);\n\n return data;\n },\n};\n\n/**\n * Splits a declared property path into segments; `\\` escapes the next character.\n * Only declared paths reach this: `checkDeclaredPath` has already rejected the\n * bracket syntax, and the paths of `data` are walked structurally, never rendered\n * into a string first.\n */\nfunction segmentsOf(path: string): readonly string[] {\n const segments: string[] = [];\n\n let segment = '';\n let index = 0;\n\n while (index < path.length) {\n const character = path[index] as string;\n\n if (character === '\\\\') {\n segment += path[index + 1] ?? '';\n index += 2;\n continue;\n }\n\n if (character === '.') {\n segments.push(segment);\n segment = '';\n index += 1;\n continue;\n }\n\n segment += character;\n index += 1;\n }\n\n segments.push(segment);\n\n return segments;\n}\n\n/** A pattern matches a path when both have the same depth and every segment is equal or `*`. */\nfunction isAllowedPath(segments: readonly string[], patterns: readonly PathPattern[]): boolean {\n for (const pattern of patterns) {\n if (pattern.length !== segments.length) continue;\n\n let isMatch = true;\n\n for (let index = 0; index < segments.length; index += 1) {\n const patternSegment = pattern[index];\n\n if (patternSegment === constants.ALL_FIELDS) continue;\n if (patternSegment === segments[index]) continue;\n\n isMatch = false;\n break;\n }\n\n if (isMatch) return true;\n }\n\n return false;\n}\n\n/** Only plain objects and arrays are walked; everything else is one leaf, kept or dropped whole. */\nfunction isPlainObject(value: unknown): boolean {\n if (value === null || typeof value !== 'object' || Array.isArray(value)) return false;\n\n const prototype: unknown = Object.getPrototypeOf(value);\n\n return prototype === Object.prototype || prototype === null;\n}\n\nfunction requireDepth(walk: Walk): void {\n if (walk.ancestors.size < MAX_DEPTH) return;\n\n throw new RangeError(`data is nested deeper than ${MAX_DEPTH} levels`);\n}\n\n/**\n * Writes one cropped field.\n * A plain assignment to `__proto__` would hit the inherited setter and either\n * change the prototype or silently lose the field, so that one key is defined.\n */\nfunction setField(target: Data, key: string, value: unknown): void {\n if (key === '__proto__') {\n Object.defineProperty(target, key, { value, writable: true, enumerable: true, configurable: true });\n\n return;\n }\n\n target[key] = value;\n}\n\n/**\n * Walks `data` alongside the path being built and returns the allowed part of it,\n * or `PRUNED` when nothing of this node survives.\n *\n * Array elements share their container's path, which is what drops indexes at\n * every depth. An empty container is itself a leaf, so a permission that declares\n * it keeps it; a container the crop emptied is dropped, and that cascades to its\n * parent. A cycle cannot be represented in a filtered copy, so it is refused\n * rather than copied by reference, which would hand the hooks uncropped data.\n */\nfunction cropValue(value: unknown, walk: Walk): unknown {\n if (Array.isArray(value)) {\n if (value.length === 0) return isAllowedPath(walk.segments, walk.patterns) ? [] : PRUNED;\n\n if (walk.ancestors.has(value)) throw new RangeError('data contains a circular reference');\n\n requireDepth(walk);\n walk.ancestors.add(value);\n\n const items: unknown[] = [];\n\n for (const item of value) {\n const croppedItem = cropValue(item, walk);\n\n if (croppedItem === PRUNED) continue;\n\n items.push(croppedItem);\n }\n\n walk.ancestors.delete(value);\n\n return items.length === 0 ? PRUNED : items;\n }\n\n if (isPlainObject(value)) {\n const container = value as Data;\n const keys = Object.keys(container);\n\n if (keys.length === 0) return isAllowedPath(walk.segments, walk.patterns) ? {} : PRUNED;\n\n if (walk.ancestors.has(container)) throw new RangeError('data contains a circular reference');\n\n requireDepth(walk);\n walk.ancestors.add(container);\n\n const cropped: Data = {};\n\n let keptCount = 0;\n\n for (const key of keys) {\n walk.segments.push(key);\n\n const croppedValue = cropValue(container[key], walk);\n\n walk.segments.pop();\n\n if (croppedValue === PRUNED) continue;\n\n setField(cropped, key, croppedValue);\n keptCount += 1;\n }\n\n walk.ancestors.delete(container);\n\n return keptCount === 0 ? PRUNED : cropped;\n }\n\n return isAllowedPath(walk.segments, walk.patterns) ? value : PRUNED;\n}\n\nfunction cropData(data: Data, walk: Walk): Data {\n const cropped: Data = {};\n\n for (const key of Object.keys(data)) {\n walk.segments.push(key);\n\n const croppedValue = cropValue(data[key], walk);\n\n walk.segments.pop();\n\n if (croppedValue === PRUNED) continue;\n\n setField(cropped, key, croppedValue);\n }\n\n return cropped;\n}\n\n/**\n * Same walk as the crop, collecting the paths outside the permission instead of\n * copying. Nothing is copied here, so a node already open above this one is\n * reported as the leaf that closes the cycle instead of being followed.\n */\nfunction collectForbiddenPaths(value: unknown, walk: Walk, forbidden: Set<string>): void {\n if (Array.isArray(value)) {\n if (value.length === 0 || walk.ancestors.has(value)) {\n reportPath(walk, forbidden);\n\n return;\n }\n\n requireDepth(walk);\n walk.ancestors.add(value);\n\n for (const item of value) collectForbiddenPaths(item, walk, forbidden);\n\n walk.ancestors.delete(value);\n\n return;\n }\n\n if (isPlainObject(value)) {\n const container = value as Data;\n const keys = Object.keys(container);\n\n if (keys.length === 0 || walk.ancestors.has(container)) {\n reportPath(walk, forbidden);\n\n return;\n }\n\n requireDepth(walk);\n walk.ancestors.add(container);\n\n for (const key of keys) {\n walk.segments.push(key);\n collectForbiddenPaths(container[key], walk, forbidden);\n walk.segments.pop();\n }\n\n walk.ancestors.delete(container);\n\n return;\n }\n\n reportPath(walk, forbidden);\n}\n\nfunction reportPath(walk: Walk, forbidden: Set<string>): void {\n if (isAllowedPath(walk.segments, walk.patterns)) return;\n\n forbidden.add(walk.segments.join('.'));\n}\n\nfunction rejectForbiddenPaths(data: Data, walk: Walk): void {\n const forbidden = new Set<string>();\n\n for (const key of Object.keys(data)) {\n walk.segments.push(key);\n collectForbiddenPaths(data[key], walk, forbidden);\n walk.segments.pop();\n }\n\n if (forbidden.size === 0) return;\n\n const fields = [...forbidden];\n\n throw Object.assign(\n errors.create('PROPERTIES_NOT_ALLOWED', `fields not allowed: ${fields.join(', ')}`),\n { fields },\n );\n}\n\nexport default properties;\n",
13
+ "import constants from './constants';\nimport errors from './errors';\nimport properties from './properties';\nimport type { ActionDef, ActionDefs, GrantDefs, Method, PkitErrorCode } from './types';\n\nconst METHODS: ReadonlySet<string> = new Set<string>(constants.METHODS);\n\nconst definitions = {\n checkMethod(method: unknown, code: PkitErrorCode, subject: string): Method {\n if (typeof method === 'string' && METHODS.has(method)) return method as Method;\n\n throw errors.create(code, `${subject}: method \"${errors.describe(method)}\" does not exist. Methods: ${constants.METHODS.join(', ')}`);\n },\n\n /**\n * Reads a whole `registerActions` literal and returns a frozen copy, so a later\n * mutation of the object the consumer passed cannot change what was registered.\n */\n readActions(actions: unknown, permissionPath: string): ActionDefs {\n const declared = requireObject(actions, `${permissionPath}: registerActions expects an object`);\n const registeredActions: ActionDefs = Object.create(null);\n\n for (const [method, definition] of Object.entries(declared)) {\n definitions.checkMethod(method, 'INVALID_DEFINITION', permissionPath);\n\n registeredActions[method as Method] = readActionDefinition(definition, `${permissionPath}.${method}`);\n }\n\n return Object.freeze(registeredActions);\n },\n\n /**\n * A grant is opt-in and is the authority over its own fields, so it may neither\n * disable a method nor claim every field of the receiving permission.\n */\n readGrant(actions: unknown, permissionPath: string): GrantDefs {\n const registeredActions = definitions.readActions(actions, permissionPath);\n\n for (const [method, definition] of Object.entries(registeredActions)) {\n if (definition.enabled !== true) {\n throw errors.create('INVALID_DEFINITION', `${permissionPath}.${method}: a grant does not allow enabled: false`);\n }\n\n if (definition.properties === constants.ALL_FIELDS) {\n throw errors.create('INVALID_DEFINITION', `${permissionPath}.${method}: a grant requires an explicit properties list`);\n }\n }\n\n return registeredActions as GrantDefs;\n },\n};\n\nfunction requireObject(value: unknown, message: string): Record<string, unknown> {\n if (value === null || typeof value !== 'object' || Array.isArray(value)) throw errors.create('INVALID_DEFINITION', message);\n\n return value as Record<string, unknown>;\n}\n\nfunction readActionDefinition(definition: unknown, permissionPath: string): ActionDef {\n const action = requireObject(definition, `${permissionPath}: must be an object`);\n\n if (typeof action.enabled !== 'boolean') {\n throw errors.create('INVALID_DEFINITION', `${permissionPath}: enabled must be a boolean`);\n }\n\n if (action.properties === constants.ALL_FIELDS) {\n return Object.freeze({ enabled: action.enabled, properties: constants.ALL_FIELDS });\n }\n\n return Object.freeze({ enabled: action.enabled, properties: readDeclaredProperties(action.properties, permissionPath) });\n}\n\nfunction readDeclaredProperties(value: unknown, permissionPath: string): readonly string[] {\n if (!Array.isArray(value)) {\n throw errors.create('INVALID_DEFINITION', `${permissionPath}: properties must be string[] or '${constants.ALL_FIELDS}'`);\n }\n\n for (const property of value) {\n if (typeof property !== 'string' || property.length === 0) {\n throw errors.create('INVALID_DEFINITION', `${permissionPath}: properties must be string[] or '${constants.ALL_FIELDS}'`);\n }\n }\n\n const declared = value as readonly string[];\n\n if (declared.includes(constants.ALL_FIELDS)) {\n throw errors.create('INVALID_DEFINITION', `${permissionPath}: '${constants.ALL_FIELDS}' is only allowed as the whole properties value`);\n }\n\n if (new Set(declared).size !== declared.length) {\n throw errors.create('INVALID_DEFINITION', `${permissionPath}: properties contains duplicate fields`);\n }\n\n for (const property of declared) properties.checkDeclaredPath(property, permissionPath);\n\n return Object.freeze([...declared]);\n}\n\nexport default definitions;\n",
14
+ "import constants from './constants';\nimport definitions from './definitions';\nimport errors from './errors';\nimport identifiers from './identifiers';\nimport state from './state';\nimport type { ModuleEntry, NameEntry, State } from './state';\nimport type { ActionDefs, GrantDefs, HookFn, Method, PermissionId, Role } from './types';\n\nexport interface ModuleBuilder {\n module(segment: string): ModuleBuilder;\n name(name: string): NameBuilder;\n hook(method: Method, hook: HookFn): ModuleBuilder;\n}\n\nexport interface NameBuilder {\n role(role: Role): RoleBuilder;\n grantTo(permissionId: PermissionId): GrantBuilder;\n hook(method: Method, hook: HookFn): NameBuilder;\n}\n\nexport interface RoleBuilder {\n registerActions(actions: ActionDefs): RoleBuilder;\n hook(method: Method, hook: HookFn): RoleBuilder;\n}\n\nexport interface GrantBuilder {\n registerActions(actions: GrantDefs): GrantBuilder;\n}\n\ninterface ModuleScope {\n action: string;\n builder: ModuleBuilder;\n}\n\n/** `role` is `*` on a name-wide scope, which owns the hooks that run for every role. */\ninterface NameScope<Builder> {\n action: string;\n name: string;\n role: string;\n builder: Builder;\n}\n\ninterface GrantScope {\n action: string;\n name: string;\n permissionId: string;\n builder: GrantBuilder;\n}\n\nconst registry = {\n defineModule(segment: string): ModuleBuilder {\n identifiers.checkModuleSegment(segment);\n\n return createModuleBuilder(segment);\n },\n};\n\nfunction createModuleBuilder(action: string): ModuleBuilder {\n const builder = {} as ModuleBuilder;\n const scope = { action, builder };\n\n return Object.assign(builder, {\n module: appendModule.bind(null, action),\n name: createNameBuilder.bind(null, action),\n hook: registerModuleHook.bind(null, scope),\n });\n}\n\nfunction appendModule(parentAction: string, segment: string): ModuleBuilder {\n identifiers.checkModuleSegment(segment);\n\n return createModuleBuilder(`${parentAction}${constants.MODULE_SEPARATOR}${segment}`);\n}\n\nfunction createNameBuilder(action: string, name: string): NameBuilder {\n identifiers.checkName(name);\n\n const builder = {} as NameBuilder;\n const scope = { action, name, role: constants.GLOBAL_HOOK_OWNER, builder };\n\n return Object.assign(builder, {\n role: createRoleBuilder.bind(null, action, name),\n grantTo: createGrantBuilder.bind(null, action, name),\n hook: (registerNameHook<NameBuilder>).bind(null, scope),\n });\n}\n\nfunction createRoleBuilder(action: string, name: string, role: string): RoleBuilder {\n identifiers.checkRole(role);\n\n const builder = {} as RoleBuilder;\n const scope = { action, name, role, builder };\n\n return Object.assign(builder, {\n registerActions: registerActions.bind(null, scope),\n hook: (registerNameHook<RoleBuilder>).bind(null, scope),\n });\n}\n\nfunction createGrantBuilder(action: string, name: string, permissionId: string): GrantBuilder {\n const builder = {} as GrantBuilder;\n const scope = { action, name, permissionId, builder };\n\n return Object.assign(builder, { registerActions: registerGrant.bind(null, scope) });\n}\n\nfunction registerActions(scope: NameScope<RoleBuilder>, actions: ActionDefs): RoleBuilder {\n const currentState = state.getOrCreate();\n\n state.requireOpen(currentState);\n requireDeclaredRole(scope.role, currentState.roles);\n\n if (currentState.modules.get(scope.action)?.names.get(scope.name)?.actions.has(scope.role)) {\n throw errors.create('DUPLICATE_REGISTRATION', `\"${scope.action}::${scope.name}\" already has actions registered for role \"${scope.role}\"`);\n }\n\n const registeredActions = definitions.readActions(actions, `${scope.action}::${scope.name} [${scope.role}]`);\n\n ensureName(currentState, scope.action, scope.name).actions.set(scope.role, registeredActions);\n\n return scope.builder;\n}\n\nfunction registerGrant(scope: GrantScope, actions: GrantDefs): GrantBuilder {\n const currentState = state.getOrCreate();\n\n state.requireOpen(currentState);\n\n // The referenced permission need not exist yet: seal() checks it, so grants may\n // be registered before the module they enable has been imported.\n const source = identifiers.parse(scope.permissionId, 'INVALID_DEFINITION',\n `\"${scope.action}::${scope.name}\": invalid grantTo identifier`,\n );\n\n requireDeclaredRole(source.role, currentState.roles);\n\n if (source.action === scope.action && source.name === scope.name) {\n throw errors.create('INVALID_DEFINITION', `\"${scope.permissionId}\" cannot grant to itself`);\n }\n\n if (currentState.modules.get(scope.action)?.names.get(scope.name)?.grants.has(scope.permissionId)) {\n throw errors.create('DUPLICATE_REGISTRATION', `\"${scope.action}::${scope.name}\" already has a grant for \"${scope.permissionId}\"`);\n }\n\n const grantActions = definitions.readGrant(actions, `${scope.action}::${scope.name} [grantTo ${scope.permissionId}]`);\n\n ensureName(currentState, scope.action, scope.name).grants.set(scope.permissionId, { source, actions: grantActions });\n\n return scope.builder;\n}\n\nfunction registerModuleHook(scope: ModuleScope, method: Method, hook: HookFn): ModuleBuilder {\n const currentState = state.getOrCreate();\n\n state.requireOpen(currentState);\n checkHook(hook, method, scope.action);\n\n appendHook(ensureModule(currentState, scope.action).hooks, method, hook);\n\n return scope.builder;\n}\n\nfunction registerNameHook<Builder>(scope: NameScope<Builder>, method: Method, hook: HookFn): Builder {\n const currentState = state.getOrCreate();\n\n state.requireOpen(currentState);\n\n if (scope.role !== constants.GLOBAL_HOOK_OWNER) requireDeclaredRole(scope.role, currentState.roles);\n\n checkHook(hook, method, `${scope.action}::${scope.name}`);\n\n const nameEntry = ensureName(currentState, scope.action, scope.name);\n const roleHooks = nameEntry.hooks.get(scope.role) ?? new Map<Method, HookFn[]>();\n\n nameEntry.hooks.set(scope.role, roleHooks);\n\n appendHook(roleHooks, method, hook);\n\n return scope.builder;\n}\n\nfunction checkHook(hook: unknown, method: Method, permissionPath: string): void {\n definitions.checkMethod(method, 'INVALID_DEFINITION', permissionPath);\n\n if (typeof hook !== 'function') throw errors.create('INVALID_DEFINITION', `${permissionPath}: hook(\"${method}\") expects a function`);\n}\n\nfunction requireDeclaredRole(role: string, roles: ReadonlySet<string>): void {\n if (roles.has(role)) return;\n\n throw errors.create('ROLE_NOT_DECLARED',\n `role \"${role}\" is not declared. Available roles: ${[...roles].join(', ')}.\\n` +\n \"Is pkit.context.set('roles', [...]) missing from pkit.config.js, or was it imported after this file?\",\n );\n}\n\nfunction ensureModule(currentState: State, action: string): ModuleEntry {\n const registeredModule = currentState.modules.get(action);\n\n if (registeredModule) return registeredModule;\n\n const newModule: ModuleEntry = { names: new Map(), hooks: new Map() };\n\n currentState.modules.set(action, newModule);\n\n return newModule;\n}\n\nfunction ensureName(currentState: State, action: string, name: string): NameEntry {\n const registeredModule = ensureModule(currentState, action);\n const registeredName = registeredModule.names.get(name);\n\n if (registeredName) return registeredName;\n\n const newName: NameEntry = { actions: new Map(), grants: new Map(), hooks: new Map() };\n\n registeredModule.names.set(name, newName);\n\n return newName;\n}\n\nfunction appendHook(methodHooks: Map<Method, HookFn[]>, method: Method, hook: HookFn): void {\n const hooks = methodHooks.get(method) ?? [];\n\n methodHooks.set(method, hooks);\n hooks.push(hook);\n}\n\nexport default registry;\n",
15
+ "import constants from './constants';\nimport errors from './errors';\nimport identifiers from './identifiers';\nimport state from './state';\nimport type { ModuleEntry, NameEntry } from './state';\nimport type { Method, NamedPermissionCatalog, PermissionEntry } from './types';\n\nconst sealer = {\n /**\n * Closes the registry: checks the references that could still be completed by\n * a later import, then materializes the views. Idempotent.\n */\n seal(): void {\n const currentState = state.getOrCreate();\n\n if (currentState.snapshot) return;\n\n checkRegistry(currentState.modules);\n\n const named: Record<string, Readonly<Partial<Record<Method, PermissionEntry>>>> = Object.create(null);\n\n for (const [action, registeredModule] of currentState.modules) {\n for (const [name, nameEntry] of registeredModule.names) {\n for (const [role, actions] of nameEntry.actions) {\n named[identifiers.build(role, action, name)] = actions;\n }\n }\n }\n\n currentState.snapshot = { named: Object.freeze(named) as NamedPermissionCatalog, assignable: new Set(Object.keys(named)) };\n },\n};\n\nfunction checkRegistry(modules: ReadonlyMap<string, ModuleEntry>): void {\n for (const [action, registeredModule] of modules) {\n if (registeredModule.names.size === 0) {\n throw errors.create('INVALID_DEFINITION', `\"${action}\" has hooks but no name with registered actions`);\n }\n\n for (const [name, nameEntry] of registeredModule.names) {\n const permissionPath = `${action}::${name}`;\n\n if (nameEntry.actions.size === 0) {\n throw errors.create('INVALID_DEFINITION', `\"${permissionPath}\" has no registered actions for any role`);\n }\n\n checkGrantReferences(permissionPath, nameEntry, modules);\n checkRoleHooks(permissionPath, nameEntry);\n }\n }\n}\n\n/**\n * A grant only works if its enabling identifier is assignable and if the name it\n * extends declares the granted methods for some role.\n */\nfunction checkGrantReferences(permissionPath: string, nameEntry: NameEntry, modules: ReadonlyMap<string, ModuleEntry>): void {\n for (const [permissionId, grant] of nameEntry.grants) {\n const sourceEntry = modules.get(grant.source.action)?.names.get(grant.source.name);\n\n if (!sourceEntry?.actions.has(grant.source.role)) {\n throw errors.create('INVALID_DEFINITION', `\"${permissionPath}\": grantTo \"${permissionId}\" references a permission with no registered actions`);\n }\n\n for (const method of Object.keys(grant.actions)) {\n if (declaresMethod(nameEntry, method)) continue;\n\n throw errors.create('INVALID_DEFINITION',\n `\"${permissionPath}\": grantTo \"${permissionId}\" grants \"${method}\", which no role declares on that permission`,\n );\n }\n }\n}\n\nfunction declaresMethod(nameEntry: NameEntry, method: string): boolean {\n for (const actions of nameEntry.actions.values()) {\n if (Object.hasOwn(actions, method)) return true;\n }\n\n return false;\n}\n\n/** A role hook that no direct definition and no grant can ever reach is a configuration mistake. */\nfunction checkRoleHooks(permissionPath: string, nameEntry: NameEntry): void {\n for (const [hookRole, methodHooks] of nameEntry.hooks) {\n if (hookRole === constants.GLOBAL_HOOK_OWNER) continue;\n\n for (const method of methodHooks.keys()) {\n if (hasAccessPath(nameEntry, hookRole, method)) continue;\n\n throw errors.create('INVALID_DEFINITION',\n `\"${permissionPath}\": hook for \"${hookRole}\" on \"${method}\" has no registered actions or grant for that role`,\n );\n }\n }\n}\n\nfunction hasAccessPath(nameEntry: NameEntry, role: string, method: Method): boolean {\n if (nameEntry.actions.get(role)?.[method]) return true;\n\n for (const grant of nameEntry.grants.values()) {\n if (grant.source.role === role && grant.actions[method]) return true;\n }\n\n return false;\n}\n\nexport default sealer;\n",
16
+ "import constants from './constants';\nimport definitions from './definitions';\nimport errors from './errors';\nimport properties from './properties';\nimport resolve from './resolve';\nimport state from './state';\nimport type { State } from './state';\nimport type { Context, Data, HookFn, PkitError, ValidateInput, ValidateResult, ValidationError } from './types';\n\n/** What survives the trust boundary: nothing here needs to be re-checked. */\ninterface PreparedRequest {\n readonly hooks: readonly HookFn[];\n readonly data: Data;\n readonly context: Context;\n readonly permissions: readonly string[];\n}\n\nconst validator = {\n /**\n * The request boundary. Every failure of every phase becomes one entry of the\n * returned contract, so this never throws and never answers with a partial\n * success: on any failure `result` is `null`.\n */\n async validate(input: ValidateInput): Promise<ValidateResult> {\n try {\n const request = prepareRequest(input, state.getOrCreate());\n const hookCalls: Promise<unknown>[] = [];\n\n for (const hook of request.hooks) hookCalls.push(invokeHook(hook, request));\n\n const hookResults = await Promise.allSettled(hookCalls);\n const hookErrors: ValidationError[] = [];\n\n for (const hookResult of hookResults) {\n if (hookResult.status === 'fulfilled') continue;\n\n const hookCause: unknown = hookResult.reason;\n\n hookErrors.push({ code: 'HOOK_ERROR', message: describeHookFailure(hookCause), cause: hookCause });\n }\n\n if (hookErrors.length) return { result: null, errors: Object.freeze(hookErrors) };\n\n return { result: { data: request.data }, errors: Object.freeze([] as const) };\n } catch (cause) {\n return { result: null, errors: Object.freeze([translateFailure(cause)]) };\n }\n },\n};\n\n/**\n * Checks the request and resolves the access it asks for, in the documented order:\n * sealed registry, input shape, identity, module, name, access and data properties.\n * The request never names a permission name: it is chosen from the assignments.\n * Throws a `PkitError`; the caller turns it into the public contract.\n */\nfunction prepareRequest(input: ValidateInput, currentState: State): PreparedRequest {\n const snapshot = state.requireSnapshot(currentState);\n\n const method = definitions.checkMethod(input.method, 'INVALID_INPUT', 'method is required');\n const { action, permissions } = input;\n\n if (typeof action !== 'string') throw errors.create('INVALID_INPUT', 'action is required');\n\n const data = readOptionalObject(input.data, 'data must be an object');\n const context = readOptionalObject(input.context, 'context must be an object');\n\n const identity = resolve.identity(input, snapshot, currentState.roles);\n const { role, assigned } = identity;\n\n const registeredModule = currentState.modules.get(action);\n\n if (!registeredModule) throw errors.create('UNKNOWN_ACTION', `module \"${action}\" is not registered`);\n\n const chosen = resolve.permission(registeredModule, action, identity);\n\n if (!chosen) {\n throw errors.create('PERMISSION_NOT_ASSIGNED', `no name of module \"${action}\" is assigned or granted to role \"${role}\" by the user permissions`);\n }\n\n const { permissionId, entry: nameEntry } = chosen;\n const access = resolve.access(nameEntry, permissionId, role, method, assigned);\n\n if (access.status === 'unassigned') {\n throw errors.create('PERMISSION_NOT_ASSIGNED', `\"${permissionId}\" is not assigned or granted by the user permissions`);\n }\n\n if (access.status === 'disabled') throw errors.create('METHOD_DISABLED', `\"${permissionId}.${method}\" is not enabled`);\n\n // A declared role can never be \"*\", so the role bucket never collides with the name-wide one.\n const hookGroups = [\n registeredModule.hooks.get(method),\n nameEntry.hooks.get(constants.GLOBAL_HOOK_OWNER)?.get(method),\n nameEntry.hooks.get(role)?.get(method),\n ];\n\n const hooks: HookFn[] = [];\n\n for (const group of hookGroups) {\n if (group) hooks.push(...group);\n }\n\n return { hooks, context, permissions, data: properties.resolve(data, access.properties, currentState.cropper) };\n}\n\n/** `data` and `context` are optional and become `{}` exactly once, here. */\nfunction readOptionalObject(value: unknown, message: string): Data {\n if (value === undefined) return {};\n\n if (value === null || typeof value !== 'object' || Array.isArray(value)) throw errors.create('INVALID_INPUT', message);\n\n return value as Data;\n}\n\n/** Async so a hook that throws synchronously still lands as a rejection in `allSettled`. */\nasync function invokeHook(hook: HookFn, request: PreparedRequest): Promise<unknown> {\n return hook(request.data, request.context, request.permissions);\n}\n\nfunction describeHookFailure(reason: unknown): string {\n try {\n return reason instanceof Error ? reason.message : String(reason);\n } catch {\n return 'the hook threw a value that cannot be described';\n }\n}\n\nfunction translateFailure(cause: unknown): ValidationError {\n if (!(cause instanceof Error) || cause.name !== 'PkitError') {\n return { code: 'VALIDATION_ERROR', message: 'permission could not be validated', cause };\n }\n\n const permissionError = cause as PkitError;\n\n if (permissionError.code === 'PROPERTIES_NOT_ALLOWED') {\n return { code: permissionError.code, message: permissionError.message, fields: permissionError.fields };\n }\n\n return { code: permissionError.code, message: permissionError.message };\n}\n\nexport default validator;\n",
17
+ "import constants from './constants';\nimport context from './context';\nimport permissions from './permissions';\nimport registry from './registry';\nimport sealer from './seal';\nimport validator from './validate';\n\nexport type {\n ActionDef,\n ActionDefs,\n Context,\n ContextKey,\n ContextValues,\n Data,\n GrantDef,\n GrantDefs,\n HookFn,\n Method,\n MethodAccessMap,\n NamedPermissionCatalog,\n PermissionEntry,\n PermissionId,\n PkitError,\n PkitErrorCode,\n Properties,\n Role,\n RoleRegistry,\n UserAssignments,\n UserPermissionMap,\n ValidateData,\n ValidateInput,\n ValidateResult,\n ValidationError,\n ValidationErrorCode,\n} from './types';\n\nexport type { GrantBuilder, ModuleBuilder, NameBuilder, RoleBuilder } from './registry';\n\nexport const METHODS = constants.METHODS;\n\nexport const seal = sealer.seal;\n\nexport const validate = validator.validate;\n\nconst defineModule = registry.defineModule;\n\nexport { context, permissions, defineModule as module };\n\nexport const pkit = Object.freeze({ context, module: defineModule, seal, permissions, validate });\n\nexport default pkit;\n"
16
18
  ],
17
- "mappings": "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",
18
- "debugId": "B57D4832B42402DE64756E2164756E21",
19
+ "mappings": "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",
20
+ "debugId": "1BE6B3EEE711E91164756E2164756E21",
19
21
  "names": []
20
22
  }