@donotdev/ui 0.0.2 → 0.0.3
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/components/auth/AuthMenu.d.ts.map +1 -1
- package/dist/components/auth/AuthMenu.js +15 -28
- package/dist/components/common/FeatureCard.js +1 -1
- package/dist/components/cookie-consent/CookieConsent.d.ts.map +1 -1
- package/dist/components/cookie-consent/CookieConsent.js +2 -41
- package/dist/components/cookie-consent/index.d.ts +0 -1
- package/dist/components/cookie-consent/index.d.ts.map +1 -1
- package/dist/components/cookie-consent/index.js +1 -1
- package/dist/components/layout/components/DropdownNavigation.d.ts.map +1 -1
- package/dist/components/layout/components/header/ThemeToggle.d.ts +1 -1
- package/dist/components/layout/components/header/ThemeToggle.d.ts.map +1 -1
- package/dist/components/layout/components/header/ThemeToggle.js +5 -4
- package/dist/dndev.css +137 -120
- package/dist/index.js +4 -4
- package/dist/internal/devtools/DebugTools.d.ts.map +1 -1
- package/dist/internal/devtools/DebugTools.js +8 -4
- package/dist/internal/devtools/components/ConfigTab.d.ts.map +1 -1
- package/dist/internal/devtools/components/ConfigTab.js +31 -133
- package/dist/internal/devtools/components/DebugDialog.d.ts.map +1 -1
- package/dist/internal/devtools/components/DebugDialog.js +11 -520
- package/dist/internal/devtools/components/DesignTab.d.ts +2 -0
- package/dist/internal/devtools/components/DesignTab.d.ts.map +1 -0
- package/dist/internal/devtools/components/DesignTab.js +220 -0
- package/dist/internal/devtools/components/StoresTab.d.ts.map +1 -1
- package/dist/internal/devtools/components/StoresTab.js +54 -102
- package/dist/internal/devtools/components/index.d.ts +1 -6
- package/dist/internal/devtools/components/index.d.ts.map +1 -1
- package/dist/internal/devtools/components/index.js +1 -6
- package/dist/internal/devtools/utils/index.d.ts +0 -1
- package/dist/internal/devtools/utils/index.d.ts.map +1 -1
- package/dist/internal/devtools/utils/index.js +0 -1
- package/dist/internal/initializers/BaseStoresInitializer.d.ts.map +1 -1
- package/dist/internal/initializers/BaseStoresInitializer.js +25 -58
- package/dist/internal/layout/DnDevLayout.js +3 -3
- package/dist/internal/layout/components/footer/FooterBranding.d.ts.map +1 -1
- package/dist/internal/layout/components/footer/FooterBranding.js +3 -1
- package/dist/routing/AuthGuard.d.ts +14 -10
- package/dist/routing/AuthGuard.d.ts.map +1 -1
- package/dist/routing/AuthGuard.js +25 -22
- package/dist/routing/Link.d.ts +2 -2
- package/dist/routing/Link.js +2 -2
- package/dist/routing/hooks/hooks.next.js +1 -1
- package/dist/routing/hooks/hooks.vite.js +1 -1
- package/dist/routing/hooks/useRedirectGuard.next.d.ts +2 -36
- package/dist/routing/hooks/useRedirectGuard.next.d.ts.map +1 -1
- package/dist/routing/hooks/useRedirectGuard.next.js +14 -55
- package/dist/routing/hooks/useRedirectGuard.vite.d.ts +2 -36
- package/dist/routing/hooks/useRedirectGuard.vite.d.ts.map +1 -1
- package/dist/routing/hooks/useRedirectGuard.vite.js +14 -55
- package/dist/routing/index.d.ts +0 -1
- package/dist/routing/index.d.ts.map +1 -1
- package/dist/routing/index.js +1 -1
- package/dist/styles/index.css +137 -120
- package/dist/utils/assetResolver.d.ts +5 -5
- package/dist/utils/assetResolver.js +4 -4
- package/dist/utils/useAuthSafe.d.ts +25 -12
- package/dist/utils/useAuthSafe.d.ts.map +1 -1
- package/dist/utils/useAuthSafe.js +3 -1
- package/dist/utils/useAuthVisibility.d.ts +3 -3
- package/dist/utils/useAuthVisibility.d.ts.map +1 -1
- package/dist/utils/useAuthVisibility.js +25 -21
- package/dist/utils/useBillingVisibility.d.ts +2 -2
- package/dist/utils/useBillingVisibility.d.ts.map +1 -1
- package/dist/utils/useBillingVisibility.js +12 -13
- package/dist/utils/useCrudSafe.d.ts +1 -1
- package/dist/utils/useCrudSafe.d.ts.map +1 -1
- package/dist/utils/useCrudSafe.js +26 -13
- package/dist/utils/useOAuthSafe.d.ts +25 -12
- package/dist/utils/useOAuthSafe.d.ts.map +1 -1
- package/dist/utils/useStripeBillingSafe.d.ts +30 -18
- package/dist/utils/useStripeBillingSafe.d.ts.map +1 -1
- package/dist/utils/useStripeBillingSafe.js +5 -6
- package/dist/vite-routing/AppRoutes.d.ts.map +1 -1
- package/dist/vite-routing/AppRoutes.js +5 -5
- package/dist/vite-routing/RootLayout.d.ts.map +1 -1
- package/dist/vite-routing/RootLayout.js +34 -7
- package/package.json +9 -9
- package/dist/internal/devtools/components/AuthTab.d.ts +0 -2
- package/dist/internal/devtools/components/AuthTab.d.ts.map +0 -1
- package/dist/internal/devtools/components/AuthTab.js +0 -98
- package/dist/internal/devtools/components/ColorRatioTab.d.ts +0 -2
- package/dist/internal/devtools/components/ColorRatioTab.d.ts.map +0 -1
- package/dist/internal/devtools/components/ColorRatioTab.js +0 -322
- package/dist/internal/devtools/components/DebugToggle.d.ts +0 -2
- package/dist/internal/devtools/components/DebugToggle.d.ts.map +0 -1
- package/dist/internal/devtools/components/DebugToggle.js +0 -57
- package/dist/internal/devtools/components/EnvironmentTab.d.ts +0 -2
- package/dist/internal/devtools/components/EnvironmentTab.d.ts.map +0 -1
- package/dist/internal/devtools/components/EnvironmentTab.js +0 -26
- package/dist/internal/devtools/components/I18nTab.d.ts +0 -2
- package/dist/internal/devtools/components/I18nTab.d.ts.map +0 -1
- package/dist/internal/devtools/components/I18nTab.js +0 -76
- package/dist/internal/devtools/components/OAuthGuideButton.d.ts +0 -10
- package/dist/internal/devtools/components/OAuthGuideButton.d.ts.map +0 -1
- package/dist/internal/devtools/components/OAuthGuideButton.js +0 -71
- package/dist/internal/devtools/components/StripeDebugTab.d.ts +0 -2
- package/dist/internal/devtools/components/StripeDebugTab.d.ts.map +0 -1
- package/dist/internal/devtools/components/StripeDebugTab.js +0 -175
- package/dist/internal/devtools/components/ThemesTab.d.ts +0 -2
- package/dist/internal/devtools/components/ThemesTab.d.ts.map +0 -1
- package/dist/internal/devtools/components/ThemesTab.js +0 -77
- package/dist/internal/devtools/utils/spacingAnalyzer.d.ts +0 -15
- package/dist/internal/devtools/utils/spacingAnalyzer.d.ts.map +0 -1
- package/dist/internal/devtools/utils/spacingAnalyzer.js +0 -88
|
@@ -3,18 +3,31 @@
|
|
|
3
3
|
* @description Provides auth functionality when @donotdev/auth is installed,
|
|
4
4
|
* gracefully degrades to no-op when not installed.
|
|
5
5
|
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
*
|
|
17
|
-
*
|
|
6
|
+
* ## CRITICAL: DO NOT USE DYNAMIC IMPORTS
|
|
7
|
+
*
|
|
8
|
+
* This file MUST use sync `import * as authModule from '@donotdev/auth'`
|
|
9
|
+
* at module level. DO NOT refactor to use async `import('@donotdev/auth').then(...)`.
|
|
10
|
+
*
|
|
11
|
+
* ### Why sync import is required:
|
|
12
|
+
*
|
|
13
|
+
* 1. **Bundler aliasing**: Vite/webpack alias missing packages to empty modules
|
|
14
|
+
* at BUILD TIME. The import completes immediately (no async).
|
|
15
|
+
*
|
|
16
|
+
* 2. **Rules of Hooks**: If we use async dynamic import:
|
|
17
|
+
* - First render: `realUseAuth = null` → uses stub (0 hooks)
|
|
18
|
+
* - Async completes: `realUseAuth = useAuth` → now has hooks
|
|
19
|
+
* - Next render: React sees different hook count → CRASH
|
|
20
|
+
*
|
|
21
|
+
* 3. **Monorepo gotcha**: Dynamic imports resolve workspace packages even when
|
|
22
|
+
* the consuming app doesn't have them as dependencies. This causes the
|
|
23
|
+
* real hook to activate unexpectedly → Rules of Hooks violation.
|
|
24
|
+
*
|
|
25
|
+
* 4. **Decision is immutable**: With sync import, `authModule?.useAuth` is
|
|
26
|
+
* evaluated ONCE at module load. It's either the real hook or undefined.
|
|
27
|
+
* This never changes during the app lifecycle.
|
|
28
|
+
*
|
|
29
|
+
* @see docs/development/GRACEFUL_DEGRADATION.md
|
|
30
|
+
* @version 0.0.4
|
|
18
31
|
* @since 0.0.1
|
|
19
32
|
* @author AMBROISE PARK Consulting
|
|
20
33
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useAuthSafe.d.ts","sourceRoot":"","sources":["../../src/utils/useAuthSafe.ts"],"names":[],"mappings":"AAEA
|
|
1
|
+
{"version":3,"file":"useAuthSafe.d.ts","sourceRoot":"","sources":["../../src/utils/useAuthSafe.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAoB9C;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,WAAW,CAAC,CAAC,SAAS,MAAM,OAAO,EAAE,GAAG,EAAE,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAKvE;AAED;;GAEG;AACH,eAAO,MAAM,eAAe,SAAoC,CAAC"}
|
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
// packages/ui/src/utils/useAuthSafe.ts
|
|
2
2
|
import { DEGRADED_AUTH_API } from '@donotdev/core';
|
|
3
|
+
// Sync import - bundler aliases to empty module if not installed
|
|
4
|
+
// Decision made ONCE at module load time, never changes
|
|
3
5
|
import * as authModule from '@donotdev/auth';
|
|
4
|
-
//
|
|
6
|
+
// Extract useAuth if available (undefined if package not installed/aliased)
|
|
5
7
|
const realUseAuth = authModule?.useAuth;
|
|
6
8
|
/**
|
|
7
9
|
* Stub that returns degraded auth values.
|
|
@@ -20,9 +20,9 @@ export interface AuthVisibilityState {
|
|
|
20
20
|
* Hook to determine auth UI visibility and loading states
|
|
21
21
|
*
|
|
22
22
|
* **Visibility Rules:**
|
|
23
|
-
* - Hide if
|
|
24
|
-
* - Show with loading if `
|
|
25
|
-
* - Show normal UI when `
|
|
23
|
+
* - Hide if `status !== 'ready' || !isAvailable` (not ready or not installed)
|
|
24
|
+
* - Show with loading if `status === 'initializing'` during operations
|
|
25
|
+
* - Show normal UI when `status === 'ready' && isAvailable`
|
|
26
26
|
*
|
|
27
27
|
* @returns AuthVisibilityState with visibility flags
|
|
28
28
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useAuthVisibility.d.ts","sourceRoot":"","sources":["../../src/utils/useAuthVisibility.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"useAuthVisibility.d.ts","sourceRoot":"","sources":["../../src/utils/useAuthVisibility.ts"],"names":[],"mappings":"AAoBA,MAAM,WAAW,mBAAmB;IAClC;;OAEG;IACH,UAAU,EAAE,OAAO,CAAC;IAEpB;;OAEG;IACH,SAAS,EAAE,OAAO,CAAC;IAEnB;;OAEG;IACH,OAAO,EAAE,OAAO,CAAC;IAEjB;;OAEG;IACH,eAAe,EAAE,OAAO,CAAC;CAC1B;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,wBAAgB,iBAAiB,IAAI,mBAAmB,CAqBvD"}
|
|
@@ -1,25 +1,26 @@
|
|
|
1
1
|
// packages/ui/src/utils/useAuthVisibility.ts
|
|
2
2
|
/**
|
|
3
3
|
* @fileoverview useAuthVisibility Hook
|
|
4
|
-
* @description Determines when to show/hide auth UI based on
|
|
4
|
+
* @description Determines when to show/hide auth UI based on feature status
|
|
5
5
|
*
|
|
6
6
|
* This hook encapsulates the common pattern for auth UI visibility:
|
|
7
|
-
* - Hide if
|
|
8
|
-
* - Show with loading state during
|
|
9
|
-
* - Show normal UI when ready
|
|
7
|
+
* - Hide if status !== 'ready' or not available (not ready yet)
|
|
8
|
+
* - Show with loading state during initialization
|
|
9
|
+
* - Show normal UI when status === 'ready'
|
|
10
10
|
*
|
|
11
|
-
* @version 0.0.
|
|
11
|
+
* @version 0.0.3
|
|
12
12
|
* @since 0.0.1
|
|
13
13
|
* @author AMBROISE PARK Consulting
|
|
14
14
|
*/
|
|
15
|
+
import { useMemo } from 'react';
|
|
15
16
|
import { useAuthSafe } from './useAuthSafe';
|
|
16
17
|
/**
|
|
17
18
|
* Hook to determine auth UI visibility and loading states
|
|
18
19
|
*
|
|
19
20
|
* **Visibility Rules:**
|
|
20
|
-
* - Hide if
|
|
21
|
-
* - Show with loading if `
|
|
22
|
-
* - Show normal UI when `
|
|
21
|
+
* - Hide if `status !== 'ready' || !isAvailable` (not ready or not installed)
|
|
22
|
+
* - Show with loading if `status === 'initializing'` during operations
|
|
23
|
+
* - Show normal UI when `status === 'ready' && isAvailable`
|
|
23
24
|
*
|
|
24
25
|
* @returns AuthVisibilityState with visibility flags
|
|
25
26
|
*
|
|
@@ -41,19 +42,22 @@ import { useAuthSafe } from './useAuthSafe';
|
|
|
41
42
|
* ```
|
|
42
43
|
*/
|
|
43
44
|
export function useAuthVisibility() {
|
|
44
|
-
|
|
45
|
-
const
|
|
46
|
-
const loading = useAuthSafe('loading');
|
|
45
|
+
// Read all values first - each triggers subscription
|
|
46
|
+
const status = useAuthSafe('status');
|
|
47
47
|
const isAvailable = useAuthSafe('isAvailable');
|
|
48
48
|
const user = useAuthSafe('user');
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
49
|
+
// Derive all visibility state atomically from current values
|
|
50
|
+
// useMemo ensures consistent state within a single render
|
|
51
|
+
return useMemo(() => {
|
|
52
|
+
const shouldHide = status !== 'ready' || !isAvailable;
|
|
53
|
+
const isLoading = status === 'initializing';
|
|
54
|
+
const isReady = status === 'ready' && isAvailable;
|
|
55
|
+
const isAuthenticated = Boolean(user);
|
|
56
|
+
return {
|
|
57
|
+
shouldHide,
|
|
58
|
+
isLoading,
|
|
59
|
+
isReady,
|
|
60
|
+
isAuthenticated,
|
|
61
|
+
};
|
|
62
|
+
}, [status, isAvailable, user]);
|
|
59
63
|
}
|
|
@@ -17,8 +17,8 @@ export interface BillingVisibilityState {
|
|
|
17
17
|
*
|
|
18
18
|
* **Visibility Rules:**
|
|
19
19
|
* - Hide if `!isAvailable` (not installed/configured)
|
|
20
|
-
* - Show with loading if `
|
|
21
|
-
* - Show normal UI when `isAvailable &&
|
|
20
|
+
* - Show with loading if `status === 'initializing'` during operations
|
|
21
|
+
* - Show normal UI when `isAvailable && status === 'ready'`
|
|
22
22
|
*
|
|
23
23
|
* @returns BillingVisibilityState with visibility flags
|
|
24
24
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useBillingVisibility.d.ts","sourceRoot":"","sources":["../../src/utils/useBillingVisibility.ts"],"names":[],"mappings":"AAmBA,MAAM,WAAW,sBAAsB;IACrC;;OAEG;IACH,UAAU,EAAE,OAAO,CAAC;IAEpB;;OAEG;IACH,SAAS,EAAE,OAAO,CAAC;IAEnB;;OAEG;IACH,OAAO,EAAE,OAAO,CAAC;CAClB;AAED;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAgB,oBAAoB,IAAI,sBAAsB,
|
|
1
|
+
{"version":3,"file":"useBillingVisibility.d.ts","sourceRoot":"","sources":["../../src/utils/useBillingVisibility.ts"],"names":[],"mappings":"AAmBA,MAAM,WAAW,sBAAsB;IACrC;;OAEG;IACH,UAAU,EAAE,OAAO,CAAC;IAEpB;;OAEG;IACH,SAAS,EAAE,OAAO,CAAC;IAEnB;;OAEG;IACH,OAAO,EAAE,OAAO,CAAC;CAClB;AAED;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAgB,oBAAoB,IAAI,sBAAsB,CA0B7D"}
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
// packages/ui/src/utils/useBillingVisibility.ts
|
|
2
2
|
/**
|
|
3
3
|
* @fileoverview useBillingVisibility Hook
|
|
4
|
-
* @description Determines when to show/hide billing UI based on
|
|
4
|
+
* @description Determines when to show/hide billing UI based on feature status
|
|
5
5
|
*
|
|
6
6
|
* This hook encapsulates the common pattern for billing UI visibility:
|
|
7
7
|
* - Hide if not available (not installed/configured)
|
|
8
|
-
* - Show with loading state during
|
|
9
|
-
* - Show normal UI when ready
|
|
8
|
+
* - Show with loading state during initialization
|
|
9
|
+
* - Show normal UI when status === 'ready'
|
|
10
10
|
*
|
|
11
|
-
* @version 0.0.
|
|
11
|
+
* @version 0.0.3
|
|
12
12
|
* @since 0.0.1
|
|
13
13
|
* @author AMBROISE PARK Consulting
|
|
14
14
|
*/
|
|
@@ -19,8 +19,8 @@ import { useStripeBillingSafe } from './useStripeBillingSafe';
|
|
|
19
19
|
*
|
|
20
20
|
* **Visibility Rules:**
|
|
21
21
|
* - Hide if `!isAvailable` (not installed/configured)
|
|
22
|
-
* - Show with loading if `
|
|
23
|
-
* - Show normal UI when `isAvailable &&
|
|
22
|
+
* - Show with loading if `status === 'initializing'` during operations
|
|
23
|
+
* - Show normal UI when `isAvailable && status === 'ready'`
|
|
24
24
|
*
|
|
25
25
|
* @returns BillingVisibilityState with visibility flags
|
|
26
26
|
*
|
|
@@ -42,16 +42,15 @@ import { useStripeBillingSafe } from './useStripeBillingSafe';
|
|
|
42
42
|
export function useBillingVisibility() {
|
|
43
43
|
// Get auth state for billing (required for isAvailable to work)
|
|
44
44
|
const user = useAuthSafe('user');
|
|
45
|
-
const
|
|
46
|
-
const
|
|
47
|
-
const
|
|
48
|
-
const loading = useStripeBillingSafe('loading', authState);
|
|
45
|
+
const status = useAuthSafe('status');
|
|
46
|
+
const authState = { user, status };
|
|
47
|
+
const billingStatus = useStripeBillingSafe('status', authState);
|
|
49
48
|
const isAvailable = useStripeBillingSafe('isAvailable', authState);
|
|
50
49
|
const shouldHide = !isAvailable;
|
|
51
|
-
const isLoading =
|
|
52
|
-
const isReady = isAvailable;
|
|
50
|
+
const isLoading = billingStatus === 'initializing';
|
|
51
|
+
const isReady = isAvailable && billingStatus === 'ready';
|
|
53
52
|
console.log('[useBillingVisibility]', {
|
|
54
|
-
|
|
53
|
+
billingStatus,
|
|
55
54
|
isAvailable,
|
|
56
55
|
shouldHide,
|
|
57
56
|
isLoading,
|
|
@@ -17,7 +17,7 @@ interface UseCrudOptions<T> {
|
|
|
17
17
|
* @example
|
|
18
18
|
* ```typescript
|
|
19
19
|
* const crud = useCrudSafe('users', { backend: 'firestore', schema: UserSchema });
|
|
20
|
-
* const { data,
|
|
20
|
+
* const { data, status, error, get, set } = crud;
|
|
21
21
|
* ```
|
|
22
22
|
*/
|
|
23
23
|
export declare function useCrudSafe<T = unknown>(collection: string, options?: UseCrudOptions<T>): CrudAPI<T>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useCrudSafe.d.ts","sourceRoot":"","sources":["../../src/utils/useCrudSafe.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"useCrudSafe.d.ts","sourceRoot":"","sources":["../../src/utils/useCrudSafe.ts"],"names":[],"mappings":"AAqCA,OAAO,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAK3D,KAAK,WAAW,GAAG,WAAW,GAAG,WAAW,CAAC;AAE7C,UAAU,cAAc,CAAC,CAAC;IACxB,OAAO,CAAC,EAAE,WAAW,CAAC;IACtB,MAAM,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC;CACzB;AAeD;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,WAAW,CAAC,CAAC,GAAG,OAAO,EACrC,UAAU,EAAE,MAAM,EAClB,OAAO,GAAE,cAAc,CAAC,CAAC,CAAM,GAC9B,OAAO,CAAC,CAAC,CAAC,CAKZ;AAED;;GAEG;AACH,eAAO,MAAM,eAAe,SAAoC,CAAC"}
|
|
@@ -4,18 +4,31 @@
|
|
|
4
4
|
* @description Provides CRUD functionality when @donotdev/crud is installed,
|
|
5
5
|
* gracefully degrades to no-op when not installed.
|
|
6
6
|
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
*
|
|
7
|
+
* ## CRITICAL: DO NOT USE DYNAMIC IMPORTS
|
|
8
|
+
*
|
|
9
|
+
* This file MUST use sync `import * as crudModule from '@donotdev/crud'`
|
|
10
|
+
* at module level. DO NOT refactor to use async `import('@donotdev/crud').then(...)`.
|
|
11
|
+
*
|
|
12
|
+
* ### Why sync import is required:
|
|
13
|
+
*
|
|
14
|
+
* 1. **Bundler aliasing**: Vite/webpack alias missing packages to empty modules
|
|
15
|
+
* at BUILD TIME. The import completes immediately (no async).
|
|
16
|
+
*
|
|
17
|
+
* 2. **Rules of Hooks**: If we use async dynamic import:
|
|
18
|
+
* - First render: `realUseCrud = null` → uses stub (0 hooks)
|
|
19
|
+
* - Async completes: `realUseCrud = useCrud` → now has hooks
|
|
20
|
+
* - Next render: React sees different hook count → CRASH
|
|
21
|
+
*
|
|
22
|
+
* 3. **Monorepo gotcha**: Dynamic imports resolve workspace packages even when
|
|
23
|
+
* the consuming app doesn't have them as dependencies. This causes the
|
|
24
|
+
* real hook to activate unexpectedly → Rules of Hooks violation.
|
|
25
|
+
*
|
|
26
|
+
* 4. **Decision is immutable**: With sync import, `crudModule?.useCrud`
|
|
27
|
+
* is evaluated ONCE at module load. It's either the real hook or undefined.
|
|
28
|
+
* This never changes during the app lifecycle.
|
|
29
|
+
*
|
|
30
|
+
* @see docs/development/GRACEFUL_DEGRADATION.md
|
|
31
|
+
* @version 0.0.4
|
|
19
32
|
* @since 0.0.1
|
|
20
33
|
* @author AMBROISE PARK Consulting
|
|
21
34
|
*/
|
|
@@ -43,7 +56,7 @@ function useCrudStub() {
|
|
|
43
56
|
* @example
|
|
44
57
|
* ```typescript
|
|
45
58
|
* const crud = useCrudSafe('users', { backend: 'firestore', schema: UserSchema });
|
|
46
|
-
* const { data,
|
|
59
|
+
* const { data, status, error, get, set } = crud;
|
|
47
60
|
* ```
|
|
48
61
|
*/
|
|
49
62
|
export function useCrudSafe(collection, options = {}) {
|
|
@@ -3,18 +3,31 @@
|
|
|
3
3
|
* @description Provides OAuth functionality when @donotdev/oauth is installed,
|
|
4
4
|
* gracefully degrades to no-op when not installed.
|
|
5
5
|
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
*
|
|
17
|
-
*
|
|
6
|
+
* ## CRITICAL: DO NOT USE DYNAMIC IMPORTS
|
|
7
|
+
*
|
|
8
|
+
* This file MUST use sync `import * as oauthModule from '@donotdev/oauth'`
|
|
9
|
+
* at module level. DO NOT refactor to use async `import('@donotdev/oauth').then(...)`.
|
|
10
|
+
*
|
|
11
|
+
* ### Why sync import is required:
|
|
12
|
+
*
|
|
13
|
+
* 1. **Bundler aliasing**: Vite/webpack alias missing packages to empty modules
|
|
14
|
+
* at BUILD TIME. The import completes immediately (no async).
|
|
15
|
+
*
|
|
16
|
+
* 2. **Rules of Hooks**: If we use async dynamic import:
|
|
17
|
+
* - First render: `realUseOAuth = null` → uses stub (0 hooks)
|
|
18
|
+
* - Async completes: `realUseOAuth = useOAuth` → now has hooks
|
|
19
|
+
* - Next render: React sees different hook count → CRASH
|
|
20
|
+
*
|
|
21
|
+
* 3. **Monorepo gotcha**: Dynamic imports resolve workspace packages even when
|
|
22
|
+
* the consuming app doesn't have them as dependencies. This causes the
|
|
23
|
+
* real hook to activate unexpectedly → Rules of Hooks violation.
|
|
24
|
+
*
|
|
25
|
+
* 4. **Decision is immutable**: With sync import, `oauthModule?.useOAuth`
|
|
26
|
+
* is evaluated ONCE at module load. It's either the real hook or undefined.
|
|
27
|
+
* This never changes during the app lifecycle.
|
|
28
|
+
*
|
|
29
|
+
* @see docs/development/GRACEFUL_DEGRADATION.md
|
|
30
|
+
* @version 0.0.2
|
|
18
31
|
* @since 0.0.1
|
|
19
32
|
* @author AMBROISE PARK Consulting
|
|
20
33
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useOAuthSafe.d.ts","sourceRoot":"","sources":["../../src/utils/useOAuthSafe.ts"],"names":[],"mappings":"AAEA
|
|
1
|
+
{"version":3,"file":"useOAuthSafe.d.ts","sourceRoot":"","sources":["../../src/utils/useOAuthSafe.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAkB/C;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,YAAY,CAAC,CAAC,SAAS,MAAM,QAAQ,EAAE,GAAG,EAAE,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAK1E;AAED;;GAEG;AACH,eAAO,MAAM,gBAAgB,SAAqC,CAAC"}
|
|
@@ -3,18 +3,31 @@
|
|
|
3
3
|
* @description Provides billing functionality when @donotdev/billing is installed,
|
|
4
4
|
* gracefully degrades to no-op when not installed.
|
|
5
5
|
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
*
|
|
17
|
-
*
|
|
6
|
+
* ## CRITICAL: DO NOT USE DYNAMIC IMPORTS
|
|
7
|
+
*
|
|
8
|
+
* This file MUST use sync `import * as billingModule from '@donotdev/billing'`
|
|
9
|
+
* at module level. DO NOT refactor to use async `import('@donotdev/billing').then(...)`.
|
|
10
|
+
*
|
|
11
|
+
* ### Why sync import is required:
|
|
12
|
+
*
|
|
13
|
+
* 1. **Bundler aliasing**: Vite/webpack alias missing packages to empty modules
|
|
14
|
+
* at BUILD TIME. The import completes immediately (no async).
|
|
15
|
+
*
|
|
16
|
+
* 2. **Rules of Hooks**: If we use async dynamic import:
|
|
17
|
+
* - First render: `realUseStripeBilling = null` → uses stub (0 hooks)
|
|
18
|
+
* - Async completes: `realUseStripeBilling = useStripeBilling` → now has hooks
|
|
19
|
+
* - Next render: React sees different hook count → CRASH
|
|
20
|
+
*
|
|
21
|
+
* 3. **Monorepo gotcha**: Dynamic imports resolve workspace packages even when
|
|
22
|
+
* the consuming app doesn't have them as dependencies. This causes the
|
|
23
|
+
* real hook to activate unexpectedly → Rules of Hooks violation.
|
|
24
|
+
*
|
|
25
|
+
* 4. **Decision is immutable**: With sync import, `billingModule?.useStripeBilling`
|
|
26
|
+
* is evaluated ONCE at module load. It's either the real hook or undefined.
|
|
27
|
+
* This never changes during the app lifecycle.
|
|
28
|
+
*
|
|
29
|
+
* @see docs/development/GRACEFUL_DEGRADATION.md
|
|
30
|
+
* @version 0.0.4
|
|
18
31
|
* @since 0.0.1
|
|
19
32
|
* @author AMBROISE PARK Consulting
|
|
20
33
|
*/
|
|
@@ -28,23 +41,22 @@ export type { BillingAuthState } from '@donotdev/billing';
|
|
|
28
41
|
* - If not installed → returns degraded API values
|
|
29
42
|
*
|
|
30
43
|
* **IMPORTANT:** For `isAvailable` to return `true`, you must pass `authState`.
|
|
31
|
-
* Without auth state, billing will return `isAvailable: false` until auth
|
|
44
|
+
* Without auth state, billing will return `isAvailable: false` until auth status is `ready`.
|
|
32
45
|
*
|
|
33
46
|
* @param key - Property name to access from billing API
|
|
34
|
-
* @param authState - Auth state from useAuthSafe (user,
|
|
47
|
+
* @param authState - Auth state from useAuthSafe (user, status)
|
|
35
48
|
* @returns The billing API value, or degraded value if billing unavailable
|
|
36
49
|
*
|
|
37
50
|
* @example
|
|
38
51
|
* ```typescript
|
|
39
52
|
* // Get auth state first
|
|
40
53
|
* const user = useAuthSafe('user');
|
|
41
|
-
* const
|
|
42
|
-
* const
|
|
43
|
-
* const authState = { user, initialized, authStateChecked };
|
|
54
|
+
* const status = useAuthSafe('status'); // 'initializing' | 'ready' | 'degraded' | 'error'
|
|
55
|
+
* const authState = { user, status };
|
|
44
56
|
*
|
|
45
57
|
* // Pass to billing
|
|
46
58
|
* const checkout = useStripeBillingSafe('checkout', authState);
|
|
47
|
-
* const
|
|
59
|
+
* const billingStatus = useStripeBillingSafe('status', authState);
|
|
48
60
|
* const isAvailable = useStripeBillingSafe('isAvailable', authState);
|
|
49
61
|
* ```
|
|
50
62
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useStripeBillingSafe.d.ts","sourceRoot":"","sources":["../../src/utils/useStripeBillingSafe.ts"],"names":[],"mappings":"AAEA
|
|
1
|
+
{"version":3,"file":"useStripeBillingSafe.d.ts","sourceRoot":"","sources":["../../src/utils/useStripeBillingSafe.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAIjD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAG1D,YAAY,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAoB1D;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,wBAAgB,oBAAoB,CAAC,CAAC,SAAS,MAAM,UAAU,EAC7D,GAAG,EAAE,CAAC,EACN,SAAS,CAAC,EAAE,gBAAgB,GAC3B,UAAU,CAAC,CAAC,CAAC,CAKf;AAED;;GAEG;AACH,eAAO,MAAM,kBAAkB,SAA6C,CAAC"}
|
|
@@ -17,23 +17,22 @@ function useStripeBillingStub(key) {
|
|
|
17
17
|
* - If not installed → returns degraded API values
|
|
18
18
|
*
|
|
19
19
|
* **IMPORTANT:** For `isAvailable` to return `true`, you must pass `authState`.
|
|
20
|
-
* Without auth state, billing will return `isAvailable: false` until auth
|
|
20
|
+
* Without auth state, billing will return `isAvailable: false` until auth status is `ready`.
|
|
21
21
|
*
|
|
22
22
|
* @param key - Property name to access from billing API
|
|
23
|
-
* @param authState - Auth state from useAuthSafe (user,
|
|
23
|
+
* @param authState - Auth state from useAuthSafe (user, status)
|
|
24
24
|
* @returns The billing API value, or degraded value if billing unavailable
|
|
25
25
|
*
|
|
26
26
|
* @example
|
|
27
27
|
* ```typescript
|
|
28
28
|
* // Get auth state first
|
|
29
29
|
* const user = useAuthSafe('user');
|
|
30
|
-
* const
|
|
31
|
-
* const
|
|
32
|
-
* const authState = { user, initialized, authStateChecked };
|
|
30
|
+
* const status = useAuthSafe('status'); // 'initializing' | 'ready' | 'degraded' | 'error'
|
|
31
|
+
* const authState = { user, status };
|
|
33
32
|
*
|
|
34
33
|
* // Pass to billing
|
|
35
34
|
* const checkout = useStripeBillingSafe('checkout', authState);
|
|
36
|
-
* const
|
|
35
|
+
* const billingStatus = useStripeBillingSafe('status', authState);
|
|
37
36
|
* const isAvailable = useStripeBillingSafe('isAvailable', authState);
|
|
38
37
|
* ```
|
|
39
38
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AppRoutes.d.ts","sourceRoot":"","sources":["../../src/vite-routing/AppRoutes.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"AppRoutes.d.ts","sourceRoot":"","sources":["../../src/vite-routing/AppRoutes.tsx"],"names":[],"mappings":"AAoDA,OAAO,EAAiB,KAAK,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAuFlE;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,GAAG,CAAC;IACX,MAAM,EAAE,KAAK,CAAC;QACZ,IAAI,EAAE,MAAM,CAAC;QACb,SAAS,EAAE,GAAG,CAAC;QACf,IAAI,CAAC,EAAE,GAAG,CAAC;QACX,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;KACpB,CAAC,CAAC;CACJ;AAED;;GAEG;AACH,UAAU,sBAAsB;IAC9B,4CAA4C;IAC5C,WAAW,EAAE,UAAU,EAAE,CAAC;IAC1B,0CAA0C;IAC1C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,oCAAoC;IACpC,MAAM,CAAC,EAAE,YAAY,CAAC;CACvB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyCG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,sBAAsB,yCA8D9D"}
|
|
@@ -32,7 +32,7 @@ import { jsx as _jsx } from "react/jsx-runtime";
|
|
|
32
32
|
* - **Suspense Boundaries**: Proper loading states prevent UI flicker
|
|
33
33
|
* - **Native Scroll Restoration**: Built-in scroll position memory
|
|
34
34
|
*
|
|
35
|
-
* @version 0.0.
|
|
35
|
+
* @version 0.0.3
|
|
36
36
|
* @since 0.0.1
|
|
37
37
|
* @author AMBROISE PARK Consulting
|
|
38
38
|
* @license Commercial
|
|
@@ -46,7 +46,7 @@ import { jsx as _jsx } from "react/jsx-runtime";
|
|
|
46
46
|
* <RouterProvider router={router} />
|
|
47
47
|
* ```
|
|
48
48
|
*/
|
|
49
|
-
import { lazy, Suspense
|
|
49
|
+
import { lazy, Suspense } from 'react';
|
|
50
50
|
import { createBrowserRouter } from 'react-router-dom';
|
|
51
51
|
import {} from '@donotdev/core';
|
|
52
52
|
import { RootLayout } from './RootLayout';
|
|
@@ -87,7 +87,7 @@ const LazyRoute = ({ component, path }) => {
|
|
|
87
87
|
lazyComponentCache.set(path, lazy(component));
|
|
88
88
|
}
|
|
89
89
|
const Component = lazyComponentCache.get(path);
|
|
90
|
-
return _jsx(Component, {});
|
|
90
|
+
return (_jsx(Suspense, { fallback: _jsx(Loader, {}), children: _jsx(Component, {}) }));
|
|
91
91
|
};
|
|
92
92
|
/**
|
|
93
93
|
* Parse auth configuration to PageAuth | false for AuthGuard
|
|
@@ -177,9 +177,9 @@ export function createAppRouter(options) {
|
|
|
177
177
|
element: _jsx(RootLayout, { layout: layout }),
|
|
178
178
|
children: [
|
|
179
179
|
{
|
|
180
|
-
/** HomePage route -
|
|
180
|
+
/** HomePage route - lazy loaded, public (no AuthGuard) */
|
|
181
181
|
index: true,
|
|
182
|
-
element:
|
|
182
|
+
element: (_jsx(LazyRoute, { component: homePageRoute.component, path: homePageRoute.path })),
|
|
183
183
|
},
|
|
184
184
|
/** All other routes are discovered and rendered here */
|
|
185
185
|
...routesWithParsedAuth
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RootLayout.d.ts","sourceRoot":"","sources":["../../src/vite-routing/RootLayout.tsx"],"names":[],"mappings":"AAoBA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"RootLayout.d.ts","sourceRoot":"","sources":["../../src/vite-routing/RootLayout.tsx"],"names":[],"mappings":"AAoBA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAuLnD;;GAEG;AACH,UAAU,oBAAoB;IAC5B,2BAA2B;IAC3B,MAAM,CAAC,EAAE,YAAY,CAAC;CACvB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH,wBAAgB,UAAU,CAAC,EAAE,MAAM,EAAE,EAAE,oBAAoB,2CA6B1D"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
1
|
+
import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
2
|
// packages/ui/src/vite-routing/RootLayout.tsx
|
|
3
3
|
/**
|
|
4
4
|
* @fileoverview RootLayout - Root route layout component
|
|
@@ -18,11 +18,8 @@ import { Outlet, useLocation } from 'react-router-dom';
|
|
|
18
18
|
import { globalEmitter, isClient } from '@donotdev/core';
|
|
19
19
|
import Loader from '../components/common/Loader';
|
|
20
20
|
import { DnDevLayout } from '../internal/layout/DnDevLayout';
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
const UIProviders = lazy(() => import('../internal/providers/UIProviders').then((m) => ({
|
|
24
|
-
default: m.UIProviders,
|
|
25
|
-
})));
|
|
21
|
+
import { UIProviders } from '../internal/providers/UIProviders';
|
|
22
|
+
// Only lazy load non-critical components (not in render path)
|
|
26
23
|
const AutoMetaTags = lazy(() => import('../internal/layout/components/AutoMetaTags').then((m) => ({
|
|
27
24
|
default: m.default,
|
|
28
25
|
})));
|
|
@@ -145,6 +142,36 @@ function FrameworkReadySignal({ children }) {
|
|
|
145
142
|
}, []);
|
|
146
143
|
return _jsx("div", { ref: frameworkRef, children: children });
|
|
147
144
|
}
|
|
145
|
+
/**
|
|
146
|
+
* RouteReadySignal - Signals when route content is painted
|
|
147
|
+
*
|
|
148
|
+
* Emits 'DNDEV_ROUTE_READY' event when route content (inside Suspense) is painted.
|
|
149
|
+
* Used in coordination with FrameworkReadySignal to time shell loader removal.
|
|
150
|
+
*
|
|
151
|
+
* Shell loader removed only when BOTH framework AND route are ready,
|
|
152
|
+
* preventing "late arrival" of route content after Header/Footer paint.
|
|
153
|
+
*
|
|
154
|
+
* @version 0.0.1
|
|
155
|
+
* @since 0.0.1
|
|
156
|
+
* @author AMBROISE PARK Consulting
|
|
157
|
+
*/
|
|
158
|
+
function RouteReadySignal({ children }) {
|
|
159
|
+
const hasSignaled = useRef(false);
|
|
160
|
+
useLayoutEffect(() => {
|
|
161
|
+
if (!isClient() || hasSignaled.current)
|
|
162
|
+
return;
|
|
163
|
+
// Wait for two animation frames to ensure paint completion
|
|
164
|
+
requestAnimationFrame(() => {
|
|
165
|
+
requestAnimationFrame(() => {
|
|
166
|
+
if (hasSignaled.current)
|
|
167
|
+
return;
|
|
168
|
+
hasSignaled.current = true;
|
|
169
|
+
globalEmitter.emit('DNDEV_ROUTE_READY');
|
|
170
|
+
});
|
|
171
|
+
});
|
|
172
|
+
}, []);
|
|
173
|
+
return _jsx(_Fragment, { children: children });
|
|
174
|
+
}
|
|
148
175
|
/**
|
|
149
176
|
* RootLayout - Root route layout component
|
|
150
177
|
*
|
|
@@ -179,5 +206,5 @@ function FrameworkReadySignal({ children }) {
|
|
|
179
206
|
* @author AMBROISE PARK Consulting
|
|
180
207
|
*/
|
|
181
208
|
export function RootLayout({ layout }) {
|
|
182
|
-
return (
|
|
209
|
+
return (_jsxs(UIProviders, { children: [_jsx(Suspense, { fallback: null, children: _jsx(AutoMetaTags, {}) }), _jsxs(FrameworkReadySignal, { children: [_jsx(DnDevLayout, { layout: layout, children: _jsx(RouteReadySignal, { children: _jsx(Outlet, {}) }) }), _jsx(CustomScrollRestoration, {}), _jsxs(Suspense, { fallback: null, children: [_jsx(ConsentBanner, {}), _jsx(PWAUpdateNotification, {}), _jsx(LicenseWatermark, {})] })] })] }));
|
|
183
210
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@donotdev/ui",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.3",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"private": false,
|
|
6
6
|
"license": "SEE LICENSE IN LICENSE.md",
|
|
@@ -53,14 +53,14 @@
|
|
|
53
53
|
"react-hook-form": "^7.68.0"
|
|
54
54
|
},
|
|
55
55
|
"peerDependencies": {
|
|
56
|
-
"@donotdev/adv-comps": "0.0.
|
|
57
|
-
"@donotdev/auth": "0.0.
|
|
58
|
-
"@donotdev/billing": "0.0.
|
|
59
|
-
"@donotdev/components": "0.0.
|
|
60
|
-
"@donotdev/core": "0.0.
|
|
61
|
-
"@donotdev/crud": "0.0.
|
|
62
|
-
"@donotdev/firebase": "0.0.
|
|
63
|
-
"@donotdev/oauth": "0.0.
|
|
56
|
+
"@donotdev/adv-comps": "0.0.3",
|
|
57
|
+
"@donotdev/auth": "0.0.3",
|
|
58
|
+
"@donotdev/billing": "0.0.3",
|
|
59
|
+
"@donotdev/components": "0.0.3",
|
|
60
|
+
"@donotdev/core": "0.0.3",
|
|
61
|
+
"@donotdev/crud": "0.0.3",
|
|
62
|
+
"@donotdev/firebase": "0.0.3",
|
|
63
|
+
"@donotdev/oauth": "0.0.3",
|
|
64
64
|
"firebase": "^12.5.0",
|
|
65
65
|
"lucide-react": "^0.562.0",
|
|
66
66
|
"react": "^19.2.3",
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"AuthTab.d.ts","sourceRoot":"","sources":["../../../../src/internal/devtools/components/AuthTab.tsx"],"names":[],"mappings":"AAiCA,eAAO,MAAM,OAAO,+CAyNnB,CAAC"}
|