@classytic/arc-next 0.1.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/LICENSE +21 -0
- package/README.md +185 -0
- package/dist/api.d.ts +225 -0
- package/dist/api.d.ts.map +1 -0
- package/dist/api.js +167 -0
- package/dist/api.js.map +1 -0
- package/dist/client.d.ts +172 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +242 -0
- package/dist/client.js.map +1 -0
- package/dist/hooks.d.ts +143 -0
- package/dist/hooks.d.ts.map +1 -0
- package/dist/hooks.js +357 -0
- package/dist/hooks.js.map +1 -0
- package/dist/mutation.d.ts +118 -0
- package/dist/mutation.d.ts.map +1 -0
- package/dist/mutation.js +160 -0
- package/dist/mutation.js.map +1 -0
- package/dist/prefetch.d.ts +64 -0
- package/dist/prefetch.d.ts.map +1 -0
- package/dist/prefetch.js +76 -0
- package/dist/prefetch.js.map +1 -0
- package/dist/query-client.d.ts +25 -0
- package/dist/query-client.d.ts.map +1 -0
- package/dist/query-client.js +46 -0
- package/dist/query-client.js.map +1 -0
- package/dist/query.d.ts +177 -0
- package/dist/query.d.ts.map +1 -0
- package/dist/query.js +203 -0
- package/dist/query.js.map +1 -0
- package/package.json +91 -0
package/dist/query.js
ADDED
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
import { keepPreviousData, useInfiniteQuery, useQuery, useQueryClient } from "@tanstack/react-query";
|
|
4
|
+
import { useEffect } from "react";
|
|
5
|
+
|
|
6
|
+
//#region src/query.ts
|
|
7
|
+
const DEFAULT_QUERY_CONFIG = {
|
|
8
|
+
staleTime: 300 * 1e3,
|
|
9
|
+
gcTime: 1800 * 1e3,
|
|
10
|
+
refetchOnWindowFocus: false,
|
|
11
|
+
retry: 1
|
|
12
|
+
};
|
|
13
|
+
function getItemId(item) {
|
|
14
|
+
if (!item || typeof item !== "object") return null;
|
|
15
|
+
const obj = item;
|
|
16
|
+
const id = obj._id ?? obj.id;
|
|
17
|
+
return typeof id === "string" ? id : id ? String(id) : null;
|
|
18
|
+
}
|
|
19
|
+
function normalizePagination(data) {
|
|
20
|
+
if (!data || typeof data !== "object") return null;
|
|
21
|
+
const d = data;
|
|
22
|
+
const hasTotal = d.total != null || d.totalDocs != null;
|
|
23
|
+
const hasPages = d.pages != null || d.totalPages != null;
|
|
24
|
+
if (!hasTotal && !hasPages) return null;
|
|
25
|
+
return {
|
|
26
|
+
total: Number(d.total ?? d.totalDocs ?? 0),
|
|
27
|
+
pages: Number(d.pages ?? d.totalPages ?? 1),
|
|
28
|
+
page: Number(d.page ?? d.currentPage ?? 1),
|
|
29
|
+
limit: Number(d.limit ?? 10),
|
|
30
|
+
hasNext: Boolean(d.hasNext ?? d.hasNextPage ?? d.hasMore ?? false),
|
|
31
|
+
hasPrev: Boolean(d.hasPrev ?? d.hasPrevPage ?? false)
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
function extractItems(data) {
|
|
35
|
+
if (!data) return [];
|
|
36
|
+
if (Array.isArray(data)) return data;
|
|
37
|
+
if (typeof data !== "object") return [];
|
|
38
|
+
const d = data;
|
|
39
|
+
const items = d.docs ?? d.data ?? d.items ?? d.results;
|
|
40
|
+
return Array.isArray(items) ? items : [];
|
|
41
|
+
}
|
|
42
|
+
function extractItem(data) {
|
|
43
|
+
if (!data) return null;
|
|
44
|
+
if (typeof data !== "object") return null;
|
|
45
|
+
const d = data;
|
|
46
|
+
return d.data ?? d;
|
|
47
|
+
}
|
|
48
|
+
function updateListCache(listData, updater) {
|
|
49
|
+
if (!listData) return listData;
|
|
50
|
+
if (typeof listData === "object" && "docs" in listData) {
|
|
51
|
+
const d = listData;
|
|
52
|
+
const updatedDocs = updater(d.docs);
|
|
53
|
+
return {
|
|
54
|
+
...d,
|
|
55
|
+
docs: updatedDocs,
|
|
56
|
+
total: updatedDocs.length,
|
|
57
|
+
totalDocs: updatedDocs.length
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
if (Array.isArray(listData)) return updater(listData);
|
|
61
|
+
if (typeof listData === "object" && "data" in listData) {
|
|
62
|
+
const d = listData;
|
|
63
|
+
if (Array.isArray(d.data)) return {
|
|
64
|
+
...d,
|
|
65
|
+
data: updater(d.data)
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
return listData;
|
|
69
|
+
}
|
|
70
|
+
function createQueryKeys(entityKey) {
|
|
71
|
+
return {
|
|
72
|
+
all: [entityKey],
|
|
73
|
+
lists: () => [entityKey, "list"],
|
|
74
|
+
list: (params) => [
|
|
75
|
+
entityKey,
|
|
76
|
+
"list",
|
|
77
|
+
params
|
|
78
|
+
],
|
|
79
|
+
details: () => [entityKey, "detail"],
|
|
80
|
+
detail: (id) => [
|
|
81
|
+
entityKey,
|
|
82
|
+
"detail",
|
|
83
|
+
id
|
|
84
|
+
],
|
|
85
|
+
custom: (key, ...args) => [
|
|
86
|
+
entityKey,
|
|
87
|
+
key,
|
|
88
|
+
...args
|
|
89
|
+
],
|
|
90
|
+
scopedList: (scope, params) => [
|
|
91
|
+
entityKey,
|
|
92
|
+
"list",
|
|
93
|
+
{
|
|
94
|
+
_scope: scope,
|
|
95
|
+
...params
|
|
96
|
+
}
|
|
97
|
+
]
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
function createCacheUtils(KEYS) {
|
|
101
|
+
return {
|
|
102
|
+
invalidateAll: (client) => client.invalidateQueries({ queryKey: KEYS.all }),
|
|
103
|
+
invalidateLists: (client) => client.invalidateQueries({ queryKey: KEYS.lists() }),
|
|
104
|
+
invalidateDetail: (client, id) => client.invalidateQueries({ queryKey: KEYS.detail(id) }),
|
|
105
|
+
setDetail: (client, id, data) => client.setQueryData(KEYS.detail(id), { data }),
|
|
106
|
+
getDetail: (client, id) => {
|
|
107
|
+
return client.getQueryData(KEYS.detail(id))?.data;
|
|
108
|
+
},
|
|
109
|
+
removeDetail: (client, id) => client.removeQueries({ queryKey: KEYS.detail(id) })
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
function createListQuery({ queryKey, queryFn, enabled = true, options = {}, prefillDetailCache = true, detailKeyBuilder }) {
|
|
113
|
+
const queryClient = useQueryClient();
|
|
114
|
+
const query = useQuery({
|
|
115
|
+
queryKey,
|
|
116
|
+
queryFn: ({ signal }) => queryFn({ signal }),
|
|
117
|
+
enabled,
|
|
118
|
+
...DEFAULT_QUERY_CONFIG,
|
|
119
|
+
...options,
|
|
120
|
+
placeholderData: keepPreviousData
|
|
121
|
+
});
|
|
122
|
+
const items = extractItems(query.data);
|
|
123
|
+
const pagination = normalizePagination(query.data);
|
|
124
|
+
useEffect(() => {
|
|
125
|
+
if (!prefillDetailCache || !detailKeyBuilder || items.length === 0) return;
|
|
126
|
+
items.forEach((item) => {
|
|
127
|
+
const id = getItemId(item);
|
|
128
|
+
if (id) queryClient.setQueryData(detailKeyBuilder(id), { data: item });
|
|
129
|
+
});
|
|
130
|
+
}, [
|
|
131
|
+
items,
|
|
132
|
+
prefillDetailCache,
|
|
133
|
+
detailKeyBuilder,
|
|
134
|
+
queryClient
|
|
135
|
+
]);
|
|
136
|
+
return {
|
|
137
|
+
items,
|
|
138
|
+
pagination,
|
|
139
|
+
isLoading: query.isLoading,
|
|
140
|
+
isFetching: query.isFetching,
|
|
141
|
+
isError: query.isError,
|
|
142
|
+
isSuccess: query.isSuccess,
|
|
143
|
+
isStale: query.isStale,
|
|
144
|
+
error: query.error,
|
|
145
|
+
refetch: query.refetch,
|
|
146
|
+
data: query.data
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
function createDetailQuery({ queryKey, queryFn, enabled = true, options = {} }) {
|
|
150
|
+
const query = useQuery({
|
|
151
|
+
queryKey,
|
|
152
|
+
queryFn: ({ signal }) => queryFn({ signal }),
|
|
153
|
+
enabled,
|
|
154
|
+
...DEFAULT_QUERY_CONFIG,
|
|
155
|
+
...options
|
|
156
|
+
});
|
|
157
|
+
return {
|
|
158
|
+
item: extractItem(query.data),
|
|
159
|
+
isLoading: query.isLoading,
|
|
160
|
+
isFetching: query.isFetching,
|
|
161
|
+
isError: query.isError,
|
|
162
|
+
isSuccess: query.isSuccess,
|
|
163
|
+
isStale: query.isStale,
|
|
164
|
+
error: query.error,
|
|
165
|
+
refetch: query.refetch,
|
|
166
|
+
data: query.data
|
|
167
|
+
};
|
|
168
|
+
}
|
|
169
|
+
function createInfiniteListQuery({ queryKey, queryFn, enabled = true, options = {}, initialPageParam = 1, getNextPageParam, getPreviousPageParam }) {
|
|
170
|
+
const query = useInfiniteQuery({
|
|
171
|
+
queryKey,
|
|
172
|
+
queryFn: ({ signal, pageParam }) => queryFn({
|
|
173
|
+
signal,
|
|
174
|
+
pageParam
|
|
175
|
+
}),
|
|
176
|
+
enabled,
|
|
177
|
+
initialPageParam,
|
|
178
|
+
getNextPageParam,
|
|
179
|
+
getPreviousPageParam,
|
|
180
|
+
...DEFAULT_QUERY_CONFIG,
|
|
181
|
+
...options
|
|
182
|
+
});
|
|
183
|
+
return {
|
|
184
|
+
items: query.data?.pages.flatMap((page) => extractItems(page)) ?? [],
|
|
185
|
+
hasNextPage: query.hasNextPage,
|
|
186
|
+
hasPreviousPage: query.hasPreviousPage,
|
|
187
|
+
isFetchingNextPage: query.isFetchingNextPage,
|
|
188
|
+
isFetchingPreviousPage: query.isFetchingPreviousPage,
|
|
189
|
+
fetchNextPage: query.fetchNextPage,
|
|
190
|
+
fetchPreviousPage: query.fetchPreviousPage,
|
|
191
|
+
isLoading: query.isLoading,
|
|
192
|
+
isFetching: query.isFetching,
|
|
193
|
+
isError: query.isError,
|
|
194
|
+
isSuccess: query.isSuccess,
|
|
195
|
+
error: query.error,
|
|
196
|
+
refetch: query.refetch,
|
|
197
|
+
data: query.data
|
|
198
|
+
};
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
//#endregion
|
|
202
|
+
export { DEFAULT_QUERY_CONFIG, createCacheUtils, createDetailQuery, createInfiniteListQuery, createListQuery, createQueryKeys, getItemId, updateListCache };
|
|
203
|
+
//# sourceMappingURL=query.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"query.js","names":[],"sources":["../src/query.ts"],"sourcesContent":["\"use client\";\n\nimport { useQuery, useInfiniteQuery, useQueryClient, keepPreviousData, type QueryKey, type InfiniteData } from \"@tanstack/react-query\";\nimport { useEffect } from \"react\";\nimport type { QueryClient } from \"@tanstack/react-query\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface PaginationData {\n total: number;\n pages: number;\n page: number;\n limit: number;\n hasNext: boolean;\n hasPrev: boolean;\n}\n\n/** Request-level options passed through to the fetch call */\nexport interface RequestPassthrough {\n cache?: RequestCache;\n revalidate?: number;\n tags?: string[];\n headerOptions?: Record<string, string>;\n signal?: AbortSignal;\n}\n\nexport interface ListQueryOptions {\n public?: boolean;\n enabled?: boolean;\n staleTime?: number;\n gcTime?: number;\n refetchOnWindowFocus?: boolean;\n structuralSharing?: boolean;\n prefillDetailCache?: boolean;\n refetchInterval?: number | false;\n refetchIntervalInBackground?: boolean;\n _scope?: string;\n /** Pass-through options for the underlying fetch request (cache, revalidate, tags, headers) */\n request?: RequestPassthrough;\n}\n\nexport interface DetailQueryOptions {\n public?: boolean;\n organizationId?: string | null;\n enabled?: boolean;\n staleTime?: number;\n gcTime?: number;\n structuralSharing?: boolean;\n refetchInterval?: number | false;\n refetchIntervalInBackground?: boolean;\n /** Pass-through options for the underlying fetch request (cache, revalidate, tags, headers) */\n request?: RequestPassthrough;\n}\n\nexport interface ListQueryResult<T> {\n items: T[];\n pagination: PaginationData | null;\n isLoading: boolean;\n isFetching: boolean;\n isError: boolean;\n isSuccess: boolean;\n isStale: boolean;\n error: Error | null;\n refetch: () => Promise<unknown>;\n data: unknown;\n}\n\nexport interface DetailQueryResult<T> {\n item: T | null;\n isLoading: boolean;\n isFetching: boolean;\n isError: boolean;\n isSuccess: boolean;\n isStale: boolean;\n error: Error | null;\n refetch: () => Promise<unknown>;\n data: unknown;\n}\n\nexport interface QueryKeys {\n all: string[];\n lists: () => QueryKey;\n list: (params?: unknown) => QueryKey;\n details: () => QueryKey;\n detail: (id: string) => QueryKey;\n custom: (key: string, ...args: unknown[]) => QueryKey;\n scopedList: (scope: string, params?: unknown) => QueryKey;\n}\n\nexport interface CacheUtils<T> {\n invalidateAll: (client: QueryClient) => Promise<void>;\n invalidateLists: (client: QueryClient) => Promise<void>;\n invalidateDetail: (client: QueryClient, id: string) => Promise<void>;\n setDetail: (client: QueryClient, id: string, data: T) => void;\n getDetail: (client: QueryClient, id: string) => T | undefined;\n removeDetail: (client: QueryClient, id: string) => void;\n}\n\n// ============================================================================\n// Default Config\n// ============================================================================\n\nexport const DEFAULT_QUERY_CONFIG = {\n staleTime: 5 * 60 * 1000,\n gcTime: 30 * 60 * 1000,\n refetchOnWindowFocus: false,\n retry: 1,\n} as const;\n\n// ============================================================================\n// Utilities\n// ============================================================================\n\nexport function getItemId(item: unknown): string | null {\n if (!item || typeof item !== \"object\") return null;\n const obj = item as Record<string, unknown>;\n const id = obj._id ?? obj.id;\n return typeof id === \"string\" ? id : id ? String(id) : null;\n}\n\nfunction normalizePagination(data: unknown): PaginationData | null {\n if (!data || typeof data !== \"object\") return null;\n const d = data as Record<string, unknown>;\n\n const hasTotal = d.total != null || d.totalDocs != null;\n const hasPages = d.pages != null || d.totalPages != null;\n if (!hasTotal && !hasPages) return null;\n\n return {\n total: Number(d.total ?? d.totalDocs ?? 0),\n pages: Number(d.pages ?? d.totalPages ?? 1),\n page: Number(d.page ?? d.currentPage ?? 1),\n limit: Number(d.limit ?? 10),\n hasNext: Boolean(d.hasNext ?? d.hasNextPage ?? d.hasMore ?? false),\n hasPrev: Boolean(d.hasPrev ?? d.hasPrevPage ?? false),\n };\n}\n\nfunction extractItems<T>(data: unknown): T[] {\n if (!data) return [];\n if (Array.isArray(data)) return data as T[];\n if (typeof data !== \"object\") return [];\n\n const d = data as Record<string, unknown>;\n const items = d.docs ?? d.data ?? d.items ?? d.results;\n return Array.isArray(items) ? (items as T[]) : [];\n}\n\nfunction extractItem<T>(data: unknown): T | null {\n if (!data) return null;\n if (typeof data !== \"object\") return null;\n\n const d = data as Record<string, unknown>;\n return (d.data ?? d) as T | null;\n}\n\nexport function updateListCache<T>(listData: unknown, updater: (items: T[]) => T[]): unknown {\n if (!listData) return listData;\n\n if (typeof listData === \"object\" && \"docs\" in (listData as object)) {\n const d = listData as Record<string, unknown>;\n const updatedDocs = updater(d.docs as T[]);\n return { ...d, docs: updatedDocs, total: updatedDocs.length, totalDocs: updatedDocs.length };\n }\n\n if (Array.isArray(listData)) {\n return updater(listData as T[]);\n }\n\n if (typeof listData === \"object\" && \"data\" in (listData as object)) {\n const d = listData as Record<string, unknown>;\n if (Array.isArray(d.data)) {\n return { ...d, data: updater(d.data as T[]) };\n }\n }\n\n return listData;\n}\n\n// ============================================================================\n// Query Keys Factory\n// ============================================================================\n\nexport function createQueryKeys(entityKey: string): QueryKeys {\n return {\n all: [entityKey],\n lists: () => [entityKey, \"list\"],\n list: (params) => [entityKey, \"list\", params],\n details: () => [entityKey, \"detail\"],\n detail: (id) => [entityKey, \"detail\", id],\n custom: (key, ...args) => [entityKey, key, ...args],\n scopedList: (scope, params) => [entityKey, \"list\", { _scope: scope, ...(params as object) }],\n };\n}\n\n// ============================================================================\n// Cache Utilities Factory\n// ============================================================================\n\nexport function createCacheUtils<T>(KEYS: QueryKeys): CacheUtils<T> {\n return {\n invalidateAll: (client) => client.invalidateQueries({ queryKey: KEYS.all }),\n invalidateLists: (client) => client.invalidateQueries({ queryKey: KEYS.lists() }),\n invalidateDetail: (client, id) => client.invalidateQueries({ queryKey: KEYS.detail(id) }),\n setDetail: (client, id, data) => client.setQueryData(KEYS.detail(id), { data }),\n getDetail: (client, id) => {\n const cached = client.getQueryData(KEYS.detail(id)) as { data?: T } | undefined;\n return cached?.data;\n },\n removeDetail: (client, id) => client.removeQueries({ queryKey: KEYS.detail(id) }),\n };\n}\n\n// ============================================================================\n// List Query Hook\n// ============================================================================\n\nexport interface CreateListQueryConfig {\n queryKey: QueryKey;\n queryFn: (context: { signal: AbortSignal }) => Promise<unknown>;\n enabled?: boolean;\n options?: Record<string, unknown>;\n prefillDetailCache?: boolean;\n detailKeyBuilder?: (id: string) => QueryKey;\n}\n\nexport function createListQuery<T>({\n queryKey,\n queryFn,\n enabled = true,\n options = {},\n prefillDetailCache = true,\n detailKeyBuilder,\n}: CreateListQueryConfig): ListQueryResult<T> {\n const queryClient = useQueryClient();\n\n const query = useQuery({\n queryKey,\n queryFn: ({ signal }) => queryFn({ signal }),\n enabled,\n ...DEFAULT_QUERY_CONFIG,\n ...options,\n placeholderData: keepPreviousData,\n });\n\n const items = extractItems<T>(query.data);\n const pagination = normalizePagination(query.data);\n\n useEffect(() => {\n if (!prefillDetailCache || !detailKeyBuilder || items.length === 0) return;\n\n items.forEach((item) => {\n const id = getItemId(item);\n if (id) queryClient.setQueryData(detailKeyBuilder(id), { data: item });\n });\n }, [items, prefillDetailCache, detailKeyBuilder, queryClient]);\n\n return {\n items,\n pagination,\n isLoading: query.isLoading,\n isFetching: query.isFetching,\n isError: query.isError,\n isSuccess: query.isSuccess,\n isStale: query.isStale,\n error: query.error,\n refetch: query.refetch,\n data: query.data,\n };\n}\n\n// ============================================================================\n// Detail Query Hook\n// ============================================================================\n\nexport interface CreateDetailQueryConfig {\n queryKey: QueryKey;\n queryFn: (context: { signal: AbortSignal }) => Promise<unknown>;\n enabled?: boolean;\n options?: Record<string, unknown>;\n}\n\nexport function createDetailQuery<T>({\n queryKey,\n queryFn,\n enabled = true,\n options = {},\n}: CreateDetailQueryConfig): DetailQueryResult<T> {\n const query = useQuery({\n queryKey,\n queryFn: ({ signal }) => queryFn({ signal }),\n enabled,\n ...DEFAULT_QUERY_CONFIG,\n ...options,\n });\n\n const item = extractItem<T>(query.data);\n\n return {\n item,\n isLoading: query.isLoading,\n isFetching: query.isFetching,\n isError: query.isError,\n isSuccess: query.isSuccess,\n isStale: query.isStale,\n error: query.error,\n refetch: query.refetch,\n data: query.data,\n };\n}\n\n// ============================================================================\n// Infinite List Query Hook\n// ============================================================================\n\nexport interface InfiniteListQueryOptions {\n public?: boolean;\n enabled?: boolean;\n staleTime?: number;\n gcTime?: number;\n refetchOnWindowFocus?: boolean;\n structuralSharing?: boolean;\n _scope?: string;\n request?: RequestPassthrough;\n}\n\nexport interface InfiniteListQueryResult<T> {\n items: T[];\n hasNextPage: boolean;\n hasPreviousPage: boolean;\n isFetchingNextPage: boolean;\n isFetchingPreviousPage: boolean;\n fetchNextPage: () => void;\n fetchPreviousPage: () => void;\n isLoading: boolean;\n isFetching: boolean;\n isError: boolean;\n isSuccess: boolean;\n error: Error | null;\n refetch: () => Promise<unknown>;\n data: InfiniteData<unknown> | undefined;\n}\n\nexport interface CreateInfiniteListQueryConfig {\n queryKey: QueryKey;\n queryFn: (context: { signal: AbortSignal; pageParam: unknown }) => Promise<unknown>;\n enabled?: boolean;\n options?: Record<string, unknown>;\n initialPageParam?: unknown;\n getNextPageParam: (lastPage: unknown) => unknown;\n getPreviousPageParam?: (firstPage: unknown) => unknown;\n}\n\nexport function createInfiniteListQuery<T>({\n queryKey,\n queryFn,\n enabled = true,\n options = {},\n initialPageParam = 1,\n getNextPageParam,\n getPreviousPageParam,\n}: CreateInfiniteListQueryConfig): InfiniteListQueryResult<T> {\n const query = useInfiniteQuery({\n queryKey,\n queryFn: ({ signal, pageParam }) => queryFn({ signal, pageParam }),\n enabled,\n initialPageParam,\n getNextPageParam,\n getPreviousPageParam,\n ...DEFAULT_QUERY_CONFIG,\n ...options,\n });\n\n const items: T[] = query.data?.pages.flatMap((page) => extractItems<T>(page)) ?? [];\n\n return {\n items,\n hasNextPage: query.hasNextPage,\n hasPreviousPage: query.hasPreviousPage,\n isFetchingNextPage: query.isFetchingNextPage,\n isFetchingPreviousPage: query.isFetchingPreviousPage,\n fetchNextPage: query.fetchNextPage,\n fetchPreviousPage: query.fetchPreviousPage,\n isLoading: query.isLoading,\n isFetching: query.isFetching,\n isError: query.isError,\n isSuccess: query.isSuccess,\n error: query.error,\n refetch: query.refetch,\n data: query.data,\n };\n}\n"],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@classytic/arc-next",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "React + TanStack Query SDK for Arc resources",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"sideEffects": false,
|
|
7
|
+
"license": "MIT",
|
|
8
|
+
"author": "Classytic",
|
|
9
|
+
"repository": {
|
|
10
|
+
"type": "git",
|
|
11
|
+
"url": "https://github.com/classytic/arc-next"
|
|
12
|
+
},
|
|
13
|
+
"keywords": [
|
|
14
|
+
"react",
|
|
15
|
+
"tanstack-query",
|
|
16
|
+
"react-query",
|
|
17
|
+
"crud",
|
|
18
|
+
"api-client",
|
|
19
|
+
"hooks",
|
|
20
|
+
"optimistic-updates",
|
|
21
|
+
"pagination",
|
|
22
|
+
"multi-tenant",
|
|
23
|
+
"arc",
|
|
24
|
+
"mongokit"
|
|
25
|
+
],
|
|
26
|
+
"exports": {
|
|
27
|
+
"./client": {
|
|
28
|
+
"types": "./dist/client.d.ts",
|
|
29
|
+
"default": "./dist/client.js"
|
|
30
|
+
},
|
|
31
|
+
"./api": {
|
|
32
|
+
"types": "./dist/api.d.ts",
|
|
33
|
+
"default": "./dist/api.js"
|
|
34
|
+
},
|
|
35
|
+
"./query": {
|
|
36
|
+
"types": "./dist/query.d.ts",
|
|
37
|
+
"default": "./dist/query.js"
|
|
38
|
+
},
|
|
39
|
+
"./mutation": {
|
|
40
|
+
"types": "./dist/mutation.d.ts",
|
|
41
|
+
"default": "./dist/mutation.js"
|
|
42
|
+
},
|
|
43
|
+
"./hooks": {
|
|
44
|
+
"types": "./dist/hooks.d.ts",
|
|
45
|
+
"default": "./dist/hooks.js"
|
|
46
|
+
},
|
|
47
|
+
"./query-client": {
|
|
48
|
+
"types": "./dist/query-client.d.ts",
|
|
49
|
+
"default": "./dist/query-client.js"
|
|
50
|
+
},
|
|
51
|
+
"./prefetch": {
|
|
52
|
+
"types": "./dist/prefetch.d.ts",
|
|
53
|
+
"default": "./dist/prefetch.js"
|
|
54
|
+
}
|
|
55
|
+
},
|
|
56
|
+
"files": [
|
|
57
|
+
"dist"
|
|
58
|
+
],
|
|
59
|
+
"publishConfig": {
|
|
60
|
+
"access": "public",
|
|
61
|
+
"registry": "https://registry.npmjs.org/"
|
|
62
|
+
},
|
|
63
|
+
"engines": {
|
|
64
|
+
"node": ">=20"
|
|
65
|
+
},
|
|
66
|
+
"scripts": {
|
|
67
|
+
"build": "tsdown",
|
|
68
|
+
"dev": "tsdown --watch",
|
|
69
|
+
"test": "vitest run",
|
|
70
|
+
"test:watch": "vitest",
|
|
71
|
+
"typecheck": "tsc --noEmit",
|
|
72
|
+
"prepublishOnly": "npm run typecheck && npm test && npm run build"
|
|
73
|
+
},
|
|
74
|
+
"peerDependencies": {
|
|
75
|
+
"@tanstack/react-query": "^5.0.0",
|
|
76
|
+
"react": "^19.0.0"
|
|
77
|
+
},
|
|
78
|
+
"devDependencies": {
|
|
79
|
+
"@tanstack/react-query": "^5.0.0",
|
|
80
|
+
"@testing-library/jest-dom": "^6.9.1",
|
|
81
|
+
"@testing-library/react": "^16.3.2",
|
|
82
|
+
"@types/react": "^19.0.0",
|
|
83
|
+
"@types/react-dom": "^19.2.3",
|
|
84
|
+
"jsdom": "^28.1.0",
|
|
85
|
+
"react": "^19.0.0",
|
|
86
|
+
"react-dom": "^19.2.4",
|
|
87
|
+
"tsdown": "^0.20.3",
|
|
88
|
+
"typescript": "^5.7.2",
|
|
89
|
+
"vitest": "^4.0.18"
|
|
90
|
+
}
|
|
91
|
+
}
|