@thewhateverapp/tile-sdk 0.8.8 → 0.9.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.
@@ -103,6 +103,70 @@ export declare class TileBridge {
103
103
  * Get current authenticated user (if available)
104
104
  */
105
105
  getCurrentUser(): Promise<any>;
106
+ /**
107
+ * Generate a placeholder image for preview mode
108
+ * Creates a simple colored rectangle with text as base64 PNG
109
+ */
110
+ private generateMockImage;
111
+ /**
112
+ * Generate a mock file for preview mode
113
+ */
114
+ private generateMockFile;
115
+ /**
116
+ * Capture a photo from camera or device library
117
+ * In preview mode, returns a mock placeholder image
118
+ * @param options - Capture options (quality, maxSize, source, etc.)
119
+ * @returns Promise resolving to MediaFile with base64 data
120
+ */
121
+ capturePhoto(options?: {
122
+ quality?: number;
123
+ maxSize?: number;
124
+ maxWidth?: number;
125
+ maxHeight?: number;
126
+ source?: 'camera' | 'library' | 'any';
127
+ }): Promise<{
128
+ base64: string;
129
+ mimeType: string;
130
+ filename: string;
131
+ size: number;
132
+ width?: number;
133
+ height?: number;
134
+ }>;
135
+ /**
136
+ * Select a file from device
137
+ * In preview mode, returns a mock placeholder file
138
+ * @param options - File selection options (accept, maxSize, etc.)
139
+ * @returns Promise resolving to MediaFile with base64 data
140
+ */
141
+ selectFile(options?: {
142
+ accept?: string;
143
+ maxSize?: number;
144
+ }): Promise<{
145
+ base64: string;
146
+ mimeType: string;
147
+ filename: string;
148
+ size: number;
149
+ width?: number;
150
+ height?: number;
151
+ }>;
152
+ /**
153
+ * Select multiple files from device
154
+ * In preview mode, returns mock placeholder files
155
+ * @param options - File selection options (accept, maxSize, maxFiles, etc.)
156
+ * @returns Promise resolving to array of MediaFile with base64 data
157
+ */
158
+ selectFiles(options?: {
159
+ accept?: string;
160
+ maxSize?: number;
161
+ maxFiles?: number;
162
+ }): Promise<Array<{
163
+ base64: string;
164
+ mimeType: string;
165
+ filename: string;
166
+ size: number;
167
+ width?: number;
168
+ height?: number;
169
+ }>>;
106
170
  /**
107
171
  * Subscribe to events from parent
108
172
  */
@@ -1 +1 @@
1
- {"version":3,"file":"TileBridge.d.ts","sourceRoot":"","sources":["../../src/bridge/TileBridge.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"TileBridge.d.ts","sourceRoot":"","sources":["../../src/bridge/TileBridge.ts"],"names":[],"mappings":"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"}
@@ -496,6 +496,193 @@ export class TileBridge {
496
496
  }, 5000);
497
497
  });
498
498
  }
499
+ // ============= MEDIA CAPTURE API =============
500
+ /**
501
+ * Generate a placeholder image for preview mode
502
+ * Creates a simple colored rectangle with text as base64 PNG
503
+ */
504
+ generateMockImage(width = 400, height = 300) {
505
+ // Create a simple SVG placeholder that can be used as a data URL
506
+ // This works in browser environments without canvas
507
+ const colors = ['#4A90A4', '#7B68EE', '#20B2AA', '#FF6B6B', '#4ECDC4', '#45B7D1'];
508
+ const color = colors[Math.floor(Math.random() * colors.length)];
509
+ const svg = `<svg xmlns="http://www.w3.org/2000/svg" width="${width}" height="${height}" viewBox="0 0 ${width} ${height}">
510
+ <rect width="${width}" height="${height}" fill="${color}"/>
511
+ <rect x="10" y="10" width="${width - 20}" height="${height - 20}" fill="none" stroke="white" stroke-width="2" stroke-dasharray="10,5" rx="10"/>
512
+ <text x="${width / 2}" y="${height / 2 - 20}" font-family="Arial, sans-serif" font-size="24" fill="white" text-anchor="middle">📷</text>
513
+ <text x="${width / 2}" y="${height / 2 + 15}" font-family="Arial, sans-serif" font-size="16" fill="white" text-anchor="middle">Preview Mode</text>
514
+ <text x="${width / 2}" y="${height / 2 + 40}" font-family="Arial, sans-serif" font-size="12" fill="rgba(255,255,255,0.7)" text-anchor="middle">Camera capture simulated</text>
515
+ </svg>`;
516
+ // Convert SVG to base64
517
+ const base64 = typeof btoa !== 'undefined'
518
+ ? btoa(unescape(encodeURIComponent(svg)))
519
+ : Buffer.from(svg).toString('base64');
520
+ return {
521
+ base64: `data:image/svg+xml;base64,${base64}`,
522
+ mimeType: 'image/svg+xml',
523
+ filename: `preview-photo-${Date.now()}.svg`,
524
+ size: svg.length,
525
+ width,
526
+ height,
527
+ };
528
+ }
529
+ /**
530
+ * Generate a mock file for preview mode
531
+ */
532
+ generateMockFile(accept) {
533
+ // If accepting images, return a mock image
534
+ if (!accept || accept.includes('image') || accept === '*/*') {
535
+ return this.generateMockImage();
536
+ }
537
+ // For other file types, return a simple text/json placeholder
538
+ const mockContent = JSON.stringify({
539
+ preview: true,
540
+ message: 'This is mock file content for preview mode',
541
+ timestamp: new Date().toISOString(),
542
+ }, null, 2);
543
+ const base64 = typeof btoa !== 'undefined'
544
+ ? btoa(mockContent)
545
+ : Buffer.from(mockContent).toString('base64');
546
+ return {
547
+ base64,
548
+ mimeType: 'application/json',
549
+ filename: `preview-file-${Date.now()}.json`,
550
+ size: mockContent.length,
551
+ };
552
+ }
553
+ /**
554
+ * Capture a photo from camera or device library
555
+ * In preview mode, returns a mock placeholder image
556
+ * @param options - Capture options (quality, maxSize, source, etc.)
557
+ * @returns Promise resolving to MediaFile with base64 data
558
+ */
559
+ async capturePhoto(options) {
560
+ // In preview mode, return mock image immediately
561
+ if (this.isPreview()) {
562
+ console.log('[TileBridge] 📸 Preview mode - returning mock photo');
563
+ const mockImage = this.generateMockImage(options?.maxWidth ?? 400, options?.maxHeight ?? 300);
564
+ return Promise.resolve(mockImage);
565
+ }
566
+ return new Promise((resolve, reject) => {
567
+ const id = this.generateId();
568
+ this.responseHandlers.set(id, (response) => {
569
+ if (response.success && response.file) {
570
+ resolve(response.file);
571
+ }
572
+ else {
573
+ reject(new Error(response.error || 'Photo capture failed'));
574
+ }
575
+ });
576
+ this.sendToParent({
577
+ type: 'tile:media-capture',
578
+ payload: {
579
+ mediaType: 'photo',
580
+ options: {
581
+ quality: options?.quality ?? 0.8,
582
+ maxSize: options?.maxSize ?? 5 * 1024 * 1024, // 5MB default
583
+ maxWidth: options?.maxWidth ?? 1920,
584
+ maxHeight: options?.maxHeight ?? 1080,
585
+ source: options?.source ?? 'any',
586
+ },
587
+ },
588
+ id,
589
+ });
590
+ // Timeout after 60 seconds (user might be slow)
591
+ setTimeout(() => {
592
+ if (this.responseHandlers.has(id)) {
593
+ this.responseHandlers.delete(id);
594
+ reject(new Error('Photo capture timeout'));
595
+ }
596
+ }, 60000);
597
+ });
598
+ }
599
+ /**
600
+ * Select a file from device
601
+ * In preview mode, returns a mock placeholder file
602
+ * @param options - File selection options (accept, maxSize, etc.)
603
+ * @returns Promise resolving to MediaFile with base64 data
604
+ */
605
+ async selectFile(options) {
606
+ // In preview mode, return mock file immediately
607
+ if (this.isPreview()) {
608
+ console.log('[TileBridge] 📁 Preview mode - returning mock file');
609
+ return Promise.resolve(this.generateMockFile(options?.accept));
610
+ }
611
+ return new Promise((resolve, reject) => {
612
+ const id = this.generateId();
613
+ this.responseHandlers.set(id, (response) => {
614
+ if (response.success && response.file) {
615
+ resolve(response.file);
616
+ }
617
+ else {
618
+ reject(new Error(response.error || 'File selection failed'));
619
+ }
620
+ });
621
+ this.sendToParent({
622
+ type: 'tile:media-select',
623
+ payload: {
624
+ options: {
625
+ accept: options?.accept ?? '*/*',
626
+ maxSize: options?.maxSize ?? 10 * 1024 * 1024, // 10MB default
627
+ multiple: false,
628
+ },
629
+ },
630
+ id,
631
+ });
632
+ // Timeout after 60 seconds
633
+ setTimeout(() => {
634
+ if (this.responseHandlers.has(id)) {
635
+ this.responseHandlers.delete(id);
636
+ reject(new Error('File selection timeout'));
637
+ }
638
+ }, 60000);
639
+ });
640
+ }
641
+ /**
642
+ * Select multiple files from device
643
+ * In preview mode, returns mock placeholder files
644
+ * @param options - File selection options (accept, maxSize, maxFiles, etc.)
645
+ * @returns Promise resolving to array of MediaFile with base64 data
646
+ */
647
+ async selectFiles(options) {
648
+ // In preview mode, return mock files immediately
649
+ if (this.isPreview()) {
650
+ console.log('[TileBridge] 📁📁 Preview mode - returning mock files');
651
+ const count = Math.min(options?.maxFiles ?? 3, 5);
652
+ const files = Array.from({ length: count }, () => this.generateMockFile(options?.accept));
653
+ return Promise.resolve(files);
654
+ }
655
+ return new Promise((resolve, reject) => {
656
+ const id = this.generateId();
657
+ this.responseHandlers.set(id, (response) => {
658
+ if (response.success && response.files) {
659
+ resolve(response.files);
660
+ }
661
+ else {
662
+ reject(new Error(response.error || 'File selection failed'));
663
+ }
664
+ });
665
+ this.sendToParent({
666
+ type: 'tile:media-select',
667
+ payload: {
668
+ options: {
669
+ accept: options?.accept ?? '*/*',
670
+ maxSize: options?.maxSize ?? 10 * 1024 * 1024, // 10MB default
671
+ multiple: true,
672
+ maxFiles: options?.maxFiles ?? 5,
673
+ },
674
+ },
675
+ id,
676
+ });
677
+ // Timeout after 120 seconds (selecting multiple files takes time)
678
+ setTimeout(() => {
679
+ if (this.responseHandlers.has(id)) {
680
+ this.responseHandlers.delete(id);
681
+ reject(new Error('File selection timeout'));
682
+ }
683
+ }, 120000);
684
+ });
685
+ }
499
686
  /**
500
687
  * Subscribe to events from parent
501
688
  */
@@ -1,6 +1,7 @@
1
1
  import React from 'react';
2
2
  import { TileBridge } from '../bridge/TileBridge';
3
3
  import { StateClient } from '../state/StateClient';
4
+ import type { MediaFile, CapturePhotoOptions, SelectFileOptions } from '../types';
4
5
  export interface TileContextValue {
5
6
  tileId: string | null;
6
7
  bridge: TileBridge;
@@ -26,6 +27,11 @@ export interface TileContextValue {
26
27
  requestScopes: (scopes: string[]) => Promise<boolean>;
27
28
  getCurrentUser: () => Promise<any>;
28
29
  };
30
+ media: {
31
+ capturePhoto: (options?: CapturePhotoOptions) => Promise<MediaFile>;
32
+ selectFile: (options?: SelectFileOptions) => Promise<MediaFile>;
33
+ selectFiles: (options?: SelectFileOptions) => Promise<MediaFile[]>;
34
+ };
29
35
  }
30
36
  export declare const TileContext: React.Context<TileContextValue | null>;
31
37
  interface TileProviderProps {
@@ -1 +1 @@
1
- {"version":3,"file":"TileProvider.d.ts","sourceRoot":"","sources":["../../src/react/TileProvider.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA0D,MAAM,OAAO,CAAC;AAC/E,OAAO,EAAiB,UAAU,EAAE,MAAM,sBAAsB,CAAC;AACjE,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAEnD,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,MAAM,EAAE,UAAU,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;IACjB,WAAW,EAAE,WAAW,GAAG,IAAI,CAAC;IAChC,cAAc,EAAE,MAAM,IAAI,CAAC;IAC3B,cAAc,EAAE,MAAM,IAAI,CAAC;IAC3B,OAAO,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,QAAQ,GAAG,OAAO,KAAK,IAAI,CAAC;IAC5D,UAAU,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,GAAG,KAAK,IAAI,CAAC;IACpD,qBAAqB,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;IAClD,OAAO,EAAE;QACP,GAAG,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,GAAG,CAAC,CAAC;QACnC,GAAG,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;KACjD,CAAC;IACF,SAAS,EAAE;QACT,KAAK,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;KACxC,CAAC;IACF,IAAI,EAAE;QACJ,OAAO,EAAE,CAAC,OAAO,CAAC,EAAE;YAAE,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;YAAC,MAAM,CAAC,EAAE,MAAM,CAAA;SAAE,KAAK,OAAO,CAAC,GAAG,CAAC,CAAC;QAC5E,aAAa,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;QACtD,cAAc,EAAE,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC;KACpC,CAAC;CACH;AAED,eAAO,MAAM,WAAW,wCAA+C,CAAC;AAExE,UAAU,iBAAiB;IACzB,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,MAAM,CAAC,EAAE,GAAG,CAAC;CACd;AAED,wBAAgB,YAAY,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,iBAAiB,qBA0DnE"}
1
+ {"version":3,"file":"TileProvider.d.ts","sourceRoot":"","sources":["../../src/react/TileProvider.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA0D,MAAM,OAAO,CAAC;AAC/E,OAAO,EAAiB,UAAU,EAAE,MAAM,sBAAsB,CAAC;AACjE,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACnD,OAAO,KAAK,EACV,SAAS,EACT,mBAAmB,EACnB,iBAAiB,EAClB,MAAM,UAAU,CAAC;AAElB,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,MAAM,EAAE,UAAU,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;IACjB,WAAW,EAAE,WAAW,GAAG,IAAI,CAAC;IAChC,cAAc,EAAE,MAAM,IAAI,CAAC;IAC3B,cAAc,EAAE,MAAM,IAAI,CAAC;IAC3B,OAAO,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,QAAQ,GAAG,OAAO,KAAK,IAAI,CAAC;IAC5D,UAAU,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,GAAG,KAAK,IAAI,CAAC;IACpD,qBAAqB,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;IAClD,OAAO,EAAE;QACP,GAAG,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,GAAG,CAAC,CAAC;QACnC,GAAG,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;KACjD,CAAC;IACF,SAAS,EAAE;QACT,KAAK,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;KACxC,CAAC;IACF,IAAI,EAAE;QACJ,OAAO,EAAE,CAAC,OAAO,CAAC,EAAE;YAAE,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;YAAC,MAAM,CAAC,EAAE,MAAM,CAAA;SAAE,KAAK,OAAO,CAAC,GAAG,CAAC,CAAC;QAC5E,aAAa,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;QACtD,cAAc,EAAE,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC;KACpC,CAAC;IACF,KAAK,EAAE;QACL,YAAY,EAAE,CAAC,OAAO,CAAC,EAAE,mBAAmB,KAAK,OAAO,CAAC,SAAS,CAAC,CAAC;QACpE,UAAU,EAAE,CAAC,OAAO,CAAC,EAAE,iBAAiB,KAAK,OAAO,CAAC,SAAS,CAAC,CAAC;QAChE,WAAW,EAAE,CAAC,OAAO,CAAC,EAAE,iBAAiB,KAAK,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC;KACpE,CAAC;CACH;AAED,eAAO,MAAM,WAAW,wCAA+C,CAAC;AAExE,UAAU,iBAAiB;IACzB,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,MAAM,CAAC,EAAE,GAAG,CAAC;CACd;AAED,wBAAgB,YAAY,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,iBAAiB,qBA+DnE"}
@@ -45,6 +45,11 @@ export function TileProvider({ children, router }) {
45
45
  requestScopes: (scopes) => bridge.requestScopes(scopes),
46
46
  getCurrentUser: () => bridge.getCurrentUser(),
47
47
  },
48
+ media: {
49
+ capturePhoto: (options) => bridge.capturePhoto(options),
50
+ selectFile: (options) => bridge.selectFile(options),
51
+ selectFiles: (options) => bridge.selectFiles(options),
52
+ },
48
53
  };
49
54
  // Always render children immediately - don't wait for config
50
55
  // This eliminates the delay before animations start
package/dist/types.d.ts CHANGED
@@ -59,4 +59,71 @@ export interface TileConfig {
59
59
  permissions?: string[];
60
60
  capabilities?: string[];
61
61
  }
62
+ /**
63
+ * Result from media capture operations
64
+ */
65
+ export interface MediaFile {
66
+ /** Base64-encoded file content */
67
+ base64: string;
68
+ /** MIME type (e.g., 'image/jpeg', 'image/png') */
69
+ mimeType: string;
70
+ /** Original filename */
71
+ filename: string;
72
+ /** File size in bytes */
73
+ size: number;
74
+ /** Width in pixels (for images) */
75
+ width?: number;
76
+ /** Height in pixels (for images) */
77
+ height?: number;
78
+ }
79
+ /**
80
+ * Options for capturing a photo
81
+ */
82
+ export interface CapturePhotoOptions {
83
+ /** Compression quality 0-1 (default: 0.8) */
84
+ quality?: number;
85
+ /** Max file size in bytes (default: 5MB) */
86
+ maxSize?: number;
87
+ /** Max width in pixels (default: 1920) */
88
+ maxWidth?: number;
89
+ /** Max height in pixels (default: 1080) */
90
+ maxHeight?: number;
91
+ /** Source: 'camera', 'library', or 'any' (default: 'any') */
92
+ source?: 'camera' | 'library' | 'any';
93
+ }
94
+ /**
95
+ * Options for selecting a file
96
+ */
97
+ export interface SelectFileOptions {
98
+ /** MIME types to accept (default: all types) */
99
+ accept?: string;
100
+ /** Max file size in bytes (default: 10MB) */
101
+ maxSize?: number;
102
+ /** Allow multiple files (default: false) */
103
+ multiple?: boolean;
104
+ /** Max number of files if multiple (default: 5) */
105
+ maxFiles?: number;
106
+ }
107
+ /**
108
+ * Media capture error codes
109
+ */
110
+ export type MediaErrorCode = 'permission_denied' | 'size_exceeded' | 'type_not_allowed' | 'cancelled' | 'unsupported' | 'processing_failed' | 'timeout';
111
+ /**
112
+ * Media capture error
113
+ */
114
+ export interface MediaError {
115
+ code: MediaErrorCode;
116
+ message: string;
117
+ }
118
+ /**
119
+ * Media API for tiles
120
+ */
121
+ export interface MediaAPI {
122
+ /** Capture a photo from camera or library */
123
+ capturePhoto(options?: CapturePhotoOptions): Promise<MediaFile>;
124
+ /** Select a file from device */
125
+ selectFile(options?: SelectFileOptions): Promise<MediaFile>;
126
+ /** Select multiple files from device */
127
+ selectFiles(options?: SelectFileOptions): Promise<MediaFile[]>;
128
+ }
62
129
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE;QACV,IAAI,EAAE;YACJ,UAAU,EAAE,MAAM,CAAC;YACnB,MAAM,EAAE,MAAM,EAAE,CAAC;SAClB,CAAC;QACF,IAAI,CAAC,EAAE;YACL,UAAU,EAAE,MAAM,CAAC;YACnB,MAAM,EAAE,MAAM,EAAE,CAAC;SAClB,CAAC;QACF,MAAM,CAAC,EAAE;YACP,UAAU,EAAE,MAAM,CAAC;YACnB,MAAM,EAAE,MAAM,EAAE,CAAC;SAClB,CAAC;KACH,CAAC;CACH;AAED,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,WAAW,CAAC;IACtB,QAAQ,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC;IACvC,YAAY,EAAE,OAAO,CAAC;IACtB,cAAc,EAAE,MAAM,IAAI,CAAC;IAC3B,cAAc,EAAE,MAAM,IAAI,CAAC;IAC3B,WAAW,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,KAAK,IAAI,CAAC;IAC/C,SAAS,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,KAAK,IAAI,KAAK,IAAI,CAAC;IAChE,OAAO,EAAE;QACP,GAAG,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,GAAG,CAAC,CAAC;QACnC,GAAG,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;QAChD,MAAM,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;KACxC,CAAC;IACF,GAAG,EAAE;QACH,IAAI,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,WAAW,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAC;KACtE,CAAC;CACH;AAED,MAAM,WAAW,SAAS;IACxB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;CAC3B;AAED,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;CACzB"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@thewhateverapp/tile-sdk",
3
- "version": "0.8.8",
3
+ "version": "0.9.0",
4
4
  "description": "SDK for building interactive tiles on The Whatever App platform",
5
5
  "main": "./dist/index.js",
6
6
  "types": "./dist/index.d.ts",
@@ -23,6 +23,12 @@
23
23
  "README.md",
24
24
  "LICENSE"
25
25
  ],
26
+ "scripts": {
27
+ "build": "tsc",
28
+ "lint": "eslint src/",
29
+ "typecheck": "tsc --noEmit",
30
+ "prepublishOnly": "npm run build"
31
+ },
26
32
  "repository": {
27
33
  "type": "git",
28
34
  "url": "https://github.com/oJshua/whatever.git",
@@ -41,14 +47,10 @@
41
47
  "react": "^18.0.0"
42
48
  },
43
49
  "devDependencies": {
50
+ "@types/node": "^20.0.0",
44
51
  "@types/react": "^18.2.48",
45
52
  "eslint": "^9.39.1",
46
53
  "next": "^14.2.0",
47
54
  "typescript": "^5.3.3"
48
- },
49
- "scripts": {
50
- "build": "tsc",
51
- "lint": "eslint src/",
52
- "typecheck": "tsc --noEmit"
53
55
  }
54
- }
56
+ }