UNPKG

graplix

Version:

Authorization framework for implementing Relation-based Access Control (ReBAC) with the Resolver (Inspired by [GraphQL](https://graphql.org))

104 lines (103 loc) 4.75 kB
import { transformer } from "@openfga/syntax-transformer"; import { Metadata, RelationMetadata, RelationReference, TypeDefinition, Userset } from "@openfga/sdk"; //#region src/BaseEntityTypeMap.d.ts type BaseEntityTypeMap = { [typeName: string]: { $type: string; [identifier: string]: any; }; }; //#endregion //#region src/utils/Arrayable.d.ts type Arrayable<T> = T | T[]; //#endregion //#region src/utils/Nullable.d.ts type Nullable<T> = T | null | undefined; //#endregion //#region src/utils/ValueOf.d.ts type ValueOf<T extends {}> = T[Extract<keyof T, string>]; //#endregion //#region src/GraplixResolvers.d.ts type GraplixResolverDefinition<Context extends {}, EntityTypeMap extends BaseEntityTypeMap, SelectedNodeTypeName extends Extract<keyof EntityTypeMap, string>, TargetNodeTypeName extends Extract<keyof EntityTypeMap, string>> = TargetNodeTypeName extends Extract<keyof EntityTypeMap, string> ? { type: TargetNodeTypeName; resolve: (entity: EntityTypeMap[SelectedNodeTypeName], context: Context) => Promise<Nullable<EntityTypeMap[TargetNodeTypeName]>> | Promise<Array<EntityTypeMap[TargetNodeTypeName]>>; } : never; type GraplixResolvers<Context extends {}, EntityTypeMap extends BaseEntityTypeMap> = { [SelectedNodeTypeName in Extract<keyof EntityTypeMap, string>]: { identify: (entity: EntityTypeMap[SelectedNodeTypeName]) => string; relations?: { [relationName: string]: Arrayable<GraplixResolverDefinition<Context, EntityTypeMap, SelectedNodeTypeName, Extract<keyof EntityTypeMap, string>>>; }; } }; //#endregion //#region src/GraplixSchema.d.ts type GraplixDirectlyRelatedUserTypes<EntityTypeMap extends BaseEntityTypeMap> = { type: Extract<keyof EntityTypeMap, string>; }; type GraplixComputedSetRelationDefinition = { when: string; from?: never; }; type GraplixTupleToUsersetRelationDefinition = { when: string; from: string; }; type GraplixUnionRelationDefinition = GraplixComputedSetRelationDefinition | GraplixTupleToUsersetRelationDefinition; type GraplixSchemaRelationDefinition<EntityTypeMap extends BaseEntityTypeMap> = Arrayable<GraplixDirectlyRelatedUserTypes<EntityTypeMap> | GraplixUnionRelationDefinition>; type GraplixSchema<EntityTypeMap extends BaseEntityTypeMap> = { [SelectedNodeTypeName in Extract<keyof EntityTypeMap, string>]: { [relationName: string]: GraplixSchemaRelationDefinition<EntityTypeMap>; } }; //#endregion //#region src/GraplixInput.d.ts type GraplixInput<Context extends {}, EntityTypeMap extends BaseEntityTypeMap> = { schema: GraplixSchema<EntityTypeMap>; resolvers: GraplixResolvers<Context, EntityTypeMap>; }; //#endregion //#region src/graplix.d.ts type Graplix<Context extends {}, EntityTypeMap extends BaseEntityTypeMap> = { check: (args: { user: ValueOf<EntityTypeMap>; object: ValueOf<EntityTypeMap>; relation: string; context: Context; }) => Promise<boolean>; }; declare function graplix<Context extends {}, EntityTypeMap extends BaseEntityTypeMap>(input: GraplixInput<Context, EntityTypeMap>): Graplix<Context, EntityTypeMap>; //#endregion //#region src/GraplixIdentifier.d.ts type GraplixIdentifier<EntityTypeMap extends BaseEntityTypeMap> = (entity: ValueOf<EntityTypeMap>) => { type: Extract<keyof EntityTypeMap, string>; id: string; }; //#endregion //#region src/language/fga.d.ts declare function fga([data]: TemplateStringsArray): GraplixSchema<BaseEntityTypeMap>; //#endregion //#region src/language/parse/parse.d.ts declare function parse<T extends BaseEntityTypeMap>(input: string): GraplixSchema<T>; //#endregion //#region src/language/ValidatedModel.d.ts type ValidatedModel = { schema_version: string; type_definitions: Array<ValidatedTypeDefinition>; }; type ValidatedTypeDefinition = Omit<TypeDefinition, "relations" | "metadata"> & { relations?: { [key: string]: ValidatedUserset; }; metadata?: ValidatedMetadata; }; type ValidatedUserset = Omit<Userset, "intersection" | "difference">; type ValidatedMetadata = Omit<Metadata, "relations"> & { relations?: { [key: string]: ValidatedRelationMetadata; }; }; type ValidatedRelationMetadata = Omit<RelationMetadata, "directly_related_user_types"> & { directly_related_user_types?: [Omit<RelationReference, "wildcard">]; }; //#endregion //#region src/language/validate.d.ts declare function validate(model: ReturnType<typeof transformer.transformDSLToJSONObject>): asserts model is ValidatedModel; //#endregion export { Graplix, GraplixComputedSetRelationDefinition, GraplixDirectlyRelatedUserTypes, GraplixIdentifier, GraplixInput, GraplixResolverDefinition, GraplixResolvers, GraplixSchema, GraplixSchemaRelationDefinition, GraplixTupleToUsersetRelationDefinition, GraplixUnionRelationDefinition, fga, graplix, parse, validate };