@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/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
+ }