timeback 0.0.0-alpha.2 → 0.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.
- package/README.md +378 -7
- package/dist/client/adapters/react/SignInButton.d.ts +60 -0
- package/dist/client/adapters/react/SignInButton.d.ts.map +1 -0
- package/dist/client/adapters/react/index.d.ts +43 -0
- package/dist/client/adapters/react/index.d.ts.map +1 -0
- package/dist/client/adapters/react/index.js +478 -0
- package/dist/client/adapters/react/provider.d.ts +74 -0
- package/dist/client/adapters/react/provider.d.ts.map +1 -0
- package/dist/client/adapters/solid/SignInButton.d.ts +52 -0
- package/dist/client/adapters/solid/SignInButton.d.ts.map +1 -0
- package/dist/client/adapters/solid/SignInButton.tsx +321 -0
- package/dist/client/adapters/solid/context.d.ts +73 -0
- package/dist/client/adapters/solid/context.d.ts.map +1 -0
- package/dist/client/adapters/solid/context.tsx +91 -0
- package/dist/client/adapters/solid/index.d.ts +42 -0
- package/dist/client/adapters/solid/index.d.ts.map +1 -0
- package/dist/client/adapters/solid/index.ts +46 -0
- package/dist/client/adapters/svelte/SignInButton.svelte +234 -0
- package/dist/client/adapters/svelte/SignInButton.svelte.d.ts +24 -0
- package/dist/client/adapters/svelte/index.d.ts +33 -0
- package/dist/client/adapters/svelte/index.d.ts.map +1 -0
- package/dist/client/adapters/svelte/index.ts +38 -0
- package/dist/client/adapters/svelte/stores.d.ts +62 -0
- package/dist/client/adapters/svelte/stores.d.ts.map +1 -0
- package/dist/client/adapters/svelte/stores.ts +139 -0
- package/dist/client/adapters/vue/SignInButton.vue +260 -0
- package/dist/client/adapters/vue/SignInButton.vue.d.ts +53 -0
- package/dist/client/adapters/vue/index.d.ts +43 -0
- package/dist/client/adapters/vue/index.d.ts.map +1 -0
- package/dist/client/adapters/vue/index.ts +48 -0
- package/dist/client/adapters/vue/provider.d.ts +94 -0
- package/dist/client/adapters/vue/provider.d.ts.map +1 -0
- package/dist/client/adapters/vue/provider.ts +147 -0
- package/dist/client/index.d.ts +9 -0
- package/dist/client/index.d.ts.map +1 -0
- package/dist/client/lib/activity/activity.class.d.ts +73 -0
- package/dist/client/lib/activity/activity.class.d.ts.map +1 -0
- package/dist/client/lib/activity/activity.d.ts +16 -0
- package/dist/client/lib/activity/activity.d.ts.map +1 -0
- package/dist/client/lib/activity/index.d.ts +6 -0
- package/dist/client/lib/activity/index.d.ts.map +1 -0
- package/dist/client/lib/utils.d.ts +20 -0
- package/dist/client/lib/utils.d.ts.map +1 -0
- package/dist/client/namespaces/activity.d.ts +37 -0
- package/dist/client/namespaces/activity.d.ts.map +1 -0
- package/dist/client/namespaces/auth.d.ts +33 -0
- package/dist/client/namespaces/auth.d.ts.map +1 -0
- package/dist/client/namespaces/index.d.ts +7 -0
- package/dist/client/namespaces/index.d.ts.map +1 -0
- package/dist/client/namespaces/user.d.ts +29 -0
- package/dist/client/namespaces/user.d.ts.map +1 -0
- package/dist/client/timeback-client.class.d.ts +37 -0
- package/dist/client/timeback-client.class.d.ts.map +1 -0
- package/dist/client/timeback-client.d.ts +29 -0
- package/dist/client/timeback-client.d.ts.map +1 -0
- package/dist/client.d.ts +30 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +198 -0
- package/dist/index.d.ts +27 -14
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1373 -11
- package/dist/server/adapters/express.d.ts +62 -0
- package/dist/server/adapters/express.d.ts.map +1 -0
- package/dist/server/adapters/express.js +565 -0
- package/dist/server/adapters/native.d.ts +45 -0
- package/dist/server/adapters/native.d.ts.map +1 -0
- package/dist/server/adapters/native.js +509 -0
- package/dist/server/adapters/nextjs.d.ts +30 -0
- package/dist/server/adapters/nextjs.d.ts.map +1 -0
- package/dist/server/adapters/nextjs.js +521 -0
- package/dist/server/adapters/nuxt.d.ts +96 -0
- package/dist/server/adapters/nuxt.d.ts.map +1 -0
- package/dist/server/adapters/nuxt.js +663 -0
- package/dist/server/adapters/solid-start.d.ts +61 -0
- package/dist/server/adapters/solid-start.d.ts.map +1 -0
- package/dist/server/adapters/solid-start.js +551 -0
- package/dist/server/adapters/svelte-kit.d.ts +82 -0
- package/dist/server/adapters/svelte-kit.d.ts.map +1 -0
- package/dist/server/adapters/svelte-kit.js +572 -0
- package/dist/server/adapters/tanstack-start.d.ts +40 -0
- package/dist/server/adapters/tanstack-start.d.ts.map +1 -0
- package/dist/server/adapters/tanstack-start.js +522 -0
- package/dist/server/adapters/types.d.ts +280 -0
- package/dist/server/adapters/types.d.ts.map +1 -0
- package/dist/server/adapters/utils.d.ts +15 -0
- package/dist/server/adapters/utils.d.ts.map +1 -0
- package/dist/server/handlers/activity.d.ts +28 -0
- package/dist/server/handlers/activity.d.ts.map +1 -0
- package/dist/server/handlers/identity.d.ts +24 -0
- package/dist/server/handlers/identity.d.ts.map +1 -0
- package/dist/server/handlers/index.d.ts +9 -0
- package/dist/server/handlers/index.d.ts.map +1 -0
- package/dist/server/handlers/user.d.ts +30 -0
- package/dist/server/handlers/user.d.ts.map +1 -0
- package/dist/server/index.d.ts +10 -0
- package/dist/server/index.d.ts.map +1 -0
- package/dist/server/lib/index.d.ts +9 -0
- package/dist/server/lib/index.d.ts.map +1 -0
- package/dist/server/lib/logger.d.ts +21 -0
- package/dist/server/lib/logger.d.ts.map +1 -0
- package/dist/server/lib/oidc.d.ts +76 -0
- package/dist/server/lib/oidc.d.ts.map +1 -0
- package/dist/server/lib/utils.d.ts +39 -0
- package/dist/server/lib/utils.d.ts.map +1 -0
- package/dist/server/timeback.d.ts +48 -0
- package/dist/server/timeback.d.ts.map +1 -0
- package/dist/server/types.d.ts +300 -0
- package/dist/server/types.d.ts.map +1 -0
- package/dist/shared/constants.d.ts +18 -0
- package/dist/shared/constants.d.ts.map +1 -0
- package/dist/shared/types.d.ts +100 -0
- package/dist/shared/types.d.ts.map +1 -0
- package/package.json +104 -28
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SolidStart Adapter
|
|
3
|
+
*
|
|
4
|
+
* Adapts Timeback handlers for SolidStart.
|
|
5
|
+
* Uses file-based API routes with SolidStart's APIEvent.
|
|
6
|
+
*/
|
|
7
|
+
import type { SolidStartHandlerOptions, SolidStartHandlers, TimebackInput } from './types';
|
|
8
|
+
/**
|
|
9
|
+
* Convert Timeback instance to SolidStart route handlers.
|
|
10
|
+
*
|
|
11
|
+
* SolidStart uses file-based routing with API routes exporting HTTP method handlers.
|
|
12
|
+
* This function creates handlers compatible with SolidStart's APIEvent.
|
|
13
|
+
*
|
|
14
|
+
* Accepts either the full Timeback instance or just the handlers:
|
|
15
|
+
* - `toSolidStartHandler(timeback)`
|
|
16
|
+
* - `toSolidStartHandler(timeback.handle)`
|
|
17
|
+
*
|
|
18
|
+
* @param input - Timeback instance or handlers
|
|
19
|
+
* @returns Object with HTTP method handlers for SolidStart
|
|
20
|
+
*
|
|
21
|
+
* @example
|
|
22
|
+
* ```typescript
|
|
23
|
+
* // src/routes/api/timeback/[...path].ts
|
|
24
|
+
* import { timeback } from '~/lib/timeback'
|
|
25
|
+
* import { toSolidStartHandler } from 'timeback/solid-start'
|
|
26
|
+
*
|
|
27
|
+
* export const { GET, POST } = toSolidStartHandler(timeback)
|
|
28
|
+
* ```
|
|
29
|
+
*/
|
|
30
|
+
export declare function toSolidStartHandler(input: TimebackInput): SolidStartHandlers;
|
|
31
|
+
/**
|
|
32
|
+
* SolidStart middleware handler for Timeback.
|
|
33
|
+
*
|
|
34
|
+
* This provides a middleware-style handler that can intercept requests
|
|
35
|
+
* before they reach file-based routes.
|
|
36
|
+
*
|
|
37
|
+
* @param options - Handler options
|
|
38
|
+
* @returns Response from Timeback or undefined to continue to next handler
|
|
39
|
+
*
|
|
40
|
+
* @example
|
|
41
|
+
* ```typescript
|
|
42
|
+
* // src/middleware.ts
|
|
43
|
+
* import { createMiddleware } from '@solidjs/start/middleware'
|
|
44
|
+
* import { timeback } from './lib/timeback'
|
|
45
|
+
* import { solidStartHandler } from 'timeback/solid-start'
|
|
46
|
+
*
|
|
47
|
+
* export default createMiddleware({
|
|
48
|
+
* onRequest: [
|
|
49
|
+
* async (event) => {
|
|
50
|
+
* const response = await solidStartHandler({
|
|
51
|
+
* timeback,
|
|
52
|
+
* event,
|
|
53
|
+
* })
|
|
54
|
+
* if (response) return response
|
|
55
|
+
* }
|
|
56
|
+
* ]
|
|
57
|
+
* })
|
|
58
|
+
* ```
|
|
59
|
+
*/
|
|
60
|
+
export declare function solidStartHandler(options: SolidStartHandlerOptions): Response | Promise<Response> | undefined;
|
|
61
|
+
//# sourceMappingURL=solid-start.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"solid-start.d.ts","sourceRoot":"","sources":["../../../src/server/adapters/solid-start.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,OAAO,KAAK,EAAE,wBAAwB,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,SAAS,CAAA;AAM1F;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,aAAa,GAAG,kBAAkB,CA0C5E;AA2BD;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,wBAAgB,iBAAiB,CAChC,OAAO,EAAE,wBAAwB,GAC/B,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC,GAAG,SAAS,CA0C1C"}
|
|
@@ -0,0 +1,551 @@
|
|
|
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
|
+
|
|
474
|
+
// src/server/adapters/solid-start.ts
|
|
475
|
+
function toSolidStartHandler(input) {
|
|
476
|
+
const handle = getHandlers(input);
|
|
477
|
+
const routeHandler = (event) => {
|
|
478
|
+
const url = new URL(event.request.url);
|
|
479
|
+
const path = url.pathname;
|
|
480
|
+
const method = event.request.method;
|
|
481
|
+
if (method === "GET") {
|
|
482
|
+
if (path.endsWith(ROUTES.IDENTITY.SIGNIN)) {
|
|
483
|
+
return handle.identity.signIn(event.request);
|
|
484
|
+
}
|
|
485
|
+
if (path.endsWith(ROUTES.IDENTITY.CALLBACK)) {
|
|
486
|
+
return handle.identity.callback(event.request);
|
|
487
|
+
}
|
|
488
|
+
if (path.endsWith(ROUTES.IDENTITY.SIGNOUT)) {
|
|
489
|
+
return handle.identity.signOut();
|
|
490
|
+
}
|
|
491
|
+
if (path.endsWith(ROUTES.USER.ME)) {
|
|
492
|
+
return handle.user.me(event.request);
|
|
493
|
+
}
|
|
494
|
+
}
|
|
495
|
+
if (method === "POST") {
|
|
496
|
+
if (path.endsWith(ROUTES.ACTIVITY)) {
|
|
497
|
+
return handle.activity(event.request);
|
|
498
|
+
}
|
|
499
|
+
}
|
|
500
|
+
return jsonResponse({ error: "Not found" }, 404);
|
|
501
|
+
};
|
|
502
|
+
return {
|
|
503
|
+
GET: routeHandler,
|
|
504
|
+
POST: routeHandler,
|
|
505
|
+
PUT: routeHandler,
|
|
506
|
+
DELETE: routeHandler,
|
|
507
|
+
PATCH: routeHandler
|
|
508
|
+
};
|
|
509
|
+
}
|
|
510
|
+
function isTimebackPath(pathname, basePath) {
|
|
511
|
+
const normalizedBase = basePath.endsWith("/") ? basePath.slice(0, -1) : basePath;
|
|
512
|
+
return pathname.startsWith(`${normalizedBase}/`) || pathname === normalizedBase || pathname.endsWith(ROUTES.IDENTITY.SIGNIN) || pathname.endsWith(ROUTES.IDENTITY.CALLBACK) || pathname.endsWith(ROUTES.IDENTITY.SIGNOUT) || pathname.endsWith(ROUTES.ACTIVITY) || pathname.endsWith(ROUTES.USER.ME);
|
|
513
|
+
}
|
|
514
|
+
function solidStartHandler(options) {
|
|
515
|
+
const { timeback, event, basePath = "/api/timeback", callbackPath } = options;
|
|
516
|
+
const request = event.request;
|
|
517
|
+
const url = new URL(request.url);
|
|
518
|
+
const handle = getHandlers(timeback);
|
|
519
|
+
const path = url.pathname;
|
|
520
|
+
const method = request.method;
|
|
521
|
+
if (callbackPath && path === callbackPath && method === "GET") {
|
|
522
|
+
return handle.identity.callback(request);
|
|
523
|
+
}
|
|
524
|
+
if (!isTimebackPath(path, basePath)) {
|
|
525
|
+
return;
|
|
526
|
+
}
|
|
527
|
+
if (method === "GET") {
|
|
528
|
+
if (path.endsWith(ROUTES.IDENTITY.SIGNIN)) {
|
|
529
|
+
return handle.identity.signIn(request);
|
|
530
|
+
}
|
|
531
|
+
if (path.endsWith(ROUTES.IDENTITY.CALLBACK)) {
|
|
532
|
+
return handle.identity.callback(request);
|
|
533
|
+
}
|
|
534
|
+
if (path.endsWith(ROUTES.IDENTITY.SIGNOUT)) {
|
|
535
|
+
return handle.identity.signOut();
|
|
536
|
+
}
|
|
537
|
+
if (path.endsWith(ROUTES.USER.ME)) {
|
|
538
|
+
return handle.user.me(request);
|
|
539
|
+
}
|
|
540
|
+
}
|
|
541
|
+
if (method === "POST") {
|
|
542
|
+
if (path.endsWith(ROUTES.ACTIVITY)) {
|
|
543
|
+
return handle.activity(request);
|
|
544
|
+
}
|
|
545
|
+
}
|
|
546
|
+
return;
|
|
547
|
+
}
|
|
548
|
+
export {
|
|
549
|
+
toSolidStartHandler,
|
|
550
|
+
solidStartHandler
|
|
551
|
+
};
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SvelteKit Adapter
|
|
3
|
+
*
|
|
4
|
+
* Adapts Timeback handlers for SvelteKit.
|
|
5
|
+
* Supports both hooks-based (recommended) and route-based approaches.
|
|
6
|
+
*/
|
|
7
|
+
import type { SvelteKitHandlerOptions, SvelteKitHandlers, SvelteKitRequestEvent, TimebackInput } from './types';
|
|
8
|
+
/**
|
|
9
|
+
* SvelteKit server hook handler for Timeback.
|
|
10
|
+
*
|
|
11
|
+
* This is the **recommended** approach for SvelteKit integration.
|
|
12
|
+
* It intercepts requests at the hooks level, providing deeper integration
|
|
13
|
+
* with SvelteKit's request lifecycle.
|
|
14
|
+
*
|
|
15
|
+
* @param options - Handler options
|
|
16
|
+
* @returns Response from either Timeback or the resolve chain
|
|
17
|
+
*
|
|
18
|
+
* @example
|
|
19
|
+
* ```typescript
|
|
20
|
+
* // hooks.server.ts
|
|
21
|
+
* import { timeback } from '$lib/timeback'
|
|
22
|
+
* import { svelteKitHandler } from 'timeback/svelte-kit'
|
|
23
|
+
* import { building } from '$app/environment'
|
|
24
|
+
*
|
|
25
|
+
* export async function handle({ event, resolve }) {
|
|
26
|
+
* return svelteKitHandler({
|
|
27
|
+
* timeback,
|
|
28
|
+
* event,
|
|
29
|
+
* resolve,
|
|
30
|
+
* building,
|
|
31
|
+
* })
|
|
32
|
+
* }
|
|
33
|
+
* ```
|
|
34
|
+
*
|
|
35
|
+
* @example
|
|
36
|
+
* ```typescript
|
|
37
|
+
* // hooks.server.ts - with session in event.locals
|
|
38
|
+
* import { timeback } from '$lib/timeback'
|
|
39
|
+
* import { svelteKitHandler } from 'timeback/svelte-kit'
|
|
40
|
+
* import { building } from '$app/environment'
|
|
41
|
+
*
|
|
42
|
+
* export async function handle({ event, resolve }) {
|
|
43
|
+
* // Optionally populate event.locals with user session
|
|
44
|
+
* // const session = await getSessionFromCookie(event.cookies)
|
|
45
|
+
* // if (session) {
|
|
46
|
+
* // event.locals.user = session.user
|
|
47
|
+
* // }
|
|
48
|
+
*
|
|
49
|
+
* return svelteKitHandler({
|
|
50
|
+
* timeback,
|
|
51
|
+
* event,
|
|
52
|
+
* resolve,
|
|
53
|
+
* building,
|
|
54
|
+
* })
|
|
55
|
+
* }
|
|
56
|
+
* ```
|
|
57
|
+
*/
|
|
58
|
+
export declare function svelteKitHandler<TEvent extends SvelteKitRequestEvent>(options: SvelteKitHandlerOptions<TEvent>): Promise<Response>;
|
|
59
|
+
/**
|
|
60
|
+
* Convert Timeback instance to SvelteKit route handlers.
|
|
61
|
+
*
|
|
62
|
+
* This is an **alternative** approach using SvelteKit's route handlers.
|
|
63
|
+
* Use this if you prefer explicit route files over hooks.
|
|
64
|
+
*
|
|
65
|
+
* Accepts either the full Timeback instance or just the handlers:
|
|
66
|
+
* - `toSvelteKitHandler(timeback)`
|
|
67
|
+
* - `toSvelteKitHandler(timeback.handle)`
|
|
68
|
+
*
|
|
69
|
+
* @param input - Timeback instance or handlers
|
|
70
|
+
* @returns Object with HTTP method handlers for SvelteKit
|
|
71
|
+
*
|
|
72
|
+
* @example
|
|
73
|
+
* ```typescript
|
|
74
|
+
* // src/routes/api/timeback/[...path]/+server.ts
|
|
75
|
+
* import { timeback } from '$lib/timeback'
|
|
76
|
+
* import { toSvelteKitHandler } from 'timeback/svelte-kit'
|
|
77
|
+
*
|
|
78
|
+
* export const { GET, POST } = toSvelteKitHandler(timeback)
|
|
79
|
+
* ```
|
|
80
|
+
*/
|
|
81
|
+
export declare function toSvelteKitHandler(input: TimebackInput): SvelteKitHandlers;
|
|
82
|
+
//# sourceMappingURL=svelte-kit.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"svelte-kit.d.ts","sourceRoot":"","sources":["../../../src/server/adapters/svelte-kit.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,OAAO,KAAK,EACX,uBAAuB,EACvB,iBAAiB,EACjB,qBAAqB,EAErB,aAAa,EACb,MAAM,SAAS,CAAA;AA2BhB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiDG;AACH,wBAAsB,gBAAgB,CAAC,MAAM,SAAS,qBAAqB,EAC1E,OAAO,EAAE,uBAAuB,CAAC,MAAM,CAAC,GACtC,OAAO,CAAC,QAAQ,CAAC,CA4EnB;AAMD;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,aAAa,GAAG,iBAAiB,CAgB1E"}
|