@michael-nussbaumer/nuxt-directus 0.2.2 → 0.2.4
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
CHANGED
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
# @michael-nussbaumer/nuxt-directus
|
|
2
2
|
|
|
3
|
-
[](https://www.npmjs.com/package/@michael-nussbaumer/nuxt-directus)
|
|
4
4
|
[](https://opensource.org/licenses/MIT)
|
|
5
|
+
[](https://michael-nussbaumer.github.io/nuxt-directus-module/)
|
|
6
|
+
[](https://nuxt.com)
|
|
5
7
|
|
|
6
8
|
A production-ready Nuxt 4 module that integrates Directus SDK with authentication, configurable global auth middleware, and automatic TypeScript type generation from Directus OpenAPI schema.
|
|
7
9
|
|
|
@@ -111,15 +113,21 @@ definePageMeta({
|
|
|
111
113
|
|
|
112
114
|
## Documentation
|
|
113
115
|
|
|
116
|
+
📚 **[Full Documentation Site](https://michael-nussbaumer.github.io/nuxt-directus-module/)**
|
|
117
|
+
|
|
114
118
|
Comprehensive guides for all module features:
|
|
115
119
|
|
|
116
|
-
- **[Getting Started](
|
|
117
|
-
- **[Configuration](
|
|
118
|
-
- **[Authentication](
|
|
119
|
-
- **[API Usage](
|
|
120
|
-
- **[Real-time WebSocket](
|
|
121
|
-
- **[Middleware](
|
|
122
|
-
- **[
|
|
120
|
+
- **[Getting Started](https://michael-nussbaumer.github.io/nuxt-directus-module/getting-started)** - Installation, setup, and basic usage
|
|
121
|
+
- **[Configuration](https://michael-nussbaumer.github.io/nuxt-directus-module/configuration)** - Module options and environment variables
|
|
122
|
+
- **[Authentication](https://michael-nussbaumer.github.io/nuxt-directus-module/authentication)** - Login, logout, registration, and user management
|
|
123
|
+
- **[API Usage](https://michael-nussbaumer.github.io/nuxt-directus-module/api)** - CRUD operations, queries, and filtering
|
|
124
|
+
- **[Real-time WebSocket](https://michael-nussbaumer.github.io/nuxt-directus-module/realtime)** - Live subscriptions and event handling
|
|
125
|
+
- **[Middleware](https://michael-nussbaumer.github.io/nuxt-directus-module/middleware)** - Route protection and authentication flows
|
|
126
|
+
- **[Role-Based Permissions](https://michael-nussbaumer.github.io/nuxt-directus-module/role-based-permissions)** - Advanced access control
|
|
127
|
+
- **[Type Generation](https://michael-nussbaumer.github.io/nuxt-directus-module/type-generation)** - Automatic TypeScript types from OpenAPI schema
|
|
128
|
+
- **[Examples](https://michael-nussbaumer.github.io/nuxt-directus-module/examples)** - Code examples and use cases
|
|
129
|
+
|
|
130
|
+
Or browse the [docs folder](./docs) in this repository.
|
|
123
131
|
|
|
124
132
|
## Quick Reference
|
|
125
133
|
|
|
@@ -169,7 +177,7 @@ API operations:
|
|
|
169
177
|
- `updateMany(collection, ids, data)` - Update multiple items
|
|
170
178
|
- `deleteOne(collection, id)` - Delete item
|
|
171
179
|
- `deleteMany(collection, ids)` - Delete multiple items
|
|
172
|
-
- `customRequest(
|
|
180
|
+
- `customRequest(path, options)` - Custom endpoint
|
|
173
181
|
|
|
174
182
|
#### `useDirectusRealtime()`
|
|
175
183
|
|
|
@@ -219,4 +227,10 @@ Contributions are welcome! Please feel free to submit a Pull Request.
|
|
|
219
227
|
|
|
220
228
|
## Repository
|
|
221
229
|
|
|
222
|
-
https://github.com/
|
|
230
|
+
https://github.com/Michael-Nussbaumer/nuxt-directus-module
|
|
231
|
+
|
|
232
|
+
## Documentation Site
|
|
233
|
+
|
|
234
|
+
The documentation is hosted on GitHub Pages. To set it up for the first time, see [GITHUB_PAGES_SETUP.md](./GITHUB_PAGES_SETUP.md).
|
|
235
|
+
|
|
236
|
+
Visit: https://michael-nussbaumer.github.io/nuxt-directus-module/
|
package/dist/module.json
CHANGED
|
@@ -10,10 +10,14 @@ export const useDirectusRealtime = () => {
|
|
|
10
10
|
const { collection, query = {}, uid, persistent = false } = options;
|
|
11
11
|
const subscriptionId = uid || `${collection}-${JSON.stringify(query)}-${Math.random()}`;
|
|
12
12
|
if (subscriptions.has(subscriptionId)) {
|
|
13
|
-
|
|
13
|
+
if (import.meta.dev) {
|
|
14
|
+
console.warn(`[Directus Realtime] Subscription ${subscriptionId} already exists`);
|
|
15
|
+
}
|
|
14
16
|
return subscriptions.get(subscriptionId);
|
|
15
17
|
}
|
|
16
|
-
|
|
18
|
+
if (import.meta.dev) {
|
|
19
|
+
console.log(`[Directus Realtime] Subscribing to ${collection} with ID: ${subscriptionId}`);
|
|
20
|
+
}
|
|
17
21
|
try {
|
|
18
22
|
const { subscription, unsubscribe: unsubscribe2 } = await client.subscribe(collection, {
|
|
19
23
|
query,
|
|
@@ -22,7 +26,9 @@ export const useDirectusRealtime = () => {
|
|
|
22
26
|
(async () => {
|
|
23
27
|
try {
|
|
24
28
|
for await (const message of subscription) {
|
|
25
|
-
|
|
29
|
+
if (import.meta.dev) {
|
|
30
|
+
console.log(`[Directus Realtime] Event received for ${collection}:`, message);
|
|
31
|
+
}
|
|
26
32
|
callback(message);
|
|
27
33
|
}
|
|
28
34
|
} catch (error) {
|
|
@@ -48,10 +54,14 @@ export const useDirectusRealtime = () => {
|
|
|
48
54
|
const unsubscribe = (subscriptionId) => {
|
|
49
55
|
const handler = subscriptions.get(subscriptionId);
|
|
50
56
|
if (!handler) {
|
|
51
|
-
|
|
57
|
+
if (import.meta.dev) {
|
|
58
|
+
console.warn(`[Directus Realtime] Subscription ${subscriptionId} not found`);
|
|
59
|
+
}
|
|
52
60
|
return;
|
|
53
61
|
}
|
|
54
|
-
|
|
62
|
+
if (import.meta.dev) {
|
|
63
|
+
console.log(`[Directus Realtime] Unsubscribing from ${handler.collection} (${subscriptionId})`);
|
|
64
|
+
}
|
|
55
65
|
try {
|
|
56
66
|
handler.unsubscribe();
|
|
57
67
|
subscriptions.delete(subscriptionId);
|
package/dist/runtime/directus.js
CHANGED
|
@@ -21,12 +21,12 @@ export default defineNuxtPlugin(async () => {
|
|
|
21
21
|
if (!apiUrl) {
|
|
22
22
|
throw new Error("[Directus] NUXT_PUBLIC_DIRECTUS_URL is not configured. Please set it in your nuxt.config.ts runtimeConfig.public.directusUrl");
|
|
23
23
|
}
|
|
24
|
-
if (import.meta.client) {
|
|
24
|
+
if (import.meta.client && import.meta.dev) {
|
|
25
25
|
console.log("[Directus] Using API URL:", apiUrl);
|
|
26
26
|
}
|
|
27
27
|
const wsBaseUrl = config.public.directusWsUrl || config.public.directusUrl;
|
|
28
28
|
const wsUrl = wsBaseUrl.replace(/^http/, "ws") + "/websocket";
|
|
29
|
-
if (import.meta.client) {
|
|
29
|
+
if (import.meta.client && import.meta.dev) {
|
|
30
30
|
console.log("[Directus] WebSocket URL:", wsUrl);
|
|
31
31
|
}
|
|
32
32
|
const storage = new NuxtCookieStorage();
|
|
@@ -44,11 +44,15 @@ export default defineNuxtPlugin(async () => {
|
|
|
44
44
|
try {
|
|
45
45
|
directusClient.connect();
|
|
46
46
|
directusClient.onWebSocket("open", () => {
|
|
47
|
-
|
|
47
|
+
if (import.meta.dev) {
|
|
48
|
+
console.log("[Directus] WebSocket connection established");
|
|
49
|
+
}
|
|
48
50
|
isWebSocketConnected.value = true;
|
|
49
51
|
});
|
|
50
52
|
directusClient.onWebSocket("close", () => {
|
|
51
|
-
|
|
53
|
+
if (import.meta.dev) {
|
|
54
|
+
console.log("[Directus] WebSocket connection closed");
|
|
55
|
+
}
|
|
52
56
|
isWebSocketConnected.value = false;
|
|
53
57
|
});
|
|
54
58
|
directusClient.onWebSocket("error", (error) => {
|
|
@@ -56,7 +60,9 @@ export default defineNuxtPlugin(async () => {
|
|
|
56
60
|
isWebSocketConnected.value = false;
|
|
57
61
|
});
|
|
58
62
|
directusClient.onWebSocket("message", (message) => {
|
|
59
|
-
|
|
63
|
+
if (import.meta.dev) {
|
|
64
|
+
console.log("[Directus] WebSocket message:", message);
|
|
65
|
+
}
|
|
60
66
|
});
|
|
61
67
|
} catch (error) {
|
|
62
68
|
console.error("[Directus] WebSocket connection failed:", error);
|
|
@@ -9,7 +9,9 @@ export default defineNuxtRouteMiddleware(async (to, from) => {
|
|
|
9
9
|
afterLoginPath: "/"
|
|
10
10
|
};
|
|
11
11
|
const enableGlobalMiddleware = config.public.directus?.enableGlobalMiddleware ?? true;
|
|
12
|
-
|
|
12
|
+
if (import.meta.dev) {
|
|
13
|
+
console.log("[directus-auth middleware] from", from.fullPath, "to", to.fullPath);
|
|
14
|
+
}
|
|
13
15
|
const authMetaRaw = to.meta?.auth;
|
|
14
16
|
let authMeta;
|
|
15
17
|
let requiresAuth;
|
|
@@ -95,7 +97,9 @@ export default defineNuxtRouteMiddleware(async (to, from) => {
|
|
|
95
97
|
if (authMeta.roles && authMeta.roles.length > 0) {
|
|
96
98
|
const hasPermission = authMeta.roles.some((requiredRole) => userRoles.includes(requiredRole));
|
|
97
99
|
if (!hasPermission) {
|
|
98
|
-
|
|
100
|
+
if (import.meta.dev) {
|
|
101
|
+
console.warn(`[directus-auth middleware] User roles [${userRoles.join(", ")}] don't match required roles:`, authMeta.roles);
|
|
102
|
+
}
|
|
99
103
|
const unauthorizedRedirect = authMeta.unauthorizedRedirect || "/";
|
|
100
104
|
return navigateTo(unauthorizedRedirect);
|
|
101
105
|
}
|
|
@@ -103,7 +107,9 @@ export default defineNuxtRouteMiddleware(async (to, from) => {
|
|
|
103
107
|
if (authMeta.excludeRoles && authMeta.excludeRoles.length > 0) {
|
|
104
108
|
const isExcluded = userRoles.some((role) => authMeta.excludeRoles.includes(role));
|
|
105
109
|
if (isExcluded) {
|
|
106
|
-
|
|
110
|
+
if (import.meta.dev) {
|
|
111
|
+
console.warn(`[directus-auth middleware] User has excluded role in [${userRoles.join(", ")}]:`, authMeta.excludeRoles);
|
|
112
|
+
}
|
|
107
113
|
const unauthorizedRedirect = authMeta.unauthorizedRedirect || "/";
|
|
108
114
|
return navigateTo(unauthorizedRedirect);
|
|
109
115
|
}
|
package/dist/runtime/types.js
CHANGED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@michael-nussbaumer/nuxt-directus",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.4",
|
|
4
4
|
"description": "Nuxt 4 module for Directus SDK with auth and TypeScript type generation",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
@@ -22,7 +22,10 @@
|
|
|
22
22
|
"prepack": "pnpm run build",
|
|
23
23
|
"generate:types": "cross-env NODE_ENV=development tsx scripts/generate-directus-types.ts",
|
|
24
24
|
"lint": "eslint .",
|
|
25
|
-
"release": "pnpm run build && npm publish"
|
|
25
|
+
"release": "pnpm run build && npm publish",
|
|
26
|
+
"docs:dev": "cd docs && pnpm install && pnpm run dev",
|
|
27
|
+
"docs:build": "cd docs && pnpm install && pnpm run generate",
|
|
28
|
+
"docs:preview": "cd docs && pnpm run preview"
|
|
26
29
|
},
|
|
27
30
|
"dependencies": {
|
|
28
31
|
"@nuxt/kit": "^3.15.3",
|