@panoptic-it-solutions/zoho-projects-client 0.2.4 → 0.2.6

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 (178) hide show
  1. package/README.md +75 -7
  2. package/dist/__tests__/fixtures/attachments.d.ts +59 -39
  3. package/dist/__tests__/fixtures/attachments.d.ts.map +1 -1
  4. package/dist/__tests__/fixtures/attachments.js +2 -4
  5. package/dist/__tests__/fixtures/attachments.js.map +1 -1
  6. package/dist/__tests__/fixtures/comments.d.ts +25 -13
  7. package/dist/__tests__/fixtures/comments.d.ts.map +1 -1
  8. package/dist/__tests__/fixtures/events.d.ts +27 -15
  9. package/dist/__tests__/fixtures/events.d.ts.map +1 -1
  10. package/dist/__tests__/fixtures/forums.d.ts +25 -13
  11. package/dist/__tests__/fixtures/forums.d.ts.map +1 -1
  12. package/dist/__tests__/fixtures/issues.d.ts +50 -26
  13. package/dist/__tests__/fixtures/issues.d.ts.map +1 -1
  14. package/dist/__tests__/fixtures/phases.d.ts +325 -41
  15. package/dist/__tests__/fixtures/phases.d.ts.map +1 -1
  16. package/dist/__tests__/fixtures/projects.d.ts +176 -8
  17. package/dist/__tests__/fixtures/projects.d.ts.map +1 -1
  18. package/dist/__tests__/fixtures/tasklists.d.ts +71 -25
  19. package/dist/__tests__/fixtures/tasklists.d.ts.map +1 -1
  20. package/dist/__tests__/fixtures/tasklists.js +1 -3
  21. package/dist/__tests__/fixtures/tasklists.js.map +1 -1
  22. package/dist/__tests__/fixtures/tasks.d.ts +257 -62
  23. package/dist/__tests__/fixtures/tasks.d.ts.map +1 -1
  24. package/dist/__tests__/fixtures/timelogs.d.ts +2 -2
  25. package/dist/__tests__/integration/api-v3.test.d.ts +2 -0
  26. package/dist/__tests__/integration/api-v3.test.d.ts.map +1 -0
  27. package/dist/__tests__/integration/api-v3.test.js +180 -0
  28. package/dist/__tests__/integration/api-v3.test.js.map +1 -0
  29. package/dist/__tests__/integration/setup.d.ts +0 -3
  30. package/dist/__tests__/integration/setup.d.ts.map +1 -1
  31. package/dist/__tests__/integration/setup.js +7 -1
  32. package/dist/__tests__/integration/setup.js.map +1 -1
  33. package/dist/__tests__/unit/client/attachments.test.js +31 -10
  34. package/dist/__tests__/unit/client/attachments.test.js.map +1 -1
  35. package/dist/__tests__/unit/client/blueprints.test.js +11 -11
  36. package/dist/__tests__/unit/client/blueprints.test.js.map +1 -1
  37. package/dist/__tests__/unit/client/clients.test.js +6 -6
  38. package/dist/__tests__/unit/client/clients.test.js.map +1 -1
  39. package/dist/__tests__/unit/client/comments.test.js +7 -7
  40. package/dist/__tests__/unit/client/comments.test.js.map +1 -1
  41. package/dist/__tests__/unit/client/contacts.test.js +6 -6
  42. package/dist/__tests__/unit/client/contacts.test.js.map +1 -1
  43. package/dist/__tests__/unit/client/customviews.test.js +8 -8
  44. package/dist/__tests__/unit/client/customviews.test.js.map +1 -1
  45. package/dist/__tests__/unit/client/dashboards.test.js +6 -6
  46. package/dist/__tests__/unit/client/dashboards.test.js.map +1 -1
  47. package/dist/__tests__/unit/client/events.test.js +6 -6
  48. package/dist/__tests__/unit/client/events.test.js.map +1 -1
  49. package/dist/__tests__/unit/client/followers.test.js +8 -8
  50. package/dist/__tests__/unit/client/followers.test.js.map +1 -1
  51. package/dist/__tests__/unit/client/forums.test.js +6 -6
  52. package/dist/__tests__/unit/client/forums.test.js.map +1 -1
  53. package/dist/__tests__/unit/client/groups.test.js +6 -6
  54. package/dist/__tests__/unit/client/groups.test.js.map +1 -1
  55. package/dist/__tests__/unit/client/issues.test.js +6 -6
  56. package/dist/__tests__/unit/client/issues.test.js.map +1 -1
  57. package/dist/__tests__/unit/client/leaves.test.js +6 -6
  58. package/dist/__tests__/unit/client/leaves.test.js.map +1 -1
  59. package/dist/__tests__/unit/client/modules.test.js +7 -7
  60. package/dist/__tests__/unit/client/modules.test.js.map +1 -1
  61. package/dist/__tests__/unit/client/phases.test.js +6 -6
  62. package/dist/__tests__/unit/client/phases.test.js.map +1 -1
  63. package/dist/__tests__/unit/client/portals.test.js +3 -3
  64. package/dist/__tests__/unit/client/portals.test.js.map +1 -1
  65. package/dist/__tests__/unit/client/profiles.test.js +6 -6
  66. package/dist/__tests__/unit/client/profiles.test.js.map +1 -1
  67. package/dist/__tests__/unit/client/projects.test.js +18 -18
  68. package/dist/__tests__/unit/client/projects.test.js.map +1 -1
  69. package/dist/__tests__/unit/client/reports.test.js +9 -9
  70. package/dist/__tests__/unit/client/reports.test.js.map +1 -1
  71. package/dist/__tests__/unit/client/roles.test.js +6 -6
  72. package/dist/__tests__/unit/client/roles.test.js.map +1 -1
  73. package/dist/__tests__/unit/client/search.test.js +7 -7
  74. package/dist/__tests__/unit/client/search.test.js.map +1 -1
  75. package/dist/__tests__/unit/client/tags.test.js +9 -9
  76. package/dist/__tests__/unit/client/tags.test.js.map +1 -1
  77. package/dist/__tests__/unit/client/tasklists.test.js +12 -12
  78. package/dist/__tests__/unit/client/tasklists.test.js.map +1 -1
  79. package/dist/__tests__/unit/client/tasks.test.js +17 -17
  80. package/dist/__tests__/unit/client/tasks.test.js.map +1 -1
  81. package/dist/__tests__/unit/client/teams.test.js +8 -8
  82. package/dist/__tests__/unit/client/teams.test.js.map +1 -1
  83. package/dist/__tests__/unit/client/timelogs.test.js +7 -7
  84. package/dist/__tests__/unit/client/timelogs.test.js.map +1 -1
  85. package/dist/__tests__/unit/client/timers.test.js +11 -11
  86. package/dist/__tests__/unit/client/timers.test.js.map +1 -1
  87. package/dist/__tests__/unit/client/trash.test.js +8 -8
  88. package/dist/__tests__/unit/client/trash.test.js.map +1 -1
  89. package/dist/__tests__/unit/client/users.test.js +8 -8
  90. package/dist/__tests__/unit/client/users.test.js.map +1 -1
  91. package/dist/__tests__/unit/client/widgets.test.js +6 -6
  92. package/dist/__tests__/unit/client/widgets.test.js.map +1 -1
  93. package/dist/client.d.ts +63 -11
  94. package/dist/client.d.ts.map +1 -1
  95. package/dist/client.js +470 -274
  96. package/dist/client.js.map +1 -1
  97. package/dist/types/attachments.d.ts +1525 -512
  98. package/dist/types/attachments.d.ts.map +1 -1
  99. package/dist/types/attachments.js +51 -10
  100. package/dist/types/attachments.js.map +1 -1
  101. package/dist/types/clients.js +2 -2
  102. package/dist/types/clients.js.map +1 -1
  103. package/dist/types/comments.d.ts +325 -169
  104. package/dist/types/comments.d.ts.map +1 -1
  105. package/dist/types/common.d.ts +33 -15
  106. package/dist/types/common.d.ts.map +1 -1
  107. package/dist/types/common.js +12 -7
  108. package/dist/types/common.js.map +1 -1
  109. package/dist/types/contacts.d.ts +6 -6
  110. package/dist/types/dashboards.d.ts +979 -511
  111. package/dist/types/dashboards.d.ts.map +1 -1
  112. package/dist/types/dashboards.js +1 -1
  113. package/dist/types/dashboards.js.map +1 -1
  114. package/dist/types/documents.d.ts +1300 -676
  115. package/dist/types/documents.d.ts.map +1 -1
  116. package/dist/types/events.d.ts +351 -195
  117. package/dist/types/events.d.ts.map +1 -1
  118. package/dist/types/forums.d.ts +325 -169
  119. package/dist/types/forums.d.ts.map +1 -1
  120. package/dist/types/forums.js +2 -2
  121. package/dist/types/forums.js.map +1 -1
  122. package/dist/types/groups.js +1 -1
  123. package/dist/types/groups.js.map +1 -1
  124. package/dist/types/index.d.ts +2 -1
  125. package/dist/types/index.d.ts.map +1 -1
  126. package/dist/types/index.js +3 -1
  127. package/dist/types/index.js.map +1 -1
  128. package/dist/types/issues.d.ts +650 -338
  129. package/dist/types/issues.d.ts.map +1 -1
  130. package/dist/types/issues.js +3 -3
  131. package/dist/types/issues.js.map +1 -1
  132. package/dist/types/phases.d.ts +4358 -561
  133. package/dist/types/phases.d.ts.map +1 -1
  134. package/dist/types/phases.js +103 -25
  135. package/dist/types/phases.js.map +1 -1
  136. package/dist/types/portals.js +5 -5
  137. package/dist/types/portals.js.map +1 -1
  138. package/dist/types/profiles.js +1 -1
  139. package/dist/types/profiles.js.map +1 -1
  140. package/dist/types/projects.d.ts +6324 -1368
  141. package/dist/types/projects.d.ts.map +1 -1
  142. package/dist/types/projects.js +123 -39
  143. package/dist/types/projects.js.map +1 -1
  144. package/dist/types/reports.d.ts +650 -338
  145. package/dist/types/reports.d.ts.map +1 -1
  146. package/dist/types/reports.js +1 -1
  147. package/dist/types/reports.js.map +1 -1
  148. package/dist/types/search.js +1 -1
  149. package/dist/types/search.js.map +1 -1
  150. package/dist/types/tags.js +1 -1
  151. package/dist/types/tags.js.map +1 -1
  152. package/dist/types/tasklists.d.ts +938 -326
  153. package/dist/types/tasklists.d.ts.map +1 -1
  154. package/dist/types/tasklists.js +43 -16
  155. package/dist/types/tasklists.js.map +1 -1
  156. package/dist/types/tasks.d.ts +3516 -876
  157. package/dist/types/tasks.d.ts.map +1 -1
  158. package/dist/types/tasks.js +70 -23
  159. package/dist/types/tasks.js.map +1 -1
  160. package/dist/types/teams.js +2 -2
  161. package/dist/types/teams.js.map +1 -1
  162. package/dist/types/timelogs.d.ts +232 -230
  163. package/dist/types/timelogs.d.ts.map +1 -1
  164. package/dist/types/timelogs.js.map +1 -1
  165. package/dist/types/timers.d.ts +750 -390
  166. package/dist/types/timers.d.ts.map +1 -1
  167. package/dist/types/trash.d.ts +650 -338
  168. package/dist/types/trash.d.ts.map +1 -1
  169. package/dist/types/workdrive.d.ts +1002 -0
  170. package/dist/types/workdrive.d.ts.map +1 -0
  171. package/dist/types/workdrive.js +70 -0
  172. package/dist/types/workdrive.js.map +1 -0
  173. package/dist/utils/pagination.d.ts +9 -9
  174. package/dist/utils/pagination.d.ts.map +1 -1
  175. package/dist/utils/pagination.js +11 -11
  176. package/dist/utils/pagination.js.map +1 -1
  177. package/package.json +3 -1
  178. package/templates/CLAUDE.md +185 -2
@@ -12,8 +12,8 @@ export declare function createTaskListFixture(count?: number): Task[];
12
12
  */
13
13
  export declare function createTaskListResponse(tasks: Task[], hasMore?: boolean): {
14
14
  tasks: import("zod").objectOutputType<{
15
- id: import("zod").ZodNumber;
16
- id_string: import("zod").ZodString;
15
+ id: import("zod").ZodUnion<[import("zod").ZodNumber, import("zod").ZodString]>;
16
+ id_string: import("zod").ZodOptional<import("zod").ZodString>;
17
17
  key: import("zod").ZodOptional<import("zod").ZodString>;
18
18
  name: import("zod").ZodString;
19
19
  description: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodString>>;
@@ -22,20 +22,39 @@ export declare function createTaskListResponse(tasks: Task[], hasMore?: boolean)
22
22
  name: import("zod").ZodString;
23
23
  type: import("zod").ZodOptional<import("zod").ZodString>;
24
24
  color_code: import("zod").ZodOptional<import("zod").ZodString>;
25
- }, "strip", import("zod").ZodTypeAny, {
26
- id: string | number;
27
- name: string;
28
- type?: string | undefined;
29
- color_code?: string | undefined;
30
- }, {
31
- id: string | number;
32
- name: string;
33
- type?: string | undefined;
34
- color_code?: string | undefined;
35
- }>>;
25
+ color_hexcode: import("zod").ZodOptional<import("zod").ZodString>;
26
+ is_closed_type: import("zod").ZodOptional<import("zod").ZodBoolean>;
27
+ }, "passthrough", import("zod").ZodTypeAny, import("zod").objectOutputType<{
28
+ id: import("zod").ZodUnion<[import("zod").ZodNumber, import("zod").ZodString]>;
29
+ name: import("zod").ZodString;
30
+ type: import("zod").ZodOptional<import("zod").ZodString>;
31
+ color_code: import("zod").ZodOptional<import("zod").ZodString>;
32
+ color_hexcode: import("zod").ZodOptional<import("zod").ZodString>;
33
+ is_closed_type: import("zod").ZodOptional<import("zod").ZodBoolean>;
34
+ }, import("zod").ZodTypeAny, "passthrough">, import("zod").objectInputType<{
35
+ id: import("zod").ZodUnion<[import("zod").ZodNumber, import("zod").ZodString]>;
36
+ name: import("zod").ZodString;
37
+ type: import("zod").ZodOptional<import("zod").ZodString>;
38
+ color_code: import("zod").ZodOptional<import("zod").ZodString>;
39
+ color_hexcode: import("zod").ZodOptional<import("zod").ZodString>;
40
+ is_closed_type: import("zod").ZodOptional<import("zod").ZodBoolean>;
41
+ }, import("zod").ZodTypeAny, "passthrough">>>;
36
42
  completed: import("zod").ZodOptional<import("zod").ZodBoolean>;
43
+ is_completed: import("zod").ZodOptional<import("zod").ZodBoolean>;
37
44
  percent_complete: import("zod").ZodOptional<import("zod").ZodUnion<[import("zod").ZodNumber, import("zod").ZodString]>>;
38
- priority: import("zod").ZodOptional<import("zod").ZodString>;
45
+ priority: import("zod").ZodOptional<import("zod").ZodUnion<[import("zod").ZodString, import("zod").ZodObject<{
46
+ id: import("zod").ZodOptional<import("zod").ZodString>;
47
+ name: import("zod").ZodOptional<import("zod").ZodString>;
48
+ color_hexcode: import("zod").ZodOptional<import("zod").ZodString>;
49
+ }, "passthrough", import("zod").ZodTypeAny, import("zod").objectOutputType<{
50
+ id: import("zod").ZodOptional<import("zod").ZodString>;
51
+ name: import("zod").ZodOptional<import("zod").ZodString>;
52
+ color_hexcode: import("zod").ZodOptional<import("zod").ZodString>;
53
+ }, import("zod").ZodTypeAny, "passthrough">, import("zod").objectInputType<{
54
+ id: import("zod").ZodOptional<import("zod").ZodString>;
55
+ name: import("zod").ZodOptional<import("zod").ZodString>;
56
+ color_hexcode: import("zod").ZodOptional<import("zod").ZodString>;
57
+ }, import("zod").ZodTypeAny, "passthrough">>]>>;
39
58
  start_date: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodString>>;
40
59
  start_date_long: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodNumber>>;
41
60
  end_date: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodString>>;
@@ -45,65 +64,241 @@ export declare function createTaskListResponse(tasks: Task[], hasMore?: boolean)
45
64
  created_time_format: import("zod").ZodOptional<import("zod").ZodString>;
46
65
  last_updated_time: import("zod").ZodOptional<import("zod").ZodString>;
47
66
  last_updated_time_long: import("zod").ZodOptional<import("zod").ZodNumber>;
48
- duration: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodUnion<[import("zod").ZodNumber, import("zod").ZodString]>>>;
67
+ modified_time: import("zod").ZodOptional<import("zod").ZodString>;
68
+ duration: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodUnion<[import("zod").ZodNumber, import("zod").ZodString, import("zod").ZodObject<{
69
+ type: import("zod").ZodOptional<import("zod").ZodString>;
70
+ value: import("zod").ZodOptional<import("zod").ZodUnion<[import("zod").ZodNumber, import("zod").ZodString]>>;
71
+ }, "passthrough", import("zod").ZodTypeAny, import("zod").objectOutputType<{
72
+ type: import("zod").ZodOptional<import("zod").ZodString>;
73
+ value: import("zod").ZodOptional<import("zod").ZodUnion<[import("zod").ZodNumber, import("zod").ZodString]>>;
74
+ }, import("zod").ZodTypeAny, "passthrough">, import("zod").objectInputType<{
75
+ type: import("zod").ZodOptional<import("zod").ZodString>;
76
+ value: import("zod").ZodOptional<import("zod").ZodUnion<[import("zod").ZodNumber, import("zod").ZodString]>>;
77
+ }, import("zod").ZodTypeAny, "passthrough">>]>>>;
49
78
  duration_type: import("zod").ZodOptional<import("zod").ZodString>;
50
- work: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodString>>;
79
+ work: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodUnion<[import("zod").ZodString, import("zod").ZodObject<{
80
+ hours: import("zod").ZodOptional<import("zod").ZodUnion<[import("zod").ZodNumber, import("zod").ZodString]>>;
81
+ unit: import("zod").ZodOptional<import("zod").ZodString>;
82
+ }, "passthrough", import("zod").ZodTypeAny, import("zod").objectOutputType<{
83
+ hours: import("zod").ZodOptional<import("zod").ZodUnion<[import("zod").ZodNumber, import("zod").ZodString]>>;
84
+ unit: import("zod").ZodOptional<import("zod").ZodString>;
85
+ }, import("zod").ZodTypeAny, "passthrough">, import("zod").objectInputType<{
86
+ hours: import("zod").ZodOptional<import("zod").ZodUnion<[import("zod").ZodNumber, import("zod").ZodString]>>;
87
+ unit: import("zod").ZodOptional<import("zod").ZodString>;
88
+ }, import("zod").ZodTypeAny, "passthrough">>]>>>;
51
89
  work_type: import("zod").ZodOptional<import("zod").ZodString>;
52
- created_by: import("zod").ZodOptional<import("zod").ZodUnion<[import("zod").ZodNumber, import("zod").ZodString]>>;
90
+ created_by: import("zod").ZodOptional<import("zod").ZodUnion<[import("zod").ZodNumber, import("zod").ZodString, import("zod").ZodObject<{
91
+ zuid: import("zod").ZodUnion<[import("zod").ZodNumber, import("zod").ZodString]>;
92
+ zpuid: import("zod").ZodString;
93
+ name: import("zod").ZodString;
94
+ email: import("zod").ZodOptional<import("zod").ZodString>;
95
+ first_name: import("zod").ZodOptional<import("zod").ZodString>;
96
+ last_name: import("zod").ZodOptional<import("zod").ZodString>;
97
+ full_name: import("zod").ZodOptional<import("zod").ZodString>;
98
+ }, "passthrough", import("zod").ZodTypeAny, import("zod").objectOutputType<{
99
+ zuid: import("zod").ZodUnion<[import("zod").ZodNumber, import("zod").ZodString]>;
100
+ zpuid: import("zod").ZodString;
101
+ name: import("zod").ZodString;
102
+ email: import("zod").ZodOptional<import("zod").ZodString>;
103
+ first_name: import("zod").ZodOptional<import("zod").ZodString>;
104
+ last_name: import("zod").ZodOptional<import("zod").ZodString>;
105
+ full_name: import("zod").ZodOptional<import("zod").ZodString>;
106
+ }, import("zod").ZodTypeAny, "passthrough">, import("zod").objectInputType<{
107
+ zuid: import("zod").ZodUnion<[import("zod").ZodNumber, import("zod").ZodString]>;
108
+ zpuid: import("zod").ZodString;
109
+ name: import("zod").ZodString;
110
+ email: import("zod").ZodOptional<import("zod").ZodString>;
111
+ first_name: import("zod").ZodOptional<import("zod").ZodString>;
112
+ last_name: import("zod").ZodOptional<import("zod").ZodString>;
113
+ full_name: import("zod").ZodOptional<import("zod").ZodString>;
114
+ }, import("zod").ZodTypeAny, "passthrough">>]>>;
53
115
  created_person: import("zod").ZodOptional<import("zod").ZodString>;
116
+ owner: import("zod").ZodOptional<import("zod").ZodUnion<[import("zod").ZodObject<{
117
+ zuid: import("zod").ZodUnion<[import("zod").ZodNumber, import("zod").ZodString]>;
118
+ zpuid: import("zod").ZodString;
119
+ name: import("zod").ZodString;
120
+ email: import("zod").ZodOptional<import("zod").ZodString>;
121
+ first_name: import("zod").ZodOptional<import("zod").ZodString>;
122
+ last_name: import("zod").ZodOptional<import("zod").ZodString>;
123
+ full_name: import("zod").ZodOptional<import("zod").ZodString>;
124
+ }, "passthrough", import("zod").ZodTypeAny, import("zod").objectOutputType<{
125
+ zuid: import("zod").ZodUnion<[import("zod").ZodNumber, import("zod").ZodString]>;
126
+ zpuid: import("zod").ZodString;
127
+ name: import("zod").ZodString;
128
+ email: import("zod").ZodOptional<import("zod").ZodString>;
129
+ first_name: import("zod").ZodOptional<import("zod").ZodString>;
130
+ last_name: import("zod").ZodOptional<import("zod").ZodString>;
131
+ full_name: import("zod").ZodOptional<import("zod").ZodString>;
132
+ }, import("zod").ZodTypeAny, "passthrough">, import("zod").objectInputType<{
133
+ zuid: import("zod").ZodUnion<[import("zod").ZodNumber, import("zod").ZodString]>;
134
+ zpuid: import("zod").ZodString;
135
+ name: import("zod").ZodString;
136
+ email: import("zod").ZodOptional<import("zod").ZodString>;
137
+ first_name: import("zod").ZodOptional<import("zod").ZodString>;
138
+ last_name: import("zod").ZodOptional<import("zod").ZodString>;
139
+ full_name: import("zod").ZodOptional<import("zod").ZodString>;
140
+ }, import("zod").ZodTypeAny, "passthrough">>, import("zod").ZodObject<{
141
+ id: import("zod").ZodOptional<import("zod").ZodUnion<[import("zod").ZodString, import("zod").ZodNumber]>>;
142
+ name: import("zod").ZodOptional<import("zod").ZodString>;
143
+ email: import("zod").ZodOptional<import("zod").ZodString>;
144
+ zpuid: import("zod").ZodOptional<import("zod").ZodString>;
145
+ zuid: import("zod").ZodOptional<import("zod").ZodUnion<[import("zod").ZodNumber, import("zod").ZodString]>>;
146
+ first_name: import("zod").ZodOptional<import("zod").ZodString>;
147
+ last_name: import("zod").ZodOptional<import("zod").ZodString>;
148
+ full_name: import("zod").ZodOptional<import("zod").ZodString>;
149
+ }, "passthrough", import("zod").ZodTypeAny, import("zod").objectOutputType<{
150
+ id: import("zod").ZodOptional<import("zod").ZodUnion<[import("zod").ZodString, import("zod").ZodNumber]>>;
151
+ name: import("zod").ZodOptional<import("zod").ZodString>;
152
+ email: import("zod").ZodOptional<import("zod").ZodString>;
153
+ zpuid: import("zod").ZodOptional<import("zod").ZodString>;
154
+ zuid: import("zod").ZodOptional<import("zod").ZodUnion<[import("zod").ZodNumber, import("zod").ZodString]>>;
155
+ first_name: import("zod").ZodOptional<import("zod").ZodString>;
156
+ last_name: import("zod").ZodOptional<import("zod").ZodString>;
157
+ full_name: import("zod").ZodOptional<import("zod").ZodString>;
158
+ }, import("zod").ZodTypeAny, "passthrough">, import("zod").objectInputType<{
159
+ id: import("zod").ZodOptional<import("zod").ZodUnion<[import("zod").ZodString, import("zod").ZodNumber]>>;
160
+ name: import("zod").ZodOptional<import("zod").ZodString>;
161
+ email: import("zod").ZodOptional<import("zod").ZodString>;
162
+ zpuid: import("zod").ZodOptional<import("zod").ZodString>;
163
+ zuid: import("zod").ZodOptional<import("zod").ZodUnion<[import("zod").ZodNumber, import("zod").ZodString]>>;
164
+ first_name: import("zod").ZodOptional<import("zod").ZodString>;
165
+ last_name: import("zod").ZodOptional<import("zod").ZodString>;
166
+ full_name: import("zod").ZodOptional<import("zod").ZodString>;
167
+ }, import("zod").ZodTypeAny, "passthrough">>]>>;
168
+ updated_by: import("zod").ZodOptional<import("zod").ZodObject<{
169
+ zuid: import("zod").ZodUnion<[import("zod").ZodNumber, import("zod").ZodString]>;
170
+ zpuid: import("zod").ZodString;
171
+ name: import("zod").ZodString;
172
+ email: import("zod").ZodOptional<import("zod").ZodString>;
173
+ first_name: import("zod").ZodOptional<import("zod").ZodString>;
174
+ last_name: import("zod").ZodOptional<import("zod").ZodString>;
175
+ full_name: import("zod").ZodOptional<import("zod").ZodString>;
176
+ }, "passthrough", import("zod").ZodTypeAny, import("zod").objectOutputType<{
177
+ zuid: import("zod").ZodUnion<[import("zod").ZodNumber, import("zod").ZodString]>;
178
+ zpuid: import("zod").ZodString;
179
+ name: import("zod").ZodString;
180
+ email: import("zod").ZodOptional<import("zod").ZodString>;
181
+ first_name: import("zod").ZodOptional<import("zod").ZodString>;
182
+ last_name: import("zod").ZodOptional<import("zod").ZodString>;
183
+ full_name: import("zod").ZodOptional<import("zod").ZodString>;
184
+ }, import("zod").ZodTypeAny, "passthrough">, import("zod").objectInputType<{
185
+ zuid: import("zod").ZodUnion<[import("zod").ZodNumber, import("zod").ZodString]>;
186
+ zpuid: import("zod").ZodString;
187
+ name: import("zod").ZodString;
188
+ email: import("zod").ZodOptional<import("zod").ZodString>;
189
+ first_name: import("zod").ZodOptional<import("zod").ZodString>;
190
+ last_name: import("zod").ZodOptional<import("zod").ZodString>;
191
+ full_name: import("zod").ZodOptional<import("zod").ZodString>;
192
+ }, import("zod").ZodTypeAny, "passthrough">>>;
54
193
  details: import("zod").ZodOptional<import("zod").ZodObject<{
55
194
  owners: import("zod").ZodOptional<import("zod").ZodArray<import("zod").ZodObject<{
56
- id: import("zod").ZodString;
57
- name: import("zod").ZodString;
195
+ id: import("zod").ZodOptional<import("zod").ZodUnion<[import("zod").ZodString, import("zod").ZodNumber]>>;
196
+ name: import("zod").ZodOptional<import("zod").ZodString>;
58
197
  email: import("zod").ZodOptional<import("zod").ZodString>;
59
198
  zpuid: import("zod").ZodOptional<import("zod").ZodString>;
60
- }, "strip", import("zod").ZodTypeAny, {
61
- id: string;
62
- name: string;
63
- email?: string | undefined;
64
- zpuid?: string | undefined;
65
- }, {
66
- id: string;
67
- name: string;
68
- email?: string | undefined;
69
- zpuid?: string | undefined;
70
- }>, "many">>;
199
+ zuid: import("zod").ZodOptional<import("zod").ZodUnion<[import("zod").ZodNumber, import("zod").ZodString]>>;
200
+ first_name: import("zod").ZodOptional<import("zod").ZodString>;
201
+ last_name: import("zod").ZodOptional<import("zod").ZodString>;
202
+ full_name: import("zod").ZodOptional<import("zod").ZodString>;
203
+ }, "passthrough", import("zod").ZodTypeAny, import("zod").objectOutputType<{
204
+ id: import("zod").ZodOptional<import("zod").ZodUnion<[import("zod").ZodString, import("zod").ZodNumber]>>;
205
+ name: import("zod").ZodOptional<import("zod").ZodString>;
206
+ email: import("zod").ZodOptional<import("zod").ZodString>;
207
+ zpuid: import("zod").ZodOptional<import("zod").ZodString>;
208
+ zuid: import("zod").ZodOptional<import("zod").ZodUnion<[import("zod").ZodNumber, import("zod").ZodString]>>;
209
+ first_name: import("zod").ZodOptional<import("zod").ZodString>;
210
+ last_name: import("zod").ZodOptional<import("zod").ZodString>;
211
+ full_name: import("zod").ZodOptional<import("zod").ZodString>;
212
+ }, import("zod").ZodTypeAny, "passthrough">, import("zod").objectInputType<{
213
+ id: import("zod").ZodOptional<import("zod").ZodUnion<[import("zod").ZodString, import("zod").ZodNumber]>>;
214
+ name: import("zod").ZodOptional<import("zod").ZodString>;
215
+ email: import("zod").ZodOptional<import("zod").ZodString>;
216
+ zpuid: import("zod").ZodOptional<import("zod").ZodString>;
217
+ zuid: import("zod").ZodOptional<import("zod").ZodUnion<[import("zod").ZodNumber, import("zod").ZodString]>>;
218
+ first_name: import("zod").ZodOptional<import("zod").ZodString>;
219
+ last_name: import("zod").ZodOptional<import("zod").ZodString>;
220
+ full_name: import("zod").ZodOptional<import("zod").ZodString>;
221
+ }, import("zod").ZodTypeAny, "passthrough">>, "many">>;
71
222
  }, "strip", import("zod").ZodTypeAny, {
72
- owners?: {
73
- id: string;
74
- name: string;
75
- email?: string | undefined;
76
- zpuid?: string | undefined;
77
- }[] | undefined;
223
+ owners?: import("zod").objectOutputType<{
224
+ id: import("zod").ZodOptional<import("zod").ZodUnion<[import("zod").ZodString, import("zod").ZodNumber]>>;
225
+ name: import("zod").ZodOptional<import("zod").ZodString>;
226
+ email: import("zod").ZodOptional<import("zod").ZodString>;
227
+ zpuid: import("zod").ZodOptional<import("zod").ZodString>;
228
+ zuid: import("zod").ZodOptional<import("zod").ZodUnion<[import("zod").ZodNumber, import("zod").ZodString]>>;
229
+ first_name: import("zod").ZodOptional<import("zod").ZodString>;
230
+ last_name: import("zod").ZodOptional<import("zod").ZodString>;
231
+ full_name: import("zod").ZodOptional<import("zod").ZodString>;
232
+ }, import("zod").ZodTypeAny, "passthrough">[] | undefined;
78
233
  }, {
79
- owners?: {
80
- id: string;
81
- name: string;
82
- email?: string | undefined;
83
- zpuid?: string | undefined;
84
- }[] | undefined;
234
+ owners?: import("zod").objectInputType<{
235
+ id: import("zod").ZodOptional<import("zod").ZodUnion<[import("zod").ZodString, import("zod").ZodNumber]>>;
236
+ name: import("zod").ZodOptional<import("zod").ZodString>;
237
+ email: import("zod").ZodOptional<import("zod").ZodString>;
238
+ zpuid: import("zod").ZodOptional<import("zod").ZodString>;
239
+ zuid: import("zod").ZodOptional<import("zod").ZodUnion<[import("zod").ZodNumber, import("zod").ZodString]>>;
240
+ first_name: import("zod").ZodOptional<import("zod").ZodString>;
241
+ last_name: import("zod").ZodOptional<import("zod").ZodString>;
242
+ full_name: import("zod").ZodOptional<import("zod").ZodString>;
243
+ }, import("zod").ZodTypeAny, "passthrough">[] | undefined;
85
244
  }>>;
86
245
  tasklist: import("zod").ZodOptional<import("zod").ZodObject<{
87
246
  id: import("zod").ZodUnion<[import("zod").ZodNumber, import("zod").ZodString]>;
88
247
  id_string: import("zod").ZodOptional<import("zod").ZodString>;
89
248
  name: import("zod").ZodString;
90
- }, "strip", import("zod").ZodTypeAny, {
91
- id: string | number;
92
- name: string;
93
- id_string?: string | undefined;
94
- }, {
95
- id: string | number;
96
- name: string;
97
- id_string?: string | undefined;
98
- }>>;
249
+ }, "passthrough", import("zod").ZodTypeAny, import("zod").objectOutputType<{
250
+ id: import("zod").ZodUnion<[import("zod").ZodNumber, import("zod").ZodString]>;
251
+ id_string: import("zod").ZodOptional<import("zod").ZodString>;
252
+ name: import("zod").ZodString;
253
+ }, import("zod").ZodTypeAny, "passthrough">, import("zod").objectInputType<{
254
+ id: import("zod").ZodUnion<[import("zod").ZodNumber, import("zod").ZodString]>;
255
+ id_string: import("zod").ZodOptional<import("zod").ZodString>;
256
+ name: import("zod").ZodString;
257
+ }, import("zod").ZodTypeAny, "passthrough">>>;
258
+ task_list: import("zod").ZodOptional<import("zod").ZodObject<{
259
+ id: import("zod").ZodUnion<[import("zod").ZodNumber, import("zod").ZodString]>;
260
+ id_string: import("zod").ZodOptional<import("zod").ZodString>;
261
+ name: import("zod").ZodString;
262
+ }, "passthrough", import("zod").ZodTypeAny, import("zod").objectOutputType<{
263
+ id: import("zod").ZodUnion<[import("zod").ZodNumber, import("zod").ZodString]>;
264
+ id_string: import("zod").ZodOptional<import("zod").ZodString>;
265
+ name: import("zod").ZodString;
266
+ }, import("zod").ZodTypeAny, "passthrough">, import("zod").objectInputType<{
267
+ id: import("zod").ZodUnion<[import("zod").ZodNumber, import("zod").ZodString]>;
268
+ id_string: import("zod").ZodOptional<import("zod").ZodString>;
269
+ name: import("zod").ZodString;
270
+ }, import("zod").ZodTypeAny, "passthrough">>>;
99
271
  milestone_id: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodUnion<[import("zod").ZodNumber, import("zod").ZodString]>>>;
272
+ milestone: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodObject<{
273
+ id: import("zod").ZodUnion<[import("zod").ZodNumber, import("zod").ZodString]>;
274
+ name: import("zod").ZodOptional<import("zod").ZodString>;
275
+ }, "passthrough", import("zod").ZodTypeAny, import("zod").objectOutputType<{
276
+ id: import("zod").ZodUnion<[import("zod").ZodNumber, import("zod").ZodString]>;
277
+ name: import("zod").ZodOptional<import("zod").ZodString>;
278
+ }, import("zod").ZodTypeAny, "passthrough">, import("zod").objectInputType<{
279
+ id: import("zod").ZodUnion<[import("zod").ZodNumber, import("zod").ZodString]>;
280
+ name: import("zod").ZodOptional<import("zod").ZodString>;
281
+ }, import("zod").ZodTypeAny, "passthrough">>>>;
100
282
  parent_task_id: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodUnion<[import("zod").ZodNumber, import("zod").ZodString]>>>;
283
+ parent_task: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodObject<{
284
+ id: import("zod").ZodUnion<[import("zod").ZodNumber, import("zod").ZodString]>;
285
+ name: import("zod").ZodOptional<import("zod").ZodString>;
286
+ }, "passthrough", import("zod").ZodTypeAny, import("zod").objectOutputType<{
287
+ id: import("zod").ZodUnion<[import("zod").ZodNumber, import("zod").ZodString]>;
288
+ name: import("zod").ZodOptional<import("zod").ZodString>;
289
+ }, import("zod").ZodTypeAny, "passthrough">, import("zod").objectInputType<{
290
+ id: import("zod").ZodUnion<[import("zod").ZodNumber, import("zod").ZodString]>;
291
+ name: import("zod").ZodOptional<import("zod").ZodString>;
292
+ }, import("zod").ZodTypeAny, "passthrough">>>>;
101
293
  root_task_id: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodUnion<[import("zod").ZodNumber, import("zod").ZodString]>>>;
102
294
  isparent: import("zod").ZodOptional<import("zod").ZodBoolean>;
295
+ is_parent: import("zod").ZodOptional<import("zod").ZodBoolean>;
103
296
  subtasks: import("zod").ZodOptional<import("zod").ZodBoolean>;
297
+ has_subtasks: import("zod").ZodOptional<import("zod").ZodBoolean>;
104
298
  depth: import("zod").ZodOptional<import("zod").ZodNumber>;
105
299
  order_sequence: import("zod").ZodOptional<import("zod").ZodNumber>;
106
300
  billingtype: import("zod").ZodOptional<import("zod").ZodString>;
301
+ billing_type: import("zod").ZodOptional<import("zod").ZodString>;
107
302
  log_hours: import("zod").ZodOptional<import("zod").ZodObject<{
108
303
  billable_hours: import("zod").ZodOptional<import("zod").ZodString>;
109
304
  non_billable_hours: import("zod").ZodOptional<import("zod").ZodString>;
@@ -115,18 +310,18 @@ export declare function createTaskListResponse(tasks: Task[], hasMore?: boolean)
115
310
  non_billable_hours?: string | undefined;
116
311
  }>>;
117
312
  project: import("zod").ZodOptional<import("zod").ZodObject<{
118
- id: import("zod").ZodNumber;
313
+ id: import("zod").ZodUnion<[import("zod").ZodNumber, import("zod").ZodString]>;
119
314
  id_string: import("zod").ZodOptional<import("zod").ZodString>;
120
- name: import("zod").ZodString;
121
- }, "strip", import("zod").ZodTypeAny, {
122
- id: number;
123
- name: string;
124
- id_string?: string | undefined;
125
- }, {
126
- id: number;
127
- name: string;
128
- id_string?: string | undefined;
129
- }>>;
315
+ name: import("zod").ZodOptional<import("zod").ZodString>;
316
+ }, "passthrough", import("zod").ZodTypeAny, import("zod").objectOutputType<{
317
+ id: import("zod").ZodUnion<[import("zod").ZodNumber, import("zod").ZodString]>;
318
+ id_string: import("zod").ZodOptional<import("zod").ZodString>;
319
+ name: import("zod").ZodOptional<import("zod").ZodString>;
320
+ }, import("zod").ZodTypeAny, "passthrough">, import("zod").objectInputType<{
321
+ id: import("zod").ZodUnion<[import("zod").ZodNumber, import("zod").ZodString]>;
322
+ id_string: import("zod").ZodOptional<import("zod").ZodString>;
323
+ name: import("zod").ZodOptional<import("zod").ZodString>;
324
+ }, import("zod").ZodTypeAny, "passthrough">>>;
130
325
  link: import("zod").ZodOptional<import("zod").ZodObject<{
131
326
  self: import("zod").ZodOptional<import("zod").ZodObject<{
132
327
  url: import("zod").ZodString;
@@ -1 +1 @@
1
- {"version":3,"file":"tasks.d.ts","sourceRoot":"","sources":["../../../src/__tests__/fixtures/tasks.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAEjD;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,SAAS,GAAE,OAAO,CAAC,IAAI,CAAM,GAAG,IAAI,CAwCrE;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,GAAE,MAAU,GAAG,IAAI,EAAE,CAE/D;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,OAAO,GAAE,OAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAU7E"}
1
+ {"version":3,"file":"tasks.d.ts","sourceRoot":"","sources":["../../../src/__tests__/fixtures/tasks.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAEjD;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,SAAS,GAAE,OAAO,CAAC,IAAI,CAAM,GAAG,IAAI,CAwCrE;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,GAAE,MAAU,GAAG,IAAI,EAAE,CAE/D;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,OAAO,GAAE,OAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAU7E"}
@@ -55,16 +55,16 @@ export declare function createTimeLogListResponse(timelogs: TimeLog[], hasMore?:
55
55
  id: number;
56
56
  name: string;
57
57
  id_string?: string | undefined;
58
+ is_parent?: boolean | undefined;
58
59
  is_sub_task?: boolean | undefined;
59
60
  sub_task_level?: number | undefined;
60
- is_parent?: boolean | undefined;
61
61
  }, {
62
62
  id: number;
63
63
  name: string;
64
64
  id_string?: string | undefined;
65
+ is_parent?: boolean | undefined;
65
66
  is_sub_task?: boolean | undefined;
66
67
  sub_task_level?: number | undefined;
67
- is_parent?: boolean | undefined;
68
68
  }>>;
69
69
  task_list: import("zod").ZodOptional<import("zod").ZodObject<{
70
70
  id: import("zod").ZodNumber;
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=api-v3.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api-v3.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/integration/api-v3.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,180 @@
1
+ /**
2
+ * Integration tests for V3 API changes
3
+ *
4
+ * These tests verify:
5
+ * 1. The /api/v3/ base path works correctly
6
+ * 2. Count fields properly coerce strings to numbers
7
+ * 3. Task creation works with the V3 API
8
+ *
9
+ * Run with: npm run test:integration
10
+ *
11
+ * Required environment variables:
12
+ * - ZOHO_CLIENT_ID
13
+ * - ZOHO_CLIENT_SECRET
14
+ * - ZOHO_REFRESH_TOKEN
15
+ * - ZOHO_PORTAL_ID
16
+ */
17
+ import { describe, it, expect, beforeAll, afterAll } from "vitest";
18
+ import { getTestClient, getTestProjectId, generateTestName } from "./setup.js";
19
+ describe("V3 API Integration Tests", () => {
20
+ let client;
21
+ let projectId;
22
+ let createdTaskId = null;
23
+ beforeAll(async () => {
24
+ client = getTestClient();
25
+ projectId = await getTestProjectId();
26
+ });
27
+ afterAll(async () => {
28
+ // Cleanup: Delete test task if created
29
+ if (createdTaskId) {
30
+ try {
31
+ await client.tasks.delete(projectId, createdTaskId);
32
+ console.log(`Cleaned up test task: ${createdTaskId}`);
33
+ }
34
+ catch {
35
+ console.warn(`Failed to cleanup test task: ${createdTaskId}`);
36
+ }
37
+ }
38
+ });
39
+ describe("Projects API", () => {
40
+ it("should list projects with count fields parsed correctly", async () => {
41
+ const { data: projects } = await client.projects.list();
42
+ expect(projects.length).toBeGreaterThan(0);
43
+ // Verify count fields are numbers (coerced from strings if necessary)
44
+ for (const project of projects) {
45
+ if (project.task_count) {
46
+ expect(typeof project.task_count.open).toBe("number");
47
+ expect(typeof project.task_count.closed).toBe("number");
48
+ }
49
+ if (project.milestone_count) {
50
+ expect(typeof project.milestone_count.open).toBe("number");
51
+ expect(typeof project.milestone_count.closed).toBe("number");
52
+ }
53
+ if (project.bug_count) {
54
+ expect(typeof project.bug_count.open).toBe("number");
55
+ expect(typeof project.bug_count.closed).toBe("number");
56
+ }
57
+ }
58
+ });
59
+ it("should get a single project", async () => {
60
+ const project = await client.projects.get(projectId);
61
+ expect(project).toBeDefined();
62
+ // V3 API uses 'id' directly, legacy uses 'id_string'
63
+ expect(String(project.id)).toBe(projectId);
64
+ });
65
+ });
66
+ describe("Tasks API", () => {
67
+ it("should list tasks in a project", async () => {
68
+ const { data: tasks, pageInfo } = await client.tasks.list(projectId);
69
+ expect(Array.isArray(tasks)).toBe(true);
70
+ expect(pageInfo).toBeDefined();
71
+ // Verify pagination fields are numbers
72
+ if (pageInfo) {
73
+ expect(typeof pageInfo.page).toBe("number");
74
+ expect(typeof pageInfo.per_page).toBe("number");
75
+ }
76
+ });
77
+ it("should create a task using V3 API", async () => {
78
+ // V3 API requires a tasklist - get one from existing tasks
79
+ const { data: existingTasks } = await client.tasks.list(projectId);
80
+ if (existingTasks.length === 0) {
81
+ console.warn("Skipping - no existing tasks to get tasklist from");
82
+ return;
83
+ }
84
+ const tasklistId = existingTasks[0].tasklist?.id || existingTasks[0].task_list?.id;
85
+ if (!tasklistId) {
86
+ console.warn("Skipping - existing task has no tasklist ID");
87
+ return;
88
+ }
89
+ const taskName = generateTestName("test-task");
90
+ const task = await client.tasks.create(projectId, {
91
+ name: taskName,
92
+ description: "Integration test task - can be deleted",
93
+ tasklist: { id: String(tasklistId) },
94
+ });
95
+ expect(task).toBeDefined();
96
+ expect(task.name).toBe(taskName);
97
+ expect(task.id).toBeDefined();
98
+ // Store for cleanup - V3 uses 'id' as string directly, legacy uses 'id_string'
99
+ createdTaskId = String(task.id);
100
+ console.log(`Created test task: ${createdTaskId} (${task.name})`);
101
+ });
102
+ it("should get the created task", async () => {
103
+ if (!createdTaskId) {
104
+ console.warn("Skipping - no task was created");
105
+ return;
106
+ }
107
+ const task = await client.tasks.get(projectId, createdTaskId);
108
+ expect(task).toBeDefined();
109
+ // V3 uses 'id' directly, legacy uses 'id_string'
110
+ expect(String(task.id)).toBe(createdTaskId);
111
+ });
112
+ it("should update the created task", async () => {
113
+ if (!createdTaskId) {
114
+ console.warn("Skipping - no task was created");
115
+ return;
116
+ }
117
+ try {
118
+ const updatedName = generateTestName("updated-task");
119
+ const task = await client.tasks.update(projectId, createdTaskId, {
120
+ name: updatedName,
121
+ });
122
+ expect(task).toBeDefined();
123
+ expect(task.name).toBe(updatedName);
124
+ }
125
+ catch (error) {
126
+ // V3 API may not support PUT method for task updates
127
+ if (error && typeof error === "object" && "message" in error) {
128
+ const message = error.message;
129
+ if (message.includes("400") || message.includes("INVALID_METHOD")) {
130
+ console.warn("Skipping - V3 API may not support PUT for task updates");
131
+ return;
132
+ }
133
+ }
134
+ throw error;
135
+ }
136
+ });
137
+ });
138
+ describe("Phases (Milestones) API", () => {
139
+ it("should list phases with count fields parsed correctly", async () => {
140
+ const { data: phases } = await client.phases.list(projectId);
141
+ expect(Array.isArray(phases)).toBe(true);
142
+ // Verify count fields are numbers
143
+ for (const phase of phases) {
144
+ if (phase.open_task_count !== undefined) {
145
+ expect(typeof phase.open_task_count).toBe("number");
146
+ }
147
+ if (phase.closed_task_count !== undefined) {
148
+ expect(typeof phase.closed_task_count).toBe("number");
149
+ }
150
+ }
151
+ });
152
+ });
153
+ describe("Task Lists API", () => {
154
+ it("should list task lists with count fields parsed correctly", async () => {
155
+ try {
156
+ const { data: taskLists } = await client.tasklists.list(projectId);
157
+ expect(Array.isArray(taskLists)).toBe(true);
158
+ // Verify count fields are numbers
159
+ for (const taskList of taskLists) {
160
+ if (taskList.task_count) {
161
+ expect(typeof taskList.task_count.open).toBe("number");
162
+ expect(typeof taskList.task_count.closed).toBe("number");
163
+ }
164
+ }
165
+ }
166
+ catch (error) {
167
+ // Skip if OAuth scope doesn't include task lists
168
+ if (error && typeof error === "object" && "message" in error) {
169
+ const message = error.message;
170
+ if (message.includes("401") || message.includes("INVALID_OAUTHSCOPE")) {
171
+ console.warn("Skipping - OAuth scope does not include task lists");
172
+ return;
173
+ }
174
+ }
175
+ throw error;
176
+ }
177
+ });
178
+ });
179
+ });
180
+ //# sourceMappingURL=api-v3.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api-v3.test.js","sourceRoot":"","sources":["../../../src/__tests__/integration/api-v3.test.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,3 @@
1
- /**
2
- * Integration test setup - creates a real client for testing against Zoho API
3
- */
4
1
  import { type ZohoProjectsClient } from "../../client.js";
5
2
  /**
6
3
  * Get or create a test client using environment variables
@@ -1 +1 @@
1
- {"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../../../src/__tests__/integration/setup.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAA4B,KAAK,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAKpF;;GAEG;AACH,wBAAgB,aAAa,IAAI,kBAAkB,CAyBlD;AAOD,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,MAAM,CAAC,CAcxD;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAEvD"}
1
+ {"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../../../src/__tests__/integration/setup.ts"],"names":[],"mappings":"AAIA,OAAO,EAA4B,KAAK,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAQpF;;GAEG;AACH,wBAAgB,aAAa,IAAI,kBAAkB,CA2BlD;AAOD,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,MAAM,CAAC,CAexD;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAEvD"}