@nocios/crudify-ui 4.1.54 → 4.1.58
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-EYZAGBSN.js → chunk-4VW4J2U2.js} +1 -1
- package/dist/chunk-DBU3TOSA.js +1 -0
- package/dist/chunk-FM2YKL4E.mjs +1 -0
- package/dist/{chunk-AGI7BSLB.mjs → chunk-GT5YJKPE.mjs} +1 -1
- package/dist/{chunk-LQ26JZXI.mjs → chunk-HYJWXWGO.mjs} +1 -1
- package/dist/{chunk-Q2I7YV7H.js → chunk-WZEPLZEJ.js} +1 -1
- package/dist/components.js +1 -1
- package/dist/components.mjs +1 -1
- package/dist/hooks.d.mts +1 -1
- package/dist/hooks.d.ts +1 -1
- package/dist/hooks.js +1 -1
- package/dist/hooks.mjs +1 -1
- package/dist/{index-DudiZgBg.d.mts → index-4MK_rZUi.d.mts} +10 -0
- package/dist/{index-FQzSa_vl.d.ts → index-Dpy6dlER.d.ts} +10 -0
- package/dist/index.d.mts +247 -8
- package/dist/index.d.ts +247 -8
- package/dist/index.js +2 -2
- package/dist/index.mjs +2 -2
- package/package.json +1 -1
- package/dist/chunk-ANP3YOXX.js +0 -1
- package/dist/chunk-P2PNKHPV.mjs +0 -1
package/dist/index.d.mts
CHANGED
|
@@ -5,8 +5,8 @@ import { a as CrudifyLoginConfig } from './LoginComponent-CSTVsfeV.mjs';
|
|
|
5
5
|
export { B as BoxScreenType, C as CrudifyLogin, b as CrudifyLoginProps, c as CrudifyLoginTranslations, L as LoginComponent, f as POLICY_ACTIONS, g as PREFERRED_POLICY_ORDER, P as Policies, e as PolicyAction, S as SessionStatus, d as UserLoginData, U as UserProfileDisplay } from './LoginComponent-CSTVsfeV.mjs';
|
|
6
6
|
import React, { ReactNode } from 'react';
|
|
7
7
|
export { A as ApiError, C as CrudifyApiResponse, a as CrudifyTransactionResponse, F as ForgotPasswordRequest, J as JwtPayload, b as LoginRequest, L as LoginResponse, R as ResetPasswordRequest, T as TransactionResponseData, U as UserProfile, V as ValidateCodeRequest, c as ValidationError } from './api-Djqihi4n.mjs';
|
|
8
|
-
import { U as UseSessionOptions, T as TokenData, L as LoginResult } from './index-
|
|
9
|
-
export { a as SessionConfig, S as SessionManager, d as SessionState, c as StorageType, b as TokenStorage, j as UseAuthReturn, l as UseDataReturn, g as UseUserDataOptions, f as UseUserDataReturn, h as UserData, i as useAuth, n as useCrudifyWithNotifications, k as useData, u as useSession, e as useUserData, m as useUserProfile } from './index-
|
|
8
|
+
import { U as UseSessionOptions, T as TokenData, L as LoginResult } from './index-4MK_rZUi.mjs';
|
|
9
|
+
export { a as SessionConfig, S as SessionManager, d as SessionState, c as StorageType, b as TokenStorage, j as UseAuthReturn, l as UseDataReturn, g as UseUserDataOptions, f as UseUserDataReturn, h as UserData, i as useAuth, n as useCrudifyWithNotifications, k as useData, u as useSession, e as useUserData, m as useUserProfile } from './index-4MK_rZUi.mjs';
|
|
10
10
|
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
11
11
|
import { ThemeOptions } from '@mui/material';
|
|
12
12
|
export { E as ERROR_CODES, j as ERROR_SEVERITY_MAP, n as ErrorCode, o as ErrorSeverity, q as ErrorTranslationConfig, P as ParsedError, m as createErrorTranslator, d as decodeJwtSafely, a as getCookie, g as getCurrentUserEmail, f as getErrorMessage, h as handleCrudifyError, i as isTokenExpired, p as parseApiError, e as parseJavaScriptError, c as parseTransactionError, b as secureLocalStorage, s as secureSessionStorage, l as translateError, t as translateErrorCode, k as translateErrorCodes } from './errorTranslation-DEn4aqs6.mjs';
|
|
@@ -241,6 +241,239 @@ declare const validateInternalRedirect: (path: string, defaultPath?: string) =>
|
|
|
241
241
|
*/
|
|
242
242
|
declare const extractSafeRedirectFromUrl: (searchParams: URLSearchParams | string, defaultPath?: string) => string;
|
|
243
243
|
|
|
244
|
+
type InitializationPriority = "HIGH" | "LOW";
|
|
245
|
+
type InitializationStatus = "UNINITIALIZED" | "INITIALIZING" | "INITIALIZED" | "ERROR";
|
|
246
|
+
interface InitializationState {
|
|
247
|
+
status: InitializationStatus;
|
|
248
|
+
priority: InitializationPriority | null;
|
|
249
|
+
publicApiKey: string | null;
|
|
250
|
+
env: string | null;
|
|
251
|
+
error: Error | null;
|
|
252
|
+
initializedBy: string | null;
|
|
253
|
+
}
|
|
254
|
+
interface InitializationRequest {
|
|
255
|
+
priority: InitializationPriority;
|
|
256
|
+
publicApiKey: string;
|
|
257
|
+
env: "dev" | "stg" | "api" | "prod";
|
|
258
|
+
enableLogging?: boolean;
|
|
259
|
+
requestedBy: string;
|
|
260
|
+
}
|
|
261
|
+
/**
|
|
262
|
+
* CrudifyInitializationManager
|
|
263
|
+
*
|
|
264
|
+
* Singleton manager for controlling Crudify SDK initialization with priority system.
|
|
265
|
+
*
|
|
266
|
+
* **Priority System:**
|
|
267
|
+
* - HIGH: Explicit initialization via `<CrudifyInitializer>` component
|
|
268
|
+
* - LOW: Automatic fallback initialization in providers
|
|
269
|
+
*
|
|
270
|
+
* **Thread-Safe:**
|
|
271
|
+
* - Prevents duplicate initializations
|
|
272
|
+
* - Handles concurrent initialization requests
|
|
273
|
+
* - Shared promise ensures single initialization
|
|
274
|
+
*
|
|
275
|
+
* @example
|
|
276
|
+
* ```typescript
|
|
277
|
+
* // HIGH priority (CrudifyInitializer)
|
|
278
|
+
* await crudifyInitManager.initialize({
|
|
279
|
+
* priority: "HIGH",
|
|
280
|
+
* publicApiKey: "key",
|
|
281
|
+
* env: "stg",
|
|
282
|
+
* requestedBy: "CrudifyInitializer"
|
|
283
|
+
* });
|
|
284
|
+
*
|
|
285
|
+
* // LOW priority (provider auto-init)
|
|
286
|
+
* await crudifyInitManager.initialize({
|
|
287
|
+
* priority: "LOW",
|
|
288
|
+
* publicApiKey: "key",
|
|
289
|
+
* env: "stg",
|
|
290
|
+
* requestedBy: "SessionProvider"
|
|
291
|
+
* });
|
|
292
|
+
* ```
|
|
293
|
+
*/
|
|
294
|
+
declare class CrudifyInitializationManager {
|
|
295
|
+
private static instance;
|
|
296
|
+
private state;
|
|
297
|
+
private initializationPromise;
|
|
298
|
+
private highPriorityInitializerPresent;
|
|
299
|
+
private waitingForHighPriority;
|
|
300
|
+
private readonly HIGH_PRIORITY_WAIT_TIMEOUT;
|
|
301
|
+
private constructor();
|
|
302
|
+
/**
|
|
303
|
+
* Get singleton instance
|
|
304
|
+
*/
|
|
305
|
+
static getInstance(): CrudifyInitializationManager;
|
|
306
|
+
/**
|
|
307
|
+
* Register that a HIGH priority initializer is present
|
|
308
|
+
* This must be called SYNCHRONOUSLY during component mount
|
|
309
|
+
*/
|
|
310
|
+
registerHighPriorityInitializer(): void;
|
|
311
|
+
/**
|
|
312
|
+
* Check if a HIGH priority initializer is present
|
|
313
|
+
*/
|
|
314
|
+
isHighPriorityInitializerPresent(): boolean;
|
|
315
|
+
/**
|
|
316
|
+
* Get current initialization state (read-only)
|
|
317
|
+
*/
|
|
318
|
+
getState(): Readonly<InitializationState>;
|
|
319
|
+
/**
|
|
320
|
+
* Main initialization method - handles priority and concurrency
|
|
321
|
+
*
|
|
322
|
+
* @param request Initialization request with priority and config
|
|
323
|
+
* @returns Promise that resolves when initialization completes
|
|
324
|
+
* @throws Error if initialization fails
|
|
325
|
+
*/
|
|
326
|
+
initialize(request: InitializationRequest): Promise<void>;
|
|
327
|
+
/**
|
|
328
|
+
* Wait for HIGH priority initializer with timeout
|
|
329
|
+
*/
|
|
330
|
+
private waitForHighPriorityOrTimeout;
|
|
331
|
+
/**
|
|
332
|
+
* Actual SDK initialization
|
|
333
|
+
*/
|
|
334
|
+
private performInitialization;
|
|
335
|
+
/**
|
|
336
|
+
* Reset initialization state (for testing)
|
|
337
|
+
*/
|
|
338
|
+
reset(): void;
|
|
339
|
+
/**
|
|
340
|
+
* Check if initialized (without triggering initialization)
|
|
341
|
+
*/
|
|
342
|
+
isInitialized(): boolean;
|
|
343
|
+
/**
|
|
344
|
+
* Get diagnostic info (for debugging)
|
|
345
|
+
*/
|
|
346
|
+
getDiagnostics(): {
|
|
347
|
+
waitingCount: number;
|
|
348
|
+
waitingComponents: string[];
|
|
349
|
+
hasActivePromise: boolean;
|
|
350
|
+
status: InitializationStatus;
|
|
351
|
+
priority: InitializationPriority | null;
|
|
352
|
+
publicApiKey: string | null;
|
|
353
|
+
env: string | null;
|
|
354
|
+
error: Error | null;
|
|
355
|
+
initializedBy: string | null;
|
|
356
|
+
};
|
|
357
|
+
}
|
|
358
|
+
/**
|
|
359
|
+
* Export singleton instance
|
|
360
|
+
*
|
|
361
|
+
* @example
|
|
362
|
+
* ```typescript
|
|
363
|
+
* import { crudifyInitManager } from "@nocios/crudify-ui";
|
|
364
|
+
*
|
|
365
|
+
* // Initialize with HIGH priority
|
|
366
|
+
* await crudifyInitManager.initialize({
|
|
367
|
+
* priority: "HIGH",
|
|
368
|
+
* publicApiKey: "your-key",
|
|
369
|
+
* env: "stg",
|
|
370
|
+
* requestedBy: "CrudifyInitializer"
|
|
371
|
+
* });
|
|
372
|
+
*
|
|
373
|
+
* // Check if initialized
|
|
374
|
+
* if (crudifyInitManager.isInitialized()) {
|
|
375
|
+
* // Ready to use crudify SDK
|
|
376
|
+
* }
|
|
377
|
+
*
|
|
378
|
+
* // Get diagnostics
|
|
379
|
+
* console.log(crudifyInitManager.getDiagnostics());
|
|
380
|
+
* ```
|
|
381
|
+
*/
|
|
382
|
+
declare const crudifyInitManager: CrudifyInitializationManager;
|
|
383
|
+
|
|
384
|
+
interface CrudifyInitializerConfig {
|
|
385
|
+
publicApiKey: string;
|
|
386
|
+
env?: "dev" | "stg" | "api" | "prod";
|
|
387
|
+
enableLogging?: boolean;
|
|
388
|
+
}
|
|
389
|
+
interface CrudifyInitializerContextValue {
|
|
390
|
+
isInitialized: boolean;
|
|
391
|
+
isInitializing: boolean;
|
|
392
|
+
error: Error | null;
|
|
393
|
+
}
|
|
394
|
+
interface CrudifyInitializerProps {
|
|
395
|
+
config: CrudifyInitializerConfig;
|
|
396
|
+
children: React.ReactNode;
|
|
397
|
+
fallback?: React.ReactNode;
|
|
398
|
+
onInitialized?: () => void;
|
|
399
|
+
onError?: (error: Error) => void;
|
|
400
|
+
}
|
|
401
|
+
/**
|
|
402
|
+
* CrudifyInitializer Component
|
|
403
|
+
*
|
|
404
|
+
* HIGH priority Crudify SDK initializer component.
|
|
405
|
+
* Use this at the root of your app to explicitly control initialization.
|
|
406
|
+
*
|
|
407
|
+
* **Features:**
|
|
408
|
+
* - HIGH priority initialization (takes precedence over auto-init)
|
|
409
|
+
* - Provides initialization status via context
|
|
410
|
+
* - Optional loading fallback while initializing
|
|
411
|
+
* - Callbacks for initialization complete/error
|
|
412
|
+
* - React 18 StrictMode compatible
|
|
413
|
+
*
|
|
414
|
+
* **Usage:**
|
|
415
|
+
* ```tsx
|
|
416
|
+
* // App.tsx
|
|
417
|
+
* import { CrudifyInitializer } from "@nocios/crudify-ui";
|
|
418
|
+
*
|
|
419
|
+
* function App() {
|
|
420
|
+
* return (
|
|
421
|
+
* <CrudifyInitializer
|
|
422
|
+
* config={{
|
|
423
|
+
* publicApiKey: import.meta.env.VITE_CRUDIFY_PUBLIC_API_KEY,
|
|
424
|
+
* env: "stg",
|
|
425
|
+
* enableLogging: true,
|
|
426
|
+
* }}
|
|
427
|
+
* fallback={<div>Loading Crudify...</div>}
|
|
428
|
+
* onInitialized={() => console.log("Crudify ready!")}
|
|
429
|
+
* onError={(err) => console.error("Init failed:", err)}
|
|
430
|
+
* >
|
|
431
|
+
* <SessionProvider>
|
|
432
|
+
* <TranslationsProvider>
|
|
433
|
+
* <App />
|
|
434
|
+
* </TranslationsProvider>
|
|
435
|
+
* </SessionProvider>
|
|
436
|
+
* </CrudifyInitializer>
|
|
437
|
+
* );
|
|
438
|
+
* }
|
|
439
|
+
* ```
|
|
440
|
+
*
|
|
441
|
+
* **Context Access:**
|
|
442
|
+
* ```tsx
|
|
443
|
+
* import { useCrudifyInitializer } from "@nocios/crudify-ui";
|
|
444
|
+
*
|
|
445
|
+
* function MyComponent() {
|
|
446
|
+
* const { isInitialized, isInitializing, error } = useCrudifyInitializer();
|
|
447
|
+
*
|
|
448
|
+
* if (isInitializing) return <div>Loading...</div>;
|
|
449
|
+
* if (error) return <div>Error: {error.message}</div>;
|
|
450
|
+
* if (!isInitialized) return null;
|
|
451
|
+
*
|
|
452
|
+
* return <div>Crudify is ready!</div>;
|
|
453
|
+
* }
|
|
454
|
+
* ```
|
|
455
|
+
*/
|
|
456
|
+
declare const CrudifyInitializer: React.FC<CrudifyInitializerProps>;
|
|
457
|
+
/**
|
|
458
|
+
* Hook to access CrudifyInitializer context
|
|
459
|
+
*
|
|
460
|
+
* @returns Initialization status (isInitialized, isInitializing, error)
|
|
461
|
+
* @throws Error if used outside CrudifyInitializer
|
|
462
|
+
*
|
|
463
|
+
* @example
|
|
464
|
+
* ```tsx
|
|
465
|
+
* function MyComponent() {
|
|
466
|
+
* const { isInitialized, isInitializing, error } = useCrudifyInitializer();
|
|
467
|
+
*
|
|
468
|
+
* if (isInitializing) return <Spinner />;
|
|
469
|
+
* if (error) return <ErrorDisplay error={error} />;
|
|
470
|
+
*
|
|
471
|
+
* return <div>Ready!</div>;
|
|
472
|
+
* }
|
|
473
|
+
* ```
|
|
474
|
+
*/
|
|
475
|
+
declare const useCrudifyInitializer: () => CrudifyInitializerContextValue;
|
|
476
|
+
|
|
244
477
|
interface TranslationsProviderProps {
|
|
245
478
|
children: React.ReactNode;
|
|
246
479
|
subscriberKey: string;
|
|
@@ -327,20 +560,26 @@ interface TranslationResponse {
|
|
|
327
560
|
declare class TranslationService {
|
|
328
561
|
private static instance;
|
|
329
562
|
private enableDebug;
|
|
563
|
+
private initializationPromise;
|
|
564
|
+
private isInitialized;
|
|
330
565
|
private constructor();
|
|
331
566
|
static getInstance(): TranslationService;
|
|
332
567
|
/**
|
|
333
568
|
* Set debug mode
|
|
334
569
|
*/
|
|
335
570
|
setDebug(enable: boolean): void;
|
|
571
|
+
/**
|
|
572
|
+
* Ensure crudify is initialized before making API calls
|
|
573
|
+
* Thread-safe: multiple calls will wait for the same initialization
|
|
574
|
+
*/
|
|
575
|
+
private ensureCrudifyInitialized;
|
|
336
576
|
/**
|
|
337
577
|
* Fetch translations with cache strategy
|
|
338
578
|
* 1. Try cache (if valid and not changed)
|
|
339
|
-
* 2.
|
|
340
|
-
* 3. Try
|
|
341
|
-
* 4.
|
|
342
|
-
*
|
|
343
|
-
* Note: Assumes crudify SDK is already initialized by the app
|
|
579
|
+
* 2. Ensure crudify is initialized
|
|
580
|
+
* 3. Try API fetch via crudify SDK
|
|
581
|
+
* 4. Try expired cache
|
|
582
|
+
* 5. Fall back to critical bundle
|
|
344
583
|
*/
|
|
345
584
|
fetchTranslations(options: FetchTranslationsOptions): Promise<Record<string, Record<string, string>>>;
|
|
346
585
|
/**
|
|
@@ -664,4 +903,4 @@ declare const crudifyAdmin: {
|
|
|
664
903
|
getModuleVersions: (moduleKey: string) => Promise<ApiResponse<any[]>>;
|
|
665
904
|
};
|
|
666
905
|
|
|
667
|
-
export { AuthRoute, type AuthRouteProps, CRITICAL_TRANSLATIONS, type CriticalTranslationKey, CrudifyLoginConfig, CrudifyProvider, CrudifyThemeProvider, type CrudifyThemeProviderProps, type FetchTranslationsOptions, LoginResult, type NotificationOptions, ProtectedRoute, type ProtectedRouteProps, SessionDebugInfo, SessionLoadingScreen, type SessionLoadingScreenProps, SessionProvider, type SessionProviderProps, type SupportedLanguage, TokenData, type TranslationResponse, TranslationService, type TranslationsContextValue, TranslationsProvider, type TranslationsProviderProps, UseSessionOptions, crudifyAdmin, extractSafeRedirectFromUrl, getCriticalLanguages, getCriticalTranslations, translationService, useCrudify, useSessionContext, useTranslations, validateInternalRedirect };
|
|
906
|
+
export { AuthRoute, type AuthRouteProps, CRITICAL_TRANSLATIONS, type CriticalTranslationKey, CrudifyInitializationManager, CrudifyInitializer, type CrudifyInitializerConfig, type CrudifyInitializerProps, CrudifyLoginConfig, CrudifyProvider, CrudifyThemeProvider, type CrudifyThemeProviderProps, type FetchTranslationsOptions, type InitializationPriority, type InitializationRequest, type InitializationStatus, LoginResult, type NotificationOptions, ProtectedRoute, type ProtectedRouteProps, SessionDebugInfo, SessionLoadingScreen, type SessionLoadingScreenProps, SessionProvider, type SessionProviderProps, type SupportedLanguage, TokenData, type TranslationResponse, TranslationService, type TranslationsContextValue, TranslationsProvider, type TranslationsProviderProps, UseSessionOptions, crudifyAdmin, crudifyInitManager, extractSafeRedirectFromUrl, getCriticalLanguages, getCriticalTranslations, translationService, useCrudify, useCrudifyInitializer, useSessionContext, useTranslations, validateInternalRedirect };
|
package/dist/index.d.ts
CHANGED
|
@@ -5,8 +5,8 @@ import { a as CrudifyLoginConfig } from './LoginComponent-CSTVsfeV.js';
|
|
|
5
5
|
export { B as BoxScreenType, C as CrudifyLogin, b as CrudifyLoginProps, c as CrudifyLoginTranslations, L as LoginComponent, f as POLICY_ACTIONS, g as PREFERRED_POLICY_ORDER, P as Policies, e as PolicyAction, S as SessionStatus, d as UserLoginData, U as UserProfileDisplay } from './LoginComponent-CSTVsfeV.js';
|
|
6
6
|
import React, { ReactNode } from 'react';
|
|
7
7
|
export { A as ApiError, C as CrudifyApiResponse, a as CrudifyTransactionResponse, F as ForgotPasswordRequest, J as JwtPayload, b as LoginRequest, L as LoginResponse, R as ResetPasswordRequest, T as TransactionResponseData, U as UserProfile, V as ValidateCodeRequest, c as ValidationError } from './api-Djqihi4n.js';
|
|
8
|
-
import { U as UseSessionOptions, T as TokenData, L as LoginResult } from './index-
|
|
9
|
-
export { a as SessionConfig, S as SessionManager, d as SessionState, c as StorageType, b as TokenStorage, j as UseAuthReturn, l as UseDataReturn, g as UseUserDataOptions, f as UseUserDataReturn, h as UserData, i as useAuth, n as useCrudifyWithNotifications, k as useData, u as useSession, e as useUserData, m as useUserProfile } from './index-
|
|
8
|
+
import { U as UseSessionOptions, T as TokenData, L as LoginResult } from './index-Dpy6dlER.js';
|
|
9
|
+
export { a as SessionConfig, S as SessionManager, d as SessionState, c as StorageType, b as TokenStorage, j as UseAuthReturn, l as UseDataReturn, g as UseUserDataOptions, f as UseUserDataReturn, h as UserData, i as useAuth, n as useCrudifyWithNotifications, k as useData, u as useSession, e as useUserData, m as useUserProfile } from './index-Dpy6dlER.js';
|
|
10
10
|
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
11
11
|
import { ThemeOptions } from '@mui/material';
|
|
12
12
|
export { E as ERROR_CODES, j as ERROR_SEVERITY_MAP, n as ErrorCode, o as ErrorSeverity, q as ErrorTranslationConfig, P as ParsedError, m as createErrorTranslator, d as decodeJwtSafely, a as getCookie, g as getCurrentUserEmail, f as getErrorMessage, h as handleCrudifyError, i as isTokenExpired, p as parseApiError, e as parseJavaScriptError, c as parseTransactionError, b as secureLocalStorage, s as secureSessionStorage, l as translateError, t as translateErrorCode, k as translateErrorCodes } from './errorTranslation-DdqZg8JD.js';
|
|
@@ -241,6 +241,239 @@ declare const validateInternalRedirect: (path: string, defaultPath?: string) =>
|
|
|
241
241
|
*/
|
|
242
242
|
declare const extractSafeRedirectFromUrl: (searchParams: URLSearchParams | string, defaultPath?: string) => string;
|
|
243
243
|
|
|
244
|
+
type InitializationPriority = "HIGH" | "LOW";
|
|
245
|
+
type InitializationStatus = "UNINITIALIZED" | "INITIALIZING" | "INITIALIZED" | "ERROR";
|
|
246
|
+
interface InitializationState {
|
|
247
|
+
status: InitializationStatus;
|
|
248
|
+
priority: InitializationPriority | null;
|
|
249
|
+
publicApiKey: string | null;
|
|
250
|
+
env: string | null;
|
|
251
|
+
error: Error | null;
|
|
252
|
+
initializedBy: string | null;
|
|
253
|
+
}
|
|
254
|
+
interface InitializationRequest {
|
|
255
|
+
priority: InitializationPriority;
|
|
256
|
+
publicApiKey: string;
|
|
257
|
+
env: "dev" | "stg" | "api" | "prod";
|
|
258
|
+
enableLogging?: boolean;
|
|
259
|
+
requestedBy: string;
|
|
260
|
+
}
|
|
261
|
+
/**
|
|
262
|
+
* CrudifyInitializationManager
|
|
263
|
+
*
|
|
264
|
+
* Singleton manager for controlling Crudify SDK initialization with priority system.
|
|
265
|
+
*
|
|
266
|
+
* **Priority System:**
|
|
267
|
+
* - HIGH: Explicit initialization via `<CrudifyInitializer>` component
|
|
268
|
+
* - LOW: Automatic fallback initialization in providers
|
|
269
|
+
*
|
|
270
|
+
* **Thread-Safe:**
|
|
271
|
+
* - Prevents duplicate initializations
|
|
272
|
+
* - Handles concurrent initialization requests
|
|
273
|
+
* - Shared promise ensures single initialization
|
|
274
|
+
*
|
|
275
|
+
* @example
|
|
276
|
+
* ```typescript
|
|
277
|
+
* // HIGH priority (CrudifyInitializer)
|
|
278
|
+
* await crudifyInitManager.initialize({
|
|
279
|
+
* priority: "HIGH",
|
|
280
|
+
* publicApiKey: "key",
|
|
281
|
+
* env: "stg",
|
|
282
|
+
* requestedBy: "CrudifyInitializer"
|
|
283
|
+
* });
|
|
284
|
+
*
|
|
285
|
+
* // LOW priority (provider auto-init)
|
|
286
|
+
* await crudifyInitManager.initialize({
|
|
287
|
+
* priority: "LOW",
|
|
288
|
+
* publicApiKey: "key",
|
|
289
|
+
* env: "stg",
|
|
290
|
+
* requestedBy: "SessionProvider"
|
|
291
|
+
* });
|
|
292
|
+
* ```
|
|
293
|
+
*/
|
|
294
|
+
declare class CrudifyInitializationManager {
|
|
295
|
+
private static instance;
|
|
296
|
+
private state;
|
|
297
|
+
private initializationPromise;
|
|
298
|
+
private highPriorityInitializerPresent;
|
|
299
|
+
private waitingForHighPriority;
|
|
300
|
+
private readonly HIGH_PRIORITY_WAIT_TIMEOUT;
|
|
301
|
+
private constructor();
|
|
302
|
+
/**
|
|
303
|
+
* Get singleton instance
|
|
304
|
+
*/
|
|
305
|
+
static getInstance(): CrudifyInitializationManager;
|
|
306
|
+
/**
|
|
307
|
+
* Register that a HIGH priority initializer is present
|
|
308
|
+
* This must be called SYNCHRONOUSLY during component mount
|
|
309
|
+
*/
|
|
310
|
+
registerHighPriorityInitializer(): void;
|
|
311
|
+
/**
|
|
312
|
+
* Check if a HIGH priority initializer is present
|
|
313
|
+
*/
|
|
314
|
+
isHighPriorityInitializerPresent(): boolean;
|
|
315
|
+
/**
|
|
316
|
+
* Get current initialization state (read-only)
|
|
317
|
+
*/
|
|
318
|
+
getState(): Readonly<InitializationState>;
|
|
319
|
+
/**
|
|
320
|
+
* Main initialization method - handles priority and concurrency
|
|
321
|
+
*
|
|
322
|
+
* @param request Initialization request with priority and config
|
|
323
|
+
* @returns Promise that resolves when initialization completes
|
|
324
|
+
* @throws Error if initialization fails
|
|
325
|
+
*/
|
|
326
|
+
initialize(request: InitializationRequest): Promise<void>;
|
|
327
|
+
/**
|
|
328
|
+
* Wait for HIGH priority initializer with timeout
|
|
329
|
+
*/
|
|
330
|
+
private waitForHighPriorityOrTimeout;
|
|
331
|
+
/**
|
|
332
|
+
* Actual SDK initialization
|
|
333
|
+
*/
|
|
334
|
+
private performInitialization;
|
|
335
|
+
/**
|
|
336
|
+
* Reset initialization state (for testing)
|
|
337
|
+
*/
|
|
338
|
+
reset(): void;
|
|
339
|
+
/**
|
|
340
|
+
* Check if initialized (without triggering initialization)
|
|
341
|
+
*/
|
|
342
|
+
isInitialized(): boolean;
|
|
343
|
+
/**
|
|
344
|
+
* Get diagnostic info (for debugging)
|
|
345
|
+
*/
|
|
346
|
+
getDiagnostics(): {
|
|
347
|
+
waitingCount: number;
|
|
348
|
+
waitingComponents: string[];
|
|
349
|
+
hasActivePromise: boolean;
|
|
350
|
+
status: InitializationStatus;
|
|
351
|
+
priority: InitializationPriority | null;
|
|
352
|
+
publicApiKey: string | null;
|
|
353
|
+
env: string | null;
|
|
354
|
+
error: Error | null;
|
|
355
|
+
initializedBy: string | null;
|
|
356
|
+
};
|
|
357
|
+
}
|
|
358
|
+
/**
|
|
359
|
+
* Export singleton instance
|
|
360
|
+
*
|
|
361
|
+
* @example
|
|
362
|
+
* ```typescript
|
|
363
|
+
* import { crudifyInitManager } from "@nocios/crudify-ui";
|
|
364
|
+
*
|
|
365
|
+
* // Initialize with HIGH priority
|
|
366
|
+
* await crudifyInitManager.initialize({
|
|
367
|
+
* priority: "HIGH",
|
|
368
|
+
* publicApiKey: "your-key",
|
|
369
|
+
* env: "stg",
|
|
370
|
+
* requestedBy: "CrudifyInitializer"
|
|
371
|
+
* });
|
|
372
|
+
*
|
|
373
|
+
* // Check if initialized
|
|
374
|
+
* if (crudifyInitManager.isInitialized()) {
|
|
375
|
+
* // Ready to use crudify SDK
|
|
376
|
+
* }
|
|
377
|
+
*
|
|
378
|
+
* // Get diagnostics
|
|
379
|
+
* console.log(crudifyInitManager.getDiagnostics());
|
|
380
|
+
* ```
|
|
381
|
+
*/
|
|
382
|
+
declare const crudifyInitManager: CrudifyInitializationManager;
|
|
383
|
+
|
|
384
|
+
interface CrudifyInitializerConfig {
|
|
385
|
+
publicApiKey: string;
|
|
386
|
+
env?: "dev" | "stg" | "api" | "prod";
|
|
387
|
+
enableLogging?: boolean;
|
|
388
|
+
}
|
|
389
|
+
interface CrudifyInitializerContextValue {
|
|
390
|
+
isInitialized: boolean;
|
|
391
|
+
isInitializing: boolean;
|
|
392
|
+
error: Error | null;
|
|
393
|
+
}
|
|
394
|
+
interface CrudifyInitializerProps {
|
|
395
|
+
config: CrudifyInitializerConfig;
|
|
396
|
+
children: React.ReactNode;
|
|
397
|
+
fallback?: React.ReactNode;
|
|
398
|
+
onInitialized?: () => void;
|
|
399
|
+
onError?: (error: Error) => void;
|
|
400
|
+
}
|
|
401
|
+
/**
|
|
402
|
+
* CrudifyInitializer Component
|
|
403
|
+
*
|
|
404
|
+
* HIGH priority Crudify SDK initializer component.
|
|
405
|
+
* Use this at the root of your app to explicitly control initialization.
|
|
406
|
+
*
|
|
407
|
+
* **Features:**
|
|
408
|
+
* - HIGH priority initialization (takes precedence over auto-init)
|
|
409
|
+
* - Provides initialization status via context
|
|
410
|
+
* - Optional loading fallback while initializing
|
|
411
|
+
* - Callbacks for initialization complete/error
|
|
412
|
+
* - React 18 StrictMode compatible
|
|
413
|
+
*
|
|
414
|
+
* **Usage:**
|
|
415
|
+
* ```tsx
|
|
416
|
+
* // App.tsx
|
|
417
|
+
* import { CrudifyInitializer } from "@nocios/crudify-ui";
|
|
418
|
+
*
|
|
419
|
+
* function App() {
|
|
420
|
+
* return (
|
|
421
|
+
* <CrudifyInitializer
|
|
422
|
+
* config={{
|
|
423
|
+
* publicApiKey: import.meta.env.VITE_CRUDIFY_PUBLIC_API_KEY,
|
|
424
|
+
* env: "stg",
|
|
425
|
+
* enableLogging: true,
|
|
426
|
+
* }}
|
|
427
|
+
* fallback={<div>Loading Crudify...</div>}
|
|
428
|
+
* onInitialized={() => console.log("Crudify ready!")}
|
|
429
|
+
* onError={(err) => console.error("Init failed:", err)}
|
|
430
|
+
* >
|
|
431
|
+
* <SessionProvider>
|
|
432
|
+
* <TranslationsProvider>
|
|
433
|
+
* <App />
|
|
434
|
+
* </TranslationsProvider>
|
|
435
|
+
* </SessionProvider>
|
|
436
|
+
* </CrudifyInitializer>
|
|
437
|
+
* );
|
|
438
|
+
* }
|
|
439
|
+
* ```
|
|
440
|
+
*
|
|
441
|
+
* **Context Access:**
|
|
442
|
+
* ```tsx
|
|
443
|
+
* import { useCrudifyInitializer } from "@nocios/crudify-ui";
|
|
444
|
+
*
|
|
445
|
+
* function MyComponent() {
|
|
446
|
+
* const { isInitialized, isInitializing, error } = useCrudifyInitializer();
|
|
447
|
+
*
|
|
448
|
+
* if (isInitializing) return <div>Loading...</div>;
|
|
449
|
+
* if (error) return <div>Error: {error.message}</div>;
|
|
450
|
+
* if (!isInitialized) return null;
|
|
451
|
+
*
|
|
452
|
+
* return <div>Crudify is ready!</div>;
|
|
453
|
+
* }
|
|
454
|
+
* ```
|
|
455
|
+
*/
|
|
456
|
+
declare const CrudifyInitializer: React.FC<CrudifyInitializerProps>;
|
|
457
|
+
/**
|
|
458
|
+
* Hook to access CrudifyInitializer context
|
|
459
|
+
*
|
|
460
|
+
* @returns Initialization status (isInitialized, isInitializing, error)
|
|
461
|
+
* @throws Error if used outside CrudifyInitializer
|
|
462
|
+
*
|
|
463
|
+
* @example
|
|
464
|
+
* ```tsx
|
|
465
|
+
* function MyComponent() {
|
|
466
|
+
* const { isInitialized, isInitializing, error } = useCrudifyInitializer();
|
|
467
|
+
*
|
|
468
|
+
* if (isInitializing) return <Spinner />;
|
|
469
|
+
* if (error) return <ErrorDisplay error={error} />;
|
|
470
|
+
*
|
|
471
|
+
* return <div>Ready!</div>;
|
|
472
|
+
* }
|
|
473
|
+
* ```
|
|
474
|
+
*/
|
|
475
|
+
declare const useCrudifyInitializer: () => CrudifyInitializerContextValue;
|
|
476
|
+
|
|
244
477
|
interface TranslationsProviderProps {
|
|
245
478
|
children: React.ReactNode;
|
|
246
479
|
subscriberKey: string;
|
|
@@ -327,20 +560,26 @@ interface TranslationResponse {
|
|
|
327
560
|
declare class TranslationService {
|
|
328
561
|
private static instance;
|
|
329
562
|
private enableDebug;
|
|
563
|
+
private initializationPromise;
|
|
564
|
+
private isInitialized;
|
|
330
565
|
private constructor();
|
|
331
566
|
static getInstance(): TranslationService;
|
|
332
567
|
/**
|
|
333
568
|
* Set debug mode
|
|
334
569
|
*/
|
|
335
570
|
setDebug(enable: boolean): void;
|
|
571
|
+
/**
|
|
572
|
+
* Ensure crudify is initialized before making API calls
|
|
573
|
+
* Thread-safe: multiple calls will wait for the same initialization
|
|
574
|
+
*/
|
|
575
|
+
private ensureCrudifyInitialized;
|
|
336
576
|
/**
|
|
337
577
|
* Fetch translations with cache strategy
|
|
338
578
|
* 1. Try cache (if valid and not changed)
|
|
339
|
-
* 2.
|
|
340
|
-
* 3. Try
|
|
341
|
-
* 4.
|
|
342
|
-
*
|
|
343
|
-
* Note: Assumes crudify SDK is already initialized by the app
|
|
579
|
+
* 2. Ensure crudify is initialized
|
|
580
|
+
* 3. Try API fetch via crudify SDK
|
|
581
|
+
* 4. Try expired cache
|
|
582
|
+
* 5. Fall back to critical bundle
|
|
344
583
|
*/
|
|
345
584
|
fetchTranslations(options: FetchTranslationsOptions): Promise<Record<string, Record<string, string>>>;
|
|
346
585
|
/**
|
|
@@ -664,4 +903,4 @@ declare const crudifyAdmin: {
|
|
|
664
903
|
getModuleVersions: (moduleKey: string) => Promise<ApiResponse<any[]>>;
|
|
665
904
|
};
|
|
666
905
|
|
|
667
|
-
export { AuthRoute, type AuthRouteProps, CRITICAL_TRANSLATIONS, type CriticalTranslationKey, CrudifyLoginConfig, CrudifyProvider, CrudifyThemeProvider, type CrudifyThemeProviderProps, type FetchTranslationsOptions, LoginResult, type NotificationOptions, ProtectedRoute, type ProtectedRouteProps, SessionDebugInfo, SessionLoadingScreen, type SessionLoadingScreenProps, SessionProvider, type SessionProviderProps, type SupportedLanguage, TokenData, type TranslationResponse, TranslationService, type TranslationsContextValue, TranslationsProvider, type TranslationsProviderProps, UseSessionOptions, crudifyAdmin, extractSafeRedirectFromUrl, getCriticalLanguages, getCriticalTranslations, translationService, useCrudify, useSessionContext, useTranslations, validateInternalRedirect };
|
|
906
|
+
export { AuthRoute, type AuthRouteProps, CRITICAL_TRANSLATIONS, type CriticalTranslationKey, CrudifyInitializationManager, CrudifyInitializer, type CrudifyInitializerConfig, type CrudifyInitializerProps, CrudifyLoginConfig, CrudifyProvider, CrudifyThemeProvider, type CrudifyThemeProviderProps, type FetchTranslationsOptions, type InitializationPriority, type InitializationRequest, type InitializationStatus, LoginResult, type NotificationOptions, ProtectedRoute, type ProtectedRouteProps, SessionDebugInfo, SessionLoadingScreen, type SessionLoadingScreenProps, SessionProvider, type SessionProviderProps, type SupportedLanguage, TokenData, type TranslationResponse, TranslationService, type TranslationsContextValue, TranslationsProvider, type TranslationsProviderProps, UseSessionOptions, crudifyAdmin, crudifyInitManager, extractSafeRedirectFromUrl, getCriticalLanguages, getCriticalTranslations, translationService, useCrudify, useCrudifyInitializer, useSessionContext, useTranslations, validateInternalRedirect };
|