@rozenite/storage-plugin 1.12.0 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +37 -0
- package/README.md +6 -1
- package/dist/devtools/assets/panel-B6Wp0eie.css +1 -0
- package/dist/devtools/assets/panel-D7MFc4HG.js +32 -0
- package/dist/devtools/panel.html +2 -2
- package/dist/react-native/chunks/async-storage.require.cjs +1 -1
- package/dist/react-native/chunks/async-storage.require.js +8 -7
- package/dist/react-native/chunks/index.require.cjs +1 -1
- package/dist/react-native/chunks/index.require.js +70 -64
- package/dist/react-native/chunks/secure-storage.require.cjs +1 -1
- package/dist/react-native/chunks/secure-storage.require.js +22 -14
- package/dist/react-native/chunks/useRozeniteStoragePlugin.require.cjs +1 -1
- package/dist/react-native/chunks/useRozeniteStoragePlugin.require.js +863 -315
- package/dist/react-native/index.d.ts +154 -18
- package/dist/react-native/index.js +10 -2
- package/dist/rozenite.json +1 -1
- package/dist/sdk/index.cjs +1 -1
- package/dist/sdk/index.d.ts +13 -5
- package/dist/sdk/index.js +21 -12
- package/package.json +13 -15
- package/react-native.ts +29 -14
- package/rozenite.config.ts +78 -0
- package/src/react-native/__tests__/entry-preview-pagination.test.ts +262 -0
- package/src/react-native/__tests__/export-snapshot.test.ts +142 -0
- package/src/react-native/__tests__/full-entry-request.test.ts +155 -0
- package/src/react-native/__tests__/import.test.ts +172 -10
- package/src/react-native/__tests__/storage-discovery.test.ts +155 -0
- package/src/react-native/__tests__/storage-view.test.ts +172 -0
- package/src/react-native/__tests__/stress-verification.test.ts +153 -0
- package/src/react-native/__tests__/use-storage-agent-tools.test.ts +231 -0
- package/src/react-native/adapters/async-storage.ts +9 -7
- package/src/react-native/adapters/mmkv.ts +5 -0
- package/src/react-native/adapters/secure-storage.ts +9 -1
- package/src/react-native/entry-preview-pagination.ts +277 -0
- package/src/react-native/export-snapshot.ts +94 -0
- package/src/react-native/full-entry-request.ts +96 -0
- package/src/react-native/import.ts +190 -16
- package/src/react-native/storage-discovery.ts +96 -0
- package/src/react-native/storage-view.ts +45 -103
- package/src/react-native/useRozeniteStoragePlugin.ts +108 -72
- package/src/react-native/useStorageAgentTools.ts +207 -86
- package/src/shared/__tests__/entry-preview.test.ts +117 -0
- package/src/shared/__tests__/snapshot.test.ts +21 -0
- package/src/shared/agent-tools.ts +27 -11
- package/src/shared/entry-preview.ts +59 -0
- package/src/shared/messaging.ts +136 -21
- package/src/shared/snapshot.ts +8 -1
- package/src/shared/types.ts +20 -1
- package/src/ui/__tests__/binary-value-editor-state.test.ts +13 -0
- package/src/ui/__tests__/binary.test.ts +18 -0
- package/src/ui/__tests__/large-value-viewer-state.test.ts +21 -0
- package/src/ui/__tests__/large-value-viewer.test.tsx +63 -0
- package/src/ui/__tests__/panel.test.tsx +409 -0
- package/src/ui/__tests__/storage-groups.test.ts +91 -0
- package/src/ui/__tests__/use-storage-entries.test.tsx +353 -0
- package/src/ui/add-entry-dialog.tsx +65 -105
- package/src/ui/binary-value-editor-state.ts +10 -1
- package/src/ui/binary-value-editor.tsx +57 -33
- package/src/ui/binary.ts +56 -4
- package/src/ui/edit-entry-dialog.tsx +71 -99
- package/src/ui/editor-switcher.tsx +7 -5
- package/src/ui/entry-detail-dialog.tsx +69 -179
- package/src/ui/format-value.tsx +32 -0
- package/src/ui/globals.css +1 -123
- package/src/ui/import-dialog.tsx +66 -91
- package/src/ui/large-value-viewer-state.ts +32 -0
- package/src/ui/large-value-viewer.tsx +71 -0
- package/src/ui/panel.tsx +724 -496
- package/src/ui/query-client.tsx +34 -0
- package/src/ui/storage-groups.ts +66 -0
- package/src/ui/typed-value-editor.tsx +14 -15
- package/src/ui/use-storage-entries.ts +207 -0
- package/tsconfig.json +5 -1
- package/dist/devtools/assets/panel-Bm-SWF7d.js +0 -33
- package/dist/devtools/assets/panel-DIqI4WSp.css +0 -1
- package/postcss.config.js +0 -6
- package/src/ui/confirm-dialog.tsx +0 -100
- package/src/ui/editable-table.tsx +0 -300
- package/tailwind.config.ts +0 -94
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import {
|
|
2
|
+
QueryClient,
|
|
3
|
+
QueryClientProvider,
|
|
4
|
+
type QueryClientConfig,
|
|
5
|
+
} from '@tanstack/react-query';
|
|
6
|
+
import { type ReactNode, useEffect, useState } from 'react';
|
|
7
|
+
|
|
8
|
+
const storageQueryClientConfig: QueryClientConfig = {
|
|
9
|
+
defaultOptions: {
|
|
10
|
+
queries: {
|
|
11
|
+
gcTime: 0,
|
|
12
|
+
refetchOnReconnect: false,
|
|
13
|
+
refetchOnWindowFocus: false,
|
|
14
|
+
retry: false,
|
|
15
|
+
},
|
|
16
|
+
},
|
|
17
|
+
};
|
|
18
|
+
|
|
19
|
+
export const createStorageQueryClient = () =>
|
|
20
|
+
new QueryClient(storageQueryClientConfig);
|
|
21
|
+
|
|
22
|
+
export const StorageQueryClientProvider = ({
|
|
23
|
+
children,
|
|
24
|
+
}: {
|
|
25
|
+
children: ReactNode;
|
|
26
|
+
}) => {
|
|
27
|
+
const [queryClient] = useState(createStorageQueryClient);
|
|
28
|
+
|
|
29
|
+
useEffect(() => () => queryClient.clear(), [queryClient]);
|
|
30
|
+
|
|
31
|
+
return (
|
|
32
|
+
<QueryClientProvider client={queryClient}>{children}</QueryClientProvider>
|
|
33
|
+
);
|
|
34
|
+
};
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import type { StorageTarget } from '../shared/types';
|
|
2
|
+
|
|
3
|
+
export type StorageSnapshotEntry = {
|
|
4
|
+
target: StorageTarget;
|
|
5
|
+
adapterName: string;
|
|
6
|
+
storageName: string;
|
|
7
|
+
entryCount: number;
|
|
8
|
+
};
|
|
9
|
+
|
|
10
|
+
export type StorageSidebarItem = {
|
|
11
|
+
viewId: string;
|
|
12
|
+
storageName: string;
|
|
13
|
+
entryCount: number;
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
export type StorageSidebarGroup = {
|
|
17
|
+
adapterId: string;
|
|
18
|
+
adapterName: string;
|
|
19
|
+
items: StorageSidebarItem[];
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Groups storage snapshots by `target.adapterId` for the sidebar, preserving
|
|
24
|
+
* the order in which each adapter and storage first appeared.
|
|
25
|
+
*/
|
|
26
|
+
export const buildStorageSidebarGroups = (
|
|
27
|
+
snapshots: Map<string, StorageSnapshotEntry>,
|
|
28
|
+
): StorageSidebarGroup[] => {
|
|
29
|
+
const groups = new Map<string, StorageSidebarGroup>();
|
|
30
|
+
|
|
31
|
+
for (const [viewId, snapshot] of snapshots) {
|
|
32
|
+
const { adapterId } = snapshot.target;
|
|
33
|
+
let group = groups.get(adapterId);
|
|
34
|
+
|
|
35
|
+
if (!group) {
|
|
36
|
+
group = { adapterId, adapterName: snapshot.adapterName, items: [] };
|
|
37
|
+
groups.set(adapterId, group);
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
group.items.push({
|
|
41
|
+
viewId,
|
|
42
|
+
storageName: snapshot.storageName,
|
|
43
|
+
entryCount: snapshot.entryCount,
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
return [...groups.values()];
|
|
48
|
+
};
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* Splits a storage view id (`${adapterId}:${storageId}`) back into its
|
|
52
|
+
* target, using the first `:` as the separator since `storageId` may itself
|
|
53
|
+
* contain colons. Returns `null` for a malformed id.
|
|
54
|
+
*/
|
|
55
|
+
export const parseStorageViewId = (viewId: string): StorageTarget | null => {
|
|
56
|
+
const separatorIndex = viewId.indexOf(':');
|
|
57
|
+
|
|
58
|
+
if (separatorIndex < 0) {
|
|
59
|
+
return null;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
return {
|
|
63
|
+
adapterId: viewId.slice(0, separatorIndex),
|
|
64
|
+
storageId: viewId.slice(separatorIndex + 1),
|
|
65
|
+
};
|
|
66
|
+
};
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { Input, Select } from '@rozenite/ui';
|
|
1
2
|
import type { StorageEntryType, StorageEntryValue } from '../shared/types';
|
|
2
3
|
import { BinaryValueEditor } from './binary-value-editor';
|
|
3
4
|
import { EditorSwitcher } from './editor-switcher';
|
|
@@ -41,7 +42,7 @@ export const TypedValueEditor = ({
|
|
|
41
42
|
};
|
|
42
43
|
|
|
43
44
|
return (
|
|
44
|
-
<div className="
|
|
45
|
+
<div className="flex flex-col gap-2">
|
|
45
46
|
<EditorSwitcher
|
|
46
47
|
supportedTypes={supportedTypes}
|
|
47
48
|
value={type}
|
|
@@ -54,20 +55,20 @@ export const TypedValueEditor = ({
|
|
|
54
55
|
onChange={(bytes) => onChange('buffer', bytes)}
|
|
55
56
|
/>
|
|
56
57
|
) : type === 'boolean' ? (
|
|
57
|
-
<
|
|
58
|
-
id={inputId}
|
|
58
|
+
<Select
|
|
59
59
|
value={String(value ?? false)}
|
|
60
|
-
|
|
61
|
-
onChange('boolean', event.target.value === 'true')
|
|
62
|
-
}
|
|
63
|
-
className="w-full px-3 py-2 text-sm bg-gray-700 border border-gray-600 rounded text-gray-100 focus:outline-none focus:ring-2 focus:ring-blue-500"
|
|
64
|
-
autoFocus={autoFocus}
|
|
60
|
+
onValueChange={(next) => onChange('boolean', next === 'true')}
|
|
65
61
|
>
|
|
66
|
-
<
|
|
67
|
-
|
|
68
|
-
|
|
62
|
+
<Select.Trigger id={inputId} autoFocus={autoFocus}>
|
|
63
|
+
<Select.Value />
|
|
64
|
+
</Select.Trigger>
|
|
65
|
+
<Select.Content>
|
|
66
|
+
<Select.Item value="true">true</Select.Item>
|
|
67
|
+
<Select.Item value="false">false</Select.Item>
|
|
68
|
+
</Select.Content>
|
|
69
|
+
</Select>
|
|
69
70
|
) : type === 'number' ? (
|
|
70
|
-
<
|
|
71
|
+
<Input
|
|
71
72
|
id={inputId}
|
|
72
73
|
type="number"
|
|
73
74
|
value={String(value ?? '')}
|
|
@@ -77,17 +78,15 @@ export const TypedValueEditor = ({
|
|
|
77
78
|
onChange('number', Number.isNaN(parsed) ? 0 : parsed);
|
|
78
79
|
}}
|
|
79
80
|
placeholder="Enter number value"
|
|
80
|
-
className="w-full px-3 py-2 text-sm bg-gray-700 border border-gray-600 rounded text-gray-100 placeholder:text-gray-400 focus:outline-none focus:ring-2 focus:ring-blue-500"
|
|
81
81
|
autoFocus={autoFocus}
|
|
82
82
|
/>
|
|
83
83
|
) : (
|
|
84
|
-
<
|
|
84
|
+
<Input
|
|
85
85
|
id={inputId}
|
|
86
86
|
type="text"
|
|
87
87
|
value={String(value ?? '')}
|
|
88
88
|
onChange={(event) => onChange('string', event.target.value)}
|
|
89
89
|
placeholder="Enter string value"
|
|
90
|
-
className="w-full px-3 py-2 text-sm bg-gray-700 border border-gray-600 rounded text-gray-100 placeholder:text-gray-400 focus:outline-none focus:ring-2 focus:ring-blue-500"
|
|
91
90
|
autoFocus={autoFocus}
|
|
92
91
|
/>
|
|
93
92
|
)}
|
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
import {
|
|
2
|
+
keepPreviousData,
|
|
3
|
+
type InfiniteData,
|
|
4
|
+
type QueryClient,
|
|
5
|
+
useInfiniteQuery,
|
|
6
|
+
useQuery,
|
|
7
|
+
useQueryClient,
|
|
8
|
+
} from '@tanstack/react-query';
|
|
9
|
+
import type { RozeniteDevToolsRequestClient } from '@rozenite/plugin-bridge';
|
|
10
|
+
import { useCallback, useEffect, useMemo } from 'react';
|
|
11
|
+
import type {
|
|
12
|
+
StorageEventMap,
|
|
13
|
+
StorageListEntryPreviewsResponseEvent,
|
|
14
|
+
} from '../shared/messaging';
|
|
15
|
+
import type { StorageEntryPreview, StorageTarget } from '../shared/types';
|
|
16
|
+
|
|
17
|
+
export const STORAGE_ENTRY_PREVIEW_PAGE_SIZE = 100;
|
|
18
|
+
export const STORAGE_ENTRY_PREVIEW_MAX_PAGES = 5;
|
|
19
|
+
|
|
20
|
+
type StorageRequestClient = Pick<
|
|
21
|
+
RozeniteDevToolsRequestClient<StorageEventMap>,
|
|
22
|
+
'request'
|
|
23
|
+
>;
|
|
24
|
+
|
|
25
|
+
export const normalizeStorageKeySearch = (search: string) =>
|
|
26
|
+
search.trim().toLowerCase();
|
|
27
|
+
|
|
28
|
+
export const storageEntryPreviewQueryKeyPrefix = (target: StorageTarget) =>
|
|
29
|
+
['storage-entry-previews', target.adapterId, target.storageId] as const;
|
|
30
|
+
|
|
31
|
+
export const storageEntryPreviewQueryKey = (
|
|
32
|
+
target: StorageTarget,
|
|
33
|
+
search: string,
|
|
34
|
+
keySortDirection: 'ascending' | 'descending',
|
|
35
|
+
) =>
|
|
36
|
+
[
|
|
37
|
+
...storageEntryPreviewQueryKeyPrefix(target),
|
|
38
|
+
normalizeStorageKeySearch(search),
|
|
39
|
+
keySortDirection,
|
|
40
|
+
] as const;
|
|
41
|
+
|
|
42
|
+
const storageFullEntryQueryKeyPrefix = (target: StorageTarget) =>
|
|
43
|
+
['storage-full-entry', target.adapterId, target.storageId] as const;
|
|
44
|
+
|
|
45
|
+
const storageFullEntryQueryKey = (target: StorageTarget, key: string) =>
|
|
46
|
+
[...storageFullEntryQueryKeyPrefix(target), key] as const;
|
|
47
|
+
|
|
48
|
+
export const resetSelectedStorageQueries = async (
|
|
49
|
+
queryClient: QueryClient,
|
|
50
|
+
target: StorageTarget,
|
|
51
|
+
) => {
|
|
52
|
+
const previewQueryKey = storageEntryPreviewQueryKeyPrefix(target);
|
|
53
|
+
const fullEntryQueryKey = storageFullEntryQueryKeyPrefix(target);
|
|
54
|
+
|
|
55
|
+
await queryClient.cancelQueries({ queryKey: previewQueryKey });
|
|
56
|
+
await queryClient.cancelQueries({ queryKey: fullEntryQueryKey });
|
|
57
|
+
queryClient.removeQueries({ queryKey: fullEntryQueryKey });
|
|
58
|
+
await queryClient.resetQueries({ queryKey: previewQueryKey });
|
|
59
|
+
};
|
|
60
|
+
|
|
61
|
+
export const invalidateStorageEntryPreviews = async (
|
|
62
|
+
queryClient: QueryClient,
|
|
63
|
+
target: StorageTarget,
|
|
64
|
+
) =>
|
|
65
|
+
queryClient.invalidateQueries({
|
|
66
|
+
queryKey: storageEntryPreviewQueryKeyPrefix(target),
|
|
67
|
+
});
|
|
68
|
+
|
|
69
|
+
export const dropStorageFullEntries = async (
|
|
70
|
+
queryClient: QueryClient,
|
|
71
|
+
target: StorageTarget,
|
|
72
|
+
key?: string,
|
|
73
|
+
) => {
|
|
74
|
+
const queryKey =
|
|
75
|
+
key == null
|
|
76
|
+
? storageFullEntryQueryKeyPrefix(target)
|
|
77
|
+
: storageFullEntryQueryKey(target, key);
|
|
78
|
+
|
|
79
|
+
await queryClient.cancelQueries({ queryKey, exact: key != null });
|
|
80
|
+
queryClient.removeQueries({ queryKey, exact: key != null });
|
|
81
|
+
};
|
|
82
|
+
|
|
83
|
+
export type UseStorageEntryPreviewsOptions = {
|
|
84
|
+
client: StorageRequestClient | null | undefined;
|
|
85
|
+
target: StorageTarget | null | undefined;
|
|
86
|
+
search: string;
|
|
87
|
+
keySortDirection: 'ascending' | 'descending';
|
|
88
|
+
pageSize?: number;
|
|
89
|
+
maxPages?: number;
|
|
90
|
+
};
|
|
91
|
+
|
|
92
|
+
export const useStorageEntryPreviews = ({
|
|
93
|
+
client,
|
|
94
|
+
target,
|
|
95
|
+
search,
|
|
96
|
+
keySortDirection,
|
|
97
|
+
pageSize = STORAGE_ENTRY_PREVIEW_PAGE_SIZE,
|
|
98
|
+
maxPages = STORAGE_ENTRY_PREVIEW_MAX_PAGES,
|
|
99
|
+
}: UseStorageEntryPreviewsOptions) => {
|
|
100
|
+
const normalizedSearch = normalizeStorageKeySearch(search);
|
|
101
|
+
const queryKey = useMemo(
|
|
102
|
+
() =>
|
|
103
|
+
target
|
|
104
|
+
? storageEntryPreviewQueryKey(
|
|
105
|
+
target,
|
|
106
|
+
normalizedSearch,
|
|
107
|
+
keySortDirection,
|
|
108
|
+
)
|
|
109
|
+
: (['storage-entry-previews', 'no-target'] as const),
|
|
110
|
+
[keySortDirection, normalizedSearch, target?.adapterId, target?.storageId],
|
|
111
|
+
);
|
|
112
|
+
|
|
113
|
+
return useInfiniteQuery({
|
|
114
|
+
queryKey,
|
|
115
|
+
enabled: client != null && target != null,
|
|
116
|
+
initialPageParam: undefined as string | undefined,
|
|
117
|
+
maxPages: Math.max(1, maxPages),
|
|
118
|
+
placeholderData: keepPreviousData,
|
|
119
|
+
queryFn: ({ pageParam, signal }) => {
|
|
120
|
+
if (!client || !target) {
|
|
121
|
+
throw new Error('A storage target and request client are required.');
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
return client.request({
|
|
125
|
+
requestType: 'list-entry-previews',
|
|
126
|
+
responseType: 'entry-previews',
|
|
127
|
+
errorType: 'storage-request-error',
|
|
128
|
+
payload: {
|
|
129
|
+
type: 'list-entry-previews',
|
|
130
|
+
target,
|
|
131
|
+
search: normalizedSearch || undefined,
|
|
132
|
+
keySortDirection,
|
|
133
|
+
cursor: pageParam,
|
|
134
|
+
limit: pageSize,
|
|
135
|
+
},
|
|
136
|
+
signal,
|
|
137
|
+
});
|
|
138
|
+
},
|
|
139
|
+
getNextPageParam: (lastPage) => lastPage.nextCursor,
|
|
140
|
+
getPreviousPageParam: (firstPage) => firstPage.previousCursor,
|
|
141
|
+
refetchOnWindowFocus: false,
|
|
142
|
+
});
|
|
143
|
+
};
|
|
144
|
+
|
|
145
|
+
export const flattenStorageEntryPreviewPages = (
|
|
146
|
+
data: InfiniteData<StorageListEntryPreviewsResponseEvent> | undefined,
|
|
147
|
+
): StorageEntryPreview[] => data?.pages.flatMap((page) => page.items) ?? [];
|
|
148
|
+
|
|
149
|
+
export type UseStorageFullEntryOptions = {
|
|
150
|
+
client: StorageRequestClient | null | undefined;
|
|
151
|
+
target: StorageTarget | null | undefined;
|
|
152
|
+
key: string | null | undefined;
|
|
153
|
+
enabled?: boolean;
|
|
154
|
+
};
|
|
155
|
+
|
|
156
|
+
export const useStorageFullEntry = ({
|
|
157
|
+
client,
|
|
158
|
+
target,
|
|
159
|
+
key,
|
|
160
|
+
enabled = true,
|
|
161
|
+
}: UseStorageFullEntryOptions) => {
|
|
162
|
+
const queryClient = useQueryClient();
|
|
163
|
+
const queryKey = useMemo(
|
|
164
|
+
() =>
|
|
165
|
+
target && key != null
|
|
166
|
+
? storageFullEntryQueryKey(target, key)
|
|
167
|
+
: (['storage-full-entry', 'no-entry'] as const),
|
|
168
|
+
[key, target?.adapterId, target?.storageId],
|
|
169
|
+
);
|
|
170
|
+
|
|
171
|
+
const result = useQuery({
|
|
172
|
+
queryKey,
|
|
173
|
+
enabled: enabled && client != null && target != null && key != null,
|
|
174
|
+
gcTime: 0,
|
|
175
|
+
queryFn: ({ signal }) => {
|
|
176
|
+
if (!client || !target || key == null) {
|
|
177
|
+
throw new Error(
|
|
178
|
+
'A storage target, key, and request client are required.',
|
|
179
|
+
);
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
return client.request({
|
|
183
|
+
requestType: 'get-entry',
|
|
184
|
+
responseType: 'entry',
|
|
185
|
+
errorType: 'storage-request-error',
|
|
186
|
+
payload: { type: 'get-entry', target, key },
|
|
187
|
+
signal,
|
|
188
|
+
});
|
|
189
|
+
},
|
|
190
|
+
refetchOnWindowFocus: false,
|
|
191
|
+
});
|
|
192
|
+
|
|
193
|
+
useEffect(
|
|
194
|
+
() => () => {
|
|
195
|
+
void queryClient.cancelQueries({ queryKey });
|
|
196
|
+
queryClient.removeQueries({ queryKey });
|
|
197
|
+
},
|
|
198
|
+
[queryClient, queryKey],
|
|
199
|
+
);
|
|
200
|
+
|
|
201
|
+
const reset = useCallback(() => {
|
|
202
|
+
void queryClient.cancelQueries({ queryKey });
|
|
203
|
+
queryClient.removeQueries({ queryKey });
|
|
204
|
+
}, [queryClient, queryKey]);
|
|
205
|
+
|
|
206
|
+
return { ...result, entry: result.data?.entry, reset };
|
|
207
|
+
};
|
package/tsconfig.json
CHANGED
|
@@ -15,7 +15,8 @@
|
|
|
15
15
|
"paths": {
|
|
16
16
|
"@rozenite/agent-bridge": ["../agent-bridge/src/index.ts"],
|
|
17
17
|
"@rozenite/agent-shared": ["../agent-shared/src/index.ts"],
|
|
18
|
-
"@rozenite/plugin-bridge": ["../plugin-bridge/src/index.ts"]
|
|
18
|
+
"@rozenite/plugin-bridge": ["../plugin-bridge/src/index.ts"],
|
|
19
|
+
"@rozenite/ui": ["../ui/src/index.ts"]
|
|
19
20
|
},
|
|
20
21
|
"resolveJsonModule": true,
|
|
21
22
|
"isolatedModules": true,
|
|
@@ -33,6 +34,9 @@
|
|
|
33
34
|
},
|
|
34
35
|
{
|
|
35
36
|
"path": "../vite-plugin"
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
"path": "../ui"
|
|
36
40
|
}
|
|
37
41
|
]
|
|
38
42
|
}
|