@shipfox/client-projects 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 (90) hide show
  1. package/.turbo/turbo-build.log +1 -1
  2. package/CHANGELOG.md +74 -0
  3. package/dist/chrome.d.ts.map +1 -1
  4. package/dist/chrome.js +7 -10
  5. package/dist/chrome.js.map +1 -1
  6. package/dist/components/model-provider-reminder-banner.d.ts.map +1 -1
  7. package/dist/components/model-provider-reminder-banner.js +4 -2
  8. package/dist/components/model-provider-reminder-banner.js.map +1 -1
  9. package/dist/components/source-strip.d.ts +2 -2
  10. package/dist/components/source-strip.d.ts.map +1 -1
  11. package/dist/components/source-strip.js +2 -2
  12. package/dist/components/source-strip.js.map +1 -1
  13. package/dist/core/definition.d.ts +32 -0
  14. package/dist/core/definition.d.ts.map +1 -0
  15. package/dist/core/definition.js +3 -0
  16. package/dist/core/definition.js.map +1 -0
  17. package/dist/core/project.d.ts +26 -0
  18. package/dist/core/project.d.ts.map +1 -0
  19. package/dist/core/project.js +12 -0
  20. package/dist/core/project.js.map +1 -0
  21. package/dist/feature.d.ts +8 -0
  22. package/dist/feature.d.ts.map +1 -1
  23. package/dist/feature.js +11 -10
  24. package/dist/feature.js.map +1 -1
  25. package/dist/hooks/api/definitions.d.ts +12 -88
  26. package/dist/hooks/api/definitions.d.ts.map +1 -1
  27. package/dist/hooks/api/definitions.js +18 -10
  28. package/dist/hooks/api/definitions.js.map +1 -1
  29. package/dist/hooks/api/mappers.d.ts +17 -0
  30. package/dist/hooks/api/mappers.d.ts.map +1 -0
  31. package/dist/hooks/api/mappers.js +56 -0
  32. package/dist/hooks/api/mappers.js.map +1 -0
  33. package/dist/hooks/api/projects.d.ts +18 -84
  34. package/dist/hooks/api/projects.d.ts.map +1 -1
  35. package/dist/hooks/api/projects.js +72 -29
  36. package/dist/hooks/api/projects.js.map +1 -1
  37. package/dist/index.d.ts +2 -0
  38. package/dist/index.d.ts.map +1 -1
  39. package/dist/index.js +1 -0
  40. package/dist/index.js.map +1 -1
  41. package/dist/pages/create-project-page.d.ts.map +1 -1
  42. package/dist/pages/create-project-page.js +12 -37
  43. package/dist/pages/create-project-page.js.map +1 -1
  44. package/dist/pages/create-project-page.stories.js +3 -1
  45. package/dist/pages/create-project-page.stories.js.map +1 -1
  46. package/dist/pages/home-router.d.ts +4 -1
  47. package/dist/pages/home-router.d.ts.map +1 -1
  48. package/dist/pages/home-router.js +4 -2
  49. package/dist/pages/home-router.js.map +1 -1
  50. package/dist/pages/projects-hub-page.d.ts +3 -1
  51. package/dist/pages/projects-hub-page.d.ts.map +1 -1
  52. package/dist/pages/projects-hub-page.js +26 -30
  53. package/dist/pages/projects-hub-page.js.map +1 -1
  54. package/dist/routes/home.d.ts +3 -2
  55. package/dist/routes/home.d.ts.map +1 -1
  56. package/dist/routes/home.js +7 -2
  57. package/dist/routes/home.js.map +1 -1
  58. package/dist/routes/inputs.d.ts +6 -0
  59. package/dist/routes/inputs.d.ts.map +1 -0
  60. package/dist/routes/inputs.js +14 -0
  61. package/dist/routes/inputs.js.map +1 -0
  62. package/dist/routes/search.d.ts +5 -0
  63. package/dist/routes/search.d.ts.map +1 -0
  64. package/dist/routes/search.js +8 -0
  65. package/dist/routes/search.js.map +1 -0
  66. package/dist/tsconfig.test.tsbuildinfo +1 -1
  67. package/package.json +14 -15
  68. package/src/chrome.tsx +11 -6
  69. package/src/components/model-provider-reminder-banner.tsx +12 -10
  70. package/src/components/project-switcher.test.tsx +2 -1
  71. package/src/components/source-strip.tsx +5 -5
  72. package/src/core/definition.ts +31 -0
  73. package/src/core/project.ts +47 -0
  74. package/src/feature.ts +13 -11
  75. package/src/hooks/api/definitions.ts +54 -19
  76. package/src/hooks/api/mappers.ts +67 -0
  77. package/src/hooks/api/projects.test.ts +11 -4
  78. package/src/hooks/api/projects.ts +114 -39
  79. package/src/index.ts +9 -0
  80. package/src/pages/create-project-page.stories.tsx +6 -1
  81. package/src/pages/create-project-page.test.tsx +3 -1
  82. package/src/pages/create-project-page.tsx +16 -51
  83. package/src/pages/home-router.tsx +3 -2
  84. package/src/pages/projects-hub-page.test.tsx +13 -8
  85. package/src/pages/projects-hub-page.tsx +24 -34
  86. package/src/routes/home.tsx +6 -2
  87. package/src/routes/inputs.test.ts +14 -0
  88. package/src/routes/inputs.ts +15 -0
  89. package/src/routes/search.ts +8 -0
  90. package/tsconfig.build.tsbuildinfo +1 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/hooks/api/definitions.ts"],"sourcesContent":["import type {DefinitionListResponseDto} from '@shipfox/api-definitions-dto';\nimport {apiRequest} from '@shipfox/client-api';\nimport {keepPreviousData, useInfiniteQuery, useQuery} from '@tanstack/react-query';\n\nexport const definitionsQueryKeys = {\n all: ['definitions'] as const,\n list: (projectId: string) => [...definitionsQueryKeys.all, 'list', projectId] as const,\n};\n\nexport async function listDefinitions({\n projectId,\n limit = 50,\n cursor,\n signal,\n}: {\n projectId: string;\n limit?: number;\n cursor?: string | undefined;\n signal?: AbortSignal;\n}) {\n const params = new URLSearchParams({project_id: projectId, limit: String(limit)});\n if (cursor) params.set('cursor', cursor);\n return await apiRequest<DefinitionListResponseDto>(`/definitions?${params.toString()}`, {\n signal,\n });\n}\n\nexport function useDefinitionsInfiniteQuery(projectId: string | undefined, limit = 50) {\n return useInfiniteQuery({\n queryKey: projectId\n ? definitionsQueryKeys.list(projectId)\n : [...definitionsQueryKeys.all, 'list'],\n enabled: Boolean(projectId),\n initialPageParam: undefined as string | undefined,\n queryFn: ({pageParam, signal}) =>\n listDefinitions({projectId: projectId ?? '', limit, cursor: pageParam, signal}),\n getNextPageParam: (lastPage) => lastPage.next_cursor ?? undefined,\n placeholderData: keepPreviousData,\n });\n}\n\nexport function useDefinitionsQuery(projectId: string | undefined) {\n return useQuery({\n queryKey: projectId\n ? definitionsQueryKeys.list(projectId)\n : [...definitionsQueryKeys.all, 'list'],\n enabled: Boolean(projectId),\n queryFn: ({signal}) => listDefinitions({projectId: projectId ?? '', signal}),\n });\n}\n"],"names":["apiRequest","keepPreviousData","useInfiniteQuery","useQuery","definitionsQueryKeys","all","list","projectId","listDefinitions","limit","cursor","signal","params","URLSearchParams","project_id","String","set","toString","useDefinitionsInfiniteQuery","queryKey","enabled","Boolean","initialPageParam","undefined","queryFn","pageParam","getNextPageParam","lastPage","next_cursor","placeholderData","useDefinitionsQuery"],"mappings":"AACA,SAAQA,UAAU,QAAO,sBAAsB;AAC/C,SAAQC,gBAAgB,EAAEC,gBAAgB,EAAEC,QAAQ,QAAO,wBAAwB;AAEnF,OAAO,MAAMC,uBAAuB;IAClCC,KAAK;QAAC;KAAc;IACpBC,MAAM,CAACC,YAAsB;eAAIH,qBAAqBC,GAAG;YAAE;YAAQE;SAAU;AAC/E,EAAE;AAEF,OAAO,eAAeC,gBAAgB,EACpCD,SAAS,EACTE,QAAQ,EAAE,EACVC,MAAM,EACNC,MAAM,EAMP;IACC,MAAMC,SAAS,IAAIC,gBAAgB;QAACC,YAAYP;QAAWE,OAAOM,OAAON;IAAM;IAC/E,IAAIC,QAAQE,OAAOI,GAAG,CAAC,UAAUN;IACjC,OAAO,MAAMV,WAAsC,CAAC,aAAa,EAAEY,OAAOK,QAAQ,IAAI,EAAE;QACtFN;IACF;AACF;AAEA,OAAO,SAASO,4BAA4BX,SAA6B,EAAEE,QAAQ,EAAE;IACnF,OAAOP,iBAAiB;QACtBiB,UAAUZ,YACNH,qBAAqBE,IAAI,CAACC,aAC1B;eAAIH,qBAAqBC,GAAG;YAAE;SAAO;QACzCe,SAASC,QAAQd;QACjBe,kBAAkBC;QAClBC,SAAS,CAAC,EAACC,SAAS,EAAEd,MAAM,EAAC,GAC3BH,gBAAgB;gBAACD,WAAWA,aAAa;gBAAIE;gBAAOC,QAAQe;gBAAWd;YAAM;QAC/Ee,kBAAkB,CAACC,WAAaA,SAASC,WAAW,IAAIL;QACxDM,iBAAiB5B;IACnB;AACF;AAEA,OAAO,SAAS6B,oBAAoBvB,SAA6B;IAC/D,OAAOJ,SAAS;QACdgB,UAAUZ,YACNH,qBAAqBE,IAAI,CAACC,aAC1B;eAAIH,qBAAqBC,GAAG;YAAE;SAAO;QACzCe,SAASC,QAAQd;QACjBiB,SAAS,CAAC,EAACb,MAAM,EAAC,GAAKH,gBAAgB;gBAACD,WAAWA,aAAa;gBAAII;YAAM;IAC5E;AACF"}
1
+ {"version":3,"sources":["../../../src/hooks/api/definitions.ts"],"sourcesContent":["import {definitionListResponseSchema} from '@shipfox/api-definitions-dto';\nimport {checkedApiRequest} from '@shipfox/client-api';\nimport {\n type InfiniteData,\n keepPreviousData,\n queryOptions,\n type UseInfiniteQueryOptions,\n type UseQueryOptions,\n useInfiniteQuery,\n useQuery,\n} from '@tanstack/react-query';\nimport type {DefinitionList} from '#core/definition.js';\nimport {toDefinitionList} from './mappers.js';\n\nexport const definitionsQueryKeys = {\n all: ['definitions'] as const,\n list: (projectId: string) => [...definitionsQueryKeys.all, 'list', projectId] as const,\n};\n\ntype DefinitionListQueryKey =\n | ReturnType<typeof definitionsQueryKeys.list>\n | readonly ['definitions', 'list'];\ntype DefinitionListInfiniteQueryOptions = UseInfiniteQueryOptions<\n DefinitionList,\n Error,\n InfiniteData<DefinitionList, string | undefined>,\n DefinitionListQueryKey,\n string | undefined\n>;\ntype DefinitionListQueryOptions = UseQueryOptions<\n DefinitionList,\n Error,\n DefinitionList,\n DefinitionListQueryKey\n>;\nexport async function listDefinitions({\n projectId,\n limit = 50,\n cursor,\n signal,\n}: {\n projectId: string;\n limit?: number;\n cursor?: string | undefined;\n signal?: AbortSignal | undefined;\n}): Promise<DefinitionList> {\n const params = new URLSearchParams({project_id: projectId, limit: String(limit)});\n if (cursor) params.set('cursor', cursor);\n return toDefinitionList(\n await checkedApiRequest(definitionListResponseSchema, `/definitions?${params.toString()}`, {\n signal,\n }),\n );\n}\nexport function definitionsInfiniteQueryOptions(\n projectId: string | undefined,\n limit = 50,\n): DefinitionListInfiniteQueryOptions {\n return {\n queryKey: projectId\n ? definitionsQueryKeys.list(projectId)\n : ([...definitionsQueryKeys.all, 'list'] as const),\n enabled: Boolean(projectId),\n initialPageParam: undefined as string | undefined,\n queryFn: ({pageParam, signal}: {pageParam: string | undefined; signal: AbortSignal}) =>\n listDefinitions({projectId: projectId ?? '', limit, cursor: pageParam, signal}),\n getNextPageParam: (lastPage: DefinitionList) => lastPage.nextCursor ?? undefined,\n placeholderData: keepPreviousData,\n };\n}\nexport function definitionsQueryOptions(projectId: string | undefined): DefinitionListQueryOptions {\n return queryOptions({\n queryKey: projectId\n ? definitionsQueryKeys.list(projectId)\n : ([...definitionsQueryKeys.all, 'list'] as const),\n enabled: Boolean(projectId),\n queryFn: ({signal}) => listDefinitions({projectId: projectId ?? '', signal}),\n });\n}\nexport function useDefinitionsInfiniteQuery(projectId: string | undefined, limit = 50) {\n return useInfiniteQuery(definitionsInfiniteQueryOptions(projectId, limit));\n}\nexport function useDefinitionsQuery(projectId: string | undefined) {\n return useQuery(definitionsQueryOptions(projectId));\n}\n"],"names":["definitionListResponseSchema","checkedApiRequest","keepPreviousData","queryOptions","useInfiniteQuery","useQuery","toDefinitionList","definitionsQueryKeys","all","list","projectId","listDefinitions","limit","cursor","signal","params","URLSearchParams","project_id","String","set","toString","definitionsInfiniteQueryOptions","queryKey","enabled","Boolean","initialPageParam","undefined","queryFn","pageParam","getNextPageParam","lastPage","nextCursor","placeholderData","definitionsQueryOptions","useDefinitionsInfiniteQuery","useDefinitionsQuery"],"mappings":"AAAA,SAAQA,4BAA4B,QAAO,+BAA+B;AAC1E,SAAQC,iBAAiB,QAAO,sBAAsB;AACtD,SAEEC,gBAAgB,EAChBC,YAAY,EAGZC,gBAAgB,EAChBC,QAAQ,QACH,wBAAwB;AAE/B,SAAQC,gBAAgB,QAAO,eAAe;AAE9C,OAAO,MAAMC,uBAAuB;IAClCC,KAAK;QAAC;KAAc;IACpBC,MAAM,CAACC,YAAsB;eAAIH,qBAAqBC,GAAG;YAAE;YAAQE;SAAU;AAC/E,EAAE;AAkBF,OAAO,eAAeC,gBAAgB,EACpCD,SAAS,EACTE,QAAQ,EAAE,EACVC,MAAM,EACNC,MAAM,EAMP;IACC,MAAMC,SAAS,IAAIC,gBAAgB;QAACC,YAAYP;QAAWE,OAAOM,OAAON;IAAM;IAC/E,IAAIC,QAAQE,OAAOI,GAAG,CAAC,UAAUN;IACjC,OAAOP,iBACL,MAAML,kBAAkBD,8BAA8B,CAAC,aAAa,EAAEe,OAAOK,QAAQ,IAAI,EAAE;QACzFN;IACF;AAEJ;AACA,OAAO,SAASO,gCACdX,SAA6B,EAC7BE,QAAQ,EAAE;IAEV,OAAO;QACLU,UAAUZ,YACNH,qBAAqBE,IAAI,CAACC,aACzB;eAAIH,qBAAqBC,GAAG;YAAE;SAAO;QAC1Ce,SAASC,QAAQd;QACjBe,kBAAkBC;QAClBC,SAAS,CAAC,EAACC,SAAS,EAAEd,MAAM,EAAuD,GACjFH,gBAAgB;gBAACD,WAAWA,aAAa;gBAAIE;gBAAOC,QAAQe;gBAAWd;YAAM;QAC/Ee,kBAAkB,CAACC,WAA6BA,SAASC,UAAU,IAAIL;QACvEM,iBAAiB9B;IACnB;AACF;AACA,OAAO,SAAS+B,wBAAwBvB,SAA6B;IACnE,OAAOP,aAAa;QAClBmB,UAAUZ,YACNH,qBAAqBE,IAAI,CAACC,aACzB;eAAIH,qBAAqBC,GAAG;YAAE;SAAO;QAC1Ce,SAASC,QAAQd;QACjBiB,SAAS,CAAC,EAACb,MAAM,EAAC,GAAKH,gBAAgB;gBAACD,WAAWA,aAAa;gBAAII;YAAM;IAC5E;AACF;AACA,OAAO,SAASoB,4BAA4BxB,SAA6B,EAAEE,QAAQ,EAAE;IACnF,OAAOR,iBAAiBiB,gCAAgCX,WAAWE;AACrE;AACA,OAAO,SAASuB,oBAAoBzB,SAA6B;IAC/D,OAAOL,SAAS4B,wBAAwBvB;AAC1C"}
@@ -0,0 +1,17 @@
1
+ import type { DefinitionDto, DefinitionSyncSummaryDto } from '@shipfox/api-definitions-dto';
2
+ import type { ProjectResponseDto } from '@shipfox/api-projects-dto';
3
+ import type { Definition, DefinitionList, DefinitionSyncSummary } from '#core/definition.js';
4
+ import type { Project, ProjectList } from '#core/project.js';
5
+ export declare function toProject(dto: ProjectResponseDto): Project;
6
+ export declare function toProjectList(dto: {
7
+ projects: ProjectResponseDto[];
8
+ next_cursor: string | null;
9
+ }): ProjectList;
10
+ export declare function toDefinition(dto: DefinitionDto): Definition;
11
+ export declare function toDefinitionSyncSummary(dto: DefinitionSyncSummaryDto): DefinitionSyncSummary;
12
+ export declare function toDefinitionList(dto: {
13
+ definitions: DefinitionDto[];
14
+ sync: DefinitionSyncSummaryDto | null;
15
+ next_cursor: string | null;
16
+ }): DefinitionList;
17
+ //# sourceMappingURL=mappers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mappers.d.ts","sourceRoot":"","sources":["../../../src/hooks/api/mappers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,aAAa,EAAE,wBAAwB,EAAC,MAAM,8BAA8B,CAAC;AAC1F,OAAO,KAAK,EAAC,kBAAkB,EAAC,MAAM,2BAA2B,CAAC;AAClE,OAAO,KAAK,EAAC,UAAU,EAAE,cAAc,EAAE,qBAAqB,EAAC,MAAM,qBAAqB,CAAC;AAC3F,OAAO,KAAK,EAAC,OAAO,EAAE,WAAW,EAAC,MAAM,kBAAkB,CAAC;AAE3D,wBAAgB,SAAS,CAAC,GAAG,EAAE,kBAAkB,GAAG,OAAO,CAY1D;AAED,wBAAgB,aAAa,CAAC,GAAG,EAAE;IACjC,QAAQ,EAAE,kBAAkB,EAAE,CAAC;IAC/B,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B,GAAG,WAAW,CAEd;AAED,wBAAgB,YAAY,CAAC,GAAG,EAAE,aAAa,GAAG,UAAU,CAgB3D;AAED,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,wBAAwB,GAAG,qBAAqB,CAU5F;AAED,wBAAgB,gBAAgB,CAAC,GAAG,EAAE;IACpC,WAAW,EAAE,aAAa,EAAE,CAAC;IAC7B,IAAI,EAAE,wBAAwB,GAAG,IAAI,CAAC;IACtC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B,GAAG,cAAc,CAMjB"}
@@ -0,0 +1,56 @@
1
+ export function toProject(dto) {
2
+ return {
3
+ id: dto.id,
4
+ workspaceId: dto.workspace_id,
5
+ name: dto.name,
6
+ source: {
7
+ connectionId: dto.source.connection_id,
8
+ externalRepositoryId: dto.source.external_repository_id
9
+ },
10
+ createdAt: dto.created_at,
11
+ updatedAt: dto.updated_at
12
+ };
13
+ }
14
+ export function toProjectList(dto) {
15
+ return {
16
+ projects: dto.projects.map(toProject),
17
+ nextCursor: dto.next_cursor
18
+ };
19
+ }
20
+ export function toDefinition(dto) {
21
+ return {
22
+ id: dto.id,
23
+ projectId: dto.project_id,
24
+ configPath: dto.config_path,
25
+ source: dto.source,
26
+ sha: dto.sha,
27
+ ref: dto.ref,
28
+ name: dto.name,
29
+ workflowDocument: dto.workflow_document,
30
+ workflowModel: dto.workflow_model,
31
+ manualTrigger: dto.manual_trigger,
32
+ fetchedAt: dto.fetched_at,
33
+ createdAt: dto.created_at,
34
+ updatedAt: dto.updated_at
35
+ };
36
+ }
37
+ export function toDefinitionSyncSummary(dto) {
38
+ return {
39
+ ref: dto.ref,
40
+ status: dto.status,
41
+ lastSyncAt: dto.last_sync_at,
42
+ startedAt: dto.started_at,
43
+ finishedAt: dto.finished_at,
44
+ lastErrorCode: dto.last_error_code,
45
+ lastErrorMessage: dto.last_error_message
46
+ };
47
+ }
48
+ export function toDefinitionList(dto) {
49
+ return {
50
+ definitions: dto.definitions.map(toDefinition),
51
+ sync: dto.sync && toDefinitionSyncSummary(dto.sync),
52
+ nextCursor: dto.next_cursor
53
+ };
54
+ }
55
+
56
+ //# sourceMappingURL=mappers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/hooks/api/mappers.ts"],"sourcesContent":["import type {DefinitionDto, DefinitionSyncSummaryDto} from '@shipfox/api-definitions-dto';\nimport type {ProjectResponseDto} from '@shipfox/api-projects-dto';\nimport type {Definition, DefinitionList, DefinitionSyncSummary} from '#core/definition.js';\nimport type {Project, ProjectList} from '#core/project.js';\n\nexport function toProject(dto: ProjectResponseDto): Project {\n return {\n id: dto.id,\n workspaceId: dto.workspace_id,\n name: dto.name,\n source: {\n connectionId: dto.source.connection_id,\n externalRepositoryId: dto.source.external_repository_id,\n },\n createdAt: dto.created_at,\n updatedAt: dto.updated_at,\n };\n}\n\nexport function toProjectList(dto: {\n projects: ProjectResponseDto[];\n next_cursor: string | null;\n}): ProjectList {\n return {projects: dto.projects.map(toProject), nextCursor: dto.next_cursor};\n}\n\nexport function toDefinition(dto: DefinitionDto): Definition {\n return {\n id: dto.id,\n projectId: dto.project_id,\n configPath: dto.config_path,\n source: dto.source,\n sha: dto.sha,\n ref: dto.ref,\n name: dto.name,\n workflowDocument: dto.workflow_document,\n workflowModel: dto.workflow_model,\n manualTrigger: dto.manual_trigger,\n fetchedAt: dto.fetched_at,\n createdAt: dto.created_at,\n updatedAt: dto.updated_at,\n };\n}\n\nexport function toDefinitionSyncSummary(dto: DefinitionSyncSummaryDto): DefinitionSyncSummary {\n return {\n ref: dto.ref,\n status: dto.status,\n lastSyncAt: dto.last_sync_at,\n startedAt: dto.started_at,\n finishedAt: dto.finished_at,\n lastErrorCode: dto.last_error_code,\n lastErrorMessage: dto.last_error_message,\n };\n}\n\nexport function toDefinitionList(dto: {\n definitions: DefinitionDto[];\n sync: DefinitionSyncSummaryDto | null;\n next_cursor: string | null;\n}): DefinitionList {\n return {\n definitions: dto.definitions.map(toDefinition),\n sync: dto.sync && toDefinitionSyncSummary(dto.sync),\n nextCursor: dto.next_cursor,\n };\n}\n"],"names":["toProject","dto","id","workspaceId","workspace_id","name","source","connectionId","connection_id","externalRepositoryId","external_repository_id","createdAt","created_at","updatedAt","updated_at","toProjectList","projects","map","nextCursor","next_cursor","toDefinition","projectId","project_id","configPath","config_path","sha","ref","workflowDocument","workflow_document","workflowModel","workflow_model","manualTrigger","manual_trigger","fetchedAt","fetched_at","toDefinitionSyncSummary","status","lastSyncAt","last_sync_at","startedAt","started_at","finishedAt","finished_at","lastErrorCode","last_error_code","lastErrorMessage","last_error_message","toDefinitionList","definitions","sync"],"mappings":"AAKA,OAAO,SAASA,UAAUC,GAAuB;IAC/C,OAAO;QACLC,IAAID,IAAIC,EAAE;QACVC,aAAaF,IAAIG,YAAY;QAC7BC,MAAMJ,IAAII,IAAI;QACdC,QAAQ;YACNC,cAAcN,IAAIK,MAAM,CAACE,aAAa;YACtCC,sBAAsBR,IAAIK,MAAM,CAACI,sBAAsB;QACzD;QACAC,WAAWV,IAAIW,UAAU;QACzBC,WAAWZ,IAAIa,UAAU;IAC3B;AACF;AAEA,OAAO,SAASC,cAAcd,GAG7B;IACC,OAAO;QAACe,UAAUf,IAAIe,QAAQ,CAACC,GAAG,CAACjB;QAAYkB,YAAYjB,IAAIkB,WAAW;IAAA;AAC5E;AAEA,OAAO,SAASC,aAAanB,GAAkB;IAC7C,OAAO;QACLC,IAAID,IAAIC,EAAE;QACVmB,WAAWpB,IAAIqB,UAAU;QACzBC,YAAYtB,IAAIuB,WAAW;QAC3BlB,QAAQL,IAAIK,MAAM;QAClBmB,KAAKxB,IAAIwB,GAAG;QACZC,KAAKzB,IAAIyB,GAAG;QACZrB,MAAMJ,IAAII,IAAI;QACdsB,kBAAkB1B,IAAI2B,iBAAiB;QACvCC,eAAe5B,IAAI6B,cAAc;QACjCC,eAAe9B,IAAI+B,cAAc;QACjCC,WAAWhC,IAAIiC,UAAU;QACzBvB,WAAWV,IAAIW,UAAU;QACzBC,WAAWZ,IAAIa,UAAU;IAC3B;AACF;AAEA,OAAO,SAASqB,wBAAwBlC,GAA6B;IACnE,OAAO;QACLyB,KAAKzB,IAAIyB,GAAG;QACZU,QAAQnC,IAAImC,MAAM;QAClBC,YAAYpC,IAAIqC,YAAY;QAC5BC,WAAWtC,IAAIuC,UAAU;QACzBC,YAAYxC,IAAIyC,WAAW;QAC3BC,eAAe1C,IAAI2C,eAAe;QAClCC,kBAAkB5C,IAAI6C,kBAAkB;IAC1C;AACF;AAEA,OAAO,SAASC,iBAAiB9C,GAIhC;IACC,OAAO;QACL+C,aAAa/C,IAAI+C,WAAW,CAAC/B,GAAG,CAACG;QACjC6B,MAAMhD,IAAIgD,IAAI,IAAId,wBAAwBlC,IAAIgD,IAAI;QAClD/B,YAAYjB,IAAIkB,WAAW;IAC7B;AACF"}
@@ -1,97 +1,31 @@
1
- import type { CreateProjectBodyDto, ListProjectsResponseDto } from '@shipfox/api-projects-dto';
2
- import { type FetchQueryOptions } from '@tanstack/react-query';
1
+ import { type InfiniteData, type UseInfiniteQueryOptions, type UseQueryOptions } from '@tanstack/react-query';
2
+ import type { CreateProjectCommand, Project, ProjectList } from '#core/project.js';
3
3
  export declare const projectsQueryKeys: {
4
4
  all: readonly ["projects"];
5
5
  list: (workspaceId: string, search?: string) => readonly ["projects", "list", string, string];
6
6
  exists: (workspaceId: string) => readonly ["projects", "exists", string];
7
7
  detail: (projectId: string) => readonly ["projects", "detail", string];
8
8
  };
9
- type ProjectExistenceQueryOptions = FetchQueryOptions<ListProjectsResponseDto, Error, ListProjectsResponseDto, ReturnType<typeof projectsQueryKeys.exists>>;
9
+ type ProjectListQueryKey = ReturnType<typeof projectsQueryKeys.list> | readonly ['projects', 'list'];
10
+ type ProjectExistenceQueryKey = ReturnType<typeof projectsQueryKeys.exists> | readonly ['projects', 'exists'];
11
+ type ProjectDetailQueryKey = ReturnType<typeof projectsQueryKeys.detail> | readonly ['projects', 'detail'];
12
+ type ProjectListInfiniteQueryOptions = UseInfiniteQueryOptions<ProjectList, Error, InfiniteData<ProjectList, string | undefined>, ProjectListQueryKey, string | undefined>;
13
+ type ProjectExistenceQueryOptions = UseQueryOptions<ProjectList, Error, ProjectList, ProjectExistenceQueryKey>;
14
+ type ProjectDetailQueryOptions = UseQueryOptions<Project, Error, Project, ProjectDetailQueryKey>;
10
15
  export declare function listProjects({ workspaceId, limit, cursor, search, signal, }: {
11
16
  workspaceId: string;
12
17
  limit?: number;
13
18
  cursor?: string | undefined;
14
19
  search?: string | undefined;
15
- signal?: AbortSignal;
16
- }): Promise<{
17
- projects: {
18
- id: string;
19
- workspace_id: string;
20
- name: string;
21
- source: {
22
- connection_id: string;
23
- external_repository_id: string;
24
- };
25
- created_at: string;
26
- updated_at: string;
27
- }[];
28
- next_cursor: string | null;
29
- }>;
30
- export declare function getProject(projectId: string): Promise<{
31
- id: string;
32
- workspace_id: string;
33
- name: string;
34
- source: {
35
- connection_id: string;
36
- external_repository_id: string;
37
- };
38
- created_at: string;
39
- updated_at: string;
40
- }>;
41
- export declare function createProject(body: CreateProjectBodyDto): Promise<{
42
- id: string;
43
- workspace_id: string;
44
- name: string;
45
- source: {
46
- connection_id: string;
47
- external_repository_id: string;
48
- };
49
- created_at: string;
50
- updated_at: string;
51
- }>;
52
- export declare function projectExistenceQueryOptions(workspaceId: string): ProjectExistenceQueryOptions;
53
- export declare function useProjectsInfiniteQuery(workspaceId: string | undefined, search?: string, limit?: number): import("@tanstack/react-query").UseInfiniteQueryResult<import("@tanstack/react-query").InfiniteData<{
54
- projects: {
55
- id: string;
56
- workspace_id: string;
57
- name: string;
58
- source: {
59
- connection_id: string;
60
- external_repository_id: string;
61
- };
62
- created_at: string;
63
- updated_at: string;
64
- }[];
65
- next_cursor: string | null;
66
- }, unknown>, Error>;
67
- export declare function useProjectQuery(projectId: string | undefined): import("@tanstack/react-query").UseQueryResult<NoInfer<{
68
- id: string;
69
- workspace_id: string;
70
- name: string;
71
- source: {
72
- connection_id: string;
73
- external_repository_id: string;
74
- };
75
- created_at: string;
76
- updated_at: string;
77
- }>, Error>;
78
- export declare function useCreateProjectMutation(): import("@tanstack/react-query").UseMutationResult<{
79
- id: string;
80
- workspace_id: string;
81
- name: string;
82
- source: {
83
- connection_id: string;
84
- external_repository_id: string;
85
- };
86
- created_at: string;
87
- updated_at: string;
88
- }, Error, {
89
- workspace_id: string;
90
- name: string;
91
- source: {
92
- connection_id: string;
93
- external_repository_id: string;
94
- };
95
- }, unknown>;
20
+ signal?: AbortSignal | undefined;
21
+ }): Promise<ProjectList>;
22
+ export declare function getProject(projectId: string): Promise<Project>;
23
+ export declare function createProject(command: CreateProjectCommand): Promise<Project>;
24
+ export declare function projectsInfiniteQueryOptions(workspaceId: string | undefined, search?: string, limit?: number): ProjectListInfiniteQueryOptions;
25
+ export declare function projectExistenceQueryOptions(workspaceId: string | undefined): ProjectExistenceQueryOptions;
26
+ export declare function projectQueryOptions(projectId: string | undefined): ProjectDetailQueryOptions;
27
+ export declare function useProjectsInfiniteQuery(workspaceId: string | undefined, search?: string, limit?: number): import("@tanstack/react-query").UseInfiniteQueryResult<InfiniteData<ProjectList, string | undefined>, Error>;
28
+ export declare function useProjectQuery(projectId: string | undefined): import("@tanstack/react-query").UseQueryResult<NoInfer<Project>, Error>;
29
+ export declare function useCreateProjectMutation(): import("@tanstack/react-query").UseMutationResult<Project, Error, CreateProjectCommand, unknown>;
96
30
  export {};
97
31
  //# sourceMappingURL=projects.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"projects.d.ts","sourceRoot":"","sources":["../../../src/hooks/api/projects.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,oBAAoB,EACpB,uBAAuB,EAExB,MAAM,2BAA2B,CAAC;AAEnC,OAAO,EACL,KAAK,iBAAiB,EAMvB,MAAM,uBAAuB,CAAC;AAE/B,eAAO,MAAM,iBAAiB;;wBAER,MAAM,WAAW,MAAM;0BAErB,MAAM;wBACR,MAAM;CAC3B,CAAC;AAEF,KAAK,4BAA4B,GAAG,iBAAiB,CACnD,uBAAuB,EACvB,KAAK,EACL,uBAAuB,EACvB,UAAU,CAAC,OAAO,iBAAiB,CAAC,MAAM,CAAC,CAC5C,CAAC;AAEF,wBAAsB,YAAY,CAAC,EACjC,WAAW,EACX,KAAU,EACV,MAAM,EACN,MAAM,EACN,MAAM,GACP,EAAE;IACD,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5B,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5B,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;;;;;;;;;;;;;GAMA;AAED,wBAAsB,UAAU,CAAC,SAAS,EAAE,MAAM;;;;;;;;;;GAEjD;AAED,wBAAsB,aAAa,CAAC,IAAI,EAAE,oBAAoB;;;;;;;;;;GAE7D;AAED,wBAAgB,4BAA4B,CAAC,WAAW,EAAE,MAAM,GAAG,4BAA4B,CAM9F;AAED,wBAAgB,wBAAwB,CACtC,WAAW,EAAE,MAAM,GAAG,SAAS,EAC/B,MAAM,CAAC,EAAE,MAAM,EACf,KAAK,SAAK;;;;;;;;;;;;;oBAaX;AAED,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS;;;;;;;;;;WAQ5D;AAED,wBAAgB,wBAAwB;;;;;;;;;;;;;;;;;YAEvC"}
1
+ {"version":3,"file":"projects.d.ts","sourceRoot":"","sources":["../../../src/hooks/api/projects.ts"],"names":[],"mappings":"AAMA,OAAO,EACL,KAAK,YAAY,EAGjB,KAAK,uBAAuB,EAC5B,KAAK,eAAe,EAKrB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,KAAK,EAAC,oBAAoB,EAAE,OAAO,EAAE,WAAW,EAAC,MAAM,kBAAkB,CAAC;AAGjF,eAAO,MAAM,iBAAiB;;wBAER,MAAM;0BAEJ,MAAM;wBACR,MAAM;CAC3B,CAAC;AAEF,KAAK,mBAAmB,GACpB,UAAU,CAAC,OAAO,iBAAiB,CAAC,IAAI,CAAC,GACzC,SAAS,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;AAClC,KAAK,wBAAwB,GACzB,UAAU,CAAC,OAAO,iBAAiB,CAAC,MAAM,CAAC,GAC3C,SAAS,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;AACpC,KAAK,qBAAqB,GACtB,UAAU,CAAC,OAAO,iBAAiB,CAAC,MAAM,CAAC,GAC3C,SAAS,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;AAEpC,KAAK,+BAA+B,GAAG,uBAAuB,CAC5D,WAAW,EACX,KAAK,EACL,YAAY,CAAC,WAAW,EAAE,MAAM,GAAG,SAAS,CAAC,EAC7C,mBAAmB,EACnB,MAAM,GAAG,SAAS,CACnB,CAAC;AACF,KAAK,4BAA4B,GAAG,eAAe,CACjD,WAAW,EACX,KAAK,EACL,WAAW,EACX,wBAAwB,CACzB,CAAC;AACF,KAAK,yBAAyB,GAAG,eAAe,CAAC,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,qBAAqB,CAAC,CAAC;AAEjG,wBAAsB,YAAY,CAAC,EACjC,WAAW,EACX,KAAU,EACV,MAAM,EACN,MAAM,EACN,MAAM,GACP,EAAE;IACD,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5B,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5B,MAAM,CAAC,EAAE,WAAW,GAAG,SAAS,CAAC;CAClC,GAAG,OAAO,CAAC,WAAW,CAAC,CAOvB;AAED,wBAAsB,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAEpE;AAED,wBAAsB,aAAa,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,OAAO,CAAC,CAYnF;AAED,wBAAgB,4BAA4B,CAC1C,WAAW,EAAE,MAAM,GAAG,SAAS,EAC/B,MAAM,CAAC,EAAE,MAAM,EACf,KAAK,SAAK,GACT,+BAA+B,CAmBjC;AAED,wBAAgB,4BAA4B,CAC1C,WAAW,EAAE,MAAM,GAAG,SAAS,GAC9B,4BAA4B,CAS9B;AAED,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,GAAG,yBAAyB,CAQ5F;AAED,wBAAgB,wBAAwB,CACtC,WAAW,EAAE,MAAM,GAAG,SAAS,EAC/B,MAAM,CAAC,EAAE,MAAM,EACf,KAAK,SAAK,gHAGX;AACD,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,2EAE5D;AAED,wBAAgB,wBAAwB,qGAoBvC"}
@@ -1,14 +1,16 @@
1
- import { apiRequest } from '@shipfox/client-api';
2
- import { keepPreviousData, queryOptions, useInfiniteQuery, useMutation, useQuery } from '@tanstack/react-query';
1
+ import { createProjectBodySchema, listProjectsResponseSchema, projectResponseSchema } from '@shipfox/api-projects-dto';
2
+ import { checkedApiRequest } from '@shipfox/client-api';
3
+ import { keepPreviousData, queryOptions, useInfiniteQuery, useMutation, useQuery, useQueryClient } from '@tanstack/react-query';
4
+ import { toProject, toProjectList } from './mappers.js';
3
5
  export const projectsQueryKeys = {
4
6
  all: [
5
7
  'projects'
6
8
  ],
7
- list: (workspaceId, search)=>[
9
+ list: (workspaceId, search = '')=>[
8
10
  ...projectsQueryKeys.all,
9
11
  'list',
10
12
  workspaceId,
11
- search ?? ''
13
+ search
12
14
  ],
13
15
  exists: (workspaceId)=>[
14
16
  ...projectsQueryKeys.all,
@@ -28,33 +30,31 @@ export async function listProjects({ workspaceId, limit = 50, cursor, search, si
28
30
  });
29
31
  if (cursor) params.set('cursor', cursor);
30
32
  if (search) params.set('search', search);
31
- return await apiRequest(`/projects?${params.toString()}`, {
33
+ return toProjectList(await checkedApiRequest(listProjectsResponseSchema, `/projects?${params.toString()}`, {
32
34
  signal
33
- });
35
+ }));
34
36
  }
35
37
  export async function getProject(projectId) {
36
- return await apiRequest(`/projects/${projectId}`);
38
+ return toProject(await checkedApiRequest(projectResponseSchema, `/projects/${projectId}`));
37
39
  }
38
- export async function createProject(body) {
39
- return await apiRequest('/projects', {
40
+ export async function createProject(command) {
41
+ const body = createProjectBodySchema.parse({
42
+ workspace_id: command.workspaceId,
43
+ name: command.name,
44
+ source: {
45
+ connection_id: command.source.connectionId,
46
+ external_repository_id: command.source.externalRepositoryId
47
+ }
48
+ });
49
+ return toProject(await checkedApiRequest(projectResponseSchema, '/projects', {
40
50
  method: 'POST',
41
51
  body
42
- });
43
- }
44
- export function projectExistenceQueryOptions(workspaceId) {
45
- return queryOptions({
46
- queryKey: projectsQueryKeys.exists(workspaceId),
47
- queryFn: ({ signal })=>listProjects({
48
- workspaceId,
49
- limit: 1,
50
- signal
51
- }),
52
- staleTime: 30_000
53
- });
52
+ }));
54
53
  }
55
- export function useProjectsInfiniteQuery(workspaceId, search, limit = 50) {
56
- return useInfiniteQuery({
57
- queryKey: workspaceId ? projectsQueryKeys.list(workspaceId, search) : [
54
+ export function projectsInfiniteQueryOptions(workspaceId, search, limit = 50) {
55
+ const normalizedSearch = search?.trim() ?? '';
56
+ return {
57
+ queryKey: workspaceId ? projectsQueryKeys.list(workspaceId, normalizedSearch) : [
58
58
  ...projectsQueryKeys.all,
59
59
  'list'
60
60
  ],
@@ -64,15 +64,30 @@ export function useProjectsInfiniteQuery(workspaceId, search, limit = 50) {
64
64
  workspaceId: workspaceId ?? '',
65
65
  limit,
66
66
  cursor: pageParam,
67
- search,
67
+ search: normalizedSearch || undefined,
68
68
  signal
69
69
  }),
70
- getNextPageParam: (lastPage)=>lastPage.next_cursor ?? undefined,
70
+ getNextPageParam: (lastPage)=>lastPage.nextCursor ?? undefined,
71
71
  placeholderData: keepPreviousData
72
+ };
73
+ }
74
+ export function projectExistenceQueryOptions(workspaceId) {
75
+ return queryOptions({
76
+ queryKey: workspaceId ? projectsQueryKeys.exists(workspaceId) : [
77
+ ...projectsQueryKeys.all,
78
+ 'exists'
79
+ ],
80
+ enabled: Boolean(workspaceId),
81
+ queryFn: ({ signal })=>listProjects({
82
+ workspaceId: workspaceId ?? '',
83
+ limit: 1,
84
+ signal
85
+ }),
86
+ staleTime: 30_000
72
87
  });
73
88
  }
74
- export function useProjectQuery(projectId) {
75
- return useQuery({
89
+ export function projectQueryOptions(projectId) {
90
+ return queryOptions({
76
91
  queryKey: projectId ? projectsQueryKeys.detail(projectId) : [
77
92
  ...projectsQueryKeys.all,
78
93
  'detail'
@@ -81,9 +96,37 @@ export function useProjectQuery(projectId) {
81
96
  queryFn: ()=>getProject(projectId ?? '')
82
97
  });
83
98
  }
99
+ export function useProjectsInfiniteQuery(workspaceId, search, limit = 50) {
100
+ return useInfiniteQuery(projectsInfiniteQueryOptions(workspaceId, search, limit));
101
+ }
102
+ export function useProjectQuery(projectId) {
103
+ return useQuery(projectQueryOptions(projectId));
104
+ }
84
105
  export function useCreateProjectMutation() {
106
+ const queryClient = useQueryClient();
85
107
  return useMutation({
86
- mutationFn: createProject
108
+ mutationFn: createProject,
109
+ onSuccess: async (project)=>{
110
+ queryClient.setQueryData(projectsQueryKeys.detail(project.id), project);
111
+ queryClient.setQueryData(projectsQueryKeys.exists(project.workspaceId), {
112
+ projects: [
113
+ project
114
+ ],
115
+ nextCursor: null
116
+ });
117
+ await queryClient.invalidateQueries({
118
+ queryKey: projectsQueryKeys.list(project.workspaceId)
119
+ });
120
+ },
121
+ onError: async (_error, command)=>{
122
+ await queryClient.invalidateQueries({
123
+ queryKey: projectsQueryKeys.exists(command.workspaceId),
124
+ refetchType: 'active'
125
+ });
126
+ await queryClient.invalidateQueries({
127
+ queryKey: projectsQueryKeys.list(command.workspaceId)
128
+ });
129
+ }
87
130
  });
88
131
  }
89
132
 
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/hooks/api/projects.ts"],"sourcesContent":["import type {\n CreateProjectBodyDto,\n ListProjectsResponseDto,\n ProjectResponseDto,\n} from '@shipfox/api-projects-dto';\nimport {apiRequest} from '@shipfox/client-api';\nimport {\n type FetchQueryOptions,\n keepPreviousData,\n queryOptions,\n useInfiniteQuery,\n useMutation,\n useQuery,\n} from '@tanstack/react-query';\n\nexport const projectsQueryKeys = {\n all: ['projects'] as const,\n list: (workspaceId: string, search?: string) =>\n [...projectsQueryKeys.all, 'list', workspaceId, search ?? ''] as const,\n exists: (workspaceId: string) => [...projectsQueryKeys.all, 'exists', workspaceId] as const,\n detail: (projectId: string) => [...projectsQueryKeys.all, 'detail', projectId] as const,\n};\n\ntype ProjectExistenceQueryOptions = FetchQueryOptions<\n ListProjectsResponseDto,\n Error,\n ListProjectsResponseDto,\n ReturnType<typeof projectsQueryKeys.exists>\n>;\n\nexport async function listProjects({\n workspaceId,\n limit = 50,\n cursor,\n search,\n signal,\n}: {\n workspaceId: string;\n limit?: number;\n cursor?: string | undefined;\n search?: string | undefined;\n signal?: AbortSignal;\n}) {\n const params = new URLSearchParams({workspace_id: workspaceId, limit: String(limit)});\n if (cursor) params.set('cursor', cursor);\n if (search) params.set('search', search);\n\n return await apiRequest<ListProjectsResponseDto>(`/projects?${params.toString()}`, {signal});\n}\n\nexport async function getProject(projectId: string) {\n return await apiRequest<ProjectResponseDto>(`/projects/${projectId}`);\n}\n\nexport async function createProject(body: CreateProjectBodyDto) {\n return await apiRequest<ProjectResponseDto>('/projects', {method: 'POST', body});\n}\n\nexport function projectExistenceQueryOptions(workspaceId: string): ProjectExistenceQueryOptions {\n return queryOptions({\n queryKey: projectsQueryKeys.exists(workspaceId),\n queryFn: ({signal}) => listProjects({workspaceId, limit: 1, signal}),\n staleTime: 30_000,\n });\n}\n\nexport function useProjectsInfiniteQuery(\n workspaceId: string | undefined,\n search?: string,\n limit = 50,\n) {\n return useInfiniteQuery({\n queryKey: workspaceId\n ? projectsQueryKeys.list(workspaceId, search)\n : [...projectsQueryKeys.all, 'list'],\n enabled: Boolean(workspaceId),\n initialPageParam: undefined as string | undefined,\n queryFn: ({pageParam, signal}) =>\n listProjects({workspaceId: workspaceId ?? '', limit, cursor: pageParam, search, signal}),\n getNextPageParam: (lastPage) => lastPage.next_cursor ?? undefined,\n placeholderData: keepPreviousData,\n });\n}\n\nexport function useProjectQuery(projectId: string | undefined) {\n return useQuery({\n queryKey: projectId\n ? projectsQueryKeys.detail(projectId)\n : [...projectsQueryKeys.all, 'detail'],\n enabled: Boolean(projectId),\n queryFn: () => getProject(projectId ?? ''),\n });\n}\n\nexport function useCreateProjectMutation() {\n return useMutation({mutationFn: createProject});\n}\n"],"names":["apiRequest","keepPreviousData","queryOptions","useInfiniteQuery","useMutation","useQuery","projectsQueryKeys","all","list","workspaceId","search","exists","detail","projectId","listProjects","limit","cursor","signal","params","URLSearchParams","workspace_id","String","set","toString","getProject","createProject","body","method","projectExistenceQueryOptions","queryKey","queryFn","staleTime","useProjectsInfiniteQuery","enabled","Boolean","initialPageParam","undefined","pageParam","getNextPageParam","lastPage","next_cursor","placeholderData","useProjectQuery","useCreateProjectMutation","mutationFn"],"mappings":"AAKA,SAAQA,UAAU,QAAO,sBAAsB;AAC/C,SAEEC,gBAAgB,EAChBC,YAAY,EACZC,gBAAgB,EAChBC,WAAW,EACXC,QAAQ,QACH,wBAAwB;AAE/B,OAAO,MAAMC,oBAAoB;IAC/BC,KAAK;QAAC;KAAW;IACjBC,MAAM,CAACC,aAAqBC,SAC1B;eAAIJ,kBAAkBC,GAAG;YAAE;YAAQE;YAAaC,UAAU;SAAG;IAC/DC,QAAQ,CAACF,cAAwB;eAAIH,kBAAkBC,GAAG;YAAE;YAAUE;SAAY;IAClFG,QAAQ,CAACC,YAAsB;eAAIP,kBAAkBC,GAAG;YAAE;YAAUM;SAAU;AAChF,EAAE;AASF,OAAO,eAAeC,aAAa,EACjCL,WAAW,EACXM,QAAQ,EAAE,EACVC,MAAM,EACNN,MAAM,EACNO,MAAM,EAOP;IACC,MAAMC,SAAS,IAAIC,gBAAgB;QAACC,cAAcX;QAAaM,OAAOM,OAAON;IAAM;IACnF,IAAIC,QAAQE,OAAOI,GAAG,CAAC,UAAUN;IACjC,IAAIN,QAAQQ,OAAOI,GAAG,CAAC,UAAUZ;IAEjC,OAAO,MAAMV,WAAoC,CAAC,UAAU,EAAEkB,OAAOK,QAAQ,IAAI,EAAE;QAACN;IAAM;AAC5F;AAEA,OAAO,eAAeO,WAAWX,SAAiB;IAChD,OAAO,MAAMb,WAA+B,CAAC,UAAU,EAAEa,WAAW;AACtE;AAEA,OAAO,eAAeY,cAAcC,IAA0B;IAC5D,OAAO,MAAM1B,WAA+B,aAAa;QAAC2B,QAAQ;QAAQD;IAAI;AAChF;AAEA,OAAO,SAASE,6BAA6BnB,WAAmB;IAC9D,OAAOP,aAAa;QAClB2B,UAAUvB,kBAAkBK,MAAM,CAACF;QACnCqB,SAAS,CAAC,EAACb,MAAM,EAAC,GAAKH,aAAa;gBAACL;gBAAaM,OAAO;gBAAGE;YAAM;QAClEc,WAAW;IACb;AACF;AAEA,OAAO,SAASC,yBACdvB,WAA+B,EAC/BC,MAAe,EACfK,QAAQ,EAAE;IAEV,OAAOZ,iBAAiB;QACtB0B,UAAUpB,cACNH,kBAAkBE,IAAI,CAACC,aAAaC,UACpC;eAAIJ,kBAAkBC,GAAG;YAAE;SAAO;QACtC0B,SAASC,QAAQzB;QACjB0B,kBAAkBC;QAClBN,SAAS,CAAC,EAACO,SAAS,EAAEpB,MAAM,EAAC,GAC3BH,aAAa;gBAACL,aAAaA,eAAe;gBAAIM;gBAAOC,QAAQqB;gBAAW3B;gBAAQO;YAAM;QACxFqB,kBAAkB,CAACC,WAAaA,SAASC,WAAW,IAAIJ;QACxDK,iBAAiBxC;IACnB;AACF;AAEA,OAAO,SAASyC,gBAAgB7B,SAA6B;IAC3D,OAAOR,SAAS;QACdwB,UAAUhB,YACNP,kBAAkBM,MAAM,CAACC,aACzB;eAAIP,kBAAkBC,GAAG;YAAE;SAAS;QACxC0B,SAASC,QAAQrB;QACjBiB,SAAS,IAAMN,WAAWX,aAAa;IACzC;AACF;AAEA,OAAO,SAAS8B;IACd,OAAOvC,YAAY;QAACwC,YAAYnB;IAAa;AAC/C"}
1
+ {"version":3,"sources":["../../../src/hooks/api/projects.ts"],"sourcesContent":["import {\n createProjectBodySchema,\n listProjectsResponseSchema,\n projectResponseSchema,\n} from '@shipfox/api-projects-dto';\nimport {checkedApiRequest} from '@shipfox/client-api';\nimport {\n type InfiniteData,\n keepPreviousData,\n queryOptions,\n type UseInfiniteQueryOptions,\n type UseQueryOptions,\n useInfiniteQuery,\n useMutation,\n useQuery,\n useQueryClient,\n} from '@tanstack/react-query';\nimport type {CreateProjectCommand, Project, ProjectList} from '#core/project.js';\nimport {toProject, toProjectList} from './mappers.js';\n\nexport const projectsQueryKeys = {\n all: ['projects'] as const,\n list: (workspaceId: string, search = '') =>\n [...projectsQueryKeys.all, 'list', workspaceId, search] as const,\n exists: (workspaceId: string) => [...projectsQueryKeys.all, 'exists', workspaceId] as const,\n detail: (projectId: string) => [...projectsQueryKeys.all, 'detail', projectId] as const,\n};\n\ntype ProjectListQueryKey =\n | ReturnType<typeof projectsQueryKeys.list>\n | readonly ['projects', 'list'];\ntype ProjectExistenceQueryKey =\n | ReturnType<typeof projectsQueryKeys.exists>\n | readonly ['projects', 'exists'];\ntype ProjectDetailQueryKey =\n | ReturnType<typeof projectsQueryKeys.detail>\n | readonly ['projects', 'detail'];\n\ntype ProjectListInfiniteQueryOptions = UseInfiniteQueryOptions<\n ProjectList,\n Error,\n InfiniteData<ProjectList, string | undefined>,\n ProjectListQueryKey,\n string | undefined\n>;\ntype ProjectExistenceQueryOptions = UseQueryOptions<\n ProjectList,\n Error,\n ProjectList,\n ProjectExistenceQueryKey\n>;\ntype ProjectDetailQueryOptions = UseQueryOptions<Project, Error, Project, ProjectDetailQueryKey>;\n\nexport async function listProjects({\n workspaceId,\n limit = 50,\n cursor,\n search,\n signal,\n}: {\n workspaceId: string;\n limit?: number;\n cursor?: string | undefined;\n search?: string | undefined;\n signal?: AbortSignal | undefined;\n}): Promise<ProjectList> {\n const params = new URLSearchParams({workspace_id: workspaceId, limit: String(limit)});\n if (cursor) params.set('cursor', cursor);\n if (search) params.set('search', search);\n return toProjectList(\n await checkedApiRequest(listProjectsResponseSchema, `/projects?${params.toString()}`, {signal}),\n );\n}\n\nexport async function getProject(projectId: string): Promise<Project> {\n return toProject(await checkedApiRequest(projectResponseSchema, `/projects/${projectId}`));\n}\n\nexport async function createProject(command: CreateProjectCommand): Promise<Project> {\n const body = createProjectBodySchema.parse({\n workspace_id: command.workspaceId,\n name: command.name,\n source: {\n connection_id: command.source.connectionId,\n external_repository_id: command.source.externalRepositoryId,\n },\n });\n return toProject(\n await checkedApiRequest(projectResponseSchema, '/projects', {method: 'POST', body}),\n );\n}\n\nexport function projectsInfiniteQueryOptions(\n workspaceId: string | undefined,\n search?: string,\n limit = 50,\n): ProjectListInfiniteQueryOptions {\n const normalizedSearch = search?.trim() ?? '';\n return {\n queryKey: workspaceId\n ? projectsQueryKeys.list(workspaceId, normalizedSearch)\n : ([...projectsQueryKeys.all, 'list'] as const),\n enabled: Boolean(workspaceId),\n initialPageParam: undefined as string | undefined,\n queryFn: ({pageParam, signal}: {pageParam: string | undefined; signal: AbortSignal}) =>\n listProjects({\n workspaceId: workspaceId ?? '',\n limit,\n cursor: pageParam,\n search: normalizedSearch || undefined,\n signal,\n }),\n getNextPageParam: (lastPage: ProjectList) => lastPage.nextCursor ?? undefined,\n placeholderData: keepPreviousData,\n };\n}\n\nexport function projectExistenceQueryOptions(\n workspaceId: string | undefined,\n): ProjectExistenceQueryOptions {\n return queryOptions({\n queryKey: workspaceId\n ? projectsQueryKeys.exists(workspaceId)\n : ([...projectsQueryKeys.all, 'exists'] as const),\n enabled: Boolean(workspaceId),\n queryFn: ({signal}) => listProjects({workspaceId: workspaceId ?? '', limit: 1, signal}),\n staleTime: 30_000,\n });\n}\n\nexport function projectQueryOptions(projectId: string | undefined): ProjectDetailQueryOptions {\n return queryOptions({\n queryKey: projectId\n ? projectsQueryKeys.detail(projectId)\n : ([...projectsQueryKeys.all, 'detail'] as const),\n enabled: Boolean(projectId),\n queryFn: () => getProject(projectId ?? ''),\n });\n}\n\nexport function useProjectsInfiniteQuery(\n workspaceId: string | undefined,\n search?: string,\n limit = 50,\n) {\n return useInfiniteQuery(projectsInfiniteQueryOptions(workspaceId, search, limit));\n}\nexport function useProjectQuery(projectId: string | undefined) {\n return useQuery(projectQueryOptions(projectId));\n}\n\nexport function useCreateProjectMutation() {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: createProject,\n onSuccess: async (project) => {\n queryClient.setQueryData(projectsQueryKeys.detail(project.id), project);\n queryClient.setQueryData<ProjectList>(projectsQueryKeys.exists(project.workspaceId), {\n projects: [project],\n nextCursor: null,\n });\n await queryClient.invalidateQueries({queryKey: projectsQueryKeys.list(project.workspaceId)});\n },\n onError: async (_error, command) => {\n await queryClient.invalidateQueries({\n queryKey: projectsQueryKeys.exists(command.workspaceId),\n refetchType: 'active',\n });\n await queryClient.invalidateQueries({queryKey: projectsQueryKeys.list(command.workspaceId)});\n },\n });\n}\n"],"names":["createProjectBodySchema","listProjectsResponseSchema","projectResponseSchema","checkedApiRequest","keepPreviousData","queryOptions","useInfiniteQuery","useMutation","useQuery","useQueryClient","toProject","toProjectList","projectsQueryKeys","all","list","workspaceId","search","exists","detail","projectId","listProjects","limit","cursor","signal","params","URLSearchParams","workspace_id","String","set","toString","getProject","createProject","command","body","parse","name","source","connection_id","connectionId","external_repository_id","externalRepositoryId","method","projectsInfiniteQueryOptions","normalizedSearch","trim","queryKey","enabled","Boolean","initialPageParam","undefined","queryFn","pageParam","getNextPageParam","lastPage","nextCursor","placeholderData","projectExistenceQueryOptions","staleTime","projectQueryOptions","useProjectsInfiniteQuery","useProjectQuery","useCreateProjectMutation","queryClient","mutationFn","onSuccess","project","setQueryData","id","projects","invalidateQueries","onError","_error","refetchType"],"mappings":"AAAA,SACEA,uBAAuB,EACvBC,0BAA0B,EAC1BC,qBAAqB,QAChB,4BAA4B;AACnC,SAAQC,iBAAiB,QAAO,sBAAsB;AACtD,SAEEC,gBAAgB,EAChBC,YAAY,EAGZC,gBAAgB,EAChBC,WAAW,EACXC,QAAQ,EACRC,cAAc,QACT,wBAAwB;AAE/B,SAAQC,SAAS,EAAEC,aAAa,QAAO,eAAe;AAEtD,OAAO,MAAMC,oBAAoB;IAC/BC,KAAK;QAAC;KAAW;IACjBC,MAAM,CAACC,aAAqBC,SAAS,EAAE,GACrC;eAAIJ,kBAAkBC,GAAG;YAAE;YAAQE;YAAaC;SAAO;IACzDC,QAAQ,CAACF,cAAwB;eAAIH,kBAAkBC,GAAG;YAAE;YAAUE;SAAY;IAClFG,QAAQ,CAACC,YAAsB;eAAIP,kBAAkBC,GAAG;YAAE;YAAUM;SAAU;AAChF,EAAE;AA2BF,OAAO,eAAeC,aAAa,EACjCL,WAAW,EACXM,QAAQ,EAAE,EACVC,MAAM,EACNN,MAAM,EACNO,MAAM,EAOP;IACC,MAAMC,SAAS,IAAIC,gBAAgB;QAACC,cAAcX;QAAaM,OAAOM,OAAON;IAAM;IACnF,IAAIC,QAAQE,OAAOI,GAAG,CAAC,UAAUN;IACjC,IAAIN,QAAQQ,OAAOI,GAAG,CAAC,UAAUZ;IACjC,OAAOL,cACL,MAAMR,kBAAkBF,4BAA4B,CAAC,UAAU,EAAEuB,OAAOK,QAAQ,IAAI,EAAE;QAACN;IAAM;AAEjG;AAEA,OAAO,eAAeO,WAAWX,SAAiB;IAChD,OAAOT,UAAU,MAAMP,kBAAkBD,uBAAuB,CAAC,UAAU,EAAEiB,WAAW;AAC1F;AAEA,OAAO,eAAeY,cAAcC,OAA6B;IAC/D,MAAMC,OAAOjC,wBAAwBkC,KAAK,CAAC;QACzCR,cAAcM,QAAQjB,WAAW;QACjCoB,MAAMH,QAAQG,IAAI;QAClBC,QAAQ;YACNC,eAAeL,QAAQI,MAAM,CAACE,YAAY;YAC1CC,wBAAwBP,QAAQI,MAAM,CAACI,oBAAoB;QAC7D;IACF;IACA,OAAO9B,UACL,MAAMP,kBAAkBD,uBAAuB,aAAa;QAACuC,QAAQ;QAAQR;IAAI;AAErF;AAEA,OAAO,SAASS,6BACd3B,WAA+B,EAC/BC,MAAe,EACfK,QAAQ,EAAE;IAEV,MAAMsB,mBAAmB3B,QAAQ4B,UAAU;IAC3C,OAAO;QACLC,UAAU9B,cACNH,kBAAkBE,IAAI,CAACC,aAAa4B,oBACnC;eAAI/B,kBAAkBC,GAAG;YAAE;SAAO;QACvCiC,SAASC,QAAQhC;QACjBiC,kBAAkBC;QAClBC,SAAS,CAAC,EAACC,SAAS,EAAE5B,MAAM,EAAuD,GACjFH,aAAa;gBACXL,aAAaA,eAAe;gBAC5BM;gBACAC,QAAQ6B;gBACRnC,QAAQ2B,oBAAoBM;gBAC5B1B;YACF;QACF6B,kBAAkB,CAACC,WAA0BA,SAASC,UAAU,IAAIL;QACpEM,iBAAiBnD;IACnB;AACF;AAEA,OAAO,SAASoD,6BACdzC,WAA+B;IAE/B,OAAOV,aAAa;QAClBwC,UAAU9B,cACNH,kBAAkBK,MAAM,CAACF,eACxB;eAAIH,kBAAkBC,GAAG;YAAE;SAAS;QACzCiC,SAASC,QAAQhC;QACjBmC,SAAS,CAAC,EAAC3B,MAAM,EAAC,GAAKH,aAAa;gBAACL,aAAaA,eAAe;gBAAIM,OAAO;gBAAGE;YAAM;QACrFkC,WAAW;IACb;AACF;AAEA,OAAO,SAASC,oBAAoBvC,SAA6B;IAC/D,OAAOd,aAAa;QAClBwC,UAAU1B,YACNP,kBAAkBM,MAAM,CAACC,aACxB;eAAIP,kBAAkBC,GAAG;YAAE;SAAS;QACzCiC,SAASC,QAAQ5B;QACjB+B,SAAS,IAAMpB,WAAWX,aAAa;IACzC;AACF;AAEA,OAAO,SAASwC,yBACd5C,WAA+B,EAC/BC,MAAe,EACfK,QAAQ,EAAE;IAEV,OAAOf,iBAAiBoC,6BAA6B3B,aAAaC,QAAQK;AAC5E;AACA,OAAO,SAASuC,gBAAgBzC,SAA6B;IAC3D,OAAOX,SAASkD,oBAAoBvC;AACtC;AAEA,OAAO,SAAS0C;IACd,MAAMC,cAAcrD;IACpB,OAAOF,YAAY;QACjBwD,YAAYhC;QACZiC,WAAW,OAAOC;YAChBH,YAAYI,YAAY,CAACtD,kBAAkBM,MAAM,CAAC+C,QAAQE,EAAE,GAAGF;YAC/DH,YAAYI,YAAY,CAActD,kBAAkBK,MAAM,CAACgD,QAAQlD,WAAW,GAAG;gBACnFqD,UAAU;oBAACH;iBAAQ;gBACnBX,YAAY;YACd;YACA,MAAMQ,YAAYO,iBAAiB,CAAC;gBAACxB,UAAUjC,kBAAkBE,IAAI,CAACmD,QAAQlD,WAAW;YAAC;QAC5F;QACAuD,SAAS,OAAOC,QAAQvC;YACtB,MAAM8B,YAAYO,iBAAiB,CAAC;gBAClCxB,UAAUjC,kBAAkBK,MAAM,CAACe,QAAQjB,WAAW;gBACtDyD,aAAa;YACf;YACA,MAAMV,YAAYO,iBAAiB,CAAC;gBAACxB,UAAUjC,kBAAkBE,IAAI,CAACkB,QAAQjB,WAAW;YAAC;QAC5F;IACF;AACF"}
package/dist/index.d.ts CHANGED
@@ -1,3 +1,5 @@
1
+ export type { Definition, DefinitionList, DefinitionSyncSummary } from '#core/definition.js';
2
+ export { type CreateProjectCommand, type Project, type ProjectList, type ProjectSource, projectNameFromRepository, selectProjectSource, } from '#core/project.js';
1
3
  export { ProjectBreadcrumb, ProjectLayoutGuard } from './chrome.js';
2
4
  export { ProjectCrumb, type ProjectCrumbProps } from './components/project-crumb.js';
3
5
  export { ProjectSwitcher, type ProjectSwitcherProps } from './components/project-switcher.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,iBAAiB,EAAE,kBAAkB,EAAC,MAAM,aAAa,CAAC;AAClE,OAAO,EAAC,YAAY,EAAE,KAAK,iBAAiB,EAAC,MAAM,+BAA+B,CAAC;AACnF,OAAO,EAAC,eAAe,EAAE,KAAK,oBAAoB,EAAC,MAAM,kCAAkC,CAAC;AAC5F,OAAO,EAAC,WAAW,EAAC,MAAM,8BAA8B,CAAC;AACzD,cAAc,4BAA4B,CAAC;AAC3C,cAAc,yBAAyB,CAAC;AACxC,cAAc,gCAAgC,CAAC;AAC/C,cAAc,wBAAwB,CAAC;AACvC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,oBAAoB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAC,UAAU,EAAE,cAAc,EAAE,qBAAqB,EAAC,MAAM,qBAAqB,CAAC;AAC3F,OAAO,EACL,KAAK,oBAAoB,EACzB,KAAK,OAAO,EACZ,KAAK,WAAW,EAChB,KAAK,aAAa,EAClB,yBAAyB,EACzB,mBAAmB,GACpB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAC,iBAAiB,EAAE,kBAAkB,EAAC,MAAM,aAAa,CAAC;AAClE,OAAO,EAAC,YAAY,EAAE,KAAK,iBAAiB,EAAC,MAAM,+BAA+B,CAAC;AACnF,OAAO,EAAC,eAAe,EAAE,KAAK,oBAAoB,EAAC,MAAM,kCAAkC,CAAC;AAC5F,OAAO,EAAC,WAAW,EAAC,MAAM,8BAA8B,CAAC;AACzD,cAAc,4BAA4B,CAAC;AAC3C,cAAc,yBAAyB,CAAC;AACxC,cAAc,gCAAgC,CAAC;AAC/C,cAAc,wBAAwB,CAAC;AACvC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,oBAAoB,CAAC"}
package/dist/index.js CHANGED
@@ -1,3 +1,4 @@
1
+ export { projectNameFromRepository, selectProjectSource } from '#core/project.js';
1
2
  export { ProjectBreadcrumb, ProjectLayoutGuard } from './chrome.js';
2
3
  export { ProjectCrumb } from './components/project-crumb.js';
3
4
  export { ProjectSwitcher } from './components/project-switcher.js';
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"sourcesContent":["export {ProjectBreadcrumb, ProjectLayoutGuard} from './chrome.js';\nexport {ProjectCrumb, type ProjectCrumbProps} from './components/project-crumb.js';\nexport {ProjectSwitcher, type ProjectSwitcherProps} from './components/project-switcher.js';\nexport {SourceStrip} from './components/source-strip.js';\nexport * from './hooks/api/definitions.js';\nexport * from './hooks/api/projects.js';\nexport * from './pages/create-project-page.js';\nexport * from './pages/home-router.js';\nexport * from './pages/projects-hub-page.js';\nexport * from './project-error.js';\n"],"names":["ProjectBreadcrumb","ProjectLayoutGuard","ProjectCrumb","ProjectSwitcher","SourceStrip"],"mappings":"AAAA,SAAQA,iBAAiB,EAAEC,kBAAkB,QAAO,cAAc;AAClE,SAAQC,YAAY,QAA+B,gCAAgC;AACnF,SAAQC,eAAe,QAAkC,mCAAmC;AAC5F,SAAQC,WAAW,QAAO,+BAA+B;AACzD,cAAc,6BAA6B;AAC3C,cAAc,0BAA0B;AACxC,cAAc,iCAAiC;AAC/C,cAAc,yBAAyB;AACvC,cAAc,+BAA+B;AAC7C,cAAc,qBAAqB"}
1
+ {"version":3,"sources":["../src/index.ts"],"sourcesContent":["export type {Definition, DefinitionList, DefinitionSyncSummary} from '#core/definition.js';\nexport {\n type CreateProjectCommand,\n type Project,\n type ProjectList,\n type ProjectSource,\n projectNameFromRepository,\n selectProjectSource,\n} from '#core/project.js';\nexport {ProjectBreadcrumb, ProjectLayoutGuard} from './chrome.js';\nexport {ProjectCrumb, type ProjectCrumbProps} from './components/project-crumb.js';\nexport {ProjectSwitcher, type ProjectSwitcherProps} from './components/project-switcher.js';\nexport {SourceStrip} from './components/source-strip.js';\nexport * from './hooks/api/definitions.js';\nexport * from './hooks/api/projects.js';\nexport * from './pages/create-project-page.js';\nexport * from './pages/home-router.js';\nexport * from './pages/projects-hub-page.js';\nexport * from './project-error.js';\n"],"names":["projectNameFromRepository","selectProjectSource","ProjectBreadcrumb","ProjectLayoutGuard","ProjectCrumb","ProjectSwitcher","SourceStrip"],"mappings":"AACA,SAKEA,yBAAyB,EACzBC,mBAAmB,QACd,mBAAmB;AAC1B,SAAQC,iBAAiB,EAAEC,kBAAkB,QAAO,cAAc;AAClE,SAAQC,YAAY,QAA+B,gCAAgC;AACnF,SAAQC,eAAe,QAAkC,mCAAmC;AAC5F,SAAQC,WAAW,QAAO,+BAA+B;AACzD,cAAc,6BAA6B;AAC3C,cAAc,0BAA0B;AACxC,cAAc,iCAAiC;AAC/C,cAAc,yBAAyB;AACvC,cAAc,+BAA+B;AAC7C,cAAc,qBAAqB"}
@@ -1 +1 @@
1
- {"version":3,"file":"create-project-page.d.ts","sourceRoot":"","sources":["../../src/pages/create-project-page.tsx"],"names":[],"mappings":"AA+BA,wBAAgB,iBAAiB,gCA0ShC"}
1
+ {"version":3,"file":"create-project-page.d.ts","sourceRoot":"","sources":["../../src/pages/create-project-page.tsx"],"names":[],"mappings":"AAyBA,wBAAgB,iBAAiB,gCAiShC"}
@@ -10,21 +10,19 @@ import { FullPageLoader } from '@shipfox/react-ui/loader';
10
10
  import { toast } from '@shipfox/react-ui/toast';
11
11
  import { Header, Text } from '@shipfox/react-ui/typography';
12
12
  import { useForm } from '@tanstack/react-form';
13
- import { useQueryClient } from '@tanstack/react-query';
14
13
  import { Link, Navigate, useNavigate } from '@tanstack/react-router';
15
14
  import { useEffect, useRef, useState } from 'react';
16
15
  import { ModelProviderReminderBanner } from '#components/model-provider-reminder-banner.js';
17
- import { projectsQueryKeys, useCreateProjectMutation } from '#hooks/api/projects.js';
16
+ import { projectNameFromRepository } from '#core/project.js';
17
+ import { useCreateProjectMutation } from '#hooks/api/projects.js';
18
18
  import { projectErrorCopy } from '#project-error.js';
19
- const REPOSITORY_NAME_SPLIT_RE = /[/-]/;
20
19
  export function CreateProjectPage() {
21
20
  const workspace = useMaybeActiveWorkspace();
22
- const queryClient = useQueryClient();
23
21
  const navigate = useNavigate();
24
22
  const createProject = useCreateProjectMutation();
25
23
  const errorRef = useRef(null);
26
24
  const connectionsQuery = useSourceConnectionsQuery(workspace?.id);
27
- const connections = connectionsQuery.data?.connections ?? [];
25
+ const connections = connectionsQuery.data ?? [];
28
26
  const [selectedConnectionId, setSelectedConnectionId] = useState();
29
27
  const singleConnectionId = connections.length === 1 ? connections[0]?.id : undefined;
30
28
  const effectiveSelectedConnectionId = selectedConnectionId ?? singleConnectionId;
@@ -47,13 +45,13 @@ export function CreateProjectPage() {
47
45
  const [selectedRepositoryId, setSelectedRepositoryId] = useState();
48
46
  useEffect(()=>{
49
47
  if (!selectedRepositoryId && repositories[0]) {
50
- setSelectedRepositoryId(repositories[0].external_repository_id);
48
+ setSelectedRepositoryId(repositories[0].externalRepositoryId);
51
49
  }
52
50
  }, [
53
51
  repositories,
54
52
  selectedRepositoryId
55
53
  ]);
56
- const selectedRepository = repositories.find((repository)=>repository.external_repository_id === selectedRepositoryId);
54
+ const selectedRepository = repositories.find((repository)=>repository.externalRepositoryId === selectedRepositoryId);
57
55
  const [nameTouched, setNameTouched] = useState(false);
58
56
  const defaultProjectName = projectNameFromRepository(selectedRepository?.name ?? selectedRepositoryId ?? '');
59
57
  const [formError, setFormError] = useState();
@@ -111,20 +109,15 @@ export function CreateProjectPage() {
111
109
  return;
112
110
  }
113
111
  try {
114
- const projectBody = createProjectBodySchema.parse({
115
- workspace_id: workspace.id,
112
+ const command = {
113
+ workspaceId: workspace.id,
116
114
  name: projectName,
117
115
  source: {
118
- connection_id: selectedConnection.id,
119
- external_repository_id: selectedRepository.external_repository_id
116
+ connectionId: selectedConnection.id,
117
+ externalRepositoryId: selectedRepository.externalRepositoryId
120
118
  }
121
- });
122
- const project = await createProject.mutateAsync(projectBody);
123
- setWorkspaceProjectExists(queryClient, workspace.id, project);
124
- queryClient.setQueryData(projectsQueryKeys.detail(project.id), project);
125
- await queryClient.invalidateQueries({
126
- queryKey: projectsQueryKeys.list(workspace.id)
127
- });
119
+ };
120
+ const project = await createProject.mutateAsync(command);
128
121
  toast.success('Project created.');
129
122
  await navigate({
130
123
  to: '/workspaces/$wid/projects/$pid',
@@ -136,13 +129,6 @@ export function CreateProjectPage() {
136
129
  } catch (error) {
137
130
  const copy = projectErrorCopy(error);
138
131
  if (copy.existingProjectId) {
139
- await queryClient.invalidateQueries({
140
- queryKey: projectsQueryKeys.exists(workspace.id),
141
- refetchType: 'active'
142
- });
143
- await queryClient.invalidateQueries({
144
- queryKey: projectsQueryKeys.list(workspace.id)
145
- });
146
132
  toast.info('Project already exists.');
147
133
  await navigate({
148
134
  to: '/workspaces/$wid/projects/$pid',
@@ -321,7 +307,7 @@ export function CreateProjectPage() {
321
307
  }) : null,
322
308
  /*#__PURE__*/ _jsx(ProjectSummary, {
323
309
  connection: selectedConnection,
324
- repositoryName: selectedRepository?.full_name
310
+ repositoryName: selectedRepository?.fullName
325
311
  }),
326
312
  /*#__PURE__*/ _jsx(form.Field, {
327
313
  name: "name",
@@ -380,9 +366,6 @@ function ProjectSummary({ connection, repositoryName }) {
380
366
  ]
381
367
  });
382
368
  }
383
- function projectNameFromRepository(repositoryId) {
384
- return repositoryId.trim().split(REPOSITORY_NAME_SPLIT_RE).filter(Boolean).map((part)=>part.charAt(0).toUpperCase() + part.slice(1)).join(' ');
385
- }
386
369
  function useDebouncedValue(value, delayMs) {
387
370
  const [debounced, setDebounced] = useState(value);
388
371
  useEffect(()=>{
@@ -394,13 +377,5 @@ function useDebouncedValue(value, delayMs) {
394
377
  ]);
395
378
  return debounced;
396
379
  }
397
- function setWorkspaceProjectExists(queryClient, workspaceId, project) {
398
- queryClient.setQueryData(projectsQueryKeys.exists(workspaceId), {
399
- projects: [
400
- project
401
- ],
402
- next_cursor: null
403
- });
404
- }
405
380
 
406
381
  //# sourceMappingURL=create-project-page.js.map