@nexushub/client 0.4.0 → 0.4.2
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/dist/chunk-FMMFQP5O.cjs +2643 -0
- package/dist/chunk-G4SHBWAQ.js +2643 -0
- package/dist/cli.cjs +77 -80
- package/dist/content/local-cache-client.cjs +3 -1
- package/dist/content/local-cache-client.js +2 -0
- package/dist/content/local-cache-server.cjs +78 -72
- package/dist/content/local-cache-server.d.cts +5 -20
- package/dist/content/local-cache-server.d.ts +5 -20
- package/dist/content/local-cache-server.js +77 -71
- package/dist/index.cjs +3 -2568
- package/dist/index.d.cts +4 -359
- package/dist/index.d.ts +4 -359
- package/dist/index.js +23 -2588
- package/dist/react-C795ypnM.d.cts +386 -0
- package/dist/react-C795ypnM.d.ts +386 -0
- package/dist/react.cjs +17 -0
- package/dist/react.d.cts +3 -0
- package/dist/react.d.ts +3 -0
- package/dist/react.js +17 -0
- package/package.json +16 -2
|
@@ -0,0 +1,386 @@
|
|
|
1
|
+
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
|
+
import React from 'react';
|
|
3
|
+
|
|
4
|
+
interface MinimalNexusConfig {
|
|
5
|
+
apiUrl?: string;
|
|
6
|
+
analyticsUrl?: string;
|
|
7
|
+
apiKey?: string;
|
|
8
|
+
projectId?: string;
|
|
9
|
+
}
|
|
10
|
+
declare const DEFAULT_API_URL = "https://endpoints.gnexus.co.tz";
|
|
11
|
+
declare const DEFAULT_ANALYTICS_URL = "https://sentry.gnexus.co.tz";
|
|
12
|
+
declare const LOCAL_NEST_URL = "https://endpoints.gnexus.co.tz";
|
|
13
|
+
declare const LOCAL_RUST_URL = "https://sentry.gnexus.co.tz";
|
|
14
|
+
declare const getEnvConfig: () => MinimalNexusConfig;
|
|
15
|
+
declare const mergeConfigs: (base: MinimalNexusConfig, override: Partial<MinimalNexusConfig>) => MinimalNexusConfig;
|
|
16
|
+
declare const getFullConfig: (partialConfig?: Partial<MinimalNexusConfig>) => MinimalNexusConfig;
|
|
17
|
+
declare const validateConfig: (config: MinimalNexusConfig) => string[];
|
|
18
|
+
|
|
19
|
+
interface NexusConfig extends MinimalNexusConfig {
|
|
20
|
+
debug?: boolean;
|
|
21
|
+
cacheStrategy?: 'memory' | 'localStorage' | 'none';
|
|
22
|
+
revalidateTime?: number;
|
|
23
|
+
timeout?: number;
|
|
24
|
+
retries?: number;
|
|
25
|
+
}
|
|
26
|
+
interface NexusConfig {
|
|
27
|
+
projectId: string;
|
|
28
|
+
apiUrl: string;
|
|
29
|
+
}
|
|
30
|
+
interface ContentResponse<T = any> {
|
|
31
|
+
id: string;
|
|
32
|
+
type: string;
|
|
33
|
+
data: T;
|
|
34
|
+
meta: {
|
|
35
|
+
version: number;
|
|
36
|
+
updatedAt: string;
|
|
37
|
+
locale?: string;
|
|
38
|
+
cacheStatus: 'hit' | 'miss' | 'stale';
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
interface CollectionResponse<T = any> {
|
|
42
|
+
items: T[];
|
|
43
|
+
total: number;
|
|
44
|
+
page: number;
|
|
45
|
+
limit: number;
|
|
46
|
+
totalPages: number;
|
|
47
|
+
hasNext: boolean;
|
|
48
|
+
hasPrev: boolean;
|
|
49
|
+
meta?: {
|
|
50
|
+
fetchedAt: string;
|
|
51
|
+
cacheStatus: string;
|
|
52
|
+
filters?: Record<string, any>;
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
interface CacheMetadata {
|
|
56
|
+
timestamp: number;
|
|
57
|
+
etag?: string;
|
|
58
|
+
expiresAt: number;
|
|
59
|
+
tags: string[];
|
|
60
|
+
}
|
|
61
|
+
interface CacheEntry<T = any> {
|
|
62
|
+
data: T;
|
|
63
|
+
metadata: CacheMetadata;
|
|
64
|
+
}
|
|
65
|
+
interface CollectionQuery {
|
|
66
|
+
page?: number;
|
|
67
|
+
limit?: number;
|
|
68
|
+
sort?: string;
|
|
69
|
+
order?: 'asc' | 'desc';
|
|
70
|
+
filter?: Record<string, any>;
|
|
71
|
+
fields?: string[];
|
|
72
|
+
search?: string;
|
|
73
|
+
include?: string[];
|
|
74
|
+
}
|
|
75
|
+
interface ErrorResponse {
|
|
76
|
+
code: string;
|
|
77
|
+
message: string;
|
|
78
|
+
details?: any;
|
|
79
|
+
timestamp: string;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
declare class ContentEngine {
|
|
83
|
+
private config;
|
|
84
|
+
private localCache;
|
|
85
|
+
private memoryCache;
|
|
86
|
+
private browserCache?;
|
|
87
|
+
private rateLimiter;
|
|
88
|
+
private backoff;
|
|
89
|
+
private requestBatcher;
|
|
90
|
+
private circuitBreaker;
|
|
91
|
+
private defaultRevalidate;
|
|
92
|
+
private cacheStrategy;
|
|
93
|
+
private abortController?;
|
|
94
|
+
private isServer;
|
|
95
|
+
constructor(config: NexusConfig);
|
|
96
|
+
/**
|
|
97
|
+
* Fetch a Single Page with full strategy pipeline
|
|
98
|
+
*/
|
|
99
|
+
getPage<T = any>(slug: string, options?: {
|
|
100
|
+
revalidate?: number;
|
|
101
|
+
tags?: string[];
|
|
102
|
+
forceRefresh?: boolean;
|
|
103
|
+
includeMetadata?: boolean;
|
|
104
|
+
}): Promise<T>;
|
|
105
|
+
private _getPage;
|
|
106
|
+
/**
|
|
107
|
+
* Fetch a Collection (Optimized)
|
|
108
|
+
*/
|
|
109
|
+
getCollection<T = any>(collectionId: string, query?: CollectionQuery, options?: {
|
|
110
|
+
revalidate?: number;
|
|
111
|
+
tags?: string[];
|
|
112
|
+
forceRefresh?: boolean;
|
|
113
|
+
includeMetadata?: boolean;
|
|
114
|
+
}): Promise<CollectionResponse<T>>;
|
|
115
|
+
private _getCollection;
|
|
116
|
+
/**
|
|
117
|
+
* Fetch Global Settings with nested includes support
|
|
118
|
+
*/
|
|
119
|
+
getGlobals<T = any>(options?: {
|
|
120
|
+
include?: string[];
|
|
121
|
+
revalidate?: number;
|
|
122
|
+
forceRefresh?: boolean;
|
|
123
|
+
}): Promise<T>;
|
|
124
|
+
/**
|
|
125
|
+
* Get a single item from a collection (Uses Request Batching)
|
|
126
|
+
* If you call this 10 times in a loop, it sends 1 HTTP request.
|
|
127
|
+
*/
|
|
128
|
+
getItem<T = any>(collectionId: string, itemId: string, options?: {
|
|
129
|
+
revalidate?: number;
|
|
130
|
+
tags?: string[];
|
|
131
|
+
include?: string[];
|
|
132
|
+
}): Promise<T>;
|
|
133
|
+
/**
|
|
134
|
+
* Search across collections
|
|
135
|
+
*/
|
|
136
|
+
search<T = any>(query: string, options?: {
|
|
137
|
+
collections?: string[];
|
|
138
|
+
fields?: string[];
|
|
139
|
+
limit?: number;
|
|
140
|
+
revalidate?: number;
|
|
141
|
+
}): Promise<{
|
|
142
|
+
results: T[];
|
|
143
|
+
total: number;
|
|
144
|
+
}>;
|
|
145
|
+
/**
|
|
146
|
+
* Prefetch content for better performance
|
|
147
|
+
*/
|
|
148
|
+
prefetch(urls: string[]): Promise<void>;
|
|
149
|
+
/**
|
|
150
|
+
* Robust Real-time Subscriptions (SSE) with Auto-Reconnect
|
|
151
|
+
*/
|
|
152
|
+
subscribeToUpdates(callback: (data: any) => void): () => void;
|
|
153
|
+
/**
|
|
154
|
+
* Check all caches in order of speed
|
|
155
|
+
*/
|
|
156
|
+
private checkCaches;
|
|
157
|
+
private writeCache;
|
|
158
|
+
/**
|
|
159
|
+
* ⚡ THE PULSE: Next.js Cache Revalidation Receiver
|
|
160
|
+
* Used in app/api/nexus-revalidate/route.ts to handle instant updates from the NexusHub backend.
|
|
161
|
+
*
|
|
162
|
+
* @param req The incoming Request object from Next.js
|
|
163
|
+
* @param revalidateFn The revalidateTag function imported from 'next/cache'
|
|
164
|
+
*/
|
|
165
|
+
handleRevalidation(req: Request, revalidateFn: (tag: string) => void): Promise<{
|
|
166
|
+
success: boolean;
|
|
167
|
+
message?: string;
|
|
168
|
+
now?: number;
|
|
169
|
+
}>;
|
|
170
|
+
/**
|
|
171
|
+
* Invalidate cache by tags
|
|
172
|
+
*/
|
|
173
|
+
invalidateCache(tags: string[]): void;
|
|
174
|
+
/**
|
|
175
|
+
* Clear all caches
|
|
176
|
+
*/
|
|
177
|
+
clearCache(): void;
|
|
178
|
+
/**
|
|
179
|
+
* Get cache statistics
|
|
180
|
+
*/
|
|
181
|
+
getCacheStats(): {
|
|
182
|
+
memory: {
|
|
183
|
+
size: number;
|
|
184
|
+
hits: number;
|
|
185
|
+
misses: number;
|
|
186
|
+
hitRate: number;
|
|
187
|
+
};
|
|
188
|
+
browser: {
|
|
189
|
+
size: number;
|
|
190
|
+
} | null;
|
|
191
|
+
local: {
|
|
192
|
+
loaded: boolean;
|
|
193
|
+
};
|
|
194
|
+
};
|
|
195
|
+
private fetchPage;
|
|
196
|
+
private fetchCollection;
|
|
197
|
+
private applyLocalQuery;
|
|
198
|
+
private fetchWithTimeout;
|
|
199
|
+
private getHeaders;
|
|
200
|
+
private isCacheValid;
|
|
201
|
+
private normalizeError;
|
|
202
|
+
/**
|
|
203
|
+
* Cancel ongoing requests
|
|
204
|
+
*/
|
|
205
|
+
cancelRequests(): void;
|
|
206
|
+
/**
|
|
207
|
+
* Cleanup resources
|
|
208
|
+
*/
|
|
209
|
+
private cleanup;
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
declare class AnalyticsEngine {
|
|
213
|
+
private tracker;
|
|
214
|
+
private cleanupFns;
|
|
215
|
+
private isInitialized;
|
|
216
|
+
private maxScrollDepth;
|
|
217
|
+
private scrollThresholdsFired;
|
|
218
|
+
private scrollTimer?;
|
|
219
|
+
constructor(config: NexusConfig);
|
|
220
|
+
start(): void;
|
|
221
|
+
private lastPath;
|
|
222
|
+
pageView(customReferrer?: string): void;
|
|
223
|
+
private setupShareTracking;
|
|
224
|
+
private setupScrollTracking;
|
|
225
|
+
private clickBuffer;
|
|
226
|
+
private setupClickTracking;
|
|
227
|
+
private setupFormTracking;
|
|
228
|
+
private setupOutboundTracking;
|
|
229
|
+
private setupVideoTracking;
|
|
230
|
+
private setupErrorTracking;
|
|
231
|
+
private setupRouteTracking;
|
|
232
|
+
private isInitializedByReactProvider;
|
|
233
|
+
identify(userId: string, traits?: Record<string, any>): Promise<boolean>;
|
|
234
|
+
group(groupId: string, traits?: Record<string, any>): Promise<boolean>;
|
|
235
|
+
alias(newId: string): Promise<boolean>;
|
|
236
|
+
reset(performGdprScrub?: boolean): void;
|
|
237
|
+
track(eventName: string, properties?: Record<string, any>): void;
|
|
238
|
+
trackPurchase(orderData: {
|
|
239
|
+
orderId: string;
|
|
240
|
+
total: number;
|
|
241
|
+
revenue?: number;
|
|
242
|
+
currency?: string;
|
|
243
|
+
products: Array<{
|
|
244
|
+
id: string;
|
|
245
|
+
name: string;
|
|
246
|
+
price: number;
|
|
247
|
+
quantity: number;
|
|
248
|
+
sku?: string;
|
|
249
|
+
}>;
|
|
250
|
+
}): void;
|
|
251
|
+
trackError(error: Error, context?: Record<string, any>): void;
|
|
252
|
+
private sendIdentityRequest;
|
|
253
|
+
getSessionId(): string;
|
|
254
|
+
stop(isFinalShutdown?: boolean): void;
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
declare class NexusClient {
|
|
258
|
+
private config;
|
|
259
|
+
content: ContentEngine;
|
|
260
|
+
analytics?: AnalyticsEngine;
|
|
261
|
+
constructor(config?: Partial<NexusConfig>);
|
|
262
|
+
/**
|
|
263
|
+
* Helper alias for cleaner content fetching.
|
|
264
|
+
*/
|
|
265
|
+
getPage<T = any>(slug: string, options?: any): Promise<T>;
|
|
266
|
+
/**
|
|
267
|
+
* Returns a readonly snapshot of the current config.
|
|
268
|
+
*/
|
|
269
|
+
getConfig(): Readonly<NexusConfig>;
|
|
270
|
+
/**
|
|
271
|
+
* Updates specific config fields at runtime.
|
|
272
|
+
* Replaces the previous pattern of `(nexus as any).config.projectId = x`
|
|
273
|
+
* which bypassed TypeScript and mutated internal state unsafely.
|
|
274
|
+
*/
|
|
275
|
+
updateConfig(updates: Partial<NexusConfig>): void;
|
|
276
|
+
}
|
|
277
|
+
declare const nexus: NexusClient;
|
|
278
|
+
declare const createNexusClient: (config: Partial<NexusConfig>) => NexusClient;
|
|
279
|
+
|
|
280
|
+
interface NexusProviderProps {
|
|
281
|
+
children: React.ReactNode;
|
|
282
|
+
projectId?: string;
|
|
283
|
+
disableAnalytics?: boolean;
|
|
284
|
+
hasConsent?: boolean;
|
|
285
|
+
enableLiveFeed?: boolean;
|
|
286
|
+
onLiveEvent?: (event: LiveAnalyticsEvent) => void;
|
|
287
|
+
}
|
|
288
|
+
interface LiveAnalyticsEvent {
|
|
289
|
+
eventType: string;
|
|
290
|
+
projectId: string;
|
|
291
|
+
sessionId: string;
|
|
292
|
+
visitorId: string;
|
|
293
|
+
userId?: string;
|
|
294
|
+
data: {
|
|
295
|
+
event_id: string;
|
|
296
|
+
event_name?: string;
|
|
297
|
+
url: string;
|
|
298
|
+
timestamp: string;
|
|
299
|
+
geo?: Record<string, any>;
|
|
300
|
+
device?: Record<string, any>;
|
|
301
|
+
performance?: Record<string, any>;
|
|
302
|
+
ecommerce?: Record<string, any>;
|
|
303
|
+
};
|
|
304
|
+
timestamp: string;
|
|
305
|
+
sequence: number;
|
|
306
|
+
}
|
|
307
|
+
interface LiveFeedContextValue {
|
|
308
|
+
latestEvent: LiveAnalyticsEvent | null;
|
|
309
|
+
isConnected: boolean;
|
|
310
|
+
}
|
|
311
|
+
declare const useNexusLiveFeed: () => LiveFeedContextValue;
|
|
312
|
+
declare const NexusProvider: ({ children, projectId, disableAnalytics, hasConsent, enableLiveFeed, onLiveEvent, }: NexusProviderProps) => react_jsx_runtime.JSX.Element;
|
|
313
|
+
declare const useNexus: () => NexusClient;
|
|
314
|
+
declare const useNexusAnalytics: () => {
|
|
315
|
+
track: (eventName: string, properties?: Record<string, any>) => void;
|
|
316
|
+
identify: (userId: string, traits?: Record<string, any>) => Promise<boolean>;
|
|
317
|
+
group: (groupId: string, traits?: Record<string, any>) => Promise<boolean>;
|
|
318
|
+
alias: (newId: string) => Promise<boolean>;
|
|
319
|
+
trackPurchase: (orderData: {
|
|
320
|
+
orderId: string;
|
|
321
|
+
total: number;
|
|
322
|
+
revenue?: number;
|
|
323
|
+
currency?: string;
|
|
324
|
+
products: Array<{
|
|
325
|
+
id: string;
|
|
326
|
+
name: string;
|
|
327
|
+
price: number;
|
|
328
|
+
quantity: number;
|
|
329
|
+
sku?: string;
|
|
330
|
+
}>;
|
|
331
|
+
}) => void;
|
|
332
|
+
trackError: (error: Error, context?: Record<string, any>) => void;
|
|
333
|
+
reset: (performGdprScrub?: boolean) => void;
|
|
334
|
+
};
|
|
335
|
+
|
|
336
|
+
interface SiteUser {
|
|
337
|
+
id: string;
|
|
338
|
+
email: string;
|
|
339
|
+
username?: string;
|
|
340
|
+
firstName?: string;
|
|
341
|
+
lastName?: string;
|
|
342
|
+
avatarUrl?: string;
|
|
343
|
+
role: string;
|
|
344
|
+
organizationId?: string;
|
|
345
|
+
organizationTraits?: Record<string, any>;
|
|
346
|
+
metadata?: Record<string, any>;
|
|
347
|
+
createdAt: string;
|
|
348
|
+
}
|
|
349
|
+
interface AuthState {
|
|
350
|
+
user: SiteUser | null;
|
|
351
|
+
isAuthenticated: boolean;
|
|
352
|
+
isLoading: boolean;
|
|
353
|
+
error: AuthError | null;
|
|
354
|
+
}
|
|
355
|
+
interface AuthError {
|
|
356
|
+
code: string;
|
|
357
|
+
message: string;
|
|
358
|
+
status: number;
|
|
359
|
+
}
|
|
360
|
+
interface LoginCredentials {
|
|
361
|
+
email: string;
|
|
362
|
+
password: string;
|
|
363
|
+
}
|
|
364
|
+
interface RegisterCredentials {
|
|
365
|
+
email: string;
|
|
366
|
+
password: string;
|
|
367
|
+
username?: string;
|
|
368
|
+
firstName?: string;
|
|
369
|
+
lastName?: string;
|
|
370
|
+
metadata?: Record<string, any>;
|
|
371
|
+
}
|
|
372
|
+
interface AuthContextType extends AuthState {
|
|
373
|
+
login: (creds: LoginCredentials) => Promise<void>;
|
|
374
|
+
register: (creds: RegisterCredentials) => Promise<void>;
|
|
375
|
+
logout: () => Promise<void>;
|
|
376
|
+
updateProfile: (data: Partial<SiteUser>) => Promise<void>;
|
|
377
|
+
requestPasswordReset: (email: string) => Promise<void>;
|
|
378
|
+
}
|
|
379
|
+
|
|
380
|
+
declare const AuthProvider: ({ children, config, }: {
|
|
381
|
+
children: React.ReactNode;
|
|
382
|
+
config: NexusConfig;
|
|
383
|
+
}) => react_jsx_runtime.JSX.Element;
|
|
384
|
+
declare const useNexusAuth: () => AuthContextType;
|
|
385
|
+
|
|
386
|
+
export { AnalyticsEngine as A, type CacheEntry as C, DEFAULT_ANALYTICS_URL as D, type ErrorResponse as E, LOCAL_NEST_URL as L, type MinimalNexusConfig as M, NexusClient as N, type RegisterCredentials as R, type SiteUser as S, type AuthContextType as a, type AuthError as b, AuthProvider as c, type AuthState as d, type CacheMetadata as e, type CollectionQuery as f, type CollectionResponse as g, ContentEngine as h, type ContentResponse as i, DEFAULT_API_URL as j, LOCAL_RUST_URL as k, type LoginCredentials as l, type NexusConfig as m, NexusProvider as n, type NexusProviderProps as o, createNexusClient as p, getEnvConfig as q, getFullConfig as r, mergeConfigs as s, nexus as t, useNexus as u, useNexusAuth as v, validateConfig as w, useNexusAnalytics as x, useNexusLiveFeed as y };
|
package/dist/react.cjs
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true});"use client";
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
var _chunkFMMFQP5Ocjs = require('./chunk-FMMFQP5O.cjs');
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
exports.AuthProvider = _chunkFMMFQP5Ocjs.AuthProvider; exports.NexusProvider = _chunkFMMFQP5Ocjs.NexusProvider; exports.useNexus = _chunkFMMFQP5Ocjs.useNexus; exports.useNexusAnalytics = _chunkFMMFQP5Ocjs.useNexusAnalytics; exports.useNexusAuth = _chunkFMMFQP5Ocjs.useNexusAuth; exports.useNexusLiveFeed = _chunkFMMFQP5Ocjs.useNexusLiveFeed;
|
package/dist/react.d.cts
ADDED
package/dist/react.d.ts
ADDED
package/dist/react.js
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import {
|
|
3
|
+
AuthProvider,
|
|
4
|
+
NexusProvider,
|
|
5
|
+
useNexus,
|
|
6
|
+
useNexusAnalytics,
|
|
7
|
+
useNexusAuth,
|
|
8
|
+
useNexusLiveFeed
|
|
9
|
+
} from "./chunk-G4SHBWAQ.js";
|
|
10
|
+
export {
|
|
11
|
+
AuthProvider,
|
|
12
|
+
NexusProvider,
|
|
13
|
+
useNexus,
|
|
14
|
+
useNexusAnalytics,
|
|
15
|
+
useNexusAuth,
|
|
16
|
+
useNexusLiveFeed
|
|
17
|
+
};
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@nexushub/client",
|
|
3
3
|
"private": false,
|
|
4
|
-
"version": "0.4.
|
|
4
|
+
"version": "0.4.2",
|
|
5
5
|
"description": "The God-Tier NexusHub SDK",
|
|
6
6
|
"type": "module",
|
|
7
7
|
"main": "./dist/index.cjs",
|
|
@@ -11,7 +11,21 @@
|
|
|
11
11
|
".": {
|
|
12
12
|
"types": "./dist/index.d.ts",
|
|
13
13
|
"import": "./dist/index.js",
|
|
14
|
-
"require": "./dist/index.cjs"
|
|
14
|
+
"require": "./dist/index.cjs",
|
|
15
|
+
"default": "./dist/index.js"
|
|
16
|
+
},
|
|
17
|
+
"./react": {
|
|
18
|
+
"types": "./dist/react.d.ts",
|
|
19
|
+
"import": "./dist/react.js",
|
|
20
|
+
"require": "./dist/react.cjs",
|
|
21
|
+
"default": "./dist/react.js"
|
|
22
|
+
}
|
|
23
|
+
},
|
|
24
|
+
"typesVersions": {
|
|
25
|
+
"*": {
|
|
26
|
+
"react": [
|
|
27
|
+
"./dist/react.d.ts"
|
|
28
|
+
]
|
|
15
29
|
}
|
|
16
30
|
},
|
|
17
31
|
"bin": {
|