@shipfox/client-triggers 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 (93) hide show
  1. package/.turbo/turbo-build.log +1 -1
  2. package/CHANGELOG.md +50 -0
  3. package/dist/components/events-filter-bar.d.ts +3 -4
  4. package/dist/components/events-filter-bar.d.ts.map +1 -1
  5. package/dist/components/events-filter-bar.js +8 -16
  6. package/dist/components/events-filter-bar.js.map +1 -1
  7. package/dist/components/events-list.d.ts.map +1 -1
  8. package/dist/components/events-list.js +2 -4
  9. package/dist/components/events-list.js.map +1 -1
  10. package/dist/components/events-list.stories.d.ts +1 -16
  11. package/dist/components/events-list.stories.d.ts.map +1 -1
  12. package/dist/components/events-list.stories.js +2 -1
  13. package/dist/components/events-list.stories.js.map +1 -1
  14. package/dist/components/trigger-event-detail.d.ts +2 -2
  15. package/dist/components/trigger-event-detail.d.ts.map +1 -1
  16. package/dist/components/trigger-event-detail.js +7 -7
  17. package/dist/components/trigger-event-detail.js.map +1 -1
  18. package/dist/components/trigger-event-detail.stories.d.ts +1 -36
  19. package/dist/components/trigger-event-detail.stories.d.ts.map +1 -1
  20. package/dist/components/trigger-event-detail.stories.js +6 -3
  21. package/dist/components/trigger-event-detail.stories.js.map +1 -1
  22. package/dist/components/trigger-event-result.d.ts +2 -2
  23. package/dist/components/trigger-event-result.d.ts.map +1 -1
  24. package/dist/components/trigger-event-result.js +8 -16
  25. package/dist/components/trigger-event-result.js.map +1 -1
  26. package/dist/components/trigger-event-row.d.ts +2 -2
  27. package/dist/components/trigger-event-row.d.ts.map +1 -1
  28. package/dist/components/trigger-event-row.js +1 -1
  29. package/dist/components/trigger-event-row.js.map +1 -1
  30. package/dist/components/trigger-source-icon.d.ts +8 -6
  31. package/dist/components/trigger-source-icon.d.ts.map +1 -1
  32. package/dist/components/trigger-source-icon.js +4 -3
  33. package/dist/components/trigger-source-icon.js.map +1 -1
  34. package/dist/components/types.d.ts +3 -4
  35. package/dist/components/types.d.ts.map +1 -1
  36. package/dist/components/types.js.map +1 -1
  37. package/dist/core/trigger-event.d.ts +78 -0
  38. package/dist/core/trigger-event.d.ts.map +1 -0
  39. package/dist/core/trigger-event.js +71 -0
  40. package/dist/core/trigger-event.js.map +1 -0
  41. package/dist/feature.d.ts +7 -0
  42. package/dist/feature.d.ts.map +1 -1
  43. package/dist/feature.js +10 -9
  44. package/dist/feature.js.map +1 -1
  45. package/dist/hooks/api/trigger-event-mapper.d.ts +7 -0
  46. package/dist/hooks/api/trigger-event-mapper.d.ts.map +1 -0
  47. package/dist/hooks/api/trigger-event-mapper.js +57 -0
  48. package/dist/hooks/api/trigger-event-mapper.js.map +1 -0
  49. package/dist/hooks/api/trigger-events.d.ts +15 -138
  50. package/dist/hooks/api/trigger-events.d.ts.map +1 -1
  51. package/dist/hooks/api/trigger-events.js +44 -47
  52. package/dist/hooks/api/trigger-events.js.map +1 -1
  53. package/dist/index.d.ts +1 -0
  54. package/dist/index.d.ts.map +1 -1
  55. package/dist/index.js +1 -0
  56. package/dist/index.js.map +1 -1
  57. package/dist/pages/events-page.d.ts +1 -1
  58. package/dist/pages/events-page.d.ts.map +1 -1
  59. package/dist/pages/events-page.js +1 -1
  60. package/dist/pages/events-page.js.map +1 -1
  61. package/dist/routes/events-settings.js.map +1 -1
  62. package/dist/search.d.ts +3 -3
  63. package/dist/search.d.ts.map +1 -1
  64. package/dist/search.js +3 -4
  65. package/dist/search.js.map +1 -1
  66. package/dist/tsconfig.test.tsbuildinfo +1 -1
  67. package/package.json +10 -10
  68. package/src/components/events-filter-bar.tsx +16 -11
  69. package/src/components/events-list.stories.tsx +3 -2
  70. package/src/components/events-list.test.tsx +4 -3
  71. package/src/components/events-list.tsx +2 -12
  72. package/src/components/trigger-event-detail.stories.tsx +7 -3
  73. package/src/components/trigger-event-detail.test.tsx +6 -1
  74. package/src/components/trigger-event-detail.tsx +21 -18
  75. package/src/components/trigger-event-result.test.ts +6 -6
  76. package/src/components/trigger-event-result.ts +9 -13
  77. package/src/components/trigger-event-row.tsx +5 -5
  78. package/src/components/trigger-source-icon.tsx +9 -7
  79. package/src/components/types.ts +7 -7
  80. package/src/core/trigger-event.test.ts +40 -0
  81. package/src/core/trigger-event.ts +126 -0
  82. package/src/feature.ts +6 -4
  83. package/src/hooks/api/trigger-event-mapper.test.ts +88 -0
  84. package/src/hooks/api/trigger-event-mapper.ts +76 -0
  85. package/src/hooks/api/trigger-events.test.ts +49 -12
  86. package/src/hooks/api/trigger-events.ts +96 -56
  87. package/src/index.ts +1 -0
  88. package/src/pages/events-page.test.tsx +4 -4
  89. package/src/pages/events-page.tsx +3 -4
  90. package/src/routes/events-settings.tsx +1 -1
  91. package/src/search.ts +4 -5
  92. package/tsconfig.build.tsbuildinfo +1 -1
  93. package/vercel.json +5 -0
@@ -0,0 +1,57 @@
1
+ export function toTriggerEventSummary(event) {
2
+ return {
3
+ id: event.id,
4
+ eventRef: event.event_ref,
5
+ origin: event.origin,
6
+ workspaceId: event.workspace_id,
7
+ provider: event.provider,
8
+ source: event.source,
9
+ event: event.event,
10
+ deliveryId: event.delivery_id,
11
+ connectionId: event.connection_id,
12
+ outcome: event.outcome,
13
+ matchedCount: event.matched_count,
14
+ receivedAt: event.received_at,
15
+ processedAt: event.processed_at,
16
+ createdAt: event.created_at
17
+ };
18
+ }
19
+ export function toTriggerEventListPage(response) {
20
+ return {
21
+ events: response.trigger_events.map(toTriggerEventSummary),
22
+ nextCursor: response.next_cursor
23
+ };
24
+ }
25
+ function toMatchedWorkflowResult(decision) {
26
+ return {
27
+ id: decision.id,
28
+ subscriptionName: decision.subscription_name,
29
+ decision: decision.decision,
30
+ projectId: decision.project_id,
31
+ runId: decision.run_id,
32
+ runName: decision.run_name,
33
+ reason: decision.reason
34
+ };
35
+ }
36
+ export function toTriggerEventDetail(response) {
37
+ return {
38
+ ...toTriggerEventSummary(response),
39
+ connectionName: response.connection_name,
40
+ payload: response.payload,
41
+ decisions: response.decisions.map(toMatchedWorkflowResult)
42
+ };
43
+ }
44
+ function toTriggerEventFacetItem(item) {
45
+ return {
46
+ value: item.value,
47
+ count: item.count
48
+ };
49
+ }
50
+ export function toTriggerEventFacets(response) {
51
+ return {
52
+ sources: response.sources.map(toTriggerEventFacetItem),
53
+ events: response.events.map(toTriggerEventFacetItem)
54
+ };
55
+ }
56
+
57
+ //# sourceMappingURL=trigger-event-mapper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/hooks/api/trigger-event-mapper.ts"],"sourcesContent":["import type {\n TriggerDecisionDto,\n TriggerEventDetailResponseDto,\n TriggerEventFacetItemDto,\n TriggerEventFacetsResponseDto,\n TriggerEventListItemDto,\n TriggerEventListResponseDto,\n} from '@shipfox/api-triggers-dto';\nimport type {\n TriggerEventDetail,\n TriggerEventFacetItem,\n TriggerEventFacets,\n TriggerEventListPage,\n TriggerEventMatchedWorkflowResult,\n TriggerEventSummary,\n} from '#core/trigger-event.js';\n\nexport function toTriggerEventSummary(event: TriggerEventListItemDto): TriggerEventSummary {\n return {\n id: event.id,\n eventRef: event.event_ref,\n origin: event.origin,\n workspaceId: event.workspace_id,\n provider: event.provider,\n source: event.source,\n event: event.event,\n deliveryId: event.delivery_id,\n connectionId: event.connection_id,\n outcome: event.outcome,\n matchedCount: event.matched_count,\n receivedAt: event.received_at,\n processedAt: event.processed_at,\n createdAt: event.created_at,\n };\n}\n\nexport function toTriggerEventListPage(\n response: TriggerEventListResponseDto,\n): TriggerEventListPage {\n return {\n events: response.trigger_events.map(toTriggerEventSummary),\n nextCursor: response.next_cursor,\n };\n}\n\nfunction toMatchedWorkflowResult(decision: TriggerDecisionDto): TriggerEventMatchedWorkflowResult {\n return {\n id: decision.id,\n subscriptionName: decision.subscription_name,\n decision: decision.decision,\n projectId: decision.project_id,\n runId: decision.run_id,\n runName: decision.run_name,\n reason: decision.reason,\n };\n}\n\nexport function toTriggerEventDetail(response: TriggerEventDetailResponseDto): TriggerEventDetail {\n return {\n ...toTriggerEventSummary(response),\n connectionName: response.connection_name,\n payload: response.payload,\n decisions: response.decisions.map(toMatchedWorkflowResult),\n };\n}\n\nfunction toTriggerEventFacetItem(item: TriggerEventFacetItemDto): TriggerEventFacetItem {\n return {value: item.value, count: item.count};\n}\n\nexport function toTriggerEventFacets(response: TriggerEventFacetsResponseDto): TriggerEventFacets {\n return {\n sources: response.sources.map(toTriggerEventFacetItem),\n events: response.events.map(toTriggerEventFacetItem),\n };\n}\n"],"names":["toTriggerEventSummary","event","id","eventRef","event_ref","origin","workspaceId","workspace_id","provider","source","deliveryId","delivery_id","connectionId","connection_id","outcome","matchedCount","matched_count","receivedAt","received_at","processedAt","processed_at","createdAt","created_at","toTriggerEventListPage","response","events","trigger_events","map","nextCursor","next_cursor","toMatchedWorkflowResult","decision","subscriptionName","subscription_name","projectId","project_id","runId","run_id","runName","run_name","reason","toTriggerEventDetail","connectionName","connection_name","payload","decisions","toTriggerEventFacetItem","item","value","count","toTriggerEventFacets","sources"],"mappings":"AAiBA,OAAO,SAASA,sBAAsBC,KAA8B;IAClE,OAAO;QACLC,IAAID,MAAMC,EAAE;QACZC,UAAUF,MAAMG,SAAS;QACzBC,QAAQJ,MAAMI,MAAM;QACpBC,aAAaL,MAAMM,YAAY;QAC/BC,UAAUP,MAAMO,QAAQ;QACxBC,QAAQR,MAAMQ,MAAM;QACpBR,OAAOA,MAAMA,KAAK;QAClBS,YAAYT,MAAMU,WAAW;QAC7BC,cAAcX,MAAMY,aAAa;QACjCC,SAASb,MAAMa,OAAO;QACtBC,cAAcd,MAAMe,aAAa;QACjCC,YAAYhB,MAAMiB,WAAW;QAC7BC,aAAalB,MAAMmB,YAAY;QAC/BC,WAAWpB,MAAMqB,UAAU;IAC7B;AACF;AAEA,OAAO,SAASC,uBACdC,QAAqC;IAErC,OAAO;QACLC,QAAQD,SAASE,cAAc,CAACC,GAAG,CAAC3B;QACpC4B,YAAYJ,SAASK,WAAW;IAClC;AACF;AAEA,SAASC,wBAAwBC,QAA4B;IAC3D,OAAO;QACL7B,IAAI6B,SAAS7B,EAAE;QACf8B,kBAAkBD,SAASE,iBAAiB;QAC5CF,UAAUA,SAASA,QAAQ;QAC3BG,WAAWH,SAASI,UAAU;QAC9BC,OAAOL,SAASM,MAAM;QACtBC,SAASP,SAASQ,QAAQ;QAC1BC,QAAQT,SAASS,MAAM;IACzB;AACF;AAEA,OAAO,SAASC,qBAAqBjB,QAAuC;IAC1E,OAAO;QACL,GAAGxB,sBAAsBwB,SAAS;QAClCkB,gBAAgBlB,SAASmB,eAAe;QACxCC,SAASpB,SAASoB,OAAO;QACzBC,WAAWrB,SAASqB,SAAS,CAAClB,GAAG,CAACG;IACpC;AACF;AAEA,SAASgB,wBAAwBC,IAA8B;IAC7D,OAAO;QAACC,OAAOD,KAAKC,KAAK;QAAEC,OAAOF,KAAKE,KAAK;IAAA;AAC9C;AAEA,OAAO,SAASC,qBAAqB1B,QAAuC;IAC1E,OAAO;QACL2B,SAAS3B,SAAS2B,OAAO,CAACxB,GAAG,CAACmB;QAC9BrB,QAAQD,SAASC,MAAM,CAACE,GAAG,CAACmB;IAC9B;AACF"}
@@ -1,11 +1,9 @@
1
- import type { TriggerEventOutcomeDto } from '@shipfox/api-triggers-dto';
2
- export interface TriggerEventFilters {
3
- source?: string[] | undefined;
4
- event?: string[] | undefined;
5
- outcome?: TriggerEventOutcomeDto[] | undefined;
6
- from?: string | undefined;
7
- to?: string | undefined;
8
- }
1
+ import { type FetchQueryOptions, type InfiniteData, type UseInfiniteQueryOptions } from '@tanstack/react-query';
2
+ import { type TriggerEventFilters } from '#core/trigger-event.js';
3
+ export type { TriggerEventFilters } from '#core/trigger-event.js';
4
+ type TriggerEventsInfiniteQueryOptions = UseInfiniteQueryOptions<import('#core/trigger-event.js').TriggerEventListPage, Error, InfiniteData<import('#core/trigger-event.js').TriggerEventListPage, string | undefined>, ReturnType<typeof triggerEventsQueryKeys.list>, string | undefined>;
5
+ type TriggerEventQueryOptions = FetchQueryOptions<import('#core/trigger-event.js').TriggerEventDetail, Error, import('#core/trigger-event.js').TriggerEventDetail, ReturnType<typeof triggerEventsQueryKeys.detail>>;
6
+ type TriggerEventFacetsQueryOptions = FetchQueryOptions<import('#core/trigger-event.js').TriggerEventFacets, Error, import('#core/trigger-event.js').TriggerEventFacets, ReturnType<typeof triggerEventsQueryKeys.facets>>;
9
7
  export declare const triggerEventsQueryKeys: {
10
8
  all: readonly ["trigger-events"];
11
9
  lists: (workspaceId: string) => readonly ["trigger-events", "list", string];
@@ -25,140 +23,19 @@ export declare function listTriggerEvents({ workspaceId, filters, limit, cursor,
25
23
  limit?: number;
26
24
  cursor?: string | undefined;
27
25
  signal?: AbortSignal;
28
- }): Promise<{
29
- trigger_events: {
30
- id: string;
31
- event_ref: string;
32
- origin: "integration" | "manual" | "cron";
33
- workspace_id: string;
34
- provider: string | null;
35
- source: string;
36
- event: string;
37
- delivery_id: string | null;
38
- connection_id: string | null;
39
- outcome: "received" | "routed" | "discarded" | "failed" | "errored";
40
- matched_count: number;
41
- received_at: string;
42
- processed_at: string | null;
43
- created_at: string;
44
- }[];
45
- next_cursor: string | null;
46
- }>;
26
+ }): Promise<import("#core/trigger-event.js").TriggerEventListPage>;
47
27
  export declare function getTriggerEvent({ id, signal }: {
48
28
  id: string;
49
29
  signal?: AbortSignal;
50
- }): Promise<{
51
- id: string;
52
- event_ref: string;
53
- origin: "integration" | "manual" | "cron";
54
- workspace_id: string;
55
- provider: string | null;
56
- source: string;
57
- event: string;
58
- delivery_id: string | null;
59
- connection_id: string | null;
60
- outcome: "received" | "routed" | "discarded" | "failed" | "errored";
61
- matched_count: number;
62
- received_at: string;
63
- processed_at: string | null;
64
- created_at: string;
65
- connection_name: string | null;
66
- payload: Record<string, unknown> | null;
67
- decisions: {
68
- id: string;
69
- received_event_id: string;
70
- subscription_kind: "trigger" | "listener";
71
- subscription_id: string;
72
- subscription_name: string;
73
- workflow_definition_id: string | null;
74
- project_id: string | null;
75
- workflow_run_id: string | null;
76
- job_id: string | null;
77
- matcher_kind: "on" | "until" | null;
78
- matcher_ordinal: number | null;
79
- decision: "triggered" | "filter-error" | "dispatch-error";
80
- run_id: string | null;
81
- run_name: string | null;
82
- reason: string | null;
83
- created_at: string;
84
- }[];
85
- }>;
86
- export declare function useTriggerEventsInfiniteQuery(workspaceId: string | undefined, filters?: TriggerEventFilters, limit?: number): import("@tanstack/react-query").UseInfiniteQueryResult<import("@tanstack/react-query").InfiniteData<{
87
- trigger_events: {
88
- id: string;
89
- event_ref: string;
90
- origin: "integration" | "manual" | "cron";
91
- workspace_id: string;
92
- provider: string | null;
93
- source: string;
94
- event: string;
95
- delivery_id: string | null;
96
- connection_id: string | null;
97
- outcome: "received" | "routed" | "discarded" | "failed" | "errored";
98
- matched_count: number;
99
- received_at: string;
100
- processed_at: string | null;
101
- created_at: string;
102
- }[];
103
- next_cursor: string | null;
104
- }, unknown>, Error>;
105
- export declare function useTriggerEventQuery(id: string | undefined): import("@tanstack/react-query").UseQueryResult<NoInfer<{
106
- id: string;
107
- event_ref: string;
108
- origin: "integration" | "manual" | "cron";
109
- workspace_id: string;
110
- provider: string | null;
111
- source: string;
112
- event: string;
113
- delivery_id: string | null;
114
- connection_id: string | null;
115
- outcome: "received" | "routed" | "discarded" | "failed" | "errored";
116
- matched_count: number;
117
- received_at: string;
118
- processed_at: string | null;
119
- created_at: string;
120
- connection_name: string | null;
121
- payload: Record<string, unknown> | null;
122
- decisions: {
123
- id: string;
124
- received_event_id: string;
125
- subscription_kind: "trigger" | "listener";
126
- subscription_id: string;
127
- subscription_name: string;
128
- workflow_definition_id: string | null;
129
- project_id: string | null;
130
- workflow_run_id: string | null;
131
- job_id: string | null;
132
- matcher_kind: "on" | "until" | null;
133
- matcher_ordinal: number | null;
134
- decision: "triggered" | "filter-error" | "dispatch-error";
135
- run_id: string | null;
136
- run_name: string | null;
137
- reason: string | null;
138
- created_at: string;
139
- }[];
140
- }>, Error>;
30
+ }): Promise<import("#core/trigger-event.js").TriggerEventDetail>;
31
+ export declare function triggerEventsInfiniteQueryOptions(workspaceId: string, filters?: TriggerEventFilters, limit?: number): TriggerEventsInfiniteQueryOptions;
32
+ export declare function useTriggerEventsInfiniteQuery(workspaceId: string | undefined, filters?: TriggerEventFilters, limit?: number): import("@tanstack/react-query").UseInfiniteQueryResult<InfiniteData<import("#core/trigger-event.js").TriggerEventListPage, string | undefined>, Error>;
33
+ export declare function triggerEventQueryOptions(id: string): TriggerEventQueryOptions;
34
+ export declare function useTriggerEventQuery(id: string | undefined): import("@tanstack/react-query").UseQueryResult<NoInfer<import("#core/trigger-event.js").TriggerEventDetail>, Error>;
141
35
  export declare function getTriggerEventFacets({ workspaceId, signal, }: {
142
36
  workspaceId: string;
143
37
  signal?: AbortSignal;
144
- }): Promise<{
145
- sources: {
146
- value: string;
147
- count: number;
148
- }[];
149
- events: {
150
- value: string;
151
- count: number;
152
- }[];
153
- }>;
154
- export declare function useTriggerEventFacetsQuery(workspaceId: string | undefined): import("@tanstack/react-query").UseQueryResult<NoInfer<{
155
- sources: {
156
- value: string;
157
- count: number;
158
- }[];
159
- events: {
160
- value: string;
161
- count: number;
162
- }[];
163
- }>, Error>;
38
+ }): Promise<import("#core/trigger-event.js").TriggerEventFacets>;
39
+ export declare function triggerEventFacetsQueryOptions(workspaceId: string): TriggerEventFacetsQueryOptions;
40
+ export declare function useTriggerEventFacetsQuery(workspaceId: string | undefined): import("@tanstack/react-query").UseQueryResult<NoInfer<import("#core/trigger-event.js").TriggerEventFacets>, Error>;
164
41
  //# sourceMappingURL=trigger-events.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"trigger-events.d.ts","sourceRoot":"","sources":["../../../src/hooks/api/trigger-events.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAIV,sBAAsB,EACvB,MAAM,2BAA2B,CAAC;AAInC,MAAM,WAAW,mBAAmB;IAClC,MAAM,CAAC,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;IAC9B,KAAK,CAAC,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;IAC7B,OAAO,CAAC,EAAE,sBAAsB,EAAE,GAAG,SAAS,CAAC;IAC/C,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,EAAE,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACzB;AAyBD,eAAO,MAAM,sBAAsB;;yBAEZ,MAAM;wBACP,MAAM,WAAW,mBAAmB;;;;;;;iBAM3C,MAAM;0BACG,MAAM;CAC7B,CAAC;AAEF,wBAAsB,iBAAiB,CAAC,EACtC,WAAW,EACX,OAAY,EACZ,KAAU,EACV,MAAM,EACN,MAAM,GACP,EAAE;IACD,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,mBAAmB,CAAC;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5B,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;;;;;;;;;;;;;;;;;;GAYA;AAED,wBAAsB,eAAe,CAAC,EAAC,EAAE,EAAE,MAAM,EAAC,EAAE;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,WAAW,CAAA;CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAKrF;AAED,wBAAgB,6BAA6B,CAC3C,WAAW,EAAE,MAAM,GAAG,SAAS,EAC/B,OAAO,GAAE,mBAAwB,EACjC,KAAK,SAAK;;;;;;;;;;;;;;;;;;oBAmBX;AAED,wBAAgB,oBAAoB,CAAC,EAAE,EAAE,MAAM,GAAG,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;WAM1D;AAED,wBAAsB,qBAAqB,CAAC,EAC1C,WAAW,EACX,MAAM,GACP,EAAE;IACD,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;;;;;;;;;GAMA;AAED,wBAAgB,0BAA0B,CAAC,WAAW,EAAE,MAAM,GAAG,SAAS;;;;;;;;;WAUzE"}
1
+ {"version":3,"file":"trigger-events.d.ts","sourceRoot":"","sources":["../../../src/hooks/api/trigger-events.ts"],"names":[],"mappings":"AAMA,OAAO,EACL,KAAK,iBAAiB,EACtB,KAAK,YAAY,EAIjB,KAAK,uBAAuB,EAG7B,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAGL,KAAK,mBAAmB,EACzB,MAAM,wBAAwB,CAAC;AAOhC,YAAY,EAAC,mBAAmB,EAAC,MAAM,wBAAwB,CAAC;AAEhE,KAAK,iCAAiC,GAAG,uBAAuB,CAC9D,OAAO,wBAAwB,EAAE,oBAAoB,EACrD,KAAK,EACL,YAAY,CAAC,OAAO,wBAAwB,EAAE,oBAAoB,EAAE,MAAM,GAAG,SAAS,CAAC,EACvF,UAAU,CAAC,OAAO,sBAAsB,CAAC,IAAI,CAAC,EAC9C,MAAM,GAAG,SAAS,CACnB,CAAC;AAEF,KAAK,wBAAwB,GAAG,iBAAiB,CAC/C,OAAO,wBAAwB,EAAE,kBAAkB,EACnD,KAAK,EACL,OAAO,wBAAwB,EAAE,kBAAkB,EACnD,UAAU,CAAC,OAAO,sBAAsB,CAAC,MAAM,CAAC,CACjD,CAAC;AAEF,KAAK,8BAA8B,GAAG,iBAAiB,CACrD,OAAO,wBAAwB,EAAE,kBAAkB,EACnD,KAAK,EACL,OAAO,wBAAwB,EAAE,kBAAkB,EACnD,UAAU,CAAC,OAAO,sBAAsB,CAAC,MAAM,CAAC,CACjD,CAAC;AAWF,eAAO,MAAM,sBAAsB;;yBAEZ,MAAM;wBACP,MAAM,WAAW,mBAAmB;;;;;;;iBAM3C,MAAM;0BACG,MAAM;CAC7B,CAAC;AAEF,wBAAsB,iBAAiB,CAAC,EACtC,WAAW,EACX,OAAY,EACZ,KAAU,EACV,MAAM,EACN,MAAM,GACP,EAAE;IACD,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,mBAAmB,CAAC;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5B,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB,kEAeA;AAED,wBAAsB,eAAe,CAAC,EAAC,EAAE,EAAE,MAAM,EAAC,EAAE;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,WAAW,CAAA;CAAC,gEAOrF;AAED,wBAAgB,iCAAiC,CAC/C,WAAW,EAAE,MAAM,EACnB,OAAO,GAAE,mBAAwB,EACjC,KAAK,SAAK,GACT,iCAAiC,CASnC;AAED,wBAAgB,6BAA6B,CAC3C,WAAW,EAAE,MAAM,GAAG,SAAS,EAC/B,OAAO,GAAE,mBAAwB,EACjC,KAAK,SAAK,0JAMX;AAED,wBAAgB,wBAAwB,CAAC,EAAE,EAAE,MAAM,GAAG,wBAAwB,CAK7E;AAED,wBAAgB,oBAAoB,CAAC,EAAE,EAAE,MAAM,GAAG,SAAS,uHAK1D;AAED,wBAAsB,qBAAqB,CAAC,EAC1C,WAAW,EACX,MAAM,GACP,EAAE;IACD,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB,gEAQA;AAED,wBAAgB,8BAA8B,CAC5C,WAAW,EAAE,MAAM,GAClB,8BAA8B,CAMhC;AAED,wBAAgB,0BAA0B,CAAC,WAAW,EAAE,MAAM,GAAG,SAAS,uHAKzE"}
@@ -1,21 +1,10 @@
1
- import { apiRequest } from '@shipfox/client-api';
2
- import { keepPreviousData, useInfiniteQuery, useQuery } from '@tanstack/react-query';
3
- function normalizeStringFilter(values) {
4
- return values && values.length > 0 ? [
5
- ...new Set(values)
6
- ].sort() : null;
7
- }
8
- function normalizeTriggerEventFiltersForQueryKey(filters) {
9
- return {
10
- source: normalizeStringFilter(filters.source),
11
- event: normalizeStringFilter(filters.event),
12
- outcome: normalizeStringFilter(filters.outcome),
13
- from: filters.from ?? null,
14
- to: filters.to ?? null
15
- };
16
- }
1
+ import { triggerEventDetailResponseSchema, triggerEventFacetsResponseSchema, triggerEventListResponseSchema } from '@shipfox/api-triggers-dto';
2
+ import { checkedApiRequest } from '@shipfox/client-api';
3
+ import { infiniteQueryOptions, keepPreviousData, queryOptions, useInfiniteQuery, useQuery } from '@tanstack/react-query';
4
+ import { normalizeTriggerEventFilters, normalizeTriggerEventFilterValues } from '#core/trigger-event.js';
5
+ import { toTriggerEventDetail, toTriggerEventFacets, toTriggerEventListPage } from './trigger-event-mapper.js';
17
6
  function setListParam(params, name, values) {
18
- const normalized = normalizeStringFilter(values);
7
+ const normalized = normalizeTriggerEventFilterValues(values);
19
8
  if (normalized) params.set(name, normalized.join(','));
20
9
  }
21
10
  export const triggerEventsQueryKeys = {
@@ -30,7 +19,7 @@ export const triggerEventsQueryKeys = {
30
19
  list: (workspaceId, filters, limit = 50)=>[
31
20
  ...triggerEventsQueryKeys.lists(workspaceId),
32
21
  limit,
33
- normalizeTriggerEventFiltersForQueryKey(filters)
22
+ normalizeTriggerEventFilters(filters)
34
23
  ],
35
24
  detail: (id)=>[
36
25
  ...triggerEventsQueryKeys.all,
@@ -54,69 +43,77 @@ export async function listTriggerEvents({ workspaceId, filters = {}, limit = 50,
54
43
  if (filters.from) params.set('from', filters.from);
55
44
  if (filters.to) params.set('to', filters.to);
56
45
  setListParam(params, 'outcome', filters.outcome);
57
- return await apiRequest(`/trigger-events?${params.toString()}`, {
46
+ const response = await checkedApiRequest(triggerEventListResponseSchema, `/trigger-events?${params.toString()}`, {
58
47
  signal
59
48
  });
49
+ return toTriggerEventListPage(response);
60
50
  }
61
51
  export async function getTriggerEvent({ id, signal }) {
62
- return await apiRequest(`/trigger-events/${encodeURIComponent(id)}`, {
52
+ const response = await checkedApiRequest(triggerEventDetailResponseSchema, `/trigger-events/${encodeURIComponent(id)}`, {
63
53
  signal
64
54
  });
55
+ return toTriggerEventDetail(response);
65
56
  }
66
- export function useTriggerEventsInfiniteQuery(workspaceId, filters = {}, limit = 50) {
67
- return useInfiniteQuery({
68
- queryKey: workspaceId ? triggerEventsQueryKeys.list(workspaceId, filters, limit) : [
69
- ...triggerEventsQueryKeys.all,
70
- 'list'
71
- ],
72
- enabled: Boolean(workspaceId),
57
+ export function triggerEventsInfiniteQueryOptions(workspaceId, filters = {}, limit = 50) {
58
+ return infiniteQueryOptions({
59
+ queryKey: triggerEventsQueryKeys.list(workspaceId, filters, limit),
73
60
  initialPageParam: undefined,
74
61
  queryFn: ({ pageParam, signal })=>listTriggerEvents({
75
- workspaceId: workspaceId ?? '',
62
+ workspaceId,
76
63
  filters,
77
64
  limit,
78
65
  cursor: pageParam,
79
66
  signal
80
67
  }),
81
- getNextPageParam: (lastPage)=>lastPage.next_cursor ?? undefined,
68
+ getNextPageParam: (lastPage)=>lastPage.nextCursor ?? undefined,
82
69
  placeholderData: keepPreviousData
83
70
  });
84
71
  }
85
- export function useTriggerEventQuery(id) {
86
- return useQuery({
87
- queryKey: id ? triggerEventsQueryKeys.detail(id) : [
88
- ...triggerEventsQueryKeys.all,
89
- 'detail'
90
- ],
91
- enabled: Boolean(id),
72
+ export function useTriggerEventsInfiniteQuery(workspaceId, filters = {}, limit = 50) {
73
+ return useInfiniteQuery({
74
+ ...triggerEventsInfiniteQueryOptions(workspaceId ?? '', filters, limit),
75
+ enabled: Boolean(workspaceId)
76
+ });
77
+ }
78
+ export function triggerEventQueryOptions(id) {
79
+ return queryOptions({
80
+ queryKey: triggerEventsQueryKeys.detail(id),
92
81
  queryFn: ({ signal })=>getTriggerEvent({
93
- id: id ?? '',
82
+ id,
94
83
  signal
95
84
  })
96
85
  });
97
86
  }
87
+ export function useTriggerEventQuery(id) {
88
+ return useQuery({
89
+ ...triggerEventQueryOptions(id ?? ''),
90
+ enabled: Boolean(id)
91
+ });
92
+ }
98
93
  export async function getTriggerEventFacets({ workspaceId, signal }) {
99
94
  const params = new URLSearchParams({
100
95
  workspace_id: workspaceId
101
96
  });
102
- return await apiRequest(`/trigger-events/facets?${params.toString()}`, {
97
+ const response = await checkedApiRequest(triggerEventFacetsResponseSchema, `/trigger-events/facets?${params.toString()}`, {
103
98
  signal
104
99
  });
100
+ return toTriggerEventFacets(response);
105
101
  }
106
- export function useTriggerEventFacetsQuery(workspaceId) {
107
- return useQuery({
108
- queryKey: workspaceId ? triggerEventsQueryKeys.facets(workspaceId) : [
109
- ...triggerEventsQueryKeys.all,
110
- 'facets'
111
- ],
112
- enabled: Boolean(workspaceId),
102
+ export function triggerEventFacetsQueryOptions(workspaceId) {
103
+ return queryOptions({
104
+ queryKey: triggerEventsQueryKeys.facets(workspaceId),
113
105
  queryFn: ({ signal })=>getTriggerEventFacets({
114
- workspaceId: workspaceId ?? '',
106
+ workspaceId,
115
107
  signal
116
108
  }),
117
- // Distinct values change slowly; avoid refetching on every page mount.
118
109
  staleTime: 5 * 60 * 1000
119
110
  });
120
111
  }
112
+ export function useTriggerEventFacetsQuery(workspaceId) {
113
+ return useQuery({
114
+ ...triggerEventFacetsQueryOptions(workspaceId ?? ''),
115
+ enabled: Boolean(workspaceId)
116
+ });
117
+ }
121
118
 
122
119
  //# sourceMappingURL=trigger-events.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/hooks/api/trigger-events.ts"],"sourcesContent":["import type {\n TriggerEventDetailResponseDto,\n TriggerEventFacetsResponseDto,\n TriggerEventListResponseDto,\n TriggerEventOutcomeDto,\n} from '@shipfox/api-triggers-dto';\nimport {apiRequest} from '@shipfox/client-api';\nimport {keepPreviousData, useInfiniteQuery, useQuery} from '@tanstack/react-query';\n\nexport interface TriggerEventFilters {\n source?: string[] | undefined;\n event?: string[] | undefined;\n outcome?: TriggerEventOutcomeDto[] | undefined;\n from?: string | undefined;\n to?: string | undefined;\n}\n\nfunction normalizeStringFilter(values: readonly string[] | undefined) {\n return values && values.length > 0 ? [...new Set(values)].sort() : null;\n}\n\nfunction normalizeTriggerEventFiltersForQueryKey(filters: TriggerEventFilters) {\n return {\n source: normalizeStringFilter(filters.source),\n event: normalizeStringFilter(filters.event),\n outcome: normalizeStringFilter(filters.outcome),\n from: filters.from ?? null,\n to: filters.to ?? null,\n };\n}\n\nfunction setListParam(\n params: URLSearchParams,\n name: string,\n values: readonly string[] | undefined,\n) {\n const normalized = normalizeStringFilter(values);\n if (normalized) params.set(name, normalized.join(','));\n}\n\nexport const triggerEventsQueryKeys = {\n all: ['trigger-events'] as const,\n lists: (workspaceId: string) => [...triggerEventsQueryKeys.all, 'list', workspaceId] as const,\n list: (workspaceId: string, filters: TriggerEventFilters, limit = 50) =>\n [\n ...triggerEventsQueryKeys.lists(workspaceId),\n limit,\n normalizeTriggerEventFiltersForQueryKey(filters),\n ] as const,\n detail: (id: string) => [...triggerEventsQueryKeys.all, 'detail', id] as const,\n facets: (workspaceId: string) => [...triggerEventsQueryKeys.all, 'facets', workspaceId] as const,\n};\n\nexport async function listTriggerEvents({\n workspaceId,\n filters = {},\n limit = 50,\n cursor,\n signal,\n}: {\n workspaceId: string;\n filters?: TriggerEventFilters;\n limit?: number;\n cursor?: 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 setListParam(params, 'source', filters.source);\n setListParam(params, 'event', filters.event);\n if (filters.from) params.set('from', filters.from);\n if (filters.to) params.set('to', filters.to);\n setListParam(params, 'outcome', filters.outcome);\n\n return await apiRequest<TriggerEventListResponseDto>(`/trigger-events?${params.toString()}`, {\n signal,\n });\n}\n\nexport async function getTriggerEvent({id, signal}: {id: string; signal?: AbortSignal}) {\n return await apiRequest<TriggerEventDetailResponseDto>(\n `/trigger-events/${encodeURIComponent(id)}`,\n {signal},\n );\n}\n\nexport function useTriggerEventsInfiniteQuery(\n workspaceId: string | undefined,\n filters: TriggerEventFilters = {},\n limit = 50,\n) {\n return useInfiniteQuery({\n queryKey: workspaceId\n ? triggerEventsQueryKeys.list(workspaceId, filters, limit)\n : [...triggerEventsQueryKeys.all, 'list'],\n enabled: Boolean(workspaceId),\n initialPageParam: undefined as string | undefined,\n queryFn: ({pageParam, signal}) =>\n listTriggerEvents({\n workspaceId: workspaceId ?? '',\n filters,\n limit,\n cursor: pageParam,\n signal,\n }),\n getNextPageParam: (lastPage) => lastPage.next_cursor ?? undefined,\n placeholderData: keepPreviousData,\n });\n}\n\nexport function useTriggerEventQuery(id: string | undefined) {\n return useQuery({\n queryKey: id ? triggerEventsQueryKeys.detail(id) : [...triggerEventsQueryKeys.all, 'detail'],\n enabled: Boolean(id),\n queryFn: ({signal}) => getTriggerEvent({id: id ?? '', signal}),\n });\n}\n\nexport async function getTriggerEventFacets({\n workspaceId,\n signal,\n}: {\n workspaceId: string;\n signal?: AbortSignal;\n}) {\n const params = new URLSearchParams({workspace_id: workspaceId});\n return await apiRequest<TriggerEventFacetsResponseDto>(\n `/trigger-events/facets?${params.toString()}`,\n {signal},\n );\n}\n\nexport function useTriggerEventFacetsQuery(workspaceId: string | undefined) {\n return useQuery({\n queryKey: workspaceId\n ? triggerEventsQueryKeys.facets(workspaceId)\n : [...triggerEventsQueryKeys.all, 'facets'],\n enabled: Boolean(workspaceId),\n queryFn: ({signal}) => getTriggerEventFacets({workspaceId: workspaceId ?? '', signal}),\n // Distinct values change slowly; avoid refetching on every page mount.\n staleTime: 5 * 60 * 1000,\n });\n}\n"],"names":["apiRequest","keepPreviousData","useInfiniteQuery","useQuery","normalizeStringFilter","values","length","Set","sort","normalizeTriggerEventFiltersForQueryKey","filters","source","event","outcome","from","to","setListParam","params","name","normalized","set","join","triggerEventsQueryKeys","all","lists","workspaceId","list","limit","detail","id","facets","listTriggerEvents","cursor","signal","URLSearchParams","workspace_id","String","toString","getTriggerEvent","encodeURIComponent","useTriggerEventsInfiniteQuery","queryKey","enabled","Boolean","initialPageParam","undefined","queryFn","pageParam","getNextPageParam","lastPage","next_cursor","placeholderData","useTriggerEventQuery","getTriggerEventFacets","useTriggerEventFacetsQuery","staleTime"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/hooks/api/trigger-events.ts"],"sourcesContent":["import {\n triggerEventDetailResponseSchema,\n triggerEventFacetsResponseSchema,\n triggerEventListResponseSchema,\n} from '@shipfox/api-triggers-dto';\nimport {checkedApiRequest} from '@shipfox/client-api';\nimport {\n type FetchQueryOptions,\n type InfiniteData,\n infiniteQueryOptions,\n keepPreviousData,\n queryOptions,\n type UseInfiniteQueryOptions,\n useInfiniteQuery,\n useQuery,\n} from '@tanstack/react-query';\nimport {\n normalizeTriggerEventFilters,\n normalizeTriggerEventFilterValues,\n type TriggerEventFilters,\n} from '#core/trigger-event.js';\nimport {\n toTriggerEventDetail,\n toTriggerEventFacets,\n toTriggerEventListPage,\n} from './trigger-event-mapper.js';\n\nexport type {TriggerEventFilters} from '#core/trigger-event.js';\n\ntype TriggerEventsInfiniteQueryOptions = UseInfiniteQueryOptions<\n import('#core/trigger-event.js').TriggerEventListPage,\n Error,\n InfiniteData<import('#core/trigger-event.js').TriggerEventListPage, string | undefined>,\n ReturnType<typeof triggerEventsQueryKeys.list>,\n string | undefined\n>;\n\ntype TriggerEventQueryOptions = FetchQueryOptions<\n import('#core/trigger-event.js').TriggerEventDetail,\n Error,\n import('#core/trigger-event.js').TriggerEventDetail,\n ReturnType<typeof triggerEventsQueryKeys.detail>\n>;\n\ntype TriggerEventFacetsQueryOptions = FetchQueryOptions<\n import('#core/trigger-event.js').TriggerEventFacets,\n Error,\n import('#core/trigger-event.js').TriggerEventFacets,\n ReturnType<typeof triggerEventsQueryKeys.facets>\n>;\n\nfunction setListParam(\n params: URLSearchParams,\n name: string,\n values: readonly string[] | undefined,\n) {\n const normalized = normalizeTriggerEventFilterValues(values);\n if (normalized) params.set(name, normalized.join(','));\n}\n\nexport const triggerEventsQueryKeys = {\n all: ['trigger-events'] as const,\n lists: (workspaceId: string) => [...triggerEventsQueryKeys.all, 'list', workspaceId] as const,\n list: (workspaceId: string, filters: TriggerEventFilters, limit = 50) =>\n [\n ...triggerEventsQueryKeys.lists(workspaceId),\n limit,\n normalizeTriggerEventFilters(filters),\n ] as const,\n detail: (id: string) => [...triggerEventsQueryKeys.all, 'detail', id] as const,\n facets: (workspaceId: string) => [...triggerEventsQueryKeys.all, 'facets', workspaceId] as const,\n};\n\nexport async function listTriggerEvents({\n workspaceId,\n filters = {},\n limit = 50,\n cursor,\n signal,\n}: {\n workspaceId: string;\n filters?: TriggerEventFilters;\n limit?: number;\n cursor?: 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 setListParam(params, 'source', filters.source);\n setListParam(params, 'event', filters.event);\n if (filters.from) params.set('from', filters.from);\n if (filters.to) params.set('to', filters.to);\n setListParam(params, 'outcome', filters.outcome);\n\n const response = await checkedApiRequest(\n triggerEventListResponseSchema,\n `/trigger-events?${params.toString()}`,\n {signal},\n );\n return toTriggerEventListPage(response);\n}\n\nexport async function getTriggerEvent({id, signal}: {id: string; signal?: AbortSignal}) {\n const response = await checkedApiRequest(\n triggerEventDetailResponseSchema,\n `/trigger-events/${encodeURIComponent(id)}`,\n {signal},\n );\n return toTriggerEventDetail(response);\n}\n\nexport function triggerEventsInfiniteQueryOptions(\n workspaceId: string,\n filters: TriggerEventFilters = {},\n limit = 50,\n): TriggerEventsInfiniteQueryOptions {\n return infiniteQueryOptions({\n queryKey: triggerEventsQueryKeys.list(workspaceId, filters, limit),\n initialPageParam: undefined as string | undefined,\n queryFn: ({pageParam, signal}) =>\n listTriggerEvents({workspaceId, filters, limit, cursor: pageParam, signal}),\n getNextPageParam: (lastPage) => lastPage.nextCursor ?? undefined,\n placeholderData: keepPreviousData,\n });\n}\n\nexport function useTriggerEventsInfiniteQuery(\n workspaceId: string | undefined,\n filters: TriggerEventFilters = {},\n limit = 50,\n) {\n return useInfiniteQuery({\n ...triggerEventsInfiniteQueryOptions(workspaceId ?? '', filters, limit),\n enabled: Boolean(workspaceId),\n });\n}\n\nexport function triggerEventQueryOptions(id: string): TriggerEventQueryOptions {\n return queryOptions({\n queryKey: triggerEventsQueryKeys.detail(id),\n queryFn: ({signal}) => getTriggerEvent({id, signal}),\n });\n}\n\nexport function useTriggerEventQuery(id: string | undefined) {\n return useQuery({\n ...triggerEventQueryOptions(id ?? ''),\n enabled: Boolean(id),\n });\n}\n\nexport async function getTriggerEventFacets({\n workspaceId,\n signal,\n}: {\n workspaceId: string;\n signal?: AbortSignal;\n}) {\n const params = new URLSearchParams({workspace_id: workspaceId});\n const response = await checkedApiRequest(\n triggerEventFacetsResponseSchema,\n `/trigger-events/facets?${params.toString()}`,\n {signal},\n );\n return toTriggerEventFacets(response);\n}\n\nexport function triggerEventFacetsQueryOptions(\n workspaceId: string,\n): TriggerEventFacetsQueryOptions {\n return queryOptions({\n queryKey: triggerEventsQueryKeys.facets(workspaceId),\n queryFn: ({signal}) => getTriggerEventFacets({workspaceId, signal}),\n staleTime: 5 * 60 * 1000,\n });\n}\n\nexport function useTriggerEventFacetsQuery(workspaceId: string | undefined) {\n return useQuery({\n ...triggerEventFacetsQueryOptions(workspaceId ?? ''),\n enabled: Boolean(workspaceId),\n });\n}\n"],"names":["triggerEventDetailResponseSchema","triggerEventFacetsResponseSchema","triggerEventListResponseSchema","checkedApiRequest","infiniteQueryOptions","keepPreviousData","queryOptions","useInfiniteQuery","useQuery","normalizeTriggerEventFilters","normalizeTriggerEventFilterValues","toTriggerEventDetail","toTriggerEventFacets","toTriggerEventListPage","setListParam","params","name","values","normalized","set","join","triggerEventsQueryKeys","all","lists","workspaceId","list","filters","limit","detail","id","facets","listTriggerEvents","cursor","signal","URLSearchParams","workspace_id","String","source","event","from","to","outcome","response","toString","getTriggerEvent","encodeURIComponent","triggerEventsInfiniteQueryOptions","queryKey","initialPageParam","undefined","queryFn","pageParam","getNextPageParam","lastPage","nextCursor","placeholderData","useTriggerEventsInfiniteQuery","enabled","Boolean","triggerEventQueryOptions","useTriggerEventQuery","getTriggerEventFacets","triggerEventFacetsQueryOptions","staleTime","useTriggerEventFacetsQuery"],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -1,3 +1,4 @@
1
+ export * from '#core/trigger-event.js';
1
2
  export * from './components/trigger-source-icon.js';
2
3
  export * from './hooks/api/trigger-events.js';
3
4
  export * from './pages/events-page.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,qCAAqC,CAAC;AACpD,cAAc,+BAA+B,CAAC;AAC9C,cAAc,wBAAwB,CAAC;AACvC,cAAc,aAAa,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,wBAAwB,CAAC;AACvC,cAAc,qCAAqC,CAAC;AACpD,cAAc,+BAA+B,CAAC;AAC9C,cAAc,wBAAwB,CAAC;AACvC,cAAc,aAAa,CAAC"}
package/dist/index.js CHANGED
@@ -1,3 +1,4 @@
1
+ export * from '#core/trigger-event.js';
1
2
  export * from './components/trigger-source-icon.js';
2
3
  export * from './hooks/api/trigger-events.js';
3
4
  export * from './pages/events-page.js';
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"sourcesContent":["export * from './components/trigger-source-icon.js';\nexport * from './hooks/api/trigger-events.js';\nexport * from './pages/events-page.js';\nexport * from './search.js';\n"],"names":[],"mappings":"AAAA,cAAc,sCAAsC;AACpD,cAAc,gCAAgC;AAC9C,cAAc,yBAAyB;AACvC,cAAc,cAAc"}
1
+ {"version":3,"sources":["../src/index.ts"],"sourcesContent":["export * from '#core/trigger-event.js';\nexport * from './components/trigger-source-icon.js';\nexport * from './hooks/api/trigger-events.js';\nexport * from './pages/events-page.js';\nexport * from './search.js';\n"],"names":[],"mappings":"AAAA,cAAc,yBAAyB;AACvC,cAAc,sCAAsC;AACpD,cAAc,gCAAgC;AAC9C,cAAc,yBAAyB;AACvC,cAAc,cAAc"}
@@ -1,4 +1,4 @@
1
- import { type TriggerEventFilters } from '#hooks/api/trigger-events.js';
1
+ import type { TriggerEventFilters } from '#core/trigger-event.js';
2
2
  export interface EventsPageProps {
3
3
  workspaceId: string;
4
4
  filters: TriggerEventFilters;
@@ -1 +1 @@
1
- {"version":3,"file":"events-page.d.ts","sourceRoot":"","sources":["../../src/pages/events-page.tsx"],"names":[],"mappings":"AAOA,OAAO,EACL,KAAK,mBAAmB,EAGzB,MAAM,8BAA8B,CAAC;AAEtC,MAAM,WAAW,eAAe;IAC9B,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,mBAAmB,CAAC;IAC7B,eAAe,EAAE,CAAC,KAAK,EAAE,OAAO,CAAC,mBAAmB,CAAC,KAAK,IAAI,CAAC;CAChE;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,EAAC,WAAW,EAAE,OAAO,EAAE,eAAe,EAAC,EAAE,eAAe,+BAuDlF"}
1
+ {"version":3,"file":"events-page.d.ts","sourceRoot":"","sources":["../../src/pages/events-page.tsx"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAC,mBAAmB,EAAsB,MAAM,wBAAwB,CAAC;AAMrF,MAAM,WAAW,eAAe;IAC9B,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,mBAAmB,CAAC;IAC7B,eAAe,EAAE,CAAC,KAAK,EAAE,OAAO,CAAC,mBAAmB,CAAC,KAAK,IAAI,CAAC;CAChE;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,EAAC,WAAW,EAAE,OAAO,EAAE,eAAe,EAAC,EAAE,eAAe,+BAuDlF"}
@@ -13,7 +13,7 @@ import { useTriggerEventFacetsQuery, useTriggerEventsInfiniteQuery } from '#hook
13
13
  const query = useTriggerEventsInfiniteQuery(workspaceId, filters);
14
14
  const facetsQuery = useTriggerEventFacetsQuery(workspaceId);
15
15
  const [selectedEventId, setSelectedEventId] = useState();
16
- const events = useMemo(()=>query.data?.pages.flatMap((page)=>page.trigger_events) ?? [], [
16
+ const events = useMemo(()=>query.data?.pages.flatMap((page)=>page.events) ?? [], [
17
17
  query.data
18
18
  ]);
19
19
  useEffect(()=>{
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/pages/events-page.tsx"],"sourcesContent":["import type {TriggerEventListItemDto} from '@shipfox/api-triggers-dto';\nimport {RelativeTimeProvider} from '@shipfox/react-ui/relative-time';\nimport {Header, Text} from '@shipfox/react-ui/typography';\nimport {cn} from '@shipfox/react-ui/utils';\nimport {useEffect, useMemo, useState} from 'react';\nimport {EventsList} from '#components/events-list.js';\nimport {TriggerEventDetail} from '#components/trigger-event-detail.js';\nimport {\n type TriggerEventFilters,\n useTriggerEventFacetsQuery,\n useTriggerEventsInfiniteQuery,\n} from '#hooks/api/trigger-events.js';\n\nexport interface EventsPageProps {\n workspaceId: string;\n filters: TriggerEventFilters;\n onFiltersChange: (patch: Partial<TriggerEventFilters>) => void;\n}\n\n/**\n * Workspace-scoped Events list. Router-agnostic: filters and their setter come in as props\n * (the settings wrapper binds them to the URL), so a story can drive it with local state.\n */\nexport function EventsPage({workspaceId, filters, onFiltersChange}: EventsPageProps) {\n const query = useTriggerEventsInfiniteQuery(workspaceId, filters);\n const facetsQuery = useTriggerEventFacetsQuery(workspaceId);\n const [selectedEventId, setSelectedEventId] = useState<string | undefined>();\n\n const events = useMemo<TriggerEventListItemDto[]>(\n () => query.data?.pages.flatMap((page) => page.trigger_events) ?? [],\n [query.data],\n );\n\n useEffect(() => {\n if (!selectedEventId || query.isPending || query.isFetching || query.isError) return;\n if (!events.some((event) => event.id === selectedEventId)) setSelectedEventId(undefined);\n }, [events, query.isError, query.isFetching, query.isPending, selectedEventId]);\n\n return (\n <RelativeTimeProvider>\n <section className=\"flex min-w-0 flex-col gap-16\" aria-labelledby=\"trigger-events-heading\">\n <div className=\"flex flex-col gap-4\">\n <Header id=\"trigger-events-heading\" variant=\"h3\">\n Events\n </Header>\n <Text size=\"sm\" className=\"text-foreground-neutral-muted\">\n A workspace-wide audit log of trigger events received from integrations, schedules, and\n manual trigger calls.\n </Text>\n </div>\n\n <div className=\"grid min-h-0 gap-16 min-[900px]:grid-cols-[minmax(0,1fr)_minmax(360px,420px)]\">\n <div className={cn('min-w-0', selectedEventId && 'max-[899px]:hidden')}>\n <EventsList\n events={events}\n query={query}\n facets={facetsQuery.data}\n filters={filters}\n onFiltersChange={onFiltersChange}\n workspaceId={workspaceId}\n hasNextPage={query.hasNextPage}\n isFetchingNextPage={query.isFetchingNextPage}\n onLoadMore={() => {\n void query.fetchNextPage();\n }}\n selectedEventId={selectedEventId}\n onSelectEvent={setSelectedEventId}\n />\n </div>\n <TriggerEventDetail\n workspaceId={workspaceId}\n eventId={selectedEventId}\n onBack={() => setSelectedEventId(undefined)}\n />\n </div>\n </section>\n </RelativeTimeProvider>\n );\n}\n"],"names":["RelativeTimeProvider","Header","Text","cn","useEffect","useMemo","useState","EventsList","TriggerEventDetail","useTriggerEventFacetsQuery","useTriggerEventsInfiniteQuery","EventsPage","workspaceId","filters","onFiltersChange","query","facetsQuery","selectedEventId","setSelectedEventId","events","data","pages","flatMap","page","trigger_events","isPending","isFetching","isError","some","event","id","undefined","section","className","aria-labelledby","div","variant","size","facets","hasNextPage","isFetchingNextPage","onLoadMore","fetchNextPage","onSelectEvent","eventId","onBack"],"mappings":";AACA,SAAQA,oBAAoB,QAAO,kCAAkC;AACrE,SAAQC,MAAM,EAAEC,IAAI,QAAO,+BAA+B;AAC1D,SAAQC,EAAE,QAAO,0BAA0B;AAC3C,SAAQC,SAAS,EAAEC,OAAO,EAAEC,QAAQ,QAAO,QAAQ;AACnD,SAAQC,UAAU,QAAO,6BAA6B;AACtD,SAAQC,kBAAkB,QAAO,sCAAsC;AACvE,SAEEC,0BAA0B,EAC1BC,6BAA6B,QACxB,+BAA+B;AAQtC;;;CAGC,GACD,OAAO,SAASC,WAAW,EAACC,WAAW,EAAEC,OAAO,EAAEC,eAAe,EAAkB;IACjF,MAAMC,QAAQL,8BAA8BE,aAAaC;IACzD,MAAMG,cAAcP,2BAA2BG;IAC/C,MAAM,CAACK,iBAAiBC,mBAAmB,GAAGZ;IAE9C,MAAMa,SAASd,QACb,IAAMU,MAAMK,IAAI,EAAEC,MAAMC,QAAQ,CAACC,OAASA,KAAKC,cAAc,KAAK,EAAE,EACpE;QAACT,MAAMK,IAAI;KAAC;IAGdhB,UAAU;QACR,IAAI,CAACa,mBAAmBF,MAAMU,SAAS,IAAIV,MAAMW,UAAU,IAAIX,MAAMY,OAAO,EAAE;QAC9E,IAAI,CAACR,OAAOS,IAAI,CAAC,CAACC,QAAUA,MAAMC,EAAE,KAAKb,kBAAkBC,mBAAmBa;IAChF,GAAG;QAACZ;QAAQJ,MAAMY,OAAO;QAAEZ,MAAMW,UAAU;QAAEX,MAAMU,SAAS;QAAER;KAAgB;IAE9E,qBACE,KAACjB;kBACC,cAAA,MAACgC;YAAQC,WAAU;YAA+BC,mBAAgB;;8BAChE,MAACC;oBAAIF,WAAU;;sCACb,KAAChC;4BAAO6B,IAAG;4BAAyBM,SAAQ;sCAAK;;sCAGjD,KAAClC;4BAAKmC,MAAK;4BAAKJ,WAAU;sCAAgC;;;;8BAM5D,MAACE;oBAAIF,WAAU;;sCACb,KAACE;4BAAIF,WAAW9B,GAAG,WAAWc,mBAAmB;sCAC/C,cAAA,KAACV;gCACCY,QAAQA;gCACRJ,OAAOA;gCACPuB,QAAQtB,YAAYI,IAAI;gCACxBP,SAASA;gCACTC,iBAAiBA;gCACjBF,aAAaA;gCACb2B,aAAaxB,MAAMwB,WAAW;gCAC9BC,oBAAoBzB,MAAMyB,kBAAkB;gCAC5CC,YAAY;oCACV,KAAK1B,MAAM2B,aAAa;gCAC1B;gCACAzB,iBAAiBA;gCACjB0B,eAAezB;;;sCAGnB,KAACV;4BACCI,aAAaA;4BACbgC,SAAS3B;4BACT4B,QAAQ,IAAM3B,mBAAmBa;;;;;;;AAM7C"}
1
+ {"version":3,"sources":["../../src/pages/events-page.tsx"],"sourcesContent":["import {RelativeTimeProvider} from '@shipfox/react-ui/relative-time';\nimport {Header, Text} from '@shipfox/react-ui/typography';\nimport {cn} from '@shipfox/react-ui/utils';\nimport {useEffect, useMemo, useState} from 'react';\nimport {EventsList} from '#components/events-list.js';\nimport {TriggerEventDetail} from '#components/trigger-event-detail.js';\nimport type {TriggerEventFilters, TriggerEventSummary} from '#core/trigger-event.js';\nimport {\n useTriggerEventFacetsQuery,\n useTriggerEventsInfiniteQuery,\n} from '#hooks/api/trigger-events.js';\n\nexport interface EventsPageProps {\n workspaceId: string;\n filters: TriggerEventFilters;\n onFiltersChange: (patch: Partial<TriggerEventFilters>) => void;\n}\n\n/**\n * Workspace-scoped Events list. Router-agnostic: filters and their setter come in as props\n * (the settings wrapper binds them to the URL), so a story can drive it with local state.\n */\nexport function EventsPage({workspaceId, filters, onFiltersChange}: EventsPageProps) {\n const query = useTriggerEventsInfiniteQuery(workspaceId, filters);\n const facetsQuery = useTriggerEventFacetsQuery(workspaceId);\n const [selectedEventId, setSelectedEventId] = useState<string | undefined>();\n\n const events = useMemo<TriggerEventSummary[]>(\n () => query.data?.pages.flatMap((page) => page.events) ?? [],\n [query.data],\n );\n\n useEffect(() => {\n if (!selectedEventId || query.isPending || query.isFetching || query.isError) return;\n if (!events.some((event) => event.id === selectedEventId)) setSelectedEventId(undefined);\n }, [events, query.isError, query.isFetching, query.isPending, selectedEventId]);\n\n return (\n <RelativeTimeProvider>\n <section className=\"flex min-w-0 flex-col gap-16\" aria-labelledby=\"trigger-events-heading\">\n <div className=\"flex flex-col gap-4\">\n <Header id=\"trigger-events-heading\" variant=\"h3\">\n Events\n </Header>\n <Text size=\"sm\" className=\"text-foreground-neutral-muted\">\n A workspace-wide audit log of trigger events received from integrations, schedules, and\n manual trigger calls.\n </Text>\n </div>\n\n <div className=\"grid min-h-0 gap-16 min-[900px]:grid-cols-[minmax(0,1fr)_minmax(360px,420px)]\">\n <div className={cn('min-w-0', selectedEventId && 'max-[899px]:hidden')}>\n <EventsList\n events={events}\n query={query}\n facets={facetsQuery.data}\n filters={filters}\n onFiltersChange={onFiltersChange}\n workspaceId={workspaceId}\n hasNextPage={query.hasNextPage}\n isFetchingNextPage={query.isFetchingNextPage}\n onLoadMore={() => {\n void query.fetchNextPage();\n }}\n selectedEventId={selectedEventId}\n onSelectEvent={setSelectedEventId}\n />\n </div>\n <TriggerEventDetail\n workspaceId={workspaceId}\n eventId={selectedEventId}\n onBack={() => setSelectedEventId(undefined)}\n />\n </div>\n </section>\n </RelativeTimeProvider>\n );\n}\n"],"names":["RelativeTimeProvider","Header","Text","cn","useEffect","useMemo","useState","EventsList","TriggerEventDetail","useTriggerEventFacetsQuery","useTriggerEventsInfiniteQuery","EventsPage","workspaceId","filters","onFiltersChange","query","facetsQuery","selectedEventId","setSelectedEventId","events","data","pages","flatMap","page","isPending","isFetching","isError","some","event","id","undefined","section","className","aria-labelledby","div","variant","size","facets","hasNextPage","isFetchingNextPage","onLoadMore","fetchNextPage","onSelectEvent","eventId","onBack"],"mappings":";AAAA,SAAQA,oBAAoB,QAAO,kCAAkC;AACrE,SAAQC,MAAM,EAAEC,IAAI,QAAO,+BAA+B;AAC1D,SAAQC,EAAE,QAAO,0BAA0B;AAC3C,SAAQC,SAAS,EAAEC,OAAO,EAAEC,QAAQ,QAAO,QAAQ;AACnD,SAAQC,UAAU,QAAO,6BAA6B;AACtD,SAAQC,kBAAkB,QAAO,sCAAsC;AAEvE,SACEC,0BAA0B,EAC1BC,6BAA6B,QACxB,+BAA+B;AAQtC;;;CAGC,GACD,OAAO,SAASC,WAAW,EAACC,WAAW,EAAEC,OAAO,EAAEC,eAAe,EAAkB;IACjF,MAAMC,QAAQL,8BAA8BE,aAAaC;IACzD,MAAMG,cAAcP,2BAA2BG;IAC/C,MAAM,CAACK,iBAAiBC,mBAAmB,GAAGZ;IAE9C,MAAMa,SAASd,QACb,IAAMU,MAAMK,IAAI,EAAEC,MAAMC,QAAQ,CAACC,OAASA,KAAKJ,MAAM,KAAK,EAAE,EAC5D;QAACJ,MAAMK,IAAI;KAAC;IAGdhB,UAAU;QACR,IAAI,CAACa,mBAAmBF,MAAMS,SAAS,IAAIT,MAAMU,UAAU,IAAIV,MAAMW,OAAO,EAAE;QAC9E,IAAI,CAACP,OAAOQ,IAAI,CAAC,CAACC,QAAUA,MAAMC,EAAE,KAAKZ,kBAAkBC,mBAAmBY;IAChF,GAAG;QAACX;QAAQJ,MAAMW,OAAO;QAAEX,MAAMU,UAAU;QAAEV,MAAMS,SAAS;QAAEP;KAAgB;IAE9E,qBACE,KAACjB;kBACC,cAAA,MAAC+B;YAAQC,WAAU;YAA+BC,mBAAgB;;8BAChE,MAACC;oBAAIF,WAAU;;sCACb,KAAC/B;4BAAO4B,IAAG;4BAAyBM,SAAQ;sCAAK;;sCAGjD,KAACjC;4BAAKkC,MAAK;4BAAKJ,WAAU;sCAAgC;;;;8BAM5D,MAACE;oBAAIF,WAAU;;sCACb,KAACE;4BAAIF,WAAW7B,GAAG,WAAWc,mBAAmB;sCAC/C,cAAA,KAACV;gCACCY,QAAQA;gCACRJ,OAAOA;gCACPsB,QAAQrB,YAAYI,IAAI;gCACxBP,SAASA;gCACTC,iBAAiBA;gCACjBF,aAAaA;gCACb0B,aAAavB,MAAMuB,WAAW;gCAC9BC,oBAAoBxB,MAAMwB,kBAAkB;gCAC5CC,YAAY;oCACV,KAAKzB,MAAM0B,aAAa;gCAC1B;gCACAxB,iBAAiBA;gCACjByB,eAAexB;;;sCAGnB,KAACV;4BACCI,aAAaA;4BACb+B,SAAS1B;4BACT2B,QAAQ,IAAM1B,mBAAmBY;;;;;;;AAM7C"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/routes/events-settings.tsx"],"sourcesContent":["import {defineRoute, useActiveWorkspace} from '@shipfox/client-shell/runtime';\nimport {getRouteApi} from '@tanstack/react-router';\nimport type {TriggerEventFilters} from '#hooks/api/trigger-events.js';\nimport {EventsPage} from '#pages/events-page.js';\nimport {type TriggerEventsSearch, validateTriggerEventsSearch} from '#search.js';\n\nconst routeApi = getRouteApi('/workspaces/$wid/settings/events');\n\n// Wrapped (not just re-typed) so the search validator's own type is portable outside this\n// package: TanStack Router's `const` generics capture the exact declared function, and a\n// route module consumed from another package (apps/client's composed router) can't print a\n// type that only resolves through this package's internal `#search.js` path.\nfunction validateSearch(search: Record<string, unknown>): TriggerEventsSearch {\n return validateTriggerEventsSearch(search);\n}\n\nexport default defineRoute({\n validateSearch,\n component: () => {\n const workspace = useActiveWorkspace();\n const search = routeApi.useSearch();\n const navigate = routeApi.useNavigate();\n const onFiltersChange = (patch: Partial<TriggerEventFilters>) => {\n void navigate({search: {...search, ...patch}, replace: true});\n };\n return (\n <EventsPage workspaceId={workspace.id} filters={search} onFiltersChange={onFiltersChange} />\n );\n },\n});\n"],"names":["defineRoute","useActiveWorkspace","getRouteApi","EventsPage","validateTriggerEventsSearch","routeApi","validateSearch","search","component","workspace","useSearch","navigate","useNavigate","onFiltersChange","patch","replace","workspaceId","id","filters"],"mappings":";AAAA,SAAQA,WAAW,EAAEC,kBAAkB,QAAO,gCAAgC;AAC9E,SAAQC,WAAW,QAAO,yBAAyB;AAEnD,SAAQC,UAAU,QAAO,wBAAwB;AACjD,SAAkCC,2BAA2B,QAAO,aAAa;AAEjF,MAAMC,WAAWH,YAAY;AAE7B,0FAA0F;AAC1F,yFAAyF;AACzF,2FAA2F;AAC3F,6EAA6E;AAC7E,SAASI,eAAeC,MAA+B;IACrD,OAAOH,4BAA4BG;AACrC;AAEA,eAAeP,YAAY;IACzBM;IACAE,WAAW;QACT,MAAMC,YAAYR;QAClB,MAAMM,SAASF,SAASK,SAAS;QACjC,MAAMC,WAAWN,SAASO,WAAW;QACrC,MAAMC,kBAAkB,CAACC;YACvB,KAAKH,SAAS;gBAACJ,QAAQ;oBAAC,GAAGA,MAAM;oBAAE,GAAGO,KAAK;gBAAA;gBAAGC,SAAS;YAAI;QAC7D;QACA,qBACE,KAACZ;YAAWa,aAAaP,UAAUQ,EAAE;YAAEC,SAASX;YAAQM,iBAAiBA;;IAE7E;AACF,GAAG"}
1
+ {"version":3,"sources":["../../src/routes/events-settings.tsx"],"sourcesContent":["import {defineRoute, useActiveWorkspace} from '@shipfox/client-shell/runtime';\nimport {getRouteApi} from '@tanstack/react-router';\nimport type {TriggerEventFilters} from '#core/trigger-event.js';\nimport {EventsPage} from '#pages/events-page.js';\nimport {type TriggerEventsSearch, validateTriggerEventsSearch} from '#search.js';\n\nconst routeApi = getRouteApi('/workspaces/$wid/settings/events');\n\n// Wrapped (not just re-typed) so the search validator's own type is portable outside this\n// package: TanStack Router's `const` generics capture the exact declared function, and a\n// route module consumed from another package (apps/client's composed router) can't print a\n// type that only resolves through this package's internal `#search.js` path.\nfunction validateSearch(search: Record<string, unknown>): TriggerEventsSearch {\n return validateTriggerEventsSearch(search);\n}\n\nexport default defineRoute({\n validateSearch,\n component: () => {\n const workspace = useActiveWorkspace();\n const search = routeApi.useSearch();\n const navigate = routeApi.useNavigate();\n const onFiltersChange = (patch: Partial<TriggerEventFilters>) => {\n void navigate({search: {...search, ...patch}, replace: true});\n };\n return (\n <EventsPage workspaceId={workspace.id} filters={search} onFiltersChange={onFiltersChange} />\n );\n },\n});\n"],"names":["defineRoute","useActiveWorkspace","getRouteApi","EventsPage","validateTriggerEventsSearch","routeApi","validateSearch","search","component","workspace","useSearch","navigate","useNavigate","onFiltersChange","patch","replace","workspaceId","id","filters"],"mappings":";AAAA,SAAQA,WAAW,EAAEC,kBAAkB,QAAO,gCAAgC;AAC9E,SAAQC,WAAW,QAAO,yBAAyB;AAEnD,SAAQC,UAAU,QAAO,wBAAwB;AACjD,SAAkCC,2BAA2B,QAAO,aAAa;AAEjF,MAAMC,WAAWH,YAAY;AAE7B,0FAA0F;AAC1F,yFAAyF;AACzF,2FAA2F;AAC3F,6EAA6E;AAC7E,SAASI,eAAeC,MAA+B;IACrD,OAAOH,4BAA4BG;AACrC;AAEA,eAAeP,YAAY;IACzBM;IACAE,WAAW;QACT,MAAMC,YAAYR;QAClB,MAAMM,SAASF,SAASK,SAAS;QACjC,MAAMC,WAAWN,SAASO,WAAW;QACrC,MAAMC,kBAAkB,CAACC;YACvB,KAAKH,SAAS;gBAACJ,QAAQ;oBAAC,GAAGA,MAAM;oBAAE,GAAGO,KAAK;gBAAA;gBAAGC,SAAS;YAAI;QAC7D;QACA,qBACE,KAACZ;YAAWa,aAAaP,UAAUQ,EAAE;YAAEC,SAASX;YAAQM,iBAAiBA;;IAE7E;AACF,GAAG"}
package/dist/search.d.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  import { z } from 'zod';
2
+ import { type TriggerEventFilters } from '#core/trigger-event.js';
2
3
  /**
3
- * URL search params for the Events page. Reuses the DTO outcome enum so the page and the
4
- * read API share one source of truth, and matches the `TriggerEventFilters` shape the data
4
+ * URL search params for the Events page. Matches the `TriggerEventFilters` shape the data
5
5
  * hook consumes. Every field uses `.catch(undefined)` so a hand-edited or stale URL drops
6
6
  * the bad param rather than throwing inside the router's `validateSearch`.
7
7
  */
@@ -18,6 +18,6 @@ export declare const triggerEventsSearchSchema: z.ZodObject<{
18
18
  from: z.ZodCatch<z.ZodOptional<z.ZodString>>;
19
19
  to: z.ZodCatch<z.ZodOptional<z.ZodString>>;
20
20
  }, z.core.$strip>;
21
- export type TriggerEventsSearch = z.infer<typeof triggerEventsSearchSchema>;
21
+ export type TriggerEventsSearch = z.infer<typeof triggerEventsSearchSchema> & TriggerEventFilters;
22
22
  export declare function validateTriggerEventsSearch(search: Record<string, unknown>): TriggerEventsSearch;
23
23
  //# sourceMappingURL=search.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../src/search.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,CAAC,EAAC,MAAM,KAAK,CAAC;AAetB;;;;;GAKG;AACH,eAAO,MAAM,yBAAyB;;;;;;;;;;;;iBASpC,CAAC;AAEH,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,yBAAyB,CAAC,CAAC;AAE5E,wBAAgB,2BAA2B,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,mBAAmB,CAEhG"}
1
+ {"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../src/search.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,CAAC,EAAC,MAAM,KAAK,CAAC;AACtB,OAAO,EAAC,KAAK,mBAAmB,EAAuB,MAAM,wBAAwB,CAAC;AAetF;;;;GAIG;AACH,eAAO,MAAM,yBAAyB;;;;;;;;;;;;iBASpC,CAAC;AAEH,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,yBAAyB,CAAC,GAAG,mBAAmB,CAAC;AAElG,wBAAgB,2BAA2B,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,mBAAmB,CAEhG"}
package/dist/search.js CHANGED
@@ -1,14 +1,13 @@
1
- import { triggerEventOutcomeSchema } from '@shipfox/api-triggers-dto';
2
1
  import { z } from 'zod';
2
+ import { triggerEventOutcomes } from '#core/trigger-event.js';
3
3
  const stringListSearchSchema = z.preprocess((value)=>typeof value === 'string' ? [
4
4
  value
5
5
  ] : value, z.array(z.string())).optional().catch(undefined);
6
6
  const outcomeListSearchSchema = z.preprocess((value)=>typeof value === 'string' ? [
7
7
  value
8
- ] : value, z.array(triggerEventOutcomeSchema)).optional().catch(undefined);
8
+ ] : value, z.array(z.enum(triggerEventOutcomes))).optional().catch(undefined);
9
9
  /**
10
- * URL search params for the Events page. Reuses the DTO outcome enum so the page and the
11
- * read API share one source of truth, and matches the `TriggerEventFilters` shape the data
10
+ * URL search params for the Events page. Matches the `TriggerEventFilters` shape the data
12
11
  * hook consumes. Every field uses `.catch(undefined)` so a hand-edited or stale URL drops
13
12
  * the bad param rather than throwing inside the router's `validateSearch`.
14
13
  */ export const triggerEventsSearchSchema = z.object({
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/search.ts"],"sourcesContent":["import {triggerEventOutcomeSchema} from '@shipfox/api-triggers-dto';\nimport {z} from 'zod';\n\nconst stringListSearchSchema = z\n .preprocess((value) => (typeof value === 'string' ? [value] : value), z.array(z.string()))\n .optional()\n .catch(undefined);\n\nconst outcomeListSearchSchema = z\n .preprocess(\n (value) => (typeof value === 'string' ? [value] : value),\n z.array(triggerEventOutcomeSchema),\n )\n .optional()\n .catch(undefined);\n\n/**\n * URL search params for the Events page. Reuses the DTO outcome enum so the page and the\n * read API share one source of truth, and matches the `TriggerEventFilters` shape the data\n * hook consumes. Every field uses `.catch(undefined)` so a hand-edited or stale URL drops\n * the bad param rather than throwing inside the router's `validateSearch`.\n */\nexport const triggerEventsSearchSchema = z.object({\n source: stringListSearchSchema,\n event: stringListSearchSchema,\n outcome: outcomeListSearchSchema,\n // The read API requires ISO datetimes (`z.string().datetime()`); validate the same here so\n // a hand-edited or stale URL with a non-ISO date drops the param rather than forwarding it\n // and turning the first fetch into a full-page load error.\n from: z.string().datetime().optional().catch(undefined),\n to: z.string().datetime().optional().catch(undefined),\n});\n\nexport type TriggerEventsSearch = z.infer<typeof triggerEventsSearchSchema>;\n\nexport function validateTriggerEventsSearch(search: Record<string, unknown>): TriggerEventsSearch {\n return triggerEventsSearchSchema.parse(search);\n}\n"],"names":["triggerEventOutcomeSchema","z","stringListSearchSchema","preprocess","value","array","string","optional","catch","undefined","outcomeListSearchSchema","triggerEventsSearchSchema","object","source","event","outcome","from","datetime","to","validateTriggerEventsSearch","search","parse"],"mappings":"AAAA,SAAQA,yBAAyB,QAAO,4BAA4B;AACpE,SAAQC,CAAC,QAAO,MAAM;AAEtB,MAAMC,yBAAyBD,EAC5BE,UAAU,CAAC,CAACC,QAAW,OAAOA,UAAU,WAAW;QAACA;KAAM,GAAGA,OAAQH,EAAEI,KAAK,CAACJ,EAAEK,MAAM,KACrFC,QAAQ,GACRC,KAAK,CAACC;AAET,MAAMC,0BAA0BT,EAC7BE,UAAU,CACT,CAACC,QAAW,OAAOA,UAAU,WAAW;QAACA;KAAM,GAAGA,OAClDH,EAAEI,KAAK,CAACL,4BAETO,QAAQ,GACRC,KAAK,CAACC;AAET;;;;;CAKC,GACD,OAAO,MAAME,4BAA4BV,EAAEW,MAAM,CAAC;IAChDC,QAAQX;IACRY,OAAOZ;IACPa,SAASL;IACT,2FAA2F;IAC3F,2FAA2F;IAC3F,2DAA2D;IAC3DM,MAAMf,EAAEK,MAAM,GAAGW,QAAQ,GAAGV,QAAQ,GAAGC,KAAK,CAACC;IAC7CS,IAAIjB,EAAEK,MAAM,GAAGW,QAAQ,GAAGV,QAAQ,GAAGC,KAAK,CAACC;AAC7C,GAAG;AAIH,OAAO,SAASU,4BAA4BC,MAA+B;IACzE,OAAOT,0BAA0BU,KAAK,CAACD;AACzC"}
1
+ {"version":3,"sources":["../src/search.ts"],"sourcesContent":["import {z} from 'zod';\nimport {type TriggerEventFilters, triggerEventOutcomes} from '#core/trigger-event.js';\n\nconst stringListSearchSchema = z\n .preprocess((value) => (typeof value === 'string' ? [value] : value), z.array(z.string()))\n .optional()\n .catch(undefined);\n\nconst outcomeListSearchSchema = z\n .preprocess(\n (value) => (typeof value === 'string' ? [value] : value),\n z.array(z.enum(triggerEventOutcomes)),\n )\n .optional()\n .catch(undefined);\n\n/**\n * URL search params for the Events page. Matches the `TriggerEventFilters` shape the data\n * hook consumes. Every field uses `.catch(undefined)` so a hand-edited or stale URL drops\n * the bad param rather than throwing inside the router's `validateSearch`.\n */\nexport const triggerEventsSearchSchema = z.object({\n source: stringListSearchSchema,\n event: stringListSearchSchema,\n outcome: outcomeListSearchSchema,\n // The read API requires ISO datetimes (`z.string().datetime()`); validate the same here so\n // a hand-edited or stale URL with a non-ISO date drops the param rather than forwarding it\n // and turning the first fetch into a full-page load error.\n from: z.string().datetime().optional().catch(undefined),\n to: z.string().datetime().optional().catch(undefined),\n});\n\nexport type TriggerEventsSearch = z.infer<typeof triggerEventsSearchSchema> & TriggerEventFilters;\n\nexport function validateTriggerEventsSearch(search: Record<string, unknown>): TriggerEventsSearch {\n return triggerEventsSearchSchema.parse(search);\n}\n"],"names":["z","triggerEventOutcomes","stringListSearchSchema","preprocess","value","array","string","optional","catch","undefined","outcomeListSearchSchema","enum","triggerEventsSearchSchema","object","source","event","outcome","from","datetime","to","validateTriggerEventsSearch","search","parse"],"mappings":"AAAA,SAAQA,CAAC,QAAO,MAAM;AACtB,SAAkCC,oBAAoB,QAAO,yBAAyB;AAEtF,MAAMC,yBAAyBF,EAC5BG,UAAU,CAAC,CAACC,QAAW,OAAOA,UAAU,WAAW;QAACA;KAAM,GAAGA,OAAQJ,EAAEK,KAAK,CAACL,EAAEM,MAAM,KACrFC,QAAQ,GACRC,KAAK,CAACC;AAET,MAAMC,0BAA0BV,EAC7BG,UAAU,CACT,CAACC,QAAW,OAAOA,UAAU,WAAW;QAACA;KAAM,GAAGA,OAClDJ,EAAEK,KAAK,CAACL,EAAEW,IAAI,CAACV,wBAEhBM,QAAQ,GACRC,KAAK,CAACC;AAET;;;;CAIC,GACD,OAAO,MAAMG,4BAA4BZ,EAAEa,MAAM,CAAC;IAChDC,QAAQZ;IACRa,OAAOb;IACPc,SAASN;IACT,2FAA2F;IAC3F,2FAA2F;IAC3F,2DAA2D;IAC3DO,MAAMjB,EAAEM,MAAM,GAAGY,QAAQ,GAAGX,QAAQ,GAAGC,KAAK,CAACC;IAC7CU,IAAInB,EAAEM,MAAM,GAAGY,QAAQ,GAAGX,QAAQ,GAAGC,KAAK,CAACC;AAC7C,GAAG;AAIH,OAAO,SAASW,4BAA4BC,MAA+B;IACzE,OAAOT,0BAA0BU,KAAK,CAACD;AACzC"}