@devcoffee/nuxt-core 1.0.2 → 1.1.1

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 (64) hide show
  1. package/CHANGELOG.md +82 -0
  2. package/GUIDELINE.md +351 -0
  3. package/README.md +405 -84
  4. package/dist/module.d.mts +295 -156
  5. package/dist/module.d.ts +300 -0
  6. package/dist/module.json +1 -1
  7. package/dist/module.mjs +191 -36
  8. package/dist/runtime/app/composables/useAuthContext.d.ts +26 -0
  9. package/dist/runtime/app/composables/useAuthContext.js +111 -0
  10. package/dist/runtime/app/composables/useLogger.d.ts +3 -3
  11. package/dist/runtime/app/composables/useSessionContext.d.ts +22 -0
  12. package/dist/runtime/app/composables/useSessionContext.js +5 -0
  13. package/dist/runtime/app/middleware/authts.d.ts +12 -0
  14. package/dist/runtime/app/middleware/authts.js +101 -0
  15. package/dist/runtime/app/pages/authorize.d.vue.ts +3 -0
  16. package/dist/runtime/app/pages/authorize.vue +32 -0
  17. package/dist/runtime/app/pages/authorize.vue.d.ts +3 -0
  18. package/dist/runtime/app/plugins/authts.d.ts +82 -0
  19. package/dist/runtime/app/plugins/authts.js +91 -0
  20. package/dist/runtime/app/plugins/formatters.d.ts +29 -0
  21. package/dist/runtime/app/plugins/formatters.js +101 -0
  22. package/dist/runtime/app/plugins/locale.d.ts +37 -0
  23. package/dist/runtime/app/plugins/locale.js +39 -0
  24. package/dist/runtime/app/plugins/logging.d.ts +24 -16
  25. package/dist/runtime/app/plugins/logging.js +0 -1
  26. package/dist/runtime/app/utils/hashing.d.ts +1 -0
  27. package/dist/runtime/app/utils/hashing.js +3 -0
  28. package/dist/runtime/server/adapters/http.d.ts +5 -0
  29. package/dist/runtime/server/adapters/http.js +15 -0
  30. package/dist/runtime/server/adapters/oidc.d.ts +58 -0
  31. package/dist/runtime/server/adapters/oidc.js +21 -0
  32. package/dist/runtime/server/adapters/storage.d.ts +39 -0
  33. package/dist/runtime/server/adapters/storage.js +14 -0
  34. package/dist/runtime/server/adapters/utils.d.ts +31 -0
  35. package/dist/runtime/server/adapters/utils.js +28 -0
  36. package/dist/runtime/server/composables/useServerLogger.d.ts +3 -2
  37. package/dist/runtime/server/composables/useServerLogger.js +4 -4
  38. package/dist/runtime/server/core/crypto.d.ts +70 -0
  39. package/dist/runtime/server/core/crypto.js +55 -0
  40. package/dist/runtime/server/core/helpers.d.ts +194 -0
  41. package/dist/runtime/server/core/helpers.js +350 -0
  42. package/dist/runtime/server/core/index.d.ts +1 -0
  43. package/dist/runtime/server/core/index.js +1 -0
  44. package/dist/runtime/server/core/mutex.d.ts +19 -0
  45. package/dist/runtime/server/core/mutex.js +39 -0
  46. package/dist/runtime/server/core/nuxtAuthtsHandler.d.ts +26 -0
  47. package/dist/runtime/server/core/nuxtAuthtsHandler.js +238 -0
  48. package/dist/runtime/server/core/nuxtForwardHandler.d.ts +18 -0
  49. package/dist/runtime/server/core/nuxtForwardHandler.js +60 -0
  50. package/dist/runtime/server/dev/route/session.d.ts +2 -0
  51. package/dist/runtime/server/dev/route/session.js +8 -0
  52. package/dist/runtime/server/plugins/authts.d.ts +11 -0
  53. package/dist/runtime/server/plugins/authts.js +55 -0
  54. package/dist/runtime/server/plugins/logging.js +7 -2
  55. package/dist/runtime/server/tsconfig.json +3 -3
  56. package/dist/runtime/types/global.env.d.ts +21 -7
  57. package/dist/runtime/types/nitro.d.ts +7 -2
  58. package/dist/runtime/types/nuxt.d.ts +28 -8
  59. package/dist/runtime/utils.d.ts +31 -0
  60. package/dist/runtime/utils.js +28 -0
  61. package/dist/types.d.mts +6 -4
  62. package/package.json +45 -17
  63. package/dist/runtime/plugin.d.ts +0 -2
  64. package/dist/runtime/plugin.js +0 -4
package/dist/module.d.mts CHANGED
@@ -1,161 +1,300 @@
1
- import * as _nuxt_schema from '@nuxt/schema';
2
- import { LogLevel, ConsolaOptions } from 'consola';
1
+ import { CookieSerializeOptions } from '#devcoffee-core/runtime/server/adapters/http';
2
+ import { OidcUserInfo } from '#devcoffee-core/runtime/server/adapters/oidc';
3
+ import { ConsolaInstance, LogLevel as LogLevel$1, ConsolaOptions } from 'consola';
3
4
 
4
- type LoggingOptions = {
5
- tag: string;
6
- level: LogLevel;
7
- } & DeepPartial<Pick<ConsolaOptions, 'throttle' | 'throttleMin' | 'formatOptions'>>;
8
- type ModuleOptions = {
9
- logging: {
10
- server: LoggingOptions;
11
- ssr: LoggingOptions;
12
- client: LoggingOptions;
13
- };
14
- };
5
+ interface AuthorizedUser {
6
+ id: string
7
+ sub: string
8
+ email: string
9
+ firstName: string
10
+ lastName: string
11
+ locale: string
12
+ language: string
13
+ timezone: string
14
+ }
15
+
16
+ type AuthStatus = 'unauthenticated' | 'authenticated'
17
+
18
+ type AuthData = {
19
+ status: AuthStatus
20
+ tokenSet?: {
21
+ accessToken: string
22
+ tokenType: string
23
+ expiresAt: number
24
+ idToken: string
25
+ refreshToken: string
26
+ scopes: string[]
27
+ }
28
+ }
29
+
30
+ type SessionContext<TData = Record<string, unknown>> = {
31
+ id: string
32
+ auth: AuthData
33
+ user: AuthorizedUser
34
+ data: TData
35
+ issuedAt: number
36
+ expiresAt: number
37
+ }
38
+
39
+ type NuxtAuthOptions = {
40
+ /**
41
+ * Default Devcoffee Nuxt AuthTS option callbacks for session and user mapping.
42
+ * These can be overridden by passing custom callbacks to `NuxtAuthtsHandler()`.
43
+ * @since 1.0.0
44
+ */
45
+ session: (
46
+ session: Omit<SessionContext, 'auth'>,
47
+ auth: SessionContext['auth']
48
+ ) => Awaitable<Omit<SessionContext, 'auth' | 'issuedAt' | 'expiresAt'> & { isAuthenticated: boolean }>
49
+
50
+ /**
51
+ * Maps the OpenID Connect user info response to your local user schema.
52
+ *
53
+ * @param user - The raw user info response from the OpenID provider.
54
+ * @param opts - The token response containing access and ID tokens.
55
+ * @returns A normalized user object.
56
+ * @since 1.0.0
57
+ */
58
+ userInfo: (
59
+ user: AuthorizedUser,
60
+ opts: {
61
+ openidUser?: OidcUserInfo
62
+ tokenSet: Exclude<SessionContext['auth']['tokenSet'], undefined>
63
+ }
64
+ ) => Awaitable<AuthorizedUser>
65
+ }
66
+
67
+ type NuxtSessionContext<TData = Record<string, unknown>> = {
68
+ readonly id: string
69
+ readonly isAuthenticated: boolean
70
+ readonly user: AuthorizedUser
71
+ readonly data: TData
72
+ }
73
+
74
+ type NuxtSessionUpdateContext<TData = Record<string, unknown>> = DeepPartial<{
75
+ user: AuthorizedUser
76
+ data: TData
77
+ }>
78
+
79
+ /**
80
+ * ⚙️ OpenID Connect configuration options.
81
+ *
82
+ * Defines parameters used for client registration, discovery,
83
+ * and token exchange with the OpenID Provider.
84
+ *
85
+ * @since 1.0.0
86
+ */
87
+ type OpenIdOptions = {
88
+ /** Client ID registered with the OpenID Provider. */
89
+ clientId: string
90
+
91
+ /** Client secret for token exchange (if applicable). */
92
+ clientSecret: string
93
+
94
+ /** Whether to use Proof Key for Code Exchange (PKCE) flow. */
95
+ usePkce: boolean
96
+
97
+ /** Code challenge method, e.g. `S256`. */
98
+ codeChallengeMethod: string
99
+
100
+ /** Scopes requested from the OpenID Provider. */
101
+ scopes: string[]
102
+
103
+ /** Redirect URI used after authorization. */
104
+ redirectUri: string
105
+
106
+ /** The `.well-known/openid-configuration` discovery URL. */
107
+ wellKnownUrl: string
108
+
109
+ /** Whether to automatically fetch user info after login. */
110
+ autoFetchUser: boolean
111
+
112
+ /**
113
+ * TTL in seconds for caching autoFetchUser results per session.
114
+ * A GET_SESSION within the TTL window does not trigger an OIDC provider call.
115
+ * Only applies when autoFetchUser is true.
116
+ * @default 300
117
+ * @since 1.0.0
118
+ */
119
+ autoFetchUserTtl: number
120
+
121
+ /** Whether to fetch user info immediately after token grant. */
122
+ fetchUserOnLogin: boolean
123
+
124
+ /**
125
+ * Window in milliseconds before token expiry at which a refresh is triggered.
126
+ * Tokens with expiresAt more than this many milliseconds in the future are
127
+ * considered fresh and the refresh path is skipped entirely.
128
+ * @default 60000
129
+ * @since 1.0.0
130
+ */
131
+ tokenRefreshBufferMs: number
132
+
133
+ /**
134
+ * When `true`, the token refresh mutex uses an atomic Redis NX write
135
+ * (`SET key value NX EX ttl`) via the IORedis native client accessor for
136
+ * true distributed exclusion across multiple server instances. When `false`
137
+ * (default), the existing optimistic lock (`hasItem` + `setItem`) is used.
138
+ *
139
+ * @remarks Only effective when the Nitro `cache` storage mount is backed by
140
+ * a Redis driver. Setting `true` with a non-Redis backend falls through to
141
+ * the optimistic path silently.
142
+ *
143
+ * @default false
144
+ * @since 1.0.0
145
+ */
146
+ distributedLock?: boolean
147
+
148
+ /** Cache configuration for storing OpenID metadata. */
149
+ cache: {
150
+ /** Cache key prefix for the metadata store. */
151
+ prefix: string
152
+ /** Expiry time in seconds for cached metadata. */
153
+ expires: number
154
+ }
155
+ }
156
+
157
+ /**
158
+ * 🍪 Session management configuration.
159
+ *
160
+ * Defines session storage, expiration, and cookie behavior
161
+ * for authentication session tracking.
162
+ *
163
+ * @since 1.0.0
164
+ */
165
+ type SessionsOptions = {
166
+ /** Cookie name mappings used by the session handler. */
167
+ names: {
168
+ /** PKCE verifier cookie name. */
169
+ pkce: string
170
+ /** State cookie name. */
171
+ state: string
172
+ /** Session ID cookie name. */
173
+ sessionId: string
174
+ /** Redirect URL cookie name. */
175
+ redirectUrl: string
176
+ }
177
+
178
+ storage: {
179
+ name: string
180
+
181
+ /** Key prefix for session data in the storage backend. */
182
+ prefix: string
183
+ }
184
+
185
+ /** Session lifetime in seconds. */
186
+ expiresIn: number
187
+
188
+ /** Options for how session cookies are serialized. */
189
+ cookieOpts: CookieSerializeOptions
190
+
191
+ /**
192
+ * Secret used to HMAC-sign session ID cookies and derive the AES-256-GCM key
193
+ * for tokenSet encryption. When empty, signing and encryption are skipped.
194
+ * @since 1.0.0
195
+ */
196
+ secret?: string
197
+ }
198
+
199
+ /**
200
+ * 🔐 Authentication behavior configuration.
201
+ *
202
+ * Defines default redirect paths and URIs used for login/logout flow.
203
+ *
204
+ * @since 1.0.0
205
+ */
206
+ type AuthOptions = {
207
+ /** Path to the login page. */
208
+ loginUri: string
209
+
210
+ /** Default redirect URI after successful login. */
211
+ defaultLoginRedirectUri: string
212
+
213
+ /** Default redirect URI after logout. */
214
+ defaultLogoutRedirectUri: string
215
+
216
+ /** Default anonymous user object. */
217
+ anonymousUser: AuthorizedUser
218
+
219
+ ignoreRegexPatterns: RegExp[]
220
+
221
+ ignoreRegexPatternsDev: RegExp[]
222
+ }
223
+
224
+ /**
225
+ * 🧩 Main configuration interface for the Nuxt AuthTS module.
226
+ *
227
+ * Combines OpenID Connect, session, and general authentication options.
228
+ *
229
+ * @since 1.0.0
230
+ */
231
+ type AuthtsModuleOptions = {
232
+ /** Enable or disable the module */
233
+ enabled: boolean
234
+ openid: OpenIdOptions
235
+ sessions: SessionsOptions
236
+ auth: AuthOptions
237
+ }
238
+
239
+ interface AuthtsMiddlewareMeta {
240
+ /** Require authentication to access */
241
+ required?: boolean
242
+
243
+ /** Only accessible if unauthenticated (login/register pages) */
244
+ unauthenticatedOnly?: boolean
245
+
246
+ /** Restrict access to these roles */
247
+ roles?: string[]
248
+ }
15
249
 
16
- declare const configKey: "nuxtCore";
17
- declare module 'nuxt/schema' {
18
- interface RuntimeConfig {
19
- [configKey]: ModuleOptions;
20
- }
21
- interface PublicRuntimeConfig {
22
- [configKey]: {
23
- logging: ModuleOptions['logging']['client'];
24
- };
25
- }
250
+ type CoreLogLevel = LogLevel$1
251
+ type CoreLogInstance = ConsolaInstance
252
+
253
+ type LoggingOptions = {
254
+ tag: string
255
+ level: CoreLogLevel
256
+ } & DeepPartial<Pick<ConsolaOptions, 'throttle' | 'throttleMin' | 'formatOptions'>>
257
+
258
+ type NuxtCoreLogging = {
259
+ getLogger: (opts?: { tag?: string; level?: LogLevel }) => CoreLogInstance
260
+ }
261
+
262
+ type LoggingModuleOptions = {
263
+ server: LoggingOptions
264
+ ssr: LoggingOptions
265
+ client: LoggingOptions
26
266
  }
27
- declare const _default: _nuxt_schema.NuxtModule<{
28
- logging?: {
29
- server?: {
30
- tag?: string | undefined;
31
- level?: 0 | 1 | 2 | 3 | 4 | 5 | {
32
- toString?: {} | undefined;
33
- toFixed?: {} | undefined;
34
- toExponential?: {} | undefined;
35
- toPrecision?: {} | undefined;
36
- valueOf?: {} | undefined;
37
- toLocaleString?: {} | undefined;
38
- } | undefined;
39
- throttle?: number | undefined;
40
- throttleMin?: number | undefined;
41
- formatOptions?: {
42
- [x: string]: unknown;
43
- columns?: number | undefined;
44
- date?: boolean | undefined;
45
- colors?: boolean | undefined;
46
- compact?: boolean | number | undefined;
47
- errorLevel?: number | undefined;
48
- } | undefined;
49
- } | undefined;
50
- ssr?: {
51
- tag?: string | undefined;
52
- level?: 0 | 1 | 2 | 3 | 4 | 5 | {
53
- toString?: {} | undefined;
54
- toFixed?: {} | undefined;
55
- toExponential?: {} | undefined;
56
- toPrecision?: {} | undefined;
57
- valueOf?: {} | undefined;
58
- toLocaleString?: {} | undefined;
59
- } | undefined;
60
- throttle?: number | undefined;
61
- throttleMin?: number | undefined;
62
- formatOptions?: {
63
- [x: string]: unknown;
64
- columns?: number | undefined;
65
- date?: boolean | undefined;
66
- colors?: boolean | undefined;
67
- compact?: boolean | number | undefined;
68
- errorLevel?: number | undefined;
69
- } | undefined;
70
- } | undefined;
71
- client?: {
72
- tag?: string | undefined;
73
- level?: 0 | 1 | 2 | 3 | 4 | 5 | {
74
- toString?: {} | undefined;
75
- toFixed?: {} | undefined;
76
- toExponential?: {} | undefined;
77
- toPrecision?: {} | undefined;
78
- valueOf?: {} | undefined;
79
- toLocaleString?: {} | undefined;
80
- } | undefined;
81
- throttle?: number | undefined;
82
- throttleMin?: number | undefined;
83
- formatOptions?: {
84
- [x: string]: unknown;
85
- columns?: number | undefined;
86
- date?: boolean | undefined;
87
- colors?: boolean | undefined;
88
- compact?: boolean | number | undefined;
89
- errorLevel?: number | undefined;
90
- } | undefined;
91
- } | undefined;
92
- } | undefined;
93
- }, {
94
- logging?: {
95
- server?: {
96
- tag?: string | undefined;
97
- level?: 0 | 1 | 2 | 3 | 4 | 5 | {
98
- toString?: {} | undefined;
99
- toFixed?: {} | undefined;
100
- toExponential?: {} | undefined;
101
- toPrecision?: {} | undefined;
102
- valueOf?: {} | undefined;
103
- toLocaleString?: {} | undefined;
104
- } | undefined;
105
- throttle?: number | undefined;
106
- throttleMin?: number | undefined;
107
- formatOptions?: {
108
- [x: string]: unknown;
109
- columns?: number | undefined;
110
- date?: boolean | undefined;
111
- colors?: boolean | undefined;
112
- compact?: boolean | number | undefined;
113
- errorLevel?: number | undefined;
114
- } | undefined;
115
- } | undefined;
116
- ssr?: {
117
- tag?: string | undefined;
118
- level?: 0 | 1 | 2 | 3 | 4 | 5 | {
119
- toString?: {} | undefined;
120
- toFixed?: {} | undefined;
121
- toExponential?: {} | undefined;
122
- toPrecision?: {} | undefined;
123
- valueOf?: {} | undefined;
124
- toLocaleString?: {} | undefined;
125
- } | undefined;
126
- throttle?: number | undefined;
127
- throttleMin?: number | undefined;
128
- formatOptions?: {
129
- [x: string]: unknown;
130
- columns?: number | undefined;
131
- date?: boolean | undefined;
132
- colors?: boolean | undefined;
133
- compact?: boolean | number | undefined;
134
- errorLevel?: number | undefined;
135
- } | undefined;
136
- } | undefined;
137
- client?: {
138
- tag?: string | undefined;
139
- level?: 0 | 1 | 2 | 3 | 4 | 5 | {
140
- toString?: {} | undefined;
141
- toFixed?: {} | undefined;
142
- toExponential?: {} | undefined;
143
- toPrecision?: {} | undefined;
144
- valueOf?: {} | undefined;
145
- toLocaleString?: {} | undefined;
146
- } | undefined;
147
- throttle?: number | undefined;
148
- throttleMin?: number | undefined;
149
- formatOptions?: {
150
- [x: string]: unknown;
151
- columns?: number | undefined;
152
- date?: boolean | undefined;
153
- colors?: boolean | undefined;
154
- compact?: boolean | number | undefined;
155
- errorLevel?: number | undefined;
156
- } | undefined;
157
- } | undefined;
158
- } | undefined;
159
- }, false>;
267
+
268
+ type ModuleOptions = {
269
+ defaultLocale: string
270
+ defaultLanguage: string
271
+ defaultTimeZone: string
272
+ logging: LoggingModuleOptions
273
+ authts: AuthtsModuleOptions
274
+ formatters: GenericType
275
+ }
276
+
277
+ type ModulePublicRuntimeConfig = Pick<ModuleOptions, 'defaultLocale' | 'defaultTimeZone' | 'defaultLanguage'> & {
278
+ logging: ModuleOptions['logging']['client']
279
+
280
+ authts: Pick<
281
+ AuthtsModuleOptions['auth'],
282
+ | 'loginUri'
283
+ | 'defaultLoginRedirectUri'
284
+ | 'defaultLogoutRedirectUri'
285
+ | 'ignoreRegexPatterns'
286
+ | 'ignoreRegexPatternsDev'
287
+ > &
288
+ Pick<AuthtsModuleOptions['openid'], 'redirectUri'> & {
289
+ enabled: boolean
290
+ redirectCookie: string
291
+ sessionCookie: string
292
+ }
293
+ }
294
+
295
+ type InputModuleOptions = DeepPartial<ModuleOptions>
296
+
297
+ declare const _default: any;
160
298
 
161
299
  export { _default as default };
300
+ export type { AuthData, AuthorizedUser, AuthtsMiddlewareMeta, AuthtsModuleOptions, CoreLogInstance, CoreLogLevel, InputModuleOptions, LoggingModuleOptions, LoggingOptions, ModuleOptions, ModulePublicRuntimeConfig, NuxtAuthOptions, NuxtCoreLogging, NuxtSessionContext, NuxtSessionUpdateContext, SessionContext };