timeback 0.1.2 → 0.1.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.
Files changed (119) hide show
  1. package/README.md +34 -422
  2. package/dist/cli/src/config.d.ts +8 -0
  3. package/dist/cli.js +111089 -0
  4. package/dist/types/src/config.d.ts +106 -0
  5. package/dist/types/src/index.d.ts +5 -0
  6. package/dist/types/src/primitives.d.ts +53 -0
  7. package/package.json +27 -82
  8. package/schema.json +222 -0
  9. package/dist/client/adapters/react/SignInButton.d.ts +0 -60
  10. package/dist/client/adapters/react/SignInButton.d.ts.map +0 -1
  11. package/dist/client/adapters/react/index.d.ts +0 -43
  12. package/dist/client/adapters/react/index.d.ts.map +0 -1
  13. package/dist/client/adapters/react/index.js +0 -478
  14. package/dist/client/adapters/react/provider.d.ts +0 -74
  15. package/dist/client/adapters/react/provider.d.ts.map +0 -1
  16. package/dist/client/adapters/solid/SignInButton.d.ts +0 -52
  17. package/dist/client/adapters/solid/SignInButton.d.ts.map +0 -1
  18. package/dist/client/adapters/solid/SignInButton.tsx +0 -321
  19. package/dist/client/adapters/solid/context.d.ts +0 -73
  20. package/dist/client/adapters/solid/context.d.ts.map +0 -1
  21. package/dist/client/adapters/solid/context.tsx +0 -91
  22. package/dist/client/adapters/solid/index.d.ts +0 -42
  23. package/dist/client/adapters/solid/index.d.ts.map +0 -1
  24. package/dist/client/adapters/solid/index.ts +0 -46
  25. package/dist/client/adapters/svelte/SignInButton.svelte +0 -234
  26. package/dist/client/adapters/svelte/SignInButton.svelte.d.ts +0 -24
  27. package/dist/client/adapters/svelte/index.d.ts +0 -33
  28. package/dist/client/adapters/svelte/index.d.ts.map +0 -1
  29. package/dist/client/adapters/svelte/index.ts +0 -38
  30. package/dist/client/adapters/svelte/stores.d.ts +0 -62
  31. package/dist/client/adapters/svelte/stores.d.ts.map +0 -1
  32. package/dist/client/adapters/svelte/stores.ts +0 -139
  33. package/dist/client/adapters/vue/SignInButton.vue +0 -260
  34. package/dist/client/adapters/vue/SignInButton.vue.d.ts +0 -53
  35. package/dist/client/adapters/vue/index.d.ts +0 -43
  36. package/dist/client/adapters/vue/index.d.ts.map +0 -1
  37. package/dist/client/adapters/vue/index.ts +0 -48
  38. package/dist/client/adapters/vue/provider.d.ts +0 -94
  39. package/dist/client/adapters/vue/provider.d.ts.map +0 -1
  40. package/dist/client/adapters/vue/provider.ts +0 -147
  41. package/dist/client/index.d.ts +0 -9
  42. package/dist/client/index.d.ts.map +0 -1
  43. package/dist/client/lib/activity/activity.class.d.ts +0 -73
  44. package/dist/client/lib/activity/activity.class.d.ts.map +0 -1
  45. package/dist/client/lib/activity/activity.d.ts +0 -16
  46. package/dist/client/lib/activity/activity.d.ts.map +0 -1
  47. package/dist/client/lib/activity/index.d.ts +0 -6
  48. package/dist/client/lib/activity/index.d.ts.map +0 -1
  49. package/dist/client/lib/utils.d.ts +0 -20
  50. package/dist/client/lib/utils.d.ts.map +0 -1
  51. package/dist/client/namespaces/activity.d.ts +0 -37
  52. package/dist/client/namespaces/activity.d.ts.map +0 -1
  53. package/dist/client/namespaces/auth.d.ts +0 -33
  54. package/dist/client/namespaces/auth.d.ts.map +0 -1
  55. package/dist/client/namespaces/index.d.ts +0 -7
  56. package/dist/client/namespaces/index.d.ts.map +0 -1
  57. package/dist/client/namespaces/user.d.ts +0 -29
  58. package/dist/client/namespaces/user.d.ts.map +0 -1
  59. package/dist/client/timeback-client.class.d.ts +0 -37
  60. package/dist/client/timeback-client.class.d.ts.map +0 -1
  61. package/dist/client/timeback-client.d.ts +0 -29
  62. package/dist/client/timeback-client.d.ts.map +0 -1
  63. package/dist/client.d.ts +0 -30
  64. package/dist/client.d.ts.map +0 -1
  65. package/dist/client.js +0 -198
  66. package/dist/index.d.ts +0 -47
  67. package/dist/index.d.ts.map +0 -1
  68. package/dist/index.js +0 -1392
  69. package/dist/server/adapters/express.d.ts +0 -66
  70. package/dist/server/adapters/express.d.ts.map +0 -1
  71. package/dist/server/adapters/express.js +0 -581
  72. package/dist/server/adapters/native.d.ts +0 -47
  73. package/dist/server/adapters/native.d.ts.map +0 -1
  74. package/dist/server/adapters/native.js +0 -517
  75. package/dist/server/adapters/nextjs.d.ts +0 -32
  76. package/dist/server/adapters/nextjs.d.ts.map +0 -1
  77. package/dist/server/adapters/nextjs.js +0 -529
  78. package/dist/server/adapters/nuxt.d.ts +0 -98
  79. package/dist/server/adapters/nuxt.d.ts.map +0 -1
  80. package/dist/server/adapters/nuxt.js +0 -673
  81. package/dist/server/adapters/solid-start.d.ts +0 -63
  82. package/dist/server/adapters/solid-start.d.ts.map +0 -1
  83. package/dist/server/adapters/solid-start.js +0 -561
  84. package/dist/server/adapters/svelte-kit.d.ts +0 -84
  85. package/dist/server/adapters/svelte-kit.d.ts.map +0 -1
  86. package/dist/server/adapters/svelte-kit.js +0 -582
  87. package/dist/server/adapters/tanstack-start.d.ts +0 -42
  88. package/dist/server/adapters/tanstack-start.d.ts.map +0 -1
  89. package/dist/server/adapters/tanstack-start.js +0 -530
  90. package/dist/server/adapters/types.d.ts +0 -294
  91. package/dist/server/adapters/types.d.ts.map +0 -1
  92. package/dist/server/adapters/utils.d.ts +0 -34
  93. package/dist/server/adapters/utils.d.ts.map +0 -1
  94. package/dist/server/handlers/activity.d.ts +0 -28
  95. package/dist/server/handlers/activity.d.ts.map +0 -1
  96. package/dist/server/handlers/identity.d.ts +0 -24
  97. package/dist/server/handlers/identity.d.ts.map +0 -1
  98. package/dist/server/handlers/index.d.ts +0 -9
  99. package/dist/server/handlers/index.d.ts.map +0 -1
  100. package/dist/server/handlers/user.d.ts +0 -30
  101. package/dist/server/handlers/user.d.ts.map +0 -1
  102. package/dist/server/index.d.ts +0 -10
  103. package/dist/server/index.d.ts.map +0 -1
  104. package/dist/server/lib/index.d.ts +0 -9
  105. package/dist/server/lib/index.d.ts.map +0 -1
  106. package/dist/server/lib/logger.d.ts +0 -21
  107. package/dist/server/lib/logger.d.ts.map +0 -1
  108. package/dist/server/lib/oidc.d.ts +0 -76
  109. package/dist/server/lib/oidc.d.ts.map +0 -1
  110. package/dist/server/lib/utils.d.ts +0 -39
  111. package/dist/server/lib/utils.d.ts.map +0 -1
  112. package/dist/server/timeback.d.ts +0 -85
  113. package/dist/server/timeback.d.ts.map +0 -1
  114. package/dist/server/types.d.ts +0 -337
  115. package/dist/server/types.d.ts.map +0 -1
  116. package/dist/shared/constants.d.ts +0 -18
  117. package/dist/shared/constants.d.ts.map +0 -1
  118. package/dist/shared/types.d.ts +0 -100
  119. package/dist/shared/types.d.ts.map +0 -1
@@ -1,673 +0,0 @@
1
- import { createRequire } from "node:module";
2
- var __create = Object.create;
3
- var __getProtoOf = Object.getPrototypeOf;
4
- var __defProp = Object.defineProperty;
5
- var __getOwnPropNames = Object.getOwnPropertyNames;
6
- var __hasOwnProp = Object.prototype.hasOwnProperty;
7
- var __toESM = (mod, isNodeMode, target) => {
8
- target = mod != null ? __create(__getProtoOf(mod)) : {};
9
- const to = isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target;
10
- for (let key of __getOwnPropNames(mod))
11
- if (!__hasOwnProp.call(to, key))
12
- __defProp(to, key, {
13
- get: () => mod[key],
14
- enumerable: true
15
- });
16
- return to;
17
- };
18
- var __require = /* @__PURE__ */ createRequire(import.meta.url);
19
-
20
- // src/shared/constants.ts
21
- var ROUTES = {
22
- ACTIVITY: "/activity",
23
- IDENTITY: {
24
- SIGNIN: "/identity/signin",
25
- SIGNOUT: "/identity/signout",
26
- CALLBACK: "/identity/callback"
27
- },
28
- USER: {
29
- ME: "/user/me"
30
- }
31
- };
32
-
33
- // ../internal/logger/src/debug.ts
34
- var patterns = null;
35
- var debugAll = false;
36
- var debugEnvSet = false;
37
- function patternToRegex(pattern) {
38
- const escaped = pattern.replace(/[.+?^${}()|[\]\\]/g, "\\$&");
39
- const regexStr = escaped.replace(/\*/g, ".*");
40
- return new RegExp(`^${regexStr}$`);
41
- }
42
- function parseDebugEnv() {
43
- if (patterns !== null)
44
- return;
45
- patterns = [];
46
- if (typeof process === "undefined" || !process.env?.DEBUG) {
47
- debugEnvSet = false;
48
- return;
49
- }
50
- debugEnvSet = true;
51
- const debugValue = process.env.DEBUG.trim();
52
- if (debugValue === "1" || debugValue === "true" || debugValue === "*") {
53
- debugAll = true;
54
- return;
55
- }
56
- const parts = debugValue.split(",").map((p) => p.trim()).filter(Boolean);
57
- for (const part of parts) {
58
- if (part.startsWith("-")) {
59
- patterns.push({
60
- regex: patternToRegex(part.slice(1)),
61
- exclude: true
62
- });
63
- } else {
64
- patterns.push({
65
- regex: patternToRegex(part),
66
- exclude: false
67
- });
68
- }
69
- }
70
- const hasInclude = patterns.some((p) => !p.exclude);
71
- if (!hasInclude && patterns.length > 0) {
72
- debugAll = true;
73
- }
74
- }
75
- function shouldShowDebug(scope) {
76
- parseDebugEnv();
77
- if (!debugEnvSet) {
78
- return true;
79
- }
80
- if (debugAll) {
81
- if (scope) {
82
- for (const pattern of patterns) {
83
- if (pattern.exclude && pattern.regex.test(scope)) {
84
- return false;
85
- }
86
- }
87
- }
88
- return true;
89
- }
90
- if (!scope) {
91
- return false;
92
- }
93
- for (const pattern of patterns) {
94
- if (pattern.exclude && pattern.regex.test(scope)) {
95
- return false;
96
- }
97
- }
98
- for (const pattern of patterns) {
99
- if (!pattern.exclude && pattern.regex.test(scope)) {
100
- return true;
101
- }
102
- }
103
- return false;
104
- }
105
-
106
- // ../internal/logger/src/env.ts
107
- function isBrowser() {
108
- return typeof globalThis !== "undefined" && "window" in globalThis;
109
- }
110
- function detectEnvironment() {
111
- if (isBrowser()) {
112
- return "browser";
113
- }
114
- if (typeof process !== "undefined" && process.env) {
115
- if (process.env["NODE_ENV"] === "test" || process.env["BUN_ENV"] === "test") {
116
- return "test";
117
- }
118
- if (false) {}
119
- if (process.env.CI || process.env.GITHUB_ACTIONS || process.env.GITLAB_CI || process.env.CIRCLECI || process.env.JENKINS_URL || process.env.BUILDKITE) {
120
- return "ci";
121
- }
122
- }
123
- return "terminal";
124
- }
125
-
126
- // ../internal/logger/src/formatters/terminal.ts
127
- var nodeInspect;
128
- if (!isBrowser()) {
129
- try {
130
- const util = await import("node:util");
131
- nodeInspect = util.inspect;
132
- } catch {}
133
- }
134
- var colors = {
135
- reset: "\x1B[0m",
136
- bold: "\x1B[1m",
137
- dim: "\x1B[2m",
138
- red: "\x1B[31m",
139
- yellow: "\x1B[33m",
140
- blue: "\x1B[34m",
141
- cyan: "\x1B[36m"
142
- };
143
- function getLevelColor(level) {
144
- switch (level) {
145
- case "debug":
146
- return colors.blue;
147
- case "info":
148
- return colors.cyan;
149
- case "warn":
150
- return colors.yellow;
151
- case "error":
152
- return colors.red;
153
- }
154
- }
155
- function getConsoleMethod(level) {
156
- switch (level) {
157
- case "debug":
158
- return console.debug;
159
- case "info":
160
- return console.info;
161
- case "warn":
162
- return console.warn;
163
- case "error":
164
- return console.error;
165
- }
166
- }
167
- function formatContext(context) {
168
- if (nodeInspect) {
169
- return nodeInspect(context, {
170
- depth: null,
171
- colors: true,
172
- breakLength: 80,
173
- compact: false
174
- });
175
- }
176
- return JSON.stringify(context, null, 2);
177
- }
178
- var terminalFormatter = (entry) => {
179
- const levelColor = getLevelColor(entry.level);
180
- const consoleMethod = getConsoleMethod(entry.level);
181
- const levelUpper = entry.level.toUpperCase().padEnd(5);
182
- const isoString = entry.timestamp.toISOString().replace(/\.\d{3}Z$/, "");
183
- const timestamp = `${colors.dim}[${isoString}]${colors.reset}`;
184
- const level = `${levelColor}${levelUpper}${colors.reset}`;
185
- const scope = entry.scope ? `${colors.bold}[${entry.scope}]${colors.reset} ` : "";
186
- const prefix = `${timestamp} ${level} ${scope}${entry.message}`;
187
- if (entry.context && Object.keys(entry.context).length > 0) {
188
- consoleMethod(prefix, formatContext(entry.context));
189
- } else {
190
- consoleMethod(prefix);
191
- }
192
- };
193
- // ../internal/logger/src/formatters/ci.ts
194
- var LEVEL_PREFIX = {
195
- debug: "[DEBUG]",
196
- info: "[INFO]",
197
- warn: "[WARN]",
198
- error: "[ERROR]"
199
- };
200
- function formatContext2(context) {
201
- return Object.entries(context).map(([key, value]) => `${key}=${formatValue(value)}`).join(" ");
202
- }
203
- function formatValue(value) {
204
- if (typeof value === "string")
205
- return value;
206
- if (typeof value === "number")
207
- return String(value);
208
- if (typeof value === "boolean")
209
- return String(value);
210
- if (value === null)
211
- return "null";
212
- if (value === undefined)
213
- return "undefined";
214
- return JSON.stringify(value);
215
- }
216
- var ciFormatter = (entry) => {
217
- const parts = [];
218
- parts.push(entry.timestamp.toISOString());
219
- parts.push(LEVEL_PREFIX[entry.level]);
220
- if (entry.scope) {
221
- parts.push(`[${entry.scope}]`);
222
- }
223
- parts.push(entry.message);
224
- if (entry.context && Object.keys(entry.context).length > 0) {
225
- parts.push(formatContext2(entry.context));
226
- }
227
- console.log(parts.join(" "));
228
- };
229
- // ../internal/logger/src/formatters/production.ts
230
- var productionFormatter = (entry) => {
231
- const output = {
232
- timestamp: entry.timestamp.toISOString(),
233
- level: entry.level,
234
- ...entry.scope && { scope: entry.scope },
235
- msg: entry.message
236
- };
237
- if (entry.context && Object.keys(entry.context).length > 0) {
238
- Object.assign(output, entry.context);
239
- }
240
- console.log(JSON.stringify(output));
241
- };
242
- // ../internal/logger/src/formatters/browser.ts
243
- var LEVEL_STYLES = {
244
- debug: "color: gray",
245
- info: "color: #0ea5e9",
246
- warn: "color: #f59e0b",
247
- error: "color: #ef4444; font-weight: bold"
248
- };
249
- var LEVEL_METHODS = {
250
- debug: "log",
251
- info: "info",
252
- warn: "warn",
253
- error: "error"
254
- };
255
- var browserFormatter = (entry) => {
256
- const method = LEVEL_METHODS[entry.level];
257
- const style = LEVEL_STYLES[entry.level];
258
- const prefix = entry.scope ? `[${entry.scope}]` : "";
259
- const label = `%c${prefix} ${entry.message}`;
260
- if (entry.context && Object.keys(entry.context).length > 0) {
261
- console[method](label, style, entry.context);
262
- } else {
263
- console[method](label, style);
264
- }
265
- };
266
- // ../internal/logger/src/logger.ts
267
- var LOG_LEVELS = ["debug", "info", "warn", "error"];
268
- function getFormatter(env) {
269
- switch (env) {
270
- case "terminal":
271
- return terminalFormatter;
272
- case "ci":
273
- return ciFormatter;
274
- case "production":
275
- return productionFormatter;
276
- case "browser":
277
- return browserFormatter;
278
- case "test":
279
- return () => {};
280
- }
281
- }
282
- function getDefaultMinLevel() {
283
- if (typeof process !== "undefined" && process.env?.DEBUG) {
284
- return "debug";
285
- }
286
- return "info";
287
- }
288
- function shouldLog(level, minLevel) {
289
- return LOG_LEVELS.indexOf(level) >= LOG_LEVELS.indexOf(minLevel);
290
- }
291
-
292
- class Logger {
293
- scope;
294
- minLevel;
295
- environment;
296
- formatter;
297
- defaultContext;
298
- constructor(options = {}) {
299
- this.scope = options.scope;
300
- this.minLevel = options.minLevel ?? getDefaultMinLevel();
301
- this.defaultContext = options.defaultContext ?? {};
302
- this.environment = options.environment ?? detectEnvironment();
303
- this.formatter = getFormatter(this.environment);
304
- }
305
- child(scope) {
306
- const childScope = this.scope ? `${this.scope}:${scope}` : scope;
307
- return new Logger({
308
- scope: childScope,
309
- minLevel: this.minLevel,
310
- environment: this.environment,
311
- defaultContext: { ...this.defaultContext }
312
- });
313
- }
314
- withContext(context) {
315
- return new Logger({
316
- scope: this.scope,
317
- minLevel: this.minLevel,
318
- environment: this.environment,
319
- defaultContext: { ...this.defaultContext, ...context }
320
- });
321
- }
322
- debug(message, context) {
323
- this.log("debug", message, context);
324
- }
325
- info(message, context) {
326
- this.log("info", message, context);
327
- }
328
- warn(message, context) {
329
- this.log("warn", message, context);
330
- }
331
- error(message, context) {
332
- this.log("error", message, context);
333
- }
334
- log(level, message, context) {
335
- if (level === "debug" && !shouldShowDebug(this.scope)) {
336
- return;
337
- }
338
- if (!shouldLog(level, this.minLevel)) {
339
- return;
340
- }
341
- const entry = {
342
- level,
343
- message,
344
- scope: this.scope,
345
- context: context || Object.keys(this.defaultContext).length > 0 ? { ...this.defaultContext, ...context } : undefined,
346
- timestamp: new Date
347
- };
348
- this.formatter(entry);
349
- }
350
- }
351
- function createLogger(options = {}) {
352
- return new Logger(options);
353
- }
354
- // src/server/lib/logger.ts
355
- function isDebug() {
356
- try {
357
- const debug = typeof process === "undefined" ? undefined : process.env.DEBUG;
358
- return debug === "1" || debug === "true";
359
- } catch {
360
- return false;
361
- }
362
- }
363
- function createScopedLogger(scope) {
364
- return createLogger({
365
- scope: `timeback:${scope}`,
366
- minLevel: isDebug() ? "debug" : "warn"
367
- });
368
- }
369
- var ssoLog = createScopedLogger("sso");
370
- var oidcLog = createScopedLogger("oidc");
371
-
372
- // src/server/lib/oidc.ts
373
- var discoveryCache = new Map;
374
- async function fetchDiscoveryDocument(issuer) {
375
- const cached = discoveryCache.get(issuer);
376
- if (cached) {
377
- return cached;
378
- }
379
- const url = `${issuer}/.well-known/openid-configuration`;
380
- const response = await fetch(url);
381
- if (!response.ok) {
382
- oidcLog.error("Discovery fetch failed", { status: response.status });
383
- throw new Error(`Failed to fetch OIDC discovery: ${response.statusText}`);
384
- }
385
- const doc = await response.json();
386
- oidcLog.debug("Fetched OIDC discovery document", {
387
- authEndpoint: doc.authorization_endpoint,
388
- tokenEndpoint: doc.token_endpoint
389
- });
390
- discoveryCache.set(issuer, doc);
391
- return doc;
392
- }
393
- function getIssuer(env) {
394
- switch (env) {
395
- case "production":
396
- return "https://cognito-idp.us-east-1.amazonaws.com/us-east-1_3uhuoRM3R";
397
- case "staging":
398
- return "https://cognito-idp.us-east-1.amazonaws.com/us-east-1_5EUwTP9XD";
399
- case "local":
400
- throw new Error("Local environment is not yet supported for OIDC");
401
- }
402
- }
403
- async function buildAuthorizationUrl(params) {
404
- const discovery = await fetchDiscoveryDocument(params.issuer);
405
- const url = new URL(discovery.authorization_endpoint);
406
- url.searchParams.set("response_type", "code");
407
- url.searchParams.set("client_id", params.clientId);
408
- url.searchParams.set("redirect_uri", params.redirectUri);
409
- url.searchParams.set("scope", "openid profile email");
410
- url.searchParams.set("state", params.state);
411
- return url.toString();
412
- }
413
- async function exchangeCodeForTokens(params) {
414
- const discovery = await fetchDiscoveryDocument(params.issuer);
415
- const response = await fetch(discovery.token_endpoint, {
416
- method: "POST",
417
- headers: {
418
- "Content-Type": "application/x-www-form-urlencoded"
419
- },
420
- body: new URLSearchParams({
421
- grant_type: "authorization_code",
422
- client_id: params.clientId,
423
- client_secret: params.clientSecret,
424
- code: params.code,
425
- redirect_uri: params.redirectUri
426
- })
427
- });
428
- if (!response.ok) {
429
- const text = await response.text();
430
- oidcLog.error("Token exchange failed", { status: response.status, body: text });
431
- throw new Error(`Token exchange failed: ${response.status} ${text}`);
432
- }
433
- const tokens = await response.json();
434
- oidcLog.debug("Received tokens from IdP", { expiresIn: tokens.expires_in });
435
- return tokens;
436
- }
437
- async function getUserInfo(params) {
438
- const discovery = await fetchDiscoveryDocument(params.issuer);
439
- const response = await fetch(discovery.userinfo_endpoint, {
440
- headers: {
441
- Authorization: `Bearer ${params.accessToken}`
442
- }
443
- });
444
- if (!response.ok) {
445
- throw new Error(`UserInfo request failed: ${response.statusText}`);
446
- }
447
- return response.json();
448
- }
449
- // src/server/lib/utils.ts
450
- function jsonResponse(data, status = 200, headers) {
451
- const responseHeaders = new Headers(headers);
452
- responseHeaders.set("Content-Type", "application/json");
453
- return new Response(JSON.stringify(data), { status, headers: responseHeaders });
454
- }
455
- function redirectResponse(url, headers) {
456
- const responseHeaders = new Headers(headers);
457
- responseHeaders.set("Location", url);
458
- return new Response(null, { status: 302, headers: responseHeaders });
459
- }
460
- function encodeBase64Url(data) {
461
- const json = JSON.stringify(data);
462
- return btoa(json).replace(/\+/g, "-").replace(/\//g, "_").replace(/=+$/, "");
463
- }
464
- function decodeBase64Url(encoded) {
465
- const padded = encoded.replace(/-/g, "+").replace(/_/g, "/");
466
- const json = atob(padded);
467
- return JSON.parse(json);
468
- }
469
- // src/server/adapters/utils.ts
470
- function getHandlers(input) {
471
- return "handle" in input ? input.handle : input;
472
- }
473
- function hasActivityHandler(handlers) {
474
- return "activity" in handlers;
475
- }
476
- function hasUserHandler(handlers) {
477
- return "user" in handlers;
478
- }
479
-
480
- // src/server/adapters/nuxt.ts
481
- function bufferNodeBody(req) {
482
- return new Promise((resolve, reject) => {
483
- const chunks = [];
484
- req.on("data", (chunk) => {
485
- if (!chunk)
486
- return;
487
- if (chunk instanceof Buffer)
488
- return void chunks.push(chunk);
489
- if (typeof chunk === "string")
490
- return void chunks.push(Buffer.from(chunk, "utf-8"));
491
- if (chunk instanceof Uint8Array)
492
- return void chunks.push(Buffer.from(chunk));
493
- });
494
- req.on("end", () => resolve(Buffer.concat(chunks).toString("utf-8")));
495
- req.on("error", (chunk) => {
496
- if (chunk instanceof Error) {
497
- reject(chunk);
498
- }
499
- });
500
- });
501
- }
502
- function getPathFromEvent(event) {
503
- if (event.path) {
504
- return event.path;
505
- }
506
- if (event.request) {
507
- const url = event.request.url;
508
- if (url.startsWith("http://") || url.startsWith("https://")) {
509
- return new URL(url).pathname;
510
- }
511
- return url.split("?")[0] ?? "/";
512
- }
513
- const reqUrl = event.node?.req?.url;
514
- return (reqUrl?.split("?")[0] ?? "/") || "/";
515
- }
516
- function firstHeaderValue(value) {
517
- if (!value)
518
- return;
519
- if (Array.isArray(value))
520
- return value[0]?.trim();
521
- return value.split(",")[0]?.trim();
522
- }
523
- function buildAbsoluteUrlFromNodeRequest(req) {
524
- const rawUrl = req.url ?? "/";
525
- if (rawUrl.startsWith("http://") || rawUrl.startsWith("https://")) {
526
- return new URL(rawUrl).href;
527
- }
528
- const forwardedProto = firstHeaderValue(req.headers["x-forwarded-proto"]);
529
- const protocol = forwardedProto === "https" ? "https" : forwardedProto === "http" ? "http" : "http";
530
- const forwardedHost = firstHeaderValue(req.headers["x-forwarded-host"]);
531
- const host = forwardedHost || req.headers.host || "localhost";
532
- return new URL(rawUrl, `${protocol}://${host}`).href;
533
- }
534
- function getUrlFromEvent(event) {
535
- if (event.request) {
536
- return event.request.url;
537
- }
538
- const req = event.node?.req;
539
- if (!req) {
540
- throw new Error("Cannot determine URL from Nuxt event");
541
- }
542
- return buildAbsoluteUrlFromNodeRequest(req);
543
- }
544
- function getMethodFromEvent(event) {
545
- if (event.request) {
546
- return event.request.method;
547
- }
548
- return event.node?.req?.method ?? "GET";
549
- }
550
- async function toWebRequest(event) {
551
- if (event.request) {
552
- return event.request;
553
- }
554
- const req = event.node?.req;
555
- if (!req) {
556
- throw new Error("Cannot convert Nuxt event to Request: no request object found");
557
- }
558
- const url = getUrlFromEvent(event);
559
- const method = req.method ?? "GET";
560
- const headers = new Headers;
561
- for (const [key, value] of Object.entries(req.headers)) {
562
- if (value) {
563
- headers.set(key, Array.isArray(value) ? value.join(", ") : value);
564
- }
565
- }
566
- const init = {
567
- method,
568
- headers
569
- };
570
- if (["POST", "PUT", "PATCH", "DELETE"].includes(method)) {
571
- const body = await bufferNodeBody(req);
572
- if (body) {
573
- init.body = body;
574
- }
575
- }
576
- return new Request(url, init);
577
- }
578
- function isTimebackPath(pathname, basePath) {
579
- const normalizedBase = basePath.endsWith("/") ? basePath.slice(0, -1) : basePath;
580
- return pathname === normalizedBase || pathname.startsWith(`${normalizedBase}/`);
581
- }
582
- async function nuxtHandler(options) {
583
- const { timeback, event, basePath = "/api/timeback", callbackPath } = options;
584
- const path = getPathFromEvent(event);
585
- const method = getMethodFromEvent(event);
586
- const handle = getHandlers(timeback);
587
- if (callbackPath && path === callbackPath && method === "GET") {
588
- const request = await toWebRequest(event);
589
- return handle.identity.callback(request);
590
- }
591
- if (!isTimebackPath(path, basePath)) {
592
- return;
593
- }
594
- if (method === "GET") {
595
- if (path.endsWith(ROUTES.IDENTITY.SIGNIN)) {
596
- const request = await toWebRequest(event);
597
- return handle.identity.signIn(request);
598
- }
599
- if (path.endsWith(ROUTES.IDENTITY.CALLBACK)) {
600
- const request = await toWebRequest(event);
601
- return handle.identity.callback(request);
602
- }
603
- if (path.endsWith(ROUTES.IDENTITY.SIGNOUT)) {
604
- return handle.identity.signOut();
605
- }
606
- }
607
- if (hasUserHandler(handle)) {
608
- if (method === "GET" && path.endsWith(ROUTES.USER.ME)) {
609
- const request = await toWebRequest(event);
610
- return handle.user.me(request);
611
- }
612
- }
613
- if (hasActivityHandler(handle)) {
614
- if (method === "POST" && path.endsWith(ROUTES.ACTIVITY)) {
615
- const request = await toWebRequest(event);
616
- return handle.activity(request);
617
- }
618
- }
619
- return;
620
- }
621
- function toNuxtHandler(input) {
622
- const options = isHandlerOptions(input) ? input : { timeback: input };
623
- const { timeback, callbackPath } = options;
624
- const handle = getHandlers(timeback);
625
- const routeHandler = async (event) => {
626
- const path = getPathFromEvent(event);
627
- const method = getMethodFromEvent(event);
628
- if (callbackPath && path === callbackPath && method === "GET") {
629
- const request = await toWebRequest(event);
630
- return handle.identity.callback(request);
631
- }
632
- if (method === "GET") {
633
- if (path.endsWith(ROUTES.IDENTITY.SIGNIN)) {
634
- const request = await toWebRequest(event);
635
- return handle.identity.signIn(request);
636
- }
637
- if (path.endsWith(ROUTES.IDENTITY.CALLBACK)) {
638
- const request = await toWebRequest(event);
639
- return handle.identity.callback(request);
640
- }
641
- if (path.endsWith(ROUTES.IDENTITY.SIGNOUT)) {
642
- return handle.identity.signOut();
643
- }
644
- }
645
- if (hasUserHandler(handle)) {
646
- if (method === "GET" && path.endsWith(ROUTES.USER.ME)) {
647
- const request = await toWebRequest(event);
648
- return handle.user.me(request);
649
- }
650
- }
651
- if (hasActivityHandler(handle)) {
652
- if (method === "POST" && path.endsWith(ROUTES.ACTIVITY)) {
653
- const request = await toWebRequest(event);
654
- return handle.activity(request);
655
- }
656
- }
657
- return jsonResponse({ error: "Not found" }, 404);
658
- };
659
- return {
660
- GET: routeHandler,
661
- POST: routeHandler,
662
- PUT: routeHandler,
663
- DELETE: routeHandler,
664
- PATCH: routeHandler
665
- };
666
- }
667
- function isHandlerOptions(input) {
668
- return typeof input === "object" && input !== null && "timeback" in input;
669
- }
670
- export {
671
- toNuxtHandler,
672
- nuxtHandler
673
- };