endpoint-permissions-kit 0.1.0 → 0.2.1
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 +28 -20
- package/bin/pkit.mjs +2 -2
- package/dist/cjs/index.cjs +744 -474
- package/dist/cjs/index.cjs.map +16 -14
- package/dist/esm/cli/child.js +329 -352
- package/dist/esm/cli/child.js.map +11 -11
- package/dist/esm/cli/generate.js +78 -420
- package/dist/esm/cli/generate.js.map +5 -9
- package/dist/esm/index.js +746 -476
- 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 +6 -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 +11 -9
- package/dist/types/types.d.ts +26 -34
- package/dist/types/validate.d.ts +5 -3
- package/package.json +1 -1
- package/dist/types/validators.d.ts +0 -53
|
@@ -1,17 +1,17 @@
|
|
|
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/properties.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
|
|
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
|
-
"import
|
|
12
|
-
"
|
|
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 constants from './constants';\nimport errors from './errors';\nimport type { Data, Properties } from './types';\n\nconst PRUNED = Symbol('pruned');\n\nconst MAX_DEPTH = 1000;\n\ntype PathPattern = readonly string[];\n\ninterface Walk {\n readonly patterns: readonly PathPattern[];\n readonly segments: string[];\n readonly ancestors: Set<object>;\n}\n\nconst properties = {\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 resolve(data: Data, allowed: Properties, reserved: readonly string[], cropper: boolean): Data {\n if (allowed === constants.ALL_FIELDS) return data;\n\n const patterns: PathPattern[] = [];\n\n for (const pattern of allowed.concat(reserved)) 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\nfunction segmentsOf(path: string): readonly string[] {\n const segments: string[] = [];\n\n let segment = '';\n\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\n continue;\n }\n\n if (character === '.') {\n segments.push(segment);\n\n segment = '';\n index += 1;\n\n continue;\n }\n\n segment += character;\n index += 1;\n }\n\n segments.push(segment);\n\n return segments;\n}\n\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\n break;\n }\n\n if (isMatch) return true;\n }\n\n return false;\n}\n\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\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\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\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\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\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\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\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\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\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\n walk.ancestors.add(container);\n\n for (const key of keys) {\n walk.segments.push(key);\n\n collectForbiddenPaths(container[key], walk, forbidden);\n\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\n collectForbiddenPaths(data[key], walk, forbidden);\n\n walk.segments.pop();\n }\n\n if (forbidden.size === 0) return;\n\n const fields = [...forbidden];\n\n const error = errors.create('PROPERTIES_NOT_ALLOWED', `fields not allowed: ${fields.join(', ')}`);\n\n throw Object.assign(error, { fields });\n}\n\nexport default properties;\n",
|
|
10
|
+
"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 reservedFields: readonly string[];\n readonly modules: Map<string, ModuleEntry>;\n snapshot: Snapshot | null;\n}\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] = {\n roles: new Set([constants.GENERAL_ROLE]),\n cropper: false,\n reservedFields: [],\n modules: new Map(),\n snapshot: null,\n };\n }\n\n return stateHost[STATE_KEY];\n },\n\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 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",
|
|
11
|
+
"import errors from './errors';\nimport identifiers from './identifiers';\nimport properties from './properties';\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\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 if (contextKey === 'reservedFields') {\n currentState.reservedFields = Object.freeze(readReservedFields(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\n const currentState = state.getOrCreate();\n\n if (contextKey === 'cropper') return currentState.cropper as ContextValues[Key];\n\n const paths: readonly string[] = contextKey === 'roles' ? [...currentState.roles] : [...currentState.reservedFields];\n\n return paths as ContextValues[Key];\n },\n});\n\nfunction checkKey(key: unknown): ContextKey {\n if (key === 'roles' || key === 'cropper' || key === 'reservedFields') return key;\n\n throw errors.create('INVALID_DEFINITION', `unknown context key: \"${errors.describe(key)}\"`);\n}\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\nfunction readReservedFields(value: unknown): string[] {\n if (!Array.isArray(value)) throw errors.create('INVALID_DEFINITION', 'reservedFields must be an array of property paths');\n\n const fields: string[] = [];\n\n for (const field of value) {\n if (typeof field !== 'string') throw errors.create('INVALID_DEFINITION', 'reservedFields must be an array of property paths');\n\n properties.checkDeclaredPath(field, 'reservedFields');\n\n fields.push(field);\n }\n\n return fields;\n}\n\nexport default context;\n",
|
|
12
|
+
"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
13
|
],
|
|
14
|
-
"mappings": ";AAAA;AACA;;;ACDO,IAAM,UAAU,CAAC,QAAQ,UAAU,UAAU,QAAQ;AAErD,IAAM,eAAe;AAErB,IAAM,oBAAoB;AAE1B,IAAM,aAAa;AAEnB,IAAM,mBAAmB;AAEzB,IAAM,0BAA0B;;;AC0BhC,SAAS,gBAAgB,GAAU;AAAA,EACxC,MAAM,WAAW,OAAO,IAAI,0BAA0B;AAAA,EACtD,MAAM,YAAY;AAAA,EAElB,IAAI,UAAU,cAAc,WAAW;AAAA,IACrC,UAAU,YAAY,EAAE,OAAO,IAAI,IAAI,CAAC,YAAY,CAAC,GAAG,SAAS,IAAI,KAAO,UAAU,KAAK;AAAA,EAC7F;AAAA,EAEA,OAAO,UAAU;AAAA;;;ACrCZ,SAAS,SAA0C,CAAC,MAAiB,SAG1E;AAAA,EACA,OAAO,OAAO,OAAO,IAAI,MAAM,OAAO,GAAG,EAAE,MAAM,aAAsB,KAAK,CAAC;AAAA;;;ACF/E,IAAM,uBAAsC,OAAO,OAAO,EAAE,QAAQ,MAAM,WAAW,OAAO,OAAO,CAAC,CAAC,EAAE,CAAC;AAExG,IAAM,kBAA0B,OAAO,OAAO,EAAE,QAAQ,WAAW,CAAC;AAEpE,IAAM,oBAA4B,OAAO,OAAO,EAAE,QAAQ,aAAa,CAAC;AAEjE,SAAS,cAAc,CAAC,MAAc,QAAgB,MAA4B;AAAA,EACvF,OAAO,CAAC,MAAM,QAAQ,IAAI,EAAE,KAAK,uBAAuB;AAAA;AAGnD,SAAS,aAAa,CAAC,WAAsB,cAAsB,MAAc,QAAgB,UAAuC;AAAA,EAC7I,IAAI,SAAS,IAAI,YAAY;AAAA,IAAG,OAAO,oBAAoB,WAAW,MAAM,MAAM;AAAA,EAElF,OAAO,qBAAqB,WAAW,QAAQ,QAAQ;AAAA;AAGzD,SAAS,mBAAmB,CAAC,WAAsB,MAAc,QAAwB;AAAA,EACvF,MAAM,aAAa,UAAU,QAAQ,IAAI,IAAI,IAAI;AAAA,EACjD,IAAI,CAAC,YAAY;AAAA,IAAS,OAAO;AAAA,EAEjC,OAAO,EAAE,QAAQ,WAAW,YAAY,WAAW,YAAY,eAAe,qBAAqB;AAAA;AAGrG,SAAS,oBAAoB,CAAC,WAAsB,QAAgB,UAAuC;AAAA,EACzG,MAAM,YAA4B,CAAC;AAAA,EACnC,MAAM,aAAa,IAAI;AAAA,EACvB,IAAI,YAAY;AAAA,EAEhB,YAAY,YAAY,UAAU,UAAU,QAAQ;AAAA,IAClD,IAAI,CAAC,SAAS,IAAI,UAAU;AAAA,MAAG;AAAA,IAC/B,YAAY;AAAA,IAEZ,MAAM,aAAa,MAAM,QAAQ;AAAA,IACjC,IAAI,CAAC;AAAA,MAAY;AAAA,IAEjB,UAAU,KAAK,UAA0B;AAAA,IACzC,WAAW,SAAS,WAAW;AAAA,MAAY,WAAW,IAAI,KAAK;AAAA,EACjE;AAAA,EAEA,IAAI,UAAU,WAAW;AAAA,IAAG,OAAO,YAAY,kBAAkB;AAAA,EAEjE,MAAM,gBAA+B,OAAO,OAAO,EAAE,QAAQ,OAAO,WAAW,OAAO,OAAO,UAAU,KAAK,CAAC,EAAE,CAAC;AAAA,EAEhH,OAAO,EAAE,QAAQ,WAAW,YAAY,OAAO,OAAO,CAAC,GAAG,UAAU,CAAC,GAAG,cAAc;AAAA;;;ACJxF,SAAS,cAAc,CAAC,OAAgB,SAAmD;AAAA,EACzF,IAAI,UAAU,QAAQ,OAAO,UAAU,YAAY,MAAM,QAAQ,KAAK,GAAG;AAAA,IACvE,MAAM,UAAU,QAAQ,MAAM,QAAQ,OAAO;AAAA,EAC/C;AAAA;AAGK,SAAS,eAAe,CAAC,OAAgB,OAAwD;AAAA,EACtG,IAAI,CAAC,MAAM,QAAQ,KAAK;AAAA,IAAG,MAAM,UAAU,MAAM,MAAM,MAAM,OAAO;AAAA,EAEpE,WAAW,SAAS,OAAO;AAAA,IACzB,IAAI,OAAO,UAAU,YAAY,MAAM,SAAS,MAAM,eAAe;AAAA,MACnE,MAAM,UAAU,MAAM,MAAM,MAAM,OAAO;AAAA,IAC3C;AAAA,EACF;AAAA;AAGK,SAAS,kBAAkB,CAAC,KAAsC;AAAA,EACvE,IAAI,QAAQ;AAAA,IAAS,MAAM,UAAU,sBAAsB,yBAAyB,OAAO,GAAG,IAAI;AAAA;AAGpG,SAAS,oBAAoB,CAAC,OAAoB;AAAA,EAChD,IAAI,MAAM;AAAA,IAAU,MAAM,UAAU,UAAU,+DAA+D;AAAA;AAGxG,SAAS,gBAA0B,CAAC,UAAyD;AAAA,EAClG,IAAI,aAAa,MAAM;AAAA,IACrB,MAAM,UAAU,cAAc,gFAAgF;AAAA,EAChH;AAAA;AAGK,SAAS,YAAY,CAAC,MAAe,OAA4B,MAAkE;AAAA,EACxI,IAAI,OAAO,SAAS,YAAY,MAAM,IAAI,IAAI;AAAA,IAAG;AAAA,EAEjD,IAAI,SAAS,qBAAqB;AAAA,IAChC,MAAM,UAAU,MACd,SAAS,OAAO,IAAI,wCAAwC,CAAC,GAAG,KAAK,EAAE,KAAK,IAAI;AAAA,IAChF,sGACF;AAAA,EACF;AAAA,EAEA,MAAM,UAAU,MAAM,SAAS,OAAO,IAAI,oBAAoB;AAAA;AAGzD,SAAS,mBAAmB,CAAC,OAAgB,OAAkD;AAAA,EACpG,qBAAqB,KAAK;AAAA,EAE1B,IAAI,MAAM,QAAQ,MAAM;AAAA,IACtB,MAAM,UAAU,sBAAsB,oFAAoF;AAAA,EAC5H;AAAA,EAEA,gBAAgB,OAAO;AAAA,IACrB,MAAM;AAAA,IAAsB,SAAS;AAAA,IAA+C,eAAe;AAAA,EACrG,CAAC;AAAA,EAED,IAAI,MAAM,WAAW;AAAA,IAAG,MAAM,UAAU,sBAAsB,sCAAsC;AAAA,EAEpG,WAAW,QAAQ;AAAA,IAAO,oBAAoB,IAAI;AAAA;AAGpD,SAAS,cAAc,CAAC,OAAwB;AAAA,EAC9C,OAAO,MAAM,SAAS,KAAK,MAAM,KAAK,MAAM,SAAS,CAAC,MAAM,SAAS,GAAG;AAAA;AAGnE,SAAS,mBAAmB,CAAC,MAAuC;AAAA,EACzE,IAAI,OAAO,SAAS,YAAY,eAAe,IAAI,KAAK,SAAS;AAAA,IAAmB;AAAA,EAEpF,MAAM,UAAU,sBACd,kBAAkB,OAAO,IAAI,4DAA4D,kDAC3F;AAAA;AAGK,SAAS,kBAAkB,CAAC,YAAmD;AAAA,EACpF,IAAI,OAAO,eAAe,YAAY,eAAe,UAAU,KAAK,CAAC,WAAW,SAAS,gBAAgB;AAAA,IAAG;AAAA,EAE5G,MAAM,UAAU,sBACd,yBAAyB,OAAO,UAAU,kEAC5C;AAAA;AAGK,SAAS,sBAAsB,CAAC,MAAuC;AAAA,EAC5E,IAAI,OAAO,SAAS,YAAY,eAAe,IAAI,KAAK,SAAS;AAAA,IAAmB;AAAA,EAEpF,MAAM,UAAU,sBACd,6BAA6B,OAAO,IAAI,0EAC1C;AAAA;AAGK,SAAS,iBAAiB,CAAC,OAAgB,SAAiD;AAAA,EACjG,IAAI,OAAO,UAAU;AAAA,IAAU,MAAM,UAAU,QAAQ,MAAM,QAAQ,OAAO;AAAA,EAE5E,MAAM,QAAQ,MAAM,MAAM,uBAAuB;AAAA,EACjD,OAAO,MAAM,QAAQ,QAAQ;AAAA,EAE7B,IAAI,MAAM,WAAW,KAAK,SAAS,aAAa,WAAW,aAAa,SAAS,WAAW;AAAA,IAC1F,MAAM,UAAU,QAAQ,MAAM,QAAQ,OAAO;AAAA,EAC/C;AAAA,EAEA,MAAM,cAAc,eAAe,IAAI,KAAK,SAAS;AAAA,EACrD,MAAM,cAAc,eAAe,IAAI,KAAK,SAAS;AAAA,EACrD,MAAM,gBAAgB,OAAO,MAAM,gBAAgB,EAAE,MAAM,cAAc;AAAA,EAEzE,IAAI,CAAC,eAAe,CAAC,eAAe,CAAC;AAAA,IAAe,MAAM,UAAU,QAAQ,MAAM,QAAQ,OAAO;AAAA,EAEjG,OAAO,EAAE,MAAM,QAAQ,KAAK;AAAA;AAG9B,SAAS,cAAc,CAAC,QAAiB,SAAsD;AAAA,EAC7F,IAAK,QAA+B,SAAS,MAAM;AAAA,IAAG;AAAA,EAEtD,MAAM,UAAU,QAAQ,MAAM,GAAG,QAAQ,oBAAoB,OAAO,MAAM,+BAA+B,QAAQ,KAAK,IAAI,GAAG;AAAA;AAG/H,SAAS,oBAAoB,CAAC,YAAqB,gBAAmC;AAAA,EACpF,eAAe,YAAY,EAAE,MAAM,sBAAsB,SAAS,GAAG,oCAAoC,CAAC;AAAA,EAE1G,IAAI,OAAO,WAAW,YAAY,WAAW;AAAA,IAC3C,MAAM,UAAU,sBAAsB,GAAG,2CAA2C;AAAA,EACtF;AAAA,EAEA,QAAQ,eAAe;AAAA,EAEvB,IAAI,eAAe;AAAA,IAAY,OAAO,OAAO,OAAO,EAAE,SAAS,WAAW,SAAS,WAAW,CAAC;AAAA,EAE/F,gBAAgB,YAAY;AAAA,IAC1B,MAAM;AAAA,IAAsB,SAAS,GAAG;AAAA,IAAsD,eAAe;AAAA,EAC/G,CAAC;AAAA,EAED,IAAI,WAAW,SAAS,UAAU,GAAG;AAAA,IACnC,MAAM,UAAU,sBAAsB,GAAG,oBAAoB,2DAA2D;AAAA,EAC1H;AAAA,EAEA,IAAI,IAAI,IAAI,UAAU,EAAE,SAAS,WAAW,QAAQ;AAAA,IAClD,MAAM,UAAU,sBAAsB,GAAG,sDAAsD;AAAA,EACjG;AAAA,EAEA,OAAO,OAAO,OAAO,EAAE,SAAS,WAAW,SAAS,YAAY,OAAO,OAAO,CAAC,GAAG,UAAU,CAAC,EAAE,CAAC;AAAA;AAGlG,SAAS,qBAAqB,CAAC,SAAkB,gBAAoC;AAAA,EACnF,eAAe,SAAS,EAAE,MAAM,sBAAsB,SAAS,GAAG,oDAAoD,CAAC;AAAA,EAEvH,MAAM,oBAAgC,OAAO,OAAO,IAAI;AAAA,EAExD,YAAY,QAAQ,eAAe,OAAO,QAAQ,OAAO,GAAG;AAAA,IAC1D,eAAe,QAAQ,EAAE,MAAM,sBAAsB,SAAS,eAAe,CAAC;AAAA,IAC9E,kBAAkB,UAAU,qBAAqB,YAAY,GAAG,kBAAkB,QAAQ;AAAA,EAC5F;AAAA,EAEA,OAAO,OAAO,OAAO,iBAAiB;AAAA;AAGjC,SAAS,eAAe,CAAC,SAAkB,cAAkC,OAA0B;AAAA,EAC5G,QAAQ,QAAQ,MAAM,SAAS;AAAA,EAE/B,qBAAqB,KAAK;AAAA,EAC1B,aAAa,MAAM,MAAM,OAAO,mBAAmB;AAAA,EAEnD,IAAI,MAAM,QAAQ,IAAI,MAAM,GAAG,MAAM,IAAI,IAAI,GAAG,QAAQ,IAAI,IAAI,GAAG;AAAA,IACjE,MAAM,UAAU,0BAA0B,IAAI,WAAW,kDAAkD,OAAO;AAAA,EACpH;AAAA,EAEA,OAAO,sBAAsB,SAAS,GAAG,WAAW,SAAS,OAAO;AAAA;AAG/D,SAAS,oBAAoB,CAAC,SAAkB,cAAiC,OAA0B;AAAA,EAChH,QAAQ,QAAQ,MAAM,iBAAiB;AAAA,EAEvC,qBAAqB,KAAK;AAAA,EAE1B,MAAM,SAAS,kBAAkB,cAAc;AAAA,IAC7C,MAAM;AAAA,IACN,SAAS,IAAI,WAAW,uCAAuC,OAAO,YAAY;AAAA,EACpF,CAAC;AAAA,EAED,aAAa,OAAO,MAAM,MAAM,OAAO,mBAAmB;AAAA,EAE1D,IAAI,OAAO,WAAW,UAAU,OAAO,SAAS,MAAM;AAAA,IACpD,MAAM,UAAU,sBAAsB,IAAI,sCAAsC;AAAA,EAClF;AAAA,EAEA,IAAI,MAAM,QAAQ,IAAI,MAAM,GAAG,MAAM,IAAI,IAAI,GAAG,OAAO,IAAI,YAAY,GAAG;AAAA,IACxE,MAAM,UAAU,0BAA0B,IAAI,WAAW,kCAAkC,eAAe;AAAA,EAC5G;AAAA,EAEA,MAAM,iBAAiB,GAAG,WAAW,iBAAiB;AAAA,EACtD,MAAM,oBAAoB,sBAAsB,SAAS,cAAc;AAAA,EAEvE,YAAY,QAAQ,eAAe,OAAO,QAAQ,iBAAiB,GAAG;AAAA,IACpE,IAAI,WAAW,YAAY,MAAM;AAAA,MAC/B,MAAM,UAAU,sBAAsB,GAAG,kBAAkB,+CAA+C;AAAA,IAC5G;AAAA,IAEA,IAAI,WAAW,eAAe,YAAY;AAAA,MACxC,MAAM,UAAU,sBAAsB,GAAG,kBAAkB,sDAAsD;AAAA,IACnH;AAAA,EACF;AAAA,EAEA,OAAO,EAAE,QAAQ,SAAS,kBAA+B;AAAA;AAGpD,SAAS,YAAY,CAAC,MAAe,cAAgC,OAAsC;AAAA,EAChH,QAAQ,QAAQ,MAAM,MAAM,WAAW;AAAA,EAEvC,qBAAqB,KAAK;AAAA,EAE1B,IAAI,SAAS,aAAa,SAAS;AAAA,IAAmB,aAAa,MAAM,MAAM,OAAO,mBAAmB;AAAA,EAEzG,MAAM,iBAAiB,SAAS,YAAY,SAAS,GAAG,WAAW;AAAA,EAEnE,eAAe,QAAQ,EAAE,MAAM,sBAAsB,SAAS,eAAe,CAAC;AAAA,EAE9E,IAAI,OAAO,SAAS;AAAA,IAAY,MAAM,UAAU,sBAAsB,GAAG,yBAAyB,6BAA6B;AAAA;AAGjI,SAAS,cAAc,CAAC,WAAsB,QAAyB;AAAA,EACrE,WAAW,WAAW,UAAU,QAAQ,OAAO,GAAG;AAAA,IAChD,IAAI,OAAO,OAAO,SAAS,MAAM;AAAA,MAAG,OAAO;AAAA,EAC7C;AAAA,EAEA,OAAO;AAAA;AAGT,SAAS,aAAa,CAAC,WAAsB,MAAc,QAAyB;AAAA,EAClF,IAAI,UAAU,QAAQ,IAAI,IAAI,IAAI;AAAA,IAAS,OAAO;AAAA,EAElD,WAAW,SAAS,UAAU,OAAO,OAAO,GAAG;AAAA,IAC7C,IAAI,MAAM,OAAO,SAAS,QAAQ,MAAM,QAAQ;AAAA,MAAS,OAAO;AAAA,EAClE;AAAA,EAEA,OAAO;AAAA;AAGT,SAAS,uBAAuB,CAAC,gBAAwB,WAAsB,SAAiD;AAAA,EAC9H,YAAY,cAAc,UAAU,UAAU,QAAQ;AAAA,IACpD,MAAM,cAAc,QAAQ,IAAI,MAAM,OAAO,MAAM,GAAG,MAAM,IAAI,MAAM,OAAO,IAAI;AAAA,IAEjF,IAAI,CAAC,aAAa,QAAQ,IAAI,MAAM,OAAO,IAAI,GAAG;AAAA,MAChD,MAAM,UAAU,sBAAsB,IAAI,6BAA6B,kEAAkE;AAAA,IAC3I;AAAA,IAEA,WAAW,UAAU,OAAO,KAAK,MAAM,OAAO,GAAG;AAAA,MAC/C,IAAI,eAAe,WAAW,MAAM;AAAA,QAAG;AAAA,MAEvC,MAAM,UAAU,sBACd,IAAI,6BAA6B,yBAAyB,oDAC5D;AAAA,IACF;AAAA,EACF;AAAA;AAGF,SAAS,iBAAiB,CAAC,gBAAwB,WAA4B;AAAA,EAC7E,YAAY,UAAU,gBAAgB,UAAU,OAAO;AAAA,IACrD,IAAI,aAAa;AAAA,MAAmB;AAAA,IAEpC,WAAW,UAAU,YAAY,KAAK,GAAG;AAAA,MACvC,IAAI,cAAc,WAAW,UAAU,MAAM;AAAA,QAAG;AAAA,MAEhD,MAAM,UAAU,sBACd,IAAI,8BAA8B,iBAAiB,0DACrD;AAAA,IACF;AAAA,EACF;AAAA;AAGK,SAAS,sBAAsB,CAAC,SAAiD;AAAA,EACtF,YAAY,QAAQ,qBAAqB,SAAS;AAAA,IAChD,IAAI,iBAAiB,MAAM,SAAS,GAAG;AAAA,MACrC,MAAM,UAAU,sBAAsB,IAAI,uDAAuD;AAAA,IACnG;AAAA,IAEA,YAAY,MAAM,cAAc,iBAAiB,OAAO;AAAA,MACtD,MAAM,iBAAiB,GAAG,WAAW;AAAA,MAErC,IAAI,UAAU,QAAQ,SAAS,GAAG;AAAA,QAChC,MAAM,UAAU,sBAAsB,IAAI,wDAAwD;AAAA,MACpG;AAAA,MAEA,wBAAwB,gBAAgB,WAAW,OAAO;AAAA,MAC1D,kBAAkB,gBAAgB,SAAS;AAAA,IAC7C;AAAA,EACF;AAAA;AAGF,SAAS,mBAAmB,CAAC,aAAsB,MAAc,YAAsD;AAAA,EACrH,gBAAgB,aAAa,EAAE,MAAM,iBAAiB,SAAS,2CAA2C,eAAe,EAAE,CAAC;AAAA,EAE5H,MAAM,WAAW,IAAI;AAAA,EAErB,WAAW,gBAAgB,aAAa;AAAA,IACtC,MAAM,YAAY,kBAAkB,cAAc;AAAA,MAChD,MAAM;AAAA,MAAiB,SAAS,mCAAmC;AAAA,IACrE,CAAC;AAAA,IAED,IAAI,UAAU,SAAS,MAAM;AAAA,MAC3B,MAAM,UAAU,4BAA4B,IAAI,kCAAkC,UAAU,sCAAsC,OAAO;AAAA,IAC3I;AAAA,IAEA,IAAI,CAAC,WAAW,IAAI,YAAY,GAAG;AAAA,MACjC,MAAM,UAAU,sBAAsB,IAAI,+CAA+C;AAAA,IAC3F;AAAA,IAEA,SAAS,IAAI,YAAY;AAAA,EAC3B;AAAA,EAEA,OAAO;AAAA;AAGF,SAAS,gBAAgB,CAAC,aAA8B,OAAwB;AAAA,EACrF,iBAAiB,MAAM,QAAQ;AAAA,EAE/B,QAAQ,MAAM,gBAAgB;AAAA,EAE9B,IAAI,OAAO,SAAS;AAAA,IAAU,MAAM,UAAU,iBAAiB,kBAAkB;AAAA,EACjF,aAAa,MAAM,MAAM,OAAO,cAAc;AAAA,EAE9C,OAAO,EAAE,MAAM,UAAU,oBAAoB,aAAa,MAAM,MAAM,SAAS,UAAU,EAAE;AAAA;AAG7F,SAAS,aAAa,CAAC,QAAiB,YAAkD;AAAA,EACxF,gBAAgB,QAAQ,EAAE,MAAM,iBAAiB,SAAS,sCAAsC,eAAe,EAAE,CAAC;AAAA,EAElH,MAAM,iBAA2B,CAAC;AAAA,EAElC,WAAW,SAAS,QAAQ;AAAA,IAC1B,IAAI,WAAW,SAAS,KAAK;AAAA,MAAG,eAAe,KAAK,KAAK;AAAA,EAC3D;AAAA,EAEA,OAAO;AAAA;AAGT,SAAS,qBAAqB,CAAC,MAAY,YAA+B,gBAA8B;AAAA,EACtG,MAAM,kBAA4B,CAAC;AAAA,EAEnC,WAAW,SAAS,OAAO,KAAK,IAAI,GAAG;AAAA,IACrC,IAAI,CAAC,WAAW,SAAS,KAAK;AAAA,MAAG,gBAAgB,KAAK,KAAK;AAAA,EAC7D;AAAA,EAEA,IAAI,gBAAgB,WAAW;AAAA,IAAG;AAAA,EAElC,MAAM,OAAO,OACX,UAAU,0BAA0B,0BAA0B,oBAAoB,gBAAgB,KAAK,IAAI,GAAG,GAC9G,EAAE,QAAQ,gBAAgB,CAC5B;AAAA;AAGK,SAAS,eAAe,CAAC,OAAsB,OAAgC;AAAA,EACpF,iBAAiB,MAAM,QAAQ;AAAA,EAE/B,QAAQ,QAAQ,MAAM,WAAW;AAAA,EAEjC,eAAe,QAAQ,EAAE,MAAM,iBAAiB,SAAS,qBAAqB,CAAC;AAAA,EAC/E,IAAI,WAAW,UAAU,OAAO,OAAO,OAAO,QAAQ;AAAA,IAAG,MAAM,UAAU,iBAAiB,6BAA6B;AAAA,EACvH,IAAI,OAAO,WAAW,YAAY,OAAO,SAAS;AAAA,IAAU,MAAM,UAAU,iBAAiB,8BAA8B;AAAA,EAE3H,QAAQ,MAAM,aAAa,iBAAiB,OAAO,KAAK;AAAA,EAExD,MAAM,mBAAmB,MAAM,QAAQ,IAAI,MAAM;AAAA,EAEjD,IAAI,CAAC;AAAA,IAAkB,MAAM,UAAU,kBAAkB,WAAW,2BAA2B;AAAA,EAE/F,MAAM,YAAY,iBAAiB,MAAM,IAAI,IAAI;AAAA,EACjD,IAAI,CAAC;AAAA,IAAW,MAAM,UAAU,sBAAsB,eAAe,WAAW,yBAAyB;AAAA,EAEzG,MAAM,eAAe,eAAe,MAAM,QAAQ,IAAI;AAAA,EACtD,MAAM,SAAS,cAAc,WAAW,cAAc,MAAM,QAAQ,QAAQ;AAAA,EAE5E,IAAI,OAAO,WAAW,cAAc;AAAA,IAClC,MAAM,UAAU,2BAA2B,IAAI,kEAAkE;AAAA,EACnH;AAAA,EAEA,IAAI,OAAO,WAAW;AAAA,IAAY,MAAM,UAAU,mBAAmB,IAAI,gBAAgB,wBAAwB;AAAA,EAEjH,QAAQ,MAAM,YAAY;AAAA,EAE1B,IAAI,YAAY;AAAA,IAAW,eAAe,SAAS,EAAE,MAAM,iBAAiB,SAAS,4BAA4B,CAAC;AAAA,EAElH,QAAQ,YAAY,kBAAkB;AAAA,EACtC,MAAM,aAAiC,OAAO,OAAO,EAAE,MAAM,QAAQ,MAAM,cAAc,QAAQ,SAAS,MAAM,YAAY,cAAc,CAAC;AAAA,EAC3I,MAAM,UAAU,EAAE,kBAAkB,WAAW,YAAY,MAAM,QAAQ;AAAA,EAEzE,IAAI,WAAW,QAAQ;AAAA,IACrB,IAAI,SAAS;AAAA,MAAW,eAAe,MAAM,EAAE,MAAM,iBAAiB,SAAS,yBAAyB,CAAC;AAAA,IAEzG,QAAQ,WAAW;AAAA,IAEnB,IAAI,WAAW;AAAA,MAAW,OAAO,KAAK,SAAS,QAAQ,WAAW;AAAA,IAClE,IAAI,eAAe,YAAY;AAAA,MAC7B,gBAAgB,QAAQ,EAAE,MAAM,iBAAiB,SAAS,sCAAsC,eAAe,EAAE,CAAC;AAAA,MAClH,OAAO,KAAK,SAAS,QAAQ,OAAO;AAAA,IACtC;AAAA,IAEA,OAAO,KAAK,SAAS,QAAQ,cAAc,QAAQ,UAAU,EAAE;AAAA,EACjE;AAAA,EAEA,eAAe,MAAM,EAAE,MAAM,iBAAiB,SAAS,yBAAyB,CAAC;AAAA,EACjF,IAAI,eAAe;AAAA,IAAY,sBAAsB,MAAM,YAAY,GAAG,gBAAgB,QAAQ;AAAA,EAElG,OAAO,KAAK,SAAS,QAAQ,KAAK;AAAA;;;AC1bpC,SAAS,QAAQ,CAAC,KAAc,OAAgC;AAAA,EAC9D,mBAAmB,GAAG;AAAA,EAEtB,MAAM,QAAQ,iBAAiB;AAAA,EAE/B,oBAAoB,OAAO,KAAK;AAAA,EAEhC,MAAM,QAAQ,IAAI,IAAI,KAAK;AAAA;AAG7B,SAAS,QAAQ,CAAC,KAAiC;AAAA,EACjD,mBAAmB,GAAG;AAAA,EAEtB,OAAO,CAAC,GAAG,iBAAiB,EAAE,KAAK;AAAA;AAG9B,IAAM,UAAU,OAAO,OAAO,EAAE,KAAK,UAAU,KAAK,SAAS,CAAC;;;ACnB9D,IAAM,YAAY,EAAE,SAAS,GAAG,SAAS,GAAG,OAAO,EAAE;AACrD,IAAM,iBAAiB;AACvB,IAAM,mBAAmB;AACzB,IAAM,yBAAyB;;;APEtC,IAAM,aAAa,QAAQ,KAAK;AAEhC,IAAI,eAAe,WAAW;AAAA,EAC5B,QAAQ,MAAM,+BAA+B;AAAA,EAC7C,QAAQ,KAAK,UAAU,KAAK;AAC9B;AAEA,MAAa,qBAAc,QAAQ,UAAU,CAAC,EAAE;AAChD,QAAQ,OAAO,MAAM;AAAA,EAAK,iBAAiB,KAAK,UAAU,EAAE,OAAO,QAAQ,IAAI,OAAO,EAAE,CAAC;AAAA,CAAK;",
|
|
15
|
-
"debugId": "
|
|
14
|
+
"mappings": "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",
|
|
15
|
+
"debugId": "D66DB9FE1DACA1BA64756E2164756E21",
|
|
16
16
|
"names": []
|
|
17
17
|
}
|