@semiont/api-client 0.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 (78) hide show
  1. package/README.md +85 -0
  2. package/dist/__tests__/client.test.d.ts +28 -0
  3. package/dist/__tests__/client.test.d.ts.map +1 -0
  4. package/dist/__tests__/client.test.js +567 -0
  5. package/dist/__tests__/client.test.js.map +1 -0
  6. package/dist/__tests__/sse-client.test.d.ts +7 -0
  7. package/dist/__tests__/sse-client.test.d.ts.map +1 -0
  8. package/dist/__tests__/sse-client.test.js +421 -0
  9. package/dist/__tests__/sse-client.test.js.map +1 -0
  10. package/dist/__tests__/sse-stream.test.d.ts +7 -0
  11. package/dist/__tests__/sse-stream.test.d.ts.map +1 -0
  12. package/dist/__tests__/sse-stream.test.js +394 -0
  13. package/dist/__tests__/sse-stream.test.js.map +1 -0
  14. package/dist/__tests__/svg-selectors.test.d.ts +5 -0
  15. package/dist/__tests__/svg-selectors.test.d.ts.map +1 -0
  16. package/dist/__tests__/svg-selectors.test.js +124 -0
  17. package/dist/__tests__/svg-selectors.test.js.map +1 -0
  18. package/dist/branded-types.d.ts +70 -0
  19. package/dist/branded-types.d.ts.map +1 -0
  20. package/dist/branded-types.js +62 -0
  21. package/dist/branded-types.js.map +1 -0
  22. package/dist/client.d.ts +243 -0
  23. package/dist/client.d.ts.map +1 -0
  24. package/dist/client.js +460 -0
  25. package/dist/client.js.map +1 -0
  26. package/dist/index.d.ts +43 -0
  27. package/dist/index.d.ts.map +1 -0
  28. package/dist/index.js +62 -0
  29. package/dist/index.js.map +1 -0
  30. package/dist/mime-utils.d.ts +27 -0
  31. package/dist/mime-utils.d.ts.map +1 -0
  32. package/dist/mime-utils.js +49 -0
  33. package/dist/mime-utils.js.map +1 -0
  34. package/dist/sse/index.d.ts +343 -0
  35. package/dist/sse/index.d.ts.map +1 -0
  36. package/dist/sse/index.js +404 -0
  37. package/dist/sse/index.js.map +1 -0
  38. package/dist/sse/stream.d.ts +58 -0
  39. package/dist/sse/stream.d.ts.map +1 -0
  40. package/dist/sse/stream.js +187 -0
  41. package/dist/sse/stream.js.map +1 -0
  42. package/dist/sse/types.d.ts +295 -0
  43. package/dist/sse/types.d.ts.map +1 -0
  44. package/dist/sse/types.js +10 -0
  45. package/dist/sse/types.js.map +1 -0
  46. package/dist/types.d.ts +3177 -0
  47. package/dist/types.d.ts.map +1 -0
  48. package/dist/types.js +7 -0
  49. package/dist/types.js.map +1 -0
  50. package/dist/uri-types.d.ts +19 -0
  51. package/dist/uri-types.d.ts.map +1 -0
  52. package/dist/uri-types.js +35 -0
  53. package/dist/uri-types.js.map +1 -0
  54. package/dist/utils/annotations.d.ts +191 -0
  55. package/dist/utils/annotations.d.ts.map +1 -0
  56. package/dist/utils/annotations.js +404 -0
  57. package/dist/utils/annotations.js.map +1 -0
  58. package/dist/utils/events.d.ts +74 -0
  59. package/dist/utils/events.d.ts.map +1 -0
  60. package/dist/utils/events.js +329 -0
  61. package/dist/utils/events.js.map +1 -0
  62. package/dist/utils/index.d.ts +12 -0
  63. package/dist/utils/index.d.ts.map +1 -0
  64. package/dist/utils/index.js +28 -0
  65. package/dist/utils/index.js.map +1 -0
  66. package/dist/utils/locales.d.ts +31 -0
  67. package/dist/utils/locales.d.ts.map +1 -0
  68. package/dist/utils/locales.js +83 -0
  69. package/dist/utils/locales.js.map +1 -0
  70. package/dist/utils/resources.d.ts +34 -0
  71. package/dist/utils/resources.d.ts.map +1 -0
  72. package/dist/utils/resources.js +63 -0
  73. package/dist/utils/resources.js.map +1 -0
  74. package/dist/utils/validation.d.ts +57 -0
  75. package/dist/utils/validation.d.ts.map +1 -0
  76. package/dist/utils/validation.js +89 -0
  77. package/dist/utils/validation.js.map +1 -0
  78. package/package.json +65 -0
@@ -0,0 +1,404 @@
1
+ "use strict";
2
+ /**
3
+ * Annotation and Selector Utilities
4
+ *
5
+ * Pure TypeScript utilities for working with W3C Web Annotations.
6
+ * No React dependencies - safe to use in any JavaScript environment.
7
+ *
8
+ * Body is either empty array (stub) or single SpecificResource (resolved)
9
+ * Body can be array of TextualBody (tagging) + SpecificResource (linking)
10
+ * Target can be simple string IRI or object with source and optional selector
11
+ */
12
+ Object.defineProperty(exports, "__esModule", { value: true });
13
+ exports.getBodySource = getBodySource;
14
+ exports.getBodyType = getBodyType;
15
+ exports.isBodyResolved = isBodyResolved;
16
+ exports.getTargetSource = getTargetSource;
17
+ exports.getTargetSelector = getTargetSelector;
18
+ exports.hasTargetSelector = hasTargetSelector;
19
+ exports.getEntityTypes = getEntityTypes;
20
+ exports.isHighlight = isHighlight;
21
+ exports.isReference = isReference;
22
+ exports.isAssessment = isAssessment;
23
+ exports.isComment = isComment;
24
+ exports.isTag = isTag;
25
+ exports.getCommentText = getCommentText;
26
+ exports.getTagCategory = getTagCategory;
27
+ exports.getTagSchemaId = getTagSchemaId;
28
+ exports.isStubReference = isStubReference;
29
+ exports.isResolvedReference = isResolvedReference;
30
+ exports.getExactText = getExactText;
31
+ exports.getAnnotationExactText = getAnnotationExactText;
32
+ exports.getPrimarySelector = getPrimarySelector;
33
+ exports.getTextPositionSelector = getTextPositionSelector;
34
+ exports.getTextQuoteSelector = getTextQuoteSelector;
35
+ exports.getSvgSelector = getSvgSelector;
36
+ exports.validateSvgMarkup = validateSvgMarkup;
37
+ exports.extractBoundingBox = extractBoundingBox;
38
+ const branded_types_1 = require("../branded-types");
39
+ /**
40
+ * Get the source from an annotation body (null if stub)
41
+ * Search for SpecificResource in body array
42
+ */
43
+ function getBodySource(body) {
44
+ if (Array.isArray(body)) {
45
+ // Search for SpecificResource with source
46
+ for (const item of body) {
47
+ if (typeof item === 'object' &&
48
+ item !== null &&
49
+ 'type' in item &&
50
+ 'source' in item) {
51
+ const itemType = item.type;
52
+ const itemSource = item.source;
53
+ if (itemType === 'SpecificResource' && typeof itemSource === 'string') {
54
+ return (0, branded_types_1.resourceUri)(itemSource);
55
+ }
56
+ }
57
+ }
58
+ return null; // No SpecificResource found = stub
59
+ }
60
+ // Single body object (SpecificResource)
61
+ if (typeof body === 'object' &&
62
+ body !== null &&
63
+ 'type' in body &&
64
+ 'source' in body) {
65
+ const bodyType = body.type;
66
+ const bodySource = body.source;
67
+ if (bodyType === 'SpecificResource' && typeof bodySource === 'string') {
68
+ return (0, branded_types_1.resourceUri)(bodySource);
69
+ }
70
+ }
71
+ return null;
72
+ }
73
+ /**
74
+ * Get the type from an annotation body (returns first body type in array)
75
+ */
76
+ function getBodyType(body) {
77
+ if (Array.isArray(body)) {
78
+ if (body.length === 0) {
79
+ return null;
80
+ }
81
+ // Return type of first body item
82
+ if (typeof body[0] === 'object' && body[0] !== null && 'type' in body[0]) {
83
+ const firstType = body[0].type;
84
+ if (firstType === 'TextualBody' || firstType === 'SpecificResource') {
85
+ return firstType;
86
+ }
87
+ }
88
+ return null;
89
+ }
90
+ // Single body object
91
+ if (typeof body === 'object' && body !== null && 'type' in body) {
92
+ const bodyType = body.type;
93
+ if (bodyType === 'TextualBody' || bodyType === 'SpecificResource') {
94
+ return bodyType;
95
+ }
96
+ }
97
+ return null;
98
+ }
99
+ /**
100
+ * Check if body is resolved (has a source)
101
+ * Check for SpecificResource in body array
102
+ */
103
+ function isBodyResolved(body) {
104
+ return getBodySource(body) !== null;
105
+ }
106
+ /**
107
+ * Get the source IRI from target (handles both string and object forms)
108
+ */
109
+ function getTargetSource(target) {
110
+ if (typeof target === 'string') {
111
+ return (0, branded_types_1.resourceUri)(target);
112
+ }
113
+ return (0, branded_types_1.resourceUri)(target.source);
114
+ }
115
+ /**
116
+ * Get the selector from target (undefined if string or no selector)
117
+ */
118
+ function getTargetSelector(target) {
119
+ if (typeof target === 'string') {
120
+ return undefined;
121
+ }
122
+ return target.selector;
123
+ }
124
+ /**
125
+ * Check if target has a selector
126
+ */
127
+ function hasTargetSelector(target) {
128
+ return typeof target !== 'string' && target.selector !== undefined;
129
+ }
130
+ /**
131
+ * Extract entity types from annotation bodies
132
+ * Entity types are stored as TextualBody with purpose: "tagging"
133
+ * Accepts any object with a body property matching Annotation['body']
134
+ */
135
+ function getEntityTypes(annotation) {
136
+ // Extract from TextualBody bodies with purpose: "tagging"
137
+ if (Array.isArray(annotation.body)) {
138
+ const entityTags = [];
139
+ for (const item of annotation.body) {
140
+ // Runtime check for TextualBody with tagging purpose
141
+ // TypeScript incorrectly narrows the union type here, so we use runtime checks only
142
+ if (typeof item === 'object' &&
143
+ item !== null &&
144
+ 'type' in item &&
145
+ 'value' in item &&
146
+ 'purpose' in item) {
147
+ // Access properties as unknown first to avoid TypeScript narrowing issues
148
+ const itemType = item.type;
149
+ const itemValue = item.value;
150
+ const itemPurpose = item.purpose;
151
+ if (itemType === 'TextualBody' && itemPurpose === 'tagging' && typeof itemValue === 'string' && itemValue.length > 0) {
152
+ entityTags.push(itemValue);
153
+ }
154
+ }
155
+ }
156
+ return entityTags;
157
+ }
158
+ return [];
159
+ }
160
+ /**
161
+ * Type guard to check if an annotation is a highlight
162
+ */
163
+ function isHighlight(annotation) {
164
+ return annotation.motivation === 'highlighting';
165
+ }
166
+ /**
167
+ * Type guard to check if an annotation is a reference (linking)
168
+ */
169
+ function isReference(annotation) {
170
+ return annotation.motivation === 'linking';
171
+ }
172
+ /**
173
+ * Type guard to check if an annotation is an assessment
174
+ */
175
+ function isAssessment(annotation) {
176
+ return annotation.motivation === 'assessing';
177
+ }
178
+ /**
179
+ * Type guard to check if an annotation is a comment
180
+ */
181
+ function isComment(annotation) {
182
+ return annotation.motivation === 'commenting';
183
+ }
184
+ /**
185
+ * Type guard to check if an annotation is a tag
186
+ */
187
+ function isTag(annotation) {
188
+ return annotation.motivation === 'tagging';
189
+ }
190
+ /**
191
+ * Extract comment text from a comment annotation's body
192
+ * @param annotation - The annotation to extract comment text from
193
+ * @returns The comment text, or undefined if not a comment or no text found
194
+ */
195
+ function getCommentText(annotation) {
196
+ if (!isComment(annotation))
197
+ return undefined;
198
+ const body = Array.isArray(annotation.body) ? annotation.body[0] : annotation.body;
199
+ if (body && 'value' in body) {
200
+ return body.value;
201
+ }
202
+ return undefined;
203
+ }
204
+ /**
205
+ * Extract tag category from a tag annotation's body
206
+ * Tags use dual-body structure: first body has purpose: "tagging" with category value
207
+ * @param annotation - The annotation to extract category from
208
+ * @returns The tag category (e.g., "Issue", "Rule"), or undefined if not a tag or no category found
209
+ */
210
+ function getTagCategory(annotation) {
211
+ if (!isTag(annotation))
212
+ return undefined;
213
+ const bodies = Array.isArray(annotation.body) ? annotation.body : [annotation.body];
214
+ const taggingBody = bodies.find(b => b && 'purpose' in b && b.purpose === 'tagging');
215
+ if (taggingBody && 'value' in taggingBody) {
216
+ return taggingBody.value;
217
+ }
218
+ return undefined;
219
+ }
220
+ /**
221
+ * Extract tag schema ID from a tag annotation's body
222
+ * Tags use dual-body structure: second body has purpose: "classifying" with schema ID
223
+ * @param annotation - The annotation to extract schema ID from
224
+ * @returns The schema ID (e.g., "legal-irac"), or undefined if not a tag or no schema found
225
+ */
226
+ function getTagSchemaId(annotation) {
227
+ if (!isTag(annotation))
228
+ return undefined;
229
+ const bodies = Array.isArray(annotation.body) ? annotation.body : [annotation.body];
230
+ const classifyingBody = bodies.find(b => b && 'purpose' in b && b.purpose === 'classifying');
231
+ if (classifyingBody && 'value' in classifyingBody) {
232
+ return classifyingBody.value;
233
+ }
234
+ return undefined;
235
+ }
236
+ /**
237
+ * Type guard to check if a reference annotation is a stub (unresolved)
238
+ * Stub if no SpecificResource in body array
239
+ */
240
+ function isStubReference(annotation) {
241
+ return isReference(annotation) && !isBodyResolved(annotation.body);
242
+ }
243
+ /**
244
+ * Type guard to check if a reference annotation is resolved
245
+ * Resolved if SpecificResource exists in body array
246
+ */
247
+ function isResolvedReference(annotation) {
248
+ return isReference(annotation) && isBodyResolved(annotation.body);
249
+ }
250
+ // =============================================================================
251
+ // SELECTOR UTILITIES
252
+ // =============================================================================
253
+ /**
254
+ * Get the exact text from a selector (single or array)
255
+ *
256
+ * When selector is an array, tries to find a TextQuoteSelector (which has exact text).
257
+ * TextPositionSelector does not have exact text, only character offsets.
258
+ * Handles undefined selector (when target is a string IRI with no selector)
259
+ */
260
+ function getExactText(selector) {
261
+ if (!selector) {
262
+ return ''; // No selector means entire resource
263
+ }
264
+ const selectors = Array.isArray(selector) ? selector : [selector];
265
+ // Try to find TextQuoteSelector (has exact text)
266
+ const quoteSelector = selectors.find(s => s.type === 'TextQuoteSelector');
267
+ if (quoteSelector) {
268
+ return quoteSelector.exact;
269
+ }
270
+ // No TextQuoteSelector found
271
+ return '';
272
+ }
273
+ /**
274
+ * Get the exact text from an annotation's target selector
275
+ * Uses getTargetSelector helper to safely get selector
276
+ */
277
+ function getAnnotationExactText(annotation) {
278
+ const selector = getTargetSelector(annotation.target);
279
+ return getExactText(selector);
280
+ }
281
+ /**
282
+ * Get the primary selector from a selector (single or array)
283
+ *
284
+ * When selector is an array, returns the first selector.
285
+ * When selector is a single object, returns it as-is.
286
+ */
287
+ function getPrimarySelector(selector) {
288
+ if (Array.isArray(selector)) {
289
+ if (selector.length === 0) {
290
+ throw new Error('Empty selector array');
291
+ }
292
+ const first = selector[0];
293
+ if (!first) {
294
+ throw new Error('Invalid selector array');
295
+ }
296
+ return first;
297
+ }
298
+ return selector;
299
+ }
300
+ /**
301
+ * Get TextPositionSelector from a selector (single or array)
302
+ *
303
+ * Returns the first TextPositionSelector found, or null if none exists.
304
+ * Handles undefined selector (when target is a string IRI with no selector)
305
+ */
306
+ function getTextPositionSelector(selector) {
307
+ if (!selector)
308
+ return null; // No selector means entire resource
309
+ const selectors = Array.isArray(selector) ? selector : [selector];
310
+ const found = selectors.find(s => s.type === 'TextPositionSelector');
311
+ if (!found)
312
+ return null;
313
+ return found.type === 'TextPositionSelector' ? found : null;
314
+ }
315
+ /**
316
+ * Get TextQuoteSelector from a selector (single or array)
317
+ *
318
+ * Returns the first TextQuoteSelector found, or null if none exists.
319
+ */
320
+ function getTextQuoteSelector(selector) {
321
+ const selectors = Array.isArray(selector) ? selector : [selector];
322
+ const found = selectors.find(s => s.type === 'TextQuoteSelector');
323
+ if (!found)
324
+ return null;
325
+ return found.type === 'TextQuoteSelector' ? found : null;
326
+ }
327
+ /**
328
+ * Get SvgSelector from a selector (single or array)
329
+ *
330
+ * Returns the first SvgSelector found, or null if none exists.
331
+ */
332
+ function getSvgSelector(selector) {
333
+ if (!selector)
334
+ return null;
335
+ const selectors = Array.isArray(selector) ? selector : [selector];
336
+ const found = selectors.find(s => s.type === 'SvgSelector');
337
+ if (!found)
338
+ return null;
339
+ return found.type === 'SvgSelector' ? found : null;
340
+ }
341
+ /**
342
+ * Validate SVG markup for W3C compliance
343
+ *
344
+ * Checks that:
345
+ * - SVG contains xmlns attribute
346
+ * - SVG is well-formed XML
347
+ * - SVG contains at least one shape element
348
+ *
349
+ * @returns null if valid, error message if invalid
350
+ */
351
+ function validateSvgMarkup(svg) {
352
+ // Check for xmlns attribute (required by W3C spec)
353
+ if (!svg.includes('xmlns="http://www.w3.org/2000/svg"')) {
354
+ return 'SVG must include xmlns="http://www.w3.org/2000/svg" attribute';
355
+ }
356
+ // Check for basic SVG tag structure
357
+ if (!svg.includes('<svg') || !svg.includes('</svg>')) {
358
+ return 'SVG must have opening and closing tags';
359
+ }
360
+ // Check for at least one shape element
361
+ const shapeElements = ['rect', 'circle', 'ellipse', 'polygon', 'polyline', 'path', 'line'];
362
+ const hasShape = shapeElements.some(shape => svg.includes(`<${shape}`) || svg.includes(`<${shape} `));
363
+ if (!hasShape) {
364
+ return 'SVG must contain at least one shape element (rect, circle, ellipse, polygon, polyline, path, or line)';
365
+ }
366
+ return null; // Valid
367
+ }
368
+ /**
369
+ * Extract bounding box from SVG markup
370
+ *
371
+ * Attempts to extract x, y, width, height from the SVG viewBox or root element.
372
+ * Returns null if bounding box cannot be determined.
373
+ */
374
+ function extractBoundingBox(svg) {
375
+ // Try to extract viewBox attribute from SVG element
376
+ const viewBoxMatch = svg.match(/<svg[^>]*viewBox="([^"]+)"/);
377
+ if (viewBoxMatch) {
378
+ const values = viewBoxMatch[1].split(/\s+/).map(parseFloat);
379
+ if (values.length === 4 && values.every(v => !isNaN(v))) {
380
+ return {
381
+ x: values[0],
382
+ y: values[1],
383
+ width: values[2],
384
+ height: values[3]
385
+ };
386
+ }
387
+ }
388
+ // Try to extract width/height attributes from SVG element (assume x=0, y=0)
389
+ const svgTagMatch = svg.match(/<svg[^>]*>/);
390
+ if (svgTagMatch) {
391
+ const svgTag = svgTagMatch[0];
392
+ const widthMatch = svgTag.match(/width="([^"]+)"/);
393
+ const heightMatch = svgTag.match(/height="([^"]+)"/);
394
+ if (widthMatch && heightMatch) {
395
+ const width = parseFloat(widthMatch[1]);
396
+ const height = parseFloat(heightMatch[1]);
397
+ if (!isNaN(width) && !isNaN(height)) {
398
+ return { x: 0, y: 0, width, height };
399
+ }
400
+ }
401
+ }
402
+ return null;
403
+ }
404
+ //# sourceMappingURL=annotations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"annotations.js","sourceRoot":"","sources":["../../src/utils/annotations.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,74 @@
1
+ /**
2
+ * Event Utilities
3
+ *
4
+ * Pure TypeScript utilities for working with resource events.
5
+ * No React dependencies - safe to use in any JavaScript environment.
6
+ */
7
+ import type { paths, components } from '../types';
8
+ import { AnnotationUri } from '../branded-types';
9
+ type EventsResponse = paths['/resources/{id}/events']['get']['responses'][200]['content']['application/json'];
10
+ export type StoredEvent = EventsResponse['events'][number];
11
+ export type ResourceEvent = StoredEvent['event'];
12
+ export type EventMetadata = StoredEvent['metadata'];
13
+ type Annotation = components['schemas']['Annotation'];
14
+ export type ResourceEventType = 'resource.created' | 'resource.cloned' | 'resource.archived' | 'resource.unarchived' | 'annotation.added' | 'annotation.removed' | 'annotation.body.updated' | 'entitytag.added' | 'entitytag.removed' | 'entitytype.added' | 'job.started' | 'job.progress' | 'job.completed' | 'job.failed';
15
+ type TranslateFn = (key: string, params?: Record<string, string | number>) => string;
16
+ /**
17
+ * Extract annotation ID from event payload
18
+ * Returns null if event is not annotation-related
19
+ *
20
+ * For annotation.added: extracts full URI from payload.annotation.id
21
+ * For annotation.removed/body.updated: constructs full URI from payload.annotationId (UUID) + resourceId
22
+ */
23
+ export declare function getAnnotationUriFromEvent(event: StoredEvent): AnnotationUri | null;
24
+ /**
25
+ * Check if an event is related to a specific annotation
26
+ */
27
+ export declare function isEventRelatedToAnnotation(event: StoredEvent, annotationUri: AnnotationUri): boolean;
28
+ /**
29
+ * Type guard to check if event is a resource event
30
+ */
31
+ export declare function isResourceEvent(event: any): event is StoredEvent;
32
+ /**
33
+ * Format event type for display with i18n support
34
+ */
35
+ export declare function formatEventType(type: ResourceEventType, t: TranslateFn, payload?: any): string;
36
+ /**
37
+ * Get emoji for event type
38
+ * For unified annotation events, pass the payload to determine motivation
39
+ */
40
+ export declare function getEventEmoji(type: ResourceEventType, payload?: any): string;
41
+ /**
42
+ * Format timestamp as relative time with i18n support
43
+ */
44
+ export declare function formatRelativeTime(timestamp: string, t: TranslateFn): string;
45
+ /**
46
+ * Get display content from event payload - complete implementation
47
+ */
48
+ export declare function getEventDisplayContent(event: StoredEvent, annotations: Annotation[], // Unified annotations array (all types)
49
+ allEvents: StoredEvent[]): {
50
+ exact: string;
51
+ isQuoted: boolean;
52
+ isTag: boolean;
53
+ } | null;
54
+ /**
55
+ * Get entity types from event payload
56
+ */
57
+ export declare function getEventEntityTypes(event: StoredEvent): string[];
58
+ /**
59
+ * Resource creation details
60
+ */
61
+ export interface ResourceCreationDetails {
62
+ type: 'created' | 'cloned';
63
+ method: string;
64
+ userId?: string;
65
+ sourceDocId?: string;
66
+ parentResourceId?: string;
67
+ metadata?: Record<string, any>;
68
+ }
69
+ /**
70
+ * Get resource creation details from event
71
+ */
72
+ export declare function getResourceCreationDetails(event: StoredEvent): ResourceCreationDetails | null;
73
+ export {};
74
+ //# sourceMappingURL=events.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../../src/utils/events.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAIjD,KAAK,cAAc,GAAG,KAAK,CAAC,wBAAwB,CAAC,CAAC,KAAK,CAAC,CAAC,WAAW,CAAC,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC,kBAAkB,CAAC,CAAC;AAC9G,MAAM,MAAM,WAAW,GAAG,cAAc,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAC;AAC3D,MAAM,MAAM,aAAa,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC;AACjD,MAAM,MAAM,aAAa,GAAG,WAAW,CAAC,UAAU,CAAC,CAAC;AACpD,KAAK,UAAU,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC,YAAY,CAAC,CAAC;AAGtD,MAAM,MAAM,iBAAiB,GACzB,kBAAkB,GAClB,iBAAiB,GACjB,mBAAmB,GACnB,qBAAqB,GACrB,kBAAkB,GAClB,oBAAoB,GACpB,yBAAyB,GACzB,iBAAiB,GACjB,mBAAmB,GACnB,kBAAkB,GAClB,aAAa,GACb,cAAc,GACd,eAAe,GACf,YAAY,CAAC;AAEjB,KAAK,WAAW,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,KAAK,MAAM,CAAC;AAMrF;;;;;;GAMG;AACH,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,WAAW,GAAG,aAAa,GAAG,IAAI,CAgClF;AAED;;GAEG;AACH,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,aAAa,GAAG,OAAO,CAGpG;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,GAAG,GAAG,KAAK,IAAI,WAAW,CAShE;AAMD;;GAEG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,iBAAiB,EAAE,CAAC,EAAE,WAAW,EAAE,OAAO,CAAC,EAAE,GAAG,GAAG,MAAM,CA0C9F;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,iBAAiB,EAAE,OAAO,CAAC,EAAE,GAAG,GAAG,MAAM,CAwC5E;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,EAAE,CAAC,EAAE,WAAW,GAAG,MAAM,CAc5E;AAUD;;GAEG;AACH,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,WAAW,EAClB,WAAW,EAAE,UAAU,EAAE,EAAE,wCAAwC;AACnE,SAAS,EAAE,WAAW,EAAE,GACvB;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,OAAO,CAAA;CAAE,GAAG,IAAI,CAiG7D;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,WAAW,GAAG,MAAM,EAAE,CAYhE;AAED;;GAEG;AACH,MAAM,WAAW,uBAAuB;IACtC,IAAI,EAAE,SAAS,GAAG,QAAQ,CAAC;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CAChC;AAED;;GAEG;AACH,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,WAAW,GAAG,uBAAuB,GAAG,IAAI,CAyB7F"}