@shrub/express-session 0.5.26
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/LICENSE +21 -0
- package/dist/cookie-session.d.ts +26 -0
- package/dist/cookie-session.js +113 -0
- package/dist/esm/cookie-session.js +109 -0
- package/dist/esm/index.js +5 -0
- package/dist/esm/middleware.js +25 -0
- package/dist/esm/module.js +34 -0
- package/dist/esm/session.js +2 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.js +17 -0
- package/dist/middleware.d.ts +14 -0
- package/dist/middleware.js +30 -0
- package/dist/module.d.ts +19 -0
- package/dist/module.js +38 -0
- package/dist/session.d.ts +21 -0
- package/dist/session.js +3 -0
- package/package.json +37 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2019 jjvainav
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { ICookies } from "@shrub/express-cookies";
|
|
2
|
+
import { ISession, ISessionOptions, ISessionValueCollection } from "./session";
|
|
3
|
+
export declare const ICookieSessionOptions: import("@shrub/core").IOptions<ICookieSessionOptions>;
|
|
4
|
+
export interface ICookieSessionOptions extends ISessionOptions {
|
|
5
|
+
/** The name of the cookie used for a session; the default is '_sess'. */
|
|
6
|
+
readonly cookieName?: string;
|
|
7
|
+
/** True if the session is only used with a secure connection; the default is true. */
|
|
8
|
+
readonly secure?: boolean;
|
|
9
|
+
/** True if the session values should be signed to detect tampering; the default is true. */
|
|
10
|
+
readonly signed?: boolean;
|
|
11
|
+
}
|
|
12
|
+
export declare class CookieSession implements ISession {
|
|
13
|
+
private readonly context;
|
|
14
|
+
private readonly cookie;
|
|
15
|
+
private pendingDelete?;
|
|
16
|
+
constructor(cookies: ICookies, options: ICookieSessionOptions);
|
|
17
|
+
get maxAge(): number | undefined;
|
|
18
|
+
set maxAge(value: number | undefined);
|
|
19
|
+
get values(): ISessionValueCollection;
|
|
20
|
+
delete(): void;
|
|
21
|
+
keepAlive(): void;
|
|
22
|
+
saveChanges(): void;
|
|
23
|
+
static isCookieSession(session: ISession): session is CookieSession;
|
|
24
|
+
private decode;
|
|
25
|
+
private encode;
|
|
26
|
+
}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.CookieSession = exports.ICookieSessionOptions = void 0;
|
|
4
|
+
const core_1 = require("@shrub/core");
|
|
5
|
+
exports.ICookieSessionOptions = core_1.createOptions("cookie-session");
|
|
6
|
+
const defaultSecure = true;
|
|
7
|
+
const defaultSigned = true;
|
|
8
|
+
const defaultCookieName = "_sess";
|
|
9
|
+
class CookieSession {
|
|
10
|
+
constructor(cookies, options) {
|
|
11
|
+
this.context = new SessionContext();
|
|
12
|
+
this.cookie = cookies.get(options.cookieName || defaultCookieName, {
|
|
13
|
+
signed: options.signed !== undefined ? options.signed : defaultSigned
|
|
14
|
+
});
|
|
15
|
+
this.cookie.options.httpOnly = true;
|
|
16
|
+
this.cookie.options.secure = options.secure !== undefined ? options.secure : defaultSecure;
|
|
17
|
+
this.cookie.options.signed = options.signed !== undefined ? options.signed : defaultSigned;
|
|
18
|
+
// set the maxAge against the context because the maxAge option is read/write
|
|
19
|
+
this.context.maxAge = options.maxAge;
|
|
20
|
+
if (this.cookie.value) {
|
|
21
|
+
this.context.load(this.decode(this.cookie.value));
|
|
22
|
+
}
|
|
23
|
+
this.context.acceptChanges();
|
|
24
|
+
}
|
|
25
|
+
get maxAge() {
|
|
26
|
+
return this.context.maxAge;
|
|
27
|
+
}
|
|
28
|
+
set maxAge(value) {
|
|
29
|
+
this.context.maxAge = value;
|
|
30
|
+
}
|
|
31
|
+
get values() {
|
|
32
|
+
return this.context.values;
|
|
33
|
+
}
|
|
34
|
+
delete() {
|
|
35
|
+
this.pendingDelete = true;
|
|
36
|
+
}
|
|
37
|
+
keepAlive() {
|
|
38
|
+
this.context.keepAlive();
|
|
39
|
+
}
|
|
40
|
+
saveChanges() {
|
|
41
|
+
if (this.context.isEmpty || this.pendingDelete) {
|
|
42
|
+
// only need to delete if the session is not new
|
|
43
|
+
if (!this.context.isNew) {
|
|
44
|
+
this.cookie.delete();
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
else if (this.context.hasChanges) {
|
|
48
|
+
this.cookie.options.maxAge = this.context.maxAge;
|
|
49
|
+
this.cookie.set(this.encode(this.context.values));
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
static isCookieSession(session) {
|
|
53
|
+
return Object.getPrototypeOf(session).constructor === CookieSession;
|
|
54
|
+
}
|
|
55
|
+
decode(value) {
|
|
56
|
+
return JSON.parse(Buffer.from(value, "base64").toString("utf8"));
|
|
57
|
+
}
|
|
58
|
+
encode(obj) {
|
|
59
|
+
return Buffer.from(JSON.stringify(obj)).toString("base64");
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
exports.CookieSession = CookieSession;
|
|
63
|
+
class SessionContext {
|
|
64
|
+
constructor() {
|
|
65
|
+
this._isNew = true;
|
|
66
|
+
this._hasChanges = false;
|
|
67
|
+
this.values = (function (self) {
|
|
68
|
+
return new Proxy({}, {
|
|
69
|
+
set: function (target, prop, value) {
|
|
70
|
+
if (value === undefined || value === "") {
|
|
71
|
+
// physically delete the property so that the context can properly detect if the value collection is truely empty or not
|
|
72
|
+
delete target[prop];
|
|
73
|
+
}
|
|
74
|
+
else {
|
|
75
|
+
target[prop] = value;
|
|
76
|
+
}
|
|
77
|
+
self._hasChanges = true;
|
|
78
|
+
return true;
|
|
79
|
+
}
|
|
80
|
+
});
|
|
81
|
+
})(this);
|
|
82
|
+
}
|
|
83
|
+
get maxAge() {
|
|
84
|
+
return this._maxAge;
|
|
85
|
+
}
|
|
86
|
+
set maxAge(value) {
|
|
87
|
+
if (this._maxAge !== value) {
|
|
88
|
+
this._maxAge = value;
|
|
89
|
+
this._hasChanges = true;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
get isEmpty() {
|
|
93
|
+
return Object.keys(this.values).length === 0;
|
|
94
|
+
}
|
|
95
|
+
get isNew() {
|
|
96
|
+
return this._isNew;
|
|
97
|
+
}
|
|
98
|
+
get hasChanges() {
|
|
99
|
+
return this._hasChanges;
|
|
100
|
+
}
|
|
101
|
+
acceptChanges() {
|
|
102
|
+
this._hasChanges = false;
|
|
103
|
+
}
|
|
104
|
+
keepAlive() {
|
|
105
|
+
this._hasChanges = true;
|
|
106
|
+
}
|
|
107
|
+
load(values) {
|
|
108
|
+
Object.assign(this.values, values);
|
|
109
|
+
this.acceptChanges();
|
|
110
|
+
this._isNew = false;
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29va2llLXNlc3Npb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvY29va2llLXNlc3Npb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsc0NBQTRDO0FBSS9CLFFBQUEscUJBQXFCLEdBQUcsb0JBQWEsQ0FBd0IsZ0JBQWdCLENBQUMsQ0FBQztBQVc1RixNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUM7QUFDM0IsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDO0FBQzNCLE1BQU0saUJBQWlCLEdBQUcsT0FBTyxDQUFDO0FBRWxDLE1BQWEsYUFBYTtJQUt0QixZQUFZLE9BQWlCLEVBQUUsT0FBOEI7UUFKNUMsWUFBTyxHQUFHLElBQUksY0FBYyxFQUFFLENBQUM7UUFLNUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxVQUFVLElBQUksaUJBQWlCLEVBQUU7WUFDL0QsTUFBTSxFQUFFLE9BQU8sQ0FBQyxNQUFNLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxhQUFhO1NBQ3hFLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUM7UUFDcEMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxHQUFHLE9BQU8sQ0FBQyxNQUFNLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUM7UUFDM0YsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxHQUFHLE9BQU8sQ0FBQyxNQUFNLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUM7UUFFM0YsNkVBQTZFO1FBQzdFLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxHQUFH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
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import { createOptions } from "@shrub/core";
|
|
2
|
+
export const ICookieSessionOptions = createOptions("cookie-session");
|
|
3
|
+
const defaultSecure = true;
|
|
4
|
+
const defaultSigned = true;
|
|
5
|
+
const defaultCookieName = "_sess";
|
|
6
|
+
export class CookieSession {
|
|
7
|
+
constructor(cookies, options) {
|
|
8
|
+
this.context = new SessionContext();
|
|
9
|
+
this.cookie = cookies.get(options.cookieName || defaultCookieName, {
|
|
10
|
+
signed: options.signed !== undefined ? options.signed : defaultSigned
|
|
11
|
+
});
|
|
12
|
+
this.cookie.options.httpOnly = true;
|
|
13
|
+
this.cookie.options.secure = options.secure !== undefined ? options.secure : defaultSecure;
|
|
14
|
+
this.cookie.options.signed = options.signed !== undefined ? options.signed : defaultSigned;
|
|
15
|
+
// set the maxAge against the context because the maxAge option is read/write
|
|
16
|
+
this.context.maxAge = options.maxAge;
|
|
17
|
+
if (this.cookie.value) {
|
|
18
|
+
this.context.load(this.decode(this.cookie.value));
|
|
19
|
+
}
|
|
20
|
+
this.context.acceptChanges();
|
|
21
|
+
}
|
|
22
|
+
get maxAge() {
|
|
23
|
+
return this.context.maxAge;
|
|
24
|
+
}
|
|
25
|
+
set maxAge(value) {
|
|
26
|
+
this.context.maxAge = value;
|
|
27
|
+
}
|
|
28
|
+
get values() {
|
|
29
|
+
return this.context.values;
|
|
30
|
+
}
|
|
31
|
+
delete() {
|
|
32
|
+
this.pendingDelete = true;
|
|
33
|
+
}
|
|
34
|
+
keepAlive() {
|
|
35
|
+
this.context.keepAlive();
|
|
36
|
+
}
|
|
37
|
+
saveChanges() {
|
|
38
|
+
if (this.context.isEmpty || this.pendingDelete) {
|
|
39
|
+
// only need to delete if the session is not new
|
|
40
|
+
if (!this.context.isNew) {
|
|
41
|
+
this.cookie.delete();
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
else if (this.context.hasChanges) {
|
|
45
|
+
this.cookie.options.maxAge = this.context.maxAge;
|
|
46
|
+
this.cookie.set(this.encode(this.context.values));
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
static isCookieSession(session) {
|
|
50
|
+
return Object.getPrototypeOf(session).constructor === CookieSession;
|
|
51
|
+
}
|
|
52
|
+
decode(value) {
|
|
53
|
+
return JSON.parse(Buffer.from(value, "base64").toString("utf8"));
|
|
54
|
+
}
|
|
55
|
+
encode(obj) {
|
|
56
|
+
return Buffer.from(JSON.stringify(obj)).toString("base64");
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
class SessionContext {
|
|
60
|
+
constructor() {
|
|
61
|
+
this._isNew = true;
|
|
62
|
+
this._hasChanges = false;
|
|
63
|
+
this.values = (function (self) {
|
|
64
|
+
return new Proxy({}, {
|
|
65
|
+
set: function (target, prop, value) {
|
|
66
|
+
if (value === undefined || value === "") {
|
|
67
|
+
// physically delete the property so that the context can properly detect if the value collection is truely empty or not
|
|
68
|
+
delete target[prop];
|
|
69
|
+
}
|
|
70
|
+
else {
|
|
71
|
+
target[prop] = value;
|
|
72
|
+
}
|
|
73
|
+
self._hasChanges = true;
|
|
74
|
+
return true;
|
|
75
|
+
}
|
|
76
|
+
});
|
|
77
|
+
})(this);
|
|
78
|
+
}
|
|
79
|
+
get maxAge() {
|
|
80
|
+
return this._maxAge;
|
|
81
|
+
}
|
|
82
|
+
set maxAge(value) {
|
|
83
|
+
if (this._maxAge !== value) {
|
|
84
|
+
this._maxAge = value;
|
|
85
|
+
this._hasChanges = true;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
get isEmpty() {
|
|
89
|
+
return Object.keys(this.values).length === 0;
|
|
90
|
+
}
|
|
91
|
+
get isNew() {
|
|
92
|
+
return this._isNew;
|
|
93
|
+
}
|
|
94
|
+
get hasChanges() {
|
|
95
|
+
return this._hasChanges;
|
|
96
|
+
}
|
|
97
|
+
acceptChanges() {
|
|
98
|
+
this._hasChanges = false;
|
|
99
|
+
}
|
|
100
|
+
keepAlive() {
|
|
101
|
+
this._hasChanges = true;
|
|
102
|
+
}
|
|
103
|
+
load(values) {
|
|
104
|
+
Object.assign(this.values, values);
|
|
105
|
+
this.acceptChanges();
|
|
106
|
+
this._isNew = false;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29va2llLXNlc3Npb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY29va2llLXNlc3Npb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUk1QyxNQUFNLENBQUMsTUFBTSxxQkFBcUIsR0FBRyxhQUFhLENBQXdCLGdCQUFnQixDQUFDLENBQUM7QUFXNUYsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDO0FBQzNCLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQztBQUMzQixNQUFNLGlCQUFpQixHQUFHLE9BQU8sQ0FBQztBQUVsQyxNQUFNLE9BQU8sYUFBYTtJQUt0QixZQUFZLE9BQWlCLEVBQUUsT0FBOEI7UUFKNUMsWUFBTyxHQUFHLElBQUksY0FBYyxFQUFFLENBQUM7UUFLNUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxVQUFVLElBQUksaUJBQWlCLEVBQUU7WUFDL0QsTUFBTSxFQUFFLE9BQU8sQ0FBQyxNQUFNLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxhQUFhO1NBQ3hFLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUM7UUFDcEMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxHQUFHLE9BQU8sQ0FBQyxNQUFNLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUM7UUFDM0YsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxHQUFHLE9BQU8sQ0FBQyxNQUFNLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUM7UUFFM0Ys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
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
// this is needed for the IRequestContext extensions
|
|
2
|
+
import "./middleware";
|
|
3
|
+
export * from "./module";
|
|
4
|
+
export * from "./session";
|
|
5
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsb0RBQW9EO0FBQ3BELE9BQU8sY0FBYyxDQUFDO0FBQ3RCLGNBQWMsVUFBVSxDQUFDO0FBQ3pCLGNBQWMsV0FBVyxDQUFDIn0=
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { CookieSession } from "./cookie-session";
|
|
2
|
+
/** @internal */
|
|
3
|
+
export const addCookieSessionRequestBuilder = (context, options) => {
|
|
4
|
+
if (context.session) {
|
|
5
|
+
throw new Error("A Session is already in use.");
|
|
6
|
+
}
|
|
7
|
+
if (!context.cookies) {
|
|
8
|
+
throw new Error("Cookies must be installed.");
|
|
9
|
+
}
|
|
10
|
+
context = { ...context, session: new CookieSession(context.cookies, options) };
|
|
11
|
+
return context;
|
|
12
|
+
};
|
|
13
|
+
export function cookieSession(options) {
|
|
14
|
+
return (req, res, next) => {
|
|
15
|
+
const session = req.contextBuilder.addCookieSession(options).instance().session;
|
|
16
|
+
const ref = res.writeHead;
|
|
17
|
+
res.writeHead = function writeHead() {
|
|
18
|
+
// gets invoked just before writing headers
|
|
19
|
+
session.saveChanges();
|
|
20
|
+
return ref.apply(res, arguments);
|
|
21
|
+
};
|
|
22
|
+
next();
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWlkZGxld2FyZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9taWRkbGV3YXJlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBLE9BQU8sRUFBRSxhQUFhLEVBQXlCLE1BQU0sa0JBQWtCLENBQUM7QUFleEUsZ0JBQWdCO0FBQ2hCLE1BQU0sQ0FBQyxNQUFNLDhCQUE4QixHQUFHLENBQUMsT0FBd0IsRUFBRSxPQUE4QixFQUFFLEVBQUU7SUFDdkcsSUFBSSxPQUFPLENBQUMsT0FBTyxFQUFFO1FBQ2pCLE1BQU0sSUFBSSxLQUFLLENBQUMsOEJBQThCLENBQUMsQ0FBQztLQUNuRDtJQUVELElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFO1FBQ2xCLE1BQU0sSUFBSSxLQUFLLENBQUMsNEJBQTRCLENBQUMsQ0FBQztLQUNqRDtJQUVELE9BQU8sR0FBb0IsRUFBRSxHQUFHLE9BQU8sRUFBRSxPQUFPLEVBQUUsSUFBSSxhQUFhLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUMsRUFBRSxDQUFDO0lBRWhHLE9BQU8sT0FBTyxDQUFDO0FBQ25CLENBQUMsQ0FBQztBQUVGLE1BQU0sVUFBVSxhQUFhLENBQUMsT0FBOEI7SUFDeEQsT0FBTyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLEVBQUU7UUFDdEIsTUFBTSxPQUFPLEdBQWtCLEdBQUcsQ0FBQyxjQUFjLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUMsT0FBTyxDQUFDO1FBQy9GLE1BQU0sR0FBRyxHQUFHLEdBQUcsQ0FBQyxTQUFTLENBQUM7UUFFMUIsR0FBRyxDQUFDLFNBQVMsR0FBRyxTQUFTLFNBQVM7WUFDOUIsMkNBQTJDO1lBQzNDLE9BQU8sQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUN0QixPQUFPLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLFNBQWdCLENBQUMsQ0FBQztRQUM1QyxDQUFDLENBQUM7UUFFRixJQUFJLEVBQUUsQ0FBQztJQUNYLENBQUMsQ0FBQTtBQUNMLENBQUMifQ==
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { createConfig, IOptionsService } from "@shrub/core";
|
|
2
|
+
import { ExpressModule, IExpressConfiguration } from "@shrub/express";
|
|
3
|
+
import { ExpressCookiesModule } from "@shrub/express-cookies";
|
|
4
|
+
import { ICookieSessionOptions } from "./cookie-session";
|
|
5
|
+
import { addCookieSessionRequestBuilder, cookieSession } from "./middleware";
|
|
6
|
+
export const IExpressSessionConfiguration = createConfig();
|
|
7
|
+
export class ExpressSessionModule {
|
|
8
|
+
constructor() {
|
|
9
|
+
this.name = "express-session";
|
|
10
|
+
this.dependencies = [
|
|
11
|
+
ExpressCookiesModule,
|
|
12
|
+
ExpressModule
|
|
13
|
+
];
|
|
14
|
+
}
|
|
15
|
+
initialize({ config, settings }) {
|
|
16
|
+
settings.bindToOptions(ICookieSessionOptions);
|
|
17
|
+
config(IExpressSessionConfiguration).register(({ services }) => ({
|
|
18
|
+
useCookieSession: options => {
|
|
19
|
+
if (this.middleware) {
|
|
20
|
+
throw new Error("Cookie session has already been initialized.");
|
|
21
|
+
}
|
|
22
|
+
options = options || services.get(IOptionsService).getOptions(ICookieSessionOptions);
|
|
23
|
+
this.middleware = cookieSession(options);
|
|
24
|
+
}
|
|
25
|
+
}));
|
|
26
|
+
}
|
|
27
|
+
configure({ config }) {
|
|
28
|
+
config.get(IExpressConfiguration).useRequestBuilder("addCookieSession", addCookieSessionRequestBuilder);
|
|
29
|
+
config.get(IExpressConfiguration).use((req, res, next) => {
|
|
30
|
+
return this.middleware ? this.middleware(req, res, next) : next();
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kdWxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL21vZHVsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFvRCxlQUFlLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDOUcsT0FBTyxFQUFFLGFBQWEsRUFBRSxxQkFBcUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3RFLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBRTlELE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ3pELE9BQU8sRUFBRSw4QkFBOEIsRUFBRSxhQUFhLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFFN0UsTUFBTSxDQUFDLE1BQU0sNEJBQTRCLEdBQUcsWUFBWSxFQUFnQyxDQUFDO0FBU3pGLE1BQU0sT0FBTyxvQkFBb0I7SUFBakM7UUFHYSxTQUFJLEdBQUcsaUJBQWlCLENBQUM7UUFDekIsaUJBQVksR0FBRztZQUNwQixvQkFBb0I7WUFDcEIsYUFBYTtTQUNoQixDQUFDO0lBc0JOLENBQUM7SUFwQkcsVUFBVSxDQUFDLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBc0I7UUFDL0MsUUFBUSxDQUFDLGFBQWEsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO1FBQzlDLE1BQU0sQ0FBQyw0QkFBNEIsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsUUFBUSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDN0QsZ0JBQWdCLEVBQUUsT0FBTyxDQUFDLEVBQUU7Z0JBQ3hCLElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRTtvQkFDakIsTUFBTSxJQUFJLEtBQUssQ0FBQyw4Q0FBOEMsQ0FBQyxDQUFDO2lCQUNuRTtnQkFFRCxPQUFPLEdBQUcsT0FBTyxJQUFJLFFBQVEsQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDLENBQUMsVUFBVSxDQUFDLHFCQUFxQixDQUFDLENBQUM7Z0JBQ3JGLElBQUksQ0FBQyxVQUFVLEdBQUcsYUFBYSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQzdDLENBQUM7U0FDSixDQUFDLENBQUMsQ0FBQztJQUNSLENBQUM7SUFFRCxTQUFTLENBQUMsRUFBRSxNQUFNLEVBQXVCO1FBQ3JDLE1BQU0sQ0FBQyxHQUFHLENBQUMscUJBQXFCLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxrQkFBa0IsRUFBRSw4QkFBOEIsQ0FBQyxDQUFDO1FBQ3hHLE1BQU0sQ0FBQyxHQUFHLENBQUMscUJBQXFCLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFZLEVBQUUsR0FBYSxFQUFFLElBQWtCLEVBQUUsRUFBRTtZQUN0RixPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDdEUsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0NBQ0oifQ==
|
package/dist/index.d.ts
ADDED
package/dist/index.js
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
|
|
5
|
+
}) : (function(o, m, k, k2) {
|
|
6
|
+
if (k2 === undefined) k2 = k;
|
|
7
|
+
o[k2] = m[k];
|
|
8
|
+
}));
|
|
9
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
10
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
11
|
+
};
|
|
12
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
13
|
+
// this is needed for the IRequestContext extensions
|
|
14
|
+
require("./middleware");
|
|
15
|
+
__exportStar(require("./module"), exports);
|
|
16
|
+
__exportStar(require("./session"), exports);
|
|
17
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7O0FBQUEsb0RBQW9EO0FBQ3BELHdCQUFzQjtBQUN0QiwyQ0FBeUI7QUFDekIsNENBQTBCIn0=
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { RequestHandler } from "express";
|
|
2
|
+
import { ICookieSessionOptions } from "./cookie-session";
|
|
3
|
+
import { ISession } from "./session";
|
|
4
|
+
declare module "@shrub/express/dist/request-context" {
|
|
5
|
+
interface IRequestContext {
|
|
6
|
+
/** Session state for the request if session state is available. */
|
|
7
|
+
readonly session?: ISession;
|
|
8
|
+
}
|
|
9
|
+
interface IRequestContextBuilder {
|
|
10
|
+
/** Adds a cookie session to the request context. */
|
|
11
|
+
addCookieSession(options: ICookieSessionOptions): IRequestContextBuilder;
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
export declare function cookieSession(options: ICookieSessionOptions): RequestHandler;
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.cookieSession = exports.addCookieSessionRequestBuilder = void 0;
|
|
4
|
+
const cookie_session_1 = require("./cookie-session");
|
|
5
|
+
/** @internal */
|
|
6
|
+
const addCookieSessionRequestBuilder = (context, options) => {
|
|
7
|
+
if (context.session) {
|
|
8
|
+
throw new Error("A Session is already in use.");
|
|
9
|
+
}
|
|
10
|
+
if (!context.cookies) {
|
|
11
|
+
throw new Error("Cookies must be installed.");
|
|
12
|
+
}
|
|
13
|
+
context = { ...context, session: new cookie_session_1.CookieSession(context.cookies, options) };
|
|
14
|
+
return context;
|
|
15
|
+
};
|
|
16
|
+
exports.addCookieSessionRequestBuilder = addCookieSessionRequestBuilder;
|
|
17
|
+
function cookieSession(options) {
|
|
18
|
+
return (req, res, next) => {
|
|
19
|
+
const session = req.contextBuilder.addCookieSession(options).instance().session;
|
|
20
|
+
const ref = res.writeHead;
|
|
21
|
+
res.writeHead = function writeHead() {
|
|
22
|
+
// gets invoked just before writing headers
|
|
23
|
+
session.saveChanges();
|
|
24
|
+
return ref.apply(res, arguments);
|
|
25
|
+
};
|
|
26
|
+
next();
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
exports.cookieSession = cookieSession;
|
|
30
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWlkZGxld2FyZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9taWRkbGV3YXJlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUVBLHFEQUF3RTtBQWV4RSxnQkFBZ0I7QUFDVCxNQUFNLDhCQUE4QixHQUFHLENBQUMsT0FBd0IsRUFBRSxPQUE4QixFQUFFLEVBQUU7SUFDdkcsSUFBSSxPQUFPLENBQUMsT0FBTyxFQUFFO1FBQ2pCLE1BQU0sSUFBSSxLQUFLLENBQUMsOEJBQThCLENBQUMsQ0FBQztLQUNuRDtJQUVELElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFO1FBQ2xCLE1BQU0sSUFBSSxLQUFLLENBQUMsNEJBQTRCLENBQUMsQ0FBQztLQUNqRDtJQUVELE9BQU8sR0FBb0IsRUFBRSxHQUFHLE9BQU8sRUFBRSxPQUFPLEVBQUUsSUFBSSw4QkFBYSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLEVBQUUsQ0FBQztJQUVoRyxPQUFPLE9BQU8sQ0FBQztBQUNuQixDQUFDLENBQUM7QUFaVyxRQUFBLDhCQUE4QixrQ0FZekM7QUFFRixTQUFnQixhQUFhLENBQUMsT0FBOEI7SUFDeEQsT0FBTyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLEVBQUU7UUFDdEIsTUFBTSxPQUFPLEdBQWtCLEdBQUcsQ0FBQyxjQUFjLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUMsT0FBTyxDQUFDO1FBQy9GLE1BQU0sR0FBRyxHQUFHLEdBQUcsQ0FBQyxTQUFTLENBQUM7UUFFMUIsR0FBRyxDQUFDLFNBQVMsR0FBRyxTQUFTLFNBQVM7WUFDOUIsMkNBQTJDO1lBQzNDLE9BQU8sQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUN0QixPQUFPLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLFNBQWdCLENBQUMsQ0FBQztRQUM1QyxDQUFDLENBQUM7UUFFRixJQUFJLEVBQUUsQ0FBQztJQUNYLENBQUMsQ0FBQTtBQUNMLENBQUM7QUFiRCxzQ0FhQyJ9
|
package/dist/module.d.ts
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { IModule, IModuleConfigurator, IModuleInitializer } from "@shrub/core";
|
|
2
|
+
import { ExpressModule } from "@shrub/express";
|
|
3
|
+
import { ExpressCookiesModule } from "@shrub/express-cookies";
|
|
4
|
+
import { ICookieSessionOptions } from "./cookie-session";
|
|
5
|
+
export declare const IExpressSessionConfiguration: import("@shrub/core").IModuleConfigurationType<IExpressSessionConfiguration>;
|
|
6
|
+
export interface IExpressSessionConfiguration {
|
|
7
|
+
/**
|
|
8
|
+
* Enables cookie sessions with the specified options. Note: if options are not explicitly provided
|
|
9
|
+
* the module will attempt to fetch options from the options service.
|
|
10
|
+
*/
|
|
11
|
+
useCookieSession(options?: ICookieSessionOptions): void;
|
|
12
|
+
}
|
|
13
|
+
export declare class ExpressSessionModule implements IModule {
|
|
14
|
+
private middleware?;
|
|
15
|
+
readonly name = "express-session";
|
|
16
|
+
readonly dependencies: (typeof ExpressCookiesModule | typeof ExpressModule)[];
|
|
17
|
+
initialize({ config, settings }: IModuleInitializer): void;
|
|
18
|
+
configure({ config }: IModuleConfigurator): void;
|
|
19
|
+
}
|
package/dist/module.js
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ExpressSessionModule = exports.IExpressSessionConfiguration = void 0;
|
|
4
|
+
const core_1 = require("@shrub/core");
|
|
5
|
+
const express_1 = require("@shrub/express");
|
|
6
|
+
const express_cookies_1 = require("@shrub/express-cookies");
|
|
7
|
+
const cookie_session_1 = require("./cookie-session");
|
|
8
|
+
const middleware_1 = require("./middleware");
|
|
9
|
+
exports.IExpressSessionConfiguration = core_1.createConfig();
|
|
10
|
+
class ExpressSessionModule {
|
|
11
|
+
constructor() {
|
|
12
|
+
this.name = "express-session";
|
|
13
|
+
this.dependencies = [
|
|
14
|
+
express_cookies_1.ExpressCookiesModule,
|
|
15
|
+
express_1.ExpressModule
|
|
16
|
+
];
|
|
17
|
+
}
|
|
18
|
+
initialize({ config, settings }) {
|
|
19
|
+
settings.bindToOptions(cookie_session_1.ICookieSessionOptions);
|
|
20
|
+
config(exports.IExpressSessionConfiguration).register(({ services }) => ({
|
|
21
|
+
useCookieSession: options => {
|
|
22
|
+
if (this.middleware) {
|
|
23
|
+
throw new Error("Cookie session has already been initialized.");
|
|
24
|
+
}
|
|
25
|
+
options = options || services.get(core_1.IOptionsService).getOptions(cookie_session_1.ICookieSessionOptions);
|
|
26
|
+
this.middleware = middleware_1.cookieSession(options);
|
|
27
|
+
}
|
|
28
|
+
}));
|
|
29
|
+
}
|
|
30
|
+
configure({ config }) {
|
|
31
|
+
config.get(express_1.IExpressConfiguration).useRequestBuilder("addCookieSession", middleware_1.addCookieSessionRequestBuilder);
|
|
32
|
+
config.get(express_1.IExpressConfiguration).use((req, res, next) => {
|
|
33
|
+
return this.middleware ? this.middleware(req, res, next) : next();
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
exports.ExpressSessionModule = ExpressSessionModule;
|
|
38
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kdWxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL21vZHVsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxzQ0FBOEc7QUFDOUcsNENBQXNFO0FBQ3RFLDREQUE4RDtBQUU5RCxxREFBeUQ7QUFDekQsNkNBQTZFO0FBRWhFLFFBQUEsNEJBQTRCLEdBQUcsbUJBQVksRUFBZ0MsQ0FBQztBQVN6RixNQUFhLG9CQUFvQjtJQUFqQztRQUdhLFNBQUksR0FBRyxpQkFBaUIsQ0FBQztRQUN6QixpQkFBWSxHQUFHO1lBQ3BCLHNDQUFvQjtZQUNwQix1QkFBYTtTQUNoQixDQUFDO0lBc0JOLENBQUM7SUFwQkcsVUFBVSxDQUFDLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBc0I7UUFDL0MsUUFBUSxDQUFDLGFBQWEsQ0FBQyxzQ0FBcUIsQ0FBQyxDQUFDO1FBQzlDLE1BQU0sQ0FBQyxvQ0FBNEIsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsUUFBUSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDN0QsZ0JBQWdCLEVBQUUsT0FBTyxDQUFDLEVBQUU7Z0JBQ3hCLElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRTtvQkFDakIsTUFBTSxJQUFJLEtBQUssQ0FBQyw4Q0FBOEMsQ0FBQyxDQUFDO2lCQUNuRTtnQkFFRCxPQUFPLEdBQUcsT0FBTyxJQUFJLFFBQVEsQ0FBQyxHQUFHLENBQUMsc0JBQWUsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxzQ0FBcUIsQ0FBQyxDQUFDO2dCQUNyRixJQUFJLENBQUMsVUFBVSxHQUFHLDBCQUFhLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDN0MsQ0FBQztTQUNKLENBQUMsQ0FBQyxDQUFDO0lBQ1IsQ0FBQztJQUVELFNBQVMsQ0FBQyxFQUFFLE1BQU0sRUFBdUI7UUFDckMsTUFBTSxDQUFDLEdBQUcsQ0FBQywrQkFBcUIsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLGtCQUFrQixFQUFFLDJDQUE4QixDQUFDLENBQUM7UUFDeEcsTUFBTSxDQUFDLEdBQUcsQ0FBQywrQkFBcUIsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQVksRUFBRSxHQUFhLEVBQUUsSUFBa0IsRUFBRSxFQUFFO1lBQ3RGLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUN0RSxDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7Q0FDSjtBQTdCRCxvREE2QkMifQ==
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export interface ISession {
|
|
2
|
+
/**
|
|
3
|
+
* The maximum age for the session expressed as the number of milliseconds from the current time, or undefined if the session context does not expire.
|
|
4
|
+
* This is scoped to the current session and modifying the value allows different options for the maxAge on a per-session basis.
|
|
5
|
+
*/
|
|
6
|
+
maxAge?: number;
|
|
7
|
+
/** A collection of values for the session. */
|
|
8
|
+
readonly values: ISessionValueCollection;
|
|
9
|
+
/** Force delete the session. */
|
|
10
|
+
delete(): void;
|
|
11
|
+
/** Reset the session's expiration based on its max age. */
|
|
12
|
+
keepAlive(): void;
|
|
13
|
+
}
|
|
14
|
+
export interface ISessionOptions {
|
|
15
|
+
/** The maximum age for the session expressed as the number of milliseconds from the current time, or undefined if the session context does not expire. */
|
|
16
|
+
readonly maxAge?: number;
|
|
17
|
+
}
|
|
18
|
+
/** A read/write collection of values stored in a session. */
|
|
19
|
+
export interface ISessionValueCollection {
|
|
20
|
+
[key: string]: string | boolean | number | undefined;
|
|
21
|
+
}
|
package/dist/session.js
ADDED
package/package.json
ADDED
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@shrub/express-session",
|
|
3
|
+
"description": "Express module that provides simple session middleware.",
|
|
4
|
+
"version": "0.5.26",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"repository": {
|
|
7
|
+
"type": "git",
|
|
8
|
+
"url": "https://github.com/jjvainav/shrub.git"
|
|
9
|
+
},
|
|
10
|
+
"main": "dist/index.js",
|
|
11
|
+
"module": "dist/esm/index.js",
|
|
12
|
+
"typings": "dist/index.d.ts",
|
|
13
|
+
"files": [
|
|
14
|
+
"dist"
|
|
15
|
+
],
|
|
16
|
+
"publishConfig": {
|
|
17
|
+
"access": "public"
|
|
18
|
+
},
|
|
19
|
+
"engines": {
|
|
20
|
+
"node": ">=10.18.0"
|
|
21
|
+
},
|
|
22
|
+
"scripts": {
|
|
23
|
+
"build": "tsc -b .",
|
|
24
|
+
"build:esm": "tsc -p tsconfig.esm.json",
|
|
25
|
+
"clean": "rimraf ./dist && rimraf tsconfig.tsbuildinfo"
|
|
26
|
+
},
|
|
27
|
+
"devDependencies": {
|
|
28
|
+
"@types/express": "4.17.9"
|
|
29
|
+
},
|
|
30
|
+
"dependencies": {
|
|
31
|
+
"@shrub/core": "0.5.26",
|
|
32
|
+
"@shrub/express": "0.5.26",
|
|
33
|
+
"@shrub/express-cookies": "0.5.26",
|
|
34
|
+
"express": "^4.17.1"
|
|
35
|
+
},
|
|
36
|
+
"gitHead": "bd8e68fee891bb035f6506401851cf993c1c614e"
|
|
37
|
+
}
|