@0xobelisk/react 1.2.0-pre.70 → 1.2.0-pre.72

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.
package/README.md CHANGED
@@ -32,10 +32,10 @@ npm install @0xobelisk/graphql-client @0xobelisk/ecs
32
32
 
33
33
  ## 🌐 Multi-Chain Support
34
34
 
35
- | Blockchain | Status | Import Path |
36
- |-----------|--------|-------------|
37
- | **Sui** | ✅ Ready | `@0xobelisk/react/sui` |
38
- | **Aptos** | 🚧 Coming Soon | `@0xobelisk/react/aptos` |
35
+ | Blockchain | Status | Import Path |
36
+ | ---------- | -------------- | ------------------------- |
37
+ | **Sui** | ✅ Ready | `@0xobelisk/react/sui` |
38
+ | **Aptos** | 🚧 Coming Soon | `@0xobelisk/react/aptos` |
39
39
  | **Initia** | 🚧 Coming Soon | `@0xobelisk/react/initia` |
40
40
 
41
41
  ## 🚀 Quick Start
@@ -55,7 +55,7 @@ function App() {
55
55
  packageId: process.env.NEXT_PUBLIC_PACKAGE_ID!,
56
56
  metadata,
57
57
  credentials: {
58
- secretKey: process.env.NEXT_PUBLIC_PRIVATE_KEY // ⚠️ LOCAL DEVELOPMENT ONLY // ⚠️ LOCAL DEVELOPMENT ONLY
58
+ secretKey: process.env.NEXT_PUBLIC_PRIVATE_KEY // ⚠️ LOCAL DEVELOPMENT ONLY // ⚠️ LOCAL DEVELOPMENT ONLY
59
59
  }
60
60
  };
61
61
 
@@ -108,7 +108,7 @@ function App() {
108
108
  // Optional features
109
109
  dubheMetadata: dubheConfigMetadata, // Enables GraphQL + ECS
110
110
  credentials: {
111
- secretKey: process.env.NEXT_PUBLIC_PRIVATE_KEY // ⚠️ LOCAL DEVELOPMENT ONLY // ⚠️ LOCAL DEVELOPMENT ONLY
111
+ secretKey: process.env.NEXT_PUBLIC_PRIVATE_KEY // ⚠️ LOCAL DEVELOPMENT ONLY // ⚠️ LOCAL DEVELOPMENT ONLY
112
112
  },
113
113
  endpoints: {
114
114
  graphql: process.env.NEXT_PUBLIC_GRAPHQL_URL,
@@ -147,14 +147,14 @@ Access all Dubhe features in one hook:
147
147
  import { useDubhe } from '@0xobelisk/react/sui';
148
148
 
149
149
  function MyComponent() {
150
- const {
151
- contract, // Dubhe contract instance
152
- graphqlClient, // GraphQL client (if dubheMetadata provided)
153
- ecsWorld, // ECS World (if GraphQL available)
154
- address, // User address
155
- network, // Current network
156
- packageId, // Contract package ID
157
- metadata // Contract metadata
150
+ const {
151
+ contract, // Dubhe contract instance
152
+ graphqlClient, // GraphQL client (if dubheMetadata provided)
153
+ ecsWorld, // ECS World (if GraphQL available)
154
+ address, // User address
155
+ network, // Current network
156
+ packageId, // Contract package ID
157
+ metadata // Contract metadata
158
158
  } = useDubhe();
159
159
 
160
160
  return (
@@ -173,17 +173,13 @@ For components that only need specific functionality:
173
173
 
174
174
  ```typescript
175
175
  import React, { useEffect } from 'react';
176
- import {
177
- useDubheContract,
178
- useDubheGraphQL,
179
- useDubheECS
180
- } from '@0xobelisk/react/sui';
176
+ import { useDubheContract, useDubheGraphQL, useDubheECS } from '@0xobelisk/react/sui';
181
177
  import { Transaction } from '@0xobelisk/sui-client';
182
178
 
183
179
  // Contract-only component
184
180
  function TransactionComponent() {
185
181
  const contract = useDubheContract();
186
-
182
+
187
183
  const executeTransaction = async () => {
188
184
  const tx = new Transaction();
189
185
  await contract.tx.my_system.my_method({ tx });
@@ -195,11 +191,10 @@ function TransactionComponent() {
195
191
  // GraphQL-only component
196
192
  function DataComponent() {
197
193
  const graphqlClient = useDubheGraphQL();
198
-
194
+
199
195
  useEffect(() => {
200
196
  if (graphqlClient) {
201
- graphqlClient.query({ query: '{ entities { id } }' })
202
- .then(result => console.log(result));
197
+ graphqlClient.query({ query: '{ entities { id } }' }).then((result) => console.log(result));
203
198
  }
204
199
  }, [graphqlClient]);
205
200
 
@@ -209,11 +204,10 @@ function DataComponent() {
209
204
  // ECS-only component
210
205
  function ECSComponent() {
211
206
  const ecsWorld = useDubheECS();
212
-
207
+
213
208
  useEffect(() => {
214
209
  if (ecsWorld) {
215
- ecsWorld.getComponent('MyComponent')
216
- .then(components => console.log(components));
210
+ ecsWorld.getComponent('MyComponent').then((components) => console.log(components));
217
211
  }
218
212
  }, [ecsWorld]);
219
213
 
@@ -229,37 +223,37 @@ function ECSComponent() {
229
223
  interface DubheConfig {
230
224
  /** Network type */
231
225
  network: 'mainnet' | 'testnet' | 'devnet' | 'localnet';
232
-
226
+
233
227
  /** Contract package ID */
234
228
  packageId: string;
235
-
229
+
236
230
  /** Contract metadata (required for contract instantiation) */
237
231
  metadata: SuiMoveNormalizedModules;
238
-
232
+
239
233
  /** Dubhe Schema ID (optional, for enhanced features) */
240
234
  dubheSchemaId?: string;
241
-
235
+
242
236
  /** Dubhe metadata (enables GraphQL/ECS features) */
243
237
  dubheMetadata?: any;
244
-
238
+
245
239
  /** Authentication credentials */
246
240
  credentials?: {
247
- secretKey?: string; // ⚠️ LOCAL DEVELOPMENT ONLY - see security warning below
248
- mnemonics?: string; // ⚠️ LOCAL DEVELOPMENT ONLY - see security warning below
241
+ secretKey?: string; // ⚠️ LOCAL DEVELOPMENT ONLY - see security warning below
242
+ mnemonics?: string; // ⚠️ LOCAL DEVELOPMENT ONLY - see security warning below
249
243
  };
250
-
244
+
251
245
  /** Service endpoints configuration */
252
246
  endpoints?: {
253
- graphql?: string; // Default: 'http://localhost:4000/graphql'
254
- websocket?: string; // Default: 'ws://localhost:4000/graphql'
247
+ graphql?: string; // Default: 'http://localhost:4000/graphql'
248
+ websocket?: string; // Default: 'ws://localhost:4000/graphql'
255
249
  };
256
-
250
+
257
251
  /** Performance and behavior options */
258
252
  options?: {
259
- enableBatchOptimization?: boolean; // Default: true
260
- cacheTimeout?: number; // Default: 5000ms
261
- debounceMs?: number; // Default: 100ms
262
- reconnectOnError?: boolean; // Default: true
253
+ enableBatchOptimization?: boolean; // Default: true
254
+ cacheTimeout?: number; // Default: 5000ms
255
+ debounceMs?: number; // Default: 100ms
256
+ reconnectOnError?: boolean; // Default: true
263
257
  };
264
258
  }
265
259
  ```
@@ -304,21 +298,23 @@ function App() {
304
298
  > **`secretKey` and `mnemonics` are for LOCAL DEVELOPMENT ONLY!**
305
299
  >
306
300
  > - ❌ **NEVER use secretKey/mnemonics in production**
307
- > - ❌ **NEVER commit private keys to version control**
301
+ > - ❌ **NEVER commit private keys to version control**
308
302
  > - ❌ **NEVER expose private keys in client-side code**
309
303
  >
310
304
  > **For production applications:**
305
+ >
311
306
  > - ✅ Use official wallet providers for transaction signing
312
307
  > - ✅ Implement proper wallet integration (Sui Wallet, etc.)
313
308
  > - ✅ Let users connect their own wallets securely
314
309
  >
315
310
  > **Proper wallet integration example:**
311
+ >
316
312
  > ```typescript
317
313
  > // For production - use wallet providers instead of secretKey
318
314
  > const config = {
319
315
  > network: 'mainnet',
320
316
  > packageId: process.env.NEXT_PUBLIC_PACKAGE_ID!,
321
- > metadata,
317
+ > metadata
322
318
  > // ✅ NO credentials - let wallet handle signing
323
319
  > };
324
320
  > ```
@@ -382,8 +378,9 @@ function DataComponent() {
382
378
  // Real-time subscription
383
379
  useEffect(() => {
384
380
  if (graphqlClient) {
385
- const subscription = graphqlClient.subscribe({
386
- query: `
381
+ const subscription = graphqlClient
382
+ .subscribe({
383
+ query: `
387
384
  subscription {
388
385
  entities {
389
386
  id
@@ -394,9 +391,10 @@ function DataComponent() {
394
391
  }
395
392
  }
396
393
  `
397
- }).subscribe(result => {
398
- setEntities(result.data.entities);
399
- });
394
+ })
395
+ .subscribe((result) => {
396
+ setEntities(result.data.entities);
397
+ });
400
398
 
401
399
  return () => subscription.unsubscribe();
402
400
  }
@@ -414,7 +412,7 @@ function DataComponent() {
414
412
  <div>
415
413
  <h2>Real-time Entities: {entities.length}</h2>
416
414
  <button onClick={queryComponents}>Query Components</button>
417
-
415
+
418
416
  {graphqlClient ? (
419
417
  <p>✅ GraphQL Connected</p>
420
418
  ) : (
@@ -447,22 +445,18 @@ function ErrorHandlingExample() {
447
445
  } catch (error) {
448
446
  attempt++;
449
447
  console.error(`Attempt ${attempt} failed:`, error);
450
-
448
+
451
449
  if (attempt === maxRetries) {
452
450
  throw error;
453
451
  }
454
-
452
+
455
453
  // Wait before retry
456
- await new Promise(resolve => setTimeout(resolve, 1000));
454
+ await new Promise((resolve) => setTimeout(resolve, 1000));
457
455
  }
458
456
  }
459
457
  };
460
458
 
461
- return (
462
- <button onClick={handleTransactionWithRetry}>
463
- Execute with Retry
464
- </button>
465
- );
459
+ return <button onClick={handleTransactionWithRetry}>Execute with Retry</button>;
466
460
  }
467
461
  ```
468
462
 
@@ -471,7 +465,7 @@ function ErrorHandlingExample() {
471
465
  ### Type Exports
472
466
 
473
467
  ```typescript
474
- import type {
468
+ import type {
475
469
  NetworkType,
476
470
  DubheConfig,
477
471
  DubheReturn,
@@ -487,7 +481,7 @@ const config: DubheConfig = {
487
481
  packageId: '0x123...',
488
482
  metadata: contractMetadata, // Typed metadata
489
483
  credentials: {
490
- secretKey: process.env.NEXT_PUBLIC_PRIVATE_KEY // ⚠️ LOCAL DEVELOPMENT ONLY
484
+ secretKey: process.env.NEXT_PUBLIC_PRIVATE_KEY // ⚠️ LOCAL DEVELOPMENT ONLY
491
485
  }
492
486
  };
493
487
 
@@ -520,16 +514,16 @@ npm run format
520
514
 
521
515
  ```typescript
522
516
  interface DubheReturn {
523
- contract: Dubhe; // Enhanced contract instance
517
+ contract: Dubhe; // Enhanced contract instance
524
518
  graphqlClient: DubheGraphqlClient | null; // GraphQL client (if enabled)
525
- ecsWorld: DubheECSWorld | null; // ECS World (if enabled)
526
- metadata: SuiMoveNormalizedModules; // Contract metadata
527
- network: NetworkType; // Current network
528
- packageId: string; // Package ID
529
- dubheSchemaId?: string; // Schema ID (if provided)
530
- address: string; // User address
531
- options?: DubheOptions; // Configuration options
532
- metrics?: DubheMetrics; // Performance metrics
519
+ ecsWorld: DubheECSWorld | null; // ECS World (if enabled)
520
+ metadata: SuiMoveNormalizedModules; // Contract metadata
521
+ network: NetworkType; // Current network
522
+ packageId: string; // Package ID
523
+ dubheSchemaId?: string; // Schema ID (if provided)
524
+ address: string; // User address
525
+ options?: DubheOptions; // Configuration options
526
+ metrics?: DubheMetrics; // Performance metrics
533
527
  }
534
528
  ```
535
529
 
@@ -269,7 +269,7 @@ function useDubheFromProvider() {
269
269
  };
270
270
  }
271
271
  if (!enhancedContract.queryWithOptions) {
272
- enhancedContract.queryWithOptions = (system, method, options = {}) => {
272
+ enhancedContract.queryWithOptions = (system, method, _options = {}) => {
273
273
  return async (params) => {
274
274
  const startTime = performance.now();
275
275
  const result = await contract.query[system][method](params);
@@ -335,4 +335,4 @@ export {
335
335
  useDubheECS,
336
336
  useContract
337
337
  };
338
- //# sourceMappingURL=chunk-XI35QBSQ.mjs.map
338
+ //# sourceMappingURL=chunk-7KXBMX2H.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/sui/config.ts","../src/sui/utils.ts","../src/sui/provider.tsx","../src/sui/hooks.ts"],"sourcesContent":["/**\n * Configuration Management for Dubhe React Integration\n *\n * Features:\n * - Type-safe configuration interface\n * - Configuration validation and error handling\n * - Smart merging of defaults and explicit config\n * - No environment variable handling (developers should handle environment variables themselves)\n */\n\nimport { useMemo } from 'react';\nimport type { DubheConfig } from './types';\nimport { mergeConfigurations, validateConfig } from './utils';\n\n/**\n * Default configuration object with sensible defaults\n */\nexport const DEFAULT_CONFIG: Partial<DubheConfig> = {\n endpoints: {\n graphql: 'http://localhost:4000/graphql',\n websocket: 'ws://localhost:4000/graphql'\n },\n options: {\n enableBatchOptimization: true,\n cacheTimeout: 5000,\n debounceMs: 100,\n reconnectOnError: true\n }\n};\n\n/**\n * Configuration Hook: useDubheConfig\n *\n * Merges defaults with explicit configuration provided by the developer\n *\n * Note: Environment variables should be handled by the developer before passing to this hook\n *\n * @param config - Complete or partial configuration object\n * @returns Complete, validated DubheConfig\n *\n * @example\n * ```typescript\n * // Basic usage with explicit config\n * const config = useDubheConfig({\n * network: 'testnet',\n * packageId: '0x123...',\n * metadata: contractMetadata,\n * credentials: {\n * secretKey: process.env.NEXT_PUBLIC_PRIVATE_KEY // Handle env vars yourself\n * }\n * });\n *\n * // With helper function to handle environment variables\n * const getConfigFromEnv = () => ({\n * network: process.env.NEXT_PUBLIC_NETWORK as NetworkType,\n * packageId: process.env.NEXT_PUBLIC_PACKAGE_ID,\n * credentials: {\n * secretKey: process.env.NEXT_PUBLIC_PRIVATE_KEY\n * }\n * });\n *\n * const config = useDubheConfig({\n * ...getConfigFromEnv(),\n * metadata: contractMetadata\n * });\n * ```\n */\nexport function useDubheConfig(config: Partial<DubheConfig>): DubheConfig {\n // Memoize the stringified config to detect actual changes\n const configKey = useMemo(() => {\n return JSON.stringify(config);\n }, [config]);\n\n return useMemo(() => {\n // Merge configurations: defaults -> user provided config\n const mergedConfig = mergeConfigurations(DEFAULT_CONFIG, config);\n\n // Validate the final configuration\n const validatedConfig = validateConfig(mergedConfig);\n\n // if (process.env.NODE_ENV === 'development') {\n // console.log('🔧 Dubhe Config:', {\n // ...validatedConfig,\n // credentials: validatedConfig.credentials?.secretKey ? '[REDACTED]' : undefined\n // });\n // }\n\n return validatedConfig;\n }, [configKey]);\n}\n","/**\n * Utility Functions for Dubhe Configuration Management\n *\n * Features:\n * - Configuration validation and error handling\n * - Smart configuration merging with proper type safety\n * - Type-safe configuration validation\n */\n\nimport type { DubheConfig } from './types';\n\n/**\n * Merge multiple configuration objects with proper deep merging\n * Later configurations override earlier ones\n *\n * @param baseConfig - Base configuration (usually defaults)\n * @param overrideConfig - Override configuration (user provided)\n * @returns Merged configuration\n */\nexport function mergeConfigurations(\n baseConfig: Partial<DubheConfig>,\n overrideConfig?: Partial<DubheConfig>\n): Partial<DubheConfig> {\n if (!overrideConfig) {\n return { ...baseConfig };\n }\n\n const result: Partial<DubheConfig> = { ...baseConfig };\n\n // Merge top-level properties\n Object.assign(result, overrideConfig);\n\n // Deep merge nested objects\n if (overrideConfig.credentials || baseConfig.credentials) {\n result.credentials = {\n ...baseConfig.credentials,\n ...overrideConfig.credentials\n };\n }\n\n if (overrideConfig.endpoints || baseConfig.endpoints) {\n result.endpoints = {\n ...baseConfig.endpoints,\n ...overrideConfig.endpoints\n };\n }\n\n if (overrideConfig.options || baseConfig.options) {\n result.options = {\n ...baseConfig.options,\n ...overrideConfig.options\n };\n }\n\n return result;\n}\n\n/**\n * Validate configuration and ensure required fields are present\n * Throws descriptive errors for missing required fields\n *\n * @param config - Configuration to validate\n * @returns Validated and typed configuration\n * @throws Error if required fields are missing or invalid\n */\nexport function validateConfig(config: Partial<DubheConfig>): DubheConfig {\n const errors: string[] = [];\n\n // Check required fields\n if (!config.network) {\n errors.push('network is required');\n }\n\n if (!config.packageId) {\n errors.push('packageId is required');\n }\n\n if (!config.metadata) {\n errors.push('metadata is required');\n } else {\n // Basic metadata validation\n if (typeof config.metadata !== 'object') {\n errors.push('metadata must be an object');\n } else if (Object.keys(config.metadata).length === 0) {\n errors.push('metadata cannot be empty');\n }\n }\n\n // Validate network type\n if (config.network && !['mainnet', 'testnet', 'devnet', 'localnet'].includes(config.network)) {\n errors.push(\n `invalid network: ${config.network}. Must be one of: mainnet, testnet, devnet, localnet`\n );\n }\n\n // Validate package ID format (enhanced check)\n if (config.packageId) {\n if (!config.packageId.startsWith('0x')) {\n errors.push('packageId must start with 0x');\n } else if (config.packageId.length < 3) {\n errors.push('packageId must be longer than 0x');\n } else if (!/^0x[a-fA-F0-9]+$/.test(config.packageId)) {\n errors.push('packageId must contain only hexadecimal characters after 0x');\n }\n }\n\n // Validate dubheMetadata if provided\n if (config.dubheMetadata !== undefined) {\n if (typeof config.dubheMetadata !== 'object' || config.dubheMetadata === null) {\n errors.push('dubheMetadata must be an object');\n } else if (!config.dubheMetadata.components && !config.dubheMetadata.resources) {\n errors.push('dubheMetadata must contain components or resources');\n }\n }\n\n // Validate credentials if provided\n if (config.credentials) {\n if (config.credentials.secretKey && typeof config.credentials.secretKey !== 'string') {\n errors.push('credentials.secretKey must be a string');\n }\n if (config.credentials.mnemonics && typeof config.credentials.mnemonics !== 'string') {\n errors.push('credentials.mnemonics must be a string');\n }\n }\n\n // Validate URLs if provided\n if (config.endpoints?.graphql && !isValidUrl(config.endpoints.graphql)) {\n errors.push('endpoints.graphql must be a valid URL');\n }\n\n if (config.endpoints?.websocket && !isValidUrl(config.endpoints.websocket)) {\n errors.push('endpoints.websocket must be a valid URL');\n }\n\n // Validate numeric options\n if (\n config.options?.cacheTimeout !== undefined &&\n (typeof config.options.cacheTimeout !== 'number' || config.options.cacheTimeout < 0)\n ) {\n errors.push('options.cacheTimeout must be a non-negative number');\n }\n\n if (\n config.options?.debounceMs !== undefined &&\n (typeof config.options.debounceMs !== 'number' || config.options.debounceMs < 0)\n ) {\n errors.push('options.debounceMs must be a non-negative number');\n }\n\n if (errors.length > 0) {\n const errorMessage = `Invalid Dubhe configuration (${errors.length} error${\n errors.length > 1 ? 's' : ''\n }):\\n${errors.map((e) => `- ${e}`).join('\\n')}`;\n console.error('Configuration validation failed:', { errors, config });\n throw new Error(errorMessage);\n }\n\n return config as DubheConfig;\n}\n\n/**\n * Simple URL validation helper\n *\n * @param url - URL string to validate\n * @returns true if URL is valid, false otherwise\n */\nfunction isValidUrl(url: string): boolean {\n try {\n new URL(url);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Generate a configuration summary for debugging\n * Hides sensitive information like private keys\n *\n * @param config - Configuration to summarize\n * @returns Safe configuration summary\n */\nexport function getConfigSummary(config: DubheConfig): object {\n return {\n network: config.network,\n packageId: config.packageId,\n dubheSchemaId: config.dubheSchemaId,\n hasMetadata: !!config.metadata,\n hasDubheMetadata: !!config.dubheMetadata,\n hasCredentials: !!config.credentials?.secretKey,\n endpoints: config.endpoints,\n options: config.options\n };\n}\n","/**\n * Dubhe Provider - useRef Pattern for Client Management\n *\n * Features:\n * - 🎯 Single client instances across application lifecycle\n * - ⚡ useRef-based storage (no re-initialization on re-renders)\n * - 🔧 Provider pattern for dependency injection\n * - 🛡️ Complete type safety with strict TypeScript\n * - 📦 Context-based client sharing\n */\n\nimport { createContext, useContext, useRef, ReactNode } from 'react';\nimport { Dubhe } from '@0xobelisk/sui-client';\nimport { createDubheGraphqlClient } from '@0xobelisk/graphql-client';\nimport { createECSWorld } from '@0xobelisk/ecs';\nimport { useDubheConfig } from './config';\nimport type { DubheConfig, DubheReturn } from './types';\n\n/**\n * Context interface for Dubhe client instances\n * All clients are stored using useRef to ensure single initialization\n */\ninterface DubheContextValue {\n getContract: () => Dubhe;\n getGraphqlClient: () => any | null;\n getEcsWorld: () => any | null;\n getAddress: () => string;\n getMetrics: () => {\n initTime: number;\n requestCount: number;\n lastActivity: number;\n };\n config: DubheConfig;\n}\n\n/**\n * Context for sharing Dubhe clients across the application\n * Uses useRef pattern to ensure clients are created only once\n */\nconst DubheContext = createContext<DubheContextValue | null>(null);\n\n/**\n * Props interface for DubheProvider component\n */\ninterface DubheProviderProps {\n /** Configuration for Dubhe initialization */\n config: Partial<DubheConfig>;\n /** Child components that will have access to Dubhe clients */\n children: ReactNode;\n}\n\n/**\n * DubheProvider Component - useRef Pattern Implementation\n *\n * This Provider uses useRef to store client instances, ensuring they are:\n * 1. Created only once during component lifecycle\n * 2. Persisted across re-renders without re-initialization\n * 3. Shared efficiently via React Context\n *\n * Key advantages over useMemo:\n * - useRef guarantees single initialization (useMemo can re-run on dependency changes)\n * - No dependency array needed (eliminates potential re-initialization bugs)\n * - Better performance for heavy client objects\n * - Clearer separation of concerns via Provider pattern\n *\n * @param props - Provider props containing config and children\n * @returns Provider component wrapping children with Dubhe context\n *\n * @example\n * ```typescript\n * // App root setup\n * function App() {\n * const dubheConfig = {\n * network: 'devnet',\n * packageId: '0x123...',\n * metadata: contractMetadata,\n * credentials: {\n * secretKey: process.env.NEXT_PUBLIC_PRIVATE_KEY\n * }\n * };\n *\n * return (\n * <DubheProvider config={dubheConfig}>\n * <MyApplication />\n * </DubheProvider>\n * );\n * }\n * ```\n */\nexport function DubheProvider({ config, children }: DubheProviderProps) {\n // Merge configuration with defaults (only runs once)\n const finalConfig = useDubheConfig(config);\n\n // Track initialization start time (useRef ensures single timestamp)\n const startTimeRef = useRef<number>(performance.now());\n\n // useRef for contract instance - guarantees single initialization\n // Unlike useMemo, useRef.current is never re-calculated\n const contractRef = useRef<Dubhe | undefined>(undefined);\n const getContract = (): Dubhe => {\n if (!contractRef.current) {\n try {\n console.log('Initializing Dubhe contract instance (one-time)');\n contractRef.current = new Dubhe({\n networkType: finalConfig.network,\n packageId: finalConfig.packageId,\n metadata: finalConfig.metadata,\n secretKey: finalConfig.credentials?.secretKey\n });\n } catch (error) {\n console.error('Contract initialization failed:', error);\n throw error;\n }\n }\n return contractRef.current;\n };\n\n // useRef for GraphQL client instance - single initialization guaranteed\n const graphqlClientRef = useRef<any | null>(null);\n const hasInitializedGraphql = useRef(false);\n const getGraphqlClient = (): any | null => {\n if (!hasInitializedGraphql.current && finalConfig.dubheMetadata) {\n try {\n console.log('Initializing GraphQL client instance (one-time)');\n graphqlClientRef.current = createDubheGraphqlClient({\n endpoint: finalConfig.endpoints?.graphql || 'http://localhost:4000/graphql',\n subscriptionEndpoint: finalConfig.endpoints?.websocket || 'ws://localhost:4000/graphql',\n dubheMetadata: finalConfig.dubheMetadata\n });\n hasInitializedGraphql.current = true;\n } catch (error) {\n console.error('GraphQL client initialization failed:', error);\n throw error;\n }\n }\n return graphqlClientRef.current;\n };\n\n // useRef for ECS World instance - depends on GraphQL client\n const ecsWorldRef = useRef<any | null>(null);\n const hasInitializedEcs = useRef(false);\n const getEcsWorld = (): any | null => {\n const graphqlClient = getGraphqlClient();\n if (!hasInitializedEcs.current && graphqlClient) {\n try {\n console.log('Initializing ECS World instance (one-time)');\n ecsWorldRef.current = createECSWorld(graphqlClient, {\n queryConfig: {\n enableBatchOptimization: finalConfig.options?.enableBatchOptimization ?? true,\n defaultCacheTimeout: finalConfig.options?.cacheTimeout ?? 5000\n },\n subscriptionConfig: {\n defaultDebounceMs: finalConfig.options?.debounceMs ?? 100,\n reconnectOnError: finalConfig.options?.reconnectOnError ?? true\n }\n });\n hasInitializedEcs.current = true;\n } catch (error) {\n console.error('ECS World initialization failed:', error);\n throw error;\n }\n }\n return ecsWorldRef.current;\n };\n\n // Address getter - calculated from contract\n const getAddress = (): string => {\n return getContract().getAddress();\n };\n\n // Metrics getter - performance tracking\n const getMetrics = () => ({\n initTime: performance.now() - (startTimeRef.current || 0),\n requestCount: 0, // Can be enhanced with actual tracking\n lastActivity: Date.now()\n });\n\n // Context value - stable reference (no re-renders for consumers)\n const contextValue: DubheContextValue = {\n getContract,\n getGraphqlClient,\n getEcsWorld,\n getAddress,\n getMetrics,\n config: finalConfig\n };\n\n return <DubheContext.Provider value={contextValue}>{children}</DubheContext.Provider>;\n}\n\n/**\n * Custom hook to access Dubhe context\n * Provides type-safe access to all Dubhe client instances\n *\n * @returns DubheContextValue with all client getters and config\n * @throws Error if used outside of DubheProvider\n *\n * @example\n * ```typescript\n * function MyComponent() {\n * const dubheContext = useDubheContext();\n *\n * const contract = dubheContext.getContract();\n * const graphqlClient = dubheContext.getGraphqlClient();\n * const ecsWorld = dubheContext.getEcsWorld();\n * const address = dubheContext.getAddress();\n *\n * return <div>Connected as {address}</div>;\n * }\n * ```\n */\nexport function useDubheContext(): DubheContextValue {\n const context = useContext(DubheContext);\n\n if (!context) {\n throw new Error(\n 'useDubheContext must be used within a DubheProvider. ' +\n 'Make sure to wrap your app with <DubheProvider config={...}>'\n );\n }\n\n return context;\n}\n\n/**\n * Enhanced hook that mimics the original useDubhe API\n * Uses the Provider pattern internally but maintains backward compatibility\n *\n * @returns DubheReturn object with all instances and metadata\n *\n * @example\n * ```typescript\n * function MyComponent() {\n * const { contract, graphqlClient, ecsWorld, address } = useDubheFromProvider();\n *\n * const handleTransaction = async () => {\n * const tx = new Transaction();\n * await contract.tx.my_system.my_method({ tx });\n * };\n *\n * return <button onClick={handleTransaction}>Execute</button>;\n * }\n * ```\n */\nexport function useDubheFromProvider(): DubheReturn {\n const context = useDubheContext();\n\n // Get instances (lazy initialization via getters)\n const contract = context.getContract();\n const graphqlClient = context.getGraphqlClient();\n const ecsWorld = context.getEcsWorld();\n const address = context.getAddress();\n const metrics = context.getMetrics();\n\n // Enhanced contract with additional methods (similar to original implementation)\n const enhancedContract = contract as any;\n\n // Add transaction methods with error handling (if not already added)\n if (!enhancedContract.txWithOptions) {\n enhancedContract.txWithOptions = (system: string, method: string, options: any = {}) => {\n return async (params: any) => {\n try {\n const startTime = performance.now();\n const result = await contract.tx[system][method](params);\n const executionTime = performance.now() - startTime;\n\n if (process.env.NODE_ENV === 'development') {\n console.log(\n `Transaction ${system}.${method} completed in ${executionTime.toFixed(2)}ms`\n );\n }\n\n options.onSuccess?.(result);\n return result;\n } catch (error) {\n options.onError?.(error);\n throw error;\n }\n };\n };\n }\n\n // Add query methods with performance tracking (if not already added)\n if (!enhancedContract.queryWithOptions) {\n enhancedContract.queryWithOptions = (system: string, method: string, _options: any = {}) => {\n return async (params: any) => {\n const startTime = performance.now();\n const result = await contract.query[system][method](params);\n const executionTime = performance.now() - startTime;\n\n if (process.env.NODE_ENV === 'development') {\n console.log(`Query ${system}.${method} completed in ${executionTime.toFixed(2)}ms`);\n }\n\n return result;\n };\n };\n }\n\n return {\n contract: enhancedContract,\n graphqlClient,\n ecsWorld,\n metadata: context.config.metadata,\n network: context.config.network,\n packageId: context.config.packageId,\n dubheSchemaId: context.config.dubheSchemaId,\n address,\n options: context.config.options,\n metrics\n };\n}\n\n/**\n * Individual client hooks for components that only need specific instances\n * These are more efficient than useDubheFromProvider for single-client usage\n */\n\n/**\n * Hook for accessing only the Dubhe contract instance\n */\nexport function useDubheContractFromProvider(): Dubhe {\n const { contract } = useDubheFromProvider();\n return contract;\n}\n\n/**\n * Hook for accessing only the GraphQL client instance\n */\nexport function useDubheGraphQLFromProvider(): any | null {\n const { getGraphqlClient } = useDubheContext();\n return getGraphqlClient();\n}\n\n/**\n * Hook for accessing only the ECS World instance\n */\nexport function useDubheECSFromProvider(): any | null {\n const { getEcsWorld } = useDubheContext();\n return getEcsWorld();\n}\n","/**\n * Modern Dubhe React Hooks - Provider Pattern\n *\n * Features:\n * - 🎯 Simple API design with Provider pattern\n * - ⚡ Single client initialization with useRef\n * - 🔧 Configuration-driven setup (developers handle environment variables themselves)\n * - 🛡️ Complete type safety with strict TypeScript\n * - 📦 Context-based client sharing across components\n */\nimport { Dubhe } from '@0xobelisk/sui-client';\n\nimport {\n useDubheFromProvider,\n useDubheContractFromProvider,\n useDubheGraphQLFromProvider,\n useDubheECSFromProvider\n} from './provider';\nimport type { DubheReturn } from './types';\n\n/**\n * Primary Hook: useDubhe\n *\n * Uses Provider pattern to access shared Dubhe clients with guaranteed single initialization.\n * Must be used within a DubheProvider.\n *\n * @returns Complete Dubhe ecosystem with contract, GraphQL, ECS, and metadata\n *\n * @example\n * ```typescript\n * // App setup with Provider\n * function App() {\n * const config = {\n * network: 'devnet',\n * packageId: '0x123...',\n * metadata: contractMetadata,\n * credentials: {\n * secretKey: process.env.NEXT_PUBLIC_PRIVATE_KEY\n * }\n * };\n *\n * return (\n * <DubheProvider config={config}>\n * <MyDApp />\n * </DubheProvider>\n * );\n * }\n *\n * // Component usage\n * function MyDApp() {\n * const { contract, address } = useDubhe();\n * return <div>Connected as {address}</div>;\n * }\n * ```\n */\nexport function useDubhe(): DubheReturn {\n return useDubheFromProvider();\n}\n\n/**\n * Individual Instance Hook: useDubheContract\n *\n * Returns only the Dubhe contract instance from Provider context.\n * More efficient than useDubhe() when only contract access is needed.\n *\n * @returns Dubhe contract instance\n *\n * @example\n * ```typescript\n * function TransactionComponent() {\n * const contract = useDubheContract();\n *\n * const handleTransaction = async () => {\n * const tx = new Transaction();\n * await contract.tx.my_system.my_method({ tx });\n * };\n *\n * return <button onClick={handleTransaction}>Execute</button>;\n * }\n * ```\n */\nexport function useDubheContract(): Dubhe {\n return useDubheContractFromProvider();\n}\n\n/**\n * Individual Instance Hook: useDubheGraphQL\n *\n * Returns only the GraphQL client from Provider context.\n * More efficient than useDubhe() when only GraphQL access is needed.\n *\n * @returns GraphQL client instance (null if dubheMetadata not provided)\n *\n * @example\n * ```typescript\n * function DataComponent() {\n * const graphqlClient = useDubheGraphQL();\n *\n * useEffect(() => {\n * if (graphqlClient) {\n * graphqlClient.query({ ... }).then(setData);\n * }\n * }, [graphqlClient]);\n *\n * return <div>{data && JSON.stringify(data)}</div>;\n * }\n * ```\n */\nexport function useDubheGraphQL(): any | null {\n return useDubheGraphQLFromProvider();\n}\n\n/**\n * Individual Instance Hook: useDubheECS\n *\n * Returns only the ECS World instance from Provider context.\n * More efficient than useDubhe() when only ECS access is needed.\n *\n * @returns ECS World instance (null if GraphQL client not available)\n *\n * @example\n * ```typescript\n * function ECSComponent() {\n * const ecsWorld = useDubheECS();\n *\n * useEffect(() => {\n * if (ecsWorld) {\n * ecsWorld.getComponent('MyComponent').then(setComponent);\n * }\n * }, [ecsWorld]);\n *\n * return <div>ECS Component Data</div>;\n * }\n * ```\n */\nexport function useDubheECS(): any | null {\n return useDubheECSFromProvider();\n}\n\n/**\n * Compatibility alias for useDubhe\n */\nexport const useContract = useDubhe;\n"],"mappings":"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","names":[]}
package/dist/index.js CHANGED
@@ -305,7 +305,7 @@ function useDubheFromProvider() {
305
305
  };
306
306
  }
307
307
  if (!enhancedContract.queryWithOptions) {
308
- enhancedContract.queryWithOptions = (system, method, options = {}) => {
308
+ enhancedContract.queryWithOptions = (system, method, _options = {}) => {
309
309
  return async (params) => {
310
310
  const startTime = performance.now();
311
311
  const result = await contract.query[system][method](params);
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/sui/config.ts","../src/sui/utils.ts","../src/sui/provider.tsx","../src/sui/hooks.ts"],"sourcesContent":["/**\n * @0xobelisk/react - Modern Dubhe React Integration\n *\n * 🚀 Provides simple, powerful React experience for multi-chain blockchain development\n *\n * Currently supported:\n * - Sui blockchain ✅\n * - Aptos blockchain (coming soon)\n * - Initia blockchain (coming soon)\n */\n\n// Sui integration\nexport * from './sui/index';\n// TODO: Future extensions\n// export * from './aptos/index';\n// export * from './initia/index';\n","/**\n * Configuration Management for Dubhe React Integration\n *\n * Features:\n * - Type-safe configuration interface\n * - Configuration validation and error handling\n * - Smart merging of defaults and explicit config\n * - No environment variable handling (developers should handle environment variables themselves)\n */\n\nimport { useMemo } from 'react';\nimport type { DubheConfig, NetworkType } from './types';\nimport { mergeConfigurations, validateConfig } from './utils';\n\n/**\n * Default configuration object with sensible defaults\n */\nexport const DEFAULT_CONFIG: Partial<DubheConfig> = {\n endpoints: {\n graphql: 'http://localhost:4000/graphql',\n websocket: 'ws://localhost:4000/graphql'\n },\n options: {\n enableBatchOptimization: true,\n cacheTimeout: 5000,\n debounceMs: 100,\n reconnectOnError: true\n }\n};\n\n/**\n * Configuration Hook: useDubheConfig\n *\n * Merges defaults with explicit configuration provided by the developer\n *\n * Note: Environment variables should be handled by the developer before passing to this hook\n *\n * @param config - Complete or partial configuration object\n * @returns Complete, validated DubheConfig\n *\n * @example\n * ```typescript\n * // Basic usage with explicit config\n * const config = useDubheConfig({\n * network: 'testnet',\n * packageId: '0x123...',\n * metadata: contractMetadata,\n * credentials: {\n * secretKey: process.env.NEXT_PUBLIC_PRIVATE_KEY // Handle env vars yourself\n * }\n * });\n *\n * // With helper function to handle environment variables\n * const getConfigFromEnv = () => ({\n * network: process.env.NEXT_PUBLIC_NETWORK as NetworkType,\n * packageId: process.env.NEXT_PUBLIC_PACKAGE_ID,\n * credentials: {\n * secretKey: process.env.NEXT_PUBLIC_PRIVATE_KEY\n * }\n * });\n *\n * const config = useDubheConfig({\n * ...getConfigFromEnv(),\n * metadata: contractMetadata\n * });\n * ```\n */\nexport function useDubheConfig(config: Partial<DubheConfig>): DubheConfig {\n // Memoize the stringified config to detect actual changes\n const configKey = useMemo(() => {\n return JSON.stringify(config);\n }, [config]);\n\n return useMemo(() => {\n // Merge configurations: defaults -> user provided config\n const mergedConfig = mergeConfigurations(DEFAULT_CONFIG, config);\n\n // Validate the final configuration\n const validatedConfig = validateConfig(mergedConfig);\n\n // if (process.env.NODE_ENV === 'development') {\n // console.log('🔧 Dubhe Config:', {\n // ...validatedConfig,\n // credentials: validatedConfig.credentials?.secretKey ? '[REDACTED]' : undefined\n // });\n // }\n\n return validatedConfig;\n }, [configKey]);\n}\n","/**\n * Utility Functions for Dubhe Configuration Management\n *\n * Features:\n * - Configuration validation and error handling\n * - Smart configuration merging with proper type safety\n * - Type-safe configuration validation\n */\n\nimport type { DubheConfig, NetworkType } from './types';\n\n/**\n * Merge multiple configuration objects with proper deep merging\n * Later configurations override earlier ones\n *\n * @param baseConfig - Base configuration (usually defaults)\n * @param overrideConfig - Override configuration (user provided)\n * @returns Merged configuration\n */\nexport function mergeConfigurations(\n baseConfig: Partial<DubheConfig>,\n overrideConfig?: Partial<DubheConfig>\n): Partial<DubheConfig> {\n if (!overrideConfig) {\n return { ...baseConfig };\n }\n\n const result: Partial<DubheConfig> = { ...baseConfig };\n\n // Merge top-level properties\n Object.assign(result, overrideConfig);\n\n // Deep merge nested objects\n if (overrideConfig.credentials || baseConfig.credentials) {\n result.credentials = {\n ...baseConfig.credentials,\n ...overrideConfig.credentials\n };\n }\n\n if (overrideConfig.endpoints || baseConfig.endpoints) {\n result.endpoints = {\n ...baseConfig.endpoints,\n ...overrideConfig.endpoints\n };\n }\n\n if (overrideConfig.options || baseConfig.options) {\n result.options = {\n ...baseConfig.options,\n ...overrideConfig.options\n };\n }\n\n return result;\n}\n\n/**\n * Validate configuration and ensure required fields are present\n * Throws descriptive errors for missing required fields\n *\n * @param config - Configuration to validate\n * @returns Validated and typed configuration\n * @throws Error if required fields are missing or invalid\n */\nexport function validateConfig(config: Partial<DubheConfig>): DubheConfig {\n const errors: string[] = [];\n\n // Check required fields\n if (!config.network) {\n errors.push('network is required');\n }\n\n if (!config.packageId) {\n errors.push('packageId is required');\n }\n\n if (!config.metadata) {\n errors.push('metadata is required');\n } else {\n // Basic metadata validation\n if (typeof config.metadata !== 'object') {\n errors.push('metadata must be an object');\n } else if (Object.keys(config.metadata).length === 0) {\n errors.push('metadata cannot be empty');\n }\n }\n\n // Validate network type\n if (config.network && !['mainnet', 'testnet', 'devnet', 'localnet'].includes(config.network)) {\n errors.push(\n `invalid network: ${config.network}. Must be one of: mainnet, testnet, devnet, localnet`\n );\n }\n\n // Validate package ID format (enhanced check)\n if (config.packageId) {\n if (!config.packageId.startsWith('0x')) {\n errors.push('packageId must start with 0x');\n } else if (config.packageId.length < 3) {\n errors.push('packageId must be longer than 0x');\n } else if (!/^0x[a-fA-F0-9]+$/.test(config.packageId)) {\n errors.push('packageId must contain only hexadecimal characters after 0x');\n }\n }\n\n // Validate dubheMetadata if provided\n if (config.dubheMetadata !== undefined) {\n if (typeof config.dubheMetadata !== 'object' || config.dubheMetadata === null) {\n errors.push('dubheMetadata must be an object');\n } else if (!config.dubheMetadata.components && !config.dubheMetadata.resources) {\n errors.push('dubheMetadata must contain components or resources');\n }\n }\n\n // Validate credentials if provided\n if (config.credentials) {\n if (config.credentials.secretKey && typeof config.credentials.secretKey !== 'string') {\n errors.push('credentials.secretKey must be a string');\n }\n if (config.credentials.mnemonics && typeof config.credentials.mnemonics !== 'string') {\n errors.push('credentials.mnemonics must be a string');\n }\n }\n\n // Validate URLs if provided\n if (config.endpoints?.graphql && !isValidUrl(config.endpoints.graphql)) {\n errors.push('endpoints.graphql must be a valid URL');\n }\n\n if (config.endpoints?.websocket && !isValidUrl(config.endpoints.websocket)) {\n errors.push('endpoints.websocket must be a valid URL');\n }\n\n // Validate numeric options\n if (\n config.options?.cacheTimeout !== undefined &&\n (typeof config.options.cacheTimeout !== 'number' || config.options.cacheTimeout < 0)\n ) {\n errors.push('options.cacheTimeout must be a non-negative number');\n }\n\n if (\n config.options?.debounceMs !== undefined &&\n (typeof config.options.debounceMs !== 'number' || config.options.debounceMs < 0)\n ) {\n errors.push('options.debounceMs must be a non-negative number');\n }\n\n if (errors.length > 0) {\n const errorMessage = `Invalid Dubhe configuration (${errors.length} error${errors.length > 1 ? 's' : ''}):\\n${errors.map((e) => `- ${e}`).join('\\n')}`;\n console.error('Configuration validation failed:', { errors, config });\n throw new Error(errorMessage);\n }\n\n return config as DubheConfig;\n}\n\n/**\n * Simple URL validation helper\n *\n * @param url - URL string to validate\n * @returns true if URL is valid, false otherwise\n */\nfunction isValidUrl(url: string): boolean {\n try {\n new URL(url);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Generate a configuration summary for debugging\n * Hides sensitive information like private keys\n *\n * @param config - Configuration to summarize\n * @returns Safe configuration summary\n */\nexport function getConfigSummary(config: DubheConfig): object {\n return {\n network: config.network,\n packageId: config.packageId,\n dubheSchemaId: config.dubheSchemaId,\n hasMetadata: !!config.metadata,\n hasDubheMetadata: !!config.dubheMetadata,\n hasCredentials: !!config.credentials?.secretKey,\n endpoints: config.endpoints,\n options: config.options\n };\n}\n","/**\n * Dubhe Provider - useRef Pattern for Client Management\n *\n * Features:\n * - 🎯 Single client instances across application lifecycle\n * - ⚡ useRef-based storage (no re-initialization on re-renders)\n * - 🔧 Provider pattern for dependency injection\n * - 🛡️ Complete type safety with strict TypeScript\n * - 📦 Context-based client sharing\n */\n\nimport React, { createContext, useContext, useRef, ReactNode } from 'react';\nimport { Dubhe } from '@0xobelisk/sui-client';\nimport { createDubheGraphqlClient } from '@0xobelisk/graphql-client';\nimport { createECSWorld } from '@0xobelisk/ecs';\nimport { useDubheConfig } from './config';\nimport type { DubheConfig, DubheReturn } from './types';\n\n/**\n * Context interface for Dubhe client instances\n * All clients are stored using useRef to ensure single initialization\n */\ninterface DubheContextValue {\n getContract: () => Dubhe;\n getGraphqlClient: () => any | null;\n getEcsWorld: () => any | null;\n getAddress: () => string;\n getMetrics: () => {\n initTime: number;\n requestCount: number;\n lastActivity: number;\n };\n config: DubheConfig;\n}\n\n/**\n * Context for sharing Dubhe clients across the application\n * Uses useRef pattern to ensure clients are created only once\n */\nconst DubheContext = createContext<DubheContextValue | null>(null);\n\n/**\n * Props interface for DubheProvider component\n */\ninterface DubheProviderProps {\n /** Configuration for Dubhe initialization */\n config: Partial<DubheConfig>;\n /** Child components that will have access to Dubhe clients */\n children: ReactNode;\n}\n\n/**\n * DubheProvider Component - useRef Pattern Implementation\n *\n * This Provider uses useRef to store client instances, ensuring they are:\n * 1. Created only once during component lifecycle\n * 2. Persisted across re-renders without re-initialization\n * 3. Shared efficiently via React Context\n *\n * Key advantages over useMemo:\n * - useRef guarantees single initialization (useMemo can re-run on dependency changes)\n * - No dependency array needed (eliminates potential re-initialization bugs)\n * - Better performance for heavy client objects\n * - Clearer separation of concerns via Provider pattern\n *\n * @param props - Provider props containing config and children\n * @returns Provider component wrapping children with Dubhe context\n *\n * @example\n * ```typescript\n * // App root setup\n * function App() {\n * const dubheConfig = {\n * network: 'devnet',\n * packageId: '0x123...',\n * metadata: contractMetadata,\n * credentials: {\n * secretKey: process.env.NEXT_PUBLIC_PRIVATE_KEY\n * }\n * };\n *\n * return (\n * <DubheProvider config={dubheConfig}>\n * <MyApplication />\n * </DubheProvider>\n * );\n * }\n * ```\n */\nexport function DubheProvider({ config, children }: DubheProviderProps) {\n // Merge configuration with defaults (only runs once)\n const finalConfig = useDubheConfig(config);\n\n // Track initialization start time (useRef ensures single timestamp)\n const startTimeRef = useRef<number>(performance.now());\n\n // useRef for contract instance - guarantees single initialization\n // Unlike useMemo, useRef.current is never re-calculated\n const contractRef = useRef<Dubhe | undefined>(undefined);\n const getContract = (): Dubhe => {\n if (!contractRef.current) {\n try {\n console.log('Initializing Dubhe contract instance (one-time)');\n contractRef.current = new Dubhe({\n networkType: finalConfig.network,\n packageId: finalConfig.packageId,\n metadata: finalConfig.metadata,\n secretKey: finalConfig.credentials?.secretKey\n });\n } catch (error) {\n console.error('Contract initialization failed:', error);\n throw error;\n }\n }\n return contractRef.current;\n };\n\n // useRef for GraphQL client instance - single initialization guaranteed\n const graphqlClientRef = useRef<any | null>(null);\n const hasInitializedGraphql = useRef(false);\n const getGraphqlClient = (): any | null => {\n if (!hasInitializedGraphql.current && finalConfig.dubheMetadata) {\n try {\n console.log('Initializing GraphQL client instance (one-time)');\n graphqlClientRef.current = createDubheGraphqlClient({\n endpoint: finalConfig.endpoints?.graphql || 'http://localhost:4000/graphql',\n subscriptionEndpoint: finalConfig.endpoints?.websocket || 'ws://localhost:4000/graphql',\n dubheMetadata: finalConfig.dubheMetadata\n });\n hasInitializedGraphql.current = true;\n } catch (error) {\n console.error('GraphQL client initialization failed:', error);\n throw error;\n }\n }\n return graphqlClientRef.current;\n };\n\n // useRef for ECS World instance - depends on GraphQL client\n const ecsWorldRef = useRef<any | null>(null);\n const hasInitializedEcs = useRef(false);\n const getEcsWorld = (): any | null => {\n const graphqlClient = getGraphqlClient();\n if (!hasInitializedEcs.current && graphqlClient) {\n try {\n console.log('Initializing ECS World instance (one-time)');\n ecsWorldRef.current = createECSWorld(graphqlClient, {\n queryConfig: {\n enableBatchOptimization: finalConfig.options?.enableBatchOptimization ?? true,\n defaultCacheTimeout: finalConfig.options?.cacheTimeout ?? 5000\n },\n subscriptionConfig: {\n defaultDebounceMs: finalConfig.options?.debounceMs ?? 100,\n reconnectOnError: finalConfig.options?.reconnectOnError ?? true\n }\n });\n hasInitializedEcs.current = true;\n } catch (error) {\n console.error('ECS World initialization failed:', error);\n throw error;\n }\n }\n return ecsWorldRef.current;\n };\n\n // Address getter - calculated from contract\n const getAddress = (): string => {\n return getContract().getAddress();\n };\n\n // Metrics getter - performance tracking\n const getMetrics = () => ({\n initTime: performance.now() - (startTimeRef.current || 0),\n requestCount: 0, // Can be enhanced with actual tracking\n lastActivity: Date.now()\n });\n\n // Context value - stable reference (no re-renders for consumers)\n const contextValue: DubheContextValue = {\n getContract,\n getGraphqlClient,\n getEcsWorld,\n getAddress,\n getMetrics,\n config: finalConfig\n };\n\n return <DubheContext.Provider value={contextValue}>{children}</DubheContext.Provider>;\n}\n\n/**\n * Custom hook to access Dubhe context\n * Provides type-safe access to all Dubhe client instances\n *\n * @returns DubheContextValue with all client getters and config\n * @throws Error if used outside of DubheProvider\n *\n * @example\n * ```typescript\n * function MyComponent() {\n * const dubheContext = useDubheContext();\n *\n * const contract = dubheContext.getContract();\n * const graphqlClient = dubheContext.getGraphqlClient();\n * const ecsWorld = dubheContext.getEcsWorld();\n * const address = dubheContext.getAddress();\n *\n * return <div>Connected as {address}</div>;\n * }\n * ```\n */\nexport function useDubheContext(): DubheContextValue {\n const context = useContext(DubheContext);\n\n if (!context) {\n throw new Error(\n 'useDubheContext must be used within a DubheProvider. ' +\n 'Make sure to wrap your app with <DubheProvider config={...}>'\n );\n }\n\n return context;\n}\n\n/**\n * Enhanced hook that mimics the original useDubhe API\n * Uses the Provider pattern internally but maintains backward compatibility\n *\n * @returns DubheReturn object with all instances and metadata\n *\n * @example\n * ```typescript\n * function MyComponent() {\n * const { contract, graphqlClient, ecsWorld, address } = useDubheFromProvider();\n *\n * const handleTransaction = async () => {\n * const tx = new Transaction();\n * await contract.tx.my_system.my_method({ tx });\n * };\n *\n * return <button onClick={handleTransaction}>Execute</button>;\n * }\n * ```\n */\nexport function useDubheFromProvider(): DubheReturn {\n const context = useDubheContext();\n\n // Get instances (lazy initialization via getters)\n const contract = context.getContract();\n const graphqlClient = context.getGraphqlClient();\n const ecsWorld = context.getEcsWorld();\n const address = context.getAddress();\n const metrics = context.getMetrics();\n\n // Enhanced contract with additional methods (similar to original implementation)\n const enhancedContract = contract as any;\n\n // Add transaction methods with error handling (if not already added)\n if (!enhancedContract.txWithOptions) {\n enhancedContract.txWithOptions = (system: string, method: string, options: any = {}) => {\n return async (params: any) => {\n try {\n const startTime = performance.now();\n const result = await contract.tx[system][method](params);\n const executionTime = performance.now() - startTime;\n\n if (process.env.NODE_ENV === 'development') {\n console.log(\n `Transaction ${system}.${method} completed in ${executionTime.toFixed(2)}ms`\n );\n }\n\n options.onSuccess?.(result);\n return result;\n } catch (error) {\n options.onError?.(error);\n throw error;\n }\n };\n };\n }\n\n // Add query methods with performance tracking (if not already added)\n if (!enhancedContract.queryWithOptions) {\n enhancedContract.queryWithOptions = (system: string, method: string, options: any = {}) => {\n return async (params: any) => {\n const startTime = performance.now();\n const result = await contract.query[system][method](params);\n const executionTime = performance.now() - startTime;\n\n if (process.env.NODE_ENV === 'development') {\n console.log(`Query ${system}.${method} completed in ${executionTime.toFixed(2)}ms`);\n }\n\n return result;\n };\n };\n }\n\n return {\n contract: enhancedContract,\n graphqlClient,\n ecsWorld,\n metadata: context.config.metadata,\n network: context.config.network,\n packageId: context.config.packageId,\n dubheSchemaId: context.config.dubheSchemaId,\n address,\n options: context.config.options,\n metrics\n };\n}\n\n/**\n * Individual client hooks for components that only need specific instances\n * These are more efficient than useDubheFromProvider for single-client usage\n */\n\n/**\n * Hook for accessing only the Dubhe contract instance\n */\nexport function useDubheContractFromProvider(): Dubhe {\n const { contract } = useDubheFromProvider();\n return contract;\n}\n\n/**\n * Hook for accessing only the GraphQL client instance\n */\nexport function useDubheGraphQLFromProvider(): any | null {\n const { getGraphqlClient } = useDubheContext();\n return getGraphqlClient();\n}\n\n/**\n * Hook for accessing only the ECS World instance\n */\nexport function useDubheECSFromProvider(): any | null {\n const { getEcsWorld } = useDubheContext();\n return getEcsWorld();\n}\n","/**\n * Modern Dubhe React Hooks - Provider Pattern\n *\n * Features:\n * - 🎯 Simple API design with Provider pattern\n * - ⚡ Single client initialization with useRef\n * - 🔧 Configuration-driven setup (developers handle environment variables themselves)\n * - 🛡️ Complete type safety with strict TypeScript\n * - 📦 Context-based client sharing across components\n */\nimport { Dubhe } from '@0xobelisk/sui-client';\n\nimport {\n useDubheContext,\n useDubheFromProvider,\n useDubheContractFromProvider,\n useDubheGraphQLFromProvider,\n useDubheECSFromProvider\n} from './provider';\nimport type { DubheConfig, DubheReturn } from './types';\n\n/**\n * Primary Hook: useDubhe\n *\n * Uses Provider pattern to access shared Dubhe clients with guaranteed single initialization.\n * Must be used within a DubheProvider.\n *\n * @returns Complete Dubhe ecosystem with contract, GraphQL, ECS, and metadata\n *\n * @example\n * ```typescript\n * // App setup with Provider\n * function App() {\n * const config = {\n * network: 'devnet',\n * packageId: '0x123...',\n * metadata: contractMetadata,\n * credentials: {\n * secretKey: process.env.NEXT_PUBLIC_PRIVATE_KEY\n * }\n * };\n *\n * return (\n * <DubheProvider config={config}>\n * <MyDApp />\n * </DubheProvider>\n * );\n * }\n *\n * // Component usage\n * function MyDApp() {\n * const { contract, address } = useDubhe();\n * return <div>Connected as {address}</div>;\n * }\n * ```\n */\nexport function useDubhe(): DubheReturn {\n return useDubheFromProvider();\n}\n\n/**\n * Individual Instance Hook: useDubheContract\n *\n * Returns only the Dubhe contract instance from Provider context.\n * More efficient than useDubhe() when only contract access is needed.\n *\n * @returns Dubhe contract instance\n *\n * @example\n * ```typescript\n * function TransactionComponent() {\n * const contract = useDubheContract();\n *\n * const handleTransaction = async () => {\n * const tx = new Transaction();\n * await contract.tx.my_system.my_method({ tx });\n * };\n *\n * return <button onClick={handleTransaction}>Execute</button>;\n * }\n * ```\n */\nexport function useDubheContract(): Dubhe {\n return useDubheContractFromProvider();\n}\n\n/**\n * Individual Instance Hook: useDubheGraphQL\n *\n * Returns only the GraphQL client from Provider context.\n * More efficient than useDubhe() when only GraphQL access is needed.\n *\n * @returns GraphQL client instance (null if dubheMetadata not provided)\n *\n * @example\n * ```typescript\n * function DataComponent() {\n * const graphqlClient = useDubheGraphQL();\n *\n * useEffect(() => {\n * if (graphqlClient) {\n * graphqlClient.query({ ... }).then(setData);\n * }\n * }, [graphqlClient]);\n *\n * return <div>{data && JSON.stringify(data)}</div>;\n * }\n * ```\n */\nexport function useDubheGraphQL(): any | null {\n return useDubheGraphQLFromProvider();\n}\n\n/**\n * Individual Instance Hook: useDubheECS\n *\n * Returns only the ECS World instance from Provider context.\n * More efficient than useDubhe() when only ECS access is needed.\n *\n * @returns ECS World instance (null if GraphQL client not available)\n *\n * @example\n * ```typescript\n * function ECSComponent() {\n * const ecsWorld = useDubheECS();\n *\n * useEffect(() => {\n * if (ecsWorld) {\n * ecsWorld.getComponent('MyComponent').then(setComponent);\n * }\n * }, [ecsWorld]);\n *\n * return <div>ECS Component Data</div>;\n * }\n * ```\n */\nexport function useDubheECS(): any | null {\n return useDubheECSFromProvider();\n}\n\n/**\n * Compatibility alias for useDubhe\n */\nexport const useContract = useDubhe;\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACUA,mBAAwB;;;ACSjB,SAAS,oBACd,YACA,gBACsB;AACtB,MAAI,CAAC,gBAAgB;AACnB,WAAO,EAAE,GAAG,WAAW;AAAA,EACzB;AAEA,QAAM,SAA+B,EAAE,GAAG,WAAW;AAGrD,SAAO,OAAO,QAAQ,cAAc;AAGpC,MAAI,eAAe,eAAe,WAAW,aAAa;AACxD,WAAO,cAAc;AAAA,MACnB,GAAG,WAAW;AAAA,MACd,GAAG,eAAe;AAAA,IACpB;AAAA,EACF;AAEA,MAAI,eAAe,aAAa,WAAW,WAAW;AACpD,WAAO,YAAY;AAAA,MACjB,GAAG,WAAW;AAAA,MACd,GAAG,eAAe;AAAA,IACpB;AAAA,EACF;AAEA,MAAI,eAAe,WAAW,WAAW,SAAS;AAChD,WAAO,UAAU;AAAA,MACf,GAAG,WAAW;AAAA,MACd,GAAG,eAAe;AAAA,IACpB;AAAA,EACF;AAEA,SAAO;AACT;AAUO,SAAS,eAAe,QAA2C;AACxE,QAAM,SAAmB,CAAC;AAG1B,MAAI,CAAC,OAAO,SAAS;AACnB,WAAO,KAAK,qBAAqB;AAAA,EACnC;AAEA,MAAI,CAAC,OAAO,WAAW;AACrB,WAAO,KAAK,uBAAuB;AAAA,EACrC;AAEA,MAAI,CAAC,OAAO,UAAU;AACpB,WAAO,KAAK,sBAAsB;AAAA,EACpC,OAAO;AAEL,QAAI,OAAO,OAAO,aAAa,UAAU;AACvC,aAAO,KAAK,4BAA4B;AAAA,IAC1C,WAAW,OAAO,KAAK,OAAO,QAAQ,EAAE,WAAW,GAAG;AACpD,aAAO,KAAK,0BAA0B;AAAA,IACxC;AAAA,EACF;AAGA,MAAI,OAAO,WAAW,CAAC,CAAC,WAAW,WAAW,UAAU,UAAU,EAAE,SAAS,OAAO,OAAO,GAAG;AAC5F,WAAO;AAAA,MACL,oBAAoB,OAAO,OAAO;AAAA,IACpC;AAAA,EACF;AAGA,MAAI,OAAO,WAAW;AACpB,QAAI,CAAC,OAAO,UAAU,WAAW,IAAI,GAAG;AACtC,aAAO,KAAK,8BAA8B;AAAA,IAC5C,WAAW,OAAO,UAAU,SAAS,GAAG;AACtC,aAAO,KAAK,kCAAkC;AAAA,IAChD,WAAW,CAAC,mBAAmB,KAAK,OAAO,SAAS,GAAG;AACrD,aAAO,KAAK,6DAA6D;AAAA,IAC3E;AAAA,EACF;AAGA,MAAI,OAAO,kBAAkB,QAAW;AACtC,QAAI,OAAO,OAAO,kBAAkB,YAAY,OAAO,kBAAkB,MAAM;AAC7E,aAAO,KAAK,iCAAiC;AAAA,IAC/C,WAAW,CAAC,OAAO,cAAc,cAAc,CAAC,OAAO,cAAc,WAAW;AAC9E,aAAO,KAAK,oDAAoD;AAAA,IAClE;AAAA,EACF;AAGA,MAAI,OAAO,aAAa;AACtB,QAAI,OAAO,YAAY,aAAa,OAAO,OAAO,YAAY,cAAc,UAAU;AACpF,aAAO,KAAK,wCAAwC;AAAA,IACtD;AACA,QAAI,OAAO,YAAY,aAAa,OAAO,OAAO,YAAY,cAAc,UAAU;AACpF,aAAO,KAAK,wCAAwC;AAAA,IACtD;AAAA,EACF;AAGA,MAAI,OAAO,WAAW,WAAW,CAAC,WAAW,OAAO,UAAU,OAAO,GAAG;AACtE,WAAO,KAAK,uCAAuC;AAAA,EACrD;AAEA,MAAI,OAAO,WAAW,aAAa,CAAC,WAAW,OAAO,UAAU,SAAS,GAAG;AAC1E,WAAO,KAAK,yCAAyC;AAAA,EACvD;AAGA,MACE,OAAO,SAAS,iBAAiB,WAChC,OAAO,OAAO,QAAQ,iBAAiB,YAAY,OAAO,QAAQ,eAAe,IAClF;AACA,WAAO,KAAK,oDAAoD;AAAA,EAClE;AAEA,MACE,OAAO,SAAS,eAAe,WAC9B,OAAO,OAAO,QAAQ,eAAe,YAAY,OAAO,QAAQ,aAAa,IAC9E;AACA,WAAO,KAAK,kDAAkD;AAAA,EAChE;AAEA,MAAI,OAAO,SAAS,GAAG;AACrB,UAAM,eAAe,gCAAgC,OAAO,MAAM,SAAS,OAAO,SAAS,IAAI,MAAM,EAAE;AAAA,EAAO,OAAO,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,EAAE,KAAK,IAAI,CAAC;AACpJ,YAAQ,MAAM,oCAAoC,EAAE,QAAQ,OAAO,CAAC;AACpE,UAAM,IAAI,MAAM,YAAY;AAAA,EAC9B;AAEA,SAAO;AACT;AAQA,SAAS,WAAW,KAAsB;AACxC,MAAI;AACF,QAAI,IAAI,GAAG;AACX,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AASO,SAAS,iBAAiB,QAA6B;AAC5D,SAAO;AAAA,IACL,SAAS,OAAO;AAAA,IAChB,WAAW,OAAO;AAAA,IAClB,eAAe,OAAO;AAAA,IACtB,aAAa,CAAC,CAAC,OAAO;AAAA,IACtB,kBAAkB,CAAC,CAAC,OAAO;AAAA,IAC3B,gBAAgB,CAAC,CAAC,OAAO,aAAa;AAAA,IACtC,WAAW,OAAO;AAAA,IAClB,SAAS,OAAO;AAAA,EAClB;AACF;;;AD9KO,IAAM,iBAAuC;AAAA,EAClD,WAAW;AAAA,IACT,SAAS;AAAA,IACT,WAAW;AAAA,EACb;AAAA,EACA,SAAS;AAAA,IACP,yBAAyB;AAAA,IACzB,cAAc;AAAA,IACd,YAAY;AAAA,IACZ,kBAAkB;AAAA,EACpB;AACF;AAuCO,SAAS,eAAe,QAA2C;AAExE,QAAM,gBAAY,sBAAQ,MAAM;AAC9B,WAAO,KAAK,UAAU,MAAM;AAAA,EAC9B,GAAG,CAAC,MAAM,CAAC;AAEX,aAAO,sBAAQ,MAAM;AAEnB,UAAM,eAAe,oBAAoB,gBAAgB,MAAM;AAG/D,UAAM,kBAAkB,eAAe,YAAY;AASnD,WAAO;AAAA,EACT,GAAG,CAAC,SAAS,CAAC;AAChB;;;AE9EA,IAAAA,gBAAoE;AACpE,wBAAsB;AACtB,4BAAyC;AACzC,iBAA+B;AA6KtB;AApJT,IAAM,mBAAe,6BAAwC,IAAI;AAkD1D,SAAS,cAAc,EAAE,QAAQ,SAAS,GAAuB;AAEtE,QAAM,cAAc,eAAe,MAAM;AAGzC,QAAM,mBAAe,sBAAe,YAAY,IAAI,CAAC;AAIrD,QAAM,kBAAc,sBAA0B,MAAS;AACvD,QAAM,cAAc,MAAa;AAC/B,QAAI,CAAC,YAAY,SAAS;AACxB,UAAI;AACF,gBAAQ,IAAI,iDAAiD;AAC7D,oBAAY,UAAU,IAAI,wBAAM;AAAA,UAC9B,aAAa,YAAY;AAAA,UACzB,WAAW,YAAY;AAAA,UACvB,UAAU,YAAY;AAAA,UACtB,WAAW,YAAY,aAAa;AAAA,QACtC,CAAC;AAAA,MACH,SAAS,OAAO;AACd,gBAAQ,MAAM,mCAAmC,KAAK;AACtD,cAAM;AAAA,MACR;AAAA,IACF;AACA,WAAO,YAAY;AAAA,EACrB;AAGA,QAAM,uBAAmB,sBAAmB,IAAI;AAChD,QAAM,4BAAwB,sBAAO,KAAK;AAC1C,QAAM,mBAAmB,MAAkB;AACzC,QAAI,CAAC,sBAAsB,WAAW,YAAY,eAAe;AAC/D,UAAI;AACF,gBAAQ,IAAI,iDAAiD;AAC7D,yBAAiB,cAAU,gDAAyB;AAAA,UAClD,UAAU,YAAY,WAAW,WAAW;AAAA,UAC5C,sBAAsB,YAAY,WAAW,aAAa;AAAA,UAC1D,eAAe,YAAY;AAAA,QAC7B,CAAC;AACD,8BAAsB,UAAU;AAAA,MAClC,SAAS,OAAO;AACd,gBAAQ,MAAM,yCAAyC,KAAK;AAC5D,cAAM;AAAA,MACR;AAAA,IACF;AACA,WAAO,iBAAiB;AAAA,EAC1B;AAGA,QAAM,kBAAc,sBAAmB,IAAI;AAC3C,QAAM,wBAAoB,sBAAO,KAAK;AACtC,QAAM,cAAc,MAAkB;AACpC,UAAM,gBAAgB,iBAAiB;AACvC,QAAI,CAAC,kBAAkB,WAAW,eAAe;AAC/C,UAAI;AACF,gBAAQ,IAAI,4CAA4C;AACxD,oBAAY,cAAU,2BAAe,eAAe;AAAA,UAClD,aAAa;AAAA,YACX,yBAAyB,YAAY,SAAS,2BAA2B;AAAA,YACzE,qBAAqB,YAAY,SAAS,gBAAgB;AAAA,UAC5D;AAAA,UACA,oBAAoB;AAAA,YAClB,mBAAmB,YAAY,SAAS,cAAc;AAAA,YACtD,kBAAkB,YAAY,SAAS,oBAAoB;AAAA,UAC7D;AAAA,QACF,CAAC;AACD,0BAAkB,UAAU;AAAA,MAC9B,SAAS,OAAO;AACd,gBAAQ,MAAM,oCAAoC,KAAK;AACvD,cAAM;AAAA,MACR;AAAA,IACF;AACA,WAAO,YAAY;AAAA,EACrB;AAGA,QAAM,aAAa,MAAc;AAC/B,WAAO,YAAY,EAAE,WAAW;AAAA,EAClC;AAGA,QAAM,aAAa,OAAO;AAAA,IACxB,UAAU,YAAY,IAAI,KAAK,aAAa,WAAW;AAAA,IACvD,cAAc;AAAA;AAAA,IACd,cAAc,KAAK,IAAI;AAAA,EACzB;AAGA,QAAM,eAAkC;AAAA,IACtC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,QAAQ;AAAA,EACV;AAEA,SAAO,4CAAC,aAAa,UAAb,EAAsB,OAAO,cAAe,UAAS;AAC/D;AAuBO,SAAS,kBAAqC;AACnD,QAAM,cAAU,0BAAW,YAAY;AAEvC,MAAI,CAAC,SAAS;AACZ,UAAM,IAAI;AAAA,MACR;AAAA,IAEF;AAAA,EACF;AAEA,SAAO;AACT;AAsBO,SAAS,uBAAoC;AAClD,QAAM,UAAU,gBAAgB;AAGhC,QAAM,WAAW,QAAQ,YAAY;AACrC,QAAM,gBAAgB,QAAQ,iBAAiB;AAC/C,QAAM,WAAW,QAAQ,YAAY;AACrC,QAAM,UAAU,QAAQ,WAAW;AACnC,QAAM,UAAU,QAAQ,WAAW;AAGnC,QAAM,mBAAmB;AAGzB,MAAI,CAAC,iBAAiB,eAAe;AACnC,qBAAiB,gBAAgB,CAAC,QAAgB,QAAgB,UAAe,CAAC,MAAM;AACtF,aAAO,OAAO,WAAgB;AAC5B,YAAI;AACF,gBAAM,YAAY,YAAY,IAAI;AAClC,gBAAM,SAAS,MAAM,SAAS,GAAG,MAAM,EAAE,MAAM,EAAE,MAAM;AACvD,gBAAM,gBAAgB,YAAY,IAAI,IAAI;AAE1C,cAAI,QAAQ,IAAI,aAAa,eAAe;AAC1C,oBAAQ;AAAA,cACN,eAAe,MAAM,IAAI,MAAM,iBAAiB,cAAc,QAAQ,CAAC,CAAC;AAAA,YAC1E;AAAA,UACF;AAEA,kBAAQ,YAAY,MAAM;AAC1B,iBAAO;AAAA,QACT,SAAS,OAAO;AACd,kBAAQ,UAAU,KAAK;AACvB,gBAAM;AAAA,QACR;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,MAAI,CAAC,iBAAiB,kBAAkB;AACtC,qBAAiB,mBAAmB,CAAC,QAAgB,QAAgB,UAAe,CAAC,MAAM;AACzF,aAAO,OAAO,WAAgB;AAC5B,cAAM,YAAY,YAAY,IAAI;AAClC,cAAM,SAAS,MAAM,SAAS,MAAM,MAAM,EAAE,MAAM,EAAE,MAAM;AAC1D,cAAM,gBAAgB,YAAY,IAAI,IAAI;AAE1C,YAAI,QAAQ,IAAI,aAAa,eAAe;AAC1C,kBAAQ,IAAI,SAAS,MAAM,IAAI,MAAM,iBAAiB,cAAc,QAAQ,CAAC,CAAC,IAAI;AAAA,QACpF;AAEA,eAAO;AAAA,MACT;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL,UAAU;AAAA,IACV;AAAA,IACA;AAAA,IACA,UAAU,QAAQ,OAAO;AAAA,IACzB,SAAS,QAAQ,OAAO;AAAA,IACxB,WAAW,QAAQ,OAAO;AAAA,IAC1B,eAAe,QAAQ,OAAO;AAAA,IAC9B;AAAA,IACA,SAAS,QAAQ,OAAO;AAAA,IACxB;AAAA,EACF;AACF;AAUO,SAAS,+BAAsC;AACpD,QAAM,EAAE,SAAS,IAAI,qBAAqB;AAC1C,SAAO;AACT;AAKO,SAAS,8BAA0C;AACxD,QAAM,EAAE,iBAAiB,IAAI,gBAAgB;AAC7C,SAAO,iBAAiB;AAC1B;AAKO,SAAS,0BAAsC;AACpD,QAAM,EAAE,YAAY,IAAI,gBAAgB;AACxC,SAAO,YAAY;AACrB;;;AC5RO,SAAS,WAAwB;AACtC,SAAO,qBAAqB;AAC9B;AAwBO,SAAS,mBAA0B;AACxC,SAAO,6BAA6B;AACtC;AAyBO,SAAS,kBAA8B;AAC5C,SAAO,4BAA4B;AACrC;AAyBO,SAAS,cAA0B;AACxC,SAAO,wBAAwB;AACjC;AAKO,IAAM,cAAc;","names":["import_react"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/sui/config.ts","../src/sui/utils.ts","../src/sui/provider.tsx","../src/sui/hooks.ts"],"sourcesContent":["/**\n * @0xobelisk/react - Modern Dubhe React Integration\n *\n * 🚀 Provides simple, powerful React experience for multi-chain blockchain development\n *\n * Currently supported:\n * - Sui blockchain ✅\n * - Aptos blockchain (coming soon)\n * - Initia blockchain (coming soon)\n */\n\n// Sui integration\nexport * from './sui/index';\n// TODO: Future extensions\n// export * from './aptos/index';\n// export * from './initia/index';\n","/**\n * Configuration Management for Dubhe React Integration\n *\n * Features:\n * - Type-safe configuration interface\n * - Configuration validation and error handling\n * - Smart merging of defaults and explicit config\n * - No environment variable handling (developers should handle environment variables themselves)\n */\n\nimport { useMemo } from 'react';\nimport type { DubheConfig } from './types';\nimport { mergeConfigurations, validateConfig } from './utils';\n\n/**\n * Default configuration object with sensible defaults\n */\nexport const DEFAULT_CONFIG: Partial<DubheConfig> = {\n endpoints: {\n graphql: 'http://localhost:4000/graphql',\n websocket: 'ws://localhost:4000/graphql'\n },\n options: {\n enableBatchOptimization: true,\n cacheTimeout: 5000,\n debounceMs: 100,\n reconnectOnError: true\n }\n};\n\n/**\n * Configuration Hook: useDubheConfig\n *\n * Merges defaults with explicit configuration provided by the developer\n *\n * Note: Environment variables should be handled by the developer before passing to this hook\n *\n * @param config - Complete or partial configuration object\n * @returns Complete, validated DubheConfig\n *\n * @example\n * ```typescript\n * // Basic usage with explicit config\n * const config = useDubheConfig({\n * network: 'testnet',\n * packageId: '0x123...',\n * metadata: contractMetadata,\n * credentials: {\n * secretKey: process.env.NEXT_PUBLIC_PRIVATE_KEY // Handle env vars yourself\n * }\n * });\n *\n * // With helper function to handle environment variables\n * const getConfigFromEnv = () => ({\n * network: process.env.NEXT_PUBLIC_NETWORK as NetworkType,\n * packageId: process.env.NEXT_PUBLIC_PACKAGE_ID,\n * credentials: {\n * secretKey: process.env.NEXT_PUBLIC_PRIVATE_KEY\n * }\n * });\n *\n * const config = useDubheConfig({\n * ...getConfigFromEnv(),\n * metadata: contractMetadata\n * });\n * ```\n */\nexport function useDubheConfig(config: Partial<DubheConfig>): DubheConfig {\n // Memoize the stringified config to detect actual changes\n const configKey = useMemo(() => {\n return JSON.stringify(config);\n }, [config]);\n\n return useMemo(() => {\n // Merge configurations: defaults -> user provided config\n const mergedConfig = mergeConfigurations(DEFAULT_CONFIG, config);\n\n // Validate the final configuration\n const validatedConfig = validateConfig(mergedConfig);\n\n // if (process.env.NODE_ENV === 'development') {\n // console.log('🔧 Dubhe Config:', {\n // ...validatedConfig,\n // credentials: validatedConfig.credentials?.secretKey ? '[REDACTED]' : undefined\n // });\n // }\n\n return validatedConfig;\n }, [configKey]);\n}\n","/**\n * Utility Functions for Dubhe Configuration Management\n *\n * Features:\n * - Configuration validation and error handling\n * - Smart configuration merging with proper type safety\n * - Type-safe configuration validation\n */\n\nimport type { DubheConfig } from './types';\n\n/**\n * Merge multiple configuration objects with proper deep merging\n * Later configurations override earlier ones\n *\n * @param baseConfig - Base configuration (usually defaults)\n * @param overrideConfig - Override configuration (user provided)\n * @returns Merged configuration\n */\nexport function mergeConfigurations(\n baseConfig: Partial<DubheConfig>,\n overrideConfig?: Partial<DubheConfig>\n): Partial<DubheConfig> {\n if (!overrideConfig) {\n return { ...baseConfig };\n }\n\n const result: Partial<DubheConfig> = { ...baseConfig };\n\n // Merge top-level properties\n Object.assign(result, overrideConfig);\n\n // Deep merge nested objects\n if (overrideConfig.credentials || baseConfig.credentials) {\n result.credentials = {\n ...baseConfig.credentials,\n ...overrideConfig.credentials\n };\n }\n\n if (overrideConfig.endpoints || baseConfig.endpoints) {\n result.endpoints = {\n ...baseConfig.endpoints,\n ...overrideConfig.endpoints\n };\n }\n\n if (overrideConfig.options || baseConfig.options) {\n result.options = {\n ...baseConfig.options,\n ...overrideConfig.options\n };\n }\n\n return result;\n}\n\n/**\n * Validate configuration and ensure required fields are present\n * Throws descriptive errors for missing required fields\n *\n * @param config - Configuration to validate\n * @returns Validated and typed configuration\n * @throws Error if required fields are missing or invalid\n */\nexport function validateConfig(config: Partial<DubheConfig>): DubheConfig {\n const errors: string[] = [];\n\n // Check required fields\n if (!config.network) {\n errors.push('network is required');\n }\n\n if (!config.packageId) {\n errors.push('packageId is required');\n }\n\n if (!config.metadata) {\n errors.push('metadata is required');\n } else {\n // Basic metadata validation\n if (typeof config.metadata !== 'object') {\n errors.push('metadata must be an object');\n } else if (Object.keys(config.metadata).length === 0) {\n errors.push('metadata cannot be empty');\n }\n }\n\n // Validate network type\n if (config.network && !['mainnet', 'testnet', 'devnet', 'localnet'].includes(config.network)) {\n errors.push(\n `invalid network: ${config.network}. Must be one of: mainnet, testnet, devnet, localnet`\n );\n }\n\n // Validate package ID format (enhanced check)\n if (config.packageId) {\n if (!config.packageId.startsWith('0x')) {\n errors.push('packageId must start with 0x');\n } else if (config.packageId.length < 3) {\n errors.push('packageId must be longer than 0x');\n } else if (!/^0x[a-fA-F0-9]+$/.test(config.packageId)) {\n errors.push('packageId must contain only hexadecimal characters after 0x');\n }\n }\n\n // Validate dubheMetadata if provided\n if (config.dubheMetadata !== undefined) {\n if (typeof config.dubheMetadata !== 'object' || config.dubheMetadata === null) {\n errors.push('dubheMetadata must be an object');\n } else if (!config.dubheMetadata.components && !config.dubheMetadata.resources) {\n errors.push('dubheMetadata must contain components or resources');\n }\n }\n\n // Validate credentials if provided\n if (config.credentials) {\n if (config.credentials.secretKey && typeof config.credentials.secretKey !== 'string') {\n errors.push('credentials.secretKey must be a string');\n }\n if (config.credentials.mnemonics && typeof config.credentials.mnemonics !== 'string') {\n errors.push('credentials.mnemonics must be a string');\n }\n }\n\n // Validate URLs if provided\n if (config.endpoints?.graphql && !isValidUrl(config.endpoints.graphql)) {\n errors.push('endpoints.graphql must be a valid URL');\n }\n\n if (config.endpoints?.websocket && !isValidUrl(config.endpoints.websocket)) {\n errors.push('endpoints.websocket must be a valid URL');\n }\n\n // Validate numeric options\n if (\n config.options?.cacheTimeout !== undefined &&\n (typeof config.options.cacheTimeout !== 'number' || config.options.cacheTimeout < 0)\n ) {\n errors.push('options.cacheTimeout must be a non-negative number');\n }\n\n if (\n config.options?.debounceMs !== undefined &&\n (typeof config.options.debounceMs !== 'number' || config.options.debounceMs < 0)\n ) {\n errors.push('options.debounceMs must be a non-negative number');\n }\n\n if (errors.length > 0) {\n const errorMessage = `Invalid Dubhe configuration (${errors.length} error${\n errors.length > 1 ? 's' : ''\n }):\\n${errors.map((e) => `- ${e}`).join('\\n')}`;\n console.error('Configuration validation failed:', { errors, config });\n throw new Error(errorMessage);\n }\n\n return config as DubheConfig;\n}\n\n/**\n * Simple URL validation helper\n *\n * @param url - URL string to validate\n * @returns true if URL is valid, false otherwise\n */\nfunction isValidUrl(url: string): boolean {\n try {\n new URL(url);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Generate a configuration summary for debugging\n * Hides sensitive information like private keys\n *\n * @param config - Configuration to summarize\n * @returns Safe configuration summary\n */\nexport function getConfigSummary(config: DubheConfig): object {\n return {\n network: config.network,\n packageId: config.packageId,\n dubheSchemaId: config.dubheSchemaId,\n hasMetadata: !!config.metadata,\n hasDubheMetadata: !!config.dubheMetadata,\n hasCredentials: !!config.credentials?.secretKey,\n endpoints: config.endpoints,\n options: config.options\n };\n}\n","/**\n * Dubhe Provider - useRef Pattern for Client Management\n *\n * Features:\n * - 🎯 Single client instances across application lifecycle\n * - ⚡ useRef-based storage (no re-initialization on re-renders)\n * - 🔧 Provider pattern for dependency injection\n * - 🛡️ Complete type safety with strict TypeScript\n * - 📦 Context-based client sharing\n */\n\nimport { createContext, useContext, useRef, ReactNode } from 'react';\nimport { Dubhe } from '@0xobelisk/sui-client';\nimport { createDubheGraphqlClient } from '@0xobelisk/graphql-client';\nimport { createECSWorld } from '@0xobelisk/ecs';\nimport { useDubheConfig } from './config';\nimport type { DubheConfig, DubheReturn } from './types';\n\n/**\n * Context interface for Dubhe client instances\n * All clients are stored using useRef to ensure single initialization\n */\ninterface DubheContextValue {\n getContract: () => Dubhe;\n getGraphqlClient: () => any | null;\n getEcsWorld: () => any | null;\n getAddress: () => string;\n getMetrics: () => {\n initTime: number;\n requestCount: number;\n lastActivity: number;\n };\n config: DubheConfig;\n}\n\n/**\n * Context for sharing Dubhe clients across the application\n * Uses useRef pattern to ensure clients are created only once\n */\nconst DubheContext = createContext<DubheContextValue | null>(null);\n\n/**\n * Props interface for DubheProvider component\n */\ninterface DubheProviderProps {\n /** Configuration for Dubhe initialization */\n config: Partial<DubheConfig>;\n /** Child components that will have access to Dubhe clients */\n children: ReactNode;\n}\n\n/**\n * DubheProvider Component - useRef Pattern Implementation\n *\n * This Provider uses useRef to store client instances, ensuring they are:\n * 1. Created only once during component lifecycle\n * 2. Persisted across re-renders without re-initialization\n * 3. Shared efficiently via React Context\n *\n * Key advantages over useMemo:\n * - useRef guarantees single initialization (useMemo can re-run on dependency changes)\n * - No dependency array needed (eliminates potential re-initialization bugs)\n * - Better performance for heavy client objects\n * - Clearer separation of concerns via Provider pattern\n *\n * @param props - Provider props containing config and children\n * @returns Provider component wrapping children with Dubhe context\n *\n * @example\n * ```typescript\n * // App root setup\n * function App() {\n * const dubheConfig = {\n * network: 'devnet',\n * packageId: '0x123...',\n * metadata: contractMetadata,\n * credentials: {\n * secretKey: process.env.NEXT_PUBLIC_PRIVATE_KEY\n * }\n * };\n *\n * return (\n * <DubheProvider config={dubheConfig}>\n * <MyApplication />\n * </DubheProvider>\n * );\n * }\n * ```\n */\nexport function DubheProvider({ config, children }: DubheProviderProps) {\n // Merge configuration with defaults (only runs once)\n const finalConfig = useDubheConfig(config);\n\n // Track initialization start time (useRef ensures single timestamp)\n const startTimeRef = useRef<number>(performance.now());\n\n // useRef for contract instance - guarantees single initialization\n // Unlike useMemo, useRef.current is never re-calculated\n const contractRef = useRef<Dubhe | undefined>(undefined);\n const getContract = (): Dubhe => {\n if (!contractRef.current) {\n try {\n console.log('Initializing Dubhe contract instance (one-time)');\n contractRef.current = new Dubhe({\n networkType: finalConfig.network,\n packageId: finalConfig.packageId,\n metadata: finalConfig.metadata,\n secretKey: finalConfig.credentials?.secretKey\n });\n } catch (error) {\n console.error('Contract initialization failed:', error);\n throw error;\n }\n }\n return contractRef.current;\n };\n\n // useRef for GraphQL client instance - single initialization guaranteed\n const graphqlClientRef = useRef<any | null>(null);\n const hasInitializedGraphql = useRef(false);\n const getGraphqlClient = (): any | null => {\n if (!hasInitializedGraphql.current && finalConfig.dubheMetadata) {\n try {\n console.log('Initializing GraphQL client instance (one-time)');\n graphqlClientRef.current = createDubheGraphqlClient({\n endpoint: finalConfig.endpoints?.graphql || 'http://localhost:4000/graphql',\n subscriptionEndpoint: finalConfig.endpoints?.websocket || 'ws://localhost:4000/graphql',\n dubheMetadata: finalConfig.dubheMetadata\n });\n hasInitializedGraphql.current = true;\n } catch (error) {\n console.error('GraphQL client initialization failed:', error);\n throw error;\n }\n }\n return graphqlClientRef.current;\n };\n\n // useRef for ECS World instance - depends on GraphQL client\n const ecsWorldRef = useRef<any | null>(null);\n const hasInitializedEcs = useRef(false);\n const getEcsWorld = (): any | null => {\n const graphqlClient = getGraphqlClient();\n if (!hasInitializedEcs.current && graphqlClient) {\n try {\n console.log('Initializing ECS World instance (one-time)');\n ecsWorldRef.current = createECSWorld(graphqlClient, {\n queryConfig: {\n enableBatchOptimization: finalConfig.options?.enableBatchOptimization ?? true,\n defaultCacheTimeout: finalConfig.options?.cacheTimeout ?? 5000\n },\n subscriptionConfig: {\n defaultDebounceMs: finalConfig.options?.debounceMs ?? 100,\n reconnectOnError: finalConfig.options?.reconnectOnError ?? true\n }\n });\n hasInitializedEcs.current = true;\n } catch (error) {\n console.error('ECS World initialization failed:', error);\n throw error;\n }\n }\n return ecsWorldRef.current;\n };\n\n // Address getter - calculated from contract\n const getAddress = (): string => {\n return getContract().getAddress();\n };\n\n // Metrics getter - performance tracking\n const getMetrics = () => ({\n initTime: performance.now() - (startTimeRef.current || 0),\n requestCount: 0, // Can be enhanced with actual tracking\n lastActivity: Date.now()\n });\n\n // Context value - stable reference (no re-renders for consumers)\n const contextValue: DubheContextValue = {\n getContract,\n getGraphqlClient,\n getEcsWorld,\n getAddress,\n getMetrics,\n config: finalConfig\n };\n\n return <DubheContext.Provider value={contextValue}>{children}</DubheContext.Provider>;\n}\n\n/**\n * Custom hook to access Dubhe context\n * Provides type-safe access to all Dubhe client instances\n *\n * @returns DubheContextValue with all client getters and config\n * @throws Error if used outside of DubheProvider\n *\n * @example\n * ```typescript\n * function MyComponent() {\n * const dubheContext = useDubheContext();\n *\n * const contract = dubheContext.getContract();\n * const graphqlClient = dubheContext.getGraphqlClient();\n * const ecsWorld = dubheContext.getEcsWorld();\n * const address = dubheContext.getAddress();\n *\n * return <div>Connected as {address}</div>;\n * }\n * ```\n */\nexport function useDubheContext(): DubheContextValue {\n const context = useContext(DubheContext);\n\n if (!context) {\n throw new Error(\n 'useDubheContext must be used within a DubheProvider. ' +\n 'Make sure to wrap your app with <DubheProvider config={...}>'\n );\n }\n\n return context;\n}\n\n/**\n * Enhanced hook that mimics the original useDubhe API\n * Uses the Provider pattern internally but maintains backward compatibility\n *\n * @returns DubheReturn object with all instances and metadata\n *\n * @example\n * ```typescript\n * function MyComponent() {\n * const { contract, graphqlClient, ecsWorld, address } = useDubheFromProvider();\n *\n * const handleTransaction = async () => {\n * const tx = new Transaction();\n * await contract.tx.my_system.my_method({ tx });\n * };\n *\n * return <button onClick={handleTransaction}>Execute</button>;\n * }\n * ```\n */\nexport function useDubheFromProvider(): DubheReturn {\n const context = useDubheContext();\n\n // Get instances (lazy initialization via getters)\n const contract = context.getContract();\n const graphqlClient = context.getGraphqlClient();\n const ecsWorld = context.getEcsWorld();\n const address = context.getAddress();\n const metrics = context.getMetrics();\n\n // Enhanced contract with additional methods (similar to original implementation)\n const enhancedContract = contract as any;\n\n // Add transaction methods with error handling (if not already added)\n if (!enhancedContract.txWithOptions) {\n enhancedContract.txWithOptions = (system: string, method: string, options: any = {}) => {\n return async (params: any) => {\n try {\n const startTime = performance.now();\n const result = await contract.tx[system][method](params);\n const executionTime = performance.now() - startTime;\n\n if (process.env.NODE_ENV === 'development') {\n console.log(\n `Transaction ${system}.${method} completed in ${executionTime.toFixed(2)}ms`\n );\n }\n\n options.onSuccess?.(result);\n return result;\n } catch (error) {\n options.onError?.(error);\n throw error;\n }\n };\n };\n }\n\n // Add query methods with performance tracking (if not already added)\n if (!enhancedContract.queryWithOptions) {\n enhancedContract.queryWithOptions = (system: string, method: string, _options: any = {}) => {\n return async (params: any) => {\n const startTime = performance.now();\n const result = await contract.query[system][method](params);\n const executionTime = performance.now() - startTime;\n\n if (process.env.NODE_ENV === 'development') {\n console.log(`Query ${system}.${method} completed in ${executionTime.toFixed(2)}ms`);\n }\n\n return result;\n };\n };\n }\n\n return {\n contract: enhancedContract,\n graphqlClient,\n ecsWorld,\n metadata: context.config.metadata,\n network: context.config.network,\n packageId: context.config.packageId,\n dubheSchemaId: context.config.dubheSchemaId,\n address,\n options: context.config.options,\n metrics\n };\n}\n\n/**\n * Individual client hooks for components that only need specific instances\n * These are more efficient than useDubheFromProvider for single-client usage\n */\n\n/**\n * Hook for accessing only the Dubhe contract instance\n */\nexport function useDubheContractFromProvider(): Dubhe {\n const { contract } = useDubheFromProvider();\n return contract;\n}\n\n/**\n * Hook for accessing only the GraphQL client instance\n */\nexport function useDubheGraphQLFromProvider(): any | null {\n const { getGraphqlClient } = useDubheContext();\n return getGraphqlClient();\n}\n\n/**\n * Hook for accessing only the ECS World instance\n */\nexport function useDubheECSFromProvider(): any | null {\n const { getEcsWorld } = useDubheContext();\n return getEcsWorld();\n}\n","/**\n * Modern Dubhe React Hooks - Provider Pattern\n *\n * Features:\n * - 🎯 Simple API design with Provider pattern\n * - ⚡ Single client initialization with useRef\n * - 🔧 Configuration-driven setup (developers handle environment variables themselves)\n * - 🛡️ Complete type safety with strict TypeScript\n * - 📦 Context-based client sharing across components\n */\nimport { Dubhe } from '@0xobelisk/sui-client';\n\nimport {\n useDubheFromProvider,\n useDubheContractFromProvider,\n useDubheGraphQLFromProvider,\n useDubheECSFromProvider\n} from './provider';\nimport type { DubheReturn } from './types';\n\n/**\n * Primary Hook: useDubhe\n *\n * Uses Provider pattern to access shared Dubhe clients with guaranteed single initialization.\n * Must be used within a DubheProvider.\n *\n * @returns Complete Dubhe ecosystem with contract, GraphQL, ECS, and metadata\n *\n * @example\n * ```typescript\n * // App setup with Provider\n * function App() {\n * const config = {\n * network: 'devnet',\n * packageId: '0x123...',\n * metadata: contractMetadata,\n * credentials: {\n * secretKey: process.env.NEXT_PUBLIC_PRIVATE_KEY\n * }\n * };\n *\n * return (\n * <DubheProvider config={config}>\n * <MyDApp />\n * </DubheProvider>\n * );\n * }\n *\n * // Component usage\n * function MyDApp() {\n * const { contract, address } = useDubhe();\n * return <div>Connected as {address}</div>;\n * }\n * ```\n */\nexport function useDubhe(): DubheReturn {\n return useDubheFromProvider();\n}\n\n/**\n * Individual Instance Hook: useDubheContract\n *\n * Returns only the Dubhe contract instance from Provider context.\n * More efficient than useDubhe() when only contract access is needed.\n *\n * @returns Dubhe contract instance\n *\n * @example\n * ```typescript\n * function TransactionComponent() {\n * const contract = useDubheContract();\n *\n * const handleTransaction = async () => {\n * const tx = new Transaction();\n * await contract.tx.my_system.my_method({ tx });\n * };\n *\n * return <button onClick={handleTransaction}>Execute</button>;\n * }\n * ```\n */\nexport function useDubheContract(): Dubhe {\n return useDubheContractFromProvider();\n}\n\n/**\n * Individual Instance Hook: useDubheGraphQL\n *\n * Returns only the GraphQL client from Provider context.\n * More efficient than useDubhe() when only GraphQL access is needed.\n *\n * @returns GraphQL client instance (null if dubheMetadata not provided)\n *\n * @example\n * ```typescript\n * function DataComponent() {\n * const graphqlClient = useDubheGraphQL();\n *\n * useEffect(() => {\n * if (graphqlClient) {\n * graphqlClient.query({ ... }).then(setData);\n * }\n * }, [graphqlClient]);\n *\n * return <div>{data && JSON.stringify(data)}</div>;\n * }\n * ```\n */\nexport function useDubheGraphQL(): any | null {\n return useDubheGraphQLFromProvider();\n}\n\n/**\n * Individual Instance Hook: useDubheECS\n *\n * Returns only the ECS World instance from Provider context.\n * More efficient than useDubhe() when only ECS access is needed.\n *\n * @returns ECS World instance (null if GraphQL client not available)\n *\n * @example\n * ```typescript\n * function ECSComponent() {\n * const ecsWorld = useDubheECS();\n *\n * useEffect(() => {\n * if (ecsWorld) {\n * ecsWorld.getComponent('MyComponent').then(setComponent);\n * }\n * }, [ecsWorld]);\n *\n * return <div>ECS Component Data</div>;\n * }\n * ```\n */\nexport function useDubheECS(): any | null {\n return useDubheECSFromProvider();\n}\n\n/**\n * Compatibility alias for useDubhe\n */\nexport const useContract = useDubhe;\n"],"mappings":"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","names":["import_react"]}
package/dist/index.mjs CHANGED
@@ -10,7 +10,7 @@ import {
10
10
  useDubheECS,
11
11
  useDubheGraphQL,
12
12
  validateConfig
13
- } from "./chunk-XI35QBSQ.mjs";
13
+ } from "./chunk-7KXBMX2H.mjs";
14
14
  export {
15
15
  DEFAULT_CONFIG,
16
16
  DubheProvider,
package/dist/sui/index.js CHANGED
@@ -305,7 +305,7 @@ function useDubheFromProvider() {
305
305
  };
306
306
  }
307
307
  if (!enhancedContract.queryWithOptions) {
308
- enhancedContract.queryWithOptions = (system, method, options = {}) => {
308
+ enhancedContract.queryWithOptions = (system, method, _options = {}) => {
309
309
  return async (params) => {
310
310
  const startTime = performance.now();
311
311
  const result = await contract.query[system][method](params);
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/sui/index.ts","../../src/sui/config.ts","../../src/sui/utils.ts","../../src/sui/provider.tsx","../../src/sui/hooks.ts"],"sourcesContent":["/**\n * @0xobelisk/react/sui - Modern Dubhe React Integration\n *\n * 🚀 Simple, powerful, type-safe Sui blockchain development experience\n *\n * Features:\n * - ⚡ Auto-initialization with environment variable support\n * - 🔧 Configuration-driven setup with smart defaults\n * - 🛡️ Complete type safety with strict TypeScript\n * - 📦 Direct instance access without connection state management\n * - 🎯 Intuitive API design following React best practices\n */\n\n// ============ Type Exports ============\nexport type { NetworkType, DubheConfig, DubheReturn, ContractReturn } from './types';\n\n// ============ Configuration Management ============\nexport { useDubheConfig, DEFAULT_CONFIG } from './config';\n\nexport { mergeConfigurations, validateConfig, getConfigSummary } from './utils';\n\n// ============ Provider Component ============\nexport { DubheProvider } from './provider';\n\n// ============ Modern React Hooks ============\nexport {\n // Primary Hook - Provider pattern\n useDubhe,\n\n // Compatibility alias\n useContract,\n\n // Individual Instance Hooks - optimized for specific use cases\n useDubheContract,\n useDubheGraphQL,\n useDubheECS\n} from './hooks';\n","/**\n * Configuration Management for Dubhe React Integration\n *\n * Features:\n * - Type-safe configuration interface\n * - Configuration validation and error handling\n * - Smart merging of defaults and explicit config\n * - No environment variable handling (developers should handle environment variables themselves)\n */\n\nimport { useMemo } from 'react';\nimport type { DubheConfig, NetworkType } from './types';\nimport { mergeConfigurations, validateConfig } from './utils';\n\n/**\n * Default configuration object with sensible defaults\n */\nexport const DEFAULT_CONFIG: Partial<DubheConfig> = {\n endpoints: {\n graphql: 'http://localhost:4000/graphql',\n websocket: 'ws://localhost:4000/graphql'\n },\n options: {\n enableBatchOptimization: true,\n cacheTimeout: 5000,\n debounceMs: 100,\n reconnectOnError: true\n }\n};\n\n/**\n * Configuration Hook: useDubheConfig\n *\n * Merges defaults with explicit configuration provided by the developer\n *\n * Note: Environment variables should be handled by the developer before passing to this hook\n *\n * @param config - Complete or partial configuration object\n * @returns Complete, validated DubheConfig\n *\n * @example\n * ```typescript\n * // Basic usage with explicit config\n * const config = useDubheConfig({\n * network: 'testnet',\n * packageId: '0x123...',\n * metadata: contractMetadata,\n * credentials: {\n * secretKey: process.env.NEXT_PUBLIC_PRIVATE_KEY // Handle env vars yourself\n * }\n * });\n *\n * // With helper function to handle environment variables\n * const getConfigFromEnv = () => ({\n * network: process.env.NEXT_PUBLIC_NETWORK as NetworkType,\n * packageId: process.env.NEXT_PUBLIC_PACKAGE_ID,\n * credentials: {\n * secretKey: process.env.NEXT_PUBLIC_PRIVATE_KEY\n * }\n * });\n *\n * const config = useDubheConfig({\n * ...getConfigFromEnv(),\n * metadata: contractMetadata\n * });\n * ```\n */\nexport function useDubheConfig(config: Partial<DubheConfig>): DubheConfig {\n // Memoize the stringified config to detect actual changes\n const configKey = useMemo(() => {\n return JSON.stringify(config);\n }, [config]);\n\n return useMemo(() => {\n // Merge configurations: defaults -> user provided config\n const mergedConfig = mergeConfigurations(DEFAULT_CONFIG, config);\n\n // Validate the final configuration\n const validatedConfig = validateConfig(mergedConfig);\n\n // if (process.env.NODE_ENV === 'development') {\n // console.log('🔧 Dubhe Config:', {\n // ...validatedConfig,\n // credentials: validatedConfig.credentials?.secretKey ? '[REDACTED]' : undefined\n // });\n // }\n\n return validatedConfig;\n }, [configKey]);\n}\n","/**\n * Utility Functions for Dubhe Configuration Management\n *\n * Features:\n * - Configuration validation and error handling\n * - Smart configuration merging with proper type safety\n * - Type-safe configuration validation\n */\n\nimport type { DubheConfig, NetworkType } from './types';\n\n/**\n * Merge multiple configuration objects with proper deep merging\n * Later configurations override earlier ones\n *\n * @param baseConfig - Base configuration (usually defaults)\n * @param overrideConfig - Override configuration (user provided)\n * @returns Merged configuration\n */\nexport function mergeConfigurations(\n baseConfig: Partial<DubheConfig>,\n overrideConfig?: Partial<DubheConfig>\n): Partial<DubheConfig> {\n if (!overrideConfig) {\n return { ...baseConfig };\n }\n\n const result: Partial<DubheConfig> = { ...baseConfig };\n\n // Merge top-level properties\n Object.assign(result, overrideConfig);\n\n // Deep merge nested objects\n if (overrideConfig.credentials || baseConfig.credentials) {\n result.credentials = {\n ...baseConfig.credentials,\n ...overrideConfig.credentials\n };\n }\n\n if (overrideConfig.endpoints || baseConfig.endpoints) {\n result.endpoints = {\n ...baseConfig.endpoints,\n ...overrideConfig.endpoints\n };\n }\n\n if (overrideConfig.options || baseConfig.options) {\n result.options = {\n ...baseConfig.options,\n ...overrideConfig.options\n };\n }\n\n return result;\n}\n\n/**\n * Validate configuration and ensure required fields are present\n * Throws descriptive errors for missing required fields\n *\n * @param config - Configuration to validate\n * @returns Validated and typed configuration\n * @throws Error if required fields are missing or invalid\n */\nexport function validateConfig(config: Partial<DubheConfig>): DubheConfig {\n const errors: string[] = [];\n\n // Check required fields\n if (!config.network) {\n errors.push('network is required');\n }\n\n if (!config.packageId) {\n errors.push('packageId is required');\n }\n\n if (!config.metadata) {\n errors.push('metadata is required');\n } else {\n // Basic metadata validation\n if (typeof config.metadata !== 'object') {\n errors.push('metadata must be an object');\n } else if (Object.keys(config.metadata).length === 0) {\n errors.push('metadata cannot be empty');\n }\n }\n\n // Validate network type\n if (config.network && !['mainnet', 'testnet', 'devnet', 'localnet'].includes(config.network)) {\n errors.push(\n `invalid network: ${config.network}. Must be one of: mainnet, testnet, devnet, localnet`\n );\n }\n\n // Validate package ID format (enhanced check)\n if (config.packageId) {\n if (!config.packageId.startsWith('0x')) {\n errors.push('packageId must start with 0x');\n } else if (config.packageId.length < 3) {\n errors.push('packageId must be longer than 0x');\n } else if (!/^0x[a-fA-F0-9]+$/.test(config.packageId)) {\n errors.push('packageId must contain only hexadecimal characters after 0x');\n }\n }\n\n // Validate dubheMetadata if provided\n if (config.dubheMetadata !== undefined) {\n if (typeof config.dubheMetadata !== 'object' || config.dubheMetadata === null) {\n errors.push('dubheMetadata must be an object');\n } else if (!config.dubheMetadata.components && !config.dubheMetadata.resources) {\n errors.push('dubheMetadata must contain components or resources');\n }\n }\n\n // Validate credentials if provided\n if (config.credentials) {\n if (config.credentials.secretKey && typeof config.credentials.secretKey !== 'string') {\n errors.push('credentials.secretKey must be a string');\n }\n if (config.credentials.mnemonics && typeof config.credentials.mnemonics !== 'string') {\n errors.push('credentials.mnemonics must be a string');\n }\n }\n\n // Validate URLs if provided\n if (config.endpoints?.graphql && !isValidUrl(config.endpoints.graphql)) {\n errors.push('endpoints.graphql must be a valid URL');\n }\n\n if (config.endpoints?.websocket && !isValidUrl(config.endpoints.websocket)) {\n errors.push('endpoints.websocket must be a valid URL');\n }\n\n // Validate numeric options\n if (\n config.options?.cacheTimeout !== undefined &&\n (typeof config.options.cacheTimeout !== 'number' || config.options.cacheTimeout < 0)\n ) {\n errors.push('options.cacheTimeout must be a non-negative number');\n }\n\n if (\n config.options?.debounceMs !== undefined &&\n (typeof config.options.debounceMs !== 'number' || config.options.debounceMs < 0)\n ) {\n errors.push('options.debounceMs must be a non-negative number');\n }\n\n if (errors.length > 0) {\n const errorMessage = `Invalid Dubhe configuration (${errors.length} error${errors.length > 1 ? 's' : ''}):\\n${errors.map((e) => `- ${e}`).join('\\n')}`;\n console.error('Configuration validation failed:', { errors, config });\n throw new Error(errorMessage);\n }\n\n return config as DubheConfig;\n}\n\n/**\n * Simple URL validation helper\n *\n * @param url - URL string to validate\n * @returns true if URL is valid, false otherwise\n */\nfunction isValidUrl(url: string): boolean {\n try {\n new URL(url);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Generate a configuration summary for debugging\n * Hides sensitive information like private keys\n *\n * @param config - Configuration to summarize\n * @returns Safe configuration summary\n */\nexport function getConfigSummary(config: DubheConfig): object {\n return {\n network: config.network,\n packageId: config.packageId,\n dubheSchemaId: config.dubheSchemaId,\n hasMetadata: !!config.metadata,\n hasDubheMetadata: !!config.dubheMetadata,\n hasCredentials: !!config.credentials?.secretKey,\n endpoints: config.endpoints,\n options: config.options\n };\n}\n","/**\n * Dubhe Provider - useRef Pattern for Client Management\n *\n * Features:\n * - 🎯 Single client instances across application lifecycle\n * - ⚡ useRef-based storage (no re-initialization on re-renders)\n * - 🔧 Provider pattern for dependency injection\n * - 🛡️ Complete type safety with strict TypeScript\n * - 📦 Context-based client sharing\n */\n\nimport React, { createContext, useContext, useRef, ReactNode } from 'react';\nimport { Dubhe } from '@0xobelisk/sui-client';\nimport { createDubheGraphqlClient } from '@0xobelisk/graphql-client';\nimport { createECSWorld } from '@0xobelisk/ecs';\nimport { useDubheConfig } from './config';\nimport type { DubheConfig, DubheReturn } from './types';\n\n/**\n * Context interface for Dubhe client instances\n * All clients are stored using useRef to ensure single initialization\n */\ninterface DubheContextValue {\n getContract: () => Dubhe;\n getGraphqlClient: () => any | null;\n getEcsWorld: () => any | null;\n getAddress: () => string;\n getMetrics: () => {\n initTime: number;\n requestCount: number;\n lastActivity: number;\n };\n config: DubheConfig;\n}\n\n/**\n * Context for sharing Dubhe clients across the application\n * Uses useRef pattern to ensure clients are created only once\n */\nconst DubheContext = createContext<DubheContextValue | null>(null);\n\n/**\n * Props interface for DubheProvider component\n */\ninterface DubheProviderProps {\n /** Configuration for Dubhe initialization */\n config: Partial<DubheConfig>;\n /** Child components that will have access to Dubhe clients */\n children: ReactNode;\n}\n\n/**\n * DubheProvider Component - useRef Pattern Implementation\n *\n * This Provider uses useRef to store client instances, ensuring they are:\n * 1. Created only once during component lifecycle\n * 2. Persisted across re-renders without re-initialization\n * 3. Shared efficiently via React Context\n *\n * Key advantages over useMemo:\n * - useRef guarantees single initialization (useMemo can re-run on dependency changes)\n * - No dependency array needed (eliminates potential re-initialization bugs)\n * - Better performance for heavy client objects\n * - Clearer separation of concerns via Provider pattern\n *\n * @param props - Provider props containing config and children\n * @returns Provider component wrapping children with Dubhe context\n *\n * @example\n * ```typescript\n * // App root setup\n * function App() {\n * const dubheConfig = {\n * network: 'devnet',\n * packageId: '0x123...',\n * metadata: contractMetadata,\n * credentials: {\n * secretKey: process.env.NEXT_PUBLIC_PRIVATE_KEY\n * }\n * };\n *\n * return (\n * <DubheProvider config={dubheConfig}>\n * <MyApplication />\n * </DubheProvider>\n * );\n * }\n * ```\n */\nexport function DubheProvider({ config, children }: DubheProviderProps) {\n // Merge configuration with defaults (only runs once)\n const finalConfig = useDubheConfig(config);\n\n // Track initialization start time (useRef ensures single timestamp)\n const startTimeRef = useRef<number>(performance.now());\n\n // useRef for contract instance - guarantees single initialization\n // Unlike useMemo, useRef.current is never re-calculated\n const contractRef = useRef<Dubhe | undefined>(undefined);\n const getContract = (): Dubhe => {\n if (!contractRef.current) {\n try {\n console.log('Initializing Dubhe contract instance (one-time)');\n contractRef.current = new Dubhe({\n networkType: finalConfig.network,\n packageId: finalConfig.packageId,\n metadata: finalConfig.metadata,\n secretKey: finalConfig.credentials?.secretKey\n });\n } catch (error) {\n console.error('Contract initialization failed:', error);\n throw error;\n }\n }\n return contractRef.current;\n };\n\n // useRef for GraphQL client instance - single initialization guaranteed\n const graphqlClientRef = useRef<any | null>(null);\n const hasInitializedGraphql = useRef(false);\n const getGraphqlClient = (): any | null => {\n if (!hasInitializedGraphql.current && finalConfig.dubheMetadata) {\n try {\n console.log('Initializing GraphQL client instance (one-time)');\n graphqlClientRef.current = createDubheGraphqlClient({\n endpoint: finalConfig.endpoints?.graphql || 'http://localhost:4000/graphql',\n subscriptionEndpoint: finalConfig.endpoints?.websocket || 'ws://localhost:4000/graphql',\n dubheMetadata: finalConfig.dubheMetadata\n });\n hasInitializedGraphql.current = true;\n } catch (error) {\n console.error('GraphQL client initialization failed:', error);\n throw error;\n }\n }\n return graphqlClientRef.current;\n };\n\n // useRef for ECS World instance - depends on GraphQL client\n const ecsWorldRef = useRef<any | null>(null);\n const hasInitializedEcs = useRef(false);\n const getEcsWorld = (): any | null => {\n const graphqlClient = getGraphqlClient();\n if (!hasInitializedEcs.current && graphqlClient) {\n try {\n console.log('Initializing ECS World instance (one-time)');\n ecsWorldRef.current = createECSWorld(graphqlClient, {\n queryConfig: {\n enableBatchOptimization: finalConfig.options?.enableBatchOptimization ?? true,\n defaultCacheTimeout: finalConfig.options?.cacheTimeout ?? 5000\n },\n subscriptionConfig: {\n defaultDebounceMs: finalConfig.options?.debounceMs ?? 100,\n reconnectOnError: finalConfig.options?.reconnectOnError ?? true\n }\n });\n hasInitializedEcs.current = true;\n } catch (error) {\n console.error('ECS World initialization failed:', error);\n throw error;\n }\n }\n return ecsWorldRef.current;\n };\n\n // Address getter - calculated from contract\n const getAddress = (): string => {\n return getContract().getAddress();\n };\n\n // Metrics getter - performance tracking\n const getMetrics = () => ({\n initTime: performance.now() - (startTimeRef.current || 0),\n requestCount: 0, // Can be enhanced with actual tracking\n lastActivity: Date.now()\n });\n\n // Context value - stable reference (no re-renders for consumers)\n const contextValue: DubheContextValue = {\n getContract,\n getGraphqlClient,\n getEcsWorld,\n getAddress,\n getMetrics,\n config: finalConfig\n };\n\n return <DubheContext.Provider value={contextValue}>{children}</DubheContext.Provider>;\n}\n\n/**\n * Custom hook to access Dubhe context\n * Provides type-safe access to all Dubhe client instances\n *\n * @returns DubheContextValue with all client getters and config\n * @throws Error if used outside of DubheProvider\n *\n * @example\n * ```typescript\n * function MyComponent() {\n * const dubheContext = useDubheContext();\n *\n * const contract = dubheContext.getContract();\n * const graphqlClient = dubheContext.getGraphqlClient();\n * const ecsWorld = dubheContext.getEcsWorld();\n * const address = dubheContext.getAddress();\n *\n * return <div>Connected as {address}</div>;\n * }\n * ```\n */\nexport function useDubheContext(): DubheContextValue {\n const context = useContext(DubheContext);\n\n if (!context) {\n throw new Error(\n 'useDubheContext must be used within a DubheProvider. ' +\n 'Make sure to wrap your app with <DubheProvider config={...}>'\n );\n }\n\n return context;\n}\n\n/**\n * Enhanced hook that mimics the original useDubhe API\n * Uses the Provider pattern internally but maintains backward compatibility\n *\n * @returns DubheReturn object with all instances and metadata\n *\n * @example\n * ```typescript\n * function MyComponent() {\n * const { contract, graphqlClient, ecsWorld, address } = useDubheFromProvider();\n *\n * const handleTransaction = async () => {\n * const tx = new Transaction();\n * await contract.tx.my_system.my_method({ tx });\n * };\n *\n * return <button onClick={handleTransaction}>Execute</button>;\n * }\n * ```\n */\nexport function useDubheFromProvider(): DubheReturn {\n const context = useDubheContext();\n\n // Get instances (lazy initialization via getters)\n const contract = context.getContract();\n const graphqlClient = context.getGraphqlClient();\n const ecsWorld = context.getEcsWorld();\n const address = context.getAddress();\n const metrics = context.getMetrics();\n\n // Enhanced contract with additional methods (similar to original implementation)\n const enhancedContract = contract as any;\n\n // Add transaction methods with error handling (if not already added)\n if (!enhancedContract.txWithOptions) {\n enhancedContract.txWithOptions = (system: string, method: string, options: any = {}) => {\n return async (params: any) => {\n try {\n const startTime = performance.now();\n const result = await contract.tx[system][method](params);\n const executionTime = performance.now() - startTime;\n\n if (process.env.NODE_ENV === 'development') {\n console.log(\n `Transaction ${system}.${method} completed in ${executionTime.toFixed(2)}ms`\n );\n }\n\n options.onSuccess?.(result);\n return result;\n } catch (error) {\n options.onError?.(error);\n throw error;\n }\n };\n };\n }\n\n // Add query methods with performance tracking (if not already added)\n if (!enhancedContract.queryWithOptions) {\n enhancedContract.queryWithOptions = (system: string, method: string, options: any = {}) => {\n return async (params: any) => {\n const startTime = performance.now();\n const result = await contract.query[system][method](params);\n const executionTime = performance.now() - startTime;\n\n if (process.env.NODE_ENV === 'development') {\n console.log(`Query ${system}.${method} completed in ${executionTime.toFixed(2)}ms`);\n }\n\n return result;\n };\n };\n }\n\n return {\n contract: enhancedContract,\n graphqlClient,\n ecsWorld,\n metadata: context.config.metadata,\n network: context.config.network,\n packageId: context.config.packageId,\n dubheSchemaId: context.config.dubheSchemaId,\n address,\n options: context.config.options,\n metrics\n };\n}\n\n/**\n * Individual client hooks for components that only need specific instances\n * These are more efficient than useDubheFromProvider for single-client usage\n */\n\n/**\n * Hook for accessing only the Dubhe contract instance\n */\nexport function useDubheContractFromProvider(): Dubhe {\n const { contract } = useDubheFromProvider();\n return contract;\n}\n\n/**\n * Hook for accessing only the GraphQL client instance\n */\nexport function useDubheGraphQLFromProvider(): any | null {\n const { getGraphqlClient } = useDubheContext();\n return getGraphqlClient();\n}\n\n/**\n * Hook for accessing only the ECS World instance\n */\nexport function useDubheECSFromProvider(): any | null {\n const { getEcsWorld } = useDubheContext();\n return getEcsWorld();\n}\n","/**\n * Modern Dubhe React Hooks - Provider Pattern\n *\n * Features:\n * - 🎯 Simple API design with Provider pattern\n * - ⚡ Single client initialization with useRef\n * - 🔧 Configuration-driven setup (developers handle environment variables themselves)\n * - 🛡️ Complete type safety with strict TypeScript\n * - 📦 Context-based client sharing across components\n */\nimport { Dubhe } from '@0xobelisk/sui-client';\n\nimport {\n useDubheContext,\n useDubheFromProvider,\n useDubheContractFromProvider,\n useDubheGraphQLFromProvider,\n useDubheECSFromProvider\n} from './provider';\nimport type { DubheConfig, DubheReturn } from './types';\n\n/**\n * Primary Hook: useDubhe\n *\n * Uses Provider pattern to access shared Dubhe clients with guaranteed single initialization.\n * Must be used within a DubheProvider.\n *\n * @returns Complete Dubhe ecosystem with contract, GraphQL, ECS, and metadata\n *\n * @example\n * ```typescript\n * // App setup with Provider\n * function App() {\n * const config = {\n * network: 'devnet',\n * packageId: '0x123...',\n * metadata: contractMetadata,\n * credentials: {\n * secretKey: process.env.NEXT_PUBLIC_PRIVATE_KEY\n * }\n * };\n *\n * return (\n * <DubheProvider config={config}>\n * <MyDApp />\n * </DubheProvider>\n * );\n * }\n *\n * // Component usage\n * function MyDApp() {\n * const { contract, address } = useDubhe();\n * return <div>Connected as {address}</div>;\n * }\n * ```\n */\nexport function useDubhe(): DubheReturn {\n return useDubheFromProvider();\n}\n\n/**\n * Individual Instance Hook: useDubheContract\n *\n * Returns only the Dubhe contract instance from Provider context.\n * More efficient than useDubhe() when only contract access is needed.\n *\n * @returns Dubhe contract instance\n *\n * @example\n * ```typescript\n * function TransactionComponent() {\n * const contract = useDubheContract();\n *\n * const handleTransaction = async () => {\n * const tx = new Transaction();\n * await contract.tx.my_system.my_method({ tx });\n * };\n *\n * return <button onClick={handleTransaction}>Execute</button>;\n * }\n * ```\n */\nexport function useDubheContract(): Dubhe {\n return useDubheContractFromProvider();\n}\n\n/**\n * Individual Instance Hook: useDubheGraphQL\n *\n * Returns only the GraphQL client from Provider context.\n * More efficient than useDubhe() when only GraphQL access is needed.\n *\n * @returns GraphQL client instance (null if dubheMetadata not provided)\n *\n * @example\n * ```typescript\n * function DataComponent() {\n * const graphqlClient = useDubheGraphQL();\n *\n * useEffect(() => {\n * if (graphqlClient) {\n * graphqlClient.query({ ... }).then(setData);\n * }\n * }, [graphqlClient]);\n *\n * return <div>{data && JSON.stringify(data)}</div>;\n * }\n * ```\n */\nexport function useDubheGraphQL(): any | null {\n return useDubheGraphQLFromProvider();\n}\n\n/**\n * Individual Instance Hook: useDubheECS\n *\n * Returns only the ECS World instance from Provider context.\n * More efficient than useDubhe() when only ECS access is needed.\n *\n * @returns ECS World instance (null if GraphQL client not available)\n *\n * @example\n * ```typescript\n * function ECSComponent() {\n * const ecsWorld = useDubheECS();\n *\n * useEffect(() => {\n * if (ecsWorld) {\n * ecsWorld.getComponent('MyComponent').then(setComponent);\n * }\n * }, [ecsWorld]);\n *\n * return <div>ECS Component Data</div>;\n * }\n * ```\n */\nexport function useDubheECS(): any | null {\n return useDubheECSFromProvider();\n}\n\n/**\n * Compatibility alias for useDubhe\n */\nexport const useContract = useDubhe;\n"],"mappings":"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","names":["import_react"]}
1
+ {"version":3,"sources":["../../src/sui/index.ts","../../src/sui/config.ts","../../src/sui/utils.ts","../../src/sui/provider.tsx","../../src/sui/hooks.ts"],"sourcesContent":["/**\n * @0xobelisk/react/sui - Modern Dubhe React Integration\n *\n * 🚀 Simple, powerful, type-safe Sui blockchain development experience\n *\n * Features:\n * - ⚡ Auto-initialization with environment variable support\n * - 🔧 Configuration-driven setup with smart defaults\n * - 🛡️ Complete type safety with strict TypeScript\n * - 📦 Direct instance access without connection state management\n * - 🎯 Intuitive API design following React best practices\n */\n\n// ============ Type Exports ============\nexport type { NetworkType, DubheConfig, DubheReturn, ContractReturn } from './types';\n\n// ============ Configuration Management ============\nexport { useDubheConfig, DEFAULT_CONFIG } from './config';\n\nexport { mergeConfigurations, validateConfig, getConfigSummary } from './utils';\n\n// ============ Provider Component ============\nexport { DubheProvider } from './provider';\n\n// ============ Modern React Hooks ============\nexport {\n // Primary Hook - Provider pattern\n useDubhe,\n\n // Compatibility alias\n useContract,\n\n // Individual Instance Hooks - optimized for specific use cases\n useDubheContract,\n useDubheGraphQL,\n useDubheECS\n} from './hooks';\n","/**\n * Configuration Management for Dubhe React Integration\n *\n * Features:\n * - Type-safe configuration interface\n * - Configuration validation and error handling\n * - Smart merging of defaults and explicit config\n * - No environment variable handling (developers should handle environment variables themselves)\n */\n\nimport { useMemo } from 'react';\nimport type { DubheConfig } from './types';\nimport { mergeConfigurations, validateConfig } from './utils';\n\n/**\n * Default configuration object with sensible defaults\n */\nexport const DEFAULT_CONFIG: Partial<DubheConfig> = {\n endpoints: {\n graphql: 'http://localhost:4000/graphql',\n websocket: 'ws://localhost:4000/graphql'\n },\n options: {\n enableBatchOptimization: true,\n cacheTimeout: 5000,\n debounceMs: 100,\n reconnectOnError: true\n }\n};\n\n/**\n * Configuration Hook: useDubheConfig\n *\n * Merges defaults with explicit configuration provided by the developer\n *\n * Note: Environment variables should be handled by the developer before passing to this hook\n *\n * @param config - Complete or partial configuration object\n * @returns Complete, validated DubheConfig\n *\n * @example\n * ```typescript\n * // Basic usage with explicit config\n * const config = useDubheConfig({\n * network: 'testnet',\n * packageId: '0x123...',\n * metadata: contractMetadata,\n * credentials: {\n * secretKey: process.env.NEXT_PUBLIC_PRIVATE_KEY // Handle env vars yourself\n * }\n * });\n *\n * // With helper function to handle environment variables\n * const getConfigFromEnv = () => ({\n * network: process.env.NEXT_PUBLIC_NETWORK as NetworkType,\n * packageId: process.env.NEXT_PUBLIC_PACKAGE_ID,\n * credentials: {\n * secretKey: process.env.NEXT_PUBLIC_PRIVATE_KEY\n * }\n * });\n *\n * const config = useDubheConfig({\n * ...getConfigFromEnv(),\n * metadata: contractMetadata\n * });\n * ```\n */\nexport function useDubheConfig(config: Partial<DubheConfig>): DubheConfig {\n // Memoize the stringified config to detect actual changes\n const configKey = useMemo(() => {\n return JSON.stringify(config);\n }, [config]);\n\n return useMemo(() => {\n // Merge configurations: defaults -> user provided config\n const mergedConfig = mergeConfigurations(DEFAULT_CONFIG, config);\n\n // Validate the final configuration\n const validatedConfig = validateConfig(mergedConfig);\n\n // if (process.env.NODE_ENV === 'development') {\n // console.log('🔧 Dubhe Config:', {\n // ...validatedConfig,\n // credentials: validatedConfig.credentials?.secretKey ? '[REDACTED]' : undefined\n // });\n // }\n\n return validatedConfig;\n }, [configKey]);\n}\n","/**\n * Utility Functions for Dubhe Configuration Management\n *\n * Features:\n * - Configuration validation and error handling\n * - Smart configuration merging with proper type safety\n * - Type-safe configuration validation\n */\n\nimport type { DubheConfig } from './types';\n\n/**\n * Merge multiple configuration objects with proper deep merging\n * Later configurations override earlier ones\n *\n * @param baseConfig - Base configuration (usually defaults)\n * @param overrideConfig - Override configuration (user provided)\n * @returns Merged configuration\n */\nexport function mergeConfigurations(\n baseConfig: Partial<DubheConfig>,\n overrideConfig?: Partial<DubheConfig>\n): Partial<DubheConfig> {\n if (!overrideConfig) {\n return { ...baseConfig };\n }\n\n const result: Partial<DubheConfig> = { ...baseConfig };\n\n // Merge top-level properties\n Object.assign(result, overrideConfig);\n\n // Deep merge nested objects\n if (overrideConfig.credentials || baseConfig.credentials) {\n result.credentials = {\n ...baseConfig.credentials,\n ...overrideConfig.credentials\n };\n }\n\n if (overrideConfig.endpoints || baseConfig.endpoints) {\n result.endpoints = {\n ...baseConfig.endpoints,\n ...overrideConfig.endpoints\n };\n }\n\n if (overrideConfig.options || baseConfig.options) {\n result.options = {\n ...baseConfig.options,\n ...overrideConfig.options\n };\n }\n\n return result;\n}\n\n/**\n * Validate configuration and ensure required fields are present\n * Throws descriptive errors for missing required fields\n *\n * @param config - Configuration to validate\n * @returns Validated and typed configuration\n * @throws Error if required fields are missing or invalid\n */\nexport function validateConfig(config: Partial<DubheConfig>): DubheConfig {\n const errors: string[] = [];\n\n // Check required fields\n if (!config.network) {\n errors.push('network is required');\n }\n\n if (!config.packageId) {\n errors.push('packageId is required');\n }\n\n if (!config.metadata) {\n errors.push('metadata is required');\n } else {\n // Basic metadata validation\n if (typeof config.metadata !== 'object') {\n errors.push('metadata must be an object');\n } else if (Object.keys(config.metadata).length === 0) {\n errors.push('metadata cannot be empty');\n }\n }\n\n // Validate network type\n if (config.network && !['mainnet', 'testnet', 'devnet', 'localnet'].includes(config.network)) {\n errors.push(\n `invalid network: ${config.network}. Must be one of: mainnet, testnet, devnet, localnet`\n );\n }\n\n // Validate package ID format (enhanced check)\n if (config.packageId) {\n if (!config.packageId.startsWith('0x')) {\n errors.push('packageId must start with 0x');\n } else if (config.packageId.length < 3) {\n errors.push('packageId must be longer than 0x');\n } else if (!/^0x[a-fA-F0-9]+$/.test(config.packageId)) {\n errors.push('packageId must contain only hexadecimal characters after 0x');\n }\n }\n\n // Validate dubheMetadata if provided\n if (config.dubheMetadata !== undefined) {\n if (typeof config.dubheMetadata !== 'object' || config.dubheMetadata === null) {\n errors.push('dubheMetadata must be an object');\n } else if (!config.dubheMetadata.components && !config.dubheMetadata.resources) {\n errors.push('dubheMetadata must contain components or resources');\n }\n }\n\n // Validate credentials if provided\n if (config.credentials) {\n if (config.credentials.secretKey && typeof config.credentials.secretKey !== 'string') {\n errors.push('credentials.secretKey must be a string');\n }\n if (config.credentials.mnemonics && typeof config.credentials.mnemonics !== 'string') {\n errors.push('credentials.mnemonics must be a string');\n }\n }\n\n // Validate URLs if provided\n if (config.endpoints?.graphql && !isValidUrl(config.endpoints.graphql)) {\n errors.push('endpoints.graphql must be a valid URL');\n }\n\n if (config.endpoints?.websocket && !isValidUrl(config.endpoints.websocket)) {\n errors.push('endpoints.websocket must be a valid URL');\n }\n\n // Validate numeric options\n if (\n config.options?.cacheTimeout !== undefined &&\n (typeof config.options.cacheTimeout !== 'number' || config.options.cacheTimeout < 0)\n ) {\n errors.push('options.cacheTimeout must be a non-negative number');\n }\n\n if (\n config.options?.debounceMs !== undefined &&\n (typeof config.options.debounceMs !== 'number' || config.options.debounceMs < 0)\n ) {\n errors.push('options.debounceMs must be a non-negative number');\n }\n\n if (errors.length > 0) {\n const errorMessage = `Invalid Dubhe configuration (${errors.length} error${\n errors.length > 1 ? 's' : ''\n }):\\n${errors.map((e) => `- ${e}`).join('\\n')}`;\n console.error('Configuration validation failed:', { errors, config });\n throw new Error(errorMessage);\n }\n\n return config as DubheConfig;\n}\n\n/**\n * Simple URL validation helper\n *\n * @param url - URL string to validate\n * @returns true if URL is valid, false otherwise\n */\nfunction isValidUrl(url: string): boolean {\n try {\n new URL(url);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Generate a configuration summary for debugging\n * Hides sensitive information like private keys\n *\n * @param config - Configuration to summarize\n * @returns Safe configuration summary\n */\nexport function getConfigSummary(config: DubheConfig): object {\n return {\n network: config.network,\n packageId: config.packageId,\n dubheSchemaId: config.dubheSchemaId,\n hasMetadata: !!config.metadata,\n hasDubheMetadata: !!config.dubheMetadata,\n hasCredentials: !!config.credentials?.secretKey,\n endpoints: config.endpoints,\n options: config.options\n };\n}\n","/**\n * Dubhe Provider - useRef Pattern for Client Management\n *\n * Features:\n * - 🎯 Single client instances across application lifecycle\n * - ⚡ useRef-based storage (no re-initialization on re-renders)\n * - 🔧 Provider pattern for dependency injection\n * - 🛡️ Complete type safety with strict TypeScript\n * - 📦 Context-based client sharing\n */\n\nimport { createContext, useContext, useRef, ReactNode } from 'react';\nimport { Dubhe } from '@0xobelisk/sui-client';\nimport { createDubheGraphqlClient } from '@0xobelisk/graphql-client';\nimport { createECSWorld } from '@0xobelisk/ecs';\nimport { useDubheConfig } from './config';\nimport type { DubheConfig, DubheReturn } from './types';\n\n/**\n * Context interface for Dubhe client instances\n * All clients are stored using useRef to ensure single initialization\n */\ninterface DubheContextValue {\n getContract: () => Dubhe;\n getGraphqlClient: () => any | null;\n getEcsWorld: () => any | null;\n getAddress: () => string;\n getMetrics: () => {\n initTime: number;\n requestCount: number;\n lastActivity: number;\n };\n config: DubheConfig;\n}\n\n/**\n * Context for sharing Dubhe clients across the application\n * Uses useRef pattern to ensure clients are created only once\n */\nconst DubheContext = createContext<DubheContextValue | null>(null);\n\n/**\n * Props interface for DubheProvider component\n */\ninterface DubheProviderProps {\n /** Configuration for Dubhe initialization */\n config: Partial<DubheConfig>;\n /** Child components that will have access to Dubhe clients */\n children: ReactNode;\n}\n\n/**\n * DubheProvider Component - useRef Pattern Implementation\n *\n * This Provider uses useRef to store client instances, ensuring they are:\n * 1. Created only once during component lifecycle\n * 2. Persisted across re-renders without re-initialization\n * 3. Shared efficiently via React Context\n *\n * Key advantages over useMemo:\n * - useRef guarantees single initialization (useMemo can re-run on dependency changes)\n * - No dependency array needed (eliminates potential re-initialization bugs)\n * - Better performance for heavy client objects\n * - Clearer separation of concerns via Provider pattern\n *\n * @param props - Provider props containing config and children\n * @returns Provider component wrapping children with Dubhe context\n *\n * @example\n * ```typescript\n * // App root setup\n * function App() {\n * const dubheConfig = {\n * network: 'devnet',\n * packageId: '0x123...',\n * metadata: contractMetadata,\n * credentials: {\n * secretKey: process.env.NEXT_PUBLIC_PRIVATE_KEY\n * }\n * };\n *\n * return (\n * <DubheProvider config={dubheConfig}>\n * <MyApplication />\n * </DubheProvider>\n * );\n * }\n * ```\n */\nexport function DubheProvider({ config, children }: DubheProviderProps) {\n // Merge configuration with defaults (only runs once)\n const finalConfig = useDubheConfig(config);\n\n // Track initialization start time (useRef ensures single timestamp)\n const startTimeRef = useRef<number>(performance.now());\n\n // useRef for contract instance - guarantees single initialization\n // Unlike useMemo, useRef.current is never re-calculated\n const contractRef = useRef<Dubhe | undefined>(undefined);\n const getContract = (): Dubhe => {\n if (!contractRef.current) {\n try {\n console.log('Initializing Dubhe contract instance (one-time)');\n contractRef.current = new Dubhe({\n networkType: finalConfig.network,\n packageId: finalConfig.packageId,\n metadata: finalConfig.metadata,\n secretKey: finalConfig.credentials?.secretKey\n });\n } catch (error) {\n console.error('Contract initialization failed:', error);\n throw error;\n }\n }\n return contractRef.current;\n };\n\n // useRef for GraphQL client instance - single initialization guaranteed\n const graphqlClientRef = useRef<any | null>(null);\n const hasInitializedGraphql = useRef(false);\n const getGraphqlClient = (): any | null => {\n if (!hasInitializedGraphql.current && finalConfig.dubheMetadata) {\n try {\n console.log('Initializing GraphQL client instance (one-time)');\n graphqlClientRef.current = createDubheGraphqlClient({\n endpoint: finalConfig.endpoints?.graphql || 'http://localhost:4000/graphql',\n subscriptionEndpoint: finalConfig.endpoints?.websocket || 'ws://localhost:4000/graphql',\n dubheMetadata: finalConfig.dubheMetadata\n });\n hasInitializedGraphql.current = true;\n } catch (error) {\n console.error('GraphQL client initialization failed:', error);\n throw error;\n }\n }\n return graphqlClientRef.current;\n };\n\n // useRef for ECS World instance - depends on GraphQL client\n const ecsWorldRef = useRef<any | null>(null);\n const hasInitializedEcs = useRef(false);\n const getEcsWorld = (): any | null => {\n const graphqlClient = getGraphqlClient();\n if (!hasInitializedEcs.current && graphqlClient) {\n try {\n console.log('Initializing ECS World instance (one-time)');\n ecsWorldRef.current = createECSWorld(graphqlClient, {\n queryConfig: {\n enableBatchOptimization: finalConfig.options?.enableBatchOptimization ?? true,\n defaultCacheTimeout: finalConfig.options?.cacheTimeout ?? 5000\n },\n subscriptionConfig: {\n defaultDebounceMs: finalConfig.options?.debounceMs ?? 100,\n reconnectOnError: finalConfig.options?.reconnectOnError ?? true\n }\n });\n hasInitializedEcs.current = true;\n } catch (error) {\n console.error('ECS World initialization failed:', error);\n throw error;\n }\n }\n return ecsWorldRef.current;\n };\n\n // Address getter - calculated from contract\n const getAddress = (): string => {\n return getContract().getAddress();\n };\n\n // Metrics getter - performance tracking\n const getMetrics = () => ({\n initTime: performance.now() - (startTimeRef.current || 0),\n requestCount: 0, // Can be enhanced with actual tracking\n lastActivity: Date.now()\n });\n\n // Context value - stable reference (no re-renders for consumers)\n const contextValue: DubheContextValue = {\n getContract,\n getGraphqlClient,\n getEcsWorld,\n getAddress,\n getMetrics,\n config: finalConfig\n };\n\n return <DubheContext.Provider value={contextValue}>{children}</DubheContext.Provider>;\n}\n\n/**\n * Custom hook to access Dubhe context\n * Provides type-safe access to all Dubhe client instances\n *\n * @returns DubheContextValue with all client getters and config\n * @throws Error if used outside of DubheProvider\n *\n * @example\n * ```typescript\n * function MyComponent() {\n * const dubheContext = useDubheContext();\n *\n * const contract = dubheContext.getContract();\n * const graphqlClient = dubheContext.getGraphqlClient();\n * const ecsWorld = dubheContext.getEcsWorld();\n * const address = dubheContext.getAddress();\n *\n * return <div>Connected as {address}</div>;\n * }\n * ```\n */\nexport function useDubheContext(): DubheContextValue {\n const context = useContext(DubheContext);\n\n if (!context) {\n throw new Error(\n 'useDubheContext must be used within a DubheProvider. ' +\n 'Make sure to wrap your app with <DubheProvider config={...}>'\n );\n }\n\n return context;\n}\n\n/**\n * Enhanced hook that mimics the original useDubhe API\n * Uses the Provider pattern internally but maintains backward compatibility\n *\n * @returns DubheReturn object with all instances and metadata\n *\n * @example\n * ```typescript\n * function MyComponent() {\n * const { contract, graphqlClient, ecsWorld, address } = useDubheFromProvider();\n *\n * const handleTransaction = async () => {\n * const tx = new Transaction();\n * await contract.tx.my_system.my_method({ tx });\n * };\n *\n * return <button onClick={handleTransaction}>Execute</button>;\n * }\n * ```\n */\nexport function useDubheFromProvider(): DubheReturn {\n const context = useDubheContext();\n\n // Get instances (lazy initialization via getters)\n const contract = context.getContract();\n const graphqlClient = context.getGraphqlClient();\n const ecsWorld = context.getEcsWorld();\n const address = context.getAddress();\n const metrics = context.getMetrics();\n\n // Enhanced contract with additional methods (similar to original implementation)\n const enhancedContract = contract as any;\n\n // Add transaction methods with error handling (if not already added)\n if (!enhancedContract.txWithOptions) {\n enhancedContract.txWithOptions = (system: string, method: string, options: any = {}) => {\n return async (params: any) => {\n try {\n const startTime = performance.now();\n const result = await contract.tx[system][method](params);\n const executionTime = performance.now() - startTime;\n\n if (process.env.NODE_ENV === 'development') {\n console.log(\n `Transaction ${system}.${method} completed in ${executionTime.toFixed(2)}ms`\n );\n }\n\n options.onSuccess?.(result);\n return result;\n } catch (error) {\n options.onError?.(error);\n throw error;\n }\n };\n };\n }\n\n // Add query methods with performance tracking (if not already added)\n if (!enhancedContract.queryWithOptions) {\n enhancedContract.queryWithOptions = (system: string, method: string, _options: any = {}) => {\n return async (params: any) => {\n const startTime = performance.now();\n const result = await contract.query[system][method](params);\n const executionTime = performance.now() - startTime;\n\n if (process.env.NODE_ENV === 'development') {\n console.log(`Query ${system}.${method} completed in ${executionTime.toFixed(2)}ms`);\n }\n\n return result;\n };\n };\n }\n\n return {\n contract: enhancedContract,\n graphqlClient,\n ecsWorld,\n metadata: context.config.metadata,\n network: context.config.network,\n packageId: context.config.packageId,\n dubheSchemaId: context.config.dubheSchemaId,\n address,\n options: context.config.options,\n metrics\n };\n}\n\n/**\n * Individual client hooks for components that only need specific instances\n * These are more efficient than useDubheFromProvider for single-client usage\n */\n\n/**\n * Hook for accessing only the Dubhe contract instance\n */\nexport function useDubheContractFromProvider(): Dubhe {\n const { contract } = useDubheFromProvider();\n return contract;\n}\n\n/**\n * Hook for accessing only the GraphQL client instance\n */\nexport function useDubheGraphQLFromProvider(): any | null {\n const { getGraphqlClient } = useDubheContext();\n return getGraphqlClient();\n}\n\n/**\n * Hook for accessing only the ECS World instance\n */\nexport function useDubheECSFromProvider(): any | null {\n const { getEcsWorld } = useDubheContext();\n return getEcsWorld();\n}\n","/**\n * Modern Dubhe React Hooks - Provider Pattern\n *\n * Features:\n * - 🎯 Simple API design with Provider pattern\n * - ⚡ Single client initialization with useRef\n * - 🔧 Configuration-driven setup (developers handle environment variables themselves)\n * - 🛡️ Complete type safety with strict TypeScript\n * - 📦 Context-based client sharing across components\n */\nimport { Dubhe } from '@0xobelisk/sui-client';\n\nimport {\n useDubheFromProvider,\n useDubheContractFromProvider,\n useDubheGraphQLFromProvider,\n useDubheECSFromProvider\n} from './provider';\nimport type { DubheReturn } from './types';\n\n/**\n * Primary Hook: useDubhe\n *\n * Uses Provider pattern to access shared Dubhe clients with guaranteed single initialization.\n * Must be used within a DubheProvider.\n *\n * @returns Complete Dubhe ecosystem with contract, GraphQL, ECS, and metadata\n *\n * @example\n * ```typescript\n * // App setup with Provider\n * function App() {\n * const config = {\n * network: 'devnet',\n * packageId: '0x123...',\n * metadata: contractMetadata,\n * credentials: {\n * secretKey: process.env.NEXT_PUBLIC_PRIVATE_KEY\n * }\n * };\n *\n * return (\n * <DubheProvider config={config}>\n * <MyDApp />\n * </DubheProvider>\n * );\n * }\n *\n * // Component usage\n * function MyDApp() {\n * const { contract, address } = useDubhe();\n * return <div>Connected as {address}</div>;\n * }\n * ```\n */\nexport function useDubhe(): DubheReturn {\n return useDubheFromProvider();\n}\n\n/**\n * Individual Instance Hook: useDubheContract\n *\n * Returns only the Dubhe contract instance from Provider context.\n * More efficient than useDubhe() when only contract access is needed.\n *\n * @returns Dubhe contract instance\n *\n * @example\n * ```typescript\n * function TransactionComponent() {\n * const contract = useDubheContract();\n *\n * const handleTransaction = async () => {\n * const tx = new Transaction();\n * await contract.tx.my_system.my_method({ tx });\n * };\n *\n * return <button onClick={handleTransaction}>Execute</button>;\n * }\n * ```\n */\nexport function useDubheContract(): Dubhe {\n return useDubheContractFromProvider();\n}\n\n/**\n * Individual Instance Hook: useDubheGraphQL\n *\n * Returns only the GraphQL client from Provider context.\n * More efficient than useDubhe() when only GraphQL access is needed.\n *\n * @returns GraphQL client instance (null if dubheMetadata not provided)\n *\n * @example\n * ```typescript\n * function DataComponent() {\n * const graphqlClient = useDubheGraphQL();\n *\n * useEffect(() => {\n * if (graphqlClient) {\n * graphqlClient.query({ ... }).then(setData);\n * }\n * }, [graphqlClient]);\n *\n * return <div>{data && JSON.stringify(data)}</div>;\n * }\n * ```\n */\nexport function useDubheGraphQL(): any | null {\n return useDubheGraphQLFromProvider();\n}\n\n/**\n * Individual Instance Hook: useDubheECS\n *\n * Returns only the ECS World instance from Provider context.\n * More efficient than useDubhe() when only ECS access is needed.\n *\n * @returns ECS World instance (null if GraphQL client not available)\n *\n * @example\n * ```typescript\n * function ECSComponent() {\n * const ecsWorld = useDubheECS();\n *\n * useEffect(() => {\n * if (ecsWorld) {\n * ecsWorld.getComponent('MyComponent').then(setComponent);\n * }\n * }, [ecsWorld]);\n *\n * return <div>ECS Component Data</div>;\n * }\n * ```\n */\nexport function useDubheECS(): any | null {\n return useDubheECSFromProvider();\n}\n\n/**\n * Compatibility alias for useDubhe\n */\nexport const useContract = useDubhe;\n"],"mappings":"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","names":["import_react"]}
@@ -10,7 +10,7 @@ import {
10
10
  useDubheECS,
11
11
  useDubheGraphQL,
12
12
  validateConfig
13
- } from "../chunk-XI35QBSQ.mjs";
13
+ } from "../chunk-7KXBMX2H.mjs";
14
14
  export {
15
15
  DEFAULT_CONFIG,
16
16
  DubheProvider,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@0xobelisk/react",
3
- "version": "1.2.0-pre.70",
3
+ "version": "1.2.0-pre.72",
4
4
  "description": "React integration for Dubhe framework with Sui blockchain support",
5
5
  "keywords": [
6
6
  "dubhe",
@@ -41,8 +41,8 @@
41
41
  "dependencies": {
42
42
  "@nanostores/react": "^0.8.0",
43
43
  "nanostores": "^0.11.4",
44
- "@0xobelisk/graphql-client": "1.2.0-pre.70",
45
- "@0xobelisk/ecs": "1.2.0-pre.70"
44
+ "@0xobelisk/ecs": "1.2.0-pre.72",
45
+ "@0xobelisk/graphql-client": "1.2.0-pre.72"
46
46
  },
47
47
  "devDependencies": {
48
48
  "@types/node": "^20.8.7",
@@ -50,7 +50,7 @@
50
50
  "@types/react-dom": "^19.0.0",
51
51
  "@typescript-eslint/eslint-plugin": "^6.8.0",
52
52
  "@typescript-eslint/parser": "^6.8.0",
53
- "eslint": "^8.56.0",
53
+ "eslint": "^9.0.0",
54
54
  "eslint-config-prettier": "^9.1.0",
55
55
  "eslint-plugin-prettier": "^5.0.1",
56
56
  "prettier": "3.3.3",
@@ -58,13 +58,13 @@
58
58
  "react-dom": "^18.0.0",
59
59
  "tsup": "^7.1.0",
60
60
  "typescript": "^5.2.2",
61
- "@0xobelisk/sui-client": "1.2.0-pre.70"
61
+ "@0xobelisk/sui-client": "1.2.0-pre.72"
62
62
  },
63
63
  "peerDependencies": {
64
64
  "react": "^18.0.0 || ^19.0.0",
65
65
  "react-dom": "^18.0.0 || ^19.0.0",
66
66
  "zod": "^3.25.0 || ^4.0.0",
67
- "@0xobelisk/sui-client": "1.2.0-pre.70"
67
+ "@0xobelisk/sui-client": "1.2.0-pre.72"
68
68
  },
69
69
  "peerDependenciesMeta": {
70
70
  "@0xobelisk/sui-client": {
@@ -91,7 +91,7 @@
91
91
  "format": "prettier --write .",
92
92
  "format:check": "prettier --check .",
93
93
  "format:fix": "prettier --write '**/*.{ts,tsx,json,md}'",
94
- "lint:fix": "eslint . --ext .ts,.tsx --fix",
94
+ "lint": "eslint . --ext .ts --ext .tsx",
95
95
  "test": "pnpm test:typecheck",
96
96
  "test:typecheck": "tsc --noEmit",
97
97
  "type-check": "tsc --noEmit",
package/src/sui/config.ts CHANGED
@@ -9,7 +9,7 @@
9
9
  */
10
10
 
11
11
  import { useMemo } from 'react';
12
- import type { DubheConfig, NetworkType } from './types';
12
+ import type { DubheConfig } from './types';
13
13
  import { mergeConfigurations, validateConfig } from './utils';
14
14
 
15
15
  /**
package/src/sui/hooks.ts CHANGED
@@ -11,13 +11,12 @@
11
11
  import { Dubhe } from '@0xobelisk/sui-client';
12
12
 
13
13
  import {
14
- useDubheContext,
15
14
  useDubheFromProvider,
16
15
  useDubheContractFromProvider,
17
16
  useDubheGraphQLFromProvider,
18
17
  useDubheECSFromProvider
19
18
  } from './provider';
20
- import type { DubheConfig, DubheReturn } from './types';
19
+ import type { DubheReturn } from './types';
21
20
 
22
21
  /**
23
22
  * Primary Hook: useDubhe
@@ -9,7 +9,7 @@
9
9
  * - 📦 Context-based client sharing
10
10
  */
11
11
 
12
- import React, { createContext, useContext, useRef, ReactNode } from 'react';
12
+ import { createContext, useContext, useRef, ReactNode } from 'react';
13
13
  import { Dubhe } from '@0xobelisk/sui-client';
14
14
  import { createDubheGraphqlClient } from '@0xobelisk/graphql-client';
15
15
  import { createECSWorld } from '@0xobelisk/ecs';
@@ -282,7 +282,7 @@ export function useDubheFromProvider(): DubheReturn {
282
282
 
283
283
  // Add query methods with performance tracking (if not already added)
284
284
  if (!enhancedContract.queryWithOptions) {
285
- enhancedContract.queryWithOptions = (system: string, method: string, options: any = {}) => {
285
+ enhancedContract.queryWithOptions = (system: string, method: string, _options: any = {}) => {
286
286
  return async (params: any) => {
287
287
  const startTime = performance.now();
288
288
  const result = await contract.query[system][method](params);
package/src/sui/utils.ts CHANGED
@@ -7,7 +7,7 @@
7
7
  * - Type-safe configuration validation
8
8
  */
9
9
 
10
- import type { DubheConfig, NetworkType } from './types';
10
+ import type { DubheConfig } from './types';
11
11
 
12
12
  /**
13
13
  * Merge multiple configuration objects with proper deep merging
@@ -148,7 +148,9 @@ export function validateConfig(config: Partial<DubheConfig>): DubheConfig {
148
148
  }
149
149
 
150
150
  if (errors.length > 0) {
151
- const errorMessage = `Invalid Dubhe configuration (${errors.length} error${errors.length > 1 ? 's' : ''}):\n${errors.map((e) => `- ${e}`).join('\n')}`;
151
+ const errorMessage = `Invalid Dubhe configuration (${errors.length} error${
152
+ errors.length > 1 ? 's' : ''
153
+ }):\n${errors.map((e) => `- ${e}`).join('\n')}`;
152
154
  console.error('Configuration validation failed:', { errors, config });
153
155
  throw new Error(errorMessage);
154
156
  }
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/sui/config.ts","../src/sui/utils.ts","../src/sui/provider.tsx","../src/sui/hooks.ts"],"sourcesContent":["/**\n * Configuration Management for Dubhe React Integration\n *\n * Features:\n * - Type-safe configuration interface\n * - Configuration validation and error handling\n * - Smart merging of defaults and explicit config\n * - No environment variable handling (developers should handle environment variables themselves)\n */\n\nimport { useMemo } from 'react';\nimport type { DubheConfig, NetworkType } from './types';\nimport { mergeConfigurations, validateConfig } from './utils';\n\n/**\n * Default configuration object with sensible defaults\n */\nexport const DEFAULT_CONFIG: Partial<DubheConfig> = {\n endpoints: {\n graphql: 'http://localhost:4000/graphql',\n websocket: 'ws://localhost:4000/graphql'\n },\n options: {\n enableBatchOptimization: true,\n cacheTimeout: 5000,\n debounceMs: 100,\n reconnectOnError: true\n }\n};\n\n/**\n * Configuration Hook: useDubheConfig\n *\n * Merges defaults with explicit configuration provided by the developer\n *\n * Note: Environment variables should be handled by the developer before passing to this hook\n *\n * @param config - Complete or partial configuration object\n * @returns Complete, validated DubheConfig\n *\n * @example\n * ```typescript\n * // Basic usage with explicit config\n * const config = useDubheConfig({\n * network: 'testnet',\n * packageId: '0x123...',\n * metadata: contractMetadata,\n * credentials: {\n * secretKey: process.env.NEXT_PUBLIC_PRIVATE_KEY // Handle env vars yourself\n * }\n * });\n *\n * // With helper function to handle environment variables\n * const getConfigFromEnv = () => ({\n * network: process.env.NEXT_PUBLIC_NETWORK as NetworkType,\n * packageId: process.env.NEXT_PUBLIC_PACKAGE_ID,\n * credentials: {\n * secretKey: process.env.NEXT_PUBLIC_PRIVATE_KEY\n * }\n * });\n *\n * const config = useDubheConfig({\n * ...getConfigFromEnv(),\n * metadata: contractMetadata\n * });\n * ```\n */\nexport function useDubheConfig(config: Partial<DubheConfig>): DubheConfig {\n // Memoize the stringified config to detect actual changes\n const configKey = useMemo(() => {\n return JSON.stringify(config);\n }, [config]);\n\n return useMemo(() => {\n // Merge configurations: defaults -> user provided config\n const mergedConfig = mergeConfigurations(DEFAULT_CONFIG, config);\n\n // Validate the final configuration\n const validatedConfig = validateConfig(mergedConfig);\n\n // if (process.env.NODE_ENV === 'development') {\n // console.log('🔧 Dubhe Config:', {\n // ...validatedConfig,\n // credentials: validatedConfig.credentials?.secretKey ? '[REDACTED]' : undefined\n // });\n // }\n\n return validatedConfig;\n }, [configKey]);\n}\n","/**\n * Utility Functions for Dubhe Configuration Management\n *\n * Features:\n * - Configuration validation and error handling\n * - Smart configuration merging with proper type safety\n * - Type-safe configuration validation\n */\n\nimport type { DubheConfig, NetworkType } from './types';\n\n/**\n * Merge multiple configuration objects with proper deep merging\n * Later configurations override earlier ones\n *\n * @param baseConfig - Base configuration (usually defaults)\n * @param overrideConfig - Override configuration (user provided)\n * @returns Merged configuration\n */\nexport function mergeConfigurations(\n baseConfig: Partial<DubheConfig>,\n overrideConfig?: Partial<DubheConfig>\n): Partial<DubheConfig> {\n if (!overrideConfig) {\n return { ...baseConfig };\n }\n\n const result: Partial<DubheConfig> = { ...baseConfig };\n\n // Merge top-level properties\n Object.assign(result, overrideConfig);\n\n // Deep merge nested objects\n if (overrideConfig.credentials || baseConfig.credentials) {\n result.credentials = {\n ...baseConfig.credentials,\n ...overrideConfig.credentials\n };\n }\n\n if (overrideConfig.endpoints || baseConfig.endpoints) {\n result.endpoints = {\n ...baseConfig.endpoints,\n ...overrideConfig.endpoints\n };\n }\n\n if (overrideConfig.options || baseConfig.options) {\n result.options = {\n ...baseConfig.options,\n ...overrideConfig.options\n };\n }\n\n return result;\n}\n\n/**\n * Validate configuration and ensure required fields are present\n * Throws descriptive errors for missing required fields\n *\n * @param config - Configuration to validate\n * @returns Validated and typed configuration\n * @throws Error if required fields are missing or invalid\n */\nexport function validateConfig(config: Partial<DubheConfig>): DubheConfig {\n const errors: string[] = [];\n\n // Check required fields\n if (!config.network) {\n errors.push('network is required');\n }\n\n if (!config.packageId) {\n errors.push('packageId is required');\n }\n\n if (!config.metadata) {\n errors.push('metadata is required');\n } else {\n // Basic metadata validation\n if (typeof config.metadata !== 'object') {\n errors.push('metadata must be an object');\n } else if (Object.keys(config.metadata).length === 0) {\n errors.push('metadata cannot be empty');\n }\n }\n\n // Validate network type\n if (config.network && !['mainnet', 'testnet', 'devnet', 'localnet'].includes(config.network)) {\n errors.push(\n `invalid network: ${config.network}. Must be one of: mainnet, testnet, devnet, localnet`\n );\n }\n\n // Validate package ID format (enhanced check)\n if (config.packageId) {\n if (!config.packageId.startsWith('0x')) {\n errors.push('packageId must start with 0x');\n } else if (config.packageId.length < 3) {\n errors.push('packageId must be longer than 0x');\n } else if (!/^0x[a-fA-F0-9]+$/.test(config.packageId)) {\n errors.push('packageId must contain only hexadecimal characters after 0x');\n }\n }\n\n // Validate dubheMetadata if provided\n if (config.dubheMetadata !== undefined) {\n if (typeof config.dubheMetadata !== 'object' || config.dubheMetadata === null) {\n errors.push('dubheMetadata must be an object');\n } else if (!config.dubheMetadata.components && !config.dubheMetadata.resources) {\n errors.push('dubheMetadata must contain components or resources');\n }\n }\n\n // Validate credentials if provided\n if (config.credentials) {\n if (config.credentials.secretKey && typeof config.credentials.secretKey !== 'string') {\n errors.push('credentials.secretKey must be a string');\n }\n if (config.credentials.mnemonics && typeof config.credentials.mnemonics !== 'string') {\n errors.push('credentials.mnemonics must be a string');\n }\n }\n\n // Validate URLs if provided\n if (config.endpoints?.graphql && !isValidUrl(config.endpoints.graphql)) {\n errors.push('endpoints.graphql must be a valid URL');\n }\n\n if (config.endpoints?.websocket && !isValidUrl(config.endpoints.websocket)) {\n errors.push('endpoints.websocket must be a valid URL');\n }\n\n // Validate numeric options\n if (\n config.options?.cacheTimeout !== undefined &&\n (typeof config.options.cacheTimeout !== 'number' || config.options.cacheTimeout < 0)\n ) {\n errors.push('options.cacheTimeout must be a non-negative number');\n }\n\n if (\n config.options?.debounceMs !== undefined &&\n (typeof config.options.debounceMs !== 'number' || config.options.debounceMs < 0)\n ) {\n errors.push('options.debounceMs must be a non-negative number');\n }\n\n if (errors.length > 0) {\n const errorMessage = `Invalid Dubhe configuration (${errors.length} error${errors.length > 1 ? 's' : ''}):\\n${errors.map((e) => `- ${e}`).join('\\n')}`;\n console.error('Configuration validation failed:', { errors, config });\n throw new Error(errorMessage);\n }\n\n return config as DubheConfig;\n}\n\n/**\n * Simple URL validation helper\n *\n * @param url - URL string to validate\n * @returns true if URL is valid, false otherwise\n */\nfunction isValidUrl(url: string): boolean {\n try {\n new URL(url);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Generate a configuration summary for debugging\n * Hides sensitive information like private keys\n *\n * @param config - Configuration to summarize\n * @returns Safe configuration summary\n */\nexport function getConfigSummary(config: DubheConfig): object {\n return {\n network: config.network,\n packageId: config.packageId,\n dubheSchemaId: config.dubheSchemaId,\n hasMetadata: !!config.metadata,\n hasDubheMetadata: !!config.dubheMetadata,\n hasCredentials: !!config.credentials?.secretKey,\n endpoints: config.endpoints,\n options: config.options\n };\n}\n","/**\n * Dubhe Provider - useRef Pattern for Client Management\n *\n * Features:\n * - 🎯 Single client instances across application lifecycle\n * - ⚡ useRef-based storage (no re-initialization on re-renders)\n * - 🔧 Provider pattern for dependency injection\n * - 🛡️ Complete type safety with strict TypeScript\n * - 📦 Context-based client sharing\n */\n\nimport React, { createContext, useContext, useRef, ReactNode } from 'react';\nimport { Dubhe } from '@0xobelisk/sui-client';\nimport { createDubheGraphqlClient } from '@0xobelisk/graphql-client';\nimport { createECSWorld } from '@0xobelisk/ecs';\nimport { useDubheConfig } from './config';\nimport type { DubheConfig, DubheReturn } from './types';\n\n/**\n * Context interface for Dubhe client instances\n * All clients are stored using useRef to ensure single initialization\n */\ninterface DubheContextValue {\n getContract: () => Dubhe;\n getGraphqlClient: () => any | null;\n getEcsWorld: () => any | null;\n getAddress: () => string;\n getMetrics: () => {\n initTime: number;\n requestCount: number;\n lastActivity: number;\n };\n config: DubheConfig;\n}\n\n/**\n * Context for sharing Dubhe clients across the application\n * Uses useRef pattern to ensure clients are created only once\n */\nconst DubheContext = createContext<DubheContextValue | null>(null);\n\n/**\n * Props interface for DubheProvider component\n */\ninterface DubheProviderProps {\n /** Configuration for Dubhe initialization */\n config: Partial<DubheConfig>;\n /** Child components that will have access to Dubhe clients */\n children: ReactNode;\n}\n\n/**\n * DubheProvider Component - useRef Pattern Implementation\n *\n * This Provider uses useRef to store client instances, ensuring they are:\n * 1. Created only once during component lifecycle\n * 2. Persisted across re-renders without re-initialization\n * 3. Shared efficiently via React Context\n *\n * Key advantages over useMemo:\n * - useRef guarantees single initialization (useMemo can re-run on dependency changes)\n * - No dependency array needed (eliminates potential re-initialization bugs)\n * - Better performance for heavy client objects\n * - Clearer separation of concerns via Provider pattern\n *\n * @param props - Provider props containing config and children\n * @returns Provider component wrapping children with Dubhe context\n *\n * @example\n * ```typescript\n * // App root setup\n * function App() {\n * const dubheConfig = {\n * network: 'devnet',\n * packageId: '0x123...',\n * metadata: contractMetadata,\n * credentials: {\n * secretKey: process.env.NEXT_PUBLIC_PRIVATE_KEY\n * }\n * };\n *\n * return (\n * <DubheProvider config={dubheConfig}>\n * <MyApplication />\n * </DubheProvider>\n * );\n * }\n * ```\n */\nexport function DubheProvider({ config, children }: DubheProviderProps) {\n // Merge configuration with defaults (only runs once)\n const finalConfig = useDubheConfig(config);\n\n // Track initialization start time (useRef ensures single timestamp)\n const startTimeRef = useRef<number>(performance.now());\n\n // useRef for contract instance - guarantees single initialization\n // Unlike useMemo, useRef.current is never re-calculated\n const contractRef = useRef<Dubhe | undefined>(undefined);\n const getContract = (): Dubhe => {\n if (!contractRef.current) {\n try {\n console.log('Initializing Dubhe contract instance (one-time)');\n contractRef.current = new Dubhe({\n networkType: finalConfig.network,\n packageId: finalConfig.packageId,\n metadata: finalConfig.metadata,\n secretKey: finalConfig.credentials?.secretKey\n });\n } catch (error) {\n console.error('Contract initialization failed:', error);\n throw error;\n }\n }\n return contractRef.current;\n };\n\n // useRef for GraphQL client instance - single initialization guaranteed\n const graphqlClientRef = useRef<any | null>(null);\n const hasInitializedGraphql = useRef(false);\n const getGraphqlClient = (): any | null => {\n if (!hasInitializedGraphql.current && finalConfig.dubheMetadata) {\n try {\n console.log('Initializing GraphQL client instance (one-time)');\n graphqlClientRef.current = createDubheGraphqlClient({\n endpoint: finalConfig.endpoints?.graphql || 'http://localhost:4000/graphql',\n subscriptionEndpoint: finalConfig.endpoints?.websocket || 'ws://localhost:4000/graphql',\n dubheMetadata: finalConfig.dubheMetadata\n });\n hasInitializedGraphql.current = true;\n } catch (error) {\n console.error('GraphQL client initialization failed:', error);\n throw error;\n }\n }\n return graphqlClientRef.current;\n };\n\n // useRef for ECS World instance - depends on GraphQL client\n const ecsWorldRef = useRef<any | null>(null);\n const hasInitializedEcs = useRef(false);\n const getEcsWorld = (): any | null => {\n const graphqlClient = getGraphqlClient();\n if (!hasInitializedEcs.current && graphqlClient) {\n try {\n console.log('Initializing ECS World instance (one-time)');\n ecsWorldRef.current = createECSWorld(graphqlClient, {\n queryConfig: {\n enableBatchOptimization: finalConfig.options?.enableBatchOptimization ?? true,\n defaultCacheTimeout: finalConfig.options?.cacheTimeout ?? 5000\n },\n subscriptionConfig: {\n defaultDebounceMs: finalConfig.options?.debounceMs ?? 100,\n reconnectOnError: finalConfig.options?.reconnectOnError ?? true\n }\n });\n hasInitializedEcs.current = true;\n } catch (error) {\n console.error('ECS World initialization failed:', error);\n throw error;\n }\n }\n return ecsWorldRef.current;\n };\n\n // Address getter - calculated from contract\n const getAddress = (): string => {\n return getContract().getAddress();\n };\n\n // Metrics getter - performance tracking\n const getMetrics = () => ({\n initTime: performance.now() - (startTimeRef.current || 0),\n requestCount: 0, // Can be enhanced with actual tracking\n lastActivity: Date.now()\n });\n\n // Context value - stable reference (no re-renders for consumers)\n const contextValue: DubheContextValue = {\n getContract,\n getGraphqlClient,\n getEcsWorld,\n getAddress,\n getMetrics,\n config: finalConfig\n };\n\n return <DubheContext.Provider value={contextValue}>{children}</DubheContext.Provider>;\n}\n\n/**\n * Custom hook to access Dubhe context\n * Provides type-safe access to all Dubhe client instances\n *\n * @returns DubheContextValue with all client getters and config\n * @throws Error if used outside of DubheProvider\n *\n * @example\n * ```typescript\n * function MyComponent() {\n * const dubheContext = useDubheContext();\n *\n * const contract = dubheContext.getContract();\n * const graphqlClient = dubheContext.getGraphqlClient();\n * const ecsWorld = dubheContext.getEcsWorld();\n * const address = dubheContext.getAddress();\n *\n * return <div>Connected as {address}</div>;\n * }\n * ```\n */\nexport function useDubheContext(): DubheContextValue {\n const context = useContext(DubheContext);\n\n if (!context) {\n throw new Error(\n 'useDubheContext must be used within a DubheProvider. ' +\n 'Make sure to wrap your app with <DubheProvider config={...}>'\n );\n }\n\n return context;\n}\n\n/**\n * Enhanced hook that mimics the original useDubhe API\n * Uses the Provider pattern internally but maintains backward compatibility\n *\n * @returns DubheReturn object with all instances and metadata\n *\n * @example\n * ```typescript\n * function MyComponent() {\n * const { contract, graphqlClient, ecsWorld, address } = useDubheFromProvider();\n *\n * const handleTransaction = async () => {\n * const tx = new Transaction();\n * await contract.tx.my_system.my_method({ tx });\n * };\n *\n * return <button onClick={handleTransaction}>Execute</button>;\n * }\n * ```\n */\nexport function useDubheFromProvider(): DubheReturn {\n const context = useDubheContext();\n\n // Get instances (lazy initialization via getters)\n const contract = context.getContract();\n const graphqlClient = context.getGraphqlClient();\n const ecsWorld = context.getEcsWorld();\n const address = context.getAddress();\n const metrics = context.getMetrics();\n\n // Enhanced contract with additional methods (similar to original implementation)\n const enhancedContract = contract as any;\n\n // Add transaction methods with error handling (if not already added)\n if (!enhancedContract.txWithOptions) {\n enhancedContract.txWithOptions = (system: string, method: string, options: any = {}) => {\n return async (params: any) => {\n try {\n const startTime = performance.now();\n const result = await contract.tx[system][method](params);\n const executionTime = performance.now() - startTime;\n\n if (process.env.NODE_ENV === 'development') {\n console.log(\n `Transaction ${system}.${method} completed in ${executionTime.toFixed(2)}ms`\n );\n }\n\n options.onSuccess?.(result);\n return result;\n } catch (error) {\n options.onError?.(error);\n throw error;\n }\n };\n };\n }\n\n // Add query methods with performance tracking (if not already added)\n if (!enhancedContract.queryWithOptions) {\n enhancedContract.queryWithOptions = (system: string, method: string, options: any = {}) => {\n return async (params: any) => {\n const startTime = performance.now();\n const result = await contract.query[system][method](params);\n const executionTime = performance.now() - startTime;\n\n if (process.env.NODE_ENV === 'development') {\n console.log(`Query ${system}.${method} completed in ${executionTime.toFixed(2)}ms`);\n }\n\n return result;\n };\n };\n }\n\n return {\n contract: enhancedContract,\n graphqlClient,\n ecsWorld,\n metadata: context.config.metadata,\n network: context.config.network,\n packageId: context.config.packageId,\n dubheSchemaId: context.config.dubheSchemaId,\n address,\n options: context.config.options,\n metrics\n };\n}\n\n/**\n * Individual client hooks for components that only need specific instances\n * These are more efficient than useDubheFromProvider for single-client usage\n */\n\n/**\n * Hook for accessing only the Dubhe contract instance\n */\nexport function useDubheContractFromProvider(): Dubhe {\n const { contract } = useDubheFromProvider();\n return contract;\n}\n\n/**\n * Hook for accessing only the GraphQL client instance\n */\nexport function useDubheGraphQLFromProvider(): any | null {\n const { getGraphqlClient } = useDubheContext();\n return getGraphqlClient();\n}\n\n/**\n * Hook for accessing only the ECS World instance\n */\nexport function useDubheECSFromProvider(): any | null {\n const { getEcsWorld } = useDubheContext();\n return getEcsWorld();\n}\n","/**\n * Modern Dubhe React Hooks - Provider Pattern\n *\n * Features:\n * - 🎯 Simple API design with Provider pattern\n * - ⚡ Single client initialization with useRef\n * - 🔧 Configuration-driven setup (developers handle environment variables themselves)\n * - 🛡️ Complete type safety with strict TypeScript\n * - 📦 Context-based client sharing across components\n */\nimport { Dubhe } from '@0xobelisk/sui-client';\n\nimport {\n useDubheContext,\n useDubheFromProvider,\n useDubheContractFromProvider,\n useDubheGraphQLFromProvider,\n useDubheECSFromProvider\n} from './provider';\nimport type { DubheConfig, DubheReturn } from './types';\n\n/**\n * Primary Hook: useDubhe\n *\n * Uses Provider pattern to access shared Dubhe clients with guaranteed single initialization.\n * Must be used within a DubheProvider.\n *\n * @returns Complete Dubhe ecosystem with contract, GraphQL, ECS, and metadata\n *\n * @example\n * ```typescript\n * // App setup with Provider\n * function App() {\n * const config = {\n * network: 'devnet',\n * packageId: '0x123...',\n * metadata: contractMetadata,\n * credentials: {\n * secretKey: process.env.NEXT_PUBLIC_PRIVATE_KEY\n * }\n * };\n *\n * return (\n * <DubheProvider config={config}>\n * <MyDApp />\n * </DubheProvider>\n * );\n * }\n *\n * // Component usage\n * function MyDApp() {\n * const { contract, address } = useDubhe();\n * return <div>Connected as {address}</div>;\n * }\n * ```\n */\nexport function useDubhe(): DubheReturn {\n return useDubheFromProvider();\n}\n\n/**\n * Individual Instance Hook: useDubheContract\n *\n * Returns only the Dubhe contract instance from Provider context.\n * More efficient than useDubhe() when only contract access is needed.\n *\n * @returns Dubhe contract instance\n *\n * @example\n * ```typescript\n * function TransactionComponent() {\n * const contract = useDubheContract();\n *\n * const handleTransaction = async () => {\n * const tx = new Transaction();\n * await contract.tx.my_system.my_method({ tx });\n * };\n *\n * return <button onClick={handleTransaction}>Execute</button>;\n * }\n * ```\n */\nexport function useDubheContract(): Dubhe {\n return useDubheContractFromProvider();\n}\n\n/**\n * Individual Instance Hook: useDubheGraphQL\n *\n * Returns only the GraphQL client from Provider context.\n * More efficient than useDubhe() when only GraphQL access is needed.\n *\n * @returns GraphQL client instance (null if dubheMetadata not provided)\n *\n * @example\n * ```typescript\n * function DataComponent() {\n * const graphqlClient = useDubheGraphQL();\n *\n * useEffect(() => {\n * if (graphqlClient) {\n * graphqlClient.query({ ... }).then(setData);\n * }\n * }, [graphqlClient]);\n *\n * return <div>{data && JSON.stringify(data)}</div>;\n * }\n * ```\n */\nexport function useDubheGraphQL(): any | null {\n return useDubheGraphQLFromProvider();\n}\n\n/**\n * Individual Instance Hook: useDubheECS\n *\n * Returns only the ECS World instance from Provider context.\n * More efficient than useDubhe() when only ECS access is needed.\n *\n * @returns ECS World instance (null if GraphQL client not available)\n *\n * @example\n * ```typescript\n * function ECSComponent() {\n * const ecsWorld = useDubheECS();\n *\n * useEffect(() => {\n * if (ecsWorld) {\n * ecsWorld.getComponent('MyComponent').then(setComponent);\n * }\n * }, [ecsWorld]);\n *\n * return <div>ECS Component Data</div>;\n * }\n * ```\n */\nexport function useDubheECS(): any | null {\n return useDubheECSFromProvider();\n}\n\n/**\n * Compatibility alias for useDubhe\n */\nexport const useContract = useDubhe;\n"],"mappings":";AAUA,SAAS,eAAe;;;ACSjB,SAAS,oBACd,YACA,gBACsB;AACtB,MAAI,CAAC,gBAAgB;AACnB,WAAO,EAAE,GAAG,WAAW;AAAA,EACzB;AAEA,QAAM,SAA+B,EAAE,GAAG,WAAW;AAGrD,SAAO,OAAO,QAAQ,cAAc;AAGpC,MAAI,eAAe,eAAe,WAAW,aAAa;AACxD,WAAO,cAAc;AAAA,MACnB,GAAG,WAAW;AAAA,MACd,GAAG,eAAe;AAAA,IACpB;AAAA,EACF;AAEA,MAAI,eAAe,aAAa,WAAW,WAAW;AACpD,WAAO,YAAY;AAAA,MACjB,GAAG,WAAW;AAAA,MACd,GAAG,eAAe;AAAA,IACpB;AAAA,EACF;AAEA,MAAI,eAAe,WAAW,WAAW,SAAS;AAChD,WAAO,UAAU;AAAA,MACf,GAAG,WAAW;AAAA,MACd,GAAG,eAAe;AAAA,IACpB;AAAA,EACF;AAEA,SAAO;AACT;AAUO,SAAS,eAAe,QAA2C;AACxE,QAAM,SAAmB,CAAC;AAG1B,MAAI,CAAC,OAAO,SAAS;AACnB,WAAO,KAAK,qBAAqB;AAAA,EACnC;AAEA,MAAI,CAAC,OAAO,WAAW;AACrB,WAAO,KAAK,uBAAuB;AAAA,EACrC;AAEA,MAAI,CAAC,OAAO,UAAU;AACpB,WAAO,KAAK,sBAAsB;AAAA,EACpC,OAAO;AAEL,QAAI,OAAO,OAAO,aAAa,UAAU;AACvC,aAAO,KAAK,4BAA4B;AAAA,IAC1C,WAAW,OAAO,KAAK,OAAO,QAAQ,EAAE,WAAW,GAAG;AACpD,aAAO,KAAK,0BAA0B;AAAA,IACxC;AAAA,EACF;AAGA,MAAI,OAAO,WAAW,CAAC,CAAC,WAAW,WAAW,UAAU,UAAU,EAAE,SAAS,OAAO,OAAO,GAAG;AAC5F,WAAO;AAAA,MACL,oBAAoB,OAAO,OAAO;AAAA,IACpC;AAAA,EACF;AAGA,MAAI,OAAO,WAAW;AACpB,QAAI,CAAC,OAAO,UAAU,WAAW,IAAI,GAAG;AACtC,aAAO,KAAK,8BAA8B;AAAA,IAC5C,WAAW,OAAO,UAAU,SAAS,GAAG;AACtC,aAAO,KAAK,kCAAkC;AAAA,IAChD,WAAW,CAAC,mBAAmB,KAAK,OAAO,SAAS,GAAG;AACrD,aAAO,KAAK,6DAA6D;AAAA,IAC3E;AAAA,EACF;AAGA,MAAI,OAAO,kBAAkB,QAAW;AACtC,QAAI,OAAO,OAAO,kBAAkB,YAAY,OAAO,kBAAkB,MAAM;AAC7E,aAAO,KAAK,iCAAiC;AAAA,IAC/C,WAAW,CAAC,OAAO,cAAc,cAAc,CAAC,OAAO,cAAc,WAAW;AAC9E,aAAO,KAAK,oDAAoD;AAAA,IAClE;AAAA,EACF;AAGA,MAAI,OAAO,aAAa;AACtB,QAAI,OAAO,YAAY,aAAa,OAAO,OAAO,YAAY,cAAc,UAAU;AACpF,aAAO,KAAK,wCAAwC;AAAA,IACtD;AACA,QAAI,OAAO,YAAY,aAAa,OAAO,OAAO,YAAY,cAAc,UAAU;AACpF,aAAO,KAAK,wCAAwC;AAAA,IACtD;AAAA,EACF;AAGA,MAAI,OAAO,WAAW,WAAW,CAAC,WAAW,OAAO,UAAU,OAAO,GAAG;AACtE,WAAO,KAAK,uCAAuC;AAAA,EACrD;AAEA,MAAI,OAAO,WAAW,aAAa,CAAC,WAAW,OAAO,UAAU,SAAS,GAAG;AAC1E,WAAO,KAAK,yCAAyC;AAAA,EACvD;AAGA,MACE,OAAO,SAAS,iBAAiB,WAChC,OAAO,OAAO,QAAQ,iBAAiB,YAAY,OAAO,QAAQ,eAAe,IAClF;AACA,WAAO,KAAK,oDAAoD;AAAA,EAClE;AAEA,MACE,OAAO,SAAS,eAAe,WAC9B,OAAO,OAAO,QAAQ,eAAe,YAAY,OAAO,QAAQ,aAAa,IAC9E;AACA,WAAO,KAAK,kDAAkD;AAAA,EAChE;AAEA,MAAI,OAAO,SAAS,GAAG;AACrB,UAAM,eAAe,gCAAgC,OAAO,MAAM,SAAS,OAAO,SAAS,IAAI,MAAM,EAAE;AAAA,EAAO,OAAO,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,EAAE,KAAK,IAAI,CAAC;AACpJ,YAAQ,MAAM,oCAAoC,EAAE,QAAQ,OAAO,CAAC;AACpE,UAAM,IAAI,MAAM,YAAY;AAAA,EAC9B;AAEA,SAAO;AACT;AAQA,SAAS,WAAW,KAAsB;AACxC,MAAI;AACF,QAAI,IAAI,GAAG;AACX,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AASO,SAAS,iBAAiB,QAA6B;AAC5D,SAAO;AAAA,IACL,SAAS,OAAO;AAAA,IAChB,WAAW,OAAO;AAAA,IAClB,eAAe,OAAO;AAAA,IACtB,aAAa,CAAC,CAAC,OAAO;AAAA,IACtB,kBAAkB,CAAC,CAAC,OAAO;AAAA,IAC3B,gBAAgB,CAAC,CAAC,OAAO,aAAa;AAAA,IACtC,WAAW,OAAO;AAAA,IAClB,SAAS,OAAO;AAAA,EAClB;AACF;;;AD9KO,IAAM,iBAAuC;AAAA,EAClD,WAAW;AAAA,IACT,SAAS;AAAA,IACT,WAAW;AAAA,EACb;AAAA,EACA,SAAS;AAAA,IACP,yBAAyB;AAAA,IACzB,cAAc;AAAA,IACd,YAAY;AAAA,IACZ,kBAAkB;AAAA,EACpB;AACF;AAuCO,SAAS,eAAe,QAA2C;AAExE,QAAM,YAAY,QAAQ,MAAM;AAC9B,WAAO,KAAK,UAAU,MAAM;AAAA,EAC9B,GAAG,CAAC,MAAM,CAAC;AAEX,SAAO,QAAQ,MAAM;AAEnB,UAAM,eAAe,oBAAoB,gBAAgB,MAAM;AAG/D,UAAM,kBAAkB,eAAe,YAAY;AASnD,WAAO;AAAA,EACT,GAAG,CAAC,SAAS,CAAC;AAChB;;;AE9EA,SAAgB,eAAe,YAAY,cAAyB;AACpE,SAAS,aAAa;AACtB,SAAS,gCAAgC;AACzC,SAAS,sBAAsB;AA6KtB;AApJT,IAAM,eAAe,cAAwC,IAAI;AAkD1D,SAAS,cAAc,EAAE,QAAQ,SAAS,GAAuB;AAEtE,QAAM,cAAc,eAAe,MAAM;AAGzC,QAAM,eAAe,OAAe,YAAY,IAAI,CAAC;AAIrD,QAAM,cAAc,OAA0B,MAAS;AACvD,QAAM,cAAc,MAAa;AAC/B,QAAI,CAAC,YAAY,SAAS;AACxB,UAAI;AACF,gBAAQ,IAAI,iDAAiD;AAC7D,oBAAY,UAAU,IAAI,MAAM;AAAA,UAC9B,aAAa,YAAY;AAAA,UACzB,WAAW,YAAY;AAAA,UACvB,UAAU,YAAY;AAAA,UACtB,WAAW,YAAY,aAAa;AAAA,QACtC,CAAC;AAAA,MACH,SAAS,OAAO;AACd,gBAAQ,MAAM,mCAAmC,KAAK;AACtD,cAAM;AAAA,MACR;AAAA,IACF;AACA,WAAO,YAAY;AAAA,EACrB;AAGA,QAAM,mBAAmB,OAAmB,IAAI;AAChD,QAAM,wBAAwB,OAAO,KAAK;AAC1C,QAAM,mBAAmB,MAAkB;AACzC,QAAI,CAAC,sBAAsB,WAAW,YAAY,eAAe;AAC/D,UAAI;AACF,gBAAQ,IAAI,iDAAiD;AAC7D,yBAAiB,UAAU,yBAAyB;AAAA,UAClD,UAAU,YAAY,WAAW,WAAW;AAAA,UAC5C,sBAAsB,YAAY,WAAW,aAAa;AAAA,UAC1D,eAAe,YAAY;AAAA,QAC7B,CAAC;AACD,8BAAsB,UAAU;AAAA,MAClC,SAAS,OAAO;AACd,gBAAQ,MAAM,yCAAyC,KAAK;AAC5D,cAAM;AAAA,MACR;AAAA,IACF;AACA,WAAO,iBAAiB;AAAA,EAC1B;AAGA,QAAM,cAAc,OAAmB,IAAI;AAC3C,QAAM,oBAAoB,OAAO,KAAK;AACtC,QAAM,cAAc,MAAkB;AACpC,UAAM,gBAAgB,iBAAiB;AACvC,QAAI,CAAC,kBAAkB,WAAW,eAAe;AAC/C,UAAI;AACF,gBAAQ,IAAI,4CAA4C;AACxD,oBAAY,UAAU,eAAe,eAAe;AAAA,UAClD,aAAa;AAAA,YACX,yBAAyB,YAAY,SAAS,2BAA2B;AAAA,YACzE,qBAAqB,YAAY,SAAS,gBAAgB;AAAA,UAC5D;AAAA,UACA,oBAAoB;AAAA,YAClB,mBAAmB,YAAY,SAAS,cAAc;AAAA,YACtD,kBAAkB,YAAY,SAAS,oBAAoB;AAAA,UAC7D;AAAA,QACF,CAAC;AACD,0BAAkB,UAAU;AAAA,MAC9B,SAAS,OAAO;AACd,gBAAQ,MAAM,oCAAoC,KAAK;AACvD,cAAM;AAAA,MACR;AAAA,IACF;AACA,WAAO,YAAY;AAAA,EACrB;AAGA,QAAM,aAAa,MAAc;AAC/B,WAAO,YAAY,EAAE,WAAW;AAAA,EAClC;AAGA,QAAM,aAAa,OAAO;AAAA,IACxB,UAAU,YAAY,IAAI,KAAK,aAAa,WAAW;AAAA,IACvD,cAAc;AAAA;AAAA,IACd,cAAc,KAAK,IAAI;AAAA,EACzB;AAGA,QAAM,eAAkC;AAAA,IACtC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,QAAQ;AAAA,EACV;AAEA,SAAO,oBAAC,aAAa,UAAb,EAAsB,OAAO,cAAe,UAAS;AAC/D;AAuBO,SAAS,kBAAqC;AACnD,QAAM,UAAU,WAAW,YAAY;AAEvC,MAAI,CAAC,SAAS;AACZ,UAAM,IAAI;AAAA,MACR;AAAA,IAEF;AAAA,EACF;AAEA,SAAO;AACT;AAsBO,SAAS,uBAAoC;AAClD,QAAM,UAAU,gBAAgB;AAGhC,QAAM,WAAW,QAAQ,YAAY;AACrC,QAAM,gBAAgB,QAAQ,iBAAiB;AAC/C,QAAM,WAAW,QAAQ,YAAY;AACrC,QAAM,UAAU,QAAQ,WAAW;AACnC,QAAM,UAAU,QAAQ,WAAW;AAGnC,QAAM,mBAAmB;AAGzB,MAAI,CAAC,iBAAiB,eAAe;AACnC,qBAAiB,gBAAgB,CAAC,QAAgB,QAAgB,UAAe,CAAC,MAAM;AACtF,aAAO,OAAO,WAAgB;AAC5B,YAAI;AACF,gBAAM,YAAY,YAAY,IAAI;AAClC,gBAAM,SAAS,MAAM,SAAS,GAAG,MAAM,EAAE,MAAM,EAAE,MAAM;AACvD,gBAAM,gBAAgB,YAAY,IAAI,IAAI;AAE1C,cAAI,QAAQ,IAAI,aAAa,eAAe;AAC1C,oBAAQ;AAAA,cACN,eAAe,MAAM,IAAI,MAAM,iBAAiB,cAAc,QAAQ,CAAC,CAAC;AAAA,YAC1E;AAAA,UACF;AAEA,kBAAQ,YAAY,MAAM;AAC1B,iBAAO;AAAA,QACT,SAAS,OAAO;AACd,kBAAQ,UAAU,KAAK;AACvB,gBAAM;AAAA,QACR;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,MAAI,CAAC,iBAAiB,kBAAkB;AACtC,qBAAiB,mBAAmB,CAAC,QAAgB,QAAgB,UAAe,CAAC,MAAM;AACzF,aAAO,OAAO,WAAgB;AAC5B,cAAM,YAAY,YAAY,IAAI;AAClC,cAAM,SAAS,MAAM,SAAS,MAAM,MAAM,EAAE,MAAM,EAAE,MAAM;AAC1D,cAAM,gBAAgB,YAAY,IAAI,IAAI;AAE1C,YAAI,QAAQ,IAAI,aAAa,eAAe;AAC1C,kBAAQ,IAAI,SAAS,MAAM,IAAI,MAAM,iBAAiB,cAAc,QAAQ,CAAC,CAAC,IAAI;AAAA,QACpF;AAEA,eAAO;AAAA,MACT;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL,UAAU;AAAA,IACV;AAAA,IACA;AAAA,IACA,UAAU,QAAQ,OAAO;AAAA,IACzB,SAAS,QAAQ,OAAO;AAAA,IACxB,WAAW,QAAQ,OAAO;AAAA,IAC1B,eAAe,QAAQ,OAAO;AAAA,IAC9B;AAAA,IACA,SAAS,QAAQ,OAAO;AAAA,IACxB;AAAA,EACF;AACF;AAUO,SAAS,+BAAsC;AACpD,QAAM,EAAE,SAAS,IAAI,qBAAqB;AAC1C,SAAO;AACT;AAKO,SAAS,8BAA0C;AACxD,QAAM,EAAE,iBAAiB,IAAI,gBAAgB;AAC7C,SAAO,iBAAiB;AAC1B;AAKO,SAAS,0BAAsC;AACpD,QAAM,EAAE,YAAY,IAAI,gBAAgB;AACxC,SAAO,YAAY;AACrB;;;AC5RO,SAAS,WAAwB;AACtC,SAAO,qBAAqB;AAC9B;AAwBO,SAAS,mBAA0B;AACxC,SAAO,6BAA6B;AACtC;AAyBO,SAAS,kBAA8B;AAC5C,SAAO,4BAA4B;AACrC;AAyBO,SAAS,cAA0B;AACxC,SAAO,wBAAwB;AACjC;AAKO,IAAM,cAAc;","names":[]}