@shipfox/client-runners 0.2.0

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.
Files changed (120) hide show
  1. package/.storybook/main.ts +1 -0
  2. package/.storybook/preview.css +4 -0
  3. package/.storybook/preview.tsx +64 -0
  4. package/.turbo/turbo-build.log +2 -0
  5. package/.turbo/turbo-type$colon$emit.log +1 -0
  6. package/.turbo/turbo-type.log +1 -0
  7. package/CHANGELOG.md +112 -0
  8. package/LICENSE +21 -0
  9. package/dist/components/create-manual-registration-token-form.d.ts +10 -0
  10. package/dist/components/create-manual-registration-token-form.d.ts.map +1 -0
  11. package/dist/components/create-manual-registration-token-form.js +206 -0
  12. package/dist/components/create-manual-registration-token-form.js.map +1 -0
  13. package/dist/components/create-provisioner-token-form.d.ts +10 -0
  14. package/dist/components/create-provisioner-token-form.d.ts.map +1 -0
  15. package/dist/components/create-provisioner-token-form.js +206 -0
  16. package/dist/components/create-provisioner-token-form.js.map +1 -0
  17. package/dist/components/form-errors.d.ts +6 -0
  18. package/dist/components/form-errors.d.ts.map +1 -0
  19. package/dist/components/form-errors.js +9 -0
  20. package/dist/components/form-errors.js.map +1 -0
  21. package/dist/components/manual-registration-token-errors.d.ts +2 -0
  22. package/dist/components/manual-registration-token-errors.d.ts.map +1 -0
  23. package/dist/components/manual-registration-token-errors.js +14 -0
  24. package/dist/components/manual-registration-token-errors.js.map +1 -0
  25. package/dist/components/manual-registration-token-format.d.ts +5 -0
  26. package/dist/components/manual-registration-token-format.d.ts.map +1 -0
  27. package/dist/components/manual-registration-token-format.js +14 -0
  28. package/dist/components/manual-registration-token-format.js.map +1 -0
  29. package/dist/components/manual-registration-token-list.d.ts +8 -0
  30. package/dist/components/manual-registration-token-list.d.ts.map +1 -0
  31. package/dist/components/manual-registration-token-list.js +293 -0
  32. package/dist/components/manual-registration-token-list.js.map +1 -0
  33. package/dist/components/manual-registration-tokens-settings-section.d.ts +4 -0
  34. package/dist/components/manual-registration-tokens-settings-section.d.ts.map +1 -0
  35. package/dist/components/manual-registration-tokens-settings-section.js +109 -0
  36. package/dist/components/manual-registration-tokens-settings-section.js.map +1 -0
  37. package/dist/components/provisioner-token-errors.d.ts +2 -0
  38. package/dist/components/provisioner-token-errors.d.ts.map +1 -0
  39. package/dist/components/provisioner-token-errors.js +13 -0
  40. package/dist/components/provisioner-token-errors.js.map +1 -0
  41. package/dist/components/provisioner-token-form-errors.d.ts +6 -0
  42. package/dist/components/provisioner-token-form-errors.d.ts.map +1 -0
  43. package/dist/components/provisioner-token-form-errors.js +9 -0
  44. package/dist/components/provisioner-token-form-errors.js.map +1 -0
  45. package/dist/components/provisioner-token-format.d.ts +21 -0
  46. package/dist/components/provisioner-token-format.d.ts.map +1 -0
  47. package/dist/components/provisioner-token-format.js +36 -0
  48. package/dist/components/provisioner-token-format.js.map +1 -0
  49. package/dist/components/provisioner-token-list.d.ts +9 -0
  50. package/dist/components/provisioner-token-list.d.ts.map +1 -0
  51. package/dist/components/provisioner-token-list.js +344 -0
  52. package/dist/components/provisioner-token-list.js.map +1 -0
  53. package/dist/components/provisioner-tokens-settings-section.d.ts +4 -0
  54. package/dist/components/provisioner-tokens-settings-section.d.ts.map +1 -0
  55. package/dist/components/provisioner-tokens-settings-section.js +117 -0
  56. package/dist/components/provisioner-tokens-settings-section.js.map +1 -0
  57. package/dist/components/token-date.d.ts +6 -0
  58. package/dist/components/token-date.d.ts.map +1 -0
  59. package/dist/components/token-date.js +27 -0
  60. package/dist/components/token-date.js.map +1 -0
  61. package/dist/components/token-expiration-select.d.ts +11 -0
  62. package/dist/components/token-expiration-select.d.ts.map +1 -0
  63. package/dist/components/token-expiration-select.js +68 -0
  64. package/dist/components/token-expiration-select.js.map +1 -0
  65. package/dist/components/token-name.d.ts +4 -0
  66. package/dist/components/token-name.d.ts.map +1 -0
  67. package/dist/components/token-name.js +24 -0
  68. package/dist/components/token-name.js.map +1 -0
  69. package/dist/components/token-settings-sections.stories.d.ts +26 -0
  70. package/dist/components/token-settings-sections.stories.d.ts.map +1 -0
  71. package/dist/components/token-settings-sections.stories.js +370 -0
  72. package/dist/components/token-settings-sections.stories.js.map +1 -0
  73. package/dist/hooks/api/manual-registration-tokens.d.ts +83 -0
  74. package/dist/hooks/api/manual-registration-tokens.d.ts.map +1 -0
  75. package/dist/hooks/api/manual-registration-tokens.js +53 -0
  76. package/dist/hooks/api/manual-registration-tokens.js.map +1 -0
  77. package/dist/hooks/api/provisioner-tokens.d.ts +125 -0
  78. package/dist/hooks/api/provisioner-tokens.d.ts.map +1 -0
  79. package/dist/hooks/api/provisioner-tokens.js +81 -0
  80. package/dist/hooks/api/provisioner-tokens.js.map +1 -0
  81. package/dist/index.d.ts +5 -0
  82. package/dist/index.d.ts.map +1 -0
  83. package/dist/index.js +6 -0
  84. package/dist/index.js.map +1 -0
  85. package/dist/tsconfig.test.tsbuildinfo +1 -0
  86. package/package.json +88 -0
  87. package/src/components/create-manual-registration-token-form.tsx +197 -0
  88. package/src/components/create-provisioner-token-form.tsx +193 -0
  89. package/src/components/form-errors.test.ts +24 -0
  90. package/src/components/form-errors.ts +9 -0
  91. package/src/components/manual-registration-token-errors.ts +13 -0
  92. package/src/components/manual-registration-token-format.test.ts +48 -0
  93. package/src/components/manual-registration-token-format.ts +18 -0
  94. package/src/components/manual-registration-token-list.tsx +246 -0
  95. package/src/components/manual-registration-tokens-settings-section.test.tsx +251 -0
  96. package/src/components/manual-registration-tokens-settings-section.tsx +110 -0
  97. package/src/components/provisioner-token-errors.ts +12 -0
  98. package/src/components/provisioner-token-form-errors.test.ts +35 -0
  99. package/src/components/provisioner-token-form-errors.ts +9 -0
  100. package/src/components/provisioner-token-format.test.ts +96 -0
  101. package/src/components/provisioner-token-format.ts +40 -0
  102. package/src/components/provisioner-token-list.tsx +280 -0
  103. package/src/components/provisioner-tokens-settings-section.test.tsx +362 -0
  104. package/src/components/provisioner-tokens-settings-section.tsx +114 -0
  105. package/src/components/token-date.tsx +27 -0
  106. package/src/components/token-expiration-select.tsx +64 -0
  107. package/src/components/token-name.tsx +19 -0
  108. package/src/components/token-settings-sections.stories.tsx +360 -0
  109. package/src/hooks/api/manual-registration-tokens.test.ts +87 -0
  110. package/src/hooks/api/manual-registration-tokens.ts +71 -0
  111. package/src/hooks/api/provisioner-tokens.test.ts +127 -0
  112. package/src/hooks/api/provisioner-tokens.ts +102 -0
  113. package/src/index.ts +4 -0
  114. package/test/setup.ts +3 -0
  115. package/tsconfig.build.json +9 -0
  116. package/tsconfig.build.tsbuildinfo +1 -0
  117. package/tsconfig.json +3 -0
  118. package/tsconfig.test.json +8 -0
  119. package/vercel.json +8 -0
  120. package/vitest.config.ts +74 -0
@@ -0,0 +1,68 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useFormField } from '@shipfox/react-ui/form-field';
3
+ import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@shipfox/react-ui/select';
4
+ export const expirationOptions = [
5
+ {
6
+ value: '86400',
7
+ label: '1 day'
8
+ },
9
+ {
10
+ value: '604800',
11
+ label: '7 days'
12
+ },
13
+ {
14
+ value: '2592000',
15
+ label: '30 days'
16
+ },
17
+ {
18
+ value: '7776000',
19
+ label: '90 days'
20
+ },
21
+ {
22
+ value: '15552000',
23
+ label: '180 days'
24
+ },
25
+ {
26
+ value: '31536000',
27
+ label: '1 year'
28
+ },
29
+ {
30
+ value: 'never',
31
+ label: 'Never'
32
+ }
33
+ ];
34
+ export function expirationHint(expiration) {
35
+ if (expiration === 'never') return 'Token will not expire.';
36
+ const expiresAt = new Date(Date.now() + Number(expiration) * 1000);
37
+ const formatted = new Intl.DateTimeFormat(undefined, {
38
+ dateStyle: 'medium'
39
+ }).format(expiresAt);
40
+ return `Expires on ${formatted}.`;
41
+ }
42
+ export function ExpirationSelect({ value, onValueChange }) {
43
+ const wiring = useFormField();
44
+ return /*#__PURE__*/ _jsxs(Select, {
45
+ value: value,
46
+ onValueChange: (next)=>onValueChange(next),
47
+ children: [
48
+ /*#__PURE__*/ _jsx(SelectTrigger, {
49
+ id: wiring.id,
50
+ "aria-invalid": wiring['aria-invalid'],
51
+ "aria-describedby": wiring['aria-describedby'],
52
+ "aria-label": "Token expiration",
53
+ className: "w-full",
54
+ children: /*#__PURE__*/ _jsx(SelectValue, {
55
+ placeholder: "Select expiration"
56
+ })
57
+ }),
58
+ /*#__PURE__*/ _jsx(SelectContent, {
59
+ children: expirationOptions.map((option)=>/*#__PURE__*/ _jsx(SelectItem, {
60
+ value: option.value,
61
+ children: option.label
62
+ }, option.value))
63
+ })
64
+ ]
65
+ });
66
+ }
67
+
68
+ //# sourceMappingURL=token-expiration-select.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/components/token-expiration-select.tsx"],"sourcesContent":["import {useFormField} from '@shipfox/react-ui/form-field';\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from '@shipfox/react-ui/select';\n\nexport type TokenExpirationOption =\n | '86400'\n | '604800'\n | '2592000'\n | '7776000'\n | '15552000'\n | '31536000'\n | 'never';\n\nexport const expirationOptions: Array<{value: TokenExpirationOption; label: string}> = [\n {value: '86400', label: '1 day'},\n {value: '604800', label: '7 days'},\n {value: '2592000', label: '30 days'},\n {value: '7776000', label: '90 days'},\n {value: '15552000', label: '180 days'},\n {value: '31536000', label: '1 year'},\n {value: 'never', label: 'Never'},\n];\n\nexport function expirationHint(expiration: TokenExpirationOption): string {\n if (expiration === 'never') return 'Token will not expire.';\n const expiresAt = new Date(Date.now() + Number(expiration) * 1000);\n const formatted = new Intl.DateTimeFormat(undefined, {dateStyle: 'medium'}).format(expiresAt);\n return `Expires on ${formatted}.`;\n}\n\nexport function ExpirationSelect({\n value,\n onValueChange,\n}: {\n value: TokenExpirationOption;\n onValueChange: (next: TokenExpirationOption) => void;\n}) {\n const wiring = useFormField();\n return (\n <Select value={value} onValueChange={(next) => onValueChange(next as TokenExpirationOption)}>\n <SelectTrigger\n id={wiring.id}\n aria-invalid={wiring['aria-invalid']}\n aria-describedby={wiring['aria-describedby']}\n aria-label=\"Token expiration\"\n className=\"w-full\"\n >\n <SelectValue placeholder=\"Select expiration\" />\n </SelectTrigger>\n <SelectContent>\n {expirationOptions.map((option) => (\n <SelectItem key={option.value} value={option.value}>\n {option.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n );\n}\n"],"names":["useFormField","Select","SelectContent","SelectItem","SelectTrigger","SelectValue","expirationOptions","value","label","expirationHint","expiration","expiresAt","Date","now","Number","formatted","Intl","DateTimeFormat","undefined","dateStyle","format","ExpirationSelect","onValueChange","wiring","next","id","aria-invalid","aria-describedby","aria-label","className","placeholder","map","option"],"mappings":";AAAA,SAAQA,YAAY,QAAO,+BAA+B;AAC1D,SACEC,MAAM,EACNC,aAAa,EACbC,UAAU,EACVC,aAAa,EACbC,WAAW,QACN,2BAA2B;AAWlC,OAAO,MAAMC,oBAA0E;IACrF;QAACC,OAAO;QAASC,OAAO;IAAO;IAC/B;QAACD,OAAO;QAAUC,OAAO;IAAQ;IACjC;QAACD,OAAO;QAAWC,OAAO;IAAS;IACnC;QAACD,OAAO;QAAWC,OAAO;IAAS;IACnC;QAACD,OAAO;QAAYC,OAAO;IAAU;IACrC;QAACD,OAAO;QAAYC,OAAO;IAAQ;IACnC;QAACD,OAAO;QAASC,OAAO;IAAO;CAChC,CAAC;AAEF,OAAO,SAASC,eAAeC,UAAiC;IAC9D,IAAIA,eAAe,SAAS,OAAO;IACnC,MAAMC,YAAY,IAAIC,KAAKA,KAAKC,GAAG,KAAKC,OAAOJ,cAAc;IAC7D,MAAMK,YAAY,IAAIC,KAAKC,cAAc,CAACC,WAAW;QAACC,WAAW;IAAQ,GAAGC,MAAM,CAACT;IACnF,OAAO,CAAC,WAAW,EAAEI,UAAU,CAAC,CAAC;AACnC;AAEA,OAAO,SAASM,iBAAiB,EAC/Bd,KAAK,EACLe,aAAa,EAId;IACC,MAAMC,SAASvB;IACf,qBACE,MAACC;QAAOM,OAAOA;QAAOe,eAAe,CAACE,OAASF,cAAcE;;0BAC3D,KAACpB;gBACCqB,IAAIF,OAAOE,EAAE;gBACbC,gBAAcH,MAAM,CAAC,eAAe;gBACpCI,oBAAkBJ,MAAM,CAAC,mBAAmB;gBAC5CK,cAAW;gBACXC,WAAU;0BAEV,cAAA,KAACxB;oBAAYyB,aAAY;;;0BAE3B,KAAC5B;0BACEI,kBAAkByB,GAAG,CAAC,CAACC,uBACtB,KAAC7B;wBAA8BI,OAAOyB,OAAOzB,KAAK;kCAC/CyB,OAAOxB,KAAK;uBADEwB,OAAOzB,KAAK;;;;AAOvC"}
@@ -0,0 +1,4 @@
1
+ export declare function TokenName({ name }: {
2
+ name: string;
3
+ }): import("react").JSX.Element;
4
+ //# sourceMappingURL=token-name.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token-name.d.ts","sourceRoot":"","sources":["../../src/components/token-name.tsx"],"names":[],"mappings":"AAEA,wBAAgB,SAAS,CAAC,EAAC,IAAI,EAAC,EAAE;IAAC,IAAI,EAAE,MAAM,CAAA;CAAC,+BAgB/C"}
@@ -0,0 +1,24 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Tooltip, TooltipContent, TooltipTrigger } from '@shipfox/react-ui/tooltip';
3
+ export function TokenName({ name }) {
4
+ return /*#__PURE__*/ _jsxs(Tooltip, {
5
+ children: [
6
+ /*#__PURE__*/ _jsx(TooltipTrigger, {
7
+ asChild: true,
8
+ children: /*#__PURE__*/ _jsx("button", {
9
+ type: "button",
10
+ className: "block w-full min-w-0 cursor-help truncate rounded-4 text-left text-sm leading-20 font-medium text-foreground-neutral-base outline-none focus-visible:shadow-button-neutral-focus",
11
+ children: name
12
+ })
13
+ }),
14
+ /*#__PURE__*/ _jsx(TooltipContent, {
15
+ children: /*#__PURE__*/ _jsx("span", {
16
+ className: "block max-w-[360px] break-words",
17
+ children: name
18
+ })
19
+ })
20
+ ]
21
+ });
22
+ }
23
+
24
+ //# sourceMappingURL=token-name.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/components/token-name.tsx"],"sourcesContent":["import {Tooltip, TooltipContent, TooltipTrigger} from '@shipfox/react-ui/tooltip';\n\nexport function TokenName({name}: {name: string}) {\n return (\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n type=\"button\"\n className=\"block w-full min-w-0 cursor-help truncate rounded-4 text-left text-sm leading-20 font-medium text-foreground-neutral-base outline-none focus-visible:shadow-button-neutral-focus\"\n >\n {name}\n </button>\n </TooltipTrigger>\n <TooltipContent>\n <span className=\"block max-w-[360px] break-words\">{name}</span>\n </TooltipContent>\n </Tooltip>\n );\n}\n"],"names":["Tooltip","TooltipContent","TooltipTrigger","TokenName","name","asChild","button","type","className","span"],"mappings":";AAAA,SAAQA,OAAO,EAAEC,cAAc,EAAEC,cAAc,QAAO,4BAA4B;AAElF,OAAO,SAASC,UAAU,EAACC,IAAI,EAAiB;IAC9C,qBACE,MAACJ;;0BACC,KAACE;gBAAeG,OAAO;0BACrB,cAAA,KAACC;oBACCC,MAAK;oBACLC,WAAU;8BAETJ;;;0BAGL,KAACH;0BACC,cAAA,KAACQ;oBAAKD,WAAU;8BAAmCJ;;;;;AAI3D"}
@@ -0,0 +1,26 @@
1
+ import type { Decorator, StoryObj } from '@storybook/react';
2
+ type Scenario = 'populated' | 'empty' | 'loading' | 'errors';
3
+ interface TokenSettingsSectionsStoryProps {
4
+ scenario: Scenario;
5
+ }
6
+ declare function TokenSettingsSectionsStory({ scenario }: TokenSettingsSectionsStoryProps): import("react").JSX.Element;
7
+ declare const meta: {
8
+ title: string;
9
+ component: typeof TokenSettingsSectionsStory;
10
+ parameters: {
11
+ layout: string;
12
+ };
13
+ decorators: Decorator[];
14
+ args: {
15
+ scenario: "populated";
16
+ };
17
+ };
18
+ export default meta;
19
+ type Story = StoryObj<typeof meta>;
20
+ export declare const Playground: Story;
21
+ export declare const DataStates: Story;
22
+ export declare const Errors: Story;
23
+ export declare const Statuses: Story;
24
+ export declare const Content: Story;
25
+ export declare const CreatedTokenPanels: Story;
26
+ //# sourceMappingURL=token-settings-sections.stories.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token-settings-sections.stories.d.ts","sourceRoot":"","sources":["../../src/components/token-settings-sections.stories.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAC,SAAS,EAAQ,QAAQ,EAAC,MAAM,kBAAkB,CAAC;AAyBhE,KAAK,QAAQ,GAAG,WAAW,GAAG,OAAO,GAAG,SAAS,GAAG,QAAQ,CAAC;AAE7D,UAAU,+BAA+B;IACvC,QAAQ,EAAE,QAAQ,CAAC;CACpB;AAcD,iBAAS,0BAA0B,CAAC,EAAC,QAAQ,EAAC,EAAE,+BAA+B,+BAY9E;AAED,QAAA,MAAM,IAAI;;;;;;;;;;CAMyC,CAAC;AAEpD,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,IAAI,CAAC,CAAC;AAEnC,eAAO,MAAM,UAAU,EAAE,KAQxB,CAAC;AAEF,eAAO,MAAM,UAAU,EAAE,KAiBxB,CAAC;AAEF,eAAO,MAAM,MAAM,EAAE,KAOpB,CAAC;AAEF,eAAO,MAAM,QAAQ,EAAE,KAgCtB,CAAC;AAEF,eAAO,MAAM,OAAO,EAAE,KAkDrB,CAAC;AAEF,eAAO,MAAM,kBAAkB,EAAE,KA0BhC,CAAC"}
@@ -0,0 +1,370 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { configureApiClient } from '@shipfox/client-api';
3
+ import { RelativeTimeProvider } from '@shipfox/react-ui/relative-time';
4
+ import { Toaster } from '@shipfox/react-ui/toast';
5
+ import { Code } from '@shipfox/react-ui/typography';
6
+ import { QueryClient, QueryClientProvider } from '@tanstack/react-query';
7
+ import { within } from 'storybook/test';
8
+ import { CreatedManualRegistrationTokenPanel } from './create-manual-registration-token-form.js';
9
+ import { CreatedProvisionerTokenPanel } from './create-provisioner-token-form.js';
10
+ import { EmptyManualRegistrationTokens, ManualRegistrationTokenList, ManualRegistrationTokenTableSkeleton } from './manual-registration-token-list.js';
11
+ import { WorkspaceManualRegistrationTokensSettingsSection } from './manual-registration-tokens-settings-section.js';
12
+ import { EmptyProvisionerTokens, ProvisionerTokenList, ProvisionerTokenTableSkeleton } from './provisioner-token-list.js';
13
+ import { WorkspaceProvisionerTokensSettingsSection } from './provisioner-tokens-settings-section.js';
14
+ const WORKSPACE_ID = '11111111-1111-4111-8111-111111111111';
15
+ const NOW = '2026-06-26T12:00:00.000Z';
16
+ const EIGHT_MINUTES_AGO = '2026-06-26T11:52:00.000Z';
17
+ const EXPIRES_AT = '2026-09-24T12:00:00.000Z';
18
+ const CREATED_AT = '2026-06-20T12:00:00.000Z';
19
+ const withQueryClient = (Story)=>{
20
+ const queryClient = new QueryClient({
21
+ defaultOptions: {
22
+ queries: {
23
+ retry: false
24
+ }
25
+ }
26
+ });
27
+ return /*#__PURE__*/ _jsxs(QueryClientProvider, {
28
+ client: queryClient,
29
+ children: [
30
+ /*#__PURE__*/ _jsx(RelativeTimeProvider, {
31
+ children: /*#__PURE__*/ _jsx(Story, {})
32
+ }),
33
+ /*#__PURE__*/ _jsx(Toaster, {})
34
+ ]
35
+ });
36
+ };
37
+ function TokenSettingsSectionsStory({ scenario }) {
38
+ configureApiClient({
39
+ baseUrl: 'https://api.example.test',
40
+ fetchImpl: fetchForScenario(scenario)
41
+ });
42
+ return /*#__PURE__*/ _jsxs(StorySurface, {
43
+ children: [
44
+ /*#__PURE__*/ _jsx(WorkspaceManualRegistrationTokensSettingsSection, {
45
+ workspaceId: WORKSPACE_ID
46
+ }),
47
+ /*#__PURE__*/ _jsx(WorkspaceProvisionerTokensSettingsSection, {
48
+ workspaceId: WORKSPACE_ID
49
+ })
50
+ ]
51
+ });
52
+ }
53
+ const meta = {
54
+ title: 'Runners/TokenSettingsSections',
55
+ component: TokenSettingsSectionsStory,
56
+ parameters: {
57
+ layout: 'fullscreen'
58
+ },
59
+ decorators: [
60
+ withQueryClient
61
+ ],
62
+ args: {
63
+ scenario: 'populated'
64
+ }
65
+ };
66
+ export default meta;
67
+ export const Playground = {
68
+ play: async ({ canvasElement })=>{
69
+ const canvas = within(canvasElement);
70
+ await canvas.findAllByText('Deploy runner');
71
+ await canvas.findAllByText('Docker autoscaler');
72
+ await canvas.findAllByText('Connected');
73
+ await canvas.findAllByText('Never connected');
74
+ }
75
+ };
76
+ export const DataStates = {
77
+ render: ()=>/*#__PURE__*/ _jsxs(StorySurface, {
78
+ children: [
79
+ /*#__PURE__*/ _jsx(StateExample, {
80
+ label: "Manual empty",
81
+ children: /*#__PURE__*/ _jsx(EmptyManualRegistrationTokens, {})
82
+ }),
83
+ /*#__PURE__*/ _jsx(StateExample, {
84
+ label: "Manual loading",
85
+ children: /*#__PURE__*/ _jsx(ManualRegistrationTokenTableSkeleton, {})
86
+ }),
87
+ /*#__PURE__*/ _jsx(StateExample, {
88
+ label: "Provisioner empty",
89
+ children: /*#__PURE__*/ _jsx(EmptyProvisionerTokens, {})
90
+ }),
91
+ /*#__PURE__*/ _jsx(StateExample, {
92
+ label: "Provisioner loading",
93
+ children: /*#__PURE__*/ _jsx(ProvisionerTokenTableSkeleton, {})
94
+ })
95
+ ]
96
+ })
97
+ };
98
+ export const Errors = {
99
+ args: {
100
+ scenario: 'errors'
101
+ },
102
+ play: async ({ canvasElement })=>{
103
+ const canvas = within(canvasElement);
104
+ await canvas.findByText("Couldn't load manual registration tokens");
105
+ await canvas.findByText("Couldn't load provisioner registration tokens");
106
+ }
107
+ };
108
+ export const Statuses = {
109
+ render: ()=>/*#__PURE__*/ _jsx(StorySurface, {
110
+ children: /*#__PURE__*/ _jsx(ProvisionerTokenList, {
111
+ workspaceId: WORKSPACE_ID,
112
+ tokens: [
113
+ provisionerToken({
114
+ id: '33333333-3333-4333-8333-333333333333',
115
+ name: 'Docker autoscaler',
116
+ last_seen_at: NOW
117
+ }),
118
+ provisionerToken({
119
+ id: '44444444-4444-4444-8444-444444444444',
120
+ name: 'Kubernetes spot pool',
121
+ last_seen_at: EIGHT_MINUTES_AGO
122
+ }),
123
+ provisionerToken({
124
+ id: '55555555-5555-4555-8555-555555555555',
125
+ name: 'Buildkite migration pool',
126
+ last_seen_at: null
127
+ })
128
+ ],
129
+ activeIds: new Set([
130
+ '33333333-3333-4333-8333-333333333333'
131
+ ])
132
+ })
133
+ }),
134
+ play: async ({ canvasElement })=>{
135
+ const canvas = within(canvasElement);
136
+ await canvas.findAllByText('Connected');
137
+ await canvas.findAllByText('Last seen');
138
+ await canvas.findAllByText('Never connected');
139
+ }
140
+ };
141
+ export const Content = {
142
+ render: ()=>/*#__PURE__*/ _jsxs(StorySurface, {
143
+ children: [
144
+ /*#__PURE__*/ _jsx(StateExample, {
145
+ label: "Existing tokens",
146
+ children: /*#__PURE__*/ _jsxs("div", {
147
+ className: "flex flex-col gap-24",
148
+ children: [
149
+ /*#__PURE__*/ _jsx(ManualRegistrationTokenList, {
150
+ workspaceId: WORKSPACE_ID,
151
+ tokens: [
152
+ manualToken({
153
+ name: 'Deploy runner',
154
+ prefix: 'sf_mrt_deploy'
155
+ }),
156
+ manualToken({
157
+ id: '66666666-6666-4666-8666-666666666666',
158
+ name: 'macOS build host',
159
+ prefix: 'sf_mrt_macos',
160
+ expires_at: null
161
+ })
162
+ ]
163
+ }),
164
+ /*#__PURE__*/ _jsx(ProvisionerTokenList, {
165
+ workspaceId: WORKSPACE_ID,
166
+ tokens: provisionerTokens(),
167
+ activeIds: new Set([
168
+ '33333333-3333-4333-8333-333333333333'
169
+ ])
170
+ })
171
+ ]
172
+ })
173
+ }),
174
+ /*#__PURE__*/ _jsx(StateExample, {
175
+ label: "Long names",
176
+ children: /*#__PURE__*/ _jsxs("div", {
177
+ className: "flex flex-col gap-24",
178
+ children: [
179
+ /*#__PURE__*/ _jsx(ManualRegistrationTokenList, {
180
+ workspaceId: WORKSPACE_ID,
181
+ tokens: [
182
+ manualToken({
183
+ name: 'self-hosted-runner-for-production-release-candidate-validation-on-metal',
184
+ prefix: 'sf_mrt_release_candidate_validation'
185
+ })
186
+ ]
187
+ }),
188
+ /*#__PURE__*/ _jsx(ProvisionerTokenList, {
189
+ workspaceId: WORKSPACE_ID,
190
+ tokens: [
191
+ provisionerToken({
192
+ name: 'docker-provisioner-for-west-coast-gpu-burst-capacity-and-fallback',
193
+ prefix: 'sf_pt_west_coast_gpu_burst',
194
+ last_seen_at: EIGHT_MINUTES_AGO
195
+ })
196
+ ],
197
+ activeIds: new Set()
198
+ })
199
+ ]
200
+ })
201
+ })
202
+ ]
203
+ })
204
+ };
205
+ export const CreatedTokenPanels = {
206
+ render: ()=>/*#__PURE__*/ _jsxs(StorySurface, {
207
+ children: [
208
+ /*#__PURE__*/ _jsx(StateExample, {
209
+ label: "Manual token reveal",
210
+ children: /*#__PURE__*/ _jsx(CreatedManualRegistrationTokenPanel, {
211
+ token: {
212
+ id: '77777777-7777-4777-8777-777777777777',
213
+ raw_token: 'sf_mrt_4nJvNrs23ExampleManualTokenValue',
214
+ prefix: 'sf_mrt_4nJv',
215
+ name: 'Deploy runner',
216
+ workspace_id: WORKSPACE_ID,
217
+ expires_at: EXPIRES_AT,
218
+ created_at: CREATED_AT
219
+ }
220
+ })
221
+ }),
222
+ /*#__PURE__*/ _jsx(StateExample, {
223
+ label: "Provisioner token reveal",
224
+ children: /*#__PURE__*/ _jsx(CreatedProvisionerTokenPanel, {
225
+ token: {
226
+ ...provisionerToken({
227
+ name: 'Docker autoscaler'
228
+ }),
229
+ raw_token: 'sf_pt_Rv8YwrExampleProvisionerTokenValue'
230
+ }
231
+ })
232
+ })
233
+ ]
234
+ })
235
+ };
236
+ function StorySurface({ children }) {
237
+ return /*#__PURE__*/ _jsx("div", {
238
+ className: "min-h-screen bg-background-neutral-background p-24",
239
+ children: /*#__PURE__*/ _jsx("div", {
240
+ className: "mx-auto flex w-full max-w-[920px] flex-col gap-32",
241
+ children: children
242
+ })
243
+ });
244
+ }
245
+ function StateExample({ label, children }) {
246
+ return /*#__PURE__*/ _jsxs("div", {
247
+ className: "flex flex-col gap-8",
248
+ children: [
249
+ /*#__PURE__*/ _jsx(Code, {
250
+ variant: "label",
251
+ className: "text-foreground-neutral-subtle",
252
+ children: label
253
+ }),
254
+ /*#__PURE__*/ _jsx("div", {
255
+ className: "rounded-8 border border-border-neutral-base bg-background-neutral-base p-16",
256
+ children: children
257
+ })
258
+ ]
259
+ });
260
+ }
261
+ function fetchForScenario(scenario) {
262
+ return (input)=>{
263
+ const url = requestUrl(input);
264
+ if (scenario === 'loading') return new Promise(()=>undefined);
265
+ if (url.pathname.endsWith('/runners/manual-registration-tokens')) {
266
+ if (scenario === 'errors') return Promise.resolve(errorResponse());
267
+ return Promise.resolve(jsonResponse({
268
+ manual_registration_tokens: scenario === 'empty' ? [] : [
269
+ manualToken()
270
+ ]
271
+ }));
272
+ }
273
+ if (url.pathname.endsWith('/provisioners/tokens')) {
274
+ if (scenario === 'errors') return Promise.resolve(errorResponse());
275
+ return Promise.resolve(jsonResponse({
276
+ tokens: scenario === 'empty' ? [] : provisionerTokens()
277
+ }));
278
+ }
279
+ if (url.pathname.endsWith('/provisioners/active')) {
280
+ return Promise.resolve(jsonResponse({
281
+ provisioners: scenario === 'empty' ? [] : [
282
+ {
283
+ id: '33333333-3333-4333-8333-333333333333',
284
+ name: 'Docker autoscaler',
285
+ prefix: 'sf_pt_docker',
286
+ last_seen_at: NOW
287
+ }
288
+ ]
289
+ }));
290
+ }
291
+ return Promise.resolve(jsonResponse({}, {
292
+ status: 404
293
+ }));
294
+ };
295
+ }
296
+ function provisionerTokens() {
297
+ return [
298
+ provisionerToken({
299
+ id: '33333333-3333-4333-8333-333333333333',
300
+ name: 'Docker autoscaler',
301
+ prefix: 'sf_pt_docker',
302
+ last_seen_at: NOW
303
+ }),
304
+ provisionerToken({
305
+ id: '44444444-4444-4444-8444-444444444444',
306
+ name: 'Kubernetes spot pool',
307
+ prefix: 'sf_pt_spot',
308
+ last_seen_at: EIGHT_MINUTES_AGO
309
+ }),
310
+ provisionerToken({
311
+ id: '55555555-5555-4555-8555-555555555555',
312
+ name: 'Buildkite migration pool',
313
+ prefix: 'sf_pt_migrate',
314
+ last_seen_at: null
315
+ })
316
+ ];
317
+ }
318
+ function manualToken(overrides = {}) {
319
+ return {
320
+ id: '22222222-2222-4222-8222-222222222222',
321
+ workspace_id: WORKSPACE_ID,
322
+ prefix: 'sf_mrt_deploy',
323
+ name: 'Deploy runner',
324
+ expires_at: EXPIRES_AT,
325
+ revoked_at: null,
326
+ created_at: CREATED_AT,
327
+ updated_at: CREATED_AT,
328
+ ...overrides
329
+ };
330
+ }
331
+ function provisionerToken(overrides = {}) {
332
+ return {
333
+ id: '33333333-3333-4333-8333-333333333333',
334
+ workspace_id: WORKSPACE_ID,
335
+ prefix: 'sf_pt_docker',
336
+ name: 'Docker autoscaler',
337
+ created_by_user_id: '99999999-9999-4999-8999-999999999999',
338
+ revoked_by_user_id: null,
339
+ expires_at: EXPIRES_AT,
340
+ revoked_at: null,
341
+ last_seen_at: NOW,
342
+ created_at: CREATED_AT,
343
+ updated_at: CREATED_AT,
344
+ ...overrides
345
+ };
346
+ }
347
+ function requestUrl(input) {
348
+ if (typeof input === 'string') return new URL(input);
349
+ if (input instanceof URL) return input;
350
+ return new URL(input.url);
351
+ }
352
+ function jsonResponse(body, init = {}) {
353
+ return new Response(JSON.stringify(body), {
354
+ status: 200,
355
+ headers: {
356
+ 'content-type': 'application/json'
357
+ },
358
+ ...init
359
+ });
360
+ }
361
+ function errorResponse() {
362
+ return jsonResponse({
363
+ code: 'server-error'
364
+ }, {
365
+ status: 500,
366
+ statusText: 'Server error'
367
+ });
368
+ }
369
+
370
+ //# sourceMappingURL=token-settings-sections.stories.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/components/token-settings-sections.stories.tsx"],"sourcesContent":["import type {ManualRegistrationTokenDto, ProvisionerTokenDto} from '@shipfox/api-runners-dto';\nimport {configureApiClient} from '@shipfox/client-api';\nimport {RelativeTimeProvider} from '@shipfox/react-ui/relative-time';\nimport {Toaster} from '@shipfox/react-ui/toast';\nimport {Code} from '@shipfox/react-ui/typography';\nimport type {Decorator, Meta, StoryObj} from '@storybook/react';\nimport {QueryClient, QueryClientProvider} from '@tanstack/react-query';\nimport type {ReactNode} from 'react';\nimport {within} from 'storybook/test';\nimport {CreatedManualRegistrationTokenPanel} from './create-manual-registration-token-form.js';\nimport {CreatedProvisionerTokenPanel} from './create-provisioner-token-form.js';\nimport {\n EmptyManualRegistrationTokens,\n ManualRegistrationTokenList,\n ManualRegistrationTokenTableSkeleton,\n} from './manual-registration-token-list.js';\nimport {WorkspaceManualRegistrationTokensSettingsSection} from './manual-registration-tokens-settings-section.js';\nimport {\n EmptyProvisionerTokens,\n ProvisionerTokenList,\n ProvisionerTokenTableSkeleton,\n} from './provisioner-token-list.js';\nimport {WorkspaceProvisionerTokensSettingsSection} from './provisioner-tokens-settings-section.js';\n\nconst WORKSPACE_ID = '11111111-1111-4111-8111-111111111111';\nconst NOW = '2026-06-26T12:00:00.000Z';\nconst EIGHT_MINUTES_AGO = '2026-06-26T11:52:00.000Z';\nconst EXPIRES_AT = '2026-09-24T12:00:00.000Z';\nconst CREATED_AT = '2026-06-20T12:00:00.000Z';\n\ntype Scenario = 'populated' | 'empty' | 'loading' | 'errors';\n\ninterface TokenSettingsSectionsStoryProps {\n scenario: Scenario;\n}\n\nconst withQueryClient: Decorator = (Story) => {\n const queryClient = new QueryClient({defaultOptions: {queries: {retry: false}}});\n return (\n <QueryClientProvider client={queryClient}>\n <RelativeTimeProvider>\n <Story />\n </RelativeTimeProvider>\n <Toaster />\n </QueryClientProvider>\n );\n};\n\nfunction TokenSettingsSectionsStory({scenario}: TokenSettingsSectionsStoryProps) {\n configureApiClient({\n baseUrl: 'https://api.example.test',\n fetchImpl: fetchForScenario(scenario),\n });\n\n return (\n <StorySurface>\n <WorkspaceManualRegistrationTokensSettingsSection workspaceId={WORKSPACE_ID} />\n <WorkspaceProvisionerTokensSettingsSection workspaceId={WORKSPACE_ID} />\n </StorySurface>\n );\n}\n\nconst meta = {\n title: 'Runners/TokenSettingsSections',\n component: TokenSettingsSectionsStory,\n parameters: {layout: 'fullscreen'},\n decorators: [withQueryClient],\n args: {scenario: 'populated'},\n} satisfies Meta<typeof TokenSettingsSectionsStory>;\n\nexport default meta;\ntype Story = StoryObj<typeof meta>;\n\nexport const Playground: Story = {\n play: async ({canvasElement}) => {\n const canvas = within(canvasElement);\n await canvas.findAllByText('Deploy runner');\n await canvas.findAllByText('Docker autoscaler');\n await canvas.findAllByText('Connected');\n await canvas.findAllByText('Never connected');\n },\n};\n\nexport const DataStates: Story = {\n render: () => (\n <StorySurface>\n <StateExample label=\"Manual empty\">\n <EmptyManualRegistrationTokens />\n </StateExample>\n <StateExample label=\"Manual loading\">\n <ManualRegistrationTokenTableSkeleton />\n </StateExample>\n <StateExample label=\"Provisioner empty\">\n <EmptyProvisionerTokens />\n </StateExample>\n <StateExample label=\"Provisioner loading\">\n <ProvisionerTokenTableSkeleton />\n </StateExample>\n </StorySurface>\n ),\n};\n\nexport const Errors: Story = {\n args: {scenario: 'errors'},\n play: async ({canvasElement}) => {\n const canvas = within(canvasElement);\n await canvas.findByText(\"Couldn't load manual registration tokens\");\n await canvas.findByText(\"Couldn't load provisioner registration tokens\");\n },\n};\n\nexport const Statuses: Story = {\n render: () => (\n <StorySurface>\n <ProvisionerTokenList\n workspaceId={WORKSPACE_ID}\n tokens={[\n provisionerToken({\n id: '33333333-3333-4333-8333-333333333333',\n name: 'Docker autoscaler',\n last_seen_at: NOW,\n }),\n provisionerToken({\n id: '44444444-4444-4444-8444-444444444444',\n name: 'Kubernetes spot pool',\n last_seen_at: EIGHT_MINUTES_AGO,\n }),\n provisionerToken({\n id: '55555555-5555-4555-8555-555555555555',\n name: 'Buildkite migration pool',\n last_seen_at: null,\n }),\n ]}\n activeIds={new Set(['33333333-3333-4333-8333-333333333333'])}\n />\n </StorySurface>\n ),\n play: async ({canvasElement}) => {\n const canvas = within(canvasElement);\n await canvas.findAllByText('Connected');\n await canvas.findAllByText('Last seen');\n await canvas.findAllByText('Never connected');\n },\n};\n\nexport const Content: Story = {\n render: () => (\n <StorySurface>\n <StateExample label=\"Existing tokens\">\n <div className=\"flex flex-col gap-24\">\n <ManualRegistrationTokenList\n workspaceId={WORKSPACE_ID}\n tokens={[\n manualToken({name: 'Deploy runner', prefix: 'sf_mrt_deploy'}),\n manualToken({\n id: '66666666-6666-4666-8666-666666666666',\n name: 'macOS build host',\n prefix: 'sf_mrt_macos',\n expires_at: null,\n }),\n ]}\n />\n <ProvisionerTokenList\n workspaceId={WORKSPACE_ID}\n tokens={provisionerTokens()}\n activeIds={new Set(['33333333-3333-4333-8333-333333333333'])}\n />\n </div>\n </StateExample>\n <StateExample label=\"Long names\">\n <div className=\"flex flex-col gap-24\">\n <ManualRegistrationTokenList\n workspaceId={WORKSPACE_ID}\n tokens={[\n manualToken({\n name: 'self-hosted-runner-for-production-release-candidate-validation-on-metal',\n prefix: 'sf_mrt_release_candidate_validation',\n }),\n ]}\n />\n <ProvisionerTokenList\n workspaceId={WORKSPACE_ID}\n tokens={[\n provisionerToken({\n name: 'docker-provisioner-for-west-coast-gpu-burst-capacity-and-fallback',\n prefix: 'sf_pt_west_coast_gpu_burst',\n last_seen_at: EIGHT_MINUTES_AGO,\n }),\n ]}\n activeIds={new Set()}\n />\n </div>\n </StateExample>\n </StorySurface>\n ),\n};\n\nexport const CreatedTokenPanels: Story = {\n render: () => (\n <StorySurface>\n <StateExample label=\"Manual token reveal\">\n <CreatedManualRegistrationTokenPanel\n token={{\n id: '77777777-7777-4777-8777-777777777777',\n raw_token: 'sf_mrt_4nJvNrs23ExampleManualTokenValue',\n prefix: 'sf_mrt_4nJv',\n name: 'Deploy runner',\n workspace_id: WORKSPACE_ID,\n expires_at: EXPIRES_AT,\n created_at: CREATED_AT,\n }}\n />\n </StateExample>\n <StateExample label=\"Provisioner token reveal\">\n <CreatedProvisionerTokenPanel\n token={{\n ...provisionerToken({name: 'Docker autoscaler'}),\n raw_token: 'sf_pt_Rv8YwrExampleProvisionerTokenValue',\n }}\n />\n </StateExample>\n </StorySurface>\n ),\n};\n\nfunction StorySurface({children}: {children: ReactNode}) {\n return (\n <div className=\"min-h-screen bg-background-neutral-background p-24\">\n <div className=\"mx-auto flex w-full max-w-[920px] flex-col gap-32\">{children}</div>\n </div>\n );\n}\n\nfunction StateExample({label, children}: {label: string; children: ReactNode}) {\n return (\n <div className=\"flex flex-col gap-8\">\n <Code variant=\"label\" className=\"text-foreground-neutral-subtle\">\n {label}\n </Code>\n <div className=\"rounded-8 border border-border-neutral-base bg-background-neutral-base p-16\">\n {children}\n </div>\n </div>\n );\n}\n\nfunction fetchForScenario(scenario: Scenario): typeof fetch {\n return (input) => {\n const url = requestUrl(input);\n if (scenario === 'loading') return new Promise<Response>(() => undefined);\n if (url.pathname.endsWith('/runners/manual-registration-tokens')) {\n if (scenario === 'errors') return Promise.resolve(errorResponse());\n return Promise.resolve(\n jsonResponse({\n manual_registration_tokens: scenario === 'empty' ? [] : [manualToken()],\n }),\n );\n }\n if (url.pathname.endsWith('/provisioners/tokens')) {\n if (scenario === 'errors') return Promise.resolve(errorResponse());\n return Promise.resolve(\n jsonResponse({\n tokens: scenario === 'empty' ? [] : provisionerTokens(),\n }),\n );\n }\n if (url.pathname.endsWith('/provisioners/active')) {\n return Promise.resolve(\n jsonResponse({\n provisioners:\n scenario === 'empty'\n ? []\n : [\n {\n id: '33333333-3333-4333-8333-333333333333',\n name: 'Docker autoscaler',\n prefix: 'sf_pt_docker',\n last_seen_at: NOW,\n },\n ],\n }),\n );\n }\n return Promise.resolve(jsonResponse({}, {status: 404}));\n };\n}\n\nfunction provisionerTokens(): ProvisionerTokenDto[] {\n return [\n provisionerToken({\n id: '33333333-3333-4333-8333-333333333333',\n name: 'Docker autoscaler',\n prefix: 'sf_pt_docker',\n last_seen_at: NOW,\n }),\n provisionerToken({\n id: '44444444-4444-4444-8444-444444444444',\n name: 'Kubernetes spot pool',\n prefix: 'sf_pt_spot',\n last_seen_at: EIGHT_MINUTES_AGO,\n }),\n provisionerToken({\n id: '55555555-5555-4555-8555-555555555555',\n name: 'Buildkite migration pool',\n prefix: 'sf_pt_migrate',\n last_seen_at: null,\n }),\n ];\n}\n\nfunction manualToken(\n overrides: Partial<ManualRegistrationTokenDto> = {},\n): ManualRegistrationTokenDto {\n return {\n id: '22222222-2222-4222-8222-222222222222',\n workspace_id: WORKSPACE_ID,\n prefix: 'sf_mrt_deploy',\n name: 'Deploy runner',\n expires_at: EXPIRES_AT,\n revoked_at: null,\n created_at: CREATED_AT,\n updated_at: CREATED_AT,\n ...overrides,\n };\n}\n\nfunction provisionerToken(overrides: Partial<ProvisionerTokenDto> = {}): ProvisionerTokenDto {\n return {\n id: '33333333-3333-4333-8333-333333333333',\n workspace_id: WORKSPACE_ID,\n prefix: 'sf_pt_docker',\n name: 'Docker autoscaler',\n created_by_user_id: '99999999-9999-4999-8999-999999999999',\n revoked_by_user_id: null,\n expires_at: EXPIRES_AT,\n revoked_at: null,\n last_seen_at: NOW,\n created_at: CREATED_AT,\n updated_at: CREATED_AT,\n ...overrides,\n };\n}\n\nfunction requestUrl(input: RequestInfo | URL): URL {\n if (typeof input === 'string') return new URL(input);\n if (input instanceof URL) return input;\n return new URL(input.url);\n}\n\nfunction jsonResponse(body: unknown, init: ResponseInit = {}) {\n return new Response(JSON.stringify(body), {\n status: 200,\n headers: {'content-type': 'application/json'},\n ...init,\n });\n}\n\nfunction errorResponse() {\n return jsonResponse({code: 'server-error'}, {status: 500, statusText: 'Server error'});\n}\n"],"names":["configureApiClient","RelativeTimeProvider","Toaster","Code","QueryClient","QueryClientProvider","within","CreatedManualRegistrationTokenPanel","CreatedProvisionerTokenPanel","EmptyManualRegistrationTokens","ManualRegistrationTokenList","ManualRegistrationTokenTableSkeleton","WorkspaceManualRegistrationTokensSettingsSection","EmptyProvisionerTokens","ProvisionerTokenList","ProvisionerTokenTableSkeleton","WorkspaceProvisionerTokensSettingsSection","WORKSPACE_ID","NOW","EIGHT_MINUTES_AGO","EXPIRES_AT","CREATED_AT","withQueryClient","Story","queryClient","defaultOptions","queries","retry","client","TokenSettingsSectionsStory","scenario","baseUrl","fetchImpl","fetchForScenario","StorySurface","workspaceId","meta","title","component","parameters","layout","decorators","args","Playground","play","canvasElement","canvas","findAllByText","DataStates","render","StateExample","label","Errors","findByText","Statuses","tokens","provisionerToken","id","name","last_seen_at","activeIds","Set","Content","div","className","manualToken","prefix","expires_at","provisionerTokens","CreatedTokenPanels","token","raw_token","workspace_id","created_at","children","variant","input","url","requestUrl","Promise","undefined","pathname","endsWith","resolve","errorResponse","jsonResponse","manual_registration_tokens","provisioners","status","overrides","revoked_at","updated_at","created_by_user_id","revoked_by_user_id","URL","body","init","Response","JSON","stringify","headers","code","statusText"],"mappings":"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"}
@@ -0,0 +1,83 @@
1
+ import type { CreateManualRegistrationTokenBodyDto } from '@shipfox/api-runners-dto';
2
+ export declare const manualRegistrationTokenQueryKeys: {
3
+ all: readonly ["manual-registration-tokens"];
4
+ list: (workspaceId: string) => readonly ["manual-registration-tokens", "list", string];
5
+ };
6
+ export declare function listManualRegistrationTokens({ workspaceId, signal, }: {
7
+ workspaceId: string;
8
+ signal?: AbortSignal;
9
+ }): Promise<{
10
+ manual_registration_tokens: {
11
+ id: string;
12
+ workspace_id: string;
13
+ prefix: string;
14
+ name: string | null;
15
+ expires_at: string | null;
16
+ revoked_at: string | null;
17
+ created_at: string;
18
+ updated_at: string;
19
+ }[];
20
+ }>;
21
+ export declare function createManualRegistrationToken({ workspaceId, body, }: {
22
+ workspaceId: string;
23
+ body: CreateManualRegistrationTokenBodyDto;
24
+ }): Promise<{
25
+ id: string;
26
+ raw_token: string;
27
+ prefix: string;
28
+ name: string | null;
29
+ workspace_id: string;
30
+ expires_at: string | null;
31
+ created_at: string;
32
+ }>;
33
+ export declare function revokeManualRegistrationToken({ workspaceId, tokenId, }: {
34
+ workspaceId: string;
35
+ tokenId: string;
36
+ }): Promise<{
37
+ id: string;
38
+ workspace_id: string;
39
+ prefix: string;
40
+ name: string | null;
41
+ expires_at: string | null;
42
+ revoked_at: string | null;
43
+ created_at: string;
44
+ updated_at: string;
45
+ }>;
46
+ export declare function useManualRegistrationTokensQuery(workspaceId: string | undefined): import("@tanstack/react-query").UseQueryResult<NoInfer<{
47
+ manual_registration_tokens: {
48
+ id: string;
49
+ workspace_id: string;
50
+ prefix: string;
51
+ name: string | null;
52
+ expires_at: string | null;
53
+ revoked_at: string | null;
54
+ created_at: string;
55
+ updated_at: string;
56
+ }[];
57
+ }>, Error>;
58
+ export declare function useCreateManualRegistrationTokenMutation(): import("@tanstack/react-query").UseMutationResult<{
59
+ id: string;
60
+ raw_token: string;
61
+ prefix: string;
62
+ name: string | null;
63
+ workspace_id: string;
64
+ expires_at: string | null;
65
+ created_at: string;
66
+ }, Error, {
67
+ workspaceId: string;
68
+ body: CreateManualRegistrationTokenBodyDto;
69
+ }, unknown>;
70
+ export declare function useRevokeManualRegistrationTokenMutation(): import("@tanstack/react-query").UseMutationResult<{
71
+ id: string;
72
+ workspace_id: string;
73
+ prefix: string;
74
+ name: string | null;
75
+ expires_at: string | null;
76
+ revoked_at: string | null;
77
+ created_at: string;
78
+ updated_at: string;
79
+ }, Error, {
80
+ workspaceId: string;
81
+ tokenId: string;
82
+ }, unknown>;
83
+ //# sourceMappingURL=manual-registration-tokens.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manual-registration-tokens.d.ts","sourceRoot":"","sources":["../../../src/hooks/api/manual-registration-tokens.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,oCAAoC,EAIrC,MAAM,0BAA0B,CAAC;AAIlC,eAAO,MAAM,gCAAgC;;wBAEvB,MAAM;CAE3B,CAAC;AAEF,wBAAsB,4BAA4B,CAAC,EACjD,WAAW,EACX,MAAM,GACP,EAAE;IACD,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;;;;;;;;;;;GAKA;AAED,wBAAsB,6BAA6B,CAAC,EAClD,WAAW,EACX,IAAI,GACL,EAAE;IACD,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,oCAAoC,CAAC;CAC5C;;;;;;;;GAKA;AAED,wBAAsB,6BAA6B,CAAC,EAClD,WAAW,EACX,OAAO,GACR,EAAE;IACD,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;CACjB;;;;;;;;;GAKA;AAED,wBAAgB,gCAAgC,CAAC,WAAW,EAAE,MAAM,GAAG,SAAS;;;;;;;;;;;WAQ/E;AAED,wBAAgB,wCAAwC;;;;;;;;;iBAhCzC,MAAM;UACb,oCAAoC;YAiC3C;AAED,wBAAgB,wCAAwC;;;;;;;;;;iBAvBzC,MAAM;aACV,MAAM;YAwBhB"}