UNPKG

@atproto/oauth-scopes

Version:

A library for manipulating and validating ATproto OAuth scopes in TypeScript.

55 lines (45 loc) 1.6 kB
import { Parser } from '../lib/parser.js' import { ResourcePermission } from '../lib/resource-permission.js' import { ScopeStringSyntax } from '../lib/syntax-string.js' import { ScopeSyntax, isScopeStringFor } from '../lib/syntax.js' import { knownValuesValidator } from '../lib/util.js' export const IDENTITY_ATTRIBUTES = Object.freeze(['handle', '*'] as const) export type IdentityAttribute = (typeof IDENTITY_ATTRIBUTES)[number] export type IdentityPermissionMatch = { attr: IdentityAttribute } export class IdentityPermission implements ResourcePermission<'identity', IdentityPermissionMatch> { constructor(public readonly attr: IdentityAttribute) {} matches(options: IdentityPermissionMatch) { return this.attr === '*' || this.attr === options.attr } toString() { return IdentityPermission.parser.format(this) } protected static readonly parser = new Parser( 'identity', { attr: { multiple: false, required: true, validate: knownValuesValidator(IDENTITY_ATTRIBUTES), }, }, 'attr', ) static fromString(scope: string) { if (!isScopeStringFor(scope, 'identity')) return null const syntax = ScopeStringSyntax.fromString(scope) return IdentityPermission.fromSyntax(syntax) } static fromSyntax(syntax: ScopeSyntax<'identity'>) { const result = IdentityPermission.parser.parse(syntax) if (!result) return null return new IdentityPermission(result.attr) } static scopeNeededFor(options: IdentityPermissionMatch): string { return IdentityPermission.parser.format(options) } }