chub-dev 0.1.0 → 0.1.2-beta.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/README.md +55 -0
- package/bin/chub-mcp +2 -0
- package/dist/airtable/docs/database/javascript/DOC.md +1437 -0
- package/dist/airtable/docs/database/python/DOC.md +1735 -0
- package/dist/amplitude/docs/analytics/javascript/DOC.md +1282 -0
- package/dist/amplitude/docs/analytics/python/DOC.md +1199 -0
- package/dist/anthropic/docs/claude-api/javascript/DOC.md +503 -0
- package/dist/anthropic/docs/claude-api/python/DOC.md +389 -0
- package/dist/asana/docs/tasks/DOC.md +1396 -0
- package/dist/assemblyai/docs/transcription/DOC.md +1043 -0
- package/dist/atlassian/docs/confluence/javascript/DOC.md +1347 -0
- package/dist/atlassian/docs/confluence/python/DOC.md +1604 -0
- package/dist/auth0/docs/identity/javascript/DOC.md +968 -0
- package/dist/auth0/docs/identity/python/DOC.md +1199 -0
- package/dist/aws/docs/s3/javascript/DOC.md +1773 -0
- package/dist/aws/docs/s3/python/DOC.md +1807 -0
- package/dist/binance/docs/trading/javascript/DOC.md +1315 -0
- package/dist/binance/docs/trading/python/DOC.md +1454 -0
- package/dist/braintree/docs/gateway/javascript/DOC.md +1278 -0
- package/dist/braintree/docs/gateway/python/DOC.md +1179 -0
- package/dist/chromadb/docs/embeddings-db/javascript/DOC.md +1263 -0
- package/dist/chromadb/docs/embeddings-db/python/DOC.md +1707 -0
- package/dist/clerk/docs/auth/javascript/DOC.md +1220 -0
- package/dist/clerk/docs/auth/python/DOC.md +274 -0
- package/dist/cloudflare/docs/workers/javascript/DOC.md +918 -0
- package/dist/cloudflare/docs/workers/python/DOC.md +994 -0
- package/dist/cockroachdb/docs/distributed-db/DOC.md +1500 -0
- package/dist/cohere/docs/llm/DOC.md +1335 -0
- package/dist/datadog/docs/monitoring/javascript/DOC.md +1740 -0
- package/dist/datadog/docs/monitoring/python/DOC.md +1815 -0
- package/dist/deepgram/docs/speech/javascript/DOC.md +885 -0
- package/dist/deepgram/docs/speech/python/DOC.md +685 -0
- package/dist/deepl/docs/translation/javascript/DOC.md +887 -0
- package/dist/deepl/docs/translation/python/DOC.md +944 -0
- package/dist/deepseek/docs/llm/DOC.md +1220 -0
- package/dist/directus/docs/headless-cms/javascript/DOC.md +1128 -0
- package/dist/directus/docs/headless-cms/python/DOC.md +1276 -0
- package/dist/discord/docs/bot/javascript/DOC.md +1090 -0
- package/dist/discord/docs/bot/python/DOC.md +1130 -0
- package/dist/elasticsearch/docs/search/DOC.md +1634 -0
- package/dist/elevenlabs/docs/text-to-speech/javascript/DOC.md +336 -0
- package/dist/elevenlabs/docs/text-to-speech/python/DOC.md +552 -0
- package/dist/firebase/docs/auth/DOC.md +1015 -0
- package/dist/gemini/docs/genai/javascript/DOC.md +691 -0
- package/dist/gemini/docs/genai/python/DOC.md +555 -0
- package/dist/github/docs/octokit/DOC.md +1560 -0
- package/dist/google/docs/bigquery/javascript/DOC.md +1688 -0
- package/dist/google/docs/bigquery/python/DOC.md +1503 -0
- package/dist/hubspot/docs/crm/javascript/DOC.md +1805 -0
- package/dist/hubspot/docs/crm/python/DOC.md +2033 -0
- package/dist/huggingface/docs/transformers/DOC.md +948 -0
- package/dist/intercom/docs/messaging/javascript/DOC.md +1844 -0
- package/dist/intercom/docs/messaging/python/DOC.md +1797 -0
- package/dist/jira/docs/issues/javascript/DOC.md +1420 -0
- package/dist/jira/docs/issues/python/DOC.md +1492 -0
- package/dist/kafka/docs/streaming/javascript/DOC.md +1671 -0
- package/dist/kafka/docs/streaming/python/DOC.md +1464 -0
- package/dist/landingai-ade/docs/api/DOC.md +620 -0
- package/dist/landingai-ade/docs/sdk/python/DOC.md +489 -0
- package/dist/landingai-ade/docs/sdk/typescript/DOC.md +542 -0
- package/dist/landingai-ade/skills/SKILL.md +489 -0
- package/dist/launchdarkly/docs/feature-flags/javascript/DOC.md +1191 -0
- package/dist/launchdarkly/docs/feature-flags/python/DOC.md +1671 -0
- package/dist/linear/docs/tracker/DOC.md +1554 -0
- package/dist/livekit/docs/realtime/javascript/DOC.md +303 -0
- package/dist/livekit/docs/realtime/python/DOC.md +163 -0
- package/dist/mailchimp/docs/marketing/DOC.md +1420 -0
- package/dist/meilisearch/docs/search/DOC.md +1241 -0
- package/dist/microsoft/docs/onedrive/javascript/DOC.md +1421 -0
- package/dist/microsoft/docs/onedrive/python/DOC.md +1549 -0
- package/dist/mongodb/docs/atlas/DOC.md +2041 -0
- package/dist/notion/docs/workspace-api/javascript/DOC.md +1435 -0
- package/dist/notion/docs/workspace-api/python/DOC.md +1400 -0
- package/dist/okta/docs/identity/javascript/DOC.md +1171 -0
- package/dist/okta/docs/identity/python/DOC.md +1401 -0
- package/dist/openai/docs/chat/javascript/DOC.md +407 -0
- package/dist/openai/docs/chat/python/DOC.md +568 -0
- package/dist/paypal/docs/checkout/DOC.md +278 -0
- package/dist/pinecone/docs/sdk/javascript/DOC.md +984 -0
- package/dist/pinecone/docs/sdk/python/DOC.md +1395 -0
- package/dist/plaid/docs/banking/javascript/DOC.md +1163 -0
- package/dist/plaid/docs/banking/python/DOC.md +1203 -0
- package/dist/playwright-community/skills/login-flows/SKILL.md +108 -0
- package/dist/postmark/docs/transactional-email/DOC.md +1168 -0
- package/dist/prisma/docs/orm/javascript/DOC.md +1419 -0
- package/dist/prisma/docs/orm/python/DOC.md +1317 -0
- package/dist/qdrant/docs/vector-search/javascript/DOC.md +1221 -0
- package/dist/qdrant/docs/vector-search/python/DOC.md +1653 -0
- package/dist/rabbitmq/docs/message-queue/javascript/DOC.md +1193 -0
- package/dist/rabbitmq/docs/message-queue/python/DOC.md +1243 -0
- package/dist/razorpay/docs/payments/javascript/DOC.md +1219 -0
- package/dist/razorpay/docs/payments/python/DOC.md +1330 -0
- package/dist/redis/docs/key-value/javascript/DOC.md +1851 -0
- package/dist/redis/docs/key-value/python/DOC.md +2054 -0
- package/dist/registry.json +2817 -0
- package/dist/replicate/docs/model-hosting/DOC.md +1318 -0
- package/dist/resend/docs/email/DOC.md +1271 -0
- package/dist/salesforce/docs/crm/javascript/DOC.md +1241 -0
- package/dist/salesforce/docs/crm/python/DOC.md +1183 -0
- package/dist/search-index.json +1 -0
- package/dist/sendgrid/docs/email-api/javascript/DOC.md +371 -0
- package/dist/sendgrid/docs/email-api/python/DOC.md +656 -0
- package/dist/sentry/docs/error-tracking/javascript/DOC.md +1073 -0
- package/dist/sentry/docs/error-tracking/python/DOC.md +1309 -0
- package/dist/shopify/docs/storefront/DOC.md +457 -0
- package/dist/slack/docs/workspace/javascript/DOC.md +933 -0
- package/dist/slack/docs/workspace/python/DOC.md +271 -0
- package/dist/square/docs/payments/javascript/DOC.md +1855 -0
- package/dist/square/docs/payments/python/DOC.md +1728 -0
- package/dist/stripe/docs/api/DOC.md +1727 -0
- package/dist/stripe/docs/payments/DOC.md +1726 -0
- package/dist/stytch/docs/auth/javascript/DOC.md +1813 -0
- package/dist/stytch/docs/auth/python/DOC.md +1962 -0
- package/dist/supabase/docs/client/DOC.md +1606 -0
- package/dist/twilio/docs/messaging/python/DOC.md +469 -0
- package/dist/twilio/docs/messaging/typescript/DOC.md +946 -0
- package/dist/vercel/docs/platform/DOC.md +1940 -0
- package/dist/weaviate/docs/vector-db/javascript/DOC.md +1268 -0
- package/dist/weaviate/docs/vector-db/python/DOC.md +1388 -0
- package/dist/zendesk/docs/support/javascript/DOC.md +2150 -0
- package/dist/zendesk/docs/support/python/DOC.md +2297 -0
- package/package.json +22 -6
- package/skills/get-api-docs/SKILL.md +84 -0
- package/src/commands/annotate.js +83 -0
- package/src/commands/build.js +12 -1
- package/src/commands/feedback.js +150 -0
- package/src/commands/get.js +83 -42
- package/src/commands/search.js +7 -0
- package/src/index.js +43 -17
- package/src/lib/analytics.js +90 -0
- package/src/lib/annotations.js +57 -0
- package/src/lib/bm25.js +170 -0
- package/src/lib/cache.js +69 -6
- package/src/lib/config.js +8 -3
- package/src/lib/identity.js +99 -0
- package/src/lib/registry.js +103 -20
- package/src/lib/telemetry.js +86 -0
- package/src/mcp/server.js +177 -0
- package/src/mcp/tools.js +251 -0
|
@@ -0,0 +1,1128 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: headless-cms
|
|
3
|
+
description: "Directus JavaScript/TypeScript SDK coding guidelines for interacting with Directus projects using the official SDK"
|
|
4
|
+
metadata:
|
|
5
|
+
languages: "javascript"
|
|
6
|
+
versions: "20.1.1"
|
|
7
|
+
updated-on: "2026-03-02"
|
|
8
|
+
source: maintainer
|
|
9
|
+
tags: "directus,headless-cms,api,content,backend"
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
# Directus JavaScript/TypeScript SDK Coding Guidelines
|
|
13
|
+
|
|
14
|
+
You are a Directus SDK coding expert. Help me with writing code using the Directus SDK calling the official libraries and SDKs.
|
|
15
|
+
|
|
16
|
+
You can find the official SDK documentation and code samples here:
|
|
17
|
+
https://docs.directus.io/guides/sdk/
|
|
18
|
+
|
|
19
|
+
## Golden Rule: Use the Correct and Current SDK
|
|
20
|
+
|
|
21
|
+
Always use the official Directus SDK (`@directus/sdk`) to interact with Directus projects. This is the standard library for all Directus API interactions. Do not use legacy libraries or unofficial SDKs.
|
|
22
|
+
|
|
23
|
+
- **Library Name:** Directus SDK
|
|
24
|
+
- **NPM Package:** `@directus/sdk`
|
|
25
|
+
- **Legacy Libraries:** `directus-sdk-js`, `@directus/sdk-js` are deprecated
|
|
26
|
+
|
|
27
|
+
**Installation:**
|
|
28
|
+
|
|
29
|
+
- **Correct:** `npm install @directus/sdk`
|
|
30
|
+
- **Incorrect:** `npm install directus-sdk-js`
|
|
31
|
+
- **Incorrect:** `npm install @directus/sdk-js`
|
|
32
|
+
|
|
33
|
+
**APIs and Usage:**
|
|
34
|
+
|
|
35
|
+
- **Correct:** `import { createDirectus, rest } from '@directus/sdk'`
|
|
36
|
+
- **Correct:** `const client = createDirectus('URL').with(rest())`
|
|
37
|
+
- **Correct:** `await client.request(readItems('collection'))`
|
|
38
|
+
- **Incorrect:** `DirectusClient` or `DirectusSDK`
|
|
39
|
+
- **Incorrect:** `client.items.read()`
|
|
40
|
+
- **Incorrect:** Legacy API patterns
|
|
41
|
+
|
|
42
|
+
## Installation
|
|
43
|
+
|
|
44
|
+
Install the Directus SDK using npm:
|
|
45
|
+
|
|
46
|
+
```bash
|
|
47
|
+
npm install @directus/sdk
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
## Initialization and Authentication
|
|
51
|
+
|
|
52
|
+
The `@directus/sdk` library requires creating a Directus client instance using `createDirectus` and composables like `rest()` for REST API functionality.
|
|
53
|
+
|
|
54
|
+
### Basic Client Setup
|
|
55
|
+
|
|
56
|
+
```javascript
|
|
57
|
+
import { createDirectus, rest } from '@directus/sdk';
|
|
58
|
+
|
|
59
|
+
// Create a client pointing to your Directus instance
|
|
60
|
+
const client = createDirectus('https://your-directus-instance.com').with(rest());
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
### Authentication with Static Token
|
|
64
|
+
|
|
65
|
+
Use a static access token for authentication:
|
|
66
|
+
|
|
67
|
+
```javascript
|
|
68
|
+
import { createDirectus, staticToken, rest } from '@directus/sdk';
|
|
69
|
+
|
|
70
|
+
const client = createDirectus('https://your-directus-instance.com')
|
|
71
|
+
.with(staticToken('YOUR_ACCESS_TOKEN'))
|
|
72
|
+
.with(rest());
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
With environment variables:
|
|
76
|
+
|
|
77
|
+
```javascript
|
|
78
|
+
import { createDirectus, staticToken, rest } from '@directus/sdk';
|
|
79
|
+
|
|
80
|
+
const client = createDirectus(process.env.DIRECTUS_URL)
|
|
81
|
+
.with(staticToken(process.env.DIRECTUS_TOKEN))
|
|
82
|
+
.with(rest());
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
### Authentication with User Login
|
|
86
|
+
|
|
87
|
+
Use email and password authentication:
|
|
88
|
+
|
|
89
|
+
```javascript
|
|
90
|
+
import { createDirectus, authentication, rest } from '@directus/sdk';
|
|
91
|
+
|
|
92
|
+
const client = createDirectus('https://your-directus-instance.com')
|
|
93
|
+
.with(authentication())
|
|
94
|
+
.with(rest());
|
|
95
|
+
|
|
96
|
+
// Login with credentials
|
|
97
|
+
const result = await client.login('user@example.com', 'password');
|
|
98
|
+
|
|
99
|
+
// The token is now stored in the client for subsequent requests
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
Login with mode specification:
|
|
103
|
+
|
|
104
|
+
```javascript
|
|
105
|
+
const result = await client.login('user@example.com', 'password', {
|
|
106
|
+
mode: 'cookie' // or 'json'
|
|
107
|
+
});
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
### Logout
|
|
111
|
+
|
|
112
|
+
```javascript
|
|
113
|
+
await client.logout();
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
### Refresh Token
|
|
117
|
+
|
|
118
|
+
```javascript
|
|
119
|
+
await client.refresh();
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
### Current User
|
|
123
|
+
|
|
124
|
+
Get the currently authenticated user:
|
|
125
|
+
|
|
126
|
+
```javascript
|
|
127
|
+
import { createDirectus, rest, authentication, readMe } from '@directus/sdk';
|
|
128
|
+
|
|
129
|
+
const client = createDirectus('https://your-directus-instance.com')
|
|
130
|
+
.with(authentication())
|
|
131
|
+
.with(rest());
|
|
132
|
+
|
|
133
|
+
await client.login('user@example.com', 'password');
|
|
134
|
+
|
|
135
|
+
const me = await client.request(readMe());
|
|
136
|
+
console.log(me);
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
## Reading Items from Collections
|
|
140
|
+
|
|
141
|
+
### Read All Items
|
|
142
|
+
|
|
143
|
+
```javascript
|
|
144
|
+
import { createDirectus, rest, readItems } from '@directus/sdk';
|
|
145
|
+
|
|
146
|
+
const client = createDirectus('https://your-directus-instance.com').with(rest());
|
|
147
|
+
|
|
148
|
+
// Read all items from a collection
|
|
149
|
+
const articles = await client.request(readItems('articles'));
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
### Read with Query Parameters
|
|
153
|
+
|
|
154
|
+
```javascript
|
|
155
|
+
import { createDirectus, rest, readItems } from '@directus/sdk';
|
|
156
|
+
|
|
157
|
+
const client = createDirectus('https://your-directus-instance.com').with(rest());
|
|
158
|
+
|
|
159
|
+
// Read with fields, filters, sorting, and limits
|
|
160
|
+
const articles = await client.request(
|
|
161
|
+
readItems('articles', {
|
|
162
|
+
fields: ['id', 'title', 'author.name', 'publish_date'],
|
|
163
|
+
filter: {
|
|
164
|
+
status: { _eq: 'published' },
|
|
165
|
+
publish_date: { _gte: '2024-01-01' }
|
|
166
|
+
},
|
|
167
|
+
sort: ['-publish_date', 'title'],
|
|
168
|
+
limit: 10,
|
|
169
|
+
offset: 0
|
|
170
|
+
})
|
|
171
|
+
);
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
### Read Single Item by ID
|
|
175
|
+
|
|
176
|
+
```javascript
|
|
177
|
+
import { createDirectus, rest, readItem } from '@directus/sdk';
|
|
178
|
+
|
|
179
|
+
const client = createDirectus('https://your-directus-instance.com').with(rest());
|
|
180
|
+
|
|
181
|
+
const article = await client.request(
|
|
182
|
+
readItem('articles', '1', {
|
|
183
|
+
fields: ['*', 'author.*']
|
|
184
|
+
})
|
|
185
|
+
);
|
|
186
|
+
```
|
|
187
|
+
|
|
188
|
+
### Search Items
|
|
189
|
+
|
|
190
|
+
```javascript
|
|
191
|
+
import { createDirectus, rest, readItems } from '@directus/sdk';
|
|
192
|
+
|
|
193
|
+
const client = createDirectus('https://your-directus-instance.com').with(rest());
|
|
194
|
+
|
|
195
|
+
const results = await client.request(
|
|
196
|
+
readItems('articles', {
|
|
197
|
+
search: 'directus cms',
|
|
198
|
+
fields: ['id', 'title', 'content']
|
|
199
|
+
})
|
|
200
|
+
);
|
|
201
|
+
```
|
|
202
|
+
|
|
203
|
+
### Deep Query for Relations
|
|
204
|
+
|
|
205
|
+
```javascript
|
|
206
|
+
import { createDirectus, rest, readItems } from '@directus/sdk';
|
|
207
|
+
|
|
208
|
+
const client = createDirectus('https://your-directus-instance.com').with(rest());
|
|
209
|
+
|
|
210
|
+
const articles = await client.request(
|
|
211
|
+
readItems('articles', {
|
|
212
|
+
fields: ['*'],
|
|
213
|
+
deep: {
|
|
214
|
+
author: {
|
|
215
|
+
_filter: {
|
|
216
|
+
status: { _eq: 'active' }
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
})
|
|
221
|
+
);
|
|
222
|
+
```
|
|
223
|
+
|
|
224
|
+
## Creating Items
|
|
225
|
+
|
|
226
|
+
### Create Single Item
|
|
227
|
+
|
|
228
|
+
```javascript
|
|
229
|
+
import { createDirectus, rest, createItem } from '@directus/sdk';
|
|
230
|
+
|
|
231
|
+
const client = createDirectus('https://your-directus-instance.com').with(rest());
|
|
232
|
+
|
|
233
|
+
const newArticle = await client.request(
|
|
234
|
+
createItem('articles', {
|
|
235
|
+
title: 'New Article',
|
|
236
|
+
content: 'Article content here',
|
|
237
|
+
status: 'draft'
|
|
238
|
+
})
|
|
239
|
+
);
|
|
240
|
+
|
|
241
|
+
console.log(newArticle.id);
|
|
242
|
+
```
|
|
243
|
+
|
|
244
|
+
### Create Multiple Items
|
|
245
|
+
|
|
246
|
+
```javascript
|
|
247
|
+
import { createDirectus, rest, createItems } from '@directus/sdk';
|
|
248
|
+
|
|
249
|
+
const client = createDirectus('https://your-directus-instance.com').with(rest());
|
|
250
|
+
|
|
251
|
+
const newArticles = await client.request(
|
|
252
|
+
createItems('articles', [
|
|
253
|
+
{ title: 'Article 1', status: 'draft' },
|
|
254
|
+
{ title: 'Article 2', status: 'draft' },
|
|
255
|
+
{ title: 'Article 3', status: 'published' }
|
|
256
|
+
])
|
|
257
|
+
);
|
|
258
|
+
```
|
|
259
|
+
|
|
260
|
+
## Updating Items
|
|
261
|
+
|
|
262
|
+
### Update Single Item
|
|
263
|
+
|
|
264
|
+
```javascript
|
|
265
|
+
import { createDirectus, rest, updateItem } from '@directus/sdk';
|
|
266
|
+
|
|
267
|
+
const client = createDirectus('https://your-directus-instance.com').with(rest());
|
|
268
|
+
|
|
269
|
+
const updated = await client.request(
|
|
270
|
+
updateItem('articles', '1', {
|
|
271
|
+
status: 'published',
|
|
272
|
+
publish_date: new Date().toISOString()
|
|
273
|
+
})
|
|
274
|
+
);
|
|
275
|
+
```
|
|
276
|
+
|
|
277
|
+
### Update Multiple Items
|
|
278
|
+
|
|
279
|
+
```javascript
|
|
280
|
+
import { createDirectus, rest, updateItems } from '@directus/sdk';
|
|
281
|
+
|
|
282
|
+
const client = createDirectus('https://your-directus-instance.com').with(rest());
|
|
283
|
+
|
|
284
|
+
// Update items matching a filter
|
|
285
|
+
const updated = await client.request(
|
|
286
|
+
updateItems('articles',
|
|
287
|
+
{ status: 'archived' },
|
|
288
|
+
{
|
|
289
|
+
filter: {
|
|
290
|
+
publish_date: { _lt: '2020-01-01' }
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
)
|
|
294
|
+
);
|
|
295
|
+
```
|
|
296
|
+
|
|
297
|
+
Update multiple items by IDs:
|
|
298
|
+
|
|
299
|
+
```javascript
|
|
300
|
+
import { createDirectus, rest, updateItems } from '@directus/sdk';
|
|
301
|
+
|
|
302
|
+
const client = createDirectus('https://your-directus-instance.com').with(rest());
|
|
303
|
+
|
|
304
|
+
const updated = await client.request(
|
|
305
|
+
updateItems('articles',
|
|
306
|
+
['1', '2', '3'],
|
|
307
|
+
{ status: 'published' }
|
|
308
|
+
)
|
|
309
|
+
);
|
|
310
|
+
```
|
|
311
|
+
|
|
312
|
+
## Deleting Items
|
|
313
|
+
|
|
314
|
+
### Delete Single Item
|
|
315
|
+
|
|
316
|
+
```javascript
|
|
317
|
+
import { createDirectus, rest, deleteItem } from '@directus/sdk';
|
|
318
|
+
|
|
319
|
+
const client = createDirectus('https://your-directus-instance.com').with(rest());
|
|
320
|
+
|
|
321
|
+
await client.request(deleteItem('articles', '1'));
|
|
322
|
+
```
|
|
323
|
+
|
|
324
|
+
### Delete Multiple Items
|
|
325
|
+
|
|
326
|
+
```javascript
|
|
327
|
+
import { createDirectus, rest, deleteItems } from '@directus/sdk';
|
|
328
|
+
|
|
329
|
+
const client = createDirectus('https://your-directus-instance.com').with(rest());
|
|
330
|
+
|
|
331
|
+
// Delete by IDs
|
|
332
|
+
await client.request(deleteItems('articles', ['1', '2', '3']));
|
|
333
|
+
```
|
|
334
|
+
|
|
335
|
+
Delete items matching a filter:
|
|
336
|
+
|
|
337
|
+
```javascript
|
|
338
|
+
import { createDirectus, rest, deleteItems } from '@directus/sdk';
|
|
339
|
+
|
|
340
|
+
const client = createDirectus('https://your-directus-instance.com').with(rest());
|
|
341
|
+
|
|
342
|
+
await client.request(
|
|
343
|
+
deleteItems('articles', {
|
|
344
|
+
filter: {
|
|
345
|
+
status: { _eq: 'draft' },
|
|
346
|
+
date_created: { _lt: '2023-01-01' }
|
|
347
|
+
}
|
|
348
|
+
})
|
|
349
|
+
);
|
|
350
|
+
```
|
|
351
|
+
|
|
352
|
+
## Aggregation and Analytics
|
|
353
|
+
|
|
354
|
+
### Count Items
|
|
355
|
+
|
|
356
|
+
```javascript
|
|
357
|
+
import { createDirectus, rest, aggregate } from '@directus/sdk';
|
|
358
|
+
|
|
359
|
+
const client = createDirectus('https://your-directus-instance.com').with(rest());
|
|
360
|
+
|
|
361
|
+
const result = await client.request(
|
|
362
|
+
aggregate('articles', {
|
|
363
|
+
aggregate: {
|
|
364
|
+
count: ['id']
|
|
365
|
+
}
|
|
366
|
+
})
|
|
367
|
+
);
|
|
368
|
+
|
|
369
|
+
console.log(result[0].count.id); // Total count
|
|
370
|
+
```
|
|
371
|
+
|
|
372
|
+
### Count with Filter
|
|
373
|
+
|
|
374
|
+
```javascript
|
|
375
|
+
import { createDirectus, rest, aggregate } from '@directus/sdk';
|
|
376
|
+
|
|
377
|
+
const client = createDirectus('https://your-directus-instance.com').with(rest());
|
|
378
|
+
|
|
379
|
+
const result = await client.request(
|
|
380
|
+
aggregate('articles', {
|
|
381
|
+
query: {
|
|
382
|
+
filter: {
|
|
383
|
+
status: { _eq: 'published' }
|
|
384
|
+
}
|
|
385
|
+
},
|
|
386
|
+
aggregate: {
|
|
387
|
+
count: ['id']
|
|
388
|
+
}
|
|
389
|
+
})
|
|
390
|
+
);
|
|
391
|
+
```
|
|
392
|
+
|
|
393
|
+
### Sum, Average, Min, Max
|
|
394
|
+
|
|
395
|
+
```javascript
|
|
396
|
+
import { createDirectus, rest, aggregate } from '@directus/sdk';
|
|
397
|
+
|
|
398
|
+
const client = createDirectus('https://your-directus-instance.com').with(rest());
|
|
399
|
+
|
|
400
|
+
const stats = await client.request(
|
|
401
|
+
aggregate('articles', {
|
|
402
|
+
aggregate: {
|
|
403
|
+
sum: ['views'],
|
|
404
|
+
avg: ['views'],
|
|
405
|
+
min: ['views'],
|
|
406
|
+
max: ['views']
|
|
407
|
+
}
|
|
408
|
+
})
|
|
409
|
+
);
|
|
410
|
+
|
|
411
|
+
console.log(stats[0].sum.views);
|
|
412
|
+
console.log(stats[0].avg.views);
|
|
413
|
+
console.log(stats[0].min.views);
|
|
414
|
+
console.log(stats[0].max.views);
|
|
415
|
+
```
|
|
416
|
+
|
|
417
|
+
### Group By
|
|
418
|
+
|
|
419
|
+
```javascript
|
|
420
|
+
import { createDirectus, rest, aggregate } from '@directus/sdk';
|
|
421
|
+
|
|
422
|
+
const client = createDirectus('https://your-directus-instance.com').with(rest());
|
|
423
|
+
|
|
424
|
+
const grouped = await client.request(
|
|
425
|
+
aggregate('articles', {
|
|
426
|
+
aggregate: {
|
|
427
|
+
count: ['id'],
|
|
428
|
+
avg: ['views']
|
|
429
|
+
},
|
|
430
|
+
groupBy: ['author', 'status']
|
|
431
|
+
})
|
|
432
|
+
);
|
|
433
|
+
|
|
434
|
+
// Returns grouped statistics by author and status
|
|
435
|
+
```
|
|
436
|
+
|
|
437
|
+
Group by date functions:
|
|
438
|
+
|
|
439
|
+
```javascript
|
|
440
|
+
import { createDirectus, rest, aggregate } from '@directus/sdk';
|
|
441
|
+
|
|
442
|
+
const client = createDirectus('https://your-directus-instance.com').with(rest());
|
|
443
|
+
|
|
444
|
+
const monthlyStats = await client.request(
|
|
445
|
+
aggregate('articles', {
|
|
446
|
+
aggregate: {
|
|
447
|
+
count: ['id']
|
|
448
|
+
},
|
|
449
|
+
groupBy: ['year(publish_date)', 'month(publish_date)']
|
|
450
|
+
})
|
|
451
|
+
);
|
|
452
|
+
```
|
|
453
|
+
|
|
454
|
+
## File Management
|
|
455
|
+
|
|
456
|
+
### Upload Files
|
|
457
|
+
|
|
458
|
+
```javascript
|
|
459
|
+
import { createDirectus, rest, uploadFiles } from '@directus/sdk';
|
|
460
|
+
|
|
461
|
+
const client = createDirectus('https://your-directus-instance.com').with(rest());
|
|
462
|
+
|
|
463
|
+
const formData = new FormData();
|
|
464
|
+
formData.append('file', fileBlob);
|
|
465
|
+
|
|
466
|
+
const uploadedFile = await client.request(uploadFiles(formData));
|
|
467
|
+
|
|
468
|
+
console.log(uploadedFile.id);
|
|
469
|
+
```
|
|
470
|
+
|
|
471
|
+
Upload with metadata:
|
|
472
|
+
|
|
473
|
+
```javascript
|
|
474
|
+
import { createDirectus, rest, uploadFiles } from '@directus/sdk';
|
|
475
|
+
|
|
476
|
+
const client = createDirectus('https://your-directus-instance.com').with(rest());
|
|
477
|
+
|
|
478
|
+
const formData = new FormData();
|
|
479
|
+
formData.append('title', 'My Image');
|
|
480
|
+
formData.append('folder', 'folder-uuid');
|
|
481
|
+
formData.append('file', fileBlob);
|
|
482
|
+
|
|
483
|
+
const uploadedFile = await client.request(uploadFiles(formData));
|
|
484
|
+
```
|
|
485
|
+
|
|
486
|
+
### Read Files
|
|
487
|
+
|
|
488
|
+
```javascript
|
|
489
|
+
import { createDirectus, rest, readFiles } from '@directus/sdk';
|
|
490
|
+
|
|
491
|
+
const client = createDirectus('https://your-directus-instance.com').with(rest());
|
|
492
|
+
|
|
493
|
+
const files = await client.request(
|
|
494
|
+
readFiles({
|
|
495
|
+
filter: {
|
|
496
|
+
type: { _starts_with: 'image/' }
|
|
497
|
+
}
|
|
498
|
+
})
|
|
499
|
+
);
|
|
500
|
+
```
|
|
501
|
+
|
|
502
|
+
### Read Single File
|
|
503
|
+
|
|
504
|
+
```javascript
|
|
505
|
+
import { createDirectus, rest, readFile } from '@directus/sdk';
|
|
506
|
+
|
|
507
|
+
const client = createDirectus('https://your-directus-instance.com').with(rest());
|
|
508
|
+
|
|
509
|
+
const file = await client.request(readFile('file-uuid'));
|
|
510
|
+
```
|
|
511
|
+
|
|
512
|
+
### Read Asset (Raw File Content)
|
|
513
|
+
|
|
514
|
+
```javascript
|
|
515
|
+
import { createDirectus, rest, readAssetRaw } from '@directus/sdk';
|
|
516
|
+
|
|
517
|
+
const client = createDirectus('https://your-directus-instance.com').with(rest());
|
|
518
|
+
|
|
519
|
+
const assetBlob = await client.request(readAssetRaw('file-uuid'));
|
|
520
|
+
```
|
|
521
|
+
|
|
522
|
+
With transformations (for images):
|
|
523
|
+
|
|
524
|
+
```javascript
|
|
525
|
+
import { createDirectus, rest, readAssetRaw } from '@directus/sdk';
|
|
526
|
+
|
|
527
|
+
const client = createDirectus('https://your-directus-instance.com').with(rest());
|
|
528
|
+
|
|
529
|
+
const thumbnail = await client.request(
|
|
530
|
+
readAssetRaw('file-uuid', {
|
|
531
|
+
width: 300,
|
|
532
|
+
height: 300,
|
|
533
|
+
fit: 'cover',
|
|
534
|
+
quality: 80,
|
|
535
|
+
format: 'webp'
|
|
536
|
+
})
|
|
537
|
+
);
|
|
538
|
+
```
|
|
539
|
+
|
|
540
|
+
Available transformation options:
|
|
541
|
+
|
|
542
|
+
```javascript
|
|
543
|
+
import { createDirectus, rest, readAssetRaw } from '@directus/sdk';
|
|
544
|
+
|
|
545
|
+
const client = createDirectus('https://your-directus-instance.com').with(rest());
|
|
546
|
+
|
|
547
|
+
const transformed = await client.request(
|
|
548
|
+
readAssetRaw('file-uuid', {
|
|
549
|
+
width: 800,
|
|
550
|
+
height: 600,
|
|
551
|
+
fit: 'contain', // cover, contain, inside, outside
|
|
552
|
+
quality: 85,
|
|
553
|
+
format: 'jpg', // jpg, png, webp, tiff, avif
|
|
554
|
+
transforms: [['flip']], // flip, flop, blur, sharpen, grayscale
|
|
555
|
+
withoutEnlargement: true
|
|
556
|
+
})
|
|
557
|
+
);
|
|
558
|
+
```
|
|
559
|
+
|
|
560
|
+
### Update File
|
|
561
|
+
|
|
562
|
+
```javascript
|
|
563
|
+
import { createDirectus, rest, updateFile } from '@directus/sdk';
|
|
564
|
+
|
|
565
|
+
const client = createDirectus('https://your-directus-instance.com').with(rest());
|
|
566
|
+
|
|
567
|
+
const updated = await client.request(
|
|
568
|
+
updateFile('file-uuid', {
|
|
569
|
+
title: 'Updated Title',
|
|
570
|
+
description: 'Updated description'
|
|
571
|
+
})
|
|
572
|
+
);
|
|
573
|
+
```
|
|
574
|
+
|
|
575
|
+
### Delete File
|
|
576
|
+
|
|
577
|
+
```javascript
|
|
578
|
+
import { createDirectus, rest, deleteFile } from '@directus/sdk';
|
|
579
|
+
|
|
580
|
+
const client = createDirectus('https://your-directus-instance.com').with(rest());
|
|
581
|
+
|
|
582
|
+
await client.request(deleteFile('file-uuid'));
|
|
583
|
+
```
|
|
584
|
+
|
|
585
|
+
## User Management
|
|
586
|
+
|
|
587
|
+
### Read Users
|
|
588
|
+
|
|
589
|
+
```javascript
|
|
590
|
+
import { createDirectus, rest, readUsers } from '@directus/sdk';
|
|
591
|
+
|
|
592
|
+
const client = createDirectus('https://your-directus-instance.com').with(rest());
|
|
593
|
+
|
|
594
|
+
const users = await client.request(
|
|
595
|
+
readUsers({
|
|
596
|
+
filter: {
|
|
597
|
+
status: { _eq: 'active' }
|
|
598
|
+
},
|
|
599
|
+
fields: ['id', 'email', 'first_name', 'last_name']
|
|
600
|
+
})
|
|
601
|
+
);
|
|
602
|
+
```
|
|
603
|
+
|
|
604
|
+
### Read Single User
|
|
605
|
+
|
|
606
|
+
```javascript
|
|
607
|
+
import { createDirectus, rest, readUser } from '@directus/sdk';
|
|
608
|
+
|
|
609
|
+
const client = createDirectus('https://your-directus-instance.com').with(rest());
|
|
610
|
+
|
|
611
|
+
const user = await client.request(readUser('user-uuid'));
|
|
612
|
+
```
|
|
613
|
+
|
|
614
|
+
### Create User
|
|
615
|
+
|
|
616
|
+
```javascript
|
|
617
|
+
import { createDirectus, rest, createUser } from '@directus/sdk';
|
|
618
|
+
|
|
619
|
+
const client = createDirectus('https://your-directus-instance.com').with(rest());
|
|
620
|
+
|
|
621
|
+
const newUser = await client.request(
|
|
622
|
+
createUser({
|
|
623
|
+
email: 'newuser@example.com',
|
|
624
|
+
password: 'secure-password',
|
|
625
|
+
role: 'role-uuid',
|
|
626
|
+
first_name: 'John',
|
|
627
|
+
last_name: 'Doe'
|
|
628
|
+
})
|
|
629
|
+
);
|
|
630
|
+
```
|
|
631
|
+
|
|
632
|
+
### Update User
|
|
633
|
+
|
|
634
|
+
```javascript
|
|
635
|
+
import { createDirectus, rest, updateUser } from '@directus/sdk';
|
|
636
|
+
|
|
637
|
+
const client = createDirectus('https://your-directus-instance.com').with(rest());
|
|
638
|
+
|
|
639
|
+
const updated = await client.request(
|
|
640
|
+
updateUser('user-uuid', {
|
|
641
|
+
first_name: 'Jane',
|
|
642
|
+
status: 'active'
|
|
643
|
+
})
|
|
644
|
+
);
|
|
645
|
+
```
|
|
646
|
+
|
|
647
|
+
### Delete User
|
|
648
|
+
|
|
649
|
+
```javascript
|
|
650
|
+
import { createDirectus, rest, deleteUser } from '@directus/sdk';
|
|
651
|
+
|
|
652
|
+
const client = createDirectus('https://your-directus-instance.com').with(rest());
|
|
653
|
+
|
|
654
|
+
await client.request(deleteUser('user-uuid'));
|
|
655
|
+
```
|
|
656
|
+
|
|
657
|
+
## Roles and Permissions
|
|
658
|
+
|
|
659
|
+
### Read Roles
|
|
660
|
+
|
|
661
|
+
```javascript
|
|
662
|
+
import { createDirectus, rest, readRoles } from '@directus/sdk';
|
|
663
|
+
|
|
664
|
+
const client = createDirectus('https://your-directus-instance.com').with(rest());
|
|
665
|
+
|
|
666
|
+
const roles = await client.request(readRoles());
|
|
667
|
+
```
|
|
668
|
+
|
|
669
|
+
### Read Single Role
|
|
670
|
+
|
|
671
|
+
```javascript
|
|
672
|
+
import { createDirectus, rest, readRole } from '@directus/sdk';
|
|
673
|
+
|
|
674
|
+
const client = createDirectus('https://your-directus-instance.com').with(rest());
|
|
675
|
+
|
|
676
|
+
const role = await client.request(readRole('role-uuid'));
|
|
677
|
+
```
|
|
678
|
+
|
|
679
|
+
### Create Role
|
|
680
|
+
|
|
681
|
+
```javascript
|
|
682
|
+
import { createDirectus, rest, createRole } from '@directus/sdk';
|
|
683
|
+
|
|
684
|
+
const client = createDirectus('https://your-directus-instance.com').with(rest());
|
|
685
|
+
|
|
686
|
+
const newRole = await client.request(
|
|
687
|
+
createRole({
|
|
688
|
+
name: 'Content Editor',
|
|
689
|
+
icon: 'edit',
|
|
690
|
+
description: 'Can edit content'
|
|
691
|
+
})
|
|
692
|
+
);
|
|
693
|
+
```
|
|
694
|
+
|
|
695
|
+
### Read Permissions
|
|
696
|
+
|
|
697
|
+
```javascript
|
|
698
|
+
import { createDirectus, rest, readPermissions } from '@directus/sdk';
|
|
699
|
+
|
|
700
|
+
const client = createDirectus('https://your-directus-instance.com').with(rest());
|
|
701
|
+
|
|
702
|
+
const permissions = await client.request(
|
|
703
|
+
readPermissions({
|
|
704
|
+
filter: {
|
|
705
|
+
role: { _eq: 'role-uuid' }
|
|
706
|
+
}
|
|
707
|
+
})
|
|
708
|
+
);
|
|
709
|
+
```
|
|
710
|
+
|
|
711
|
+
### Create Permission
|
|
712
|
+
|
|
713
|
+
```javascript
|
|
714
|
+
import { createDirectus, rest, createPermission } from '@directus/sdk';
|
|
715
|
+
|
|
716
|
+
const client = createDirectus('https://your-directus-instance.com').with(rest());
|
|
717
|
+
|
|
718
|
+
const newPermission = await client.request(
|
|
719
|
+
createPermission({
|
|
720
|
+
role: 'role-uuid',
|
|
721
|
+
collection: 'articles',
|
|
722
|
+
action: 'read',
|
|
723
|
+
fields: ['*']
|
|
724
|
+
})
|
|
725
|
+
);
|
|
726
|
+
```
|
|
727
|
+
|
|
728
|
+
## Collections and Fields
|
|
729
|
+
|
|
730
|
+
### Read Collections
|
|
731
|
+
|
|
732
|
+
```javascript
|
|
733
|
+
import { createDirectus, rest, readCollections } from '@directus/sdk';
|
|
734
|
+
|
|
735
|
+
const client = createDirectus('https://your-directus-instance.com').with(rest());
|
|
736
|
+
|
|
737
|
+
const collections = await client.request(readCollections());
|
|
738
|
+
```
|
|
739
|
+
|
|
740
|
+
### Read Single Collection
|
|
741
|
+
|
|
742
|
+
```javascript
|
|
743
|
+
import { createDirectus, rest, readCollection } from '@directus/sdk';
|
|
744
|
+
|
|
745
|
+
const client = createDirectus('https://your-directus-instance.com').with(rest());
|
|
746
|
+
|
|
747
|
+
const collection = await client.request(readCollection('articles'));
|
|
748
|
+
```
|
|
749
|
+
|
|
750
|
+
### Read Fields
|
|
751
|
+
|
|
752
|
+
```javascript
|
|
753
|
+
import { createDirectus, rest, readFields } from '@directus/sdk';
|
|
754
|
+
|
|
755
|
+
const client = createDirectus('https://your-directus-instance.com').with(rest());
|
|
756
|
+
|
|
757
|
+
// Read all fields for a collection
|
|
758
|
+
const fields = await client.request(readFields('articles'));
|
|
759
|
+
```
|
|
760
|
+
|
|
761
|
+
### Read Single Field
|
|
762
|
+
|
|
763
|
+
```javascript
|
|
764
|
+
import { createDirectus, rest, readField } from '@directus/sdk';
|
|
765
|
+
|
|
766
|
+
const client = createDirectus('https://your-directus-instance.com').with(rest());
|
|
767
|
+
|
|
768
|
+
const field = await client.request(readField('articles', 'title'));
|
|
769
|
+
```
|
|
770
|
+
|
|
771
|
+
## Real-time with WebSockets
|
|
772
|
+
|
|
773
|
+
### Setup Real-time Client
|
|
774
|
+
|
|
775
|
+
```javascript
|
|
776
|
+
import { createDirectus, realtime } from '@directus/sdk';
|
|
777
|
+
|
|
778
|
+
const client = createDirectus('https://your-directus-instance.com')
|
|
779
|
+
.with(realtime());
|
|
780
|
+
|
|
781
|
+
// Connect to WebSocket
|
|
782
|
+
await client.connect();
|
|
783
|
+
```
|
|
784
|
+
|
|
785
|
+
### Subscribe to Collection Updates
|
|
786
|
+
|
|
787
|
+
```javascript
|
|
788
|
+
import { createDirectus, realtime } from '@directus/sdk';
|
|
789
|
+
|
|
790
|
+
const client = createDirectus('https://your-directus-instance.com')
|
|
791
|
+
.with(realtime());
|
|
792
|
+
|
|
793
|
+
await client.connect();
|
|
794
|
+
|
|
795
|
+
const { subscription } = await client.subscribe('articles', {
|
|
796
|
+
event: 'update',
|
|
797
|
+
query: {
|
|
798
|
+
fields: ['id', 'title', 'status']
|
|
799
|
+
}
|
|
800
|
+
});
|
|
801
|
+
|
|
802
|
+
for await (const message of subscription) {
|
|
803
|
+
console.log('Item updated:', message);
|
|
804
|
+
}
|
|
805
|
+
```
|
|
806
|
+
|
|
807
|
+
### Subscribe to Multiple Events
|
|
808
|
+
|
|
809
|
+
```javascript
|
|
810
|
+
import { createDirectus, realtime } from '@directus/sdk';
|
|
811
|
+
|
|
812
|
+
const client = createDirectus('https://your-directus-instance.com')
|
|
813
|
+
.with(realtime());
|
|
814
|
+
|
|
815
|
+
await client.connect();
|
|
816
|
+
|
|
817
|
+
const { subscription } = await client.subscribe('articles', {
|
|
818
|
+
event: 'create'
|
|
819
|
+
});
|
|
820
|
+
|
|
821
|
+
for await (const message of subscription) {
|
|
822
|
+
console.log('New item created:', message);
|
|
823
|
+
}
|
|
824
|
+
```
|
|
825
|
+
|
|
826
|
+
Available events: `create`, `update`, `delete`
|
|
827
|
+
|
|
828
|
+
### Unsubscribe
|
|
829
|
+
|
|
830
|
+
```javascript
|
|
831
|
+
await client.unsubscribe(subscription.uid);
|
|
832
|
+
```
|
|
833
|
+
|
|
834
|
+
### Close Connection
|
|
835
|
+
|
|
836
|
+
```javascript
|
|
837
|
+
await client.disconnect();
|
|
838
|
+
```
|
|
839
|
+
|
|
840
|
+
## GraphQL Support
|
|
841
|
+
|
|
842
|
+
### Setup GraphQL Client
|
|
843
|
+
|
|
844
|
+
```javascript
|
|
845
|
+
import { createDirectus, graphql } from '@directus/sdk';
|
|
846
|
+
|
|
847
|
+
const client = createDirectus('https://your-directus-instance.com')
|
|
848
|
+
.with(graphql());
|
|
849
|
+
```
|
|
850
|
+
|
|
851
|
+
### Execute GraphQL Query
|
|
852
|
+
|
|
853
|
+
```javascript
|
|
854
|
+
import { createDirectus, graphql } from '@directus/sdk';
|
|
855
|
+
|
|
856
|
+
const client = createDirectus('https://your-directus-instance.com')
|
|
857
|
+
.with(graphql());
|
|
858
|
+
|
|
859
|
+
const result = await client.query(`
|
|
860
|
+
query {
|
|
861
|
+
articles(filter: { status: { _eq: "published" } }) {
|
|
862
|
+
id
|
|
863
|
+
title
|
|
864
|
+
author {
|
|
865
|
+
first_name
|
|
866
|
+
last_name
|
|
867
|
+
}
|
|
868
|
+
}
|
|
869
|
+
}
|
|
870
|
+
`);
|
|
871
|
+
|
|
872
|
+
console.log(result.articles);
|
|
873
|
+
```
|
|
874
|
+
|
|
875
|
+
### Execute GraphQL Mutation
|
|
876
|
+
|
|
877
|
+
```javascript
|
|
878
|
+
import { createDirectus, graphql } from '@directus/sdk';
|
|
879
|
+
|
|
880
|
+
const client = createDirectus('https://your-directus-instance.com')
|
|
881
|
+
.with(graphql());
|
|
882
|
+
|
|
883
|
+
const result = await client.query(`
|
|
884
|
+
mutation {
|
|
885
|
+
create_articles_item(data: {
|
|
886
|
+
title: "New Article"
|
|
887
|
+
content: "Article content"
|
|
888
|
+
status: "draft"
|
|
889
|
+
}) {
|
|
890
|
+
id
|
|
891
|
+
title
|
|
892
|
+
}
|
|
893
|
+
}
|
|
894
|
+
`);
|
|
895
|
+
```
|
|
896
|
+
|
|
897
|
+
With variables:
|
|
898
|
+
|
|
899
|
+
```javascript
|
|
900
|
+
import { createDirectus, graphql } from '@directus/sdk';
|
|
901
|
+
|
|
902
|
+
const client = createDirectus('https://your-directus-instance.com')
|
|
903
|
+
.with(graphql());
|
|
904
|
+
|
|
905
|
+
const result = await client.query(
|
|
906
|
+
`
|
|
907
|
+
query GetArticle($id: ID!) {
|
|
908
|
+
articles_by_id(id: $id) {
|
|
909
|
+
id
|
|
910
|
+
title
|
|
911
|
+
content
|
|
912
|
+
}
|
|
913
|
+
}
|
|
914
|
+
`,
|
|
915
|
+
{
|
|
916
|
+
id: '1'
|
|
917
|
+
}
|
|
918
|
+
);
|
|
919
|
+
```
|
|
920
|
+
|
|
921
|
+
## TypeScript Support
|
|
922
|
+
|
|
923
|
+
### Type-Safe Collections
|
|
924
|
+
|
|
925
|
+
```typescript
|
|
926
|
+
import { createDirectus, rest, readItems } from '@directus/sdk';
|
|
927
|
+
|
|
928
|
+
// Define your schema types
|
|
929
|
+
interface Article {
|
|
930
|
+
id: string;
|
|
931
|
+
title: string;
|
|
932
|
+
content: string;
|
|
933
|
+
status: 'draft' | 'published' | 'archived';
|
|
934
|
+
author: string | Author;
|
|
935
|
+
publish_date: string;
|
|
936
|
+
}
|
|
937
|
+
|
|
938
|
+
interface Author {
|
|
939
|
+
id: string;
|
|
940
|
+
first_name: string;
|
|
941
|
+
last_name: string;
|
|
942
|
+
email: string;
|
|
943
|
+
}
|
|
944
|
+
|
|
945
|
+
interface Schema {
|
|
946
|
+
articles: Article[];
|
|
947
|
+
authors: Author[];
|
|
948
|
+
}
|
|
949
|
+
|
|
950
|
+
// Create typed client
|
|
951
|
+
const client = createDirectus<Schema>('https://your-directus-instance.com')
|
|
952
|
+
.with(rest());
|
|
953
|
+
|
|
954
|
+
// Type-safe operations
|
|
955
|
+
const articles = await client.request(
|
|
956
|
+
readItems('articles', {
|
|
957
|
+
fields: ['id', 'title', 'author.first_name']
|
|
958
|
+
})
|
|
959
|
+
);
|
|
960
|
+
|
|
961
|
+
// articles is properly typed as Article[]
|
|
962
|
+
```
|
|
963
|
+
|
|
964
|
+
### Type-Safe Item Creation
|
|
965
|
+
|
|
966
|
+
```typescript
|
|
967
|
+
import { createDirectus, rest, createItem } from '@directus/sdk';
|
|
968
|
+
|
|
969
|
+
const client = createDirectus<Schema>('https://your-directus-instance.com')
|
|
970
|
+
.with(rest());
|
|
971
|
+
|
|
972
|
+
const newArticle = await client.request(
|
|
973
|
+
createItem('articles', {
|
|
974
|
+
title: 'New Article',
|
|
975
|
+
content: 'Content here',
|
|
976
|
+
status: 'draft' // TypeScript ensures this matches the union type
|
|
977
|
+
})
|
|
978
|
+
);
|
|
979
|
+
```
|
|
980
|
+
|
|
981
|
+
## Advanced Query Filters
|
|
982
|
+
|
|
983
|
+
### Comparison Operators
|
|
984
|
+
|
|
985
|
+
```javascript
|
|
986
|
+
import { createDirectus, rest, readItems } from '@directus/sdk';
|
|
987
|
+
|
|
988
|
+
const client = createDirectus('https://your-directus-instance.com').with(rest());
|
|
989
|
+
|
|
990
|
+
const filtered = await client.request(
|
|
991
|
+
readItems('articles', {
|
|
992
|
+
filter: {
|
|
993
|
+
views: { _gt: 1000 }, // Greater than
|
|
994
|
+
publish_date: { _lte: '2024-12-31' }, // Less than or equal
|
|
995
|
+
status: { _neq: 'draft' }, // Not equal
|
|
996
|
+
title: { _contains: 'directus' }, // Contains substring
|
|
997
|
+
author: { _null: false } // Not null
|
|
998
|
+
}
|
|
999
|
+
})
|
|
1000
|
+
);
|
|
1001
|
+
```
|
|
1002
|
+
|
|
1003
|
+
Available operators: `_eq`, `_neq`, `_lt`, `_lte`, `_gt`, `_gte`, `_in`, `_nin`, `_null`, `_nnull`, `_contains`, `_ncontains`, `_starts_with`, `_nstarts_with`, `_ends_with`, `_nends_with`, `_between`, `_nbetween`, `_empty`, `_nempty`
|
|
1004
|
+
|
|
1005
|
+
### Logical Operators
|
|
1006
|
+
|
|
1007
|
+
```javascript
|
|
1008
|
+
import { createDirectus, rest, readItems } from '@directus/sdk';
|
|
1009
|
+
|
|
1010
|
+
const client = createDirectus('https://your-directus-instance.com').with(rest());
|
|
1011
|
+
|
|
1012
|
+
// AND (default behavior)
|
|
1013
|
+
const andFilter = await client.request(
|
|
1014
|
+
readItems('articles', {
|
|
1015
|
+
filter: {
|
|
1016
|
+
status: { _eq: 'published' },
|
|
1017
|
+
views: { _gt: 100 }
|
|
1018
|
+
}
|
|
1019
|
+
})
|
|
1020
|
+
);
|
|
1021
|
+
|
|
1022
|
+
// OR
|
|
1023
|
+
const orFilter = await client.request(
|
|
1024
|
+
readItems('articles', {
|
|
1025
|
+
filter: {
|
|
1026
|
+
_or: [
|
|
1027
|
+
{ status: { _eq: 'published' } },
|
|
1028
|
+
{ status: { _eq: 'archived' } }
|
|
1029
|
+
]
|
|
1030
|
+
}
|
|
1031
|
+
})
|
|
1032
|
+
);
|
|
1033
|
+
|
|
1034
|
+
// Complex nested logic
|
|
1035
|
+
const complexFilter = await client.request(
|
|
1036
|
+
readItems('articles', {
|
|
1037
|
+
filter: {
|
|
1038
|
+
_and: [
|
|
1039
|
+
{
|
|
1040
|
+
_or: [
|
|
1041
|
+
{ status: { _eq: 'published' } },
|
|
1042
|
+
{ status: { _eq: 'archived' } }
|
|
1043
|
+
]
|
|
1044
|
+
},
|
|
1045
|
+
{ views: { _gt: 100 } }
|
|
1046
|
+
]
|
|
1047
|
+
}
|
|
1048
|
+
})
|
|
1049
|
+
);
|
|
1050
|
+
```
|
|
1051
|
+
|
|
1052
|
+
## Error Handling
|
|
1053
|
+
|
|
1054
|
+
```javascript
|
|
1055
|
+
import { createDirectus, rest, readItems } from '@directus/sdk';
|
|
1056
|
+
|
|
1057
|
+
const client = createDirectus('https://your-directus-instance.com').with(rest());
|
|
1058
|
+
|
|
1059
|
+
try {
|
|
1060
|
+
const articles = await client.request(readItems('articles'));
|
|
1061
|
+
} catch (error) {
|
|
1062
|
+
if (error.errors) {
|
|
1063
|
+
// Directus API error
|
|
1064
|
+
console.error('API Error:', error.errors);
|
|
1065
|
+
} else {
|
|
1066
|
+
// Network or other error
|
|
1067
|
+
console.error('Error:', error.message);
|
|
1068
|
+
}
|
|
1069
|
+
}
|
|
1070
|
+
```
|
|
1071
|
+
|
|
1072
|
+
Handle authentication errors:
|
|
1073
|
+
|
|
1074
|
+
```javascript
|
|
1075
|
+
import { createDirectus, authentication, rest } from '@directus/sdk';
|
|
1076
|
+
|
|
1077
|
+
const client = createDirectus('https://your-directus-instance.com')
|
|
1078
|
+
.with(authentication())
|
|
1079
|
+
.with(rest());
|
|
1080
|
+
|
|
1081
|
+
try {
|
|
1082
|
+
await client.login('user@example.com', 'wrong-password');
|
|
1083
|
+
} catch (error) {
|
|
1084
|
+
if (error.errors?.[0]?.extensions?.code === 'INVALID_CREDENTIALS') {
|
|
1085
|
+
console.error('Invalid email or password');
|
|
1086
|
+
} else {
|
|
1087
|
+
console.error('Login error:', error);
|
|
1088
|
+
}
|
|
1089
|
+
}
|
|
1090
|
+
```
|
|
1091
|
+
|
|
1092
|
+
## Request Configuration
|
|
1093
|
+
|
|
1094
|
+
### Custom Headers
|
|
1095
|
+
|
|
1096
|
+
```javascript
|
|
1097
|
+
import { createDirectus, rest } from '@directus/sdk';
|
|
1098
|
+
|
|
1099
|
+
const client = createDirectus('https://your-directus-instance.com', {
|
|
1100
|
+
globals: {
|
|
1101
|
+
headers: {
|
|
1102
|
+
'Custom-Header': 'value'
|
|
1103
|
+
}
|
|
1104
|
+
}
|
|
1105
|
+
}).with(rest());
|
|
1106
|
+
```
|
|
1107
|
+
|
|
1108
|
+
### Request Timeout
|
|
1109
|
+
|
|
1110
|
+
```javascript
|
|
1111
|
+
import { createDirectus, rest } from '@directus/sdk';
|
|
1112
|
+
|
|
1113
|
+
const client = createDirectus('https://your-directus-instance.com', {
|
|
1114
|
+
globals: {
|
|
1115
|
+
fetch: {
|
|
1116
|
+
timeout: 10000 // 10 seconds
|
|
1117
|
+
}
|
|
1118
|
+
}
|
|
1119
|
+
}).with(rest());
|
|
1120
|
+
```
|
|
1121
|
+
|
|
1122
|
+
## Useful Links
|
|
1123
|
+
|
|
1124
|
+
- Documentation: https://docs.directus.io/
|
|
1125
|
+
- SDK Reference: https://docs.directus.io/guides/sdk/
|
|
1126
|
+
- REST API Reference: https://docs.directus.io/reference/introduction
|
|
1127
|
+
- GraphQL Reference: https://docs.directus.io/guides/sdk/graphql
|
|
1128
|
+
- Real-time Guide: https://docs.directus.io/guides/real-time/getting-started/websockets
|