Loading...
Loading...
Build React TypeScript web applications using Docyrus as a backend. Use when creating or modifying apps that authenticate with Docyrus OAuth2, fetch/mutate data via the @docyrus/api-client library, use auto-generated collections for CRUD operations, or build queries with filters, aggregations, formulas, pivots, and child queries against Docyrus data sources. Triggers on tasks involving @docyrus/api-client, @docyrus/signin, Docyrus collections, data source queries, or Docyrus-backed React app development.
npx skill4agent add docyrus/agent-skills docyrus-app-dev@docyrus/api-client@docyrus/signinDocyrusAuthProviderimport { DocyrusAuthProvider } from '@docyrus/signin'
<DocyrusAuthProvider
apiUrl={import.meta.env.VITE_API_BASE_URL}
clientId={import.meta.env.VITE_OAUTH2_CLIENT_ID}
redirectUri={import.meta.env.VITE_OAUTH2_REDIRECT_URI}
scopes={['offline_access', 'Read.All', 'DS.ReadWrite.All', 'Users.Read']}
callbackPath="/auth/callback"
>
<QueryClientProvider client={queryClient}>
<RouterProvider router={router} />
</QueryClientProvider>
</DocyrusAuthProvider>const { status } = useDocyrusAuth()
const client = useDocyrusClient()
useEffect(() => {
if (client) setApiClient(client)
}, [client])
if (status === 'loading') return <Spinner />
if (status === 'unauthenticated') return <SignInButton />const { data: projects } = useQuery({
queryKey: ['projects'],
queryFn: () => baseProjectCollection.list({
columns: ['name', 'status', 'record_owner(firstname,lastname)'],
filters: { rules: [{ field: 'status', operator: '!=', value: 'archived' }] },
orderBy: 'created_on DESC',
limit: 50,
}),
})columns.list().get()idsetApiClient(client)idcountsumavgminmaxcolumnsorders'orders'columnstotal'total'UsersCollection.getMyInfo()collection.list(params?: ICollectionListParams) // Query with filters, sort, pagination
collection.get(id, { columns }) // Single record
collection.create(data) // Create
collection.update(id, data) // Partial update
collection.delete(id) // Delete one
collection.deleteMany({ recordIds }) // Delete many/v1/apps/{appSlug}/data-sources/{slug}/items.list()| Feature | Purpose |
|---|---|
| Select fields, expand relations |
| Nested AND/OR groups with 50+ operators (comparison, date shortcuts, user-related) |
| Full-text search |
| Sort by fields with direction, including related fields |
| Pagination (default 100) |
| Return total count alongside results |
| Aggregations: count, sum, avg, min, max with grouping |
| Computed virtual columns (simple functions, block AST, correlated subqueries) |
| Fetch related child records as nested JSON arrays |
| Cross-tab matrix queries with date range series |
| Return full objects for relation/user/enum fields instead of IDs |
references/query-guide.md// Query hook
function useItems(params?: ICollectionListParams) {
return useQuery({
queryKey: ['items', 'list', params],
queryFn: () => collection.list({ columns: COLUMNS, ...params }),
})
}
// Mutation hook
function useCreateItem() {
const qc = useQueryClient()
return useMutation({
mutationFn: (data: Record<string, unknown>) => collection.create(data),
onSuccess: () => { void qc.invalidateQueries({ queryKey: ['items'] }) },
})
}references/api-client-and-auth.mdreferences/query-guide.mdreferences/collections-and-patterns.md