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.
- package/README.md +27 -20
- package/bin/pkit.mjs +2 -2
- package/dist/cjs/index.cjs +716 -473
- package/dist/cjs/index.cjs.map +16 -14
- package/dist/esm/cli/child.js +131 -376
- package/dist/esm/cli/child.js.map +10 -11
- package/dist/esm/cli/generate.js +78 -420
- package/dist/esm/cli/generate.js.map +5 -9
- package/dist/esm/index.js +716 -473
- package/dist/esm/index.js.map +16 -14
- package/dist/types/cli/generate.d.ts +6 -4
- package/dist/types/cli/protocol.d.ts +10 -7
- package/dist/types/constants.d.ts +9 -6
- package/dist/types/context.d.ts +5 -6
- package/dist/types/definitions.d.ts +15 -0
- package/dist/types/errors.d.ts +12 -11
- package/dist/types/identifiers.d.ts +21 -0
- package/dist/types/index.d.ts +16 -17
- package/dist/types/permissions.d.ts +10 -5
- package/dist/types/properties.d.ts +17 -0
- package/dist/types/registry.d.ts +4 -1
- package/dist/types/resolve.d.ts +50 -6
- package/dist/types/seal.d.ts +8 -1
- package/dist/types/state.d.ts +12 -9
- package/dist/types/types.d.ts +25 -34
- package/dist/types/validate.d.ts +10 -3
- package/package.json +1 -1
- package/dist/types/validators.d.ts +0 -53
|
@@ -1,17 +1,16 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../../src/cli/child.ts", "../../src/
|
|
3
|
+
"sources": ["../../src/cli/child.ts", "../../src/errors.ts", "../../src/constants.ts", "../../src/identifiers.ts", "../../src/state.ts", "../../src/context.ts", "../../src/cli/protocol.ts"],
|
|
4
4
|
"sourcesContent": [
|
|
5
|
-
"import { pathToFileURL } from 'node:url';\nimport { resolve } from 'node:path';\nimport
|
|
6
|
-
"
|
|
7
|
-
"
|
|
8
|
-
"import type { PkitErrorCode } from './types';\n\
|
|
9
|
-
"import type {
|
|
10
|
-
"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",
|
|
11
|
-
"
|
|
12
|
-
"export const EXIT_CODE = { success: 0, failure: 1, usage: 2 } as const;\nexport const CATALOG_MARKER = '__PKIT_CATALOG__';\nexport const CHILD_TIMEOUT_MS = 30000;\nexport const CHILD_MAX_BUFFER_BYTES = 1048576;\n"
|
|
5
|
+
"import { pathToFileURL } from 'node:url';\nimport { resolve } from 'node:path';\nimport context from '../context';\nimport protocol from './protocol';\n\nconst configPath = process.argv[2];\n\nif (configPath === undefined) {\n console.error('usage: child <pkit.config.js>');\n process.exit(protocol.EXIT_CODE.usage);\n}\n\nawait import(pathToFileURL(resolve(configPath)).href);\n\n/** The leading newline closes any line the config left open on stdout, so the marker always starts a line of its own. */\nprocess.stdout.write(`\\n${protocol.CATALOG_MARKER}${JSON.stringify({ roles: context.get('roles') })}\\n`);\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
|
+
"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",
|
|
8
|
+
"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",
|
|
9
|
+
"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",
|
|
10
|
+
"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",
|
|
11
|
+
"const protocol = {\n EXIT_CODE: { success: 0, failure: 1, usage: 2 },\n\n CATALOG_MARKER: '__PKIT_CATALOG__',\n\n CHILD_TIMEOUT_MS: 30000,\n\n CHILD_MAX_BUFFER_BYTES: 1048576,\n} as const;\n\nexport default protocol;\n"
|
|
13
12
|
],
|
|
14
|
-
"mappings": "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",
|
|
15
|
-
"debugId": "
|
|
13
|
+
"mappings": "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",
|
|
14
|
+
"debugId": "E06FAADB234DDEA064756E2164756E21",
|
|
16
15
|
"names": []
|
|
17
16
|
}
|