@crossauth/sveltekit 1.1.0 → 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 (46) hide show
  1. package/dist/index.d.ts +1 -1
  2. package/dist/index.js +16 -6181
  3. package/dist/sveltekitadminclientendpoints.d.ts +13 -12
  4. package/dist/sveltekitadminclientendpoints.js +187 -0
  5. package/dist/sveltekitadminendpoints.d.ts +5 -4
  6. package/dist/sveltekitadminendpoints.js +766 -0
  7. package/dist/sveltekitapikey.d.ts +4 -4
  8. package/dist/sveltekitapikey.js +81 -0
  9. package/dist/sveltekitoauthclient.d.ts +6 -5
  10. package/dist/sveltekitoauthclient.js +2309 -0
  11. package/dist/sveltekitoauthserver.d.ts +4 -4
  12. package/dist/sveltekitoauthserver.js +1350 -0
  13. package/dist/sveltekitresserver.d.ts +6 -5
  14. package/dist/sveltekitresserver.js +286 -0
  15. package/dist/sveltekitserver.d.ts +11 -10
  16. package/dist/sveltekitserver.js +393 -0
  17. package/dist/sveltekitsession.d.ts +5 -5
  18. package/dist/sveltekitsession.js +1112 -0
  19. package/dist/sveltekitsessionadapter.d.ts +2 -3
  20. package/dist/sveltekitsessionadapter.js +2 -0
  21. package/dist/sveltekitsharedclientendpoints.d.ts +7 -6
  22. package/dist/sveltekitsharedclientendpoints.js +630 -0
  23. package/dist/sveltekituserclientendpoints.d.ts +13 -12
  24. package/dist/sveltekituserclientendpoints.js +270 -0
  25. package/dist/sveltekituserendpoints.d.ts +6 -5
  26. package/dist/sveltekituserendpoints.js +1813 -0
  27. package/dist/tests/sveltekitadminclientendpoints.test.js +330 -0
  28. package/dist/tests/sveltekitadminendpoints.test.js +242 -0
  29. package/dist/tests/sveltekitapikeyserver.test.js +44 -0
  30. package/dist/tests/sveltekitoauthclient.test.d.ts +5 -5
  31. package/dist/tests/sveltekitoauthclient.test.js +1016 -0
  32. package/dist/tests/sveltekitoauthresserver.test.d.ts +4 -4
  33. package/dist/tests/sveltekitoauthresserver.test.js +185 -0
  34. package/dist/tests/sveltekitoauthserver.test.js +673 -0
  35. package/dist/tests/sveltekituserclientendpoints.test.js +244 -0
  36. package/dist/tests/sveltekituserendpoints.test.js +152 -0
  37. package/dist/tests/sveltemock.test.js +36 -0
  38. package/dist/tests/sveltemocks.d.ts +2 -3
  39. package/dist/tests/sveltemocks.js +114 -0
  40. package/dist/tests/sveltesessionhooks.test.js +224 -0
  41. package/dist/tests/testshared.d.ts +8 -8
  42. package/dist/tests/testshared.js +344 -0
  43. package/dist/utils.d.ts +1 -2
  44. package/dist/utils.js +123 -0
  45. package/package.json +6 -4
  46. package/dist/index.cjs +0 -1
@@ -1,10 +1,10 @@
1
1
  export declare function oauthLogin(): Promise<{
2
- server: import('..').SvelteKitServer;
3
- authServer: import('@crossauth/backend').OAuthAuthorizationServer;
2
+ server: import("..").SvelteKitServer;
3
+ authServer: import("@crossauth/backend").OAuthAuthorizationServer;
4
4
  sessionCookieValue: string | undefined;
5
5
  sessionId: string | undefined;
6
6
  access_token: any;
7
7
  refresh_token: any;
8
- keyStorage: import('@crossauth/backend').InMemoryKeyStorage;
9
- userStorage: import('@crossauth/backend').InMemoryUserStorage;
8
+ keyStorage: import("@crossauth/backend").InMemoryKeyStorage;
9
+ userStorage: import("@crossauth/backend").InMemoryUserStorage;
10
10
  }>;
@@ -0,0 +1,185 @@
1
+ // Copyright (c) 2026 Matthew Baker. All rights reserved. Licenced under the Apache Licence 2.0. See LICENSE file
2
+ import { MockRequestEvent } from './sveltemocks';
3
+ import { SvelteKitOAuthResourceServer } from '../sveltekitresserver';
4
+ import { oidcConfiguration, makeServer, getAccessToken } from './testshared';
5
+ import { OAuthTokenConsumer } from '@crossauth/backend';
6
+ import createFetchMock from 'vitest-fetch-mock';
7
+ import { test, expect, vi, beforeAll, afterEach } from 'vitest';
8
+ let fetchMocker = createFetchMock(vi);
9
+ fetchMocker.enableMocks();
10
+ beforeAll(async () => {
11
+ fetchMocker.doMock();
12
+ });
13
+ afterEach(async () => {
14
+ vi.restoreAllMocks();
15
+ });
16
+ export async function oauthLogin() {
17
+ const { server, keyStorage, userStorage } = await makeServer(true, false, false, true, { tokenResponseType: "saveInSessionAndReturn", enableCsrfProtection: false });
18
+ const { authServer } = await getAccessToken();
19
+ if (server.oAuthClient)
20
+ await server.oAuthClient.loadConfig(oidcConfiguration);
21
+ // @ts-ignore
22
+ //fetchMocker.mockResponseOnce((request) => {return JSON.stringify({url: request.url, body: JSON.parse(request.body.toString())})});
23
+ fetchMocker.mockResponseOnce(async (request) => {
24
+ // call token with password flow
25
+ const body = JSON.parse(request.body?.toString() ?? "{}");
26
+ const firstTokenResponse = await authServer.tokenEndpoint({
27
+ grantType: body.grant_type,
28
+ client_id: body.client_id,
29
+ scope: body.scope,
30
+ client_secret: body.client_secret,
31
+ username: body.username,
32
+ password: body.password,
33
+ });
34
+ return new Response(JSON.stringify(firstTokenResponse), { headers: { "content-type": "application/json" } });
35
+ });
36
+ // password flow post endpoint
37
+ let postRequest = new Request(`http://server.com/passwordFlowFlow`, {
38
+ method: "POST",
39
+ body: JSON.stringify({
40
+ scope: "read write",
41
+ username: "bob",
42
+ password: "bobPass123",
43
+ }),
44
+ headers: { "content-type": "application/json" },
45
+ });
46
+ let event = new MockRequestEvent("1", postRequest, {});
47
+ if (server.oAuthClient == undefined)
48
+ throw new Error("server.oAuthClient is undefined");
49
+ const resp = await server.oAuthClient?.passwordFlowEndpoint.post(event);
50
+ if (!resp || !(resp instanceof Response))
51
+ throw "response is not an object";
52
+ expect(resp.status).toBe(200);
53
+ const body = await resp.json();
54
+ expect(body.ok).toBe(true);
55
+ expect(body.access_token).toBeDefined();
56
+ expect(body.refresh_token).toBeDefined();
57
+ const access_token = body.access_token;
58
+ const refresh_token = body.refresh_token;
59
+ let sessionCookieValue = event.cookies.get("SESSIONID");
60
+ let sessionId = server.sessionServer?.sessionManager.getSessionId(sessionCookieValue ?? "");
61
+ return { server, authServer, sessionCookieValue, sessionId, access_token, refresh_token, keyStorage, userStorage };
62
+ }
63
+ ;
64
+ test('SvelteKitOAuthResourceServer.validAndInvalidAccessToken_authorized', async () => {
65
+ // login using password flow
66
+ const { server, authServer, access_token, userStorage } = await oauthLogin();
67
+ if (server.oAuthClient)
68
+ await server.oAuthClient.loadConfig(oidcConfiguration);
69
+ const decodedAccessToken = await authServer.validAccessToken(access_token ?? "");
70
+ expect(decodedAccessToken).toBeDefined();
71
+ // create resource server
72
+ const issuer = process.env["CROSSAUTH_AUTH_SERVER_BASE_URL"] ?? "";
73
+ const resserver = new SvelteKitOAuthResourceServer([new OAuthTokenConsumer(process.env["CROSSAUTH_OAUTH_AUDIENCE"] ?? "resourceserver", { authServerBaseUrl: issuer })], { userStorage });
74
+ fetchMocker.mockResponseOnce(JSON.stringify(oidcConfiguration));
75
+ await resserver.tokenConsumers[0].loadConfig();
76
+ fetchMocker.mockResponseOnce(JSON.stringify(authServer.jwks()));
77
+ await resserver.tokenConsumers[0].loadJwks();
78
+ // simulate a get request on the res server
79
+ // authorizationCodeFlow get endpoint
80
+ let getRequest = new Request(`http://resserver.com/getresource`, {
81
+ method: "GET",
82
+ headers: { "authorization": "Bearer " + access_token }
83
+ });
84
+ let event = new MockRequestEvent("1", getRequest, {});
85
+ const resp1 = await resserver.authorized(event);
86
+ expect(resp1?.authorized).toBe(true);
87
+ expect(resp1?.tokenPayload).toBeDefined();
88
+ expect(resp1?.user?.username).toBe("bob");
89
+ // simulate an invalid get request on the res server
90
+ // authorizationCodeFlow get endpoint
91
+ getRequest = new Request(`http://resserver.com/getresource`, {
92
+ method: "GET",
93
+ headers: { "authorization": "Bearer " + access_token + "x" }
94
+ });
95
+ event = new MockRequestEvent("1", getRequest, {});
96
+ const resp2 = await resserver.authorized(event);
97
+ expect(resp2?.authorized).toBe(false);
98
+ expect(resp2?.tokenPayload).toBeUndefined();
99
+ expect(resp2?.user).toBeUndefined();
100
+ });
101
+ test('SvelteKitOAuthResourceServer.validAndInvalidAccessToken_hook', async () => {
102
+ // login using password flow
103
+ const { server, authServer, access_token, userStorage } = await oauthLogin();
104
+ if (server.oAuthClient)
105
+ await server.oAuthClient.loadConfig(oidcConfiguration);
106
+ const decodedAccessToken = await authServer.validAccessToken(access_token ?? "");
107
+ expect(decodedAccessToken).toBeDefined();
108
+ // create resource server
109
+ const issuer = process.env["CROSSAUTH_AUTH_SERVER_BASE_URL"] ?? "";
110
+ const resserver = new SvelteKitOAuthResourceServer([new OAuthTokenConsumer(process.env["CROSSAUTH_OAUTH_AUDIENCE"] ?? "resourceserver", { authServerBaseUrl: issuer })], {
111
+ userStorage,
112
+ protectedEndpoints: {
113
+ "/getresource": { scope: ["read", "write"] }
114
+ },
115
+ });
116
+ fetchMocker.mockResponseOnce(JSON.stringify(oidcConfiguration));
117
+ await resserver.tokenConsumers[0].loadConfig();
118
+ fetchMocker.mockResponseOnce(JSON.stringify(authServer.jwks()));
119
+ await resserver.tokenConsumers[0].loadJwks();
120
+ // simulate a get request on the res server
121
+ // authorizationCodeFlow get endpoint
122
+ let getRequest = new Request(`http://resserver.com/getresource`, {
123
+ method: "GET",
124
+ headers: { "authorization": "Bearer " + access_token }
125
+ });
126
+ let event = new MockRequestEvent("1", getRequest, {});
127
+ expect(resserver.hook).toBeDefined();
128
+ if (!resserver.hook)
129
+ throw new Error("hook undefined");
130
+ await resserver.hook({ event: event });
131
+ expect(event.locals.user?.username).toBe("bob");
132
+ expect(event.locals.scope?.length).toBe(2);
133
+ let scopes = event.locals.scope ?? [];
134
+ expect(["read", "write"]).toContain(scopes[0]);
135
+ expect(["read", "write"]).toContain(scopes[1]);
136
+ // simulate an invalidget request on the res server
137
+ // authorizationCodeFlow get endpoint
138
+ getRequest = new Request(`http://resserver.com/getresource`, {
139
+ method: "GET",
140
+ headers: { "authorization": "Bearer " + access_token + "x" }
141
+ });
142
+ event = new MockRequestEvent("1", getRequest, {});
143
+ expect(resserver.hook).toBeDefined();
144
+ if (!resserver.hook)
145
+ throw new Error("hook undefined");
146
+ await resserver.hook({ event: event });
147
+ expect(event.locals.user).toBeUndefined();
148
+ expect(event.locals.scope).toBeUndefined();
149
+ });
150
+ test('SvelteKitOAuthResourceServer.hook_suburl', async () => {
151
+ // login using password flow
152
+ const { server, authServer, access_token, userStorage } = await oauthLogin();
153
+ if (server.oAuthClient)
154
+ await server.oAuthClient.loadConfig(oidcConfiguration);
155
+ const decodedAccessToken = await authServer.validAccessToken(access_token ?? "");
156
+ expect(decodedAccessToken).toBeDefined();
157
+ // create resource server
158
+ const issuer = process.env["CROSSAUTH_AUTH_SERVER_BASE_URL"] ?? "";
159
+ const resserver = new SvelteKitOAuthResourceServer([new OAuthTokenConsumer(process.env["CROSSAUTH_OAUTH_AUDIENCE"] ?? "resourceserver", { authServerBaseUrl: issuer })], {
160
+ userStorage,
161
+ protectedEndpoints: {
162
+ "/getresource": { scope: ["read", "write"], suburls: true }
163
+ },
164
+ });
165
+ fetchMocker.mockResponseOnce(JSON.stringify(oidcConfiguration));
166
+ await resserver.tokenConsumers[0].loadConfig();
167
+ fetchMocker.mockResponseOnce(JSON.stringify(authServer.jwks()));
168
+ await resserver.tokenConsumers[0].loadJwks();
169
+ // simulate a get request on the res server
170
+ // authorizationCodeFlow get endpoint
171
+ let getRequest = new Request(`http://resserver.com/getresource/x`, {
172
+ method: "GET",
173
+ headers: { "authorization": "Bearer " + access_token }
174
+ });
175
+ let event = new MockRequestEvent("1", getRequest, {});
176
+ expect(resserver.hook).toBeDefined();
177
+ if (!resserver.hook)
178
+ throw new Error("hook undefined");
179
+ await resserver.hook({ event: event });
180
+ expect(event.locals.user?.username).toBe("bob");
181
+ expect(event.locals.scope?.length).toBe(2);
182
+ let scopes = event.locals.scope ?? [];
183
+ expect(["read", "write"]).toContain(scopes[0]);
184
+ expect(["read", "write"]).toContain(scopes[1]);
185
+ });