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,15 +1,11 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../../src/cli/generate.ts", "../../src/cli/protocol.ts", "../../src/constants.ts", "../../src/errors.ts", "../../src/resolve.ts", "../../src/validators.ts"],
3
+ "sources": ["../../src/cli/generate.ts", "../../src/cli/protocol.ts"],
4
4
  "sourcesContent": [
5
- "import { execFile } from 'node:child_process';\nimport { existsSync, readFileSync, writeFileSync } from 'node:fs';\nimport { dirname, extname, resolve } from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport { parseArgs, promisify } from 'node:util';\nimport { CATALOG_MARKER, CHILD_MAX_BUFFER_BYTES, CHILD_TIMEOUT_MS, EXIT_CODE } from './protocol';\nimport { validateStrings } from '../validators';\n\ninterface GenerateOptions {\n cwd: string;\n config?: string;\n out?: string;\n}\n\ninterface GenerateResult {\n configPath: string;\n outPath: string;\n roles: readonly string[];\n}\n\ninterface RoleDeclaration extends GenerateResult {\n content: string;\n}\n\ninterface CheckResult extends GenerateResult {\n isStale: boolean;\n}\n\nfunction resolveConfigPath(workingDirectory: string, config: string | undefined): string {\n if (config !== undefined) return resolve(workingDirectory, config);\n const configFilenames = ['pkit.config.js', 'pkit.config.mjs', 'pkit.config.cjs', 'pkit.config.ts'];\n\n for (const filename of configFilenames) {\n const candidatePath = resolve(workingDirectory, filename);\n if (existsSync(candidatePath)) return candidatePath;\n }\n\n throw new Error(`${configFilenames.join(' | ')} not found in ${workingDirectory}`);\n}\n\nasync function readRoleCatalog(configPath: string, workingDirectory: string): Promise<readonly string[]> {\n const generatorPath = fileURLToPath(import.meta.url);\n const childPath = resolve(dirname(generatorPath), generatorPath.endsWith('.ts') ? 'child.ts' : 'child.js');\n const childArguments = [childPath, configPath];\n\n if (extname(configPath) === '.ts' && !process.versions.bun) childArguments.unshift('--experimental-strip-types');\n const { stdout } = await promisify(execFile)(process.execPath, childArguments, {\n cwd: workingDirectory,\n timeout: CHILD_TIMEOUT_MS,\n killSignal: 'SIGKILL',\n maxBuffer: CHILD_MAX_BUFFER_BYTES,\n });\n\n for (const outputLine of stdout.split('\\n')) {\n if (!outputLine.startsWith(CATALOG_MARKER)) continue;\n const catalog: { roles: unknown } = JSON.parse(outputLine.slice(CATALOG_MARKER.length));\n\n validateStrings(catalog.roles, {\n code: 'INVALID_DEFINITION', message: 'child process returned an invalid role catalog', minimumLength: 1,\n });\n\n return catalog.roles;\n }\n\n throw new Error('child process did not return the role catalog');\n}\n\nfunction renderRoleDeclarations(roles: readonly string[]): string {\n const declarations = [\n \"import 'endpoint-permissions-kit/types';\",\n '',\n \"declare module 'endpoint-permissions-kit/types' {\",\n ' interface RoleRegistry {',\n ];\n\n for (const role of [...roles].sort()) declarations.push(` ${JSON.stringify(role)}: true;`);\n declarations.push(' }', '}', '');\n\n return declarations.join('\\n');\n}\n\nasync function loadRoleDeclaration(options: GenerateOptions): Promise<RoleDeclaration> {\n const { cwd: workingDirectory, config, out } = options;\n const configPath = resolveConfigPath(workingDirectory, config);\n const roles = await readRoleCatalog(configPath, workingDirectory);\n const outPath = out === undefined ? resolve(workingDirectory, 'pkit.generated.d.ts') : resolve(workingDirectory, out);\n\n return { configPath, outPath, roles, content: renderRoleDeclarations(roles) };\n}\n\nexport async function generate(options: GenerateOptions): Promise<GenerateResult> {\n const { content, ...generationResult } = await loadRoleDeclaration(options);\n\n writeFileSync(generationResult.outPath, content);\n\n return generationResult;\n}\n\nexport async function checkGenerated(options: GenerateOptions): Promise<CheckResult> {\n const { content, ...generationResult } = await loadRoleDeclaration(options);\n\n if (!existsSync(generationResult.outPath)) return { ...generationResult, isStale: true };\n\n return { ...generationResult, isStale: readFileSync(generationResult.outPath, 'utf8') !== content };\n}\n\nexport async function main(commandArguments: readonly string[]): Promise<void> {\n try {\n const { positionals, values } = parseArgs({\n args: [...commandArguments],\n allowPositionals: true,\n options: { config: { type: 'string' }, out: { type: 'string' }, check: { type: 'boolean' } },\n });\n\n if (positionals[0] !== 'generate' || positionals.length !== 1) {\n console.error('usage: pkit generate [--config pkit.config.js] [--out pkit.generated.d.ts] [--check]');\n process.exitCode = EXIT_CODE.usage;\n return;\n }\n\n const options = { cwd: process.cwd(), config: values.config, out: values.out };\n\n if (values.check) {\n const checkResult = await checkGenerated(options);\n console.log(checkResult.isStale\n ? `pkit: ${checkResult.outPath} is stale, run pkit generate`\n : `pkit: ${checkResult.outPath} is up to date`);\n process.exitCode = checkResult.isStale ? EXIT_CODE.failure : EXIT_CODE.success;\n return;\n }\n\n const generationResult = await generate(options);\n\n console.log(`pkit: ${generationResult.roles.length} roles written to ${generationResult.outPath}`);\n process.exitCode = EXIT_CODE.success;\n } catch (cause) {\n console.error(`pkit: ${cause instanceof Error ? cause.message : String(cause)}`);\n process.exitCode = EXIT_CODE.failure;\n }\n}\n",
6
- "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",
7
- "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",
8
- "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",
9
- "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",
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"
5
+ "import { execFile } from 'node:child_process';\nimport { existsSync, readFileSync, writeFileSync } from 'node:fs';\nimport { dirname, extname, resolve } from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport { parseArgs, promisify } from 'node:util';\nimport protocol from './protocol';\n\ninterface GenerateOptions {\n cwd: string;\n config?: string;\n out?: string;\n}\n\ninterface GenerateResult {\n configPath: string;\n outPath: string;\n roles: readonly string[];\n}\n\ninterface RoleDeclaration extends GenerateResult {\n content: string;\n}\n\ninterface CheckResult extends GenerateResult {\n isStale: boolean;\n}\n\ninterface GenerateRequest {\n options: GenerateOptions;\n isCheck: boolean;\n}\n\nconst generator = {\n async generate(options: GenerateOptions): Promise<GenerateResult> {\n const { content, ...generationResult } = await loadRoleDeclaration(options);\n\n writeFileSync(generationResult.outPath, content);\n\n return generationResult;\n },\n\n async checkGenerated(options: GenerateOptions): Promise<CheckResult> {\n const { content, ...generationResult } = await loadRoleDeclaration(options);\n const isStale = !existsSync(generationResult.outPath) || readFileSync(generationResult.outPath, 'utf8') !== content;\n\n return { ...generationResult, isStale };\n },\n\n async main(commandArguments: readonly string[]): Promise<void> {\n const request = readRequest(commandArguments);\n\n if (request === null) {\n console.error('usage: pkit generate [--config pkit.config.js] [--out pkit.generated.d.ts] [--check]');\n process.exitCode = protocol.EXIT_CODE.usage;\n\n return;\n }\n\n try {\n const { options } = request;\n\n if (request.isCheck) {\n const checkResult = await generator.checkGenerated(options);\n\n console.log(checkResult.isStale\n ? `pkit: ${checkResult.outPath} is stale, run pkit generate`\n : `pkit: ${checkResult.outPath} is up to date`);\n\n process.exitCode = checkResult.isStale ? protocol.EXIT_CODE.failure : protocol.EXIT_CODE.success;\n\n return;\n }\n\n const generationResult = await generator.generate(options);\n\n console.log(`pkit: ${generationResult.roles.length} roles written to ${generationResult.outPath}`);\n\n process.exitCode = protocol.EXIT_CODE.success;\n } catch (cause) {\n console.error(`pkit: ${cause instanceof Error ? cause.message : String(cause)}`);\n\n process.exitCode = protocol.EXIT_CODE.failure;\n }\n },\n};\n\n/**\n * Reads the command line, or `null` for anything the CLI cannot act on.\n * `parseArgs` throws on an unknown option or a missing value; that is an invalid\n * command line, not a runtime failure, so it exits with the usage code.\n */\nfunction readRequest(commandArguments: readonly string[]): GenerateRequest | null {\n try {\n const { positionals, values } = parseArgs({\n args: [...commandArguments],\n allowPositionals: true,\n options: { config: { type: 'string' }, out: { type: 'string' }, check: { type: 'boolean' } },\n });\n\n if (positionals[0] !== 'generate' || positionals.length !== 1) return null;\n\n return { options: { cwd: process.cwd(), config: values.config, out: values.out }, isCheck: values.check === true };\n } catch {\n return null;\n }\n}\n\nasync function loadRoleDeclaration(options: GenerateOptions): Promise<RoleDeclaration> {\n const configPath = resolveConfigPath(options.cwd, options.config);\n const roles = await readRoleCatalog(configPath, options.cwd);\n const outPath = resolve(options.cwd, options.out === undefined ? 'pkit.generated.d.ts' : options.out);\n\n return { configPath, outPath, roles, content: renderRoleDeclarations(roles) };\n}\n\nfunction resolveConfigPath(workingDirectory: string, config: string | undefined): string {\n if (config !== undefined) return resolve(workingDirectory, config);\n\n const configFilenames = ['pkit.config.js', 'pkit.config.mjs', 'pkit.config.cjs', 'pkit.config.ts'];\n\n for (const filename of configFilenames) {\n const candidatePath = resolve(workingDirectory, filename);\n\n if (existsSync(candidatePath)) return candidatePath;\n }\n\n throw new Error(`${configFilenames.join(' | ')} not found in ${workingDirectory}`);\n}\n\nasync function readRoleCatalog(configPath: string, workingDirectory: string): Promise<readonly string[]> {\n const generatorPath = fileURLToPath(import.meta.url);\n\n /** The child is always this file's sibling: `.ts` while running from `src/`, `.js` once built into `dist/`. */\n const childPath = resolve(dirname(generatorPath), generatorPath.endsWith('.ts') ? 'child.ts' : 'child.js');\n const childArguments = [childPath, configPath];\n\n if (extname(configPath) === '.ts' && !process.versions.bun) childArguments.unshift('--experimental-strip-types');\n\n const { stdout } = await promisify(execFile)(process.execPath, childArguments, {\n cwd: workingDirectory,\n timeout: protocol.CHILD_TIMEOUT_MS,\n killSignal: 'SIGKILL',\n maxBuffer: protocol.CHILD_MAX_BUFFER_BYTES,\n });\n\n for (const outputLine of stdout.split('\\n')) {\n if (outputLine.startsWith(protocol.CATALOG_MARKER)) return parseRoleCatalog(outputLine.slice(protocol.CATALOG_MARKER.length));\n }\n\n throw new Error('child process did not return the role catalog');\n}\n\n/** The child prints arbitrary text, so a broken payload fails with a CLI message instead of a raw JSON.parse error. */\nfunction parseRoleCatalog(payload: string): readonly string[] {\n let catalog: unknown = null;\n\n try {\n catalog = JSON.parse(payload);\n } catch {\n throw new Error('child process returned a malformed role catalog');\n }\n\n const roles: unknown = catalog !== null && typeof catalog === 'object' ? (catalog as { roles: unknown }).roles : undefined;\n\n if (!Array.isArray(roles)) throw new Error('child process returned an invalid role catalog');\n\n for (const role of roles) {\n if (typeof role !== 'string' || role.length === 0) throw new Error('child process returned an invalid role catalog');\n }\n\n return roles as readonly string[];\n}\n\nfunction renderRoleDeclarations(roles: readonly string[]): string {\n const declarations = [\n \"import 'endpoint-permissions-kit/types';\",\n '',\n \"declare module 'endpoint-permissions-kit/types' {\",\n ' interface RoleRegistry {',\n ];\n\n for (const role of [...roles].sort()) declarations.push(` ${JSON.stringify(role)}: true;`);\n\n declarations.push(' }', '}', '');\n\n return declarations.join('\\n');\n}\n\nexport default generator;\n",
6
+ "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"
11
7
  ],
12
- "mappings": "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",
13
- "debugId": "32F0EF205A005A3364756E2164756E21",
8
+ "mappings": "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",
9
+ "debugId": "1516241B0551E2F164756E2164756E21",
14
10
  "names": []
15
11
  }