@adonisjs/session 7.0.0-13 → 7.0.0-15
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/build/chunk-2X5L327N.js +28 -0
- package/build/chunk-2X5L327N.js.map +1 -0
- package/build/chunk-HIQQAMXD.js +133 -0
- package/build/chunk-HIQQAMXD.js.map +1 -0
- package/build/chunk-K4OSGJVW.js +402 -0
- package/build/chunk-K4OSGJVW.js.map +1 -0
- package/build/chunk-S6P3TBEK.js +85 -0
- package/build/chunk-S6P3TBEK.js.map +1 -0
- package/build/chunk-TE5JP3SX.js +151 -0
- package/build/chunk-TE5JP3SX.js.map +1 -0
- package/build/chunk-WBAYBMJJ.js +15 -0
- package/build/chunk-WBAYBMJJ.js.map +1 -0
- package/build/{stubs/config.stub → config/session.stub} +3 -1
- package/build/cookie-H7KRZB4T.js +56 -0
- package/build/cookie-H7KRZB4T.js.map +1 -0
- package/build/factories/main.js +50 -9
- package/build/factories/main.js.map +1 -0
- package/build/file-YO7C2QWO.js +112 -0
- package/build/file-YO7C2QWO.js.map +1 -0
- package/build/index.d.ts +0 -1
- package/build/index.js +16 -12
- package/build/index.js.map +1 -0
- package/build/providers/session_provider.js +51 -59
- package/build/providers/session_provider.js.map +1 -0
- package/build/redis-KDWIBKUQ.js +58 -0
- package/build/redis-KDWIBKUQ.js.map +1 -0
- package/build/src/client.js +9 -85
- package/build/src/client.js.map +1 -0
- package/build/src/plugins/edge.js +101 -91
- package/build/src/plugins/edge.js.map +1 -0
- package/build/src/plugins/japa/api_client.js +99 -140
- package/build/src/plugins/japa/api_client.js.map +1 -0
- package/build/src/plugins/japa/browser_client.js +82 -109
- package/build/src/plugins/japa/browser_client.js.map +1 -0
- package/build/src/session.d.ts +14 -5
- package/build/src/session_middleware.js +10 -58
- package/build/src/session_middleware.js.map +1 -0
- package/build/src/values_store.d.ts +7 -7
- package/package.json +60 -43
- package/build/configure.js +0 -45
- package/build/factories/session_middleware_factory.js +0 -48
- package/build/src/debug.js +0 -10
- package/build/src/define_config.js +0 -105
- package/build/src/errors.js +0 -17
- package/build/src/session.js +0 -387
- package/build/src/stores/cookie.js +0 -60
- package/build/src/stores/file.js +0 -133
- package/build/src/stores/memory.js +0 -33
- package/build/src/stores/redis.js +0 -66
- package/build/src/types.js +0 -9
- package/build/src/values_store.js +0 -159
- package/build/stubs/main.js +0 -10
|
@@ -1,141 +1,100 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
import
|
|
10
|
-
import {
|
|
11
|
-
import {
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
this.assert.deepEqual(this.flashMessage('errors')?.[field] || [], messages);
|
|
97
|
-
});
|
|
98
|
-
/**
|
|
99
|
-
* We define the hook using the "request.setup" method because we
|
|
100
|
-
* want to allow other Japa hooks to mutate the session store
|
|
101
|
-
* without running into race conditions
|
|
102
|
-
*/
|
|
103
|
-
ApiClient.onRequest((request) => {
|
|
104
|
-
request.setup(async () => {
|
|
105
|
-
/**
|
|
106
|
-
* Set cookie
|
|
107
|
-
*/
|
|
108
|
-
request.withCookie(config.cookieName, request.sessionClient.sessionId);
|
|
109
|
-
/**
|
|
110
|
-
* Persist data
|
|
111
|
-
*/
|
|
112
|
-
await request.sessionClient.commit();
|
|
113
|
-
/**
|
|
114
|
-
* Cleanup if request fails
|
|
115
|
-
*/
|
|
116
|
-
return async (error) => {
|
|
117
|
-
if (error) {
|
|
118
|
-
await request.sessionClient.destroy();
|
|
119
|
-
}
|
|
120
|
-
};
|
|
121
|
-
});
|
|
122
|
-
request.teardown(async (response) => {
|
|
123
|
-
const sessionId = response.cookie(config.cookieName);
|
|
124
|
-
/**
|
|
125
|
-
* Reading session data from the response cookie
|
|
126
|
-
*/
|
|
127
|
-
response.sessionBag = sessionId
|
|
128
|
-
? await response.request.sessionClient.load(sessionId.value)
|
|
129
|
-
: {
|
|
130
|
-
values: {},
|
|
131
|
-
flashMessages: {},
|
|
132
|
-
};
|
|
133
|
-
/**
|
|
134
|
-
* Cleanup state
|
|
135
|
-
*/
|
|
136
|
-
await request.sessionClient.destroy(sessionId?.value);
|
|
137
|
-
});
|
|
138
|
-
});
|
|
139
|
-
};
|
|
140
|
-
return pluginFn;
|
|
1
|
+
import {
|
|
2
|
+
SessionClient
|
|
3
|
+
} from "../../../chunk-S6P3TBEK.js";
|
|
4
|
+
import "../../../chunk-TE5JP3SX.js";
|
|
5
|
+
import "../../../chunk-WBAYBMJJ.js";
|
|
6
|
+
|
|
7
|
+
// src/plugins/japa/api_client.ts
|
|
8
|
+
import lodash from "@poppinss/utils/lodash";
|
|
9
|
+
import { configProvider } from "@adonisjs/core";
|
|
10
|
+
import { RuntimeException } from "@poppinss/utils";
|
|
11
|
+
import { ApiClient, ApiRequest, ApiResponse } from "@japa/api-client";
|
|
12
|
+
var sessionApiClient = (app) => {
|
|
13
|
+
const pluginFn = async function() {
|
|
14
|
+
const sessionConfigProvider = app.config.get("session", {});
|
|
15
|
+
const config = await configProvider.resolve(app, sessionConfigProvider);
|
|
16
|
+
if (!config) {
|
|
17
|
+
throw new RuntimeException(
|
|
18
|
+
'Invalid "config/session.ts" file. Make sure you are using the "defineConfig" method'
|
|
19
|
+
);
|
|
20
|
+
}
|
|
21
|
+
ApiRequest.getter(
|
|
22
|
+
"sessionClient",
|
|
23
|
+
function() {
|
|
24
|
+
return new SessionClient(config.stores.memory());
|
|
25
|
+
},
|
|
26
|
+
true
|
|
27
|
+
);
|
|
28
|
+
ApiRequest.macro("withSession", function(data) {
|
|
29
|
+
this.sessionClient.merge(data);
|
|
30
|
+
return this;
|
|
31
|
+
});
|
|
32
|
+
ApiRequest.macro("withFlashMessages", function(data) {
|
|
33
|
+
this.sessionClient.flash(data);
|
|
34
|
+
return this;
|
|
35
|
+
});
|
|
36
|
+
ApiResponse.macro("session", function(key) {
|
|
37
|
+
return key ? lodash.get(this.sessionBag.values, key) : this.sessionBag.values;
|
|
38
|
+
});
|
|
39
|
+
ApiResponse.macro("flashMessages", function() {
|
|
40
|
+
return this.sessionBag.flashMessages;
|
|
41
|
+
});
|
|
42
|
+
ApiResponse.macro("flashMessage", function(key) {
|
|
43
|
+
return lodash.get(this.sessionBag.flashMessages, key);
|
|
44
|
+
});
|
|
45
|
+
ApiResponse.macro("assertSession", function(key, value) {
|
|
46
|
+
this.assert.property(this.session(), key);
|
|
47
|
+
if (value !== void 0) {
|
|
48
|
+
this.assert.deepEqual(this.session(key), value);
|
|
49
|
+
}
|
|
50
|
+
});
|
|
51
|
+
ApiResponse.macro("assertSessionMissing", function(key) {
|
|
52
|
+
this.assert.notProperty(this.session(), key);
|
|
53
|
+
});
|
|
54
|
+
ApiResponse.macro("assertFlashMessage", function(key, value) {
|
|
55
|
+
this.assert.property(this.flashMessages(), key);
|
|
56
|
+
if (value !== void 0) {
|
|
57
|
+
this.assert.deepEqual(this.flashMessage(key), value);
|
|
58
|
+
}
|
|
59
|
+
});
|
|
60
|
+
ApiResponse.macro("assertFlashMissing", function(key) {
|
|
61
|
+
this.assert.notProperty(this.flashMessages(), key);
|
|
62
|
+
});
|
|
63
|
+
ApiResponse.macro("assertHasValidationError", function(field) {
|
|
64
|
+
this.assert.property(this.flashMessage("errors"), field);
|
|
65
|
+
});
|
|
66
|
+
ApiResponse.macro("assertDoesNotHaveValidationError", function(field) {
|
|
67
|
+
this.assert.notProperty(this.flashMessage("errors"), field);
|
|
68
|
+
});
|
|
69
|
+
ApiResponse.macro("assertValidationError", function(field, message) {
|
|
70
|
+
this.assert.include(this.flashMessage("errors")?.[field] || [], message);
|
|
71
|
+
});
|
|
72
|
+
ApiResponse.macro("assertValidationErrors", function(field, messages) {
|
|
73
|
+
this.assert.deepEqual(this.flashMessage("errors")?.[field] || [], messages);
|
|
74
|
+
});
|
|
75
|
+
ApiClient.onRequest((request) => {
|
|
76
|
+
request.setup(async () => {
|
|
77
|
+
request.withCookie(config.cookieName, request.sessionClient.sessionId);
|
|
78
|
+
await request.sessionClient.commit();
|
|
79
|
+
return async (error) => {
|
|
80
|
+
if (error) {
|
|
81
|
+
await request.sessionClient.destroy();
|
|
82
|
+
}
|
|
83
|
+
};
|
|
84
|
+
});
|
|
85
|
+
request.teardown(async (response) => {
|
|
86
|
+
const sessionId = response.cookie(config.cookieName);
|
|
87
|
+
response.sessionBag = sessionId ? await response.request.sessionClient.load(sessionId.value) : {
|
|
88
|
+
values: {},
|
|
89
|
+
flashMessages: {}
|
|
90
|
+
};
|
|
91
|
+
await request.sessionClient.destroy(sessionId?.value);
|
|
92
|
+
});
|
|
93
|
+
});
|
|
94
|
+
};
|
|
95
|
+
return pluginFn;
|
|
141
96
|
};
|
|
97
|
+
export {
|
|
98
|
+
sessionApiClient
|
|
99
|
+
};
|
|
100
|
+
//# sourceMappingURL=api_client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/plugins/japa/api_client.ts"],"sourcesContent":["/*\n * @adonisjs/session\n *\n * (c) AdonisJS\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nimport lodash from '@poppinss/utils/lodash'\nimport { configProvider } from '@adonisjs/core'\nimport { RuntimeException } from '@poppinss/utils'\nimport type { PluginFn } from '@japa/runner/types'\nimport type { ApplicationService } from '@adonisjs/core/types'\nimport { ApiClient, ApiRequest, ApiResponse } from '@japa/api-client'\n\nimport { SessionClient } from '../../client.js'\nimport type { SessionData } from '../../types.js'\n\ndeclare module '@japa/api-client' {\n export interface ApiRequest {\n sessionClient: SessionClient\n\n /**\n * Make HTTP request along with the provided session data\n */\n withSession(values: SessionData): this\n\n /**\n * Make HTTP request along with the provided session flash\n * messages.\n */\n withFlashMessages(values: SessionData): this\n }\n\n export interface ApiResponse {\n sessionBag: {\n values: SessionData\n flashMessages: SessionData\n }\n\n /**\n * Get session data from the HTTP response\n */\n session(key?: string): any\n\n /**\n * Get flash messages from the HTTP response\n */\n flashMessages(): SessionData\n\n /**\n * Get flash messages for a specific key from the HTTP response\n */\n flashMessage(key: string): SessionData\n\n /**\n * Assert session key-value pair exists\n */\n assertSession(key: string, value?: any): void\n\n /**\n * Assert key is missing in session store\n */\n assertSessionMissing(key: string): void\n\n /**\n * Assert flash message key-value pair exists\n */\n assertFlashMessage(key: string, value?: any): void\n\n /**\n * Assert key is missing flash messages store\n */\n assertFlashMissing(key: string): void\n\n /**\n * Assert flash messages has validation errors for\n * the given field\n */\n assertHasValidationError(field: string): void\n\n /**\n * Assert flash messages does not have validation errors\n * for the given field\n */\n assertDoesNotHaveValidationError(field: string): void\n\n /**\n * Assert error message for a given field\n */\n assertValidationError(field: string, message: string): void\n\n /**\n * Assert all error messages for a given field\n */\n assertValidationErrors(field: string, messages: string[]): void\n }\n}\n\n/**\n * Hooks AdonisJS Session with the Japa API client\n * plugin\n */\nexport const sessionApiClient = (app: ApplicationService) => {\n const pluginFn: PluginFn = async function () {\n const sessionConfigProvider = app.config.get('session', {})\n\n /**\n * Resolve config from the provider\n */\n const config = await configProvider.resolve<any>(app, sessionConfigProvider)\n if (!config) {\n throw new RuntimeException(\n 'Invalid \"config/session.ts\" file. Make sure you are using the \"defineConfig\" method'\n )\n }\n\n /**\n * Stick an singleton session client to APIRequest. The session\n * client is used to keep a track of session data we have\n * to send during the request.\n */\n ApiRequest.getter(\n 'sessionClient',\n function () {\n return new SessionClient(config.stores.memory())\n },\n true\n )\n\n /**\n * Define session data\n */\n ApiRequest.macro('withSession', function (this: ApiRequest, data) {\n this.sessionClient.merge(data)\n return this\n })\n\n /**\n * Define flash messages\n */\n ApiRequest.macro('withFlashMessages', function (this: ApiRequest, data) {\n this.sessionClient.flash(data)\n return this\n })\n\n /**\n * Get session data\n */\n ApiResponse.macro('session', function (this: ApiResponse, key) {\n return key ? lodash.get(this.sessionBag.values, key) : this.sessionBag.values\n })\n\n /**\n * Get flash messages\n */\n ApiResponse.macro('flashMessages', function (this: ApiResponse) {\n return this.sessionBag.flashMessages\n })\n ApiResponse.macro('flashMessage', function (this: ApiResponse, key) {\n return lodash.get(this.sessionBag.flashMessages, key)\n })\n\n /**\n * Response session assertions\n */\n ApiResponse.macro('assertSession', function (this: ApiResponse, key, value) {\n this.assert!.property(this.session(), key)\n if (value !== undefined) {\n this.assert!.deepEqual(this.session(key), value)\n }\n })\n ApiResponse.macro('assertSessionMissing', function (this: ApiResponse, key) {\n this.assert!.notProperty(this.session(), key)\n })\n ApiResponse.macro('assertFlashMessage', function (this: ApiResponse, key, value) {\n this.assert!.property(this.flashMessages(), key)\n if (value !== undefined) {\n this.assert!.deepEqual(this.flashMessage(key), value)\n }\n })\n ApiResponse.macro('assertFlashMissing', function (this: ApiResponse, key) {\n this.assert!.notProperty(this.flashMessages(), key)\n })\n ApiResponse.macro('assertHasValidationError', function (this: ApiResponse, field) {\n this.assert!.property(this.flashMessage('errors'), field)\n })\n ApiResponse.macro('assertDoesNotHaveValidationError', function (this: ApiResponse, field) {\n this.assert!.notProperty(this.flashMessage('errors'), field)\n })\n ApiResponse.macro('assertValidationError', function (this: ApiResponse, field, message) {\n this.assert!.include(this.flashMessage('errors')?.[field] || [], message)\n })\n ApiResponse.macro('assertValidationErrors', function (this: ApiResponse, field, messages) {\n this.assert!.deepEqual(this.flashMessage('errors')?.[field] || [], messages)\n })\n\n /**\n * We define the hook using the \"request.setup\" method because we\n * want to allow other Japa hooks to mutate the session store\n * without running into race conditions\n */\n ApiClient.onRequest((request) => {\n request.setup(async () => {\n /**\n * Set cookie\n */\n request.withCookie(config.cookieName, request.sessionClient.sessionId)\n\n /**\n * Persist data\n */\n await request.sessionClient.commit()\n\n /**\n * Cleanup if request fails\n */\n return async (error: any) => {\n if (error) {\n await request.sessionClient.destroy()\n }\n }\n })\n\n request.teardown(async (response) => {\n const sessionId = response.cookie(config.cookieName)\n\n /**\n * Reading session data from the response cookie\n */\n response.sessionBag = sessionId\n ? await response.request.sessionClient.load(sessionId.value)\n : {\n values: {},\n flashMessages: {},\n }\n\n /**\n * Cleanup state\n */\n await request.sessionClient.destroy(sessionId?.value)\n })\n })\n }\n\n return pluginFn\n}\n"],"mappings":"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","names":[]}
|
|
@@ -1,115 +1,88 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
import {
|
|
10
|
-
import {
|
|
11
|
-
import { decoratorsCollection } from '@japa/browser-client';
|
|
12
|
-
import { SessionClient } from '../../client.js';
|
|
13
|
-
/**
|
|
14
|
-
* Transforming AdonisJS same site option to playwright
|
|
15
|
-
* same site option.
|
|
16
|
-
*/
|
|
1
|
+
import {
|
|
2
|
+
SessionClient
|
|
3
|
+
} from "../../../chunk-S6P3TBEK.js";
|
|
4
|
+
import "../../../chunk-TE5JP3SX.js";
|
|
5
|
+
import "../../../chunk-WBAYBMJJ.js";
|
|
6
|
+
|
|
7
|
+
// src/plugins/japa/browser_client.ts
|
|
8
|
+
import { configProvider } from "@adonisjs/core";
|
|
9
|
+
import { RuntimeException } from "@poppinss/utils";
|
|
10
|
+
import { decoratorsCollection } from "@japa/browser-client";
|
|
17
11
|
function transformSameSiteOption(sameSite) {
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
12
|
+
if (!sameSite) {
|
|
13
|
+
return;
|
|
14
|
+
}
|
|
15
|
+
if (sameSite === true || sameSite === "strict") {
|
|
16
|
+
return "Strict";
|
|
17
|
+
}
|
|
18
|
+
if (sameSite === "lax") {
|
|
19
|
+
return "Lax";
|
|
20
|
+
}
|
|
21
|
+
if (sameSite === "none") {
|
|
22
|
+
return "None";
|
|
23
|
+
}
|
|
30
24
|
}
|
|
31
|
-
/**
|
|
32
|
-
* Transforming AdonisJS session config to playwright cookie options.
|
|
33
|
-
*/
|
|
34
25
|
function getSessionCookieOptions(config, cookieOptions) {
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
26
|
+
const options = { ...config.cookie, ...cookieOptions };
|
|
27
|
+
return {
|
|
28
|
+
...options,
|
|
29
|
+
expires: void 0,
|
|
30
|
+
sameSite: transformSameSiteOption(options.sameSite)
|
|
31
|
+
};
|
|
41
32
|
}
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
context
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
};
|
|
89
|
-
/**
|
|
90
|
-
* Set session data
|
|
91
|
-
*/
|
|
92
|
-
context.setSession = async function (values) {
|
|
93
|
-
await context.initiateSession();
|
|
94
|
-
context.sessionClient.merge(values);
|
|
95
|
-
await context.sessionClient.commit();
|
|
96
|
-
};
|
|
97
|
-
/**
|
|
98
|
-
* Set flash messages
|
|
99
|
-
*/
|
|
100
|
-
context.setFlashMessages = async function (values) {
|
|
101
|
-
await context.initiateSession();
|
|
102
|
-
context.sessionClient.flash(values);
|
|
103
|
-
await context.sessionClient.commit();
|
|
104
|
-
};
|
|
105
|
-
/**
|
|
106
|
-
* Destroy session when context is closed
|
|
107
|
-
*/
|
|
108
|
-
context.on('close', async function () {
|
|
109
|
-
await context.sessionClient.destroy();
|
|
110
|
-
});
|
|
111
|
-
},
|
|
33
|
+
var sessionBrowserClient = (app) => {
|
|
34
|
+
const pluginFn = async function() {
|
|
35
|
+
const sessionConfigProvider = app.config.get("session", {});
|
|
36
|
+
const config = await configProvider.resolve(app, sessionConfigProvider);
|
|
37
|
+
if (!config) {
|
|
38
|
+
throw new RuntimeException(
|
|
39
|
+
'Invalid "config/session.ts" file. Make sure you are using the "defineConfig" method'
|
|
40
|
+
);
|
|
41
|
+
}
|
|
42
|
+
decoratorsCollection.register({
|
|
43
|
+
context(context) {
|
|
44
|
+
context.sessionClient = new SessionClient(config.stores.memory());
|
|
45
|
+
context.initiateSession = async function(options) {
|
|
46
|
+
const sessionId = await context.getCookie(config.cookieName);
|
|
47
|
+
if (sessionId) {
|
|
48
|
+
context.sessionClient.sessionId = sessionId;
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
await context.setCookie(
|
|
52
|
+
config.cookieName,
|
|
53
|
+
context.sessionClient.sessionId,
|
|
54
|
+
getSessionCookieOptions(config, options)
|
|
55
|
+
);
|
|
56
|
+
};
|
|
57
|
+
context.getSession = async function() {
|
|
58
|
+
await context.initiateSession();
|
|
59
|
+
const sessionData = await context.sessionClient.load();
|
|
60
|
+
return sessionData.values;
|
|
61
|
+
};
|
|
62
|
+
context.getFlashMessages = async function() {
|
|
63
|
+
await context.initiateSession();
|
|
64
|
+
const sessionData = await context.sessionClient.load();
|
|
65
|
+
return sessionData.flashMessages;
|
|
66
|
+
};
|
|
67
|
+
context.setSession = async function(values) {
|
|
68
|
+
await context.initiateSession();
|
|
69
|
+
context.sessionClient.merge(values);
|
|
70
|
+
await context.sessionClient.commit();
|
|
71
|
+
};
|
|
72
|
+
context.setFlashMessages = async function(values) {
|
|
73
|
+
await context.initiateSession();
|
|
74
|
+
context.sessionClient.flash(values);
|
|
75
|
+
await context.sessionClient.commit();
|
|
76
|
+
};
|
|
77
|
+
context.on("close", async function() {
|
|
78
|
+
await context.sessionClient.destroy();
|
|
112
79
|
});
|
|
113
|
-
|
|
114
|
-
|
|
80
|
+
}
|
|
81
|
+
});
|
|
82
|
+
};
|
|
83
|
+
return pluginFn;
|
|
84
|
+
};
|
|
85
|
+
export {
|
|
86
|
+
sessionBrowserClient
|
|
115
87
|
};
|
|
88
|
+
//# sourceMappingURL=browser_client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/plugins/japa/browser_client.ts"],"sourcesContent":["/*\n * @adonisjs/session\n *\n * (c) AdonisJS\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nimport { configProvider } from '@adonisjs/core'\nimport { RuntimeException } from '@poppinss/utils'\nimport type { PluginFn } from '@japa/runner/types'\nimport { decoratorsCollection } from '@japa/browser-client'\nimport type { ApplicationService } from '@adonisjs/core/types'\nimport type { CookieOptions as AdonisCookieOptions } from '@adonisjs/core/types/http'\n\nimport { SessionClient } from '../../client.js'\nimport type { SessionConfig, SessionData } from '../../types.js'\n\ndeclare module 'playwright' {\n export interface BrowserContext {\n sessionClient: SessionClient\n\n /**\n * Initiate session. The session id cookie will be defined\n * if missing\n */\n initiateSession(options?: Partial<AdonisCookieOptions>): Promise<void>\n\n /**\n * Returns data from the session store\n */\n getSession(): Promise<any>\n\n /**\n * Returns data from the session store\n */\n getFlashMessages(): Promise<any>\n\n /**\n * Set session data\n */\n setSession(values: SessionData): Promise<void>\n\n /**\n * Set flash messages\n */\n setFlashMessages(values: SessionData): Promise<void>\n }\n}\n\n/**\n * Transforming AdonisJS same site option to playwright\n * same site option.\n */\nfunction transformSameSiteOption(sameSite?: AdonisCookieOptions['sameSite']) {\n if (!sameSite) {\n return\n }\n\n if (sameSite === true || sameSite === 'strict') {\n return 'Strict' as const\n }\n\n if (sameSite === 'lax') {\n return 'Lax' as const\n }\n\n if (sameSite === 'none') {\n return 'None' as const\n }\n}\n\n/**\n * Transforming AdonisJS session config to playwright cookie options.\n */\nfunction getSessionCookieOptions(\n config: SessionConfig,\n cookieOptions?: Partial<AdonisCookieOptions>\n) {\n const options = { ...config.cookie, ...cookieOptions }\n return {\n ...options,\n expires: undefined,\n sameSite: transformSameSiteOption(options.sameSite),\n }\n}\n\n/**\n * Hooks AdonisJS Session with the Japa browser client\n * plugin\n */\nexport const sessionBrowserClient = (app: ApplicationService) => {\n const pluginFn: PluginFn = async function () {\n const sessionConfigProvider = app.config.get('session', {})\n\n /**\n * Resolve config from the provider\n */\n const config = await configProvider.resolve<any>(app, sessionConfigProvider)\n if (!config) {\n throw new RuntimeException(\n 'Invalid \"config/session.ts\" file. Make sure you are using the \"defineConfig\" method'\n )\n }\n\n decoratorsCollection.register({\n context(context) {\n /**\n * Reference to session client per browser context\n */\n context.sessionClient = new SessionClient(config.stores.memory())\n\n /**\n * Initiating session store\n */\n context.initiateSession = async function (options) {\n const sessionId = await context.getCookie(config.cookieName)\n if (sessionId) {\n context.sessionClient.sessionId = sessionId\n return\n }\n\n await context.setCookie(\n config.cookieName,\n context.sessionClient.sessionId,\n getSessionCookieOptions(config, options)\n )\n }\n\n /**\n * Returns session data\n */\n context.getSession = async function () {\n await context.initiateSession()\n const sessionData = await context.sessionClient.load()\n return sessionData.values\n }\n\n /**\n * Returns flash messages from the data store\n */\n context.getFlashMessages = async function () {\n await context.initiateSession()\n const sessionData = await context.sessionClient.load()\n return sessionData.flashMessages\n }\n\n /**\n * Set session data\n */\n context.setSession = async function (values) {\n await context.initiateSession()\n context.sessionClient.merge(values)\n await context.sessionClient.commit()\n }\n\n /**\n * Set flash messages\n */\n context.setFlashMessages = async function (values) {\n await context.initiateSession()\n context.sessionClient.flash(values)\n await context.sessionClient.commit()\n }\n\n /**\n * Destroy session when context is closed\n */\n context.on('close', async function () {\n await context.sessionClient.destroy()\n })\n },\n })\n }\n\n return pluginFn\n}\n"],"mappings":";;;;;;;AASA,SAAS,sBAAsB;AAC/B,SAAS,wBAAwB;AAEjC,SAAS,4BAA4B;AA2CrC,SAAS,wBAAwB,UAA4C;AAC3E,MAAI,CAAC,UAAU;AACb;AAAA,EACF;AAEA,MAAI,aAAa,QAAQ,aAAa,UAAU;AAC9C,WAAO;AAAA,EACT;AAEA,MAAI,aAAa,OAAO;AACtB,WAAO;AAAA,EACT;AAEA,MAAI,aAAa,QAAQ;AACvB,WAAO;AAAA,EACT;AACF;AAKA,SAAS,wBACP,QACA,eACA;AACA,QAAM,UAAU,EAAE,GAAG,OAAO,QAAQ,GAAG,cAAc;AACrD,SAAO;AAAA,IACL,GAAG;AAAA,IACH,SAAS;AAAA,IACT,UAAU,wBAAwB,QAAQ,QAAQ;AAAA,EACpD;AACF;AAMO,IAAM,uBAAuB,CAAC,QAA4B;AAC/D,QAAM,WAAqB,iBAAkB;AAC3C,UAAM,wBAAwB,IAAI,OAAO,IAAI,WAAW,CAAC,CAAC;AAK1D,UAAM,SAAS,MAAM,eAAe,QAAa,KAAK,qBAAqB;AAC3E,QAAI,CAAC,QAAQ;AACX,YAAM,IAAI;AAAA,QACR;AAAA,MACF;AAAA,IACF;AAEA,yBAAqB,SAAS;AAAA,MAC5B,QAAQ,SAAS;AAIf,gBAAQ,gBAAgB,IAAI,cAAc,OAAO,OAAO,OAAO,CAAC;AAKhE,gBAAQ,kBAAkB,eAAgB,SAAS;AACjD,gBAAM,YAAY,MAAM,QAAQ,UAAU,OAAO,UAAU;AAC3D,cAAI,WAAW;AACb,oBAAQ,cAAc,YAAY;AAClC;AAAA,UACF;AAEA,gBAAM,QAAQ;AAAA,YACZ,OAAO;AAAA,YACP,QAAQ,cAAc;AAAA,YACtB,wBAAwB,QAAQ,OAAO;AAAA,UACzC;AAAA,QACF;AAKA,gBAAQ,aAAa,iBAAkB;AACrC,gBAAM,QAAQ,gBAAgB;AAC9B,gBAAM,cAAc,MAAM,QAAQ,cAAc,KAAK;AACrD,iBAAO,YAAY;AAAA,QACrB;AAKA,gBAAQ,mBAAmB,iBAAkB;AAC3C,gBAAM,QAAQ,gBAAgB;AAC9B,gBAAM,cAAc,MAAM,QAAQ,cAAc,KAAK;AACrD,iBAAO,YAAY;AAAA,QACrB;AAKA,gBAAQ,aAAa,eAAgB,QAAQ;AAC3C,gBAAM,QAAQ,gBAAgB;AAC9B,kBAAQ,cAAc,MAAM,MAAM;AAClC,gBAAM,QAAQ,cAAc,OAAO;AAAA,QACrC;AAKA,gBAAQ,mBAAmB,eAAgB,QAAQ;AACjD,gBAAM,QAAQ,gBAAgB;AAC9B,kBAAQ,cAAc,MAAM,MAAM;AAClC,gBAAM,QAAQ,cAAc,OAAO;AAAA,QACrC;AAKA,gBAAQ,GAAG,SAAS,iBAAkB;AACpC,gBAAM,QAAQ,cAAc,QAAQ;AAAA,QACtC,CAAC;AAAA,MACH;AAAA,IACF,CAAC;AAAA,EACH;AAEA,SAAO;AACT;","names":[]}
|
package/build/src/session.d.ts
CHANGED
|
@@ -111,16 +111,25 @@ export declare class Session {
|
|
|
111
111
|
* Empty the session store
|
|
112
112
|
*/
|
|
113
113
|
clear(): void;
|
|
114
|
-
/**
|
|
115
|
-
* Flash validation error messages. Make sure the error
|
|
116
|
-
* is an instance of VineJS ValidationException
|
|
117
|
-
*/
|
|
118
|
-
flashValidationErrors(error: HttpError): void;
|
|
119
114
|
/**
|
|
120
115
|
* Add a key-value pair to flash messages
|
|
121
116
|
*/
|
|
122
117
|
flash(key: string, value: AllowedSessionValues): void;
|
|
123
118
|
flash(keyValue: SessionData): void;
|
|
119
|
+
/**
|
|
120
|
+
* Flash errors to the errorsBag. You can read these
|
|
121
|
+
* errors via the "@error" tag.
|
|
122
|
+
*
|
|
123
|
+
* Appends new messages to the existing collection.
|
|
124
|
+
*/
|
|
125
|
+
flashErrors(errorsCollection: Record<string, string | string[]>): void;
|
|
126
|
+
/**
|
|
127
|
+
* Flash validation error messages. Make sure the error
|
|
128
|
+
* is an instance of VineJS ValidationException.
|
|
129
|
+
*
|
|
130
|
+
* Overrides existing inputErrors
|
|
131
|
+
*/
|
|
132
|
+
flashValidationErrors(error: HttpError): void;
|
|
124
133
|
/**
|
|
125
134
|
* Flash form input data to the flash messages store
|
|
126
135
|
*/
|
|
@@ -1,58 +1,10 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
/**
|
|
12
|
-
* Overwriting validation exception renderer
|
|
13
|
-
*/
|
|
14
|
-
const originalErrorHandler = ExceptionHandler.prototype.renderValidationErrorAsHTML;
|
|
15
|
-
ExceptionHandler.macro('renderValidationErrorAsHTML', async function (error, ctx) {
|
|
16
|
-
if (ctx.session) {
|
|
17
|
-
ctx.session.flashValidationErrors(error);
|
|
18
|
-
ctx.response.redirect('back', true);
|
|
19
|
-
}
|
|
20
|
-
else {
|
|
21
|
-
return originalErrorHandler(error, ctx);
|
|
22
|
-
}
|
|
23
|
-
});
|
|
24
|
-
/**
|
|
25
|
-
* Session middleware is used to initiate the session store
|
|
26
|
-
* and commit its values during an HTTP request
|
|
27
|
-
*/
|
|
28
|
-
export default class SessionMiddleware {
|
|
29
|
-
#config;
|
|
30
|
-
#emitter;
|
|
31
|
-
constructor(config, emitter) {
|
|
32
|
-
this.#config = config;
|
|
33
|
-
this.#emitter = emitter;
|
|
34
|
-
}
|
|
35
|
-
async handle(ctx, next) {
|
|
36
|
-
if (!this.#config.enabled) {
|
|
37
|
-
return next();
|
|
38
|
-
}
|
|
39
|
-
ctx.session = new Session(this.#config, this.#config.stores[this.#config.store], // reference to store factory
|
|
40
|
-
this.#emitter, ctx);
|
|
41
|
-
/**
|
|
42
|
-
* Initiate session store
|
|
43
|
-
*/
|
|
44
|
-
await ctx.session.initiate(false);
|
|
45
|
-
/**
|
|
46
|
-
* Call next middlewares or route handler
|
|
47
|
-
*/
|
|
48
|
-
const response = await next();
|
|
49
|
-
/**
|
|
50
|
-
* Commit store mutations
|
|
51
|
-
*/
|
|
52
|
-
await ctx.session.commit();
|
|
53
|
-
/**
|
|
54
|
-
* Return response
|
|
55
|
-
*/
|
|
56
|
-
return response;
|
|
57
|
-
}
|
|
58
|
-
}
|
|
1
|
+
import {
|
|
2
|
+
SessionMiddleware
|
|
3
|
+
} from "../chunk-K4OSGJVW.js";
|
|
4
|
+
import "../chunk-2X5L327N.js";
|
|
5
|
+
import "../chunk-TE5JP3SX.js";
|
|
6
|
+
import "../chunk-WBAYBMJJ.js";
|
|
7
|
+
export {
|
|
8
|
+
SessionMiddleware as default
|
|
9
|
+
};
|
|
10
|
+
//# sourceMappingURL=session_middleware.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
|
@@ -15,12 +15,12 @@ export declare class ReadOnlyValuesStore {
|
|
|
15
15
|
/**
|
|
16
16
|
* Get value for a given key
|
|
17
17
|
*/
|
|
18
|
-
get(key: string, defaultValue?: any): any;
|
|
18
|
+
get(key: string | string[], defaultValue?: any): any;
|
|
19
19
|
/**
|
|
20
20
|
* A boolean to know if value exists. Extra guards to check
|
|
21
21
|
* arrays for it's length as well.
|
|
22
22
|
*/
|
|
23
|
-
has(key: string, checkForArraysLength?: boolean): boolean;
|
|
23
|
+
has(key: string | string[], checkForArraysLength?: boolean): boolean;
|
|
24
24
|
/**
|
|
25
25
|
* Get all values
|
|
26
26
|
*/
|
|
@@ -52,26 +52,26 @@ export declare class ValuesStore extends ReadOnlyValuesStore {
|
|
|
52
52
|
/**
|
|
53
53
|
* Set key/value pair
|
|
54
54
|
*/
|
|
55
|
-
set(key: string, value: AllowedSessionValues): void;
|
|
55
|
+
set(key: string | string[], value: AllowedSessionValues): void;
|
|
56
56
|
/**
|
|
57
57
|
* Remove key
|
|
58
58
|
*/
|
|
59
|
-
unset(key: string): void;
|
|
59
|
+
unset(key: string | string[]): void;
|
|
60
60
|
/**
|
|
61
61
|
* Pull value from the store. It is same as calling
|
|
62
62
|
* store.get and then store.unset
|
|
63
63
|
*/
|
|
64
|
-
pull(key: string, defaultValue?: any): any;
|
|
64
|
+
pull(key: string | string[], defaultValue?: any): any;
|
|
65
65
|
/**
|
|
66
66
|
* Increment number. The method raises an error when
|
|
67
67
|
* nderlying value is not a number
|
|
68
68
|
*/
|
|
69
|
-
increment(key: string, steps?: number): void;
|
|
69
|
+
increment(key: string | string[], steps?: number): void;
|
|
70
70
|
/**
|
|
71
71
|
* Increment number. The method raises an error when
|
|
72
72
|
* nderlying value is not a number
|
|
73
73
|
*/
|
|
74
|
-
decrement(key: string, steps?: number): void;
|
|
74
|
+
decrement(key: string | string[], steps?: number): void;
|
|
75
75
|
/**
|
|
76
76
|
* Overwrite existing store data with new values.
|
|
77
77
|
*/
|