@silkweave/auth 1.4.0 → 1.5.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.
- package/.turbo/turbo-build.log +14 -15
- package/.turbo/turbo-check.log +13 -12
- package/.turbo/turbo-lint.log +1 -1
- package/.turbo/turbo-prepack.log +15 -17
- package/build/index.d.mts +188 -0
- package/build/index.d.mts.map +1 -0
- package/build/index.mjs +709 -0
- package/build/index.mjs.map +1 -0
- package/eslint.config.mjs +1 -1
- package/package.json +11 -8
- package/tsconfig.json +2 -1
- package/tsconfig.tsbuildinfo +1 -0
- package/tsdown.config.ts +7 -0
- package/build/index.d.ts +0 -174
- package/build/index.js +0 -818
- package/build/index.js.map +0 -1
- package/tsup.config.ts +0 -13
package/.turbo/turbo-build.log
CHANGED
|
@@ -1,18 +1,17 @@
|
|
|
1
1
|
|
|
2
2
|
|
|
3
|
-
> @silkweave/auth@1.
|
|
4
|
-
>
|
|
3
|
+
> @silkweave/auth@1.4.1 build /Users/atomic/projects/ai/silkweave/packages/auth
|
|
4
|
+
> tsdown
|
|
5
5
|
|
|
6
|
-
[
|
|
7
|
-
[
|
|
8
|
-
[
|
|
9
|
-
[
|
|
10
|
-
[
|
|
11
|
-
[
|
|
12
|
-
[
|
|
13
|
-
[
|
|
14
|
-
[
|
|
15
|
-
[
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
DTS build/index.d.ts 5.84 KB
|
|
6
|
+
[34mℹ[39m [34mtsdown v0.21.8[39m powered by [38;2;255;126;23mrolldown v1.0.0-rc.15[39m
|
|
7
|
+
[34mℹ[39m config file: [4m/Users/atomic/projects/ai/silkweave/packages/auth/tsdown.config.ts[24m
|
|
8
|
+
[34mℹ[39m entry: [34m./src/index.ts[39m
|
|
9
|
+
[34mℹ[39m tsconfig: [34mtsconfig.json[39m
|
|
10
|
+
[34mℹ[39m Build start
|
|
11
|
+
[34mℹ[39m Cleaning 4 files
|
|
12
|
+
[34mℹ[39m [2mbuild/[22m[1mindex.mjs[22m [2m24.45 kB[22m [2m│ gzip: 5.82 kB[22m
|
|
13
|
+
[34mℹ[39m [2mbuild/[22mindex.mjs.map [2m46.54 kB[22m [2m│ gzip: 11.29 kB[22m
|
|
14
|
+
[34mℹ[39m [2mbuild/[22mindex.d.mts.map [2m 3.35 kB[22m [2m│ gzip: 0.96 kB[22m
|
|
15
|
+
[34mℹ[39m [2mbuild/[22m[32m[1mindex.d.mts[22m[39m [2m 6.26 kB[22m [2m│ gzip: 1.51 kB[22m
|
|
16
|
+
[34mℹ[39m 4 files, total: 80.59 kB
|
|
17
|
+
[32m✔[39m Build complete in [32m613ms[39m
|
package/.turbo/turbo-check.log
CHANGED
|
@@ -1,12 +1,13 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
>
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
>
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
>
|
|
12
|
-
|
|
1
|
+
|
|
2
|
+
|
|
3
|
+
> @silkweave/auth@1.4.1 check /Users/atomic/projects/ai/silkweave/packages/auth
|
|
4
|
+
> pnpm lint && pnpm typecheck
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
> @silkweave/auth@1.4.1 lint /Users/atomic/projects/ai/silkweave/packages/auth
|
|
8
|
+
> eslint
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
> @silkweave/auth@1.4.1 typecheck /Users/atomic/projects/ai/silkweave/packages/auth
|
|
12
|
+
> tsc --noEmit
|
|
13
|
+
|
package/.turbo/turbo-lint.log
CHANGED
package/.turbo/turbo-prepack.log
CHANGED
|
@@ -1,26 +1,24 @@
|
|
|
1
1
|
|
|
2
2
|
|
|
3
|
-
> @silkweave/auth@1.
|
|
3
|
+
> @silkweave/auth@1.5.0 prepack /Users/atomic/projects/ai/silkweave/packages/auth
|
|
4
4
|
> pnpm clean && pnpm build
|
|
5
5
|
|
|
6
6
|
|
|
7
|
-
> @silkweave/auth@1.
|
|
7
|
+
> @silkweave/auth@1.5.0 clean /Users/atomic/projects/ai/silkweave/packages/auth
|
|
8
8
|
> rimraf build
|
|
9
9
|
|
|
10
10
|
|
|
11
|
-
> @silkweave/auth@1.
|
|
12
|
-
>
|
|
11
|
+
> @silkweave/auth@1.5.0 build /Users/atomic/projects/ai/silkweave/packages/auth
|
|
12
|
+
> tsdown
|
|
13
13
|
|
|
14
|
-
[
|
|
15
|
-
[
|
|
16
|
-
[
|
|
17
|
-
[
|
|
18
|
-
[
|
|
19
|
-
[
|
|
20
|
-
[
|
|
21
|
-
[
|
|
22
|
-
[
|
|
23
|
-
[
|
|
24
|
-
|
|
25
|
-
DTS ⚡️ Build success in 530ms
|
|
26
|
-
DTS build/index.d.ts 5.84 KB
|
|
14
|
+
[34mℹ[39m [34mtsdown v0.21.8[39m powered by [38;2;255;126;23mrolldown v1.0.0-rc.15[39m
|
|
15
|
+
[34mℹ[39m config file: [4m/Users/atomic/projects/ai/silkweave/packages/auth/tsdown.config.ts[24m
|
|
16
|
+
[34mℹ[39m entry: [34m./src/index.ts[39m
|
|
17
|
+
[34mℹ[39m tsconfig: [34mtsconfig.json[39m
|
|
18
|
+
[34mℹ[39m Build start
|
|
19
|
+
[34mℹ[39m [2mbuild/[22m[1mindex.mjs[22m [2m24.45 kB[22m [2m│ gzip: 5.82 kB[22m
|
|
20
|
+
[34mℹ[39m [2mbuild/[22mindex.mjs.map [2m46.54 kB[22m [2m│ gzip: 11.29 kB[22m
|
|
21
|
+
[34mℹ[39m [2mbuild/[22mindex.d.mts.map [2m 3.35 kB[22m [2m│ gzip: 0.96 kB[22m
|
|
22
|
+
[34mℹ[39m [2mbuild/[22m[32m[1mindex.d.mts[22m[39m [2m 6.26 kB[22m [2m│ gzip: 1.51 kB[22m
|
|
23
|
+
[34mℹ[39m 4 files, total: 80.59 kB
|
|
24
|
+
[32m✔[39m Build complete in [32m701ms[39m
|
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
import { SilkweaveContext } from "@silkweave/core";
|
|
2
|
+
|
|
3
|
+
//#region src/errors.d.ts
|
|
4
|
+
declare class AuthError extends Error {
|
|
5
|
+
readonly code: string;
|
|
6
|
+
readonly statusCode: number;
|
|
7
|
+
constructor(message: string, code: string, statusCode?: number);
|
|
8
|
+
}
|
|
9
|
+
declare function invalidToken(message?: string): AuthError;
|
|
10
|
+
declare function insufficientScope(message?: string): AuthError;
|
|
11
|
+
//#endregion
|
|
12
|
+
//#region src/extract.d.ts
|
|
13
|
+
declare function extractBearerToken(header: string | null | undefined): string | null;
|
|
14
|
+
declare function buildWWWAuthenticate(error?: string, description?: string, resourceMetadataUrl?: string): string;
|
|
15
|
+
//#endregion
|
|
16
|
+
//#region src/metadata.d.ts
|
|
17
|
+
interface ProtectedResourceMetadata {
|
|
18
|
+
resource: string;
|
|
19
|
+
authorization_servers: string[];
|
|
20
|
+
scopes_supported?: string[];
|
|
21
|
+
bearer_methods_supported?: string[];
|
|
22
|
+
}
|
|
23
|
+
declare function generateProtectedResourceMetadata(resourceUrl: string, authorizationServers: string[]): ProtectedResourceMetadata;
|
|
24
|
+
//#endregion
|
|
25
|
+
//#region src/provider/types.d.ts
|
|
26
|
+
interface AuthInfo {
|
|
27
|
+
token: string;
|
|
28
|
+
clientId?: string;
|
|
29
|
+
scopes?: string[];
|
|
30
|
+
expiresAt?: number;
|
|
31
|
+
[key: string]: unknown;
|
|
32
|
+
}
|
|
33
|
+
interface OAuthRequest {
|
|
34
|
+
method: string;
|
|
35
|
+
url: URL;
|
|
36
|
+
headers: Record<string, string | undefined>;
|
|
37
|
+
body?: Record<string, string>;
|
|
38
|
+
}
|
|
39
|
+
interface OAuthResponse {
|
|
40
|
+
status: number;
|
|
41
|
+
headers: Record<string, string>;
|
|
42
|
+
body?: string | Record<string, unknown>;
|
|
43
|
+
}
|
|
44
|
+
interface OAuthProvider {
|
|
45
|
+
authorize(req: OAuthRequest): Promise<OAuthResponse>;
|
|
46
|
+
callback(req: OAuthRequest): Promise<OAuthResponse>;
|
|
47
|
+
token(req: OAuthRequest): Promise<OAuthResponse>;
|
|
48
|
+
register(req: OAuthRequest): Promise<OAuthResponse>;
|
|
49
|
+
metadata(): OAuthResponse;
|
|
50
|
+
verifyToken(token: string): Promise<AuthInfo | undefined>;
|
|
51
|
+
}
|
|
52
|
+
//#endregion
|
|
53
|
+
//#region src/types.d.ts
|
|
54
|
+
type VerifyToken = (token: string, context: SilkweaveContext) => Promise<AuthInfo | undefined>;
|
|
55
|
+
interface AuthConfig {
|
|
56
|
+
verifyToken: VerifyToken;
|
|
57
|
+
required?: boolean;
|
|
58
|
+
resourceUrl?: string;
|
|
59
|
+
authorizationServers?: string[];
|
|
60
|
+
requiredScopes?: string[];
|
|
61
|
+
provider?: OAuthProvider;
|
|
62
|
+
callbackPath?: string;
|
|
63
|
+
}
|
|
64
|
+
//#endregion
|
|
65
|
+
//#region src/provider/store.d.ts
|
|
66
|
+
interface AuthCodeData {
|
|
67
|
+
clientId: string;
|
|
68
|
+
redirectUri: string;
|
|
69
|
+
codeChallenge: string;
|
|
70
|
+
codeChallengeMethod: string;
|
|
71
|
+
scopes: string[];
|
|
72
|
+
upstreamAccessToken: string;
|
|
73
|
+
upstreamIdToken?: string;
|
|
74
|
+
email?: string;
|
|
75
|
+
sub?: string;
|
|
76
|
+
expiresAt: number;
|
|
77
|
+
}
|
|
78
|
+
interface PendingAuthData {
|
|
79
|
+
clientId: string;
|
|
80
|
+
redirectUri: string;
|
|
81
|
+
codeChallenge: string;
|
|
82
|
+
codeChallengeMethod: string;
|
|
83
|
+
scope: string;
|
|
84
|
+
clientState: string;
|
|
85
|
+
resource?: string;
|
|
86
|
+
expiresAt: number;
|
|
87
|
+
}
|
|
88
|
+
interface ClientRegistration {
|
|
89
|
+
clientId: string;
|
|
90
|
+
clientSecret: string;
|
|
91
|
+
redirectUris: string[];
|
|
92
|
+
clientName?: string;
|
|
93
|
+
createdAt: number;
|
|
94
|
+
}
|
|
95
|
+
interface RefreshTokenData {
|
|
96
|
+
clientId: string;
|
|
97
|
+
scopes: string[];
|
|
98
|
+
email?: string;
|
|
99
|
+
sub?: string;
|
|
100
|
+
expiresAt: number;
|
|
101
|
+
}
|
|
102
|
+
interface OAuthStore {
|
|
103
|
+
saveAuthCode(code: string, data: AuthCodeData): Promise<void>;
|
|
104
|
+
getAuthCode(code: string): Promise<AuthCodeData | undefined>;
|
|
105
|
+
deleteAuthCode(code: string): Promise<void>;
|
|
106
|
+
savePendingAuth(state: string, data: PendingAuthData): Promise<void>;
|
|
107
|
+
getPendingAuth(state: string): Promise<PendingAuthData | undefined>;
|
|
108
|
+
deletePendingAuth(state: string): Promise<void>;
|
|
109
|
+
savePkceVerifier(state: string, verifier: string): Promise<void>;
|
|
110
|
+
getPkceVerifier(state: string): Promise<string | undefined>;
|
|
111
|
+
deletePkceVerifier(state: string): Promise<void>;
|
|
112
|
+
saveClient(clientId: string, data: ClientRegistration): Promise<void>;
|
|
113
|
+
getClient(clientId: string): Promise<ClientRegistration | undefined>;
|
|
114
|
+
saveRefreshToken(token: string, data: RefreshTokenData): Promise<void>;
|
|
115
|
+
getRefreshToken(token: string): Promise<RefreshTokenData | undefined>;
|
|
116
|
+
deleteRefreshToken(token: string): Promise<void>;
|
|
117
|
+
}
|
|
118
|
+
//#endregion
|
|
119
|
+
//#region src/provider/google.d.ts
|
|
120
|
+
interface GoogleOAuthOptions {
|
|
121
|
+
clientId: string;
|
|
122
|
+
clientSecret: string;
|
|
123
|
+
resourceUrl: string;
|
|
124
|
+
redirectUris: string[];
|
|
125
|
+
requiredScopes?: string[];
|
|
126
|
+
callbackPath?: string;
|
|
127
|
+
signingKey?: string;
|
|
128
|
+
tokenTtl?: number;
|
|
129
|
+
store?: OAuthStore;
|
|
130
|
+
}
|
|
131
|
+
declare function google(options: GoogleOAuthOptions): AuthConfig;
|
|
132
|
+
//#endregion
|
|
133
|
+
//#region src/provider/proxy.d.ts
|
|
134
|
+
interface OAuthProxyConfig {
|
|
135
|
+
authorizeUrl: string;
|
|
136
|
+
tokenUrl: string;
|
|
137
|
+
userinfoUrl?: string;
|
|
138
|
+
clientId: string;
|
|
139
|
+
clientSecret: string;
|
|
140
|
+
resourceUrl: string;
|
|
141
|
+
redirectUris: string[];
|
|
142
|
+
requiredScopes?: string[];
|
|
143
|
+
callbackPath?: string;
|
|
144
|
+
signingKey?: string;
|
|
145
|
+
tokenTtl?: number;
|
|
146
|
+
store?: OAuthStore;
|
|
147
|
+
}
|
|
148
|
+
declare function createOAuthProxy(config: OAuthProxyConfig): OAuthProvider;
|
|
149
|
+
//#endregion
|
|
150
|
+
//#region src/provider/uri.d.ts
|
|
151
|
+
declare function matchRedirectUri(uri: string, patterns: string[]): boolean;
|
|
152
|
+
//#endregion
|
|
153
|
+
//#region src/store/json-store.d.ts
|
|
154
|
+
declare function createJsonStore(path: string): OAuthStore;
|
|
155
|
+
//#endregion
|
|
156
|
+
//#region src/store/memory-store.d.ts
|
|
157
|
+
declare function createMemoryStore(): OAuthStore;
|
|
158
|
+
//#endregion
|
|
159
|
+
//#region src/store/redis-store.d.ts
|
|
160
|
+
interface RedisClient {
|
|
161
|
+
get(key: string): Promise<unknown>;
|
|
162
|
+
set(key: string, value: string, options?: {
|
|
163
|
+
ex?: number;
|
|
164
|
+
}): Promise<unknown>;
|
|
165
|
+
del(key: string): Promise<unknown>;
|
|
166
|
+
}
|
|
167
|
+
interface RedisStoreOptions {
|
|
168
|
+
client: RedisClient;
|
|
169
|
+
prefix?: string;
|
|
170
|
+
}
|
|
171
|
+
declare function createRedisStore(options: RedisStoreOptions): OAuthStore;
|
|
172
|
+
//#endregion
|
|
173
|
+
//#region src/validate.d.ts
|
|
174
|
+
interface ValidateResult {
|
|
175
|
+
auth?: AuthInfo;
|
|
176
|
+
error?: {
|
|
177
|
+
statusCode: number;
|
|
178
|
+
headers: Record<string, string>;
|
|
179
|
+
body: {
|
|
180
|
+
error: string;
|
|
181
|
+
error_description: string;
|
|
182
|
+
};
|
|
183
|
+
};
|
|
184
|
+
}
|
|
185
|
+
declare function validateToken(authorizationHeader: string | null | undefined, config: AuthConfig, context: SilkweaveContext): Promise<ValidateResult>;
|
|
186
|
+
//#endregion
|
|
187
|
+
export { AuthCodeData, AuthConfig, AuthError, type AuthInfo, ClientRegistration, GoogleOAuthOptions, OAuthProvider, OAuthProxyConfig, OAuthRequest, OAuthResponse, OAuthStore, PendingAuthData, ProtectedResourceMetadata, RedisClient, RedisStoreOptions, RefreshTokenData, ValidateResult, VerifyToken, buildWWWAuthenticate, createJsonStore, createMemoryStore, createOAuthProxy, createRedisStore, extractBearerToken, generateProtectedResourceMetadata, google, insufficientScope, invalidToken, matchRedirectUri, validateToken };
|
|
188
|
+
//# sourceMappingURL=index.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.mts","names":[],"sources":["../src/errors.ts","../src/extract.ts","../src/metadata.ts","../src/provider/types.ts","../src/types.ts","../src/provider/store.ts","../src/provider/google.ts","../src/provider/proxy.ts","../src/provider/uri.ts","../src/store/json-store.ts","../src/store/memory-store.ts","../src/store/redis-store.ts","../src/validate.ts"],"mappings":"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"}
|