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.
Files changed (139) hide show
  1. package/README.md +55 -0
  2. package/bin/chub-mcp +2 -0
  3. package/dist/airtable/docs/database/javascript/DOC.md +1437 -0
  4. package/dist/airtable/docs/database/python/DOC.md +1735 -0
  5. package/dist/amplitude/docs/analytics/javascript/DOC.md +1282 -0
  6. package/dist/amplitude/docs/analytics/python/DOC.md +1199 -0
  7. package/dist/anthropic/docs/claude-api/javascript/DOC.md +503 -0
  8. package/dist/anthropic/docs/claude-api/python/DOC.md +389 -0
  9. package/dist/asana/docs/tasks/DOC.md +1396 -0
  10. package/dist/assemblyai/docs/transcription/DOC.md +1043 -0
  11. package/dist/atlassian/docs/confluence/javascript/DOC.md +1347 -0
  12. package/dist/atlassian/docs/confluence/python/DOC.md +1604 -0
  13. package/dist/auth0/docs/identity/javascript/DOC.md +968 -0
  14. package/dist/auth0/docs/identity/python/DOC.md +1199 -0
  15. package/dist/aws/docs/s3/javascript/DOC.md +1773 -0
  16. package/dist/aws/docs/s3/python/DOC.md +1807 -0
  17. package/dist/binance/docs/trading/javascript/DOC.md +1315 -0
  18. package/dist/binance/docs/trading/python/DOC.md +1454 -0
  19. package/dist/braintree/docs/gateway/javascript/DOC.md +1278 -0
  20. package/dist/braintree/docs/gateway/python/DOC.md +1179 -0
  21. package/dist/chromadb/docs/embeddings-db/javascript/DOC.md +1263 -0
  22. package/dist/chromadb/docs/embeddings-db/python/DOC.md +1707 -0
  23. package/dist/clerk/docs/auth/javascript/DOC.md +1220 -0
  24. package/dist/clerk/docs/auth/python/DOC.md +274 -0
  25. package/dist/cloudflare/docs/workers/javascript/DOC.md +918 -0
  26. package/dist/cloudflare/docs/workers/python/DOC.md +994 -0
  27. package/dist/cockroachdb/docs/distributed-db/DOC.md +1500 -0
  28. package/dist/cohere/docs/llm/DOC.md +1335 -0
  29. package/dist/datadog/docs/monitoring/javascript/DOC.md +1740 -0
  30. package/dist/datadog/docs/monitoring/python/DOC.md +1815 -0
  31. package/dist/deepgram/docs/speech/javascript/DOC.md +885 -0
  32. package/dist/deepgram/docs/speech/python/DOC.md +685 -0
  33. package/dist/deepl/docs/translation/javascript/DOC.md +887 -0
  34. package/dist/deepl/docs/translation/python/DOC.md +944 -0
  35. package/dist/deepseek/docs/llm/DOC.md +1220 -0
  36. package/dist/directus/docs/headless-cms/javascript/DOC.md +1128 -0
  37. package/dist/directus/docs/headless-cms/python/DOC.md +1276 -0
  38. package/dist/discord/docs/bot/javascript/DOC.md +1090 -0
  39. package/dist/discord/docs/bot/python/DOC.md +1130 -0
  40. package/dist/elasticsearch/docs/search/DOC.md +1634 -0
  41. package/dist/elevenlabs/docs/text-to-speech/javascript/DOC.md +336 -0
  42. package/dist/elevenlabs/docs/text-to-speech/python/DOC.md +552 -0
  43. package/dist/firebase/docs/auth/DOC.md +1015 -0
  44. package/dist/gemini/docs/genai/javascript/DOC.md +691 -0
  45. package/dist/gemini/docs/genai/python/DOC.md +555 -0
  46. package/dist/github/docs/octokit/DOC.md +1560 -0
  47. package/dist/google/docs/bigquery/javascript/DOC.md +1688 -0
  48. package/dist/google/docs/bigquery/python/DOC.md +1503 -0
  49. package/dist/hubspot/docs/crm/javascript/DOC.md +1805 -0
  50. package/dist/hubspot/docs/crm/python/DOC.md +2033 -0
  51. package/dist/huggingface/docs/transformers/DOC.md +948 -0
  52. package/dist/intercom/docs/messaging/javascript/DOC.md +1844 -0
  53. package/dist/intercom/docs/messaging/python/DOC.md +1797 -0
  54. package/dist/jira/docs/issues/javascript/DOC.md +1420 -0
  55. package/dist/jira/docs/issues/python/DOC.md +1492 -0
  56. package/dist/kafka/docs/streaming/javascript/DOC.md +1671 -0
  57. package/dist/kafka/docs/streaming/python/DOC.md +1464 -0
  58. package/dist/landingai-ade/docs/api/DOC.md +620 -0
  59. package/dist/landingai-ade/docs/sdk/python/DOC.md +489 -0
  60. package/dist/landingai-ade/docs/sdk/typescript/DOC.md +542 -0
  61. package/dist/landingai-ade/skills/SKILL.md +489 -0
  62. package/dist/launchdarkly/docs/feature-flags/javascript/DOC.md +1191 -0
  63. package/dist/launchdarkly/docs/feature-flags/python/DOC.md +1671 -0
  64. package/dist/linear/docs/tracker/DOC.md +1554 -0
  65. package/dist/livekit/docs/realtime/javascript/DOC.md +303 -0
  66. package/dist/livekit/docs/realtime/python/DOC.md +163 -0
  67. package/dist/mailchimp/docs/marketing/DOC.md +1420 -0
  68. package/dist/meilisearch/docs/search/DOC.md +1241 -0
  69. package/dist/microsoft/docs/onedrive/javascript/DOC.md +1421 -0
  70. package/dist/microsoft/docs/onedrive/python/DOC.md +1549 -0
  71. package/dist/mongodb/docs/atlas/DOC.md +2041 -0
  72. package/dist/notion/docs/workspace-api/javascript/DOC.md +1435 -0
  73. package/dist/notion/docs/workspace-api/python/DOC.md +1400 -0
  74. package/dist/okta/docs/identity/javascript/DOC.md +1171 -0
  75. package/dist/okta/docs/identity/python/DOC.md +1401 -0
  76. package/dist/openai/docs/chat/javascript/DOC.md +407 -0
  77. package/dist/openai/docs/chat/python/DOC.md +568 -0
  78. package/dist/paypal/docs/checkout/DOC.md +278 -0
  79. package/dist/pinecone/docs/sdk/javascript/DOC.md +984 -0
  80. package/dist/pinecone/docs/sdk/python/DOC.md +1395 -0
  81. package/dist/plaid/docs/banking/javascript/DOC.md +1163 -0
  82. package/dist/plaid/docs/banking/python/DOC.md +1203 -0
  83. package/dist/playwright-community/skills/login-flows/SKILL.md +108 -0
  84. package/dist/postmark/docs/transactional-email/DOC.md +1168 -0
  85. package/dist/prisma/docs/orm/javascript/DOC.md +1419 -0
  86. package/dist/prisma/docs/orm/python/DOC.md +1317 -0
  87. package/dist/qdrant/docs/vector-search/javascript/DOC.md +1221 -0
  88. package/dist/qdrant/docs/vector-search/python/DOC.md +1653 -0
  89. package/dist/rabbitmq/docs/message-queue/javascript/DOC.md +1193 -0
  90. package/dist/rabbitmq/docs/message-queue/python/DOC.md +1243 -0
  91. package/dist/razorpay/docs/payments/javascript/DOC.md +1219 -0
  92. package/dist/razorpay/docs/payments/python/DOC.md +1330 -0
  93. package/dist/redis/docs/key-value/javascript/DOC.md +1851 -0
  94. package/dist/redis/docs/key-value/python/DOC.md +2054 -0
  95. package/dist/registry.json +2817 -0
  96. package/dist/replicate/docs/model-hosting/DOC.md +1318 -0
  97. package/dist/resend/docs/email/DOC.md +1271 -0
  98. package/dist/salesforce/docs/crm/javascript/DOC.md +1241 -0
  99. package/dist/salesforce/docs/crm/python/DOC.md +1183 -0
  100. package/dist/search-index.json +1 -0
  101. package/dist/sendgrid/docs/email-api/javascript/DOC.md +371 -0
  102. package/dist/sendgrid/docs/email-api/python/DOC.md +656 -0
  103. package/dist/sentry/docs/error-tracking/javascript/DOC.md +1073 -0
  104. package/dist/sentry/docs/error-tracking/python/DOC.md +1309 -0
  105. package/dist/shopify/docs/storefront/DOC.md +457 -0
  106. package/dist/slack/docs/workspace/javascript/DOC.md +933 -0
  107. package/dist/slack/docs/workspace/python/DOC.md +271 -0
  108. package/dist/square/docs/payments/javascript/DOC.md +1855 -0
  109. package/dist/square/docs/payments/python/DOC.md +1728 -0
  110. package/dist/stripe/docs/api/DOC.md +1727 -0
  111. package/dist/stripe/docs/payments/DOC.md +1726 -0
  112. package/dist/stytch/docs/auth/javascript/DOC.md +1813 -0
  113. package/dist/stytch/docs/auth/python/DOC.md +1962 -0
  114. package/dist/supabase/docs/client/DOC.md +1606 -0
  115. package/dist/twilio/docs/messaging/python/DOC.md +469 -0
  116. package/dist/twilio/docs/messaging/typescript/DOC.md +946 -0
  117. package/dist/vercel/docs/platform/DOC.md +1940 -0
  118. package/dist/weaviate/docs/vector-db/javascript/DOC.md +1268 -0
  119. package/dist/weaviate/docs/vector-db/python/DOC.md +1388 -0
  120. package/dist/zendesk/docs/support/javascript/DOC.md +2150 -0
  121. package/dist/zendesk/docs/support/python/DOC.md +2297 -0
  122. package/package.json +22 -6
  123. package/skills/get-api-docs/SKILL.md +84 -0
  124. package/src/commands/annotate.js +83 -0
  125. package/src/commands/build.js +12 -1
  126. package/src/commands/feedback.js +150 -0
  127. package/src/commands/get.js +83 -42
  128. package/src/commands/search.js +7 -0
  129. package/src/index.js +43 -17
  130. package/src/lib/analytics.js +90 -0
  131. package/src/lib/annotations.js +57 -0
  132. package/src/lib/bm25.js +170 -0
  133. package/src/lib/cache.js +69 -6
  134. package/src/lib/config.js +8 -3
  135. package/src/lib/identity.js +99 -0
  136. package/src/lib/registry.js +103 -20
  137. package/src/lib/telemetry.js +86 -0
  138. package/src/mcp/server.js +177 -0
  139. 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