Update API reports

Signed-off-by: Harry Hogg <hhogg@spotify.com>
This commit is contained in:
Harry Hogg
2022-10-04 12:50:08 +01:00
parent 5a8a8010ee
commit 26e5513c32
8 changed files with 130 additions and 50 deletions
+31 -13
View File
@@ -19,6 +19,7 @@ import { Permission } from '@backstage/plugin-permission-common';
import { PermissionCondition } from '@backstage/plugin-permission-common';
import { PermissionCriteria } from '@backstage/plugin-permission-common';
import { PermissionEvaluator } from '@backstage/plugin-permission-common';
import { PermissionRuleParams } from '@backstage/plugin-permission-common';
import { PluginEndpointDiscovery } from '@backstage/backend-common';
import { PolicyDecision } from '@backstage/plugin-permission-common';
import { QueryPermissionRequest } from '@backstage/plugin-permission-common';
@@ -54,7 +55,7 @@ export type Condition<TRule> = TRule extends PermissionRule<
infer TResourceType,
infer TParams
>
? (...params: TParams) => PermissionCondition<TResourceType, TParams>
? (params: TParams) => PermissionCondition<TResourceType, TParams>
: never;
// @public
@@ -75,7 +76,7 @@ export const createConditionExports: <
TResource,
TRules extends Record<
string,
PermissionRule<TResource, any, TResourceType, unknown[]>
PermissionRule<TResource, any, TResourceType, PermissionRuleParams>
>,
>(options: {
pluginId: string;
@@ -86,7 +87,7 @@ export const createConditionExports: <
createConditionalDecision: (
permission: ResourcePermission<TResourceType>,
conditions: PermissionCriteria<
PermissionCondition<TResourceType, unknown[]>
PermissionCondition<TResourceType, PermissionRuleParams>
>,
) => ConditionalPolicyDecision;
};
@@ -94,15 +95,15 @@ export const createConditionExports: <
// @public
export const createConditionFactory: <
TResourceType extends string,
TParams extends any[],
TParams extends PermissionRuleParams = PermissionRuleParams,
>(
rule: PermissionRule<unknown, unknown, TResourceType, TParams>,
) => (...params: TParams) => PermissionCondition<TResourceType, TParams>;
) => (params: TParams) => PermissionCondition<TResourceType, TParams>;
// @public
export const createConditionTransformer: <
TQuery,
TRules extends PermissionRule<any, TQuery, string, unknown[]>[],
TRules extends PermissionRule<any, TQuery, string, PermissionRuleParams>[],
>(
permissionRules: [...TRules],
) => ConditionTransformer<TQuery>;
@@ -114,7 +115,12 @@ export const createPermissionIntegrationRouter: <
>(options: {
resourceType: TResourceType;
permissions?: Permission[] | undefined;
rules: PermissionRule<TResource, any, NoInfer<TResourceType>, unknown[]>[];
rules: PermissionRule<
TResource,
any,
NoInfer<TResourceType>,
PermissionRuleParams
>[];
getResources: (resourceRefs: string[]) => Promise<(TResource | undefined)[]>;
}) => express.Router;
@@ -123,7 +129,7 @@ export const createPermissionRule: <
TResource,
TQuery,
TResourceType extends string,
TParams extends unknown[],
TParams extends PermissionRuleParams = PermissionRuleParams,
>(
rule: PermissionRule<TResource, TQuery, TResourceType, TParams>,
) => PermissionRule<TResource, TQuery, TResourceType, TParams>;
@@ -148,7 +154,7 @@ export const makeCreatePermissionRule: <
TResource,
TQuery,
TResourceType extends string,
>() => <TParams extends unknown[]>(
>() => <TParams extends PermissionRuleParams = PermissionRuleParams>(
rule: PermissionRule<TResource, TQuery, TResourceType, TParams>,
) => PermissionRule<TResource, TQuery, TResourceType, TParams>;
@@ -166,16 +172,28 @@ export type PermissionRule<
TResource,
TQuery,
TResourceType extends string,
TParams extends unknown[] = unknown[],
TParams extends PermissionRuleParams = PermissionRuleParams,
> = {
name: string;
description: string;
resourceType: TResourceType;
schema: z.ZodSchema<TParams>;
apply(resource: TResource, ...params: TParams): boolean;
toQuery(...params: TParams): PermissionCriteria<TQuery>;
schema: PermissionRuleSchema<TParams>;
apply(
resource: TResource,
params: NoInfer<z.input<PermissionRuleSchema<TParams>>>,
): boolean;
toQuery(
params: NoInfer<z.input<PermissionRuleSchema<TParams>>>,
): PermissionCriteria<TQuery>;
};
// @public
export type PermissionRuleSchema<TParams> = z.ZodObject<{
[P in keyof TParams]-?: TParams[P] extends undefined
? z.ZodOptionalType<z.ZodType<TParams[P]>>
: z.ZodType<TParams[P]>;
}>;
// @public
export type PolicyQuery = {
permission: Permission;
@@ -28,8 +28,9 @@ import {
PermissionCondition,
PermissionCriteria,
} from '@backstage/plugin-permission-common';
import { NoInfer, PermissionRule } from '../types';
import { PermissionRule } from '../types';
import {
NoInfer,
createGetRule,
isAndCriteria,
isNotCriteria,
@@ -22,6 +22,14 @@ import {
} from '@backstage/plugin-permission-common';
import { PermissionRule } from '../types';
/**
* Prevent use of type parameter from contributing to type inference.
*
* https://github.com/Microsoft/TypeScript/issues/14829#issuecomment-980401795
* @ignore
*/
export type NoInfer<T> = T extends infer S ? S : never;
/**
* Utility function used to parse a PermissionCriteria
* @param criteria - a PermissionCriteria
+21 -16
View File
@@ -19,14 +19,23 @@ import type {
PermissionRuleParams,
} from '@backstage/plugin-permission-common';
import { z } from 'zod';
import { NoInfer } from './integration/util';
/**
* Prevent use of type parameter from contributing to type inference.
* A ZodSchema that reflects the structure of the parameters that are passed to
* into a {@link PermissionRule}.
*
* https://github.com/Microsoft/TypeScript/issues/14829#issuecomment-980401795
* @ignore
* @public
*/
export type NoInfer<T> = T extends infer S ? S : never;
export type PermissionRuleSchema<TParams> = z.ZodObject<{
// Parameters can be optional, however we we want to make sure that the
// parameters are always present in the schema, even if they are undefined.
// We remove the optional flag from the schema, and then add it back in
// with an optional zod type.
[P in keyof TParams]-?: TParams[P] extends undefined
? z.ZodOptionalType<z.ZodType<TParams[P]>>
: z.ZodType<TParams[P]>;
}>;
/**
* A conditional rule that can be provided in an
@@ -49,15 +58,6 @@ export type PermissionRule<
TQuery,
TResourceType extends string,
TParams extends PermissionRuleParams = PermissionRuleParams,
TSchema extends z.ZodType = z.ZodObject<{
// Parameters can be optional, however we we want to make sure that the
// parameters are always present in the schema, even if they are undefined.
// We remove the optional flag from the schema, and then add it back in
// with an optional zod type.
[P in keyof TParams]-?: TParams[P] extends undefined
? z.ZodOptionalType<z.ZodType<TParams[P]>>
: z.ZodType<TParams[P]>;
}>,
> = {
name: string;
description: string;
@@ -66,19 +66,24 @@ export type PermissionRule<
/**
* A ZodSchema that documents the parameters that this rule accepts.
*/
schema: TSchema;
schema: PermissionRuleSchema<TParams>;
/**
* Apply this rule to a resource already loaded from a backing data source. The params are
* arguments supplied for the rule; for example, a rule could be `isOwner` with entityRefs as the
* params.
*/
apply(resource: TResource, params: NoInfer<z.input<TSchema>>): boolean;
apply(
resource: TResource,
params: NoInfer<z.input<PermissionRuleSchema<TParams>>>,
): boolean;
/**
* Translate this rule to criteria suitable for use in querying a backing data store. The criteria
* can be used for loading a collection of resources efficiently with conditional criteria already
* applied.
*/
toQuery(params: NoInfer<z.input<TSchema>>): PermissionCriteria<TQuery>;
toQuery(
params: NoInfer<z.input<PermissionRuleSchema<TParams>>>,
): PermissionCriteria<TQuery>;
};