@toa.io/extensions.exposition 1.0.0-alpha.103 → 1.0.0-alpha.105
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/components/identity.bans/operations/tsconfig.tsbuildinfo +1 -1
- package/components/identity.basic/operations/tsconfig.tsbuildinfo +1 -1
- package/components/identity.federation/manifest.toa.yaml +4 -1
- package/components/identity.federation/operations/authenticate.js +1 -2
- package/components/identity.federation/operations/authenticate.js.map +1 -1
- package/components/identity.federation/operations/decode.d.ts +2 -0
- package/components/identity.federation/operations/decode.js +33 -0
- package/components/identity.federation/operations/decode.js.map +1 -0
- package/components/identity.federation/operations/tsconfig.tsbuildinfo +1 -1
- package/components/identity.federation/operations/types/context.d.ts +1 -0
- package/components/identity.federation/source/authenticate.ts +1 -2
- package/components/identity.federation/source/decode.ts +9 -0
- package/components/identity.federation/source/types/context.ts +1 -0
- package/components/identity.keys/operations/tsconfig.tsbuildinfo +1 -1
- package/components/identity.roles/operations/tsconfig.tsbuildinfo +1 -1
- package/components/identity.tokens/operations/tsconfig.tsbuildinfo +1 -1
- package/features/auth.incept.feature +57 -0
- package/features/identity.tokens.feature +2 -0
- package/features/map.feature +67 -3
- package/features/steps/IdP.ts +32 -0
- package/features/steps/components/greeter/manifest.toa.yaml +0 -1
- package/features/steps/components/octets.tester/manifest.toa.yaml +0 -1
- package/features/steps/components/pots/manifest.toa.yaml +0 -3
- package/features/steps/components/sequences/manifest.toa.yaml +0 -1
- package/features/steps/components/users/manifest.toa.yaml +4 -2
- package/features/steps/components/users/operations/create.js +15 -0
- package/features/steps/components/users.properties/manifest.toa.yaml +0 -1
- package/package.json +2 -2
- package/source/directives/auth/Authorization.ts +1 -0
- package/source/directives/io/Input.ts +4 -1
- package/source/directives/map/Claims.ts +32 -11
- package/source/directives/map/Map.ts +10 -5
- package/source/directives/map/Mapping.ts +8 -2
- package/transpiled/directives/auth/Authorization.js +1 -0
- package/transpiled/directives/auth/Authorization.js.map +1 -1
- package/transpiled/directives/io/Input.js +2 -0
- package/transpiled/directives/io/Input.js.map +1 -1
- package/transpiled/directives/map/Claims.d.ts +6 -2
- package/transpiled/directives/map/Claims.js +21 -6
- package/transpiled/directives/map/Claims.js.map +1 -1
- package/transpiled/directives/map/Map.d.ts +4 -2
- package/transpiled/directives/map/Map.js +6 -4
- package/transpiled/directives/map/Map.js.map +1 -1
- package/transpiled/directives/map/Mapping.d.ts +7 -2
- package/transpiled/directives/map/Mapping.js +3 -1
- package/transpiled/directives/map/Mapping.js.map +1 -1
- package/transpiled/tsconfig.tsbuildinfo +1 -1
|
@@ -1,22 +1,33 @@
|
|
|
1
1
|
import assert from 'node:assert'
|
|
2
2
|
import { Mapping } from './Mapping'
|
|
3
|
+
import type { Component } from '@toa.io/core'
|
|
4
|
+
import type { Remotes } from '../../Remotes'
|
|
3
5
|
import type { Input } from '../../io'
|
|
4
6
|
|
|
5
7
|
export class Claims extends Mapping<Record<string, string>> {
|
|
6
|
-
|
|
8
|
+
private readonly discovery!: Promise<Component>
|
|
9
|
+
private federation: Component | null = null
|
|
10
|
+
|
|
11
|
+
public constructor (map: Record<string, string>, remotes: Remotes) {
|
|
7
12
|
assert.ok(map.constructor === Object, '`map:claims` must be an object')
|
|
8
13
|
|
|
9
14
|
assert.ok(Object.values(map).every((value) => typeof value === 'string'),
|
|
10
15
|
'`map:claims ` must be an object with string values')
|
|
11
16
|
|
|
12
|
-
super(map)
|
|
17
|
+
super(map, remotes)
|
|
18
|
+
|
|
19
|
+
this.discovery = remotes.discover('identity', 'federation')
|
|
13
20
|
}
|
|
14
21
|
|
|
15
|
-
public override properties (context: Input): Record<string, string> | null {
|
|
16
|
-
const
|
|
17
|
-
const claims = authenticated.identity?.claims
|
|
22
|
+
public override async properties (context: Input): Promise<Record<string, string> | null> {
|
|
23
|
+
const authentication = context.request.headers.authorization
|
|
18
24
|
|
|
19
|
-
if (
|
|
25
|
+
if (authentication === undefined)
|
|
26
|
+
return null
|
|
27
|
+
|
|
28
|
+
const claims = await this.claims(authentication)
|
|
29
|
+
|
|
30
|
+
if (claims === null)
|
|
20
31
|
return null
|
|
21
32
|
|
|
22
33
|
return Object.entries(this.value).reduce((properties: Record<string, string>, [property, claim]) => {
|
|
@@ -28,10 +39,20 @@ export class Claims extends Mapping<Record<string, string>> {
|
|
|
28
39
|
return properties
|
|
29
40
|
}, {})
|
|
30
41
|
}
|
|
31
|
-
}
|
|
32
42
|
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
43
|
+
private async claims (authentication: string): Promise<Record<string, string> | null> {
|
|
44
|
+
const [scheme, credentials] = authentication.split(' ')
|
|
45
|
+
|
|
46
|
+
if (scheme !== 'Bearer' || credentials === undefined)
|
|
47
|
+
return null
|
|
48
|
+
|
|
49
|
+
this.federation ??= await this.discovery
|
|
50
|
+
|
|
51
|
+
const claims = await this.federation.invoke<Record<string, string> | Error>('decode', { input: credentials })
|
|
52
|
+
|
|
53
|
+
if (claims instanceof Error)
|
|
54
|
+
return null
|
|
55
|
+
|
|
56
|
+
return claims
|
|
57
|
+
}
|
|
37
58
|
}
|
|
@@ -11,26 +11,31 @@ import type { Directive } from './Directive'
|
|
|
11
11
|
import type { Properties } from './Properties'
|
|
12
12
|
import type { DirectiveFamily, Parameter } from '../../RTD'
|
|
13
13
|
import type { Input, Output } from '../../io'
|
|
14
|
+
import type { Remotes } from '../../Remotes'
|
|
14
15
|
|
|
15
16
|
export class Map implements DirectiveFamily {
|
|
16
17
|
public readonly name = 'map'
|
|
17
18
|
public readonly mandatory = false
|
|
18
19
|
|
|
19
|
-
|
|
20
|
+
private remotes!: Remotes
|
|
21
|
+
|
|
22
|
+
public create (name: string, value: unknown, remotes: Remotes): Property | Mapping {
|
|
23
|
+
this.remotes = remotes
|
|
24
|
+
|
|
20
25
|
return match(name,
|
|
21
26
|
() => properties.has(name), (name: PN) => new Property(name, value as PV),
|
|
22
|
-
() => name in mappings, (name: keyof typeof mappings) => new mappings[name](value),
|
|
27
|
+
() => name in mappings, (name: keyof typeof mappings) => new mappings[name](value, remotes),
|
|
23
28
|
() => {
|
|
24
29
|
throw new Error(`Directive 'map:${name}' is not implemented`)
|
|
25
30
|
})
|
|
26
31
|
}
|
|
27
32
|
|
|
28
|
-
public preflight (directives: Directive[], context: Input, parameters: Parameter[]): Output {
|
|
33
|
+
public async preflight (directives: Directive[], context: Input, parameters: Parameter[]): Promise<Output> {
|
|
29
34
|
const properties = {}
|
|
30
35
|
|
|
31
36
|
for (const directive of directives)
|
|
32
37
|
if (directive instanceof Mapping)
|
|
33
|
-
Object.assign(properties, directive.properties(context, parameters, directives))
|
|
38
|
+
Object.assign(properties, await directive.properties(context, parameters, directives))
|
|
34
39
|
|
|
35
40
|
context.pipelines.body.push((body: unknown) => {
|
|
36
41
|
if (body === undefined || body === null || typeof body !== 'object')
|
|
@@ -46,7 +51,7 @@ export class Map implements DirectiveFamily {
|
|
|
46
51
|
type PN = keyof Properties
|
|
47
52
|
type PV = Properties[PN]
|
|
48
53
|
|
|
49
|
-
const mappings: Record<string, new (value: any) => Directive> = {
|
|
54
|
+
const mappings: Record<string, new (value: any, remotes: Remotes) => Directive> = {
|
|
50
55
|
authority: Authority,
|
|
51
56
|
headers: Headers,
|
|
52
57
|
languages: Languages,
|
|
@@ -1,13 +1,19 @@
|
|
|
1
|
+
import type { Remotes } from '../../Remotes'
|
|
1
2
|
import type { Directive } from './Directive'
|
|
2
3
|
import type { Input } from '../../io'
|
|
3
4
|
import type { Parameter } from '../../RTD'
|
|
4
5
|
|
|
5
6
|
export abstract class Mapping<T = unknown> {
|
|
6
7
|
protected value: T
|
|
8
|
+
protected remotes?: Remotes
|
|
7
9
|
|
|
8
|
-
protected constructor (value: T) {
|
|
10
|
+
protected constructor (value: T, remotes?: Remotes) {
|
|
9
11
|
this.value = value
|
|
12
|
+
this.remotes = remotes
|
|
10
13
|
}
|
|
11
14
|
|
|
12
|
-
public abstract properties (context: Input, parameters: Parameter[], directives: Directive[]):
|
|
15
|
+
public abstract properties (context: Input, parameters: Parameter[], directives: Directive[]): Output
|
|
13
16
|
}
|
|
17
|
+
|
|
18
|
+
type Properties = Record<string, unknown> | null
|
|
19
|
+
type Output = Properties | Promise<Properties>
|
|
@@ -90,6 +90,7 @@ class Authorization {
|
|
|
90
90
|
const authorization = `Token ${token}`;
|
|
91
91
|
response.headers ??= new Headers();
|
|
92
92
|
response.headers.set('authorization', authorization);
|
|
93
|
+
response.headers.set('cache-control', 'no-store');
|
|
93
94
|
}
|
|
94
95
|
async resolve(authority, authorization) {
|
|
95
96
|
if (authorization === undefined)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Authorization.js","sourceRoot":"","sources":["../../../source/directives/auth/Authorization.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"Authorization.js","sourceRoot":"","sources":["../../../source/directives/auth/Authorization.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Input.js","sourceRoot":"","sources":["../../../source/directives/io/Input.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,qCAAuC;AACvC,mDAAoC;AAKpC,MAAa,KAAK;IACC,WAAW,CAAa;IAEzC,YAAoB,WAAwB;QAC1C,IAAI,CAAC,WAAW,GAAG,WAAW,CAAA;IAChC,CAAC;IAEM,MAAM,CAAC,QAAQ,CAAE,WAAoB;QAC1C,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAc,WAAW,EAAE,+BAA+B,CAAC,CAAA;IACnF,CAAC;IAEM,MAAM,CAAE,OAAgB;QAC7B,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAA;IACzD,CAAC;IAEO,KAAK,CAAE,IAAa;QAC1B,IAAI,CAAC;YACH,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAsB,IAAI,CAAC,CAAA;QACrD,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,IAAI,iBAAU,CAAC,sBAAsB,CAAC,CAAA;QAC9C,CAAC;QAED,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAA;QAErC,IAAI,QAAQ,KAAK,SAAS;YACxB,MAAM,IAAI,iBAAU,CAAC,qBAAqB,QAAQ,EAAE,CAAC,CAAA;QAEvD,OAAO,IAAI,CAAA;IACb,CAAC;IAEO,SAAS,CAAE,KAA0B;QAC3C,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;YACvB,OAAO,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAA;QAE1E,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAA;YAErC,IAAI,QAAQ,KAAK,SAAS;gBACxB,OAAO,QAAQ,CAAA;QACnB,CAAC;IACH,CAAC;CACF;
|
|
1
|
+
{"version":3,"file":"Input.js","sourceRoot":"","sources":["../../../source/directives/io/Input.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,qCAAuC;AACvC,mDAAoC;AAKpC,MAAa,KAAK;IACC,WAAW,CAAa;IAEzC,YAAoB,WAAwB;QAC1C,IAAI,CAAC,WAAW,GAAG,WAAW,CAAA;IAChC,CAAC;IAEM,MAAM,CAAC,QAAQ,CAAE,WAAoB;QAC1C,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAc,WAAW,EAAE,+BAA+B,CAAC,CAAA;IACnF,CAAC;IAEM,MAAM,CAAE,OAAgB;QAC7B,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAA;IACzD,CAAC;IAEO,KAAK,CAAE,IAAa;QAC1B,IAAI,IAAI,KAAK,SAAS;YACpB,OAAO,IAAI,CAAA;QAEb,IAAI,CAAC;YACH,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAsB,IAAI,CAAC,CAAA;QACrD,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,IAAI,iBAAU,CAAC,sBAAsB,CAAC,CAAA;QAC9C,CAAC;QAED,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAA;QAErC,IAAI,QAAQ,KAAK,SAAS;YACxB,MAAM,IAAI,iBAAU,CAAC,qBAAqB,QAAQ,EAAE,CAAC,CAAA;QAEvD,OAAO,IAAI,CAAA;IACb,CAAC;IAEO,SAAS,CAAE,KAA0B;QAC3C,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;YACvB,OAAO,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAA;QAE1E,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAA;YAErC,IAAI,QAAQ,KAAK,SAAS;gBACxB,OAAO,QAAQ,CAAA;QACnB,CAAC;IACH,CAAC;CACF;AA5CD,sBA4CC"}
|
|
@@ -1,6 +1,10 @@
|
|
|
1
1
|
import { Mapping } from './Mapping';
|
|
2
|
+
import type { Remotes } from '../../Remotes';
|
|
2
3
|
import type { Input } from '../../io';
|
|
3
4
|
export declare class Claims extends Mapping<Record<string, string>> {
|
|
4
|
-
|
|
5
|
-
|
|
5
|
+
private readonly discovery;
|
|
6
|
+
private federation;
|
|
7
|
+
constructor(map: Record<string, string>, remotes: Remotes);
|
|
8
|
+
properties(context: Input): Promise<Record<string, string> | null>;
|
|
9
|
+
private claims;
|
|
6
10
|
}
|
|
@@ -7,15 +7,20 @@ exports.Claims = void 0;
|
|
|
7
7
|
const node_assert_1 = __importDefault(require("node:assert"));
|
|
8
8
|
const Mapping_1 = require("./Mapping");
|
|
9
9
|
class Claims extends Mapping_1.Mapping {
|
|
10
|
-
|
|
10
|
+
discovery;
|
|
11
|
+
federation = null;
|
|
12
|
+
constructor(map, remotes) {
|
|
11
13
|
node_assert_1.default.ok(map.constructor === Object, '`map:claims` must be an object');
|
|
12
14
|
node_assert_1.default.ok(Object.values(map).every((value) => typeof value === 'string'), '`map:claims ` must be an object with string values');
|
|
13
|
-
super(map);
|
|
15
|
+
super(map, remotes);
|
|
16
|
+
this.discovery = remotes.discover('identity', 'federation');
|
|
14
17
|
}
|
|
15
|
-
properties(context) {
|
|
16
|
-
const
|
|
17
|
-
|
|
18
|
-
|
|
18
|
+
async properties(context) {
|
|
19
|
+
const authentication = context.request.headers.authorization;
|
|
20
|
+
if (authentication === undefined)
|
|
21
|
+
return null;
|
|
22
|
+
const claims = await this.claims(authentication);
|
|
23
|
+
if (claims === null)
|
|
19
24
|
return null;
|
|
20
25
|
return Object.entries(this.value).reduce((properties, [property, claim]) => {
|
|
21
26
|
const value = claims[claim];
|
|
@@ -24,6 +29,16 @@ class Claims extends Mapping_1.Mapping {
|
|
|
24
29
|
return properties;
|
|
25
30
|
}, {});
|
|
26
31
|
}
|
|
32
|
+
async claims(authentication) {
|
|
33
|
+
const [scheme, credentials] = authentication.split(' ');
|
|
34
|
+
if (scheme !== 'Bearer' || credentials === undefined)
|
|
35
|
+
return null;
|
|
36
|
+
this.federation ??= await this.discovery;
|
|
37
|
+
const claims = await this.federation.invoke('decode', { input: credentials });
|
|
38
|
+
if (claims instanceof Error)
|
|
39
|
+
return null;
|
|
40
|
+
return claims;
|
|
41
|
+
}
|
|
27
42
|
}
|
|
28
43
|
exports.Claims = Claims;
|
|
29
44
|
//# sourceMappingURL=Claims.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Claims.js","sourceRoot":"","sources":["../../../source/directives/map/Claims.ts"],"names":[],"mappings":";;;;;;AAAA,8DAAgC;AAChC,uCAAmC;
|
|
1
|
+
{"version":3,"file":"Claims.js","sourceRoot":"","sources":["../../../source/directives/map/Claims.ts"],"names":[],"mappings":";;;;;;AAAA,8DAAgC;AAChC,uCAAmC;AAKnC,MAAa,MAAO,SAAQ,iBAA+B;IACxC,SAAS,CAAqB;IACvC,UAAU,GAAqB,IAAI,CAAA;IAE3C,YAAoB,GAA2B,EAAE,OAAgB;QAC/D,qBAAM,CAAC,EAAE,CAAC,GAAG,CAAC,WAAW,KAAK,MAAM,EAAE,gCAAgC,CAAC,CAAA;QAEvE,qBAAM,CAAC,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,KAAK,KAAK,QAAQ,CAAC,EACtE,oDAAoD,CAAC,CAAA;QAEvD,KAAK,CAAC,GAAG,EAAE,OAAO,CAAC,CAAA;QAEnB,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,QAAQ,CAAC,UAAU,EAAE,YAAY,CAAC,CAAA;IAC7D,CAAC;IAEe,KAAK,CAAC,UAAU,CAAE,OAAc;QAC9C,MAAM,cAAc,GAAG,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,aAAa,CAAA;QAE5D,IAAI,cAAc,KAAK,SAAS;YAC9B,OAAO,IAAI,CAAA;QAEb,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,CAAA;QAEhD,IAAI,MAAM,KAAK,IAAI;YACjB,OAAO,IAAI,CAAA;QAEb,OAAO,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,UAAkC,EAAE,CAAC,QAAQ,EAAE,KAAK,CAAC,EAAE,EAAE;YACjG,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,CAAA;YAE3B,IAAI,KAAK,KAAK,SAAS;gBACrB,UAAU,CAAC,QAAQ,CAAC,GAAG,KAAK,CAAA;YAE9B,OAAO,UAAU,CAAA;QACnB,CAAC,EAAE,EAAE,CAAC,CAAA;IACR,CAAC;IAEO,KAAK,CAAC,MAAM,CAAE,cAAsB;QAC1C,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,GAAG,cAAc,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;QAEvD,IAAI,MAAM,KAAK,QAAQ,IAAI,WAAW,KAAK,SAAS;YAClD,OAAO,IAAI,CAAA;QAEb,IAAI,CAAC,UAAU,KAAK,MAAM,IAAI,CAAC,SAAS,CAAA;QAExC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,MAAM,CAAiC,QAAQ,EAAE,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC,CAAA;QAE7G,IAAI,MAAM,YAAY,KAAK;YACzB,OAAO,IAAI,CAAA;QAEb,OAAO,MAAM,CAAA;IACf,CAAC;CACF;AAnDD,wBAmDC"}
|
|
@@ -3,9 +3,11 @@ import { Mapping } from './Mapping';
|
|
|
3
3
|
import type { Directive } from './Directive';
|
|
4
4
|
import type { DirectiveFamily, Parameter } from '../../RTD';
|
|
5
5
|
import type { Input, Output } from '../../io';
|
|
6
|
+
import type { Remotes } from '../../Remotes';
|
|
6
7
|
export declare class Map implements DirectiveFamily {
|
|
7
8
|
readonly name = "map";
|
|
8
9
|
readonly mandatory = false;
|
|
9
|
-
|
|
10
|
-
|
|
10
|
+
private remotes;
|
|
11
|
+
create(name: string, value: unknown, remotes: Remotes): Property | Mapping;
|
|
12
|
+
preflight(directives: Directive[], context: Input, parameters: Parameter[]): Promise<Output>;
|
|
11
13
|
}
|
|
@@ -13,16 +13,18 @@ const Claims_1 = require("./Claims");
|
|
|
13
13
|
class Map {
|
|
14
14
|
name = 'map';
|
|
15
15
|
mandatory = false;
|
|
16
|
-
|
|
17
|
-
|
|
16
|
+
remotes;
|
|
17
|
+
create(name, value, remotes) {
|
|
18
|
+
this.remotes = remotes;
|
|
19
|
+
return (0, matchacho_1.match)(name, () => Properties_1.properties.has(name), (name) => new Properties_1.Property(name, value), () => name in mappings, (name) => new mappings[name](value, remotes), () => {
|
|
18
20
|
throw new Error(`Directive 'map:${name}' is not implemented`);
|
|
19
21
|
});
|
|
20
22
|
}
|
|
21
|
-
preflight(directives, context, parameters) {
|
|
23
|
+
async preflight(directives, context, parameters) {
|
|
22
24
|
const properties = {};
|
|
23
25
|
for (const directive of directives)
|
|
24
26
|
if (directive instanceof Mapping_1.Mapping)
|
|
25
|
-
Object.assign(properties, directive.properties(context, parameters, directives));
|
|
27
|
+
Object.assign(properties, await directive.properties(context, parameters, directives));
|
|
26
28
|
context.pipelines.body.push((body) => {
|
|
27
29
|
if (body === undefined || body === null || typeof body !== 'object')
|
|
28
30
|
return properties;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Map.js","sourceRoot":"","sources":["../../../source/directives/map/Map.ts"],"names":[],"mappings":";;;AAAA,yCAAiC;AACjC,6CAAmD;AACnD,uCAAmC;AACnC,uCAAmC;AACnC,2CAAuC;AACvC,yCAAqC;AACrC,yCAAqC;AACrC,2CAAuC;AACvC,qCAAiC;
|
|
1
|
+
{"version":3,"file":"Map.js","sourceRoot":"","sources":["../../../source/directives/map/Map.ts"],"names":[],"mappings":";;;AAAA,yCAAiC;AACjC,6CAAmD;AACnD,uCAAmC;AACnC,uCAAmC;AACnC,2CAAuC;AACvC,yCAAqC;AACrC,yCAAqC;AACrC,2CAAuC;AACvC,qCAAiC;AAOjC,MAAa,GAAG;IACE,IAAI,GAAG,KAAK,CAAA;IACZ,SAAS,GAAG,KAAK,CAAA;IAEzB,OAAO,CAAU;IAElB,MAAM,CAAE,IAAY,EAAE,KAAc,EAAE,OAAgB;QAC3D,IAAI,CAAC,OAAO,GAAG,OAAO,CAAA;QAEtB,OAAO,IAAA,iBAAK,EAAC,IAAI,EACf,GAAG,EAAE,CAAC,uBAAU,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAQ,EAAE,EAAE,CAAC,IAAI,qBAAQ,CAAC,IAAI,EAAE,KAAW,CAAC,EACzE,GAAG,EAAE,CAAC,IAAI,IAAI,QAAQ,EAAE,CAAC,IAA2B,EAAE,EAAE,CAAC,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,OAAO,CAAC,EAC3F,GAAG,EAAE;YACH,MAAM,IAAI,KAAK,CAAC,kBAAkB,IAAI,sBAAsB,CAAC,CAAA;QAC/D,CAAC,CAAC,CAAA;IACN,CAAC;IAEM,KAAK,CAAC,SAAS,CAAE,UAAuB,EAAE,OAAc,EAAE,UAAuB;QACtF,MAAM,UAAU,GAAG,EAAE,CAAA;QAErB,KAAK,MAAM,SAAS,IAAI,UAAU;YAChC,IAAI,SAAS,YAAY,iBAAO;gBAC9B,MAAM,CAAC,MAAM,CAAC,UAAU,EAAE,MAAM,SAAS,CAAC,UAAU,CAAC,OAAO,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC,CAAA;QAE1F,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAa,EAAE,EAAE;YAC5C,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI,KAAK,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ;gBACjE,OAAO,UAAU,CAAA;;gBAEjB,OAAO,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,UAAU,CAAC,CAAA;QAC1C,CAAC,CAAC,CAAA;QAEF,OAAO,IAAI,CAAA;IACb,CAAC;CACF;AAjCD,kBAiCC;AAKD,MAAM,QAAQ,GAAoE;IAChF,SAAS,EAAE,qBAAS;IACpB,OAAO,EAAE,iBAAO;IAChB,SAAS,EAAE,qBAAS;IACpB,QAAQ,EAAE,mBAAQ;IAClB,QAAQ,EAAE,mBAAQ;IAClB,MAAM,EAAE,eAAM;CACf,CAAA"}
|
|
@@ -1,8 +1,13 @@
|
|
|
1
|
+
import type { Remotes } from '../../Remotes';
|
|
1
2
|
import type { Directive } from './Directive';
|
|
2
3
|
import type { Input } from '../../io';
|
|
3
4
|
import type { Parameter } from '../../RTD';
|
|
4
5
|
export declare abstract class Mapping<T = unknown> {
|
|
5
6
|
protected value: T;
|
|
6
|
-
protected
|
|
7
|
-
|
|
7
|
+
protected remotes?: Remotes;
|
|
8
|
+
protected constructor(value: T, remotes?: Remotes);
|
|
9
|
+
abstract properties(context: Input, parameters: Parameter[], directives: Directive[]): Output;
|
|
8
10
|
}
|
|
11
|
+
type Properties = Record<string, unknown> | null;
|
|
12
|
+
type Output = Properties | Promise<Properties>;
|
|
13
|
+
export {};
|
|
@@ -3,8 +3,10 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.Mapping = void 0;
|
|
4
4
|
class Mapping {
|
|
5
5
|
value;
|
|
6
|
-
|
|
6
|
+
remotes;
|
|
7
|
+
constructor(value, remotes) {
|
|
7
8
|
this.value = value;
|
|
9
|
+
this.remotes = remotes;
|
|
8
10
|
}
|
|
9
11
|
}
|
|
10
12
|
exports.Mapping = Mapping;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Mapping.js","sourceRoot":"","sources":["../../../source/directives/map/Mapping.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"Mapping.js","sourceRoot":"","sources":["../../../source/directives/map/Mapping.ts"],"names":[],"mappings":";;;AAKA,MAAsB,OAAO;IACjB,KAAK,CAAG;IACR,OAAO,CAAU;IAE3B,YAAuB,KAAQ,EAAE,OAAiB;QAChD,IAAI,CAAC,KAAK,GAAG,KAAK,CAAA;QAClB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAA;IACxB,CAAC;CAGF;AAVD,0BAUC"}
|