@mcp-consultant-tools/powerplatform-data 1.0.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.
@@ -0,0 +1,342 @@
1
+ /**
2
+ * Icon Management Module
3
+ *
4
+ * Integrates with Fluent UI System Icons for entity icon management.
5
+ * Fetches SVG icons from GitHub and uploads them as web resources.
6
+ */
7
+ /**
8
+ * Fluent UI System Icons configuration
9
+ */
10
+ const FLUENT_ICONS_CONFIG = {
11
+ baseUrl: 'https://raw.githubusercontent.com/microsoft/fluentui-system-icons/main/assets',
12
+ defaultSize: 24,
13
+ defaultStyle: 'filled'
14
+ };
15
+ /**
16
+ * Icon suggestions based on entity type/name
17
+ */
18
+ const ICON_SUGGESTIONS = {
19
+ // People & Organizations
20
+ contact: [
21
+ { name: 'Person', fileName: 'person_24_filled.svg', url: '', category: 'people' },
22
+ { name: 'People', fileName: 'people_24_filled.svg', url: '', category: 'people' }
23
+ ],
24
+ account: [
25
+ { name: 'Building', fileName: 'building_24_filled.svg', url: '', category: 'places' },
26
+ { name: 'Organization', fileName: 'organization_24_filled.svg', url: '', category: 'people' }
27
+ ],
28
+ customer: [
29
+ { name: 'Person Circle', fileName: 'person_circle_24_filled.svg', url: '', category: 'people' }
30
+ ],
31
+ // Business
32
+ opportunity: [
33
+ { name: 'Money', fileName: 'money_24_filled.svg', url: '', category: 'commerce' },
34
+ { name: 'Target', fileName: 'target_24_filled.svg', url: '', category: 'general' }
35
+ ],
36
+ quote: [
37
+ { name: 'Document', fileName: 'document_24_filled.svg', url: '', category: 'document' },
38
+ { name: 'Document Text', fileName: 'document_text_24_filled.svg', url: '', category: 'document' }
39
+ ],
40
+ order: [
41
+ { name: 'Cart', fileName: 'cart_24_filled.svg', url: '', category: 'commerce' },
42
+ { name: 'Receipt', fileName: 'receipt_24_filled.svg', url: '', category: 'commerce' }
43
+ ],
44
+ invoice: [
45
+ { name: 'Receipt Money', fileName: 'receipt_money_24_filled.svg', url: '', category: 'commerce' }
46
+ ],
47
+ product: [
48
+ { name: 'Box', fileName: 'box_24_filled.svg', url: '', category: 'commerce' },
49
+ { name: 'Cube', fileName: 'cube_24_filled.svg', url: '', category: 'general' }
50
+ ],
51
+ // Cases & Service
52
+ case: [
53
+ { name: 'Question Circle', fileName: 'question_circle_24_filled.svg', url: '', category: 'general' },
54
+ { name: 'Chat Help', fileName: 'chat_help_24_filled.svg', url: '', category: 'communication' }
55
+ ],
56
+ incident: [
57
+ { name: 'Alert', fileName: 'alert_24_filled.svg', url: '', category: 'general' },
58
+ { name: 'Warning', fileName: 'warning_24_filled.svg', url: '', category: 'general' }
59
+ ],
60
+ ticket: [
61
+ { name: 'Ticket', fileName: 'ticket_24_filled.svg', url: '', category: 'general' }
62
+ ],
63
+ // Tasks & Activities
64
+ task: [
65
+ { name: 'Task List', fileName: 'task_list_24_filled.svg', url: '', category: 'productivity' },
66
+ { name: 'Checkmark', fileName: 'checkmark_24_filled.svg', url: '', category: 'general' }
67
+ ],
68
+ appointment: [
69
+ { name: 'Calendar', fileName: 'calendar_24_filled.svg', url: '', category: 'productivity' },
70
+ { name: 'Calendar Clock', fileName: 'calendar_clock_24_filled.svg', url: '', category: 'productivity' }
71
+ ],
72
+ email: [
73
+ { name: 'Mail', fileName: 'mail_24_filled.svg', url: '', category: 'communication' },
74
+ { name: 'Mail Inbox', fileName: 'mail_inbox_24_filled.svg', url: '', category: 'communication' }
75
+ ],
76
+ phonecall: [
77
+ { name: 'Call', fileName: 'call_24_filled.svg', url: '', category: 'communication' },
78
+ { name: 'Phone', fileName: 'phone_24_filled.svg', url: '', category: 'communication' }
79
+ ],
80
+ // Reference Data
81
+ category: [
82
+ { name: 'Tag', fileName: 'tag_24_filled.svg', url: '', category: 'general' },
83
+ { name: 'Grid', fileName: 'grid_24_filled.svg', url: '', category: 'general' }
84
+ ],
85
+ status: [
86
+ { name: 'Status', fileName: 'status_24_filled.svg', url: '', category: 'general' },
87
+ { name: 'Circle', fileName: 'circle_24_filled.svg', url: '', category: 'shapes' }
88
+ ],
89
+ type: [
90
+ { name: 'Options', fileName: 'options_24_filled.svg', url: '', category: 'general' }
91
+ ],
92
+ reason: [
93
+ { name: 'Info', fileName: 'info_24_filled.svg', url: '', category: 'general' }
94
+ ],
95
+ // Documents & Files
96
+ document: [
97
+ { name: 'Document', fileName: 'document_24_filled.svg', url: '', category: 'document' },
98
+ { name: 'Document Text', fileName: 'document_text_24_filled.svg', url: '', category: 'document' }
99
+ ],
100
+ file: [
101
+ { name: 'Document', fileName: 'document_24_filled.svg', url: '', category: 'document' }
102
+ ],
103
+ attachment: [
104
+ { name: 'Attach', fileName: 'attach_24_filled.svg', url: '', category: 'document' }
105
+ ],
106
+ note: [
107
+ { name: 'Note', fileName: 'note_24_filled.svg', url: '', category: 'document' },
108
+ { name: 'Document Edit', fileName: 'document_edit_24_filled.svg', url: '', category: 'document' }
109
+ ],
110
+ // Locations
111
+ location: [
112
+ { name: 'Location', fileName: 'location_24_filled.svg', url: '', category: 'places' },
113
+ { name: 'Pin', fileName: 'pin_24_filled.svg', url: '', category: 'places' }
114
+ ],
115
+ address: [
116
+ { name: 'Location', fileName: 'location_24_filled.svg', url: '', category: 'places' },
117
+ { name: 'Home', fileName: 'home_24_filled.svg', url: '', category: 'places' }
118
+ ],
119
+ // Projects & Work
120
+ project: [
121
+ { name: 'Briefcase', fileName: 'briefcase_24_filled.svg', url: '', category: 'productivity' },
122
+ { name: 'Folder', fileName: 'folder_24_filled.svg', url: '', category: 'document' }
123
+ ],
124
+ application: [
125
+ { name: 'Apps', fileName: 'apps_24_filled.svg', url: '', category: 'general' },
126
+ { name: 'Window', fileName: 'window_24_filled.svg', url: '', category: 'general' }
127
+ ],
128
+ // Default fallback
129
+ default: [
130
+ { name: 'Circle', fileName: 'circle_24_filled.svg', url: '', category: 'shapes' },
131
+ { name: 'Square', fileName: 'square_24_filled.svg', url: '', category: 'shapes' },
132
+ { name: 'Star', fileName: 'star_24_filled.svg', url: '', category: 'shapes' }
133
+ ]
134
+ };
135
+ /**
136
+ * Icon Manager Class
137
+ */
138
+ export class IconManager {
139
+ baseUrl;
140
+ cache = new Map();
141
+ constructor() {
142
+ this.baseUrl = FLUENT_ICONS_CONFIG.baseUrl;
143
+ }
144
+ /**
145
+ * Suggest icons based on entity name or type
146
+ */
147
+ suggestIcons(entityName) {
148
+ const lowerName = entityName.toLowerCase()
149
+ .replace(/^sic_/, '') // Remove publisher prefix
150
+ .replace(/^ref_/, ''); // Remove ref data infix
151
+ // Try exact match first
152
+ if (ICON_SUGGESTIONS[lowerName]) {
153
+ return this.populateUrls(ICON_SUGGESTIONS[lowerName]);
154
+ }
155
+ // Try partial match
156
+ for (const [key, suggestions] of Object.entries(ICON_SUGGESTIONS)) {
157
+ if (lowerName.includes(key) || key.includes(lowerName)) {
158
+ return this.populateUrls(suggestions);
159
+ }
160
+ }
161
+ // Return default suggestions
162
+ return this.populateUrls(ICON_SUGGESTIONS.default);
163
+ }
164
+ /**
165
+ * Populate full URLs for icon suggestions
166
+ */
167
+ populateUrls(suggestions) {
168
+ return suggestions.map(s => {
169
+ try {
170
+ const iconPath = this.constructFluentIconPath(s.fileName);
171
+ return {
172
+ ...s,
173
+ url: `${this.baseUrl}/${iconPath}`
174
+ };
175
+ }
176
+ catch (error) {
177
+ // If path construction fails, return suggestion with empty URL
178
+ return {
179
+ ...s,
180
+ url: ''
181
+ };
182
+ }
183
+ });
184
+ }
185
+ /**
186
+ * Parse icon filename and construct GitHub path
187
+ * Converts: people_community_24_filled.svg
188
+ * To: assets/People Community/SVG/ic_fluent_people_community_24_filled.svg
189
+ */
190
+ constructFluentIconPath(fileName) {
191
+ // Remove .svg extension
192
+ const base = fileName.replace('.svg', '');
193
+ // Split into parts
194
+ const parts = base.split('_');
195
+ // Extract size (e.g., '24') and style (e.g., 'filled' or 'regular')
196
+ const size = parts[parts.length - 2];
197
+ const style = parts[parts.length - 1];
198
+ // Validate size and style
199
+ if (!size || !style || isNaN(parseInt(size))) {
200
+ throw new Error(`Invalid icon filename format: ${fileName}. Expected format: {icon_name}_{size}_{style}.svg (e.g., people_community_24_filled.svg)`);
201
+ }
202
+ // Icon name is everything before size and style
203
+ const iconNameParts = parts.slice(0, -2);
204
+ if (iconNameParts.length === 0) {
205
+ throw new Error(`Invalid icon filename format: ${fileName}. Missing icon name.`);
206
+ }
207
+ // Folder name: capitalize each word, join with space
208
+ const folderName = iconNameParts
209
+ .map(word => word.charAt(0).toUpperCase() + word.slice(1))
210
+ .join(' ');
211
+ // Full filename with ic_fluent_ prefix
212
+ const fullFileName = `ic_fluent_${base}.svg`;
213
+ // Construct the full path
214
+ const path = `${folderName}/SVG/${fullFileName}`;
215
+ return path;
216
+ }
217
+ /**
218
+ * Fetch SVG icon from Fluent UI GitHub repository
219
+ */
220
+ async fetchIcon(fileName) {
221
+ // Check cache first
222
+ if (this.cache.has(fileName)) {
223
+ return this.cache.get(fileName);
224
+ }
225
+ try {
226
+ // Construct the correct GitHub path
227
+ const iconPath = this.constructFluentIconPath(fileName);
228
+ const url = `${this.baseUrl}/${iconPath}`;
229
+ // Use global fetch if available (Node 18+)
230
+ const response = await global.fetch(url);
231
+ if (!response.ok) {
232
+ throw new Error(`Failed to fetch icon from GitHub: ${response.status} ${response.statusText}. URL: ${url}`);
233
+ }
234
+ const svg = await response.text();
235
+ // Validate it's an SVG
236
+ if (!svg.includes('<svg')) {
237
+ throw new Error('Fetched content is not a valid SVG');
238
+ }
239
+ // Cache the result
240
+ this.cache.set(fileName, svg);
241
+ return svg;
242
+ }
243
+ catch (error) {
244
+ throw new Error(`Failed to fetch icon '${fileName}': ${error instanceof Error ? error.message : String(error)}\n\nExpected format: {icon_name}_{size}_{style}.svg (e.g., people_community_24_filled.svg)\nBrowse icons at: https://github.com/microsoft/fluentui-system-icons`);
245
+ }
246
+ }
247
+ /**
248
+ * Generate web resource name for icon
249
+ */
250
+ generateWebResourceName(entitySchemaName, iconName) {
251
+ const prefix = 'sic_';
252
+ const cleanEntityName = entitySchemaName.toLowerCase().replace(/^sic_/, '');
253
+ const cleanIconName = iconName.toLowerCase().replace(/\s+/g, '_');
254
+ return `${prefix}${cleanEntityName}_icon_${cleanIconName}`;
255
+ }
256
+ /**
257
+ * Generate icon vector name for EntityMetadata
258
+ * Uses $webresource: directive which is the correct syntax for Dynamics 365
259
+ * This creates a solution dependency and tells the system to look up the web resource by name
260
+ */
261
+ generateIconVectorName(webResourceName) {
262
+ return `$webresource:${webResourceName}`;
263
+ }
264
+ /**
265
+ * Validate icon SVG content
266
+ */
267
+ validateIconSvg(svg) {
268
+ if (!svg.includes('<svg')) {
269
+ return { valid: false, error: 'Content is not a valid SVG' };
270
+ }
271
+ if (svg.length > 100000) {
272
+ return { valid: false, error: 'SVG file is too large (max 100KB)' };
273
+ }
274
+ // Check for script tags (security)
275
+ if (svg.includes('<script')) {
276
+ return { valid: false, error: 'SVG contains script tags (security risk)' };
277
+ }
278
+ return { valid: true };
279
+ }
280
+ /**
281
+ * Get all available icon categories
282
+ */
283
+ getCategories() {
284
+ const categories = new Set();
285
+ for (const suggestions of Object.values(ICON_SUGGESTIONS)) {
286
+ suggestions.forEach(s => categories.add(s.category));
287
+ }
288
+ return Array.from(categories).sort();
289
+ }
290
+ /**
291
+ * Search icons by name
292
+ */
293
+ searchIcons(searchTerm) {
294
+ const results = [];
295
+ const lowerSearch = searchTerm.toLowerCase();
296
+ for (const suggestions of Object.values(ICON_SUGGESTIONS)) {
297
+ for (const suggestion of suggestions) {
298
+ if (suggestion.name.toLowerCase().includes(lowerSearch) ||
299
+ suggestion.fileName.toLowerCase().includes(lowerSearch)) {
300
+ results.push(this.populateUrls([suggestion])[0]);
301
+ }
302
+ }
303
+ }
304
+ return results;
305
+ }
306
+ /**
307
+ * Get icons by category
308
+ */
309
+ getIconsByCategory(category) {
310
+ const results = [];
311
+ for (const suggestions of Object.values(ICON_SUGGESTIONS)) {
312
+ for (const suggestion of suggestions) {
313
+ if (suggestion.category === category) {
314
+ results.push(this.populateUrls([suggestion])[0]);
315
+ }
316
+ }
317
+ }
318
+ return results;
319
+ }
320
+ /**
321
+ * Build custom icon URL for specific size/style
322
+ */
323
+ buildIconUrl(iconName, size = 24, style = 'filled') {
324
+ const fileName = `${iconName}_${size}_${style}.svg`;
325
+ try {
326
+ const iconPath = this.constructFluentIconPath(fileName);
327
+ return `${this.baseUrl}/${iconPath}`;
328
+ }
329
+ catch (error) {
330
+ throw new Error(`Failed to build icon URL for '${iconName}': ${error instanceof Error ? error.message : String(error)}`);
331
+ }
332
+ }
333
+ /**
334
+ * Clear icon cache
335
+ */
336
+ clearCache() {
337
+ this.cache.clear();
338
+ }
339
+ }
340
+ // Export singleton instance
341
+ export const iconManager = new IconManager();
342
+ //# sourceMappingURL=iconManager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"iconManager.js","sourceRoot":"","sources":["../../src/utils/iconManager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * PowerPlatform Prompt Templates
3
+ * Template functions for formatted prompt responses
4
+ */
5
+ export declare const ENTITY_OVERVIEW: (entityName: string) => string;
6
+ export declare const ATTRIBUTE_DETAILS: (entityName: string, attributeName: string) => string;
7
+ export declare const QUERY_TEMPLATE: (entityNamePlural: string) => string;
8
+ export declare const RELATIONSHIP_MAP: (entityName: string) => string;
9
+ //# sourceMappingURL=prompt-templates.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt-templates.d.ts","sourceRoot":"","sources":["../../src/utils/prompt-templates.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,eAAO,MAAM,eAAe,GAAI,YAAY,MAAM,WAMwB,CAAC;AAE3E,eAAO,MAAM,iBAAiB,GAAI,YAAY,MAAM,EAAE,eAAe,MAAM,WAO3C,CAAC;AAEjC,eAAO,MAAM,cAAc,GAAI,kBAAkB,MAAM,WAQY,CAAC;AAEpE,eAAO,MAAM,gBAAgB,GAAI,YAAY,MAAM,WAKK,CAAC"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * PowerPlatform Prompt Templates
3
+ * Template functions for formatted prompt responses
4
+ */
5
+ export const ENTITY_OVERVIEW = (entityName) => `## Power Platform Entity: ${entityName}\n\n` +
6
+ `This is an overview of the '${entityName}' entity in Microsoft Power Platform/Dataverse:\n\n` +
7
+ `### Entity Details\n{{entity_details}}\n\n` +
8
+ `### Attributes\n{{key_attributes}}\n\n` +
9
+ `### Relationships\n{{relationships}}\n\n` +
10
+ `You can query this entity using OData filters against the plural name.`;
11
+ export const ATTRIBUTE_DETAILS = (entityName, attributeName) => `## Attribute: ${attributeName}\n\n` +
12
+ `Details for the '${attributeName}' attribute of the '${entityName}' entity:\n\n` +
13
+ `{{attribute_details}}\n\n` +
14
+ `### Usage Notes\n` +
15
+ `- Data Type: {{data_type}}\n` +
16
+ `- Required: {{required}}\n` +
17
+ `- Max Length: {{max_length}}`;
18
+ export const QUERY_TEMPLATE = (entityNamePlural) => `## OData Query Template for ${entityNamePlural}\n\n` +
19
+ `Use this template to build queries against the ${entityNamePlural} entity:\n\n` +
20
+ `\`\`\`\n${entityNamePlural}?$select={{selected_fields}}&$filter={{filter_conditions}}&$orderby={{order_by}}&$top={{max_records}}\n\`\`\`\n\n` +
21
+ `### Common Filter Examples\n` +
22
+ `- Equals: \`name eq 'Contoso'\`\n` +
23
+ `- Contains: \`contains(name, 'Contoso')\`\n` +
24
+ `- Greater than date: \`createdon gt 2023-01-01T00:00:00Z\`\n` +
25
+ `- Multiple conditions: \`name eq 'Contoso' and statecode eq 0\``;
26
+ export const RELATIONSHIP_MAP = (entityName) => `## Relationship Map for ${entityName}\n\n` +
27
+ `This shows all relationships for the '${entityName}' entity:\n\n` +
28
+ `### One-to-Many Relationships (${entityName} as Primary)\n{{one_to_many_primary}}\n\n` +
29
+ `### One-to-Many Relationships (${entityName} as Related)\n{{one_to_many_related}}\n\n` +
30
+ `### Many-to-Many Relationships\n{{many_to_many}}\n\n`;
31
+ //# sourceMappingURL=prompt-templates.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt-templates.js","sourceRoot":"","sources":["../../src/utils/prompt-templates.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,UAAkB,EAAE,EAAE,CACpD,6BAA6B,UAAU,MAAM;IAC7C,+BAA+B,UAAU,qDAAqD;IAC9F,4CAA4C;IAC5C,wCAAwC;IACxC,0CAA0C;IAC1C,wEAAwE,CAAC;AAE3E,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,UAAkB,EAAE,aAAqB,EAAE,EAAE,CAC7E,iBAAiB,aAAa,MAAM;IACpC,oBAAoB,aAAa,uBAAuB,UAAU,eAAe;IACjF,2BAA2B;IAC3B,mBAAmB;IACnB,8BAA8B;IAC9B,4BAA4B;IAC5B,8BAA8B,CAAC;AAEjC,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,gBAAwB,EAAE,EAAE,CACzD,+BAA+B,gBAAgB,MAAM;IACrD,kDAAkD,gBAAgB,cAAc;IAChF,WAAW,gBAAgB,mHAAmH;IAC9I,8BAA8B;IAC9B,mCAAmC;IACnC,6CAA6C;IAC7C,8DAA8D;IAC9D,iEAAiE,CAAC;AAEpE,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,UAAkB,EAAE,EAAE,CACrD,2BAA2B,UAAU,MAAM;IAC3C,yCAAyC,UAAU,eAAe;IAClE,kCAAkC,UAAU,2CAA2C;IACvF,kCAAkC,UAAU,2CAA2C;IACvF,sDAAsD,CAAC"}
@@ -0,0 +1,108 @@
1
+ /**
2
+ * Rate Limiter Module
3
+ *
4
+ * Implements rate limiting with exponential backoff for PowerPlatform API calls.
5
+ * Prevents API throttling errors (429) and manages concurrent request limits.
6
+ */
7
+ export interface RateLimiterOptions {
8
+ maxRequestsPerMinute?: number;
9
+ maxConcurrentRequests?: number;
10
+ retryAttempts?: number;
11
+ initialBackoffMs?: number;
12
+ maxBackoffMs?: number;
13
+ backoffMultiplier?: number;
14
+ }
15
+ export interface RequestQueueItem<T> {
16
+ fn: () => Promise<T>;
17
+ resolve: (value: T) => void;
18
+ reject: (error: any) => void;
19
+ retryCount: number;
20
+ }
21
+ /**
22
+ * Rate Limiter Class
23
+ */
24
+ export declare class RateLimiter {
25
+ private options;
26
+ private requestTimestamps;
27
+ private activeRequests;
28
+ private queue;
29
+ private processing;
30
+ constructor(options?: RateLimiterOptions);
31
+ /**
32
+ * Execute a function with rate limiting
33
+ */
34
+ execute<T>(fn: () => Promise<T>): Promise<T>;
35
+ /**
36
+ * Process the request queue
37
+ */
38
+ private processQueue;
39
+ /**
40
+ * Execute a single request with retry logic
41
+ */
42
+ private executeRequest;
43
+ /**
44
+ * Check if we can make a request without exceeding rate limits
45
+ */
46
+ private canMakeRequest;
47
+ /**
48
+ * Record a request timestamp
49
+ */
50
+ private recordRequest;
51
+ /**
52
+ * Remove timestamps older than 1 minute
53
+ */
54
+ private cleanupOldTimestamps;
55
+ /**
56
+ * Calculate backoff time for retry
57
+ */
58
+ private calculateBackoff;
59
+ /**
60
+ * Check if error is a rate limit error
61
+ */
62
+ private isRateLimitError;
63
+ /**
64
+ * Sleep helper
65
+ */
66
+ private sleep;
67
+ /**
68
+ * Get current rate limiter stats
69
+ */
70
+ getStats(): {
71
+ activeRequests: number;
72
+ queuedRequests: number;
73
+ requestsLastMinute: number;
74
+ maxRequestsPerMinute: number;
75
+ maxConcurrentRequests: number;
76
+ utilizationPercentage: number;
77
+ };
78
+ /**
79
+ * Wait until rate limiter has capacity
80
+ */
81
+ waitForCapacity(): Promise<void>;
82
+ /**
83
+ * Clear the queue
84
+ */
85
+ clearQueue(): void;
86
+ /**
87
+ * Reset rate limiter
88
+ */
89
+ reset(): void;
90
+ /**
91
+ * Update rate limiter options
92
+ */
93
+ updateOptions(options: Partial<RateLimiterOptions>): void;
94
+ }
95
+ export declare const rateLimiter: RateLimiter;
96
+ /**
97
+ * Helper function to wrap API calls with rate limiting
98
+ */
99
+ export declare function withRateLimit<T>(fn: () => Promise<T>): Promise<T>;
100
+ /**
101
+ * Batch execution with rate limiting
102
+ * Processes an array of functions with rate limiting
103
+ */
104
+ export declare function batchExecute<T>(fns: (() => Promise<T>)[], options?: {
105
+ onProgress?: (completed: number, total: number) => void;
106
+ onError?: (error: any, index: number) => void;
107
+ }): Promise<T[]>;
108
+ //# sourceMappingURL=rate-limiter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rate-limiter.d.ts","sourceRoot":"","sources":["../../src/utils/rate-limiter.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,WAAW,kBAAkB;IACjC,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,gBAAgB,CAAC,CAAC;IACjC,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,CAAC;IACrB,OAAO,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,IAAI,CAAC;IAC5B,MAAM,EAAE,CAAC,KAAK,EAAE,GAAG,KAAK,IAAI,CAAC;IAC7B,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,qBAAa,WAAW;IACtB,OAAO,CAAC,OAAO,CAA+B;IAC9C,OAAO,CAAC,iBAAiB,CAAgB;IACzC,OAAO,CAAC,cAAc,CAAa;IACnC,OAAO,CAAC,KAAK,CAA+B;IAC5C,OAAO,CAAC,UAAU,CAAkB;gBAExB,OAAO,GAAE,kBAAuB;IAW5C;;OAEG;IACG,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IAalD;;OAEG;YACW,YAAY;IA4B1B;;OAEG;YACW,cAAc;IAsC5B;;OAEG;IACH,OAAO,CAAC,cAAc;IAKtB;;OAEG;IACH,OAAO,CAAC,aAAa;IAIrB;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAK5B;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAKxB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAexB;;OAEG;IACH,OAAO,CAAC,KAAK;IAIb;;OAEG;IACH,QAAQ,IAAI;QACV,cAAc,EAAE,MAAM,CAAC;QACvB,cAAc,EAAE,MAAM,CAAC;QACvB,kBAAkB,EAAE,MAAM,CAAC;QAC3B,oBAAoB,EAAE,MAAM,CAAC;QAC7B,qBAAqB,EAAE,MAAM,CAAC;QAC9B,qBAAqB,EAAE,MAAM,CAAC;KAC/B;IAaD;;OAEG;IACG,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC;IAMtC;;OAEG;IACH,UAAU,IAAI,IAAI;IAQlB;;OAEG;IACH,KAAK,IAAI,IAAI;IAOb;;OAEG;IACH,aAAa,CAAC,OAAO,EAAE,OAAO,CAAC,kBAAkB,CAAC,GAAG,IAAI;CAM1D;AAGD,eAAO,MAAM,WAAW,aAOtB,CAAC;AAEH;;GAEG;AACH,wBAAsB,aAAa,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAEvE;AAED;;;GAGG;AACH,wBAAsB,YAAY,CAAC,CAAC,EAClC,GAAG,EAAE,CAAC,MAAM,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,EACzB,OAAO,CAAC,EAAE;IACR,UAAU,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACxD,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CAC/C,GACA,OAAO,CAAC,CAAC,EAAE,CAAC,CA2Bd"}