@shipfox/client-runners 5.0.0 → 6.0.2
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/.turbo/turbo-build.log +1 -1
- package/CHANGELOG.md +49 -0
- package/dist/components/create-manual-registration-token-form.d.ts +3 -3
- package/dist/components/create-manual-registration-token-form.d.ts.map +1 -1
- package/dist/components/create-manual-registration-token-form.js +8 -23
- package/dist/components/create-manual-registration-token-form.js.map +1 -1
- package/dist/components/create-provisioner-token-form.d.ts +3 -3
- package/dist/components/create-provisioner-token-form.d.ts.map +1 -1
- package/dist/components/create-provisioner-token-form.js +8 -23
- package/dist/components/create-provisioner-token-form.js.map +1 -1
- package/dist/components/manual-registration-token-errors.d.ts.map +1 -1
- package/dist/components/manual-registration-token-errors.js +0 -1
- package/dist/components/manual-registration-token-errors.js.map +1 -1
- package/dist/components/manual-registration-token-format.d.ts +0 -2
- package/dist/components/manual-registration-token-format.d.ts.map +1 -1
- package/dist/components/manual-registration-token-format.js +0 -3
- package/dist/components/manual-registration-token-format.js.map +1 -1
- package/dist/components/manual-registration-token-list.d.ts +2 -2
- package/dist/components/manual-registration-token-list.d.ts.map +1 -1
- package/dist/components/manual-registration-token-list.js +12 -19
- package/dist/components/manual-registration-token-list.js.map +1 -1
- package/dist/components/manual-registration-tokens-settings-section.d.ts.map +1 -1
- package/dist/components/manual-registration-tokens-settings-section.js +1 -1
- package/dist/components/manual-registration-tokens-settings-section.js.map +1 -1
- package/dist/components/provisioner-token-errors.d.ts.map +1 -1
- package/dist/components/provisioner-token-errors.js +0 -1
- package/dist/components/provisioner-token-errors.js.map +1 -1
- package/dist/components/provisioner-token-format.d.ts +0 -18
- package/dist/components/provisioner-token-format.d.ts.map +1 -1
- package/dist/components/provisioner-token-format.js +0 -25
- package/dist/components/provisioner-token-format.js.map +1 -1
- package/dist/components/provisioner-token-list.d.ts +2 -2
- package/dist/components/provisioner-token-list.d.ts.map +1 -1
- package/dist/components/provisioner-token-list.js +9 -19
- package/dist/components/provisioner-token-list.js.map +1 -1
- package/dist/components/provisioner-tokens-settings-section.js +2 -2
- package/dist/components/provisioner-tokens-settings-section.js.map +1 -1
- package/dist/components/token-expiration-select.d.ts +7 -0
- package/dist/components/token-expiration-select.d.ts.map +1 -1
- package/dist/components/token-expiration-select.js +8 -0
- package/dist/components/token-expiration-select.js.map +1 -1
- package/dist/components/token-settings-sections.stories.d.ts.map +1 -1
- package/dist/components/token-settings-sections.stories.js +66 -23
- package/dist/components/token-settings-sections.stories.js.map +1 -1
- package/dist/core/token.d.ts +66 -0
- package/dist/core/token.d.ts.map +1 -0
- package/dist/core/token.js +37 -0
- package/dist/core/token.js.map +1 -0
- package/dist/feature.d.ts +13 -0
- package/dist/feature.d.ts.map +1 -1
- package/dist/feature.js +17 -16
- package/dist/feature.js.map +1 -1
- package/dist/hooks/api/manual-registration-tokens.d.ts +13 -71
- package/dist/hooks/api/manual-registration-tokens.d.ts.map +1 -1
- package/dist/hooks/api/manual-registration-tokens.js +40 -19
- package/dist/hooks/api/manual-registration-tokens.js.map +1 -1
- package/dist/hooks/api/provisioner-tokens.d.ts +17 -115
- package/dist/hooks/api/provisioner-tokens.d.ts.map +1 -1
- package/dist/hooks/api/provisioner-tokens.js +59 -32
- package/dist/hooks/api/provisioner-tokens.js.map +1 -1
- package/dist/hooks/api/token-mapper.d.ts +12 -0
- package/dist/hooks/api/token-mapper.d.ts.map +1 -0
- package/dist/hooks/api/token-mapper.js +61 -0
- package/dist/hooks/api/token-mapper.js.map +1 -0
- package/dist/tsconfig.test.tsbuildinfo +1 -1
- package/package.json +9 -9
- package/src/components/create-manual-registration-token-form.tsx +11 -21
- package/src/components/create-provisioner-token-form.tsx +11 -21
- package/src/components/form-errors.test.ts +2 -2
- package/src/components/manual-registration-token-errors.ts +0 -1
- package/src/components/manual-registration-token-format.test.ts +4 -4
- package/src/components/manual-registration-token-format.ts +0 -7
- package/src/components/manual-registration-token-list.tsx +13 -22
- package/src/components/manual-registration-tokens-settings-section.tsx +3 -5
- package/src/components/provisioner-token-errors.ts +0 -1
- package/src/components/provisioner-token-form-errors.test.ts +2 -2
- package/src/components/provisioner-token-format.test.ts +15 -14
- package/src/components/provisioner-token-format.ts +0 -29
- package/src/components/provisioner-token-list.tsx +14 -23
- package/src/components/provisioner-tokens-settings-section.tsx +4 -4
- package/src/components/token-expiration-select.test.ts +15 -0
- package/src/components/token-expiration-select.tsx +6 -0
- package/src/components/token-settings-sections.stories.tsx +72 -23
- package/src/core/token.test.ts +30 -0
- package/src/core/token.ts +83 -0
- package/src/feature.ts +19 -17
- package/src/hooks/api/manual-registration-tokens.test.ts +8 -5
- package/src/hooks/api/manual-registration-tokens.ts +71 -24
- package/src/hooks/api/provisioner-tokens.test.ts +10 -7
- package/src/hooks/api/provisioner-tokens.ts +100 -36
- package/src/hooks/api/token-mapper.test.ts +161 -0
- package/src/hooks/api/token-mapper.ts +79 -0
- package/tsconfig.build.tsbuildinfo +1 -1
- package/vercel.json +5 -0
|
@@ -1,131 +1,33 @@
|
|
|
1
|
-
import type
|
|
1
|
+
import { type FetchQueryOptions } from '@tanstack/react-query';
|
|
2
|
+
import type { ActiveProvisioner, CreatedProvisionerToken, CreateTokenCommand, ProvisionerToken } from '#core/token.js';
|
|
2
3
|
export declare const provisionerTokenQueryKeys: {
|
|
3
4
|
all: readonly ["provisioner-tokens"];
|
|
4
5
|
list: (workspaceId: string) => readonly ["provisioner-tokens", "tokens", string];
|
|
5
6
|
active: (workspaceId: string) => readonly ["provisioner-tokens", "provisioners", string];
|
|
6
7
|
};
|
|
8
|
+
type ProvisionerTokensQueryOptions = FetchQueryOptions<ProvisionerToken[], Error, ProvisionerToken[], ReturnType<typeof provisionerTokenQueryKeys.list>>;
|
|
9
|
+
type ActiveProvisionersQueryOptions = FetchQueryOptions<ActiveProvisioner[], Error, ActiveProvisioner[], ReturnType<typeof provisionerTokenQueryKeys.active>>;
|
|
7
10
|
export declare function listProvisionerTokens({ workspaceId, signal, }: {
|
|
8
11
|
workspaceId: string;
|
|
9
12
|
signal?: AbortSignal;
|
|
10
|
-
}): Promise<
|
|
11
|
-
|
|
12
|
-
id: string;
|
|
13
|
-
workspace_id: string;
|
|
14
|
-
prefix: string;
|
|
15
|
-
name: string | null;
|
|
16
|
-
created_by_user_id: string;
|
|
17
|
-
revoked_by_user_id: string | null;
|
|
18
|
-
expires_at: string | null;
|
|
19
|
-
revoked_at: string | null;
|
|
20
|
-
last_seen_at: string | null;
|
|
21
|
-
created_at: string;
|
|
22
|
-
updated_at: string;
|
|
23
|
-
scope: "workspace";
|
|
24
|
-
}[];
|
|
25
|
-
}>;
|
|
26
|
-
export declare function createProvisionerToken({ workspaceId, body, }: {
|
|
13
|
+
}): Promise<ProvisionerToken[]>;
|
|
14
|
+
export declare function createProvisionerToken({ workspaceId, command, }: {
|
|
27
15
|
workspaceId: string;
|
|
28
|
-
|
|
29
|
-
}): Promise<
|
|
30
|
-
id: string;
|
|
31
|
-
raw_token: string;
|
|
32
|
-
prefix: string;
|
|
33
|
-
name: string | null;
|
|
34
|
-
workspace_id: string;
|
|
35
|
-
created_by_user_id: string;
|
|
36
|
-
revoked_by_user_id: string | null;
|
|
37
|
-
expires_at: string | null;
|
|
38
|
-
revoked_at: string | null;
|
|
39
|
-
last_seen_at: string | null;
|
|
40
|
-
created_at: string;
|
|
41
|
-
updated_at: string;
|
|
42
|
-
scope: "workspace";
|
|
43
|
-
}>;
|
|
16
|
+
command: CreateTokenCommand;
|
|
17
|
+
}): Promise<CreatedProvisionerToken>;
|
|
44
18
|
export declare function revokeProvisionerToken({ workspaceId, tokenId, }: {
|
|
45
19
|
workspaceId: string;
|
|
46
20
|
tokenId: string;
|
|
47
|
-
}): Promise<
|
|
48
|
-
id: string;
|
|
49
|
-
workspace_id: string;
|
|
50
|
-
prefix: string;
|
|
51
|
-
name: string | null;
|
|
52
|
-
created_by_user_id: string;
|
|
53
|
-
revoked_by_user_id: string | null;
|
|
54
|
-
expires_at: string | null;
|
|
55
|
-
revoked_at: string | null;
|
|
56
|
-
last_seen_at: string | null;
|
|
57
|
-
created_at: string;
|
|
58
|
-
updated_at: string;
|
|
59
|
-
scope: "workspace";
|
|
60
|
-
}>;
|
|
21
|
+
}): Promise<ProvisionerToken>;
|
|
61
22
|
export declare function listActiveProvisioners({ workspaceId, signal, }: {
|
|
62
23
|
workspaceId: string;
|
|
63
24
|
signal?: AbortSignal;
|
|
64
|
-
}): Promise<
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
}
|
|
72
|
-
export declare function useProvisionerTokensQuery(workspaceId: string | undefined): import("@tanstack/react-query").UseQueryResult<NoInfer<{
|
|
73
|
-
tokens: {
|
|
74
|
-
id: string;
|
|
75
|
-
workspace_id: string;
|
|
76
|
-
prefix: string;
|
|
77
|
-
name: string | null;
|
|
78
|
-
created_by_user_id: string;
|
|
79
|
-
revoked_by_user_id: string | null;
|
|
80
|
-
expires_at: string | null;
|
|
81
|
-
revoked_at: string | null;
|
|
82
|
-
last_seen_at: string | null;
|
|
83
|
-
created_at: string;
|
|
84
|
-
updated_at: string;
|
|
85
|
-
scope: "workspace";
|
|
86
|
-
}[];
|
|
87
|
-
}>, Error>;
|
|
88
|
-
export declare function useCreateProvisionerTokenMutation(): import("@tanstack/react-query").UseMutationResult<{
|
|
89
|
-
id: string;
|
|
90
|
-
raw_token: string;
|
|
91
|
-
prefix: string;
|
|
92
|
-
name: string | null;
|
|
93
|
-
workspace_id: string;
|
|
94
|
-
created_by_user_id: string;
|
|
95
|
-
revoked_by_user_id: string | null;
|
|
96
|
-
expires_at: string | null;
|
|
97
|
-
revoked_at: string | null;
|
|
98
|
-
last_seen_at: string | null;
|
|
99
|
-
created_at: string;
|
|
100
|
-
updated_at: string;
|
|
101
|
-
scope: "workspace";
|
|
102
|
-
}, Error, {
|
|
103
|
-
workspaceId: string;
|
|
104
|
-
body: CreateProvisionerTokenBodyDto;
|
|
105
|
-
}, unknown>;
|
|
106
|
-
export declare function useRevokeProvisionerTokenMutation(): import("@tanstack/react-query").UseMutationResult<{
|
|
107
|
-
id: string;
|
|
108
|
-
workspace_id: string;
|
|
109
|
-
prefix: string;
|
|
110
|
-
name: string | null;
|
|
111
|
-
created_by_user_id: string;
|
|
112
|
-
revoked_by_user_id: string | null;
|
|
113
|
-
expires_at: string | null;
|
|
114
|
-
revoked_at: string | null;
|
|
115
|
-
last_seen_at: string | null;
|
|
116
|
-
created_at: string;
|
|
117
|
-
updated_at: string;
|
|
118
|
-
scope: "workspace";
|
|
119
|
-
}, Error, {
|
|
120
|
-
workspaceId: string;
|
|
121
|
-
tokenId: string;
|
|
122
|
-
}, unknown>;
|
|
123
|
-
export declare function useActiveProvisionersQuery(workspaceId: string | undefined): import("@tanstack/react-query").UseQueryResult<NoInfer<{
|
|
124
|
-
provisioners: {
|
|
125
|
-
id: string;
|
|
126
|
-
name: string | null;
|
|
127
|
-
prefix: string;
|
|
128
|
-
last_seen_at: string;
|
|
129
|
-
}[];
|
|
130
|
-
}>, Error>;
|
|
25
|
+
}): Promise<ActiveProvisioner[]>;
|
|
26
|
+
export declare function provisionerTokensQueryOptions(workspaceId: string): ProvisionerTokensQueryOptions;
|
|
27
|
+
export declare function activeProvisionersQueryOptions(workspaceId: string): ActiveProvisionersQueryOptions;
|
|
28
|
+
export declare function useProvisionerTokensQuery(workspaceId: string | undefined): import("@tanstack/react-query").UseQueryResult<NoInfer<ProvisionerToken[]>, Error>;
|
|
29
|
+
export declare function useActiveProvisionersQuery(workspaceId: string | undefined): import("@tanstack/react-query").UseQueryResult<NoInfer<ActiveProvisioner[]>, Error>;
|
|
30
|
+
export declare function useCreateProvisionerTokenMutation(workspaceId: string): import("@tanstack/react-query").UseMutationResult<CreatedProvisionerToken, Error, CreateTokenCommand, unknown>;
|
|
31
|
+
export declare function useRevokeProvisionerTokenMutation(workspaceId: string): import("@tanstack/react-query").UseMutationResult<ProvisionerToken, Error, string, unknown>;
|
|
32
|
+
export {};
|
|
131
33
|
//# sourceMappingURL=provisioner-tokens.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"provisioner-tokens.d.ts","sourceRoot":"","sources":["../../../src/hooks/api/provisioner-tokens.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"provisioner-tokens.d.ts","sourceRoot":"","sources":["../../../src/hooks/api/provisioner-tokens.ts"],"names":[],"mappings":"AAOA,OAAO,EACL,KAAK,iBAAiB,EAKvB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,KAAK,EACV,iBAAiB,EACjB,uBAAuB,EACvB,kBAAkB,EAClB,gBAAgB,EACjB,MAAM,gBAAgB,CAAC;AAUxB,eAAO,MAAM,yBAAyB;;wBAEhB,MAAM;0BACJ,MAAM;CAE7B,CAAC;AAEF,KAAK,6BAA6B,GAAG,iBAAiB,CACpD,gBAAgB,EAAE,EAClB,KAAK,EACL,gBAAgB,EAAE,EAClB,UAAU,CAAC,OAAO,yBAAyB,CAAC,IAAI,CAAC,CAClD,CAAC;AAEF,KAAK,8BAA8B,GAAG,iBAAiB,CACrD,iBAAiB,EAAE,EACnB,KAAK,EACL,iBAAiB,EAAE,EACnB,UAAU,CAAC,OAAO,yBAAyB,CAAC,MAAM,CAAC,CACpD,CAAC;AAEF,wBAAsB,qBAAqB,CAAC,EAC1C,WAAW,EACX,MAAM,GACP,EAAE;IACD,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB,GAAG,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAO9B;AAED,wBAAsB,sBAAsB,CAAC,EAC3C,WAAW,EACX,OAAO,GACR,EAAE;IACD,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,kBAAkB,CAAC;CAC7B,GAAG,OAAO,CAAC,uBAAuB,CAAC,CAOnC;AAED,wBAAsB,sBAAsB,CAAC,EAC3C,WAAW,EACX,OAAO,GACR,EAAE;IACD,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;CACjB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAO5B;AAED,wBAAsB,sBAAsB,CAAC,EAC3C,WAAW,EACX,MAAM,GACP,EAAE;IACD,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB,GAAG,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAO/B;AAED,wBAAgB,6BAA6B,CAAC,WAAW,EAAE,MAAM,GAAG,6BAA6B,CAOhG;AAED,wBAAgB,8BAA8B,CAC5C,WAAW,EAAE,MAAM,GAClB,8BAA8B,CAOhC;AAED,wBAAgB,yBAAyB,CAAC,WAAW,EAAE,MAAM,GAAG,SAAS,sFAKxE;AAED,wBAAgB,0BAA0B,CAAC,WAAW,EAAE,MAAM,GAAG,SAAS,uFAKzE;AAED,wBAAgB,iCAAiC,CAAC,WAAW,EAAE,MAAM,kHAQpE;AAED,wBAAgB,iCAAiC,CAAC,WAAW,EAAE,MAAM,+FAWpE"}
|
|
@@ -1,5 +1,7 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
1
|
+
import { createProvisionerTokenResponseSchema, listActiveProvisionersResponseSchema, listProvisionerTokensResponseSchema, revokeProvisionerTokenResponseSchema } from '@shipfox/api-runners-dto';
|
|
2
|
+
import { checkedApiRequest } from '@shipfox/client-api';
|
|
3
|
+
import { queryOptions, useMutation, useQuery, useQueryClient } from '@tanstack/react-query';
|
|
4
|
+
import { toActiveProvisioner, toCreatedProvisionerToken, toCreateTokenBody, toProvisionerToken } from './token-mapper.js';
|
|
3
5
|
const PROVISIONER_TOKEN_REFETCH_INTERVAL_MS = 30_000;
|
|
4
6
|
export const provisionerTokenQueryKeys = {
|
|
5
7
|
all: [
|
|
@@ -17,64 +19,89 @@ export const provisionerTokenQueryKeys = {
|
|
|
17
19
|
]
|
|
18
20
|
};
|
|
19
21
|
export async function listProvisionerTokens({ workspaceId, signal }) {
|
|
20
|
-
|
|
22
|
+
const response = await checkedApiRequest(listProvisionerTokensResponseSchema, `/workspaces/${workspaceId}/provisioners/tokens`, {
|
|
21
23
|
signal
|
|
22
24
|
});
|
|
25
|
+
return response.tokens.map(toProvisionerToken);
|
|
23
26
|
}
|
|
24
|
-
export async function createProvisionerToken({ workspaceId,
|
|
25
|
-
|
|
27
|
+
export async function createProvisionerToken({ workspaceId, command }) {
|
|
28
|
+
const response = await checkedApiRequest(createProvisionerTokenResponseSchema, `/workspaces/${workspaceId}/provisioners/tokens`, {
|
|
26
29
|
method: 'POST',
|
|
27
|
-
body
|
|
30
|
+
body: toCreateTokenBody(command)
|
|
28
31
|
});
|
|
32
|
+
return toCreatedProvisionerToken(response);
|
|
29
33
|
}
|
|
30
34
|
export async function revokeProvisionerToken({ workspaceId, tokenId }) {
|
|
31
|
-
|
|
35
|
+
const response = await checkedApiRequest(revokeProvisionerTokenResponseSchema, `/workspaces/${workspaceId}/provisioners/tokens/${tokenId}/revoke`, {
|
|
32
36
|
method: 'POST'
|
|
33
37
|
});
|
|
38
|
+
return toProvisionerToken(response);
|
|
34
39
|
}
|
|
35
40
|
export async function listActiveProvisioners({ workspaceId, signal }) {
|
|
36
|
-
|
|
41
|
+
const response = await checkedApiRequest(listActiveProvisionersResponseSchema, `/workspaces/${workspaceId}/provisioners/active`, {
|
|
37
42
|
signal
|
|
38
43
|
});
|
|
44
|
+
return response.provisioners.map(toActiveProvisioner);
|
|
39
45
|
}
|
|
40
|
-
export function
|
|
41
|
-
return
|
|
42
|
-
queryKey:
|
|
43
|
-
...provisionerTokenQueryKeys.all,
|
|
44
|
-
'tokens'
|
|
45
|
-
],
|
|
46
|
-
enabled: Boolean(workspaceId),
|
|
46
|
+
export function provisionerTokensQueryOptions(workspaceId) {
|
|
47
|
+
return queryOptions({
|
|
48
|
+
queryKey: provisionerTokenQueryKeys.list(workspaceId),
|
|
47
49
|
queryFn: ({ signal })=>listProvisionerTokens({
|
|
48
|
-
workspaceId
|
|
50
|
+
workspaceId,
|
|
49
51
|
signal
|
|
50
52
|
}),
|
|
51
53
|
refetchInterval: PROVISIONER_TOKEN_REFETCH_INTERVAL_MS,
|
|
52
54
|
refetchIntervalInBackground: false
|
|
53
55
|
});
|
|
54
56
|
}
|
|
55
|
-
export function
|
|
56
|
-
return
|
|
57
|
-
|
|
57
|
+
export function activeProvisionersQueryOptions(workspaceId) {
|
|
58
|
+
return queryOptions({
|
|
59
|
+
queryKey: provisionerTokenQueryKeys.active(workspaceId),
|
|
60
|
+
queryFn: ({ signal })=>listActiveProvisioners({
|
|
61
|
+
workspaceId,
|
|
62
|
+
signal
|
|
63
|
+
}),
|
|
64
|
+
refetchInterval: PROVISIONER_TOKEN_REFETCH_INTERVAL_MS,
|
|
65
|
+
refetchIntervalInBackground: false
|
|
58
66
|
});
|
|
59
67
|
}
|
|
60
|
-
export function
|
|
61
|
-
return
|
|
62
|
-
|
|
68
|
+
export function useProvisionerTokensQuery(workspaceId) {
|
|
69
|
+
return useQuery({
|
|
70
|
+
...provisionerTokensQueryOptions(workspaceId ?? ''),
|
|
71
|
+
enabled: Boolean(workspaceId)
|
|
63
72
|
});
|
|
64
73
|
}
|
|
65
74
|
export function useActiveProvisionersQuery(workspaceId) {
|
|
66
75
|
return useQuery({
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
76
|
+
...activeProvisionersQueryOptions(workspaceId ?? ''),
|
|
77
|
+
enabled: Boolean(workspaceId)
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
export function useCreateProvisionerTokenMutation(workspaceId) {
|
|
81
|
+
const queryClient = useQueryClient();
|
|
82
|
+
return useMutation({
|
|
83
|
+
mutationFn: (command)=>createProvisionerToken({
|
|
84
|
+
workspaceId,
|
|
85
|
+
command
|
|
75
86
|
}),
|
|
76
|
-
|
|
77
|
-
|
|
87
|
+
onSuccess: async ()=>{
|
|
88
|
+
await queryClient.invalidateQueries(provisionerTokensQueryOptions(workspaceId));
|
|
89
|
+
}
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
export function useRevokeProvisionerTokenMutation(workspaceId) {
|
|
93
|
+
const queryClient = useQueryClient();
|
|
94
|
+
return useMutation({
|
|
95
|
+
mutationFn: (tokenId)=>revokeProvisionerToken({
|
|
96
|
+
workspaceId,
|
|
97
|
+
tokenId
|
|
98
|
+
}),
|
|
99
|
+
onSuccess: async ()=>{
|
|
100
|
+
await Promise.all([
|
|
101
|
+
queryClient.invalidateQueries(provisionerTokensQueryOptions(workspaceId)),
|
|
102
|
+
queryClient.invalidateQueries(activeProvisionersQueryOptions(workspaceId))
|
|
103
|
+
]);
|
|
104
|
+
}
|
|
78
105
|
});
|
|
79
106
|
}
|
|
80
107
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/hooks/api/provisioner-tokens.ts"],"sourcesContent":["import
|
|
1
|
+
{"version":3,"sources":["../../../src/hooks/api/provisioner-tokens.ts"],"sourcesContent":["import {\n createProvisionerTokenResponseSchema,\n listActiveProvisionersResponseSchema,\n listProvisionerTokensResponseSchema,\n revokeProvisionerTokenResponseSchema,\n} from '@shipfox/api-runners-dto';\nimport {checkedApiRequest} from '@shipfox/client-api';\nimport {\n type FetchQueryOptions,\n queryOptions,\n useMutation,\n useQuery,\n useQueryClient,\n} from '@tanstack/react-query';\nimport type {\n ActiveProvisioner,\n CreatedProvisionerToken,\n CreateTokenCommand,\n ProvisionerToken,\n} from '#core/token.js';\nimport {\n toActiveProvisioner,\n toCreatedProvisionerToken,\n toCreateTokenBody,\n toProvisionerToken,\n} from './token-mapper.js';\n\nconst PROVISIONER_TOKEN_REFETCH_INTERVAL_MS = 30_000;\n\nexport const provisionerTokenQueryKeys = {\n all: ['provisioner-tokens'] as const,\n list: (workspaceId: string) => [...provisionerTokenQueryKeys.all, 'tokens', workspaceId] as const,\n active: (workspaceId: string) =>\n [...provisionerTokenQueryKeys.all, 'provisioners', workspaceId] as const,\n};\n\ntype ProvisionerTokensQueryOptions = FetchQueryOptions<\n ProvisionerToken[],\n Error,\n ProvisionerToken[],\n ReturnType<typeof provisionerTokenQueryKeys.list>\n>;\n\ntype ActiveProvisionersQueryOptions = FetchQueryOptions<\n ActiveProvisioner[],\n Error,\n ActiveProvisioner[],\n ReturnType<typeof provisionerTokenQueryKeys.active>\n>;\n\nexport async function listProvisionerTokens({\n workspaceId,\n signal,\n}: {\n workspaceId: string;\n signal?: AbortSignal;\n}): Promise<ProvisionerToken[]> {\n const response = await checkedApiRequest(\n listProvisionerTokensResponseSchema,\n `/workspaces/${workspaceId}/provisioners/tokens`,\n {signal},\n );\n return response.tokens.map(toProvisionerToken);\n}\n\nexport async function createProvisionerToken({\n workspaceId,\n command,\n}: {\n workspaceId: string;\n command: CreateTokenCommand;\n}): Promise<CreatedProvisionerToken> {\n const response = await checkedApiRequest(\n createProvisionerTokenResponseSchema,\n `/workspaces/${workspaceId}/provisioners/tokens`,\n {method: 'POST', body: toCreateTokenBody(command)},\n );\n return toCreatedProvisionerToken(response);\n}\n\nexport async function revokeProvisionerToken({\n workspaceId,\n tokenId,\n}: {\n workspaceId: string;\n tokenId: string;\n}): Promise<ProvisionerToken> {\n const response = await checkedApiRequest(\n revokeProvisionerTokenResponseSchema,\n `/workspaces/${workspaceId}/provisioners/tokens/${tokenId}/revoke`,\n {method: 'POST'},\n );\n return toProvisionerToken(response);\n}\n\nexport async function listActiveProvisioners({\n workspaceId,\n signal,\n}: {\n workspaceId: string;\n signal?: AbortSignal;\n}): Promise<ActiveProvisioner[]> {\n const response = await checkedApiRequest(\n listActiveProvisionersResponseSchema,\n `/workspaces/${workspaceId}/provisioners/active`,\n {signal},\n );\n return response.provisioners.map(toActiveProvisioner);\n}\n\nexport function provisionerTokensQueryOptions(workspaceId: string): ProvisionerTokensQueryOptions {\n return queryOptions({\n queryKey: provisionerTokenQueryKeys.list(workspaceId),\n queryFn: ({signal}) => listProvisionerTokens({workspaceId, signal}),\n refetchInterval: PROVISIONER_TOKEN_REFETCH_INTERVAL_MS,\n refetchIntervalInBackground: false,\n });\n}\n\nexport function activeProvisionersQueryOptions(\n workspaceId: string,\n): ActiveProvisionersQueryOptions {\n return queryOptions({\n queryKey: provisionerTokenQueryKeys.active(workspaceId),\n queryFn: ({signal}) => listActiveProvisioners({workspaceId, signal}),\n refetchInterval: PROVISIONER_TOKEN_REFETCH_INTERVAL_MS,\n refetchIntervalInBackground: false,\n });\n}\n\nexport function useProvisionerTokensQuery(workspaceId: string | undefined) {\n return useQuery({\n ...provisionerTokensQueryOptions(workspaceId ?? ''),\n enabled: Boolean(workspaceId),\n });\n}\n\nexport function useActiveProvisionersQuery(workspaceId: string | undefined) {\n return useQuery({\n ...activeProvisionersQueryOptions(workspaceId ?? ''),\n enabled: Boolean(workspaceId),\n });\n}\n\nexport function useCreateProvisionerTokenMutation(workspaceId: string) {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: (command: CreateTokenCommand) => createProvisionerToken({workspaceId, command}),\n onSuccess: async () => {\n await queryClient.invalidateQueries(provisionerTokensQueryOptions(workspaceId));\n },\n });\n}\n\nexport function useRevokeProvisionerTokenMutation(workspaceId: string) {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: (tokenId: string) => revokeProvisionerToken({workspaceId, tokenId}),\n onSuccess: async () => {\n await Promise.all([\n queryClient.invalidateQueries(provisionerTokensQueryOptions(workspaceId)),\n queryClient.invalidateQueries(activeProvisionersQueryOptions(workspaceId)),\n ]);\n },\n });\n}\n"],"names":["createProvisionerTokenResponseSchema","listActiveProvisionersResponseSchema","listProvisionerTokensResponseSchema","revokeProvisionerTokenResponseSchema","checkedApiRequest","queryOptions","useMutation","useQuery","useQueryClient","toActiveProvisioner","toCreatedProvisionerToken","toCreateTokenBody","toProvisionerToken","PROVISIONER_TOKEN_REFETCH_INTERVAL_MS","provisionerTokenQueryKeys","all","list","workspaceId","active","listProvisionerTokens","signal","response","tokens","map","createProvisionerToken","command","method","body","revokeProvisionerToken","tokenId","listActiveProvisioners","provisioners","provisionerTokensQueryOptions","queryKey","queryFn","refetchInterval","refetchIntervalInBackground","activeProvisionersQueryOptions","useProvisionerTokensQuery","enabled","Boolean","useActiveProvisionersQuery","useCreateProvisionerTokenMutation","queryClient","mutationFn","onSuccess","invalidateQueries","useRevokeProvisionerTokenMutation","Promise"],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { ActiveProvisionerDto, CreateManualRegistrationTokenResponseDto, CreateProvisionerTokenResponseDto, ManualRegistrationTokenDto, ProvisionerTokenDto } from '@shipfox/api-runners-dto';
|
|
2
|
+
import type { ActiveProvisioner, CreatedManualRegistrationToken, CreatedProvisionerToken, CreateTokenCommand, ManualRegistrationToken, ProvisionerToken } from '#core/token.js';
|
|
3
|
+
export declare function toCreateTokenBody(command: CreateTokenCommand): {
|
|
4
|
+
ttl_seconds?: number;
|
|
5
|
+
name?: string;
|
|
6
|
+
};
|
|
7
|
+
export declare function toManualRegistrationToken(dto: ManualRegistrationTokenDto): ManualRegistrationToken;
|
|
8
|
+
export declare function toProvisionerToken(dto: ProvisionerTokenDto): ProvisionerToken;
|
|
9
|
+
export declare function toActiveProvisioner(dto: ActiveProvisionerDto): ActiveProvisioner;
|
|
10
|
+
export declare function toCreatedManualRegistrationToken(dto: CreateManualRegistrationTokenResponseDto): CreatedManualRegistrationToken;
|
|
11
|
+
export declare function toCreatedProvisionerToken(dto: CreateProvisionerTokenResponseDto): CreatedProvisionerToken;
|
|
12
|
+
//# sourceMappingURL=token-mapper.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"token-mapper.d.ts","sourceRoot":"","sources":["../../../src/hooks/api/token-mapper.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,oBAAoB,EACpB,wCAAwC,EACxC,iCAAiC,EACjC,0BAA0B,EAC1B,mBAAmB,EACpB,MAAM,0BAA0B,CAAC;AAClC,OAAO,KAAK,EACV,iBAAiB,EACjB,8BAA8B,EAC9B,uBAAuB,EACvB,kBAAkB,EAClB,uBAAuB,EACvB,gBAAgB,EACjB,MAAM,gBAAgB,CAAC;AAExB,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,kBAAkB;;;EAO5D;AAED,wBAAgB,yBAAyB,CACvC,GAAG,EAAE,0BAA0B,GAC9B,uBAAuB,CAWzB;AAED,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,mBAAmB,GAAG,gBAAgB,CAO7E;AAED,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,oBAAoB,GAAG,iBAAiB,CAEhF;AAED,wBAAgB,gCAAgC,CAC9C,GAAG,EAAE,wCAAwC,GAC5C,8BAA8B,CAUhC;AAED,wBAAgB,yBAAyB,CACvC,GAAG,EAAE,iCAAiC,GACrC,uBAAuB,CASzB"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
export function toCreateTokenBody(command) {
|
|
2
|
+
return {
|
|
3
|
+
...command.name ? {
|
|
4
|
+
name: command.name
|
|
5
|
+
} : {},
|
|
6
|
+
...command.expiration.kind === 'expires-after' ? {
|
|
7
|
+
ttl_seconds: command.expiration.seconds
|
|
8
|
+
} : {}
|
|
9
|
+
};
|
|
10
|
+
}
|
|
11
|
+
export function toManualRegistrationToken(dto) {
|
|
12
|
+
return {
|
|
13
|
+
id: dto.id,
|
|
14
|
+
workspaceId: dto.workspace_id,
|
|
15
|
+
prefix: dto.prefix,
|
|
16
|
+
name: dto.name,
|
|
17
|
+
expiresAt: dto.expires_at,
|
|
18
|
+
revokedAt: dto.revoked_at,
|
|
19
|
+
createdAt: dto.created_at,
|
|
20
|
+
updatedAt: dto.updated_at
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
export function toProvisionerToken(dto) {
|
|
24
|
+
return {
|
|
25
|
+
...toManualRegistrationToken(dto),
|
|
26
|
+
createdByUserId: dto.created_by_user_id,
|
|
27
|
+
revokedByUserId: dto.revoked_by_user_id,
|
|
28
|
+
lastSeenAt: dto.last_seen_at
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
export function toActiveProvisioner(dto) {
|
|
32
|
+
return {
|
|
33
|
+
id: dto.id,
|
|
34
|
+
name: dto.name,
|
|
35
|
+
prefix: dto.prefix,
|
|
36
|
+
lastSeenAt: dto.last_seen_at
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
export function toCreatedManualRegistrationToken(dto) {
|
|
40
|
+
return {
|
|
41
|
+
token: dto.raw_token,
|
|
42
|
+
id: dto.id,
|
|
43
|
+
prefix: dto.prefix,
|
|
44
|
+
name: dto.name,
|
|
45
|
+
workspaceId: dto.workspace_id,
|
|
46
|
+
expiresAt: dto.expires_at,
|
|
47
|
+
createdAt: dto.created_at
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
export function toCreatedProvisionerToken(dto) {
|
|
51
|
+
return {
|
|
52
|
+
...toCreatedManualRegistrationToken(dto),
|
|
53
|
+
createdByUserId: dto.created_by_user_id,
|
|
54
|
+
revokedByUserId: dto.revoked_by_user_id,
|
|
55
|
+
revokedAt: dto.revoked_at,
|
|
56
|
+
lastSeenAt: dto.last_seen_at,
|
|
57
|
+
updatedAt: dto.updated_at
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
//# sourceMappingURL=token-mapper.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/hooks/api/token-mapper.ts"],"sourcesContent":["import type {\n ActiveProvisionerDto,\n CreateManualRegistrationTokenResponseDto,\n CreateProvisionerTokenResponseDto,\n ManualRegistrationTokenDto,\n ProvisionerTokenDto,\n} from '@shipfox/api-runners-dto';\nimport type {\n ActiveProvisioner,\n CreatedManualRegistrationToken,\n CreatedProvisionerToken,\n CreateTokenCommand,\n ManualRegistrationToken,\n ProvisionerToken,\n} from '#core/token.js';\n\nexport function toCreateTokenBody(command: CreateTokenCommand) {\n return {\n ...(command.name ? {name: command.name} : {}),\n ...(command.expiration.kind === 'expires-after'\n ? {ttl_seconds: command.expiration.seconds}\n : {}),\n };\n}\n\nexport function toManualRegistrationToken(\n dto: ManualRegistrationTokenDto,\n): ManualRegistrationToken {\n return {\n id: dto.id,\n workspaceId: dto.workspace_id,\n prefix: dto.prefix,\n name: dto.name,\n expiresAt: dto.expires_at,\n revokedAt: dto.revoked_at,\n createdAt: dto.created_at,\n updatedAt: dto.updated_at,\n };\n}\n\nexport function toProvisionerToken(dto: ProvisionerTokenDto): ProvisionerToken {\n return {\n ...toManualRegistrationToken(dto),\n createdByUserId: dto.created_by_user_id,\n revokedByUserId: dto.revoked_by_user_id,\n lastSeenAt: dto.last_seen_at,\n };\n}\n\nexport function toActiveProvisioner(dto: ActiveProvisionerDto): ActiveProvisioner {\n return {id: dto.id, name: dto.name, prefix: dto.prefix, lastSeenAt: dto.last_seen_at};\n}\n\nexport function toCreatedManualRegistrationToken(\n dto: CreateManualRegistrationTokenResponseDto,\n): CreatedManualRegistrationToken {\n return {\n token: dto.raw_token,\n id: dto.id,\n prefix: dto.prefix,\n name: dto.name,\n workspaceId: dto.workspace_id,\n expiresAt: dto.expires_at,\n createdAt: dto.created_at,\n };\n}\n\nexport function toCreatedProvisionerToken(\n dto: CreateProvisionerTokenResponseDto,\n): CreatedProvisionerToken {\n return {\n ...toCreatedManualRegistrationToken(dto),\n createdByUserId: dto.created_by_user_id,\n revokedByUserId: dto.revoked_by_user_id,\n revokedAt: dto.revoked_at,\n lastSeenAt: dto.last_seen_at,\n updatedAt: dto.updated_at,\n };\n}\n"],"names":["toCreateTokenBody","command","name","expiration","kind","ttl_seconds","seconds","toManualRegistrationToken","dto","id","workspaceId","workspace_id","prefix","expiresAt","expires_at","revokedAt","revoked_at","createdAt","created_at","updatedAt","updated_at","toProvisionerToken","createdByUserId","created_by_user_id","revokedByUserId","revoked_by_user_id","lastSeenAt","last_seen_at","toActiveProvisioner","toCreatedManualRegistrationToken","token","raw_token","toCreatedProvisionerToken"],"mappings":"AAgBA,OAAO,SAASA,kBAAkBC,OAA2B;IAC3D,OAAO;QACL,GAAIA,QAAQC,IAAI,GAAG;YAACA,MAAMD,QAAQC,IAAI;QAAA,IAAI,CAAC,CAAC;QAC5C,GAAID,QAAQE,UAAU,CAACC,IAAI,KAAK,kBAC5B;YAACC,aAAaJ,QAAQE,UAAU,CAACG,OAAO;QAAA,IACxC,CAAC,CAAC;IACR;AACF;AAEA,OAAO,SAASC,0BACdC,GAA+B;IAE/B,OAAO;QACLC,IAAID,IAAIC,EAAE;QACVC,aAAaF,IAAIG,YAAY;QAC7BC,QAAQJ,IAAII,MAAM;QAClBV,MAAMM,IAAIN,IAAI;QACdW,WAAWL,IAAIM,UAAU;QACzBC,WAAWP,IAAIQ,UAAU;QACzBC,WAAWT,IAAIU,UAAU;QACzBC,WAAWX,IAAIY,UAAU;IAC3B;AACF;AAEA,OAAO,SAASC,mBAAmBb,GAAwB;IACzD,OAAO;QACL,GAAGD,0BAA0BC,IAAI;QACjCc,iBAAiBd,IAAIe,kBAAkB;QACvCC,iBAAiBhB,IAAIiB,kBAAkB;QACvCC,YAAYlB,IAAImB,YAAY;IAC9B;AACF;AAEA,OAAO,SAASC,oBAAoBpB,GAAyB;IAC3D,OAAO;QAACC,IAAID,IAAIC,EAAE;QAAEP,MAAMM,IAAIN,IAAI;QAAEU,QAAQJ,IAAII,MAAM;QAAEc,YAAYlB,IAAImB,YAAY;IAAA;AACtF;AAEA,OAAO,SAASE,iCACdrB,GAA6C;IAE7C,OAAO;QACLsB,OAAOtB,IAAIuB,SAAS;QACpBtB,IAAID,IAAIC,EAAE;QACVG,QAAQJ,IAAII,MAAM;QAClBV,MAAMM,IAAIN,IAAI;QACdQ,aAAaF,IAAIG,YAAY;QAC7BE,WAAWL,IAAIM,UAAU;QACzBG,WAAWT,IAAIU,UAAU;IAC3B;AACF;AAEA,OAAO,SAASc,0BACdxB,GAAsC;IAEtC,OAAO;QACL,GAAGqB,iCAAiCrB,IAAI;QACxCc,iBAAiBd,IAAIe,kBAAkB;QACvCC,iBAAiBhB,IAAIiB,kBAAkB;QACvCV,WAAWP,IAAIQ,UAAU;QACzBU,YAAYlB,IAAImB,YAAY;QAC5BR,WAAWX,IAAIY,UAAU;IAC3B;AACF"}
|