@owlmeans/iam 0.1.18-rc.8 → 0.1.18
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 +185 -15
- package/agent-meta/manifest.json +92 -4
- package/agent-meta/skills/iam/SKILL.md +91 -177
- package/agent-meta/skills/iam/parts/clients.md +93 -0
- package/agent-meta/skills/iam/parts/permissions.md +106 -0
- package/agent-meta/skills/iam/parts/service.md +115 -0
- package/agent-meta/skills/iam/parts/tenancy.md +72 -0
- package/build/consts.d.ts +170 -1
- package/build/consts.d.ts.map +1 -1
- package/build/consts.js +221 -0
- package/build/consts.js.map +1 -1
- package/build/consts.local.d.ts +58 -0
- package/build/consts.local.d.ts.map +1 -0
- package/build/consts.local.js +21 -0
- package/build/consts.local.js.map +1 -0
- package/build/errors.d.ts +26 -0
- package/build/errors.d.ts.map +1 -1
- package/build/errors.js +38 -0
- package/build/errors.js.map +1 -1
- package/build/facet.d.ts +10 -0
- package/build/facet.d.ts.map +1 -0
- package/build/facet.js +16 -0
- package/build/facet.js.map +1 -0
- package/build/gate/consts.local.d.ts +2 -0
- package/build/gate/consts.local.d.ts.map +1 -0
- package/build/gate/consts.local.js +3 -0
- package/build/gate/consts.local.js.map +1 -0
- package/build/gate/index.d.ts +4 -0
- package/build/gate/index.d.ts.map +1 -0
- package/build/gate/index.js +4 -0
- package/build/gate/index.js.map +1 -0
- package/build/gate/param.d.ts +6 -0
- package/build/gate/param.d.ts.map +1 -0
- package/build/gate/param.js +83 -0
- package/build/gate/param.js.map +1 -0
- package/build/gate/resolve.d.ts +10 -0
- package/build/gate/resolve.d.ts.map +1 -0
- package/build/gate/resolve.js +93 -0
- package/build/gate/resolve.js.map +1 -0
- package/build/gate/types.d.ts +109 -0
- package/build/gate/types.d.ts.map +1 -0
- package/build/gate/types.js +2 -0
- package/build/gate/types.js.map +1 -0
- package/build/gate/types.local.d.ts +5 -0
- package/build/gate/types.local.d.ts.map +1 -0
- package/build/gate/types.local.js +2 -0
- package/build/gate/types.local.js.map +1 -0
- package/build/gate/validate.d.ts +4 -0
- package/build/gate/validate.d.ts.map +1 -0
- package/build/gate/validate.js +100 -0
- package/build/gate/validate.js.map +1 -0
- package/build/index.d.ts +9 -0
- package/build/index.d.ts.map +1 -1
- package/build/index.js +5 -0
- package/build/index.js.map +1 -1
- package/build/permission/types.d.ts +35 -0
- package/build/permission/types.d.ts.map +1 -0
- package/build/permission/types.js +2 -0
- package/build/permission/types.js.map +1 -0
- package/build/permission.d.ts +8 -0
- package/build/permission.d.ts.map +1 -0
- package/build/permission.js +34 -0
- package/build/permission.js.map +1 -0
- package/build/runtime/types.d.ts +90 -0
- package/build/runtime/types.d.ts.map +1 -0
- package/build/runtime/types.js +2 -0
- package/build/runtime/types.js.map +1 -0
- package/build/runtime.d.ts +75 -0
- package/build/runtime.d.ts.map +1 -0
- package/build/runtime.js +75 -0
- package/build/runtime.js.map +1 -0
- package/build/schemas.d.ts +13 -0
- package/build/schemas.d.ts.map +1 -0
- package/build/schemas.js +108 -0
- package/build/schemas.js.map +1 -0
- package/build/types.d.ts +429 -30
- package/build/types.d.ts.map +1 -1
- package/build/utils/types.d.ts +12 -0
- package/build/utils/types.d.ts.map +1 -0
- package/build/utils/types.js +2 -0
- package/build/utils/types.js.map +1 -0
- package/build/utils.d.ts +7 -6
- package/build/utils.d.ts.map +1 -1
- package/build/utils.js +10 -1
- package/build/utils.js.map +1 -1
- package/package.json +12 -7
- package/src/consts.local.ts +26 -0
- package/src/consts.ts +241 -1
- package/src/errors.ts +44 -0
- package/src/facet.ts +17 -0
- package/src/gate/consts.local.ts +3 -0
- package/src/gate/index.ts +3 -0
- package/src/gate/param.ts +108 -0
- package/src/gate/resolve.ts +114 -0
- package/src/gate/types.local.ts +4 -0
- package/src/gate/types.ts +117 -0
- package/src/gate/validate.ts +123 -0
- package/src/index.ts +9 -0
- package/src/permission/types.ts +33 -0
- package/src/permission.ts +48 -0
- package/src/runtime/types.ts +107 -0
- package/src/runtime.ts +142 -0
- package/src/schemas.ts +122 -0
- package/src/types.ts +492 -31
- package/src/utils/types.ts +11 -0
- package/src/utils.ts +12 -7
- package/tests/gate-param.spec.ts +233 -0
- package/tests/runtime.spec.ts +101 -0
- package/tests/tsconfig.json +12 -0
- package/tests/utils.spec.ts +47 -1
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { type EntrypointProtocol, type OpenRequest, type OpenValue } from '@owlmeans/entrypoint';
|
|
2
|
+
import type { IamRuntimeAck, IamRuntimeGrant, IamRuntimeGrantList, IamRuntimeGrantQuery, IamRuntimeGrantRequest, IamRuntimeMember, IamRuntimeMemberInvite, IamRuntimeMemberList, IamRuntimeMemberParams, IamRuntimeMemberUpdate, IamRuntimeOrganization, IamRuntimeOrganizationCreate, IamRuntimeOrganizationList, IamRuntimeOrganizationParams, IamRuntimeOrganizationUpdate, IamRuntimePermissionList, IamRuntimeProtocolOptions } from './runtime/types.js';
|
|
3
|
+
export type IamRuntimeProtocols = ReturnType<typeof declareRuntime>;
|
|
4
|
+
declare const declareRuntime: (opts: IamRuntimeProtocolOptions) => Readonly<{
|
|
5
|
+
base: EntrypointProtocol<OpenRequest, OpenValue>;
|
|
6
|
+
organizations: Readonly<{
|
|
7
|
+
/** Any subject: its own organizations. */
|
|
8
|
+
list: EntrypointProtocol<{}, IamRuntimeOrganizationList>;
|
|
9
|
+
/** Any subject of a tenanted client; the caller becomes its owner. */
|
|
10
|
+
create: EntrypointProtocol<{
|
|
11
|
+
body: IamRuntimeOrganizationCreate;
|
|
12
|
+
}, IamRuntimeOrganization>;
|
|
13
|
+
/** Owner. */
|
|
14
|
+
update: EntrypointProtocol<import("@owlmeans/entrypoint").RequestFromSources<{
|
|
15
|
+
params: import("@owlmeans/entrypoint").Typed<IamRuntimeOrganizationParams>;
|
|
16
|
+
body: import("@owlmeans/entrypoint").Typed<IamRuntimeOrganizationUpdate>;
|
|
17
|
+
}>, IamRuntimeOrganization>;
|
|
18
|
+
}>;
|
|
19
|
+
members: Readonly<{
|
|
20
|
+
/** Member. */
|
|
21
|
+
list: EntrypointProtocol<{
|
|
22
|
+
params: IamRuntimeOrganizationParams;
|
|
23
|
+
}, IamRuntimeMemberList>;
|
|
24
|
+
/** Owner. Find-or-create by e-mail, idempotent. */
|
|
25
|
+
add: EntrypointProtocol<import("@owlmeans/entrypoint").RequestFromSources<{
|
|
26
|
+
params: import("@owlmeans/entrypoint").Typed<IamRuntimeOrganizationParams>;
|
|
27
|
+
body: import("@owlmeans/entrypoint").Typed<IamRuntimeMemberInvite>;
|
|
28
|
+
}>, IamRuntimeMember>;
|
|
29
|
+
/** Owner. */
|
|
30
|
+
update: EntrypointProtocol<import("@owlmeans/entrypoint").RequestFromSources<{
|
|
31
|
+
params: import("@owlmeans/entrypoint").Typed<IamRuntimeMemberParams>;
|
|
32
|
+
body: import("@owlmeans/entrypoint").Typed<IamRuntimeMemberUpdate>;
|
|
33
|
+
}>, IamRuntimeMember>;
|
|
34
|
+
/** Owner, or the member itself. */
|
|
35
|
+
remove: EntrypointProtocol<{
|
|
36
|
+
params: IamRuntimeMemberParams;
|
|
37
|
+
}, IamRuntimeAck>;
|
|
38
|
+
}>;
|
|
39
|
+
permissions: Readonly<{
|
|
40
|
+
/** Member. */
|
|
41
|
+
list: EntrypointProtocol<{
|
|
42
|
+
params: IamRuntimeOrganizationParams;
|
|
43
|
+
}, IamRuntimePermissionList>;
|
|
44
|
+
}>;
|
|
45
|
+
grants: Readonly<{
|
|
46
|
+
/** Owner. */
|
|
47
|
+
list: EntrypointProtocol<import("@owlmeans/entrypoint").RequestFromSources<{
|
|
48
|
+
params: import("@owlmeans/entrypoint").Typed<IamRuntimeOrganizationParams>;
|
|
49
|
+
query: import("@owlmeans/entrypoint").Typed<IamRuntimeGrantQuery>;
|
|
50
|
+
}>, IamRuntimeGrantList>;
|
|
51
|
+
/** Owner. */
|
|
52
|
+
assign: EntrypointProtocol<import("@owlmeans/entrypoint").RequestFromSources<{
|
|
53
|
+
params: import("@owlmeans/entrypoint").Typed<IamRuntimeOrganizationParams>;
|
|
54
|
+
body: import("@owlmeans/entrypoint").Typed<IamRuntimeGrantRequest>;
|
|
55
|
+
}>, IamRuntimeGrant>;
|
|
56
|
+
/** Owner. */
|
|
57
|
+
revoke: EntrypointProtocol<import("@owlmeans/entrypoint").RequestFromSources<{
|
|
58
|
+
params: import("@owlmeans/entrypoint").Typed<IamRuntimeOrganizationParams>;
|
|
59
|
+
body: import("@owlmeans/entrypoint").Typed<IamRuntimeGrantRequest>;
|
|
60
|
+
}>, IamRuntimeAck>;
|
|
61
|
+
}>;
|
|
62
|
+
}>;
|
|
63
|
+
/**
|
|
64
|
+
* Declare the runtime IAM API — the provider-side surface a tenanted client's server calls on behalf
|
|
65
|
+
* of its signed-in subject: the subject's organizations, their members, the grantable definitions
|
|
66
|
+
* and the grants inside one organization.
|
|
67
|
+
*
|
|
68
|
+
* Every leaf hangs under ONE base carrying `IAM_RUNTIME_GUARD`, so none can be reached without the
|
|
69
|
+
* provider's own access token; the caller's client and account come from that token, the
|
|
70
|
+
* organization from the path. Owner/member checks, the tenancy-config gate and the write rules are
|
|
71
|
+
* the serving process's — a declaration decides nothing.
|
|
72
|
+
*/
|
|
73
|
+
export declare const makeIamRuntimeProtocols: (opts: IamRuntimeProtocolOptions) => IamRuntimeProtocols;
|
|
74
|
+
export {};
|
|
75
|
+
//# sourceMappingURL=runtime.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"AAAA,OAAO,EAA2C,KAAK,kBAAkB,EAAE,KAAK,WAAW,EAAE,KAAK,SAAS,EAAE,MAAM,sBAAsB,CAAA;AAIzI,OAAO,KAAK,EAAE,aAAa,EAAE,eAAe,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,sBAAsB,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,oBAAoB,EAAE,sBAAsB,EAAE,sBAAsB,EAAE,sBAAsB,EAAE,4BAA4B,EAAE,0BAA0B,EAAE,4BAA4B,EAAE,4BAA4B,EAAE,wBAAwB,EAAE,yBAAyB,EAAE,MAAM,oBAAoB,CAAA;AAY9b,MAAM,MAAM,mBAAmB,GAAG,UAAU,CAAC,OAAO,cAAc,CAAC,CAAA;AAEnE,QAAA,MAAM,cAAc,SAAU,yBAAyB;;;QAejD,0CAA0C;;QAK1C,sEAAsE;;;;QAQtE,aAAa;;;;;;;QAWb,cAAc;;;;QAQd,mDAAmD;;;;;QAQnD,aAAa;;;;;QAQb,mCAAmC;;;;;;QAWnC,cAAc;;;;;;QAWd,aAAa;;;;;QAQb,aAAa;;;;;QAQb,aAAa;;;;;;EAUlB,CAAA;AAED;;;;;;;;;GASG;AACH,eAAO,MAAM,uBAAuB,SAAU,yBAAyB,KAAG,mBAA2C,CAAA"}
|
package/build/runtime.js
ADDED
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { contract, openProtocol, protocol, typed } from '@owlmeans/entrypoint';
|
|
2
|
+
import { backend, route, RouteMethod } from '@owlmeans/route';
|
|
3
|
+
import { IAM_RUNTIME_GUARD, IAM_RUNTIME_PATH, IAM_RUNTIME_ROUTES, IamRuntimeAckSchema, IamRuntimeGrantQuerySchema, IamRuntimeMemberInviteSchema, IamRuntimeMemberParamsSchema, IamRuntimeOrganizationCreateSchema, IamRuntimeOrganizationParamsSchema, IamRuntimeOrganizationUpdateSchema } from './consts.js';
|
|
4
|
+
import { aliases } from './consts.local.js';
|
|
5
|
+
import { IamRuntimeOrganizationSchema, IamRuntimeOrganizationListSchema, IamRuntimeMemberSchema, IamRuntimeMemberListSchema, IamRuntimeMemberUpdateSchema, IamRuntimePermissionListSchema, IamRuntimeGrantSchema, IamRuntimeGrantListSchema, IamRuntimeGrantRequestSchema } from './schemas.js';
|
|
6
|
+
const declareRuntime = (opts) => {
|
|
7
|
+
const { service } = opts;
|
|
8
|
+
const base = openProtocol(route(aliases.base, opts.path ?? IAM_RUNTIME_PATH, backend({ service })), { guards: IAM_RUNTIME_GUARD });
|
|
9
|
+
// A route's service is never inherited from its parent, so each leaf names it too: a leaf left
|
|
10
|
+
// unpinned would be mounted by every process that happens to bind the tree.
|
|
11
|
+
const leaf = (alias, path, method) => route(alias, path, backend({ parent: base, service }, method));
|
|
12
|
+
return Object.freeze({
|
|
13
|
+
base,
|
|
14
|
+
organizations: Object.freeze({
|
|
15
|
+
/** Any subject: its own organizations. */
|
|
16
|
+
list: protocol(leaf(aliases.organization.list, IAM_RUNTIME_ROUTES.organizations, RouteMethod.GET), contract(typed(IamRuntimeOrganizationListSchema))),
|
|
17
|
+
/** Any subject of a tenanted client; the caller becomes its owner. */
|
|
18
|
+
create: protocol(leaf(aliases.organization.create, IAM_RUNTIME_ROUTES.organizations, RouteMethod.POST), contract.request({ body: typed(IamRuntimeOrganizationCreateSchema) }, typed(IamRuntimeOrganizationSchema))),
|
|
19
|
+
/** Owner. */
|
|
20
|
+
update: protocol(leaf(aliases.organization.update, IAM_RUNTIME_ROUTES.organization, RouteMethod.POST), contract.request({
|
|
21
|
+
params: typed(IamRuntimeOrganizationParamsSchema),
|
|
22
|
+
body: typed(IamRuntimeOrganizationUpdateSchema),
|
|
23
|
+
}, typed(IamRuntimeOrganizationSchema))),
|
|
24
|
+
}),
|
|
25
|
+
members: Object.freeze({
|
|
26
|
+
/** Member. */
|
|
27
|
+
list: protocol(leaf(aliases.member.list, IAM_RUNTIME_ROUTES.members, RouteMethod.GET), contract.request({ params: typed(IamRuntimeOrganizationParamsSchema) }, typed(IamRuntimeMemberListSchema))),
|
|
28
|
+
/** Owner. Find-or-create by e-mail, idempotent. */
|
|
29
|
+
add: protocol(leaf(aliases.member.add, IAM_RUNTIME_ROUTES.members, RouteMethod.POST), contract.request({
|
|
30
|
+
params: typed(IamRuntimeOrganizationParamsSchema),
|
|
31
|
+
body: typed(IamRuntimeMemberInviteSchema),
|
|
32
|
+
}, typed(IamRuntimeMemberSchema))),
|
|
33
|
+
/** Owner. */
|
|
34
|
+
update: protocol(leaf(aliases.member.update, IAM_RUNTIME_ROUTES.member, RouteMethod.POST), contract.request({
|
|
35
|
+
params: typed(IamRuntimeMemberParamsSchema),
|
|
36
|
+
body: typed(IamRuntimeMemberUpdateSchema),
|
|
37
|
+
}, typed(IamRuntimeMemberSchema))),
|
|
38
|
+
/** Owner, or the member itself. */
|
|
39
|
+
remove: protocol(leaf(aliases.member.remove, IAM_RUNTIME_ROUTES.memberRemove, RouteMethod.POST), contract.request({ params: typed(IamRuntimeMemberParamsSchema) }, typed(IamRuntimeAckSchema))),
|
|
40
|
+
}),
|
|
41
|
+
permissions: Object.freeze({
|
|
42
|
+
/** Member. */
|
|
43
|
+
list: protocol(leaf(aliases.permission.list, IAM_RUNTIME_ROUTES.permissions, RouteMethod.GET), contract.request({ params: typed(IamRuntimeOrganizationParamsSchema) }, typed(IamRuntimePermissionListSchema))),
|
|
44
|
+
}),
|
|
45
|
+
grants: Object.freeze({
|
|
46
|
+
/** Owner. */
|
|
47
|
+
list: protocol(leaf(aliases.grant.list, IAM_RUNTIME_ROUTES.grants, RouteMethod.GET), contract.request({
|
|
48
|
+
params: typed(IamRuntimeOrganizationParamsSchema),
|
|
49
|
+
query: typed(IamRuntimeGrantQuerySchema),
|
|
50
|
+
}, typed(IamRuntimeGrantListSchema))),
|
|
51
|
+
/** Owner. */
|
|
52
|
+
assign: protocol(leaf(aliases.grant.assign, IAM_RUNTIME_ROUTES.grants, RouteMethod.POST), contract.request({
|
|
53
|
+
params: typed(IamRuntimeOrganizationParamsSchema),
|
|
54
|
+
body: typed(IamRuntimeGrantRequestSchema),
|
|
55
|
+
}, typed(IamRuntimeGrantSchema))),
|
|
56
|
+
/** Owner. */
|
|
57
|
+
revoke: protocol(leaf(aliases.grant.revoke, IAM_RUNTIME_ROUTES.grantsRevoke, RouteMethod.POST), contract.request({
|
|
58
|
+
params: typed(IamRuntimeOrganizationParamsSchema),
|
|
59
|
+
body: typed(IamRuntimeGrantRequestSchema),
|
|
60
|
+
}, typed(IamRuntimeAckSchema))),
|
|
61
|
+
}),
|
|
62
|
+
});
|
|
63
|
+
};
|
|
64
|
+
/**
|
|
65
|
+
* Declare the runtime IAM API — the provider-side surface a tenanted client's server calls on behalf
|
|
66
|
+
* of its signed-in subject: the subject's organizations, their members, the grantable definitions
|
|
67
|
+
* and the grants inside one organization.
|
|
68
|
+
*
|
|
69
|
+
* Every leaf hangs under ONE base carrying `IAM_RUNTIME_GUARD`, so none can be reached without the
|
|
70
|
+
* provider's own access token; the caller's client and account come from that token, the
|
|
71
|
+
* organization from the path. Owner/member checks, the tenancy-config gate and the write rules are
|
|
72
|
+
* the serving process's — a declaration decides nothing.
|
|
73
|
+
*/
|
|
74
|
+
export const makeIamRuntimeProtocols = (opts) => declareRuntime(opts);
|
|
75
|
+
//# sourceMappingURL=runtime.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime.js","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { JSONSchemaType } from 'ajv';
|
|
2
|
+
import type { IamRuntimeGrant, IamRuntimeGrantList, IamRuntimeGrantRequest, IamRuntimeMember, IamRuntimeMemberList, IamRuntimeMemberUpdate, IamRuntimeOrganization, IamRuntimeOrganizationList, IamRuntimePermission, IamRuntimePermissionList } from './runtime/types.js';
|
|
3
|
+
export declare const IamRuntimeOrganizationSchema: JSONSchemaType<IamRuntimeOrganization>;
|
|
4
|
+
export declare const IamRuntimeOrganizationListSchema: JSONSchemaType<IamRuntimeOrganizationList>;
|
|
5
|
+
export declare const IamRuntimeMemberSchema: JSONSchemaType<IamRuntimeMember>;
|
|
6
|
+
export declare const IamRuntimeMemberListSchema: JSONSchemaType<IamRuntimeMemberList>;
|
|
7
|
+
export declare const IamRuntimeMemberUpdateSchema: JSONSchemaType<IamRuntimeMemberUpdate>;
|
|
8
|
+
export declare const IamRuntimePermissionSchema: JSONSchemaType<IamRuntimePermission>;
|
|
9
|
+
export declare const IamRuntimePermissionListSchema: JSONSchemaType<IamRuntimePermissionList>;
|
|
10
|
+
export declare const IamRuntimeGrantSchema: JSONSchemaType<IamRuntimeGrant>;
|
|
11
|
+
export declare const IamRuntimeGrantListSchema: JSONSchemaType<IamRuntimeGrantList>;
|
|
12
|
+
export declare const IamRuntimeGrantRequestSchema: JSONSchemaType<IamRuntimeGrantRequest>;
|
|
13
|
+
//# sourceMappingURL=schemas.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schemas.d.ts","sourceRoot":"","sources":["../src/schemas.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,KAAK,CAAA;AAGzC,OAAO,KAAK,EAAE,eAAe,EAAE,mBAAmB,EAAE,sBAAsB,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,sBAAsB,EAAE,sBAAsB,EAAE,0BAA0B,EAAE,oBAAoB,EAAE,wBAAwB,EAAE,MAAM,oBAAoB,CAAA;AAc1Q,eAAO,MAAM,4BAA4B,EAAE,cAAc,CAAC,sBAAsB,CAW/E,CAAA;AAED,eAAO,MAAM,gCAAgC,EAAE,cAAc,CAAC,0BAA0B,CAKvF,CAAA;AAED,eAAO,MAAM,sBAAsB,EAAE,cAAc,CAAC,gBAAgB,CAYnE,CAAA;AAED,eAAO,MAAM,0BAA0B,EAAE,cAAc,CAAC,oBAAoB,CAK3E,CAAA;AAED,eAAO,MAAM,4BAA4B,EAAE,cAAc,CAAC,sBAAsB,CAQ/E,CAAA;AAED,eAAO,MAAM,0BAA0B,EAAE,cAAc,CAAC,oBAAoB,CAY3E,CAAA;AAED,eAAO,MAAM,8BAA8B,EAAE,cAAc,CAAC,wBAAwB,CAKnF,CAAA;AAED,eAAO,MAAM,qBAAqB,EAAE,cAAc,CAAC,eAAe,CAYjE,CAAA;AAED,eAAO,MAAM,yBAAyB,EAAE,cAAc,CAAC,mBAAmB,CAKzE,CAAA;AAED,eAAO,MAAM,4BAA4B,EAAE,cAAc,CAAC,sBAAsB,CAU/E,CAAA"}
|
package/build/schemas.js
ADDED
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import { EntitySlugValueSchema, GroupValueSchema } from '@owlmeans/auth';
|
|
2
|
+
import { IamDefaultClass, IamGrantMode, IamGrantOrigin } from './consts.js';
|
|
3
|
+
import { EmailSchema, PermissionNameSchema, ProfileIdSchema, ResourcesSchema, TitleSchema } from './consts.local.js';
|
|
4
|
+
// ---------------------------------------------------------------------------------------------
|
|
5
|
+
// Wire shapes. Organizations travel by `entitySlug` only; a subject is the CALLING client's
|
|
6
|
+
// pairwise `profileId`. Neither an organization id nor an account id ever appears here.
|
|
7
|
+
// ---------------------------------------------------------------------------------------------
|
|
8
|
+
// ---------------------------------------------------------------------------------------------
|
|
9
|
+
// Schemas — closed throughout: the server's AJV strips an undeclared key silently, so a field a
|
|
10
|
+
// caller sends and the schema omits would vanish without an error.
|
|
11
|
+
// ---------------------------------------------------------------------------------------------
|
|
12
|
+
const GroupsSchema = { type: 'array', items: { ...GroupValueSchema }, maxItems: 64 };
|
|
13
|
+
export const IamRuntimeOrganizationSchema = {
|
|
14
|
+
type: 'object',
|
|
15
|
+
properties: {
|
|
16
|
+
entitySlug: { ...EntitySlugValueSchema },
|
|
17
|
+
title: { ...TitleSchema, nullable: true },
|
|
18
|
+
owner: { type: 'boolean' },
|
|
19
|
+
groups: { ...GroupsSchema, nullable: true },
|
|
20
|
+
home: { type: 'boolean', nullable: true },
|
|
21
|
+
},
|
|
22
|
+
required: ['entitySlug', 'owner'],
|
|
23
|
+
additionalProperties: false,
|
|
24
|
+
};
|
|
25
|
+
export const IamRuntimeOrganizationListSchema = {
|
|
26
|
+
type: 'object',
|
|
27
|
+
properties: { items: { type: 'array', items: IamRuntimeOrganizationSchema } },
|
|
28
|
+
required: ['items'],
|
|
29
|
+
additionalProperties: false,
|
|
30
|
+
};
|
|
31
|
+
export const IamRuntimeMemberSchema = {
|
|
32
|
+
type: 'object',
|
|
33
|
+
properties: {
|
|
34
|
+
profileId: { ...ProfileIdSchema },
|
|
35
|
+
email: { ...EmailSchema, nullable: true },
|
|
36
|
+
name: { ...TitleSchema, nullable: true },
|
|
37
|
+
owner: { type: 'boolean' },
|
|
38
|
+
groups: { ...GroupsSchema },
|
|
39
|
+
managed: { type: 'boolean', nullable: true },
|
|
40
|
+
},
|
|
41
|
+
required: ['profileId', 'owner', 'groups'],
|
|
42
|
+
additionalProperties: false,
|
|
43
|
+
};
|
|
44
|
+
export const IamRuntimeMemberListSchema = {
|
|
45
|
+
type: 'object',
|
|
46
|
+
properties: { items: { type: 'array', items: IamRuntimeMemberSchema } },
|
|
47
|
+
required: ['items'],
|
|
48
|
+
additionalProperties: false,
|
|
49
|
+
};
|
|
50
|
+
export const IamRuntimeMemberUpdateSchema = {
|
|
51
|
+
type: 'object',
|
|
52
|
+
properties: {
|
|
53
|
+
owner: { type: 'boolean', nullable: true },
|
|
54
|
+
groups: { ...GroupsSchema, nullable: true },
|
|
55
|
+
},
|
|
56
|
+
required: [],
|
|
57
|
+
additionalProperties: false,
|
|
58
|
+
};
|
|
59
|
+
export const IamRuntimePermissionSchema = {
|
|
60
|
+
type: 'object',
|
|
61
|
+
properties: {
|
|
62
|
+
name: { ...PermissionNameSchema },
|
|
63
|
+
title: { ...TitleSchema, nullable: true },
|
|
64
|
+
area: { type: 'string', minLength: 1, maxLength: 64, nullable: true },
|
|
65
|
+
resourceScoped: { type: 'boolean', nullable: true },
|
|
66
|
+
managed: { type: 'boolean', nullable: true },
|
|
67
|
+
defaultClass: { type: 'string', enum: Object.values(IamDefaultClass), nullable: true },
|
|
68
|
+
},
|
|
69
|
+
required: ['name'],
|
|
70
|
+
additionalProperties: false,
|
|
71
|
+
};
|
|
72
|
+
export const IamRuntimePermissionListSchema = {
|
|
73
|
+
type: 'object',
|
|
74
|
+
properties: { items: { type: 'array', items: IamRuntimePermissionSchema } },
|
|
75
|
+
required: ['items'],
|
|
76
|
+
additionalProperties: false,
|
|
77
|
+
};
|
|
78
|
+
export const IamRuntimeGrantSchema = {
|
|
79
|
+
type: 'object',
|
|
80
|
+
properties: {
|
|
81
|
+
profileId: { ...ProfileIdSchema },
|
|
82
|
+
permission: { ...PermissionNameSchema },
|
|
83
|
+
resources: { ...ResourcesSchema },
|
|
84
|
+
mode: { type: 'string', enum: Object.values(IamGrantMode), nullable: true },
|
|
85
|
+
origin: { type: 'string', enum: Object.values(IamGrantOrigin), nullable: true },
|
|
86
|
+
through: { ...GroupValueSchema, nullable: true },
|
|
87
|
+
},
|
|
88
|
+
required: ['profileId', 'permission'],
|
|
89
|
+
additionalProperties: false,
|
|
90
|
+
};
|
|
91
|
+
export const IamRuntimeGrantListSchema = {
|
|
92
|
+
type: 'object',
|
|
93
|
+
properties: { items: { type: 'array', items: IamRuntimeGrantSchema } },
|
|
94
|
+
required: ['items'],
|
|
95
|
+
additionalProperties: false,
|
|
96
|
+
};
|
|
97
|
+
export const IamRuntimeGrantRequestSchema = {
|
|
98
|
+
type: 'object',
|
|
99
|
+
properties: {
|
|
100
|
+
profileId: { ...ProfileIdSchema },
|
|
101
|
+
permission: { ...PermissionNameSchema },
|
|
102
|
+
resources: { ...ResourcesSchema },
|
|
103
|
+
mode: { type: 'string', enum: Object.values(IamGrantMode), nullable: true },
|
|
104
|
+
},
|
|
105
|
+
required: ['profileId', 'permission'],
|
|
106
|
+
additionalProperties: false,
|
|
107
|
+
};
|
|
108
|
+
//# sourceMappingURL=schemas.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schemas.js","sourceRoot":"","sources":["../src/schemas.ts"],"names":[],"mappings":"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"}
|