@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.
Files changed (94) hide show
  1. package/.turbo/turbo-build.log +1 -1
  2. package/CHANGELOG.md +49 -0
  3. package/dist/components/create-manual-registration-token-form.d.ts +3 -3
  4. package/dist/components/create-manual-registration-token-form.d.ts.map +1 -1
  5. package/dist/components/create-manual-registration-token-form.js +8 -23
  6. package/dist/components/create-manual-registration-token-form.js.map +1 -1
  7. package/dist/components/create-provisioner-token-form.d.ts +3 -3
  8. package/dist/components/create-provisioner-token-form.d.ts.map +1 -1
  9. package/dist/components/create-provisioner-token-form.js +8 -23
  10. package/dist/components/create-provisioner-token-form.js.map +1 -1
  11. package/dist/components/manual-registration-token-errors.d.ts.map +1 -1
  12. package/dist/components/manual-registration-token-errors.js +0 -1
  13. package/dist/components/manual-registration-token-errors.js.map +1 -1
  14. package/dist/components/manual-registration-token-format.d.ts +0 -2
  15. package/dist/components/manual-registration-token-format.d.ts.map +1 -1
  16. package/dist/components/manual-registration-token-format.js +0 -3
  17. package/dist/components/manual-registration-token-format.js.map +1 -1
  18. package/dist/components/manual-registration-token-list.d.ts +2 -2
  19. package/dist/components/manual-registration-token-list.d.ts.map +1 -1
  20. package/dist/components/manual-registration-token-list.js +12 -19
  21. package/dist/components/manual-registration-token-list.js.map +1 -1
  22. package/dist/components/manual-registration-tokens-settings-section.d.ts.map +1 -1
  23. package/dist/components/manual-registration-tokens-settings-section.js +1 -1
  24. package/dist/components/manual-registration-tokens-settings-section.js.map +1 -1
  25. package/dist/components/provisioner-token-errors.d.ts.map +1 -1
  26. package/dist/components/provisioner-token-errors.js +0 -1
  27. package/dist/components/provisioner-token-errors.js.map +1 -1
  28. package/dist/components/provisioner-token-format.d.ts +0 -18
  29. package/dist/components/provisioner-token-format.d.ts.map +1 -1
  30. package/dist/components/provisioner-token-format.js +0 -25
  31. package/dist/components/provisioner-token-format.js.map +1 -1
  32. package/dist/components/provisioner-token-list.d.ts +2 -2
  33. package/dist/components/provisioner-token-list.d.ts.map +1 -1
  34. package/dist/components/provisioner-token-list.js +9 -19
  35. package/dist/components/provisioner-token-list.js.map +1 -1
  36. package/dist/components/provisioner-tokens-settings-section.js +2 -2
  37. package/dist/components/provisioner-tokens-settings-section.js.map +1 -1
  38. package/dist/components/token-expiration-select.d.ts +7 -0
  39. package/dist/components/token-expiration-select.d.ts.map +1 -1
  40. package/dist/components/token-expiration-select.js +8 -0
  41. package/dist/components/token-expiration-select.js.map +1 -1
  42. package/dist/components/token-settings-sections.stories.d.ts.map +1 -1
  43. package/dist/components/token-settings-sections.stories.js +66 -23
  44. package/dist/components/token-settings-sections.stories.js.map +1 -1
  45. package/dist/core/token.d.ts +66 -0
  46. package/dist/core/token.d.ts.map +1 -0
  47. package/dist/core/token.js +37 -0
  48. package/dist/core/token.js.map +1 -0
  49. package/dist/feature.d.ts +13 -0
  50. package/dist/feature.d.ts.map +1 -1
  51. package/dist/feature.js +17 -16
  52. package/dist/feature.js.map +1 -1
  53. package/dist/hooks/api/manual-registration-tokens.d.ts +13 -71
  54. package/dist/hooks/api/manual-registration-tokens.d.ts.map +1 -1
  55. package/dist/hooks/api/manual-registration-tokens.js +40 -19
  56. package/dist/hooks/api/manual-registration-tokens.js.map +1 -1
  57. package/dist/hooks/api/provisioner-tokens.d.ts +17 -115
  58. package/dist/hooks/api/provisioner-tokens.d.ts.map +1 -1
  59. package/dist/hooks/api/provisioner-tokens.js +59 -32
  60. package/dist/hooks/api/provisioner-tokens.js.map +1 -1
  61. package/dist/hooks/api/token-mapper.d.ts +12 -0
  62. package/dist/hooks/api/token-mapper.d.ts.map +1 -0
  63. package/dist/hooks/api/token-mapper.js +61 -0
  64. package/dist/hooks/api/token-mapper.js.map +1 -0
  65. package/dist/tsconfig.test.tsbuildinfo +1 -1
  66. package/package.json +9 -9
  67. package/src/components/create-manual-registration-token-form.tsx +11 -21
  68. package/src/components/create-provisioner-token-form.tsx +11 -21
  69. package/src/components/form-errors.test.ts +2 -2
  70. package/src/components/manual-registration-token-errors.ts +0 -1
  71. package/src/components/manual-registration-token-format.test.ts +4 -4
  72. package/src/components/manual-registration-token-format.ts +0 -7
  73. package/src/components/manual-registration-token-list.tsx +13 -22
  74. package/src/components/manual-registration-tokens-settings-section.tsx +3 -5
  75. package/src/components/provisioner-token-errors.ts +0 -1
  76. package/src/components/provisioner-token-form-errors.test.ts +2 -2
  77. package/src/components/provisioner-token-format.test.ts +15 -14
  78. package/src/components/provisioner-token-format.ts +0 -29
  79. package/src/components/provisioner-token-list.tsx +14 -23
  80. package/src/components/provisioner-tokens-settings-section.tsx +4 -4
  81. package/src/components/token-expiration-select.test.ts +15 -0
  82. package/src/components/token-expiration-select.tsx +6 -0
  83. package/src/components/token-settings-sections.stories.tsx +72 -23
  84. package/src/core/token.test.ts +30 -0
  85. package/src/core/token.ts +83 -0
  86. package/src/feature.ts +19 -17
  87. package/src/hooks/api/manual-registration-tokens.test.ts +8 -5
  88. package/src/hooks/api/manual-registration-tokens.ts +71 -24
  89. package/src/hooks/api/provisioner-tokens.test.ts +10 -7
  90. package/src/hooks/api/provisioner-tokens.ts +100 -36
  91. package/src/hooks/api/token-mapper.test.ts +161 -0
  92. package/src/hooks/api/token-mapper.ts +79 -0
  93. package/tsconfig.build.tsbuildinfo +1 -1
  94. package/vercel.json +5 -0
@@ -1 +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 scope: 'workspace',\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","scope","created_by_user_id","revoked_by_user_id","URL","body","init","Response","JSON","stringify","headers","code","statusText"],"mappings":"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"}
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 type {\n CreatedProvisionerToken,\n ManualRegistrationToken,\n ProvisionerToken,\n} from '#core/token.js';\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 provisionerTokenModel({\n id: '33333333-3333-4333-8333-333333333333',\n name: 'Docker autoscaler',\n lastSeenAt: NOW,\n }),\n provisionerTokenModel({\n id: '44444444-4444-4444-8444-444444444444',\n name: 'Kubernetes spot pool',\n lastSeenAt: EIGHT_MINUTES_AGO,\n }),\n provisionerTokenModel({\n id: '55555555-5555-4555-8555-555555555555',\n name: 'Buildkite migration pool',\n lastSeenAt: 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 manualRegistrationToken({name: 'Deploy runner', prefix: 'sf_mrt_deploy'}),\n manualRegistrationToken({\n id: '66666666-6666-4666-8666-666666666666',\n name: 'macOS build host',\n prefix: 'sf_mrt_macos',\n expiresAt: null,\n }),\n ]}\n />\n <ProvisionerTokenList\n workspaceId={WORKSPACE_ID}\n tokens={provisionerTokenModels()}\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 manualRegistrationToken({\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 provisionerTokenModel({\n name: 'docker-provisioner-for-west-coast-gpu-burst-capacity-and-fallback',\n prefix: 'sf_pt_west_coast_gpu_burst',\n lastSeenAt: 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 token: 'sf_mrt_4nJvNrs23ExampleManualTokenValue',\n prefix: 'sf_mrt_4nJv',\n name: 'Deploy runner',\n workspaceId: WORKSPACE_ID,\n expiresAt: EXPIRES_AT,\n createdAt: CREATED_AT,\n }}\n />\n </StateExample>\n <StateExample label=\"Provisioner token reveal\">\n <CreatedProvisionerTokenPanel token={createdProvisionerToken()} />\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 manualRegistrationToken(\n overrides: Partial<ManualRegistrationToken> = {},\n): ManualRegistrationToken {\n return {\n id: '22222222-2222-4222-8222-222222222222',\n workspaceId: WORKSPACE_ID,\n prefix: 'sf_mrt_deploy',\n name: 'Deploy runner',\n expiresAt: EXPIRES_AT,\n revokedAt: null,\n createdAt: CREATED_AT,\n updatedAt: CREATED_AT,\n ...overrides,\n };\n}\n\nfunction provisionerTokenModel(overrides: Partial<ProvisionerToken> = {}): ProvisionerToken {\n return {\n ...manualRegistrationToken(),\n createdByUserId: '99999999-9999-4999-8999-999999999999',\n revokedByUserId: null,\n lastSeenAt: NOW,\n ...overrides,\n };\n}\n\nfunction provisionerTokenModels(): ProvisionerToken[] {\n return [\n provisionerTokenModel({id: '33333333-3333-4333-8333-333333333333', name: 'Docker autoscaler'}),\n provisionerTokenModel({\n id: '44444444-4444-4444-8444-444444444444',\n name: 'Kubernetes spot pool',\n lastSeenAt: EIGHT_MINUTES_AGO,\n }),\n provisionerTokenModel({\n id: '55555555-5555-4555-8555-555555555555',\n name: 'Buildkite migration pool',\n lastSeenAt: null,\n }),\n ];\n}\n\nfunction createdProvisionerToken(): CreatedProvisionerToken {\n return {\n ...provisionerTokenModel({name: 'Docker autoscaler'}),\n token: 'sf_pt_Rv8YwrExampleProvisionerTokenValue',\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 scope: 'workspace',\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","provisionerTokenModel","id","name","lastSeenAt","activeIds","Set","Content","div","className","manualRegistrationToken","prefix","expiresAt","provisionerTokenModels","CreatedTokenPanels","token","createdAt","createdProvisionerToken","children","variant","input","url","requestUrl","Promise","undefined","pathname","endsWith","resolve","errorResponse","jsonResponse","manual_registration_tokens","manualToken","provisionerTokens","provisioners","last_seen_at","status","provisionerToken","overrides","revokedAt","updatedAt","createdByUserId","revokedByUserId","workspace_id","expires_at","revoked_at","created_at","updated_at","scope","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,66 @@
1
+ export interface ManualRegistrationToken {
2
+ id: string;
3
+ workspaceId: string;
4
+ prefix: string;
5
+ name: string | null;
6
+ expiresAt: string | null;
7
+ revokedAt: string | null;
8
+ createdAt: string;
9
+ updatedAt: string;
10
+ }
11
+ export interface ProvisionerToken extends ManualRegistrationToken {
12
+ createdByUserId: string;
13
+ revokedByUserId: string | null;
14
+ lastSeenAt: string | null;
15
+ }
16
+ export interface ActiveProvisioner {
17
+ id: string;
18
+ name: string | null;
19
+ prefix: string;
20
+ lastSeenAt: string;
21
+ }
22
+ export interface CreatedManualRegistrationToken {
23
+ token: string;
24
+ id: string;
25
+ prefix: string;
26
+ name: string | null;
27
+ workspaceId: string;
28
+ expiresAt: string | null;
29
+ createdAt: string;
30
+ }
31
+ export interface CreatedProvisionerToken extends CreatedManualRegistrationToken {
32
+ createdByUserId: string;
33
+ revokedByUserId: string | null;
34
+ revokedAt: string | null;
35
+ lastSeenAt: string | null;
36
+ updatedAt: string;
37
+ }
38
+ export type TokenExpiration = {
39
+ kind: 'never';
40
+ } | {
41
+ kind: 'expires-after';
42
+ seconds: number;
43
+ };
44
+ export interface CreateTokenCommand {
45
+ name?: string;
46
+ expiration: TokenExpiration;
47
+ }
48
+ export type ProvisionerConnectionStatus = {
49
+ kind: 'connected';
50
+ dotVariant: 'success';
51
+ label: 'Connected';
52
+ } | {
53
+ kind: 'last-seen';
54
+ dotVariant: 'neutral';
55
+ label: 'Last seen';
56
+ lastSeenAt: string;
57
+ } | {
58
+ kind: 'never-connected';
59
+ dotVariant: 'neutral';
60
+ label: 'Never connected';
61
+ };
62
+ export declare function createTokenCommand(name: string, expiration: TokenExpiration): CreateTokenCommand;
63
+ export declare function tokenDisplayName(token: Pick<ManualRegistrationToken, 'name'>): string;
64
+ export declare function provisionerTokenDisplayName(token: Pick<ProvisionerToken, 'name'>): string;
65
+ export declare function provisionerConnectionStatus(token: Pick<ProvisionerToken, 'id' | 'lastSeenAt'>, activeIds: ReadonlySet<string>): ProvisionerConnectionStatus;
66
+ //# sourceMappingURL=token.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token.d.ts","sourceRoot":"","sources":["../../src/core/token.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,uBAAuB;IACtC,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,gBAAiB,SAAQ,uBAAuB;IAC/D,eAAe,EAAE,MAAM,CAAC;IACxB,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AAED,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,8BAA8B;IAC7C,KAAK,EAAE,MAAM,CAAC;IACd,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,uBAAwB,SAAQ,8BAA8B;IAC7E,eAAe,EAAE,MAAM,CAAC;IACxB,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,MAAM,eAAe,GAAG;IAAC,IAAI,EAAE,OAAO,CAAA;CAAC,GAAG;IAAC,IAAI,EAAE,eAAe,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAC,CAAC;AAEzF,MAAM,WAAW,kBAAkB;IACjC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,eAAe,CAAC;CAC7B;AAED,MAAM,MAAM,2BAA2B,GACnC;IAAC,IAAI,EAAE,WAAW,CAAC;IAAC,UAAU,EAAE,SAAS,CAAC;IAAC,KAAK,EAAE,WAAW,CAAA;CAAC,GAC9D;IAAC,IAAI,EAAE,WAAW,CAAC;IAAC,UAAU,EAAE,SAAS,CAAC;IAAC,KAAK,EAAE,WAAW,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAC,GAClF;IAAC,IAAI,EAAE,iBAAiB,CAAC;IAAC,UAAU,EAAE,SAAS,CAAC;IAAC,KAAK,EAAE,iBAAiB,CAAA;CAAC,CAAC;AAE/E,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,eAAe,GAAG,kBAAkB,CAGhG;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,IAAI,CAAC,uBAAuB,EAAE,MAAM,CAAC,GAAG,MAAM,CAErF;AAED,wBAAgB,2BAA2B,CAAC,KAAK,EAAE,IAAI,CAAC,gBAAgB,EAAE,MAAM,CAAC,GAAG,MAAM,CAEzF;AAED,wBAAgB,2BAA2B,CACzC,KAAK,EAAE,IAAI,CAAC,gBAAgB,EAAE,IAAI,GAAG,YAAY,CAAC,EAClD,SAAS,EAAE,WAAW,CAAC,MAAM,CAAC,GAC7B,2BAA2B,CAY7B"}
@@ -0,0 +1,37 @@
1
+ export function createTokenCommand(name, expiration) {
2
+ const trimmedName = name.trim();
3
+ return {
4
+ expiration,
5
+ ...trimmedName ? {
6
+ name: trimmedName
7
+ } : {}
8
+ };
9
+ }
10
+ export function tokenDisplayName(token) {
11
+ return token.name || 'Unnamed token';
12
+ }
13
+ export function provisionerTokenDisplayName(token) {
14
+ return token.name || 'Unnamed provisioner';
15
+ }
16
+ export function provisionerConnectionStatus(token, activeIds) {
17
+ if (activeIds.has(token.id)) return {
18
+ kind: 'connected',
19
+ dotVariant: 'success',
20
+ label: 'Connected'
21
+ };
22
+ if (token.lastSeenAt) {
23
+ return {
24
+ kind: 'last-seen',
25
+ dotVariant: 'neutral',
26
+ label: 'Last seen',
27
+ lastSeenAt: token.lastSeenAt
28
+ };
29
+ }
30
+ return {
31
+ kind: 'never-connected',
32
+ dotVariant: 'neutral',
33
+ label: 'Never connected'
34
+ };
35
+ }
36
+
37
+ //# sourceMappingURL=token.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/core/token.ts"],"sourcesContent":["export interface ManualRegistrationToken {\n id: string;\n workspaceId: string;\n prefix: string;\n name: string | null;\n expiresAt: string | null;\n revokedAt: string | null;\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface ProvisionerToken extends ManualRegistrationToken {\n createdByUserId: string;\n revokedByUserId: string | null;\n lastSeenAt: string | null;\n}\n\nexport interface ActiveProvisioner {\n id: string;\n name: string | null;\n prefix: string;\n lastSeenAt: string;\n}\n\nexport interface CreatedManualRegistrationToken {\n token: string;\n id: string;\n prefix: string;\n name: string | null;\n workspaceId: string;\n expiresAt: string | null;\n createdAt: string;\n}\n\nexport interface CreatedProvisionerToken extends CreatedManualRegistrationToken {\n createdByUserId: string;\n revokedByUserId: string | null;\n revokedAt: string | null;\n lastSeenAt: string | null;\n updatedAt: string;\n}\n\nexport type TokenExpiration = {kind: 'never'} | {kind: 'expires-after'; seconds: number};\n\nexport interface CreateTokenCommand {\n name?: string;\n expiration: TokenExpiration;\n}\n\nexport type ProvisionerConnectionStatus =\n | {kind: 'connected'; dotVariant: 'success'; label: 'Connected'}\n | {kind: 'last-seen'; dotVariant: 'neutral'; label: 'Last seen'; lastSeenAt: string}\n | {kind: 'never-connected'; dotVariant: 'neutral'; label: 'Never connected'};\n\nexport function createTokenCommand(name: string, expiration: TokenExpiration): CreateTokenCommand {\n const trimmedName = name.trim();\n return {expiration, ...(trimmedName ? {name: trimmedName} : {})};\n}\n\nexport function tokenDisplayName(token: Pick<ManualRegistrationToken, 'name'>): string {\n return token.name || 'Unnamed token';\n}\n\nexport function provisionerTokenDisplayName(token: Pick<ProvisionerToken, 'name'>): string {\n return token.name || 'Unnamed provisioner';\n}\n\nexport function provisionerConnectionStatus(\n token: Pick<ProvisionerToken, 'id' | 'lastSeenAt'>,\n activeIds: ReadonlySet<string>,\n): ProvisionerConnectionStatus {\n if (activeIds.has(token.id))\n return {kind: 'connected', dotVariant: 'success', label: 'Connected'};\n if (token.lastSeenAt) {\n return {\n kind: 'last-seen',\n dotVariant: 'neutral',\n label: 'Last seen',\n lastSeenAt: token.lastSeenAt,\n };\n }\n return {kind: 'never-connected', dotVariant: 'neutral', label: 'Never connected'};\n}\n"],"names":["createTokenCommand","name","expiration","trimmedName","trim","tokenDisplayName","token","provisionerTokenDisplayName","provisionerConnectionStatus","activeIds","has","id","kind","dotVariant","label","lastSeenAt"],"mappings":"AAsDA,OAAO,SAASA,mBAAmBC,IAAY,EAAEC,UAA2B;IAC1E,MAAMC,cAAcF,KAAKG,IAAI;IAC7B,OAAO;QAACF;QAAY,GAAIC,cAAc;YAACF,MAAME;QAAW,IAAI,CAAC,CAAC;IAAC;AACjE;AAEA,OAAO,SAASE,iBAAiBC,KAA4C;IAC3E,OAAOA,MAAML,IAAI,IAAI;AACvB;AAEA,OAAO,SAASM,4BAA4BD,KAAqC;IAC/E,OAAOA,MAAML,IAAI,IAAI;AACvB;AAEA,OAAO,SAASO,4BACdF,KAAkD,EAClDG,SAA8B;IAE9B,IAAIA,UAAUC,GAAG,CAACJ,MAAMK,EAAE,GACxB,OAAO;QAACC,MAAM;QAAaC,YAAY;QAAWC,OAAO;IAAW;IACtE,IAAIR,MAAMS,UAAU,EAAE;QACpB,OAAO;YACLH,MAAM;YACNC,YAAY;YACZC,OAAO;YACPC,YAAYT,MAAMS,UAAU;QAC9B;IACF;IACA,OAAO;QAACH,MAAM;QAAmBC,YAAY;QAAWC,OAAO;IAAiB;AAClF"}
package/dist/feature.d.ts CHANGED
@@ -1,3 +1,16 @@
1
+ export declare const runnersSettingsSections: readonly [{
2
+ readonly id: "settings.runners";
3
+ readonly pathSegment: "runners";
4
+ readonly label: "Runners";
5
+ readonly icon: "settings3Line";
6
+ readonly order: 200;
7
+ }, {
8
+ readonly id: "settings.provisioners";
9
+ readonly pathSegment: "provisioners";
10
+ readonly label: "Runner provisioners";
11
+ readonly icon: "serverLine";
12
+ readonly order: 300;
13
+ }];
1
14
  export declare const runnersFeature: {
2
15
  readonly id: "shipfox.runners";
3
16
  readonly routes: readonly [{
@@ -1 +1 @@
1
- {"version":3,"file":"feature.d.ts","sourceRoot":"","sources":["../src/feature.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;;;;;;;;;;CA8BzB,CAAC"}
1
+ {"version":3,"file":"feature.d.ts","sourceRoot":"","sources":["../src/feature.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,uBAAuB;;;;;;;;;;;;EAegB,CAAC;AAErD,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;;;;;;;;;;CAezB,CAAC"}
package/dist/feature.js CHANGED
@@ -1,4 +1,20 @@
1
1
  import { defineClientFeature } from '@shipfox/client-shell';
2
+ export const runnersSettingsSections = [
3
+ {
4
+ id: 'settings.runners',
5
+ pathSegment: 'runners',
6
+ label: 'Runners',
7
+ icon: 'settings3Line',
8
+ order: 200
9
+ },
10
+ {
11
+ id: 'settings.provisioners',
12
+ pathSegment: 'provisioners',
13
+ label: 'Runner provisioners',
14
+ icon: 'serverLine',
15
+ order: 300
16
+ }
17
+ ];
2
18
  export const runnersFeature = defineClientFeature({
3
19
  id: 'shipfox.runners',
4
20
  routes: [
@@ -13,22 +29,7 @@ export const runnersFeature = defineClientFeature({
13
29
  impl: '@shipfox/client-runners/routes/provisioners-settings'
14
30
  }
15
31
  ],
16
- settingsSections: [
17
- {
18
- id: 'settings.runners',
19
- pathSegment: 'runners',
20
- label: 'Runners',
21
- icon: 'settings3Line',
22
- order: 200
23
- },
24
- {
25
- id: 'settings.provisioners',
26
- pathSegment: 'provisioners',
27
- label: 'Runner provisioners',
28
- icon: 'serverLine',
29
- order: 300
30
- }
31
- ]
32
+ settingsSections: runnersSettingsSections
32
33
  });
33
34
 
34
35
  //# sourceMappingURL=feature.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/feature.ts"],"sourcesContent":["import {defineClientFeature} from '@shipfox/client-shell';\n\nexport const runnersFeature = defineClientFeature({\n id: 'shipfox.runners',\n routes: [\n {\n path: '/workspaces/$wid/settings/runners',\n parent: 'workspaceSettings',\n impl: '@shipfox/client-runners/routes/runners-settings',\n },\n {\n path: '/workspaces/$wid/settings/provisioners',\n parent: 'workspaceSettings',\n impl: '@shipfox/client-runners/routes/provisioners-settings',\n },\n ],\n settingsSections: [\n {\n id: 'settings.runners',\n pathSegment: 'runners',\n label: 'Runners',\n icon: 'settings3Line',\n order: 200,\n },\n {\n id: 'settings.provisioners',\n pathSegment: 'provisioners',\n label: 'Runner provisioners',\n icon: 'serverLine',\n order: 300,\n },\n ],\n});\n"],"names":["defineClientFeature","runnersFeature","id","routes","path","parent","impl","settingsSections","pathSegment","label","icon","order"],"mappings":"AAAA,SAAQA,mBAAmB,QAAO,wBAAwB;AAE1D,OAAO,MAAMC,iBAAiBD,oBAAoB;IAChDE,IAAI;IACJC,QAAQ;QACN;YACEC,MAAM;YACNC,QAAQ;YACRC,MAAM;QACR;QACA;YACEF,MAAM;YACNC,QAAQ;YACRC,MAAM;QACR;KACD;IACDC,kBAAkB;QAChB;YACEL,IAAI;YACJM,aAAa;YACbC,OAAO;YACPC,MAAM;YACNC,OAAO;QACT;QACA;YACET,IAAI;YACJM,aAAa;YACbC,OAAO;YACPC,MAAM;YACNC,OAAO;QACT;KACD;AACH,GAAG"}
1
+ {"version":3,"sources":["../src/feature.ts"],"sourcesContent":["import {defineClientFeature, type SettingsSectionEntry} from '@shipfox/client-shell';\n\nexport const runnersSettingsSections = [\n {\n id: 'settings.runners',\n pathSegment: 'runners',\n label: 'Runners',\n icon: 'settings3Line',\n order: 200,\n },\n {\n id: 'settings.provisioners',\n pathSegment: 'provisioners',\n label: 'Runner provisioners',\n icon: 'serverLine',\n order: 300,\n },\n] as const satisfies readonly SettingsSectionEntry[];\n\nexport const runnersFeature = defineClientFeature({\n id: 'shipfox.runners',\n routes: [\n {\n path: '/workspaces/$wid/settings/runners',\n parent: 'workspaceSettings',\n impl: '@shipfox/client-runners/routes/runners-settings',\n },\n {\n path: '/workspaces/$wid/settings/provisioners',\n parent: 'workspaceSettings',\n impl: '@shipfox/client-runners/routes/provisioners-settings',\n },\n ],\n settingsSections: runnersSettingsSections,\n});\n"],"names":["defineClientFeature","runnersSettingsSections","id","pathSegment","label","icon","order","runnersFeature","routes","path","parent","impl","settingsSections"],"mappings":"AAAA,SAAQA,mBAAmB,QAAkC,wBAAwB;AAErF,OAAO,MAAMC,0BAA0B;IACrC;QACEC,IAAI;QACJC,aAAa;QACbC,OAAO;QACPC,MAAM;QACNC,OAAO;IACT;IACA;QACEJ,IAAI;QACJC,aAAa;QACbC,OAAO;QACPC,MAAM;QACNC,OAAO;IACT;CACD,CAAoD;AAErD,OAAO,MAAMC,iBAAiBP,oBAAoB;IAChDE,IAAI;IACJM,QAAQ;QACN;YACEC,MAAM;YACNC,QAAQ;YACRC,MAAM;QACR;QACA;YACEF,MAAM;YACNC,QAAQ;YACRC,MAAM;QACR;KACD;IACDC,kBAAkBX;AACpB,GAAG"}
@@ -1,83 +1,25 @@
1
- import type { CreateManualRegistrationTokenBodyDto } from '@shipfox/api-runners-dto';
1
+ import { type FetchQueryOptions } from '@tanstack/react-query';
2
+ import type { CreatedManualRegistrationToken, CreateTokenCommand, ManualRegistrationToken } from '#core/token.js';
2
3
  export declare const manualRegistrationTokenQueryKeys: {
3
4
  all: readonly ["manual-registration-tokens"];
4
5
  list: (workspaceId: string) => readonly ["manual-registration-tokens", "list", string];
5
6
  };
7
+ type ManualRegistrationTokensQueryOptions = FetchQueryOptions<ManualRegistrationToken[], Error, ManualRegistrationToken[], ReturnType<typeof manualRegistrationTokenQueryKeys.list>>;
6
8
  export declare function listManualRegistrationTokens({ workspaceId, signal, }: {
7
9
  workspaceId: string;
8
10
  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, }: {
11
+ }): Promise<ManualRegistrationToken[]>;
12
+ export declare function createManualRegistrationToken({ workspaceId, command, }: {
22
13
  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
- }>;
14
+ command: CreateTokenCommand;
15
+ }): Promise<CreatedManualRegistrationToken>;
33
16
  export declare function revokeManualRegistrationToken({ workspaceId, tokenId, }: {
34
17
  workspaceId: string;
35
18
  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>;
19
+ }): Promise<ManualRegistrationToken>;
20
+ export declare function manualRegistrationTokensQueryOptions(workspaceId: string): ManualRegistrationTokensQueryOptions;
21
+ export declare function useManualRegistrationTokensQuery(workspaceId: string | undefined): import("@tanstack/react-query").UseQueryResult<NoInfer<ManualRegistrationToken[]>, Error>;
22
+ export declare function useCreateManualRegistrationTokenMutation(workspaceId: string): import("@tanstack/react-query").UseMutationResult<CreatedManualRegistrationToken, Error, CreateTokenCommand, unknown>;
23
+ export declare function useRevokeManualRegistrationTokenMutation(workspaceId: string): import("@tanstack/react-query").UseMutationResult<ManualRegistrationToken, Error, string, unknown>;
24
+ export {};
83
25
  //# sourceMappingURL=manual-registration-tokens.d.ts.map
@@ -1 +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"}
1
+ {"version":3,"file":"manual-registration-tokens.d.ts","sourceRoot":"","sources":["../../../src/hooks/api/manual-registration-tokens.ts"],"names":[],"mappings":"AAMA,OAAO,EACL,KAAK,iBAAiB,EAKvB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,KAAK,EACV,8BAA8B,EAC9B,kBAAkB,EAClB,uBAAuB,EACxB,MAAM,gBAAgB,CAAC;AAOxB,eAAO,MAAM,gCAAgC;;wBAEvB,MAAM;CAE3B,CAAC;AAEF,KAAK,oCAAoC,GAAG,iBAAiB,CAC3D,uBAAuB,EAAE,EACzB,KAAK,EACL,uBAAuB,EAAE,EACzB,UAAU,CAAC,OAAO,gCAAgC,CAAC,IAAI,CAAC,CACzD,CAAC;AAEF,wBAAsB,4BAA4B,CAAC,EACjD,WAAW,EACX,MAAM,GACP,EAAE;IACD,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB,GAAG,OAAO,CAAC,uBAAuB,EAAE,CAAC,CAOrC;AAED,wBAAsB,6BAA6B,CAAC,EAClD,WAAW,EACX,OAAO,GACR,EAAE;IACD,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,kBAAkB,CAAC;CAC7B,GAAG,OAAO,CAAC,8BAA8B,CAAC,CAO1C;AAED,wBAAsB,6BAA6B,CAAC,EAClD,WAAW,EACX,OAAO,GACR,EAAE;IACD,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;CACjB,GAAG,OAAO,CAAC,uBAAuB,CAAC,CAOnC;AAED,wBAAgB,oCAAoC,CAClD,WAAW,EAAE,MAAM,GAClB,oCAAoC,CAKtC;AAED,wBAAgB,gCAAgC,CAAC,WAAW,EAAE,MAAM,GAAG,SAAS,6FAK/E;AAED,wBAAgB,wCAAwC,CAAC,WAAW,EAAE,MAAM,yHAS3E;AAED,wBAAgB,wCAAwC,CAAC,WAAW,EAAE,MAAM,sGAQ3E"}
@@ -1,5 +1,7 @@
1
- import { apiRequest } from '@shipfox/client-api';
2
- import { useMutation, useQuery } from '@tanstack/react-query';
1
+ import { createManualRegistrationTokenResponseSchema, listManualRegistrationTokensResponseSchema, revokeManualRegistrationTokenResponseSchema } from '@shipfox/api-runners-dto';
2
+ import { checkedApiRequest } from '@shipfox/client-api';
3
+ import { queryOptions, useMutation, useQuery, useQueryClient } from '@tanstack/react-query';
4
+ import { toCreatedManualRegistrationToken, toCreateTokenBody, toManualRegistrationToken } from './token-mapper.js';
3
5
  export const manualRegistrationTokenQueryKeys = {
4
6
  all: [
5
7
  'manual-registration-tokens'
@@ -11,42 +13,61 @@ export const manualRegistrationTokenQueryKeys = {
11
13
  ]
12
14
  };
13
15
  export async function listManualRegistrationTokens({ workspaceId, signal }) {
14
- return await apiRequest(`/workspaces/${workspaceId}/runners/manual-registration-tokens`, {
16
+ const response = await checkedApiRequest(listManualRegistrationTokensResponseSchema, `/workspaces/${workspaceId}/runners/manual-registration-tokens`, {
15
17
  signal
16
18
  });
19
+ return response.manual_registration_tokens.map(toManualRegistrationToken);
17
20
  }
18
- export async function createManualRegistrationToken({ workspaceId, body }) {
19
- return await apiRequest(`/workspaces/${workspaceId}/runners/manual-registration-tokens`, {
21
+ export async function createManualRegistrationToken({ workspaceId, command }) {
22
+ const response = await checkedApiRequest(createManualRegistrationTokenResponseSchema, `/workspaces/${workspaceId}/runners/manual-registration-tokens`, {
20
23
  method: 'POST',
21
- body
24
+ body: toCreateTokenBody(command)
22
25
  });
26
+ return toCreatedManualRegistrationToken(response);
23
27
  }
24
28
  export async function revokeManualRegistrationToken({ workspaceId, tokenId }) {
25
- return await apiRequest(`/workspaces/${workspaceId}/runners/manual-registration-tokens/${tokenId}/revoke`, {
29
+ const response = await checkedApiRequest(revokeManualRegistrationTokenResponseSchema, `/workspaces/${workspaceId}/runners/manual-registration-tokens/${tokenId}/revoke`, {
26
30
  method: 'POST'
27
31
  });
32
+ return toManualRegistrationToken(response);
28
33
  }
29
- export function useManualRegistrationTokensQuery(workspaceId) {
30
- return useQuery({
31
- queryKey: workspaceId ? manualRegistrationTokenQueryKeys.list(workspaceId) : [
32
- ...manualRegistrationTokenQueryKeys.all,
33
- 'list'
34
- ],
35
- enabled: Boolean(workspaceId),
34
+ export function manualRegistrationTokensQueryOptions(workspaceId) {
35
+ return queryOptions({
36
+ queryKey: manualRegistrationTokenQueryKeys.list(workspaceId),
36
37
  queryFn: ({ signal })=>listManualRegistrationTokens({
37
- workspaceId: workspaceId ?? '',
38
+ workspaceId,
38
39
  signal
39
40
  })
40
41
  });
41
42
  }
42
- export function useCreateManualRegistrationTokenMutation() {
43
+ export function useManualRegistrationTokensQuery(workspaceId) {
44
+ return useQuery({
45
+ ...manualRegistrationTokensQueryOptions(workspaceId ?? ''),
46
+ enabled: Boolean(workspaceId)
47
+ });
48
+ }
49
+ export function useCreateManualRegistrationTokenMutation(workspaceId) {
50
+ const queryClient = useQueryClient();
43
51
  return useMutation({
44
- mutationFn: createManualRegistrationToken
52
+ mutationFn: (command)=>createManualRegistrationToken({
53
+ workspaceId,
54
+ command
55
+ }),
56
+ onSuccess: async ()=>{
57
+ await queryClient.invalidateQueries(manualRegistrationTokensQueryOptions(workspaceId));
58
+ }
45
59
  });
46
60
  }
47
- export function useRevokeManualRegistrationTokenMutation() {
61
+ export function useRevokeManualRegistrationTokenMutation(workspaceId) {
62
+ const queryClient = useQueryClient();
48
63
  return useMutation({
49
- mutationFn: revokeManualRegistrationToken
64
+ mutationFn: (tokenId)=>revokeManualRegistrationToken({
65
+ workspaceId,
66
+ tokenId
67
+ }),
68
+ onSuccess: async ()=>{
69
+ await queryClient.invalidateQueries(manualRegistrationTokensQueryOptions(workspaceId));
70
+ }
50
71
  });
51
72
  }
52
73
 
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/hooks/api/manual-registration-tokens.ts"],"sourcesContent":["import type {\n CreateManualRegistrationTokenBodyDto,\n CreateManualRegistrationTokenResponseDto,\n ListManualRegistrationTokensResponseDto,\n RevokeManualRegistrationTokenResponseDto,\n} from '@shipfox/api-runners-dto';\nimport {apiRequest} from '@shipfox/client-api';\nimport {useMutation, useQuery} from '@tanstack/react-query';\n\nexport const manualRegistrationTokenQueryKeys = {\n all: ['manual-registration-tokens'] as const,\n list: (workspaceId: string) =>\n [...manualRegistrationTokenQueryKeys.all, 'list', workspaceId] as const,\n};\n\nexport async function listManualRegistrationTokens({\n workspaceId,\n signal,\n}: {\n workspaceId: string;\n signal?: AbortSignal;\n}) {\n return await apiRequest<ListManualRegistrationTokensResponseDto>(\n `/workspaces/${workspaceId}/runners/manual-registration-tokens`,\n {signal},\n );\n}\n\nexport async function createManualRegistrationToken({\n workspaceId,\n body,\n}: {\n workspaceId: string;\n body: CreateManualRegistrationTokenBodyDto;\n}) {\n return await apiRequest<CreateManualRegistrationTokenResponseDto>(\n `/workspaces/${workspaceId}/runners/manual-registration-tokens`,\n {method: 'POST', body},\n );\n}\n\nexport async function revokeManualRegistrationToken({\n workspaceId,\n tokenId,\n}: {\n workspaceId: string;\n tokenId: string;\n}) {\n return await apiRequest<RevokeManualRegistrationTokenResponseDto>(\n `/workspaces/${workspaceId}/runners/manual-registration-tokens/${tokenId}/revoke`,\n {method: 'POST'},\n );\n}\n\nexport function useManualRegistrationTokensQuery(workspaceId: string | undefined) {\n return useQuery({\n queryKey: workspaceId\n ? manualRegistrationTokenQueryKeys.list(workspaceId)\n : [...manualRegistrationTokenQueryKeys.all, 'list'],\n enabled: Boolean(workspaceId),\n queryFn: ({signal}) => listManualRegistrationTokens({workspaceId: workspaceId ?? '', signal}),\n });\n}\n\nexport function useCreateManualRegistrationTokenMutation() {\n return useMutation({mutationFn: createManualRegistrationToken});\n}\n\nexport function useRevokeManualRegistrationTokenMutation() {\n return useMutation({mutationFn: revokeManualRegistrationToken});\n}\n"],"names":["apiRequest","useMutation","useQuery","manualRegistrationTokenQueryKeys","all","list","workspaceId","listManualRegistrationTokens","signal","createManualRegistrationToken","body","method","revokeManualRegistrationToken","tokenId","useManualRegistrationTokensQuery","queryKey","enabled","Boolean","queryFn","useCreateManualRegistrationTokenMutation","mutationFn","useRevokeManualRegistrationTokenMutation"],"mappings":"AAMA,SAAQA,UAAU,QAAO,sBAAsB;AAC/C,SAAQC,WAAW,EAAEC,QAAQ,QAAO,wBAAwB;AAE5D,OAAO,MAAMC,mCAAmC;IAC9CC,KAAK;QAAC;KAA6B;IACnCC,MAAM,CAACC,cACL;eAAIH,iCAAiCC,GAAG;YAAE;YAAQE;SAAY;AAClE,EAAE;AAEF,OAAO,eAAeC,6BAA6B,EACjDD,WAAW,EACXE,MAAM,EAIP;IACC,OAAO,MAAMR,WACX,CAAC,YAAY,EAAEM,YAAY,mCAAmC,CAAC,EAC/D;QAACE;IAAM;AAEX;AAEA,OAAO,eAAeC,8BAA8B,EAClDH,WAAW,EACXI,IAAI,EAIL;IACC,OAAO,MAAMV,WACX,CAAC,YAAY,EAAEM,YAAY,mCAAmC,CAAC,EAC/D;QAACK,QAAQ;QAAQD;IAAI;AAEzB;AAEA,OAAO,eAAeE,8BAA8B,EAClDN,WAAW,EACXO,OAAO,EAIR;IACC,OAAO,MAAMb,WACX,CAAC,YAAY,EAAEM,YAAY,oCAAoC,EAAEO,QAAQ,OAAO,CAAC,EACjF;QAACF,QAAQ;IAAM;AAEnB;AAEA,OAAO,SAASG,iCAAiCR,WAA+B;IAC9E,OAAOJ,SAAS;QACda,UAAUT,cACNH,iCAAiCE,IAAI,CAACC,eACtC;eAAIH,iCAAiCC,GAAG;YAAE;SAAO;QACrDY,SAASC,QAAQX;QACjBY,SAAS,CAAC,EAACV,MAAM,EAAC,GAAKD,6BAA6B;gBAACD,aAAaA,eAAe;gBAAIE;YAAM;IAC7F;AACF;AAEA,OAAO,SAASW;IACd,OAAOlB,YAAY;QAACmB,YAAYX;IAA6B;AAC/D;AAEA,OAAO,SAASY;IACd,OAAOpB,YAAY;QAACmB,YAAYR;IAA6B;AAC/D"}
1
+ {"version":3,"sources":["../../../src/hooks/api/manual-registration-tokens.ts"],"sourcesContent":["import {\n createManualRegistrationTokenResponseSchema,\n listManualRegistrationTokensResponseSchema,\n revokeManualRegistrationTokenResponseSchema,\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 CreatedManualRegistrationToken,\n CreateTokenCommand,\n ManualRegistrationToken,\n} from '#core/token.js';\nimport {\n toCreatedManualRegistrationToken,\n toCreateTokenBody,\n toManualRegistrationToken,\n} from './token-mapper.js';\n\nexport const manualRegistrationTokenQueryKeys = {\n all: ['manual-registration-tokens'] as const,\n list: (workspaceId: string) =>\n [...manualRegistrationTokenQueryKeys.all, 'list', workspaceId] as const,\n};\n\ntype ManualRegistrationTokensQueryOptions = FetchQueryOptions<\n ManualRegistrationToken[],\n Error,\n ManualRegistrationToken[],\n ReturnType<typeof manualRegistrationTokenQueryKeys.list>\n>;\n\nexport async function listManualRegistrationTokens({\n workspaceId,\n signal,\n}: {\n workspaceId: string;\n signal?: AbortSignal;\n}): Promise<ManualRegistrationToken[]> {\n const response = await checkedApiRequest(\n listManualRegistrationTokensResponseSchema,\n `/workspaces/${workspaceId}/runners/manual-registration-tokens`,\n {signal},\n );\n return response.manual_registration_tokens.map(toManualRegistrationToken);\n}\n\nexport async function createManualRegistrationToken({\n workspaceId,\n command,\n}: {\n workspaceId: string;\n command: CreateTokenCommand;\n}): Promise<CreatedManualRegistrationToken> {\n const response = await checkedApiRequest(\n createManualRegistrationTokenResponseSchema,\n `/workspaces/${workspaceId}/runners/manual-registration-tokens`,\n {method: 'POST', body: toCreateTokenBody(command)},\n );\n return toCreatedManualRegistrationToken(response);\n}\n\nexport async function revokeManualRegistrationToken({\n workspaceId,\n tokenId,\n}: {\n workspaceId: string;\n tokenId: string;\n}): Promise<ManualRegistrationToken> {\n const response = await checkedApiRequest(\n revokeManualRegistrationTokenResponseSchema,\n `/workspaces/${workspaceId}/runners/manual-registration-tokens/${tokenId}/revoke`,\n {method: 'POST'},\n );\n return toManualRegistrationToken(response);\n}\n\nexport function manualRegistrationTokensQueryOptions(\n workspaceId: string,\n): ManualRegistrationTokensQueryOptions {\n return queryOptions({\n queryKey: manualRegistrationTokenQueryKeys.list(workspaceId),\n queryFn: ({signal}) => listManualRegistrationTokens({workspaceId, signal}),\n });\n}\n\nexport function useManualRegistrationTokensQuery(workspaceId: string | undefined) {\n return useQuery({\n ...manualRegistrationTokensQueryOptions(workspaceId ?? ''),\n enabled: Boolean(workspaceId),\n });\n}\n\nexport function useCreateManualRegistrationTokenMutation(workspaceId: string) {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: (command: CreateTokenCommand) =>\n createManualRegistrationToken({workspaceId, command}),\n onSuccess: async () => {\n await queryClient.invalidateQueries(manualRegistrationTokensQueryOptions(workspaceId));\n },\n });\n}\n\nexport function useRevokeManualRegistrationTokenMutation(workspaceId: string) {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: (tokenId: string) => revokeManualRegistrationToken({workspaceId, tokenId}),\n onSuccess: async () => {\n await queryClient.invalidateQueries(manualRegistrationTokensQueryOptions(workspaceId));\n },\n });\n}\n"],"names":["createManualRegistrationTokenResponseSchema","listManualRegistrationTokensResponseSchema","revokeManualRegistrationTokenResponseSchema","checkedApiRequest","queryOptions","useMutation","useQuery","useQueryClient","toCreatedManualRegistrationToken","toCreateTokenBody","toManualRegistrationToken","manualRegistrationTokenQueryKeys","all","list","workspaceId","listManualRegistrationTokens","signal","response","manual_registration_tokens","map","createManualRegistrationToken","command","method","body","revokeManualRegistrationToken","tokenId","manualRegistrationTokensQueryOptions","queryKey","queryFn","useManualRegistrationTokensQuery","enabled","Boolean","useCreateManualRegistrationTokenMutation","queryClient","mutationFn","onSuccess","invalidateQueries","useRevokeManualRegistrationTokenMutation"],"mappings":"AAAA,SACEA,2CAA2C,EAC3CC,0CAA0C,EAC1CC,2CAA2C,QACtC,2BAA2B;AAClC,SAAQC,iBAAiB,QAAO,sBAAsB;AACtD,SAEEC,YAAY,EACZC,WAAW,EACXC,QAAQ,EACRC,cAAc,QACT,wBAAwB;AAM/B,SACEC,gCAAgC,EAChCC,iBAAiB,EACjBC,yBAAyB,QACpB,oBAAoB;AAE3B,OAAO,MAAMC,mCAAmC;IAC9CC,KAAK;QAAC;KAA6B;IACnCC,MAAM,CAACC,cACL;eAAIH,iCAAiCC,GAAG;YAAE;YAAQE;SAAY;AAClE,EAAE;AASF,OAAO,eAAeC,6BAA6B,EACjDD,WAAW,EACXE,MAAM,EAIP;IACC,MAAMC,WAAW,MAAMd,kBACrBF,4CACA,CAAC,YAAY,EAAEa,YAAY,mCAAmC,CAAC,EAC/D;QAACE;IAAM;IAET,OAAOC,SAASC,0BAA0B,CAACC,GAAG,CAACT;AACjD;AAEA,OAAO,eAAeU,8BAA8B,EAClDN,WAAW,EACXO,OAAO,EAIR;IACC,MAAMJ,WAAW,MAAMd,kBACrBH,6CACA,CAAC,YAAY,EAAEc,YAAY,mCAAmC,CAAC,EAC/D;QAACQ,QAAQ;QAAQC,MAAMd,kBAAkBY;IAAQ;IAEnD,OAAOb,iCAAiCS;AAC1C;AAEA,OAAO,eAAeO,8BAA8B,EAClDV,WAAW,EACXW,OAAO,EAIR;IACC,MAAMR,WAAW,MAAMd,kBACrBD,6CACA,CAAC,YAAY,EAAEY,YAAY,oCAAoC,EAAEW,QAAQ,OAAO,CAAC,EACjF;QAACH,QAAQ;IAAM;IAEjB,OAAOZ,0BAA0BO;AACnC;AAEA,OAAO,SAASS,qCACdZ,WAAmB;IAEnB,OAAOV,aAAa;QAClBuB,UAAUhB,iCAAiCE,IAAI,CAACC;QAChDc,SAAS,CAAC,EAACZ,MAAM,EAAC,GAAKD,6BAA6B;gBAACD;gBAAaE;YAAM;IAC1E;AACF;AAEA,OAAO,SAASa,iCAAiCf,WAA+B;IAC9E,OAAOR,SAAS;QACd,GAAGoB,qCAAqCZ,eAAe,GAAG;QAC1DgB,SAASC,QAAQjB;IACnB;AACF;AAEA,OAAO,SAASkB,yCAAyClB,WAAmB;IAC1E,MAAMmB,cAAc1B;IACpB,OAAOF,YAAY;QACjB6B,YAAY,CAACb,UACXD,8BAA8B;gBAACN;gBAAaO;YAAO;QACrDc,WAAW;YACT,MAAMF,YAAYG,iBAAiB,CAACV,qCAAqCZ;QAC3E;IACF;AACF;AAEA,OAAO,SAASuB,yCAAyCvB,WAAmB;IAC1E,MAAMmB,cAAc1B;IACpB,OAAOF,YAAY;QACjB6B,YAAY,CAACT,UAAoBD,8BAA8B;gBAACV;gBAAaW;YAAO;QACpFU,WAAW;YACT,MAAMF,YAAYG,iBAAiB,CAACV,qCAAqCZ;QAC3E;IACF;AACF"}