@rachelallyson/planning-center-people-ts 1.1.0 → 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (56) hide show
  1. package/CHANGELOG.md +181 -0
  2. package/README.md +16 -0
  3. package/dist/batch.d.ts +47 -0
  4. package/dist/batch.js +376 -0
  5. package/dist/client-manager.d.ts +66 -0
  6. package/dist/client-manager.js +156 -0
  7. package/dist/client.d.ts +71 -0
  8. package/dist/client.js +123 -0
  9. package/dist/core/http.d.ts +48 -0
  10. package/dist/core/http.js +265 -0
  11. package/dist/core/pagination.d.ts +34 -0
  12. package/dist/core/pagination.js +164 -0
  13. package/dist/index.d.ts +13 -3
  14. package/dist/index.js +23 -5
  15. package/dist/matching/matcher.d.ts +41 -0
  16. package/dist/matching/matcher.js +161 -0
  17. package/dist/matching/scoring.d.ts +35 -0
  18. package/dist/matching/scoring.js +141 -0
  19. package/dist/matching/strategies.d.ts +35 -0
  20. package/dist/matching/strategies.js +79 -0
  21. package/dist/modules/base.d.ts +46 -0
  22. package/dist/modules/base.js +82 -0
  23. package/dist/modules/contacts.d.ts +103 -0
  24. package/dist/modules/contacts.js +130 -0
  25. package/dist/modules/fields.d.ts +157 -0
  26. package/dist/modules/fields.js +294 -0
  27. package/dist/modules/households.d.ts +42 -0
  28. package/dist/modules/households.js +74 -0
  29. package/dist/modules/lists.d.ts +62 -0
  30. package/dist/modules/lists.js +92 -0
  31. package/dist/modules/notes.d.ts +74 -0
  32. package/dist/modules/notes.js +125 -0
  33. package/dist/modules/people.d.ts +196 -0
  34. package/dist/modules/people.js +221 -0
  35. package/dist/modules/workflows.d.ts +131 -0
  36. package/dist/modules/workflows.js +221 -0
  37. package/dist/monitoring.d.ts +53 -0
  38. package/dist/monitoring.js +142 -0
  39. package/dist/testing/index.d.ts +9 -0
  40. package/dist/testing/index.js +24 -0
  41. package/dist/testing/recorder.d.ts +58 -0
  42. package/dist/testing/recorder.js +195 -0
  43. package/dist/testing/simple-builders.d.ts +33 -0
  44. package/dist/testing/simple-builders.js +124 -0
  45. package/dist/testing/simple-factories.d.ts +91 -0
  46. package/dist/testing/simple-factories.js +288 -0
  47. package/dist/testing/types.d.ts +160 -0
  48. package/dist/testing/types.js +5 -0
  49. package/dist/types/batch.d.ts +50 -0
  50. package/dist/types/batch.js +5 -0
  51. package/dist/types/client.d.ts +89 -0
  52. package/dist/types/client.js +5 -0
  53. package/dist/types/events.d.ts +85 -0
  54. package/dist/types/events.js +5 -0
  55. package/dist/types/people.d.ts +20 -1
  56. package/package.json +9 -3
@@ -0,0 +1,288 @@
1
+ "use strict";
2
+ /**
3
+ * Simplified Testing Factory Functions
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.SimpleMockPcoClient = void 0;
7
+ exports.createSimpleMockClient = createSimpleMockClient;
8
+ exports.createTestClient = createTestClient;
9
+ exports.createErrorMockClient = createErrorMockClient;
10
+ exports.createSlowMockClient = createSlowMockClient;
11
+ const simple_builders_1 = require("./simple-builders");
12
+ class SimpleMockPcoClient {
13
+ constructor(config, mockConfig = {}) {
14
+ this.config = config;
15
+ this.mockConfig = mockConfig;
16
+ // Initialize modules with mock implementations
17
+ this.people = this.createPeopleModule();
18
+ this.fields = this.createFieldsModule();
19
+ this.workflows = this.createWorkflowsModule();
20
+ this.contacts = this.createContactsModule();
21
+ this.households = this.createHouseholdsModule();
22
+ this.notes = this.createNotesModule();
23
+ this.lists = this.createListsModule();
24
+ this.batch = this.createBatchModule();
25
+ }
26
+ createPeopleModule() {
27
+ return {
28
+ getAll: this.mockConfig.people?.getAll || (() => Promise.resolve(simple_builders_1.SimpleMockResponseBuilder.paginated([simple_builders_1.SimpleMockResponseBuilder.person()]))),
29
+ getById: this.mockConfig.people?.getById || ((id) => Promise.resolve(simple_builders_1.SimpleMockResponseBuilder.person({ id }))),
30
+ create: this.mockConfig.people?.create || ((data) => Promise.resolve(simple_builders_1.SimpleMockResponseBuilder.person(data))),
31
+ update: this.mockConfig.people?.update || ((id, data) => Promise.resolve(simple_builders_1.SimpleMockResponseBuilder.person({ id, ...data }))),
32
+ delete: this.mockConfig.people?.delete || (() => Promise.resolve()),
33
+ findOrCreate: this.mockConfig.people?.findOrCreate || ((options) => Promise.resolve(simple_builders_1.SimpleMockResponseBuilder.person({
34
+ first_name: options.firstName,
35
+ last_name: options.lastName,
36
+ }))),
37
+ createWithContacts: this.mockConfig.people?.createWithContacts || ((personData, contacts) => Promise.resolve(simple_builders_1.SimpleMockResponseBuilder.person({
38
+ first_name: personData.firstName,
39
+ last_name: personData.lastName,
40
+ }))),
41
+ search: this.mockConfig.people?.search || ((criteria) => Promise.resolve(simple_builders_1.SimpleMockResponseBuilder.paginated([simple_builders_1.SimpleMockResponseBuilder.person()]))),
42
+ getAllPages: this.mockConfig.people?.getAllPages || (() => Promise.resolve({
43
+ data: [simple_builders_1.SimpleMockResponseBuilder.person()],
44
+ totalCount: 1,
45
+ pagesFetched: 1,
46
+ duration: 100,
47
+ })),
48
+ addEmail: this.mockConfig.people?.addEmail || ((personId, data) => Promise.resolve(simple_builders_1.SimpleMockResponseBuilder.email(data))),
49
+ addPhoneNumber: this.mockConfig.people?.addPhoneNumber || ((personId, data) => Promise.resolve({ type: 'PhoneNumber', id: 'phone_123', attributes: data })),
50
+ addAddress: this.mockConfig.people?.addAddress || ((personId, data) => Promise.resolve({ type: 'Address', id: 'address_123', attributes: data })),
51
+ addSocialProfile: this.mockConfig.people?.addSocialProfile || ((personId, data) => Promise.resolve({ type: 'SocialProfile', id: 'social_123', attributes: data })),
52
+ };
53
+ }
54
+ createFieldsModule() {
55
+ return {
56
+ getAllFieldDefinitions: this.mockConfig.fields?.getAllFieldDefinitions || (() => Promise.resolve([{ type: 'FieldDefinition', id: 'field_1', attributes: { name: 'Birthdate', slug: 'birthdate' } }])),
57
+ getFieldDefinition: this.mockConfig.fields?.getFieldDefinition || ((id) => Promise.resolve({ type: 'FieldDefinition', id, attributes: { name: 'Test Field' } })),
58
+ getFieldDefinitionBySlug: this.mockConfig.fields?.getFieldDefinitionBySlug || ((slug) => Promise.resolve({ type: 'FieldDefinition', id: 'field_1', attributes: { slug } })),
59
+ getFieldDefinitionByName: this.mockConfig.fields?.getFieldDefinitionByName || ((name) => Promise.resolve({ type: 'FieldDefinition', id: 'field_1', attributes: { name } })),
60
+ setPersonField: this.mockConfig.fields?.setPersonField || (() => Promise.resolve({ id: 'field_data_123', value: 'test' })),
61
+ setPersonFieldById: this.mockConfig.fields?.setPersonFieldById || (() => Promise.resolve({ id: 'field_data_123', value: 'test' })),
62
+ setPersonFieldBySlug: this.mockConfig.fields?.setPersonFieldBySlug || ((personId, slug, value) => Promise.resolve({ id: 'field_data_123', value })),
63
+ setPersonFieldByName: this.mockConfig.fields?.setPersonFieldByName || (() => Promise.resolve({ id: 'field_data_123', value: 'test' })),
64
+ };
65
+ }
66
+ createWorkflowsModule() {
67
+ return {
68
+ getAll: this.mockConfig.workflows?.getAll || (() => Promise.resolve(simple_builders_1.SimpleMockResponseBuilder.paginated([simple_builders_1.SimpleMockResponseBuilder.workflow()]))),
69
+ getById: this.mockConfig.workflows?.getById || ((id) => Promise.resolve(simple_builders_1.SimpleMockResponseBuilder.workflow({ id }))),
70
+ create: this.mockConfig.workflows?.create || ((data) => Promise.resolve(simple_builders_1.SimpleMockResponseBuilder.workflow(data))),
71
+ update: this.mockConfig.workflows?.update || ((id, data) => Promise.resolve(simple_builders_1.SimpleMockResponseBuilder.workflow({ id, ...data }))),
72
+ delete: this.mockConfig.workflows?.delete || (() => Promise.resolve()),
73
+ getAllPages: this.mockConfig.workflows?.getAllPages || (() => Promise.resolve({
74
+ data: [simple_builders_1.SimpleMockResponseBuilder.workflow()],
75
+ totalCount: 1,
76
+ pagesFetched: 1,
77
+ duration: 100,
78
+ })),
79
+ addPersonToWorkflow: this.mockConfig.workflows?.addPersonToWorkflow || (() => Promise.resolve({ type: 'WorkflowCard', id: 'workflow_card_123', attributes: {} })),
80
+ createWorkflowCard: this.mockConfig.workflows?.createWorkflowCard || (() => Promise.resolve({ type: 'WorkflowCard', id: 'workflow_card_123', attributes: {} })),
81
+ createWorkflowCardNote: this.mockConfig.workflows?.createWorkflowCardNote || (() => Promise.resolve({ type: 'WorkflowCardNote', id: 'workflow_card_note_123', attributes: {} })),
82
+ };
83
+ }
84
+ createContactsModule() {
85
+ return {
86
+ getAllEmails: () => Promise.resolve(simple_builders_1.SimpleMockResponseBuilder.paginated([simple_builders_1.SimpleMockResponseBuilder.email()])),
87
+ createEmail: (data) => Promise.resolve(simple_builders_1.SimpleMockResponseBuilder.email(data)),
88
+ getAllPhoneNumbers: () => Promise.resolve(simple_builders_1.SimpleMockResponseBuilder.paginated([])),
89
+ createPhoneNumber: (data) => Promise.resolve({ type: 'PhoneNumber', id: 'phone_123', attributes: data }),
90
+ getAllAddresses: () => Promise.resolve(simple_builders_1.SimpleMockResponseBuilder.paginated([])),
91
+ createAddress: (data) => Promise.resolve({ type: 'Address', id: 'address_123', attributes: data }),
92
+ getAllSocialProfiles: () => Promise.resolve(simple_builders_1.SimpleMockResponseBuilder.paginated([])),
93
+ createSocialProfile: (data) => Promise.resolve({ type: 'SocialProfile', id: 'social_123', attributes: data }),
94
+ };
95
+ }
96
+ createHouseholdsModule() {
97
+ return {
98
+ getAll: () => Promise.resolve(simple_builders_1.SimpleMockResponseBuilder.paginated([])),
99
+ getById: (id) => Promise.resolve({ type: 'Household', id, attributes: {} }),
100
+ create: (data) => Promise.resolve({ type: 'Household', id: 'household_123', attributes: data }),
101
+ update: (id, data) => Promise.resolve({ type: 'Household', id, attributes: data }),
102
+ delete: () => Promise.resolve(),
103
+ };
104
+ }
105
+ createNotesModule() {
106
+ return {
107
+ getAll: () => Promise.resolve(simple_builders_1.SimpleMockResponseBuilder.paginated([])),
108
+ getById: (id) => Promise.resolve({ type: 'Note', id, attributes: {} }),
109
+ create: (data) => Promise.resolve({ type: 'Note', id: 'note_123', attributes: data }),
110
+ update: (id, data) => Promise.resolve({ type: 'Note', id, attributes: data }),
111
+ delete: () => Promise.resolve(),
112
+ };
113
+ }
114
+ createListsModule() {
115
+ return {
116
+ getAll: () => Promise.resolve(simple_builders_1.SimpleMockResponseBuilder.paginated([])),
117
+ getById: (id) => Promise.resolve({ type: 'List', id, attributes: {} }),
118
+ create: (data) => Promise.resolve({ type: 'List', id: 'list_123', attributes: data }),
119
+ update: (id, data) => Promise.resolve({ type: 'List', id, attributes: data }),
120
+ delete: () => Promise.resolve(),
121
+ };
122
+ }
123
+ createBatchModule() {
124
+ return {
125
+ execute: this.mockConfig.batch?.execute || ((operations) => Promise.resolve({
126
+ total: operations.length,
127
+ successful: operations.length,
128
+ failed: 0,
129
+ successRate: 1.0,
130
+ duration: 100,
131
+ results: operations.map((op, index) => ({
132
+ index,
133
+ operation: op,
134
+ success: true,
135
+ data: { id: `result_${index}` },
136
+ })),
137
+ })),
138
+ };
139
+ }
140
+ // Event system methods (mock implementations)
141
+ on(eventType, handler) {
142
+ // Mock implementation - does nothing
143
+ }
144
+ off(eventType, handler) {
145
+ // Mock implementation - does nothing
146
+ }
147
+ emit(event) {
148
+ // Mock implementation - does nothing
149
+ }
150
+ getConfig() {
151
+ return this.config;
152
+ }
153
+ getPerformanceMetrics() {
154
+ return {};
155
+ }
156
+ getRateLimitInfo() {
157
+ return {};
158
+ }
159
+ removeAllListeners(eventType) {
160
+ // Mock implementation - does nothing
161
+ }
162
+ listenerCount(eventType) {
163
+ return 0;
164
+ }
165
+ eventTypes() {
166
+ return [];
167
+ }
168
+ }
169
+ exports.SimpleMockPcoClient = SimpleMockPcoClient;
170
+ /**
171
+ * Create a simple mock client for testing
172
+ */
173
+ function createSimpleMockClient(config, mockConfig = {}) {
174
+ return new SimpleMockPcoClient(config, mockConfig);
175
+ }
176
+ /**
177
+ * Create a test client with common mock responses
178
+ */
179
+ function createTestClient(overrides = {}) {
180
+ const defaultConfig = {
181
+ auth: {
182
+ type: 'oauth',
183
+ accessToken: 'test-token',
184
+ refreshToken: 'test-refresh-token',
185
+ onRefresh: async () => { },
186
+ onRefreshFailure: async () => { },
187
+ },
188
+ };
189
+ const defaultMockConfig = {
190
+ people: {
191
+ getAll: () => Promise.resolve({
192
+ data: [
193
+ simple_builders_1.SimpleMockResponseBuilder.person({ id: 'person_1', first_name: 'John', last_name: 'Doe' })
194
+ ],
195
+ meta: { total_count: 1 },
196
+ links: { self: '/people', next: null, prev: null },
197
+ }),
198
+ create: (data) => Promise.resolve(simple_builders_1.SimpleMockResponseBuilder.person({
199
+ id: 'person_new',
200
+ first_name: data.firstName || data.first_name || 'New',
201
+ last_name: data.lastName || data.last_name || 'Person',
202
+ })),
203
+ },
204
+ fields: {
205
+ getAllFieldDefinitions: () => Promise.resolve([
206
+ simple_builders_1.SimpleMockResponseBuilder.person({ type: 'FieldDefinition', id: 'field_1', attributes: { name: 'Birthdate', slug: 'birthdate' } })
207
+ ]),
208
+ setPersonFieldBySlug: (personId, slug, value) => Promise.resolve({ id: 'field_data_123', value }),
209
+ },
210
+ workflows: {
211
+ getAll: () => Promise.resolve({
212
+ data: [simple_builders_1.SimpleMockResponseBuilder.workflow({ id: 'workflow_1', name: 'New Member Workflow' })],
213
+ meta: { total_count: 1 },
214
+ links: { self: '/workflows', next: null, prev: null },
215
+ }),
216
+ },
217
+ batch: {
218
+ execute: (operations) => Promise.resolve({
219
+ total: operations.length,
220
+ successful: operations.length,
221
+ failed: 0,
222
+ successRate: 1.0,
223
+ duration: 100,
224
+ results: operations.map((op, index) => ({
225
+ index,
226
+ operation: op,
227
+ success: true,
228
+ data: { id: `result_${index}` },
229
+ })),
230
+ }),
231
+ },
232
+ };
233
+ // Merge with overrides
234
+ const mergedMockConfig = { ...defaultMockConfig, ...overrides };
235
+ return createSimpleMockClient(defaultConfig, mergedMockConfig);
236
+ }
237
+ /**
238
+ * Create a mock client that simulates errors
239
+ */
240
+ function createErrorMockClient(errorType = 'network') {
241
+ const config = {
242
+ auth: {
243
+ type: 'oauth',
244
+ accessToken: 'test-token',
245
+ refreshToken: 'test-refresh-token',
246
+ onRefresh: async () => { },
247
+ onRefreshFailure: async () => { },
248
+ },
249
+ };
250
+ const errorMockConfig = {
251
+ people: {
252
+ getAll: () => {
253
+ const error = new Error(`Mock ${errorType} error`);
254
+ error.status = errorType === 'auth' ? 401 : errorType === 'rate_limit' ? 429 : 500;
255
+ return Promise.reject(error);
256
+ },
257
+ },
258
+ };
259
+ return createSimpleMockClient(config, errorMockConfig);
260
+ }
261
+ /**
262
+ * Create a mock client with specific response delays
263
+ */
264
+ function createSlowMockClient(delayMs = 1000) {
265
+ const config = {
266
+ auth: {
267
+ type: 'oauth',
268
+ accessToken: 'test-token',
269
+ refreshToken: 'test-refresh-token',
270
+ onRefresh: async () => { },
271
+ onRefreshFailure: async () => { },
272
+ },
273
+ };
274
+ const slowMockConfig = {
275
+ people: {
276
+ getAll: () => new Promise(resolve => {
277
+ setTimeout(() => {
278
+ resolve({
279
+ data: [],
280
+ meta: { total_count: 0 },
281
+ links: { self: '/people', next: null, prev: null },
282
+ });
283
+ }, delayMs);
284
+ }),
285
+ },
286
+ };
287
+ return createSimpleMockClient(config, slowMockConfig);
288
+ }
@@ -0,0 +1,160 @@
1
+ /**
2
+ * v2.0.0 Testing Types
3
+ */
4
+ import type { PcoClientConfig } from '../types/client';
5
+ import type { PersonResource, EmailResource, PhoneNumberResource, AddressResource, SocialProfileResource, FieldDefinitionResource, WorkflowResource, WorkflowCardResource, WorkflowCardNoteResource, HouseholdResource, NoteResource, ListResource } from '../types';
6
+ export interface MockClientConfig {
7
+ /** Mock responses for people operations */
8
+ people?: {
9
+ getAll?: () => Promise<{
10
+ data: PersonResource[];
11
+ meta?: any;
12
+ links?: any;
13
+ }>;
14
+ getById?: (id: string) => Promise<PersonResource>;
15
+ create?: (data: any) => Promise<PersonResource>;
16
+ update?: (id: string, data: any) => Promise<PersonResource>;
17
+ delete?: (id: string) => Promise<void>;
18
+ findOrCreate?: (options: any) => Promise<PersonResource>;
19
+ search?: (criteria: any) => Promise<{
20
+ data: PersonResource[];
21
+ meta?: any;
22
+ links?: any;
23
+ }>;
24
+ getAllPages?: (options?: any) => Promise<{
25
+ data: PersonResource[];
26
+ totalCount: number;
27
+ pagesFetched: number;
28
+ duration: number;
29
+ }>;
30
+ addEmail?: (personId: string, data: any) => Promise<EmailResource>;
31
+ addPhoneNumber?: (personId: string, data: any) => Promise<PhoneNumberResource>;
32
+ addAddress?: (personId: string, data: any) => Promise<AddressResource>;
33
+ addSocialProfile?: (personId: string, data: any) => Promise<SocialProfileResource>;
34
+ };
35
+ /** Mock responses for fields operations */
36
+ fields?: {
37
+ getAllFieldDefinitions?: () => Promise<FieldDefinitionResource[]>;
38
+ getFieldDefinition?: (id: string) => Promise<FieldDefinitionResource>;
39
+ getFieldDefinitionBySlug?: (slug: string) => Promise<FieldDefinitionResource | null>;
40
+ getFieldDefinitionByName?: (name: string) => Promise<FieldDefinitionResource | null>;
41
+ setPersonField?: (personId: string, options: any) => Promise<any>;
42
+ setPersonFieldById?: (personId: string, fieldId: string, value: string) => Promise<any>;
43
+ setPersonFieldBySlug?: (personId: string, slug: string, value: string) => Promise<any>;
44
+ setPersonFieldByName?: (personId: string, name: string, value: string) => Promise<any>;
45
+ };
46
+ /** Mock responses for workflows operations */
47
+ workflows?: {
48
+ getAll?: (options?: any) => Promise<{
49
+ data: WorkflowResource[];
50
+ meta?: any;
51
+ links?: any;
52
+ }>;
53
+ getById?: (id: string) => Promise<WorkflowResource>;
54
+ create?: (data: any) => Promise<WorkflowResource>;
55
+ update?: (id: string, data: any) => Promise<WorkflowResource>;
56
+ delete?: (id: string) => Promise<void>;
57
+ getAllPages?: (options?: any) => Promise<{
58
+ data: WorkflowResource[];
59
+ totalCount: number;
60
+ pagesFetched: number;
61
+ duration: number;
62
+ }>;
63
+ addPersonToWorkflow?: (personId: string, workflowId: string, options?: any) => Promise<WorkflowCardResource>;
64
+ createWorkflowCard?: (workflowId: string, personId: string) => Promise<WorkflowCardResource>;
65
+ createWorkflowCardNote?: (personId: string, workflowCardId: string, data: any) => Promise<WorkflowCardNoteResource>;
66
+ };
67
+ /** Mock responses for contacts operations */
68
+ contacts?: {
69
+ getAllEmails?: () => Promise<{
70
+ data: EmailResource[];
71
+ meta?: any;
72
+ links?: any;
73
+ }>;
74
+ createEmail?: (data: any) => Promise<EmailResource>;
75
+ getAllPhoneNumbers?: () => Promise<{
76
+ data: PhoneNumberResource[];
77
+ meta?: any;
78
+ links?: any;
79
+ }>;
80
+ createPhoneNumber?: (data: any) => Promise<PhoneNumberResource>;
81
+ getAllAddresses?: () => Promise<{
82
+ data: AddressResource[];
83
+ meta?: any;
84
+ links?: any;
85
+ }>;
86
+ createAddress?: (data: any) => Promise<AddressResource>;
87
+ getAllSocialProfiles?: () => Promise<{
88
+ data: SocialProfileResource[];
89
+ meta?: any;
90
+ links?: any;
91
+ }>;
92
+ createSocialProfile?: (data: any) => Promise<SocialProfileResource>;
93
+ };
94
+ /** Mock responses for households operations */
95
+ households?: {
96
+ getAll?: (options?: any) => Promise<{
97
+ data: HouseholdResource[];
98
+ meta?: any;
99
+ links?: any;
100
+ }>;
101
+ getById?: (id: string) => Promise<HouseholdResource>;
102
+ create?: (data: any) => Promise<HouseholdResource>;
103
+ update?: (id: string, data: any) => Promise<HouseholdResource>;
104
+ delete?: (id: string) => Promise<void>;
105
+ };
106
+ /** Mock responses for notes operations */
107
+ notes?: {
108
+ getAll?: (options?: any) => Promise<{
109
+ data: NoteResource[];
110
+ meta?: any;
111
+ links?: any;
112
+ }>;
113
+ getById?: (id: string) => Promise<NoteResource>;
114
+ create?: (data: any) => Promise<NoteResource>;
115
+ update?: (id: string, data: any) => Promise<NoteResource>;
116
+ delete?: (id: string) => Promise<void>;
117
+ };
118
+ /** Mock responses for lists operations */
119
+ lists?: {
120
+ getAll?: (options?: any) => Promise<{
121
+ data: ListResource[];
122
+ meta?: any;
123
+ links?: any;
124
+ }>;
125
+ getById?: (id: string) => Promise<ListResource>;
126
+ create?: (data: any) => Promise<ListResource>;
127
+ update?: (id: string, data: any) => Promise<ListResource>;
128
+ delete?: (id: string) => Promise<void>;
129
+ };
130
+ /** Mock responses for batch operations */
131
+ batch?: {
132
+ execute?: (operations: any[]) => Promise<any>;
133
+ };
134
+ }
135
+ export interface RecordingConfig {
136
+ /** Path to save recorded requests/responses */
137
+ recordPath: string;
138
+ /** Whether to record new requests or replay existing ones */
139
+ mode: 'record' | 'replay' | 'auto';
140
+ /** Filter which requests to record */
141
+ filter?: (endpoint: string, method: string) => boolean;
142
+ /** Transform recorded responses */
143
+ transform?: (response: any) => any;
144
+ }
145
+ export interface RecordedRequest {
146
+ endpoint: string;
147
+ method: string;
148
+ params?: Record<string, any>;
149
+ data?: any;
150
+ response: any;
151
+ timestamp: string;
152
+ }
153
+ export interface RecordedSession {
154
+ requests: RecordedRequest[];
155
+ metadata: {
156
+ recordedAt: string;
157
+ version: string;
158
+ config: PcoClientConfig;
159
+ };
160
+ }
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+ /**
3
+ * v2.0.0 Testing Types
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,50 @@
1
+ /**
2
+ * v2.0.0 Batch Operations Types
3
+ */
4
+ export interface BatchOperation {
5
+ type: string;
6
+ data?: any;
7
+ dependencies?: string[];
8
+ [key: string]: any;
9
+ }
10
+ export interface BatchResult<T = any> {
11
+ index: number;
12
+ operation: BatchOperation;
13
+ success: boolean;
14
+ data?: T;
15
+ error?: Error;
16
+ }
17
+ export interface BatchOptions {
18
+ /** Continue processing other operations if one fails */
19
+ continueOnError?: boolean;
20
+ /** Maximum number of operations to run in parallel */
21
+ maxConcurrency?: number;
22
+ /** Enable automatic rollback on failure */
23
+ enableRollback?: boolean;
24
+ /** Callback for each completed operation */
25
+ onOperationComplete?: (result: BatchResult) => void;
26
+ /** Callback for batch completion */
27
+ onBatchComplete?: (results: BatchResult[]) => void;
28
+ }
29
+ export interface BatchSummary {
30
+ total: number;
31
+ successful: number;
32
+ failed: number;
33
+ successRate: number;
34
+ duration: number;
35
+ results: BatchResult[];
36
+ }
37
+ export interface OperationReference {
38
+ /** Reference to a previous operation result using $index.path syntax */
39
+ reference: string;
40
+ /** The operation index being referenced */
41
+ index: number;
42
+ /** The path within the result object */
43
+ path: string;
44
+ }
45
+ export interface ResolvedBatchOperation extends BatchOperation {
46
+ /** Resolved data with references replaced */
47
+ resolvedData?: any;
48
+ /** Dependencies on other operations */
49
+ dependencies?: string[];
50
+ }
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+ /**
3
+ * v2.0.0 Batch Operations Types
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,89 @@
1
+ /**
2
+ * v2.0.0 Client Configuration Types
3
+ */
4
+ /** Authentication configuration for Personal Access Token */
5
+ export interface PersonalAccessTokenAuth {
6
+ type: 'personal_access_token';
7
+ personalAccessToken: string;
8
+ }
9
+ /** Authentication configuration for OAuth 2.0 with required refresh handling */
10
+ export interface OAuthAuth {
11
+ type: 'oauth';
12
+ accessToken: string;
13
+ refreshToken: string;
14
+ onRefresh: (tokens: {
15
+ accessToken: string;
16
+ refreshToken: string;
17
+ }) => void | Promise<void>;
18
+ onRefreshFailure: (error: Error) => void | Promise<void>;
19
+ }
20
+ /** Union type for authentication configurations */
21
+ export type PcoAuthConfig = PersonalAccessTokenAuth | OAuthAuth;
22
+ export interface PcoClientConfig {
23
+ /** Authentication configuration */
24
+ auth: PcoAuthConfig;
25
+ /** Caching configuration */
26
+ caching?: {
27
+ fieldDefinitions?: boolean;
28
+ ttl?: number;
29
+ maxSize?: number;
30
+ };
31
+ /** Retry configuration */
32
+ retry?: {
33
+ enabled?: boolean;
34
+ maxRetries?: number;
35
+ baseDelay?: number;
36
+ maxDelay?: number;
37
+ backoff?: 'linear' | 'exponential';
38
+ };
39
+ /** Event handlers */
40
+ events?: {
41
+ onError?: (event: ErrorEvent) => void | Promise<void>;
42
+ onAuthFailure?: (event: AuthFailureEvent) => void | Promise<void>;
43
+ onRequestStart?: (event: RequestStartEvent) => void | Promise<void>;
44
+ onRequestComplete?: (event: RequestCompleteEvent) => void | Promise<void>;
45
+ onRateLimit?: (event: RateLimitEvent) => void | Promise<void>;
46
+ };
47
+ /** Base URL override */
48
+ baseURL?: string;
49
+ /** Request timeout in milliseconds */
50
+ timeout?: number;
51
+ /** Custom headers */
52
+ headers?: Record<string, string>;
53
+ }
54
+ export interface ErrorEvent {
55
+ error: Error;
56
+ operation: string;
57
+ timestamp: string;
58
+ context?: Record<string, any>;
59
+ }
60
+ export interface AuthFailureEvent {
61
+ error: Error;
62
+ timestamp: string;
63
+ authType: 'oauth' | 'basic';
64
+ }
65
+ export interface RequestStartEvent {
66
+ endpoint: string;
67
+ method: string;
68
+ timestamp: string;
69
+ requestId: string;
70
+ }
71
+ export interface RequestCompleteEvent {
72
+ endpoint: string;
73
+ method: string;
74
+ status: number;
75
+ duration: number;
76
+ timestamp: string;
77
+ requestId: string;
78
+ }
79
+ export interface RateLimitEvent {
80
+ limit: number;
81
+ remaining: number;
82
+ resetTime: string;
83
+ timestamp: string;
84
+ }
85
+ export interface CacheEvent {
86
+ key: string;
87
+ operation: 'hit' | 'miss' | 'set' | 'invalidate';
88
+ timestamp: string;
89
+ }
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+ /**
3
+ * v2.0.0 Client Configuration Types
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });