ngx-cookie-service-ssr 14.0.0-beta.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/README.md +24 -0
- package/esm2020/lib/ssr-cookie.service.mjs +206 -0
- package/esm2020/ngx-cookie-service-ssr.mjs +5 -0
- package/esm2020/public-api.mjs +5 -0
- package/fesm2015/ngx-cookie-service-ssr.mjs +222 -0
- package/fesm2015/ngx-cookie-service-ssr.mjs.map +1 -0
- package/fesm2020/ngx-cookie-service-ssr.mjs +217 -0
- package/fesm2020/ngx-cookie-service-ssr.mjs.map +1 -0
- package/index.d.ts +5 -0
- package/lib/ssr-cookie.service.d.ts +129 -0
- package/package.json +116 -0
- package/public-api.d.ts +1 -0
package/README.md
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
# NgxCookieServiceSsr
|
|
2
|
+
|
|
3
|
+
This library was generated with [Angular CLI](https://github.com/angular/angular-cli) version 14.0.0.
|
|
4
|
+
|
|
5
|
+
## Code scaffolding
|
|
6
|
+
|
|
7
|
+
Run `ng generate component component-name --project ngx-cookie-service-ssr` to generate a new component. You can also use `ng generate directive|pipe|service|class|guard|interface|enum|module --project ngx-cookie-service-ssr`.
|
|
8
|
+
> Note: Don't forget to add `--project ngx-cookie-service-ssr` or else it will be added to the default project in your `angular.json` file.
|
|
9
|
+
|
|
10
|
+
## Build
|
|
11
|
+
|
|
12
|
+
Run `ng build ngx-cookie-service-ssr` to build the project. The build artifacts will be stored in the `dist/` directory.
|
|
13
|
+
|
|
14
|
+
## Publishing
|
|
15
|
+
|
|
16
|
+
After building your library with `ng build ngx-cookie-service-ssr`, go to the dist folder `cd dist/ngx-cookie-service-ssr` and run `npm publish`.
|
|
17
|
+
|
|
18
|
+
## Running unit tests
|
|
19
|
+
|
|
20
|
+
Run `ng test ngx-cookie-service-ssr` to execute the unit tests via [Karma](https://karma-runner.github.io).
|
|
21
|
+
|
|
22
|
+
## Further help
|
|
23
|
+
|
|
24
|
+
To get more help on the Angular CLI use `ng help` or go check out the [Angular CLI Overview and Command Reference](https://angular.io/cli) page.
|
|
@@ -0,0 +1,206 @@
|
|
|
1
|
+
import { REQUEST } from '@nguniversal/express-engine/tokens';
|
|
2
|
+
import { Inject, Injectable, Optional, PLATFORM_ID } from '@angular/core';
|
|
3
|
+
import { DOCUMENT, isPlatformBrowser } from '@angular/common';
|
|
4
|
+
import * as i0 from "@angular/core";
|
|
5
|
+
export class SsrCookieService {
|
|
6
|
+
constructor(document,
|
|
7
|
+
// Get the `PLATFORM_ID` so we can check if we're in a browser.
|
|
8
|
+
platformId, request) {
|
|
9
|
+
this.document = document;
|
|
10
|
+
this.platformId = platformId;
|
|
11
|
+
this.request = request;
|
|
12
|
+
this.documentIsAccessible = isPlatformBrowser(this.platformId);
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Get cookie Regular Expression
|
|
16
|
+
*
|
|
17
|
+
* @param name Cookie name
|
|
18
|
+
* @returns property RegExp
|
|
19
|
+
*
|
|
20
|
+
* @author: Stepan Suvorov
|
|
21
|
+
* @since: 1.0.0
|
|
22
|
+
*/
|
|
23
|
+
static getCookieRegExp(name) {
|
|
24
|
+
const escapedName = name.replace(/([\[\]\{\}\(\)\|\=\;\+\?\,\.\*\^\$])/gi, '\\$1');
|
|
25
|
+
return new RegExp('(?:^' + escapedName + '|;\\s*' + escapedName + ')=(.*?)(?:;|$)', 'g');
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Gets the unencoded version of an encoded component of a Uniform Resource Identifier (URI).
|
|
29
|
+
*
|
|
30
|
+
* @param encodedURIComponent A value representing an encoded URI component.
|
|
31
|
+
*
|
|
32
|
+
* @returns The unencoded version of an encoded component of a Uniform Resource Identifier (URI).
|
|
33
|
+
*
|
|
34
|
+
* @author: Stepan Suvorov
|
|
35
|
+
* @since: 1.0.0
|
|
36
|
+
*/
|
|
37
|
+
static safeDecodeURIComponent(encodedURIComponent) {
|
|
38
|
+
try {
|
|
39
|
+
return decodeURIComponent(encodedURIComponent);
|
|
40
|
+
}
|
|
41
|
+
catch {
|
|
42
|
+
// probably it is not uri encoded. return as is
|
|
43
|
+
return encodedURIComponent;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Return `true` if {@link Document} is accessible, otherwise return `false`
|
|
48
|
+
*
|
|
49
|
+
* @param name Cookie name
|
|
50
|
+
* @returns boolean - whether cookie with specified name exists
|
|
51
|
+
*
|
|
52
|
+
* @author: Stepan Suvorov
|
|
53
|
+
* @since: 1.0.0
|
|
54
|
+
*/
|
|
55
|
+
check(name) {
|
|
56
|
+
name = encodeURIComponent(name);
|
|
57
|
+
const regExp = SsrCookieService.getCookieRegExp(name);
|
|
58
|
+
return regExp.test(this.documentIsAccessible ? this.document.cookie : this.request?.headers.cookie);
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Get cookies by name
|
|
62
|
+
*
|
|
63
|
+
* @param name Cookie name
|
|
64
|
+
* @returns property value
|
|
65
|
+
*
|
|
66
|
+
* @author: Stepan Suvorov
|
|
67
|
+
* @since: 1.0.0
|
|
68
|
+
*/
|
|
69
|
+
get(name) {
|
|
70
|
+
if (this.check(name)) {
|
|
71
|
+
name = encodeURIComponent(name);
|
|
72
|
+
const regExp = SsrCookieService.getCookieRegExp(name);
|
|
73
|
+
const result = regExp.exec(this.documentIsAccessible ? this.document.cookie : this.request?.headers.cookie);
|
|
74
|
+
return result[1] ? SsrCookieService.safeDecodeURIComponent(result[1]) : '';
|
|
75
|
+
}
|
|
76
|
+
else {
|
|
77
|
+
return '';
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Get all cookies in JSON format
|
|
82
|
+
*
|
|
83
|
+
* @returns all the cookies in json
|
|
84
|
+
*
|
|
85
|
+
* @author: Stepan Suvorov
|
|
86
|
+
* @since: 1.0.0
|
|
87
|
+
*/
|
|
88
|
+
getAll() {
|
|
89
|
+
const cookies = {};
|
|
90
|
+
const cookieString = this.documentIsAccessible ? this.document?.cookie : this.request?.headers.cookie;
|
|
91
|
+
if (cookieString && cookieString !== '') {
|
|
92
|
+
cookieString.split(';').forEach((currentCookie) => {
|
|
93
|
+
const [cookieName, cookieValue] = currentCookie.split('=');
|
|
94
|
+
cookies[SsrCookieService.safeDecodeURIComponent(cookieName.replace(/^ /, ''))] = SsrCookieService.safeDecodeURIComponent(cookieValue);
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
return cookies;
|
|
98
|
+
}
|
|
99
|
+
set(name, value, expiresOrOptions, path, domain, secure, sameSite) {
|
|
100
|
+
if (!this.documentIsAccessible) {
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
103
|
+
if (typeof expiresOrOptions === 'number' || expiresOrOptions instanceof Date || path || domain || secure || sameSite) {
|
|
104
|
+
const optionsBody = {
|
|
105
|
+
expires: expiresOrOptions,
|
|
106
|
+
path,
|
|
107
|
+
domain,
|
|
108
|
+
secure,
|
|
109
|
+
sameSite: sameSite ? sameSite : 'Lax',
|
|
110
|
+
};
|
|
111
|
+
this.set(name, value, optionsBody);
|
|
112
|
+
return;
|
|
113
|
+
}
|
|
114
|
+
let cookieString = encodeURIComponent(name) + '=' + encodeURIComponent(value) + ';';
|
|
115
|
+
const options = expiresOrOptions ? expiresOrOptions : {};
|
|
116
|
+
if (options.expires) {
|
|
117
|
+
if (typeof options.expires === 'number') {
|
|
118
|
+
const dateExpires = new Date(new Date().getTime() + options.expires * 1000 * 60 * 60 * 24);
|
|
119
|
+
cookieString += 'expires=' + dateExpires.toUTCString() + ';';
|
|
120
|
+
}
|
|
121
|
+
else {
|
|
122
|
+
cookieString += 'expires=' + options.expires.toUTCString() + ';';
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
if (options.path) {
|
|
126
|
+
cookieString += 'path=' + options.path + ';';
|
|
127
|
+
}
|
|
128
|
+
if (options.domain) {
|
|
129
|
+
cookieString += 'domain=' + options.domain + ';';
|
|
130
|
+
}
|
|
131
|
+
if (options.secure === false && options.sameSite === 'None') {
|
|
132
|
+
options.secure = true;
|
|
133
|
+
console.warn(`[ngx-cookie-service] Cookie ${name} was forced with secure flag because sameSite=None.` +
|
|
134
|
+
`More details : https://github.com/stevermeister/ngx-cookie-service/issues/86#issuecomment-597720130`);
|
|
135
|
+
}
|
|
136
|
+
if (options.secure) {
|
|
137
|
+
cookieString += 'secure;';
|
|
138
|
+
}
|
|
139
|
+
if (!options.sameSite) {
|
|
140
|
+
options.sameSite = 'Lax';
|
|
141
|
+
}
|
|
142
|
+
cookieString += 'sameSite=' + options.sameSite + ';';
|
|
143
|
+
this.document.cookie = cookieString;
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Delete cookie by name
|
|
147
|
+
*
|
|
148
|
+
* @param name Cookie name
|
|
149
|
+
* @param path Cookie path
|
|
150
|
+
* @param domain Cookie domain
|
|
151
|
+
* @param secure Cookie secure flag
|
|
152
|
+
* @param sameSite Cookie sameSite flag - https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie/SameSite
|
|
153
|
+
*
|
|
154
|
+
* @author: Stepan Suvorov
|
|
155
|
+
* @since: 1.0.0
|
|
156
|
+
*/
|
|
157
|
+
delete(name, path, domain, secure, sameSite = 'Lax') {
|
|
158
|
+
if (!this.documentIsAccessible) {
|
|
159
|
+
return;
|
|
160
|
+
}
|
|
161
|
+
const expiresDate = new Date('Thu, 01 Jan 1970 00:00:01 GMT');
|
|
162
|
+
this.set(name, '', { expires: expiresDate, path, domain, secure, sameSite });
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* Delete all cookies
|
|
166
|
+
*
|
|
167
|
+
* @param path Cookie path
|
|
168
|
+
* @param domain Cookie domain
|
|
169
|
+
* @param secure Is the Cookie secure
|
|
170
|
+
* @param sameSite Is the cookie same site
|
|
171
|
+
*
|
|
172
|
+
* @author: Stepan Suvorov
|
|
173
|
+
* @since: 1.0.0
|
|
174
|
+
*/
|
|
175
|
+
deleteAll(path, domain, secure, sameSite = 'Lax') {
|
|
176
|
+
if (!this.documentIsAccessible) {
|
|
177
|
+
return;
|
|
178
|
+
}
|
|
179
|
+
const cookies = this.getAll();
|
|
180
|
+
for (const cookieName in cookies) {
|
|
181
|
+
if (cookies.hasOwnProperty(cookieName)) {
|
|
182
|
+
this.delete(cookieName, path, domain, secure, sameSite);
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
SsrCookieService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.0", ngImport: i0, type: SsrCookieService, deps: [{ token: DOCUMENT }, { token: PLATFORM_ID }, { token: REQUEST, optional: true }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
188
|
+
SsrCookieService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.0.0", ngImport: i0, type: SsrCookieService, providedIn: 'root' });
|
|
189
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.0", ngImport: i0, type: SsrCookieService, decorators: [{
|
|
190
|
+
type: Injectable,
|
|
191
|
+
args: [{
|
|
192
|
+
providedIn: 'root',
|
|
193
|
+
}]
|
|
194
|
+
}], ctorParameters: function () { return [{ type: Document, decorators: [{
|
|
195
|
+
type: Inject,
|
|
196
|
+
args: [DOCUMENT]
|
|
197
|
+
}] }, { type: undefined, decorators: [{
|
|
198
|
+
type: Inject,
|
|
199
|
+
args: [PLATFORM_ID]
|
|
200
|
+
}] }, { type: undefined, decorators: [{
|
|
201
|
+
type: Optional
|
|
202
|
+
}, {
|
|
203
|
+
type: Inject,
|
|
204
|
+
args: [REQUEST]
|
|
205
|
+
}] }]; } });
|
|
206
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3NyLWNvb2tpZS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LWNvb2tpZS1zZXJ2aWNlLXNzci9zcmMvbGliL3Nzci1jb29raWUuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDN0QsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLFdBQVcsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMxRSxPQUFPLEVBQUUsUUFBUSxFQUFFLGlCQUFpQixFQUFFLE1BQU0saUJBQWlCLENBQUM7O0FBSzlELE1BQU0sT0FBTyxnQkFBZ0I7SUFHM0IsWUFDNEIsUUFBa0I7SUFDNUMsK0RBQStEO0lBQ2xDLFVBQWUsRUFDUCxPQUFnQjtRQUgzQixhQUFRLEdBQVIsUUFBUSxDQUFVO1FBRWYsZUFBVSxHQUFWLFVBQVUsQ0FBSztRQUNQLFlBQU8sR0FBUCxPQUFPLENBQVM7UUFFckQsSUFBSSxDQUFDLG9CQUFvQixHQUFHLGlCQUFpQixDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUNqRSxDQUFDO0lBRUQ7Ozs7Ozs7O09BUUc7SUFDSCxNQUFNLENBQUMsZUFBZSxDQUFDLElBQVk7UUFDakMsTUFBTSxXQUFXLEdBQVcsSUFBSSxDQUFDLE9BQU8sQ0FBQyx3Q0FBd0MsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUUzRixPQUFPLElBQUksTUFBTSxDQUFDLE1BQU0sR0FBRyxXQUFXLEdBQUcsUUFBUSxHQUFHLFdBQVcsR0FBRyxnQkFBZ0IsRUFBRSxHQUFHLENBQUMsQ0FBQztJQUMzRixDQUFDO0lBRUQ7Ozs7Ozs7OztPQVNHO0lBQ0gsTUFBTSxDQUFDLHNCQUFzQixDQUFDLG1CQUEyQjtRQUN2RCxJQUFJO1lBQ0YsT0FBTyxrQkFBa0IsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1NBQ2hEO1FBQUMs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LE9BQU8sQ0FBQyxjQUFjLENBQUMsVUFBVSxDQUFDLEVBQUU7Z0JBQ3RDLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLFFBQVEsQ0FBQyxDQUFDO2FBQ3pEO1NBQ0Y7SUFDSCxDQUFDOzs2R0F2UVUsZ0JBQWdCLGtCQUlqQixRQUFRLGFBRVIsV0FBVyxhQUNDLE9BQU87aUhBUGxCLGdCQUFnQixjQUZmLE1BQU07MkZBRVAsZ0JBQWdCO2tCQUg1QixVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQjswREFLdUMsUUFBUTswQkFBM0MsTUFBTTsyQkFBQyxRQUFROzswQkFFZixNQUFNOzJCQUFDLFdBQVc7OzBCQUNsQixRQUFROzswQkFBSSxNQUFNOzJCQUFDLE9BQU8iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBSZXF1ZXN0IH0gZnJvbSAnZXhwcmVzcyc7XG5pbXBvcnQgeyBSRVFVRVNUIH0gZnJvbSAnQG5ndW5pdmVyc2FsL2V4cHJlc3MtZW5naW5lL3Rva2Vucyc7XG5pbXBvcnQgeyBJbmplY3QsIEluamVjdGFibGUsIE9wdGlvbmFsLCBQTEFURk9STV9JRCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRE9DVU1FTlQsIGlzUGxhdGZvcm1Ccm93c2VyIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcblxuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCcsXG59KVxuZXhwb3J0IGNsYXNzIFNzckNvb2tpZVNlcnZpY2Uge1xuICBwcml2YXRlIHJlYWRvbmx5IGRvY3VtZW50SXNBY2Nlc3NpYmxlOiBib29sZWFuO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIEBJbmplY3QoRE9DVU1FTlQpIHByaXZhdGUgZG9jdW1lbnQ6IERvY3VtZW50LFxuICAgIC8vIEdldCB0aGUgYFBMQVRGT1JNX0lEYCBzbyB3ZSBjYW4gY2hlY2sgaWYgd2UncmUgaW4gYSBicm93c2VyLlxuICAgIEBJbmplY3QoUExBVEZPUk1fSUQpIHByaXZhdGUgcGxhdGZvcm1JZDogYW55LFxuICAgIEBPcHRpb25hbCgpIEBJbmplY3QoUkVRVUVTVCkgcHJpdmF0ZSByZXF1ZXN0OiBSZXF1ZXN0XG4gICkge1xuICAgIHRoaXMuZG9jdW1lbnRJc0FjY2Vzc2libGUgPSBpc1BsYXRmb3JtQnJvd3Nlcih0aGlzLnBsYXRmb3JtSWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBjb29raWUgUmVndWxhciBFeHByZXNzaW9uXG4gICAqXG4gICAqIEBwYXJhbSBuYW1lIENvb2tpZSBuYW1lXG4gICAqIEByZXR1cm5zIHByb3BlcnR5IFJlZ0V4cFxuICAgKlxuICAgKiBAYXV0aG9yOiBTdGVwYW4gU3V2b3JvdlxuICAgKiBAc2luY2U6IDEuMC4wXG4gICAqL1xuICBzdGF0aWMgZ2V0Q29va2llUmVnRXhwKG5hbWU6IHN0cmluZyk6IFJlZ0V4cCB7XG4gICAgY29uc3QgZXNjYXBlZE5hbWU6IHN0cmluZyA9IG5hbWUucmVwbGFjZSgvKFtcXFtcXF1cXHtcXH1cXChcXClcXHxcXD1cXDtcXCtcXD9cXCxcXC5cXCpcXF5cXCRdKS9naSwgJ1xcXFwkMScpO1xuXG4gICAgcmV0dXJuIG5ldyBSZWdFeHAoJyg/Ol4nICsgZXNjYXBlZE5hbWUgKyAnfDtcXFxccyonICsgZXNjYXBlZE5hbWUgKyAnKT0oLio/KSg/Ojt8JCknLCAnZycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIHVuZW5jb2RlZCB2ZXJzaW9uIG9mIGFuIGVuY29kZWQgY29tcG9uZW50IG9mIGEgVW5pZm9ybSBSZXNvdXJjZSBJZGVudGlmaWVyIChVUkkpLlxuICAgKlxuICAgKiBAcGFyYW0gZW5jb2RlZFVSSUNvbXBvbmVudCBBIHZhbHVlIHJlcHJlc2VudGluZyBhbiBlbmNvZGVkIFVSSSBjb21wb25lbnQuXG4gICAqXG4gICAqIEByZXR1cm5zIFRoZSB1bmVuY29kZWQgdmVyc2lvbiBvZiBhbiBlbmNvZGVkIGNvbXBvbmVudCBvZiBhIFVuaWZvcm0gUmVzb3VyY2UgSWRlbnRpZmllciAoVVJJKS5cbiAgICpcbiAgICogQGF1dGhvcjogU3RlcGFuIFN1dm9yb3ZcbiAgICogQHNpbmNlOiAxLjAuMFxuICAgKi9cbiAgc3RhdGljIHNhZmVEZWNvZGVVUklDb21wb25lbnQoZW5jb2RlZFVSSUNvbXBvbmVudDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudChlbmNvZGVkVVJJQ29tcG9uZW50KTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIHByb2JhYmx5IGl0IGlzIG5vdCB1cmkgZW5jb2RlZC4gcmV0dXJuIGFzIGlzXG4gICAgICByZXR1cm4gZW5jb2RlZFVSSUNvbXBvbmVudDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIGB0cnVlYCBpZiB7QGxpbmsgRG9jdW1lbnR9IGlzIGFjY2Vzc2libGUsIG90aGVyd2lzZSByZXR1cm4gYGZhbHNlYFxuICAgKlxuICAgKiBAcGFyYW0gbmFtZSBDb29raWUgbmFtZVxuICAgKiBAcmV0dXJucyBib29sZWFuIC0gd2hldGhlciBjb29raWUgd2l0aCBzcGVjaWZpZWQgbmFtZSBleGlzdHNcbiAgICpcbiAgICogQGF1dGhvcjogU3RlcGFuIFN1dm9yb3ZcbiAgICogQHNpbmNlOiAxLjAuMFxuICAgKi9cbiAgY2hlY2sobmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgbmFtZSA9IGVuY29kZVVSSUNvbXBvbmVudChuYW1lKTtcbiAgICBjb25zdCByZWdFeHA6IFJlZ0V4cCA9IFNzckNvb2tpZVNlcnZpY2UuZ2V0Q29va2llUmVnRXhwKG5hbWUpO1xuICAgIHJldHVybiByZWdFeHAudGVzdCh0aGlzLmRvY3VtZW50SXNBY2Nlc3NpYmxlID8gdGhpcy5kb2N1bWVudC5jb29raWUgOiB0aGlzLnJlcXVlc3Q/LmhlYWRlcnMuY29va2llKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgY29va2llcyBieSBuYW1lXG4gICAqXG4gICAqIEBwYXJhbSBuYW1lIENvb2tpZSBuYW1lXG4gICAqIEByZXR1cm5zIHByb3BlcnR5IHZhbHVlXG4gICAqXG4gICAqIEBhdXRob3I6IFN0ZXBhbiBTdXZvcm92XG4gICAqIEBzaW5jZTogMS4wLjBcbiAgICovXG4gIGdldChuYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLmNoZWNrKG5hbWUpKSB7XG4gICAgICBuYW1lID0gZW5jb2RlVVJJQ29tcG9uZW50KG5hbWUpO1xuXG4gICAgICBjb25zdCByZWdFeHA6IFJlZ0V4cCA9IFNzckNvb2tpZVNlcnZpY2UuZ2V0Q29va2llUmVnRXhwKG5hbWUpO1xuICAgICAgY29uc3QgcmVzdWx0OiBSZWdFeHBFeGVjQXJyYXkgPSByZWdFeHAuZXhlYyh0aGlzLmRvY3VtZW50SXNBY2Nlc3NpYmxlID8gdGhpcy5kb2N1bWVudC5jb29raWUgOiB0aGlzLnJlcXVlc3Q/LmhlYWRlcnMuY29va2llKTtcblxuICAgICAgcmV0dXJuIHJlc3VsdFsxXSA/IFNzckNvb2tpZVNlcnZpY2Uuc2FmZURlY29kZVVSSUNvbXBvbmVudChyZXN1bHRbMV0pIDogJyc7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiAnJztcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0IGFsbCBjb29raWVzIGluIEpTT04gZm9ybWF0XG4gICAqXG4gICAqIEByZXR1cm5zIGFsbCB0aGUgY29va2llcyBpbiBqc29uXG4gICAqXG4gICAqIEBhdXRob3I6IFN0ZXBhbiBTdXZvcm92XG4gICAqIEBzaW5jZTogMS4wLjBcbiAgICovXG4gIGdldEFsbCgpOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9IHtcbiAgICBjb25zdCBjb29raWVzOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9ID0ge307XG4gICAgY29uc3QgY29va2llU3RyaW5nOiBhbnkgPSB0aGlzLmRvY3VtZW50SXNBY2Nlc3NpYmxlID8gdGhpcy5kb2N1bWVudD8uY29va2llIDogdGhpcy5yZXF1ZXN0Py5oZWFkZXJzLmNvb2tpZTtcblxuICAgIGlmIChjb29raWVTdHJpbmcgJiYgY29va2llU3RyaW5nICE9PSAnJykge1xuICAgICAgY29va2llU3RyaW5nLnNwbGl0KCc7JykuZm9yRWFjaCgoY3VycmVudENvb2tpZSkgPT4ge1xuICAgICAgICBjb25zdCBbY29va2llTmFtZSwgY29va2llVmFsdWVdID0gY3VycmVudENvb2tpZS5zcGxpdCgnPScpO1xuICAgICAgICBjb29raWVzW1NzckNvb2tpZVNlcnZpY2Uuc2FmZURlY29kZVVSSUNvbXBvbmVudChjb29raWVOYW1lLnJlcGxhY2UoL14gLywgJycpKV0gPSBTc3JDb29raWVTZXJ2aWNlLnNhZmVEZWNvZGVVUklDb21wb25lbnQoY29va2llVmFsdWUpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNvb2tpZXM7XG4gIH1cblxuICAvKipcbiAgICogU2V0IGNvb2tpZSBiYXNlZCBvbiBwcm92aWRlZCBpbmZvcm1hdGlvblxuICAgKlxuICAgKiBAcGFyYW0gbmFtZSAgICAgQ29va2llIG5hbWVcbiAgICogQHBhcmFtIHZhbHVlICAgIENvb2tpZSB2YWx1ZVxuICAgKiBAcGFyYW0gZXhwaXJlcyAgTnVtYmVyIG9mIGRheXMgdW50aWwgdGhlIGNvb2tpZXMgZXhwaXJlcyBvciBhbiBhY3R1YWwgYERhdGVgXG4gICAqIEBwYXJhbSBwYXRoICAgICBDb29raWUgcGF0aFxuICAgKiBAcGFyYW0gZG9tYWluICAgQ29va2llIGRvbWFpblxuICAgKiBAcGFyYW0gc2VjdXJlICAgU2VjdXJlIGZsYWdcbiAgICogQHBhcmFtIHNhbWVTaXRlIE9XQVNQIHNhbWVzaXRlIHRva2VuIGBMYXhgLCBgTm9uZWAsIG9yIGBTdHJpY3RgLiBEZWZhdWx0cyB0byBgTGF4YFxuICAgKlxuICAgKiBAYXV0aG9yOiBTdGVwYW4gU3V2b3JvdlxuICAgKiBAc2luY2U6IDEuMC4wXG4gICAqL1xuICBzZXQobmFtZTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nLCBleHBpcmVzPzogbnVtYmVyIHwgRGF0ZSwgcGF0aD86IHN0cmluZywgZG9tYWluPzogc3RyaW5nLCBzZWN1cmU/OiBib29sZWFuLCBzYW1lU2l0ZT86ICdMYXgnIHwgJ05vbmUnIHwgJ1N0cmljdCcpOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBTZXQgY29va2llIGJhc2VkIG9uIHByb3ZpZGVkIGluZm9ybWF0aW9uXG4gICAqXG4gICAqIENvb2tpZSdzIHBhcmFtZXRlcnM6XG4gICAqIDxwcmU+XG4gICAqIGV4cGlyZXMgIE51bWJlciBvZiBkYXlzIHVudGlsIHRoZSBjb29raWVzIGV4cGlyZXMgb3IgYW4gYWN0dWFsIGBEYXRlYFxuICAgKiBwYXRoICAgICBDb29raWUgcGF0aFxuICAgKiBkb21haW4gICBDb29raWUgZG9tYWluXG4gICAqIHNlY3VyZSAgIFNlY3VyZSBmbGFnXG4gICAqIHNhbWVTaXRlIE9XQVNQIHNhbWVzaXRlIHRva2VuIGBMYXhgLCBgTm9uZWAsIG9yIGBTdHJpY3RgLiBEZWZhdWx0cyB0byBgTGF4YFxuICAgKiA8L3ByZT5cbiAgICpcbiAgICogQHBhcmFtIG5hbWUgICAgIENvb2tpZSBuYW1lXG4gICAqIEBwYXJhbSB2YWx1ZSAgICBDb29raWUgdmFsdWVcbiAgICogQHBhcmFtIG9wdGlvbnMgIEJvZHkgd2l0aCBjb29raWUncyBwYXJhbXNcbiAgICpcbiAgICogQGF1dGhvcjogU3RlcGFuIFN1dm9yb3ZcbiAgICogQHNpbmNlOiAxLjAuMFxuICAgKi9cbiAgc2V0KFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICB2YWx1ZTogc3RyaW5nLFxuICAgIG9wdGlvbnM/OiB7XG4gICAgICBleHBpcmVzPzogbnVtYmVyIHwgRGF0ZTtcbiAgICAgIHBhdGg/OiBzdHJpbmc7XG4gICAgICBkb21haW4/OiBzdHJpbmc7XG4gICAgICBzZWN1cmU/OiBib29sZWFuO1xuICAgICAgc2FtZVNpdGU/OiAnTGF4JyB8ICdOb25lJyB8ICdTdHJpY3QnO1xuICAgIH1cbiAgKTogdm9pZDtcblxuICBzZXQoXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIHZhbHVlOiBzdHJpbmcsXG4gICAgZXhwaXJlc09yT3B0aW9ucz86IG51bWJlciB8IERhdGUgfCBhbnksXG4gICAgcGF0aD86IHN0cmluZyxcbiAgICBkb21haW4/OiBzdHJpbmcsXG4gICAgc2VjdXJlPzogYm9vbGVhbixcbiAgICBzYW1lU2l0ZT86ICdMYXgnIHwgJ05vbmUnIHwgJ1N0cmljdCdcbiAgKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmRvY3VtZW50SXNBY2Nlc3NpYmxlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBleHBpcmVzT3JPcHRpb25zID09PSAnbnVtYmVyJyB8fCBleHBpcmVzT3JPcHRpb25zIGluc3RhbmNlb2YgRGF0ZSB8fCBwYXRoIHx8IGRvbWFpbiB8fCBzZWN1cmUgfHwgc2FtZVNpdGUpIHtcbiAgICAgIGNvbnN0IG9wdGlvbnNCb2R5ID0ge1xuICAgICAgICBleHBpcmVzOiBleHBpcmVzT3JPcHRpb25zLFxuICAgICAgICBwYXRoLFxuICAgICAgICBkb21haW4sXG4gICAgICAgIHNlY3VyZSxcbiAgICAgICAgc2FtZVNpdGU6IHNhbWVTaXRlID8gc2FtZVNpdGUgOiAnTGF4JyxcbiAgICAgIH07XG5cbiAgICAgIHRoaXMuc2V0KG5hbWUsIHZhbHVlLCBvcHRpb25zQm9keSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbGV0IGNvb2tpZVN0cmluZzogc3RyaW5nID0gZW5jb2RlVVJJQ29tcG9uZW50KG5hbWUpICsgJz0nICsgZW5jb2RlVVJJQ29tcG9uZW50KHZhbHVlKSArICc7JztcblxuICAgIGNvbnN0IG9wdGlvbnMgPSBleHBpcmVzT3JPcHRpb25zID8gZXhwaXJlc09yT3B0aW9ucyA6IHt9O1xuXG4gICAgaWYgKG9wdGlvbnMuZXhwaXJlcykge1xuICAgICAgaWYgKHR5cGVvZiBvcHRpb25zLmV4cGlyZXMgPT09ICdudW1iZXInKSB7XG4gICAgICAgIGNvbnN0IGRhdGVFeHBpcmVzOiBEYXRlID0gbmV3IERhdGUobmV3IERhdGUoKS5nZXRUaW1lKCkgKyBvcHRpb25zLmV4cGlyZXMgKiAxMDAwICogNjAgKiA2MCAqIDI0KTtcblxuICAgICAgICBjb29raWVTdHJpbmcgKz0gJ2V4cGlyZXM9JyArIGRhdGVFeHBpcmVzLnRvVVRDU3RyaW5nKCkgKyAnOyc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb29raWVTdHJpbmcgKz0gJ2V4cGlyZXM9JyArIG9wdGlvbnMuZXhwaXJlcy50b1VUQ1N0cmluZygpICsgJzsnO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChvcHRpb25zLnBhdGgpIHtcbiAgICAgIGNvb2tpZVN0cmluZyArPSAncGF0aD0nICsgb3B0aW9ucy5wYXRoICsgJzsnO1xuICAgIH1cblxuICAgIGlmIChvcHRpb25zLmRvbWFpbikge1xuICAgICAgY29va2llU3RyaW5nICs9ICdkb21haW49JyArIG9wdGlvbnMuZG9tYWluICsgJzsnO1xuICAgIH1cblxuICAgIGlmIChvcHRpb25zLnNlY3VyZSA9PT0gZmFsc2UgJiYgb3B0aW9ucy5zYW1lU2l0ZSA9PT0gJ05vbmUnKSB7XG4gICAgICBvcHRpb25zLnNlY3VyZSA9IHRydWU7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIGBbbmd4LWNvb2tpZS1zZXJ2aWNlXSBDb29raWUgJHtuYW1lfSB3YXMgZm9yY2VkIHdpdGggc2VjdXJlIGZsYWcgYmVjYXVzZSBzYW1lU2l0ZT1Ob25lLmAgK1xuICAgICAgICAgIGBNb3JlIGRldGFpbHMgOiBodHRwczovL2dpdGh1Yi5jb20vc3RldmVybWVpc3Rlci9uZ3gtY29va2llLXNlcnZpY2UvaXNzdWVzLzg2I2lzc3VlY29tbWVudC01OTc3MjAxMzBgXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy5zZWN1cmUpIHtcbiAgICAgIGNvb2tpZVN0cmluZyArPSAnc2VjdXJlOyc7XG4gICAgfVxuXG4gICAgaWYgKCFvcHRpb25zLnNhbWVTaXRlKSB7XG4gICAgICBvcHRpb25zLnNhbWVTaXRlID0gJ0xheCc7XG4gICAgfVxuXG4gICAgY29va2llU3RyaW5nICs9ICdzYW1lU2l0ZT0nICsgb3B0aW9ucy5zYW1lU2l0ZSArICc7JztcblxuICAgIHRoaXMuZG9jdW1lbnQuY29va2llID0gY29va2llU3RyaW5nO1xuICB9XG5cbiAgLyoqXG4gICAqIERlbGV0ZSBjb29raWUgYnkgbmFtZVxuICAgKlxuICAgKiBAcGFyYW0gbmFtZSAgIENvb2tpZSBuYW1lXG4gICAqIEBwYXJhbSBwYXRoICAgQ29va2llIHBhdGhcbiAgICogQHBhcmFtIGRvbWFpbiBDb29raWUgZG9tYWluXG4gICAqIEBwYXJhbSBzZWN1cmUgQ29va2llIHNlY3VyZSBmbGFnXG4gICAqIEBwYXJhbSBzYW1lU2l0ZSBDb29raWUgc2FtZVNpdGUgZmxhZyAtIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0hUVFAvSGVhZGVycy9TZXQtQ29va2llL1NhbWVTaXRlXG4gICAqXG4gICAqIEBhdXRob3I6IFN0ZXBhbiBTdXZvcm92XG4gICAqIEBzaW5jZTogMS4wLjBcbiAgICovXG4gIGRlbGV0ZShuYW1lOiBzdHJpbmcsIHBhdGg/OiBzdHJpbmcsIGRvbWFpbj86IHN0cmluZywgc2VjdXJlPzogYm9vbGVhbiwgc2FtZVNpdGU6ICdMYXgnIHwgJ05vbmUnIHwgJ1N0cmljdCcgPSAnTGF4Jyk6IHZvaWQge1xuICAgIGlmICghdGhpcy5kb2N1bWVudElzQWNjZXNzaWJsZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBleHBpcmVzRGF0ZSA9IG5ldyBEYXRlKCdUaHUsIDAxIEphbiAxOTcwIDAwOjAwOjAxIEdNVCcpO1xuICAgIHRoaXMuc2V0KG5hbWUsICcnLCB7IGV4cGlyZXM6IGV4cGlyZXNEYXRlLCBwYXRoLCBkb21haW4sIHNlY3VyZSwgc2FtZVNpdGUgfSk7XG4gIH1cblxuICAvKipcbiAgICogRGVsZXRlIGFsbCBjb29raWVzXG4gICAqXG4gICAqIEBwYXJhbSBwYXRoICAgQ29va2llIHBhdGhcbiAgICogQHBhcmFtIGRvbWFpbiBDb29raWUgZG9tYWluXG4gICAqIEBwYXJhbSBzZWN1cmUgSXMgdGhlIENvb2tpZSBzZWN1cmVcbiAgICogQHBhcmFtIHNhbWVTaXRlIElzIHRoZSBjb29raWUgc2FtZSBzaXRlXG4gICAqXG4gICAqIEBhdXRob3I6IFN0ZXBhbiBTdXZvcm92XG4gICAqIEBzaW5jZTogMS4wLjBcbiAgICovXG4gIGRlbGV0ZUFsbChwYXRoPzogc3RyaW5nLCBkb21haW4/OiBzdHJpbmcsIHNlY3VyZT86IGJvb2xlYW4sIHNhbWVTaXRlOiAnTGF4JyB8ICdOb25lJyB8ICdTdHJpY3QnID0gJ0xheCcpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuZG9jdW1lbnRJc0FjY2Vzc2libGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBjb29raWVzOiBhbnkgPSB0aGlzLmdldEFsbCgpO1xuXG4gICAgZm9yIChjb25zdCBjb29raWVOYW1lIGluIGNvb2tpZXMpIHtcbiAgICAgIGlmIChjb29raWVzLmhhc093blByb3BlcnR5KGNvb2tpZU5hbWUpKSB7XG4gICAgICAgIHRoaXMuZGVsZXRlKGNvb2tpZU5hbWUsIHBhdGgsIGRvbWFpbiwgc2VjdXJlLCBzYW1lU2l0ZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iXX0=
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generated bundle index. Do not edit.
|
|
3
|
+
*/
|
|
4
|
+
export * from './public-api';
|
|
5
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LWNvb2tpZS1zZXJ2aWNlLXNzci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Byb2plY3RzL25neC1jb29raWUtc2VydmljZS1zc3Ivc3JjL25neC1jb29raWUtc2VydmljZS1zc3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFFSCxjQUFjLGNBQWMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogR2VuZXJhdGVkIGJ1bmRsZSBpbmRleC4gRG8gbm90IGVkaXQuXG4gKi9cblxuZXhwb3J0ICogZnJvbSAnLi9wdWJsaWMtYXBpJztcbiJdfQ==
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Public API Surface of ngx-cookie-service-ssr
|
|
3
|
+
*/
|
|
4
|
+
export * from './lib/ssr-cookie.service';
|
|
5
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljLWFwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Byb2plY3RzL25neC1jb29raWUtc2VydmljZS1zc3Ivc3JjL3B1YmxpYy1hcGkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFFSCxjQUFjLDBCQUEwQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIFB1YmxpYyBBUEkgU3VyZmFjZSBvZiBuZ3gtY29va2llLXNlcnZpY2Utc3NyXG4gKi9cblxuZXhwb3J0ICogZnJvbSAnLi9saWIvc3NyLWNvb2tpZS5zZXJ2aWNlJztcbiJdfQ==
|
|
@@ -0,0 +1,222 @@
|
|
|
1
|
+
import { REQUEST } from '@nguniversal/express-engine/tokens';
|
|
2
|
+
import * as i0 from '@angular/core';
|
|
3
|
+
import { PLATFORM_ID, Injectable, Inject, Optional } from '@angular/core';
|
|
4
|
+
import { isPlatformBrowser, DOCUMENT } from '@angular/common';
|
|
5
|
+
|
|
6
|
+
class SsrCookieService {
|
|
7
|
+
constructor(document,
|
|
8
|
+
// Get the `PLATFORM_ID` so we can check if we're in a browser.
|
|
9
|
+
platformId, request) {
|
|
10
|
+
this.document = document;
|
|
11
|
+
this.platformId = platformId;
|
|
12
|
+
this.request = request;
|
|
13
|
+
this.documentIsAccessible = isPlatformBrowser(this.platformId);
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Get cookie Regular Expression
|
|
17
|
+
*
|
|
18
|
+
* @param name Cookie name
|
|
19
|
+
* @returns property RegExp
|
|
20
|
+
*
|
|
21
|
+
* @author: Stepan Suvorov
|
|
22
|
+
* @since: 1.0.0
|
|
23
|
+
*/
|
|
24
|
+
static getCookieRegExp(name) {
|
|
25
|
+
const escapedName = name.replace(/([\[\]\{\}\(\)\|\=\;\+\?\,\.\*\^\$])/gi, '\\$1');
|
|
26
|
+
return new RegExp('(?:^' + escapedName + '|;\\s*' + escapedName + ')=(.*?)(?:;|$)', 'g');
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Gets the unencoded version of an encoded component of a Uniform Resource Identifier (URI).
|
|
30
|
+
*
|
|
31
|
+
* @param encodedURIComponent A value representing an encoded URI component.
|
|
32
|
+
*
|
|
33
|
+
* @returns The unencoded version of an encoded component of a Uniform Resource Identifier (URI).
|
|
34
|
+
*
|
|
35
|
+
* @author: Stepan Suvorov
|
|
36
|
+
* @since: 1.0.0
|
|
37
|
+
*/
|
|
38
|
+
static safeDecodeURIComponent(encodedURIComponent) {
|
|
39
|
+
try {
|
|
40
|
+
return decodeURIComponent(encodedURIComponent);
|
|
41
|
+
}
|
|
42
|
+
catch (_a) {
|
|
43
|
+
// probably it is not uri encoded. return as is
|
|
44
|
+
return encodedURIComponent;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Return `true` if {@link Document} is accessible, otherwise return `false`
|
|
49
|
+
*
|
|
50
|
+
* @param name Cookie name
|
|
51
|
+
* @returns boolean - whether cookie with specified name exists
|
|
52
|
+
*
|
|
53
|
+
* @author: Stepan Suvorov
|
|
54
|
+
* @since: 1.0.0
|
|
55
|
+
*/
|
|
56
|
+
check(name) {
|
|
57
|
+
var _a;
|
|
58
|
+
name = encodeURIComponent(name);
|
|
59
|
+
const regExp = SsrCookieService.getCookieRegExp(name);
|
|
60
|
+
return regExp.test(this.documentIsAccessible ? this.document.cookie : (_a = this.request) === null || _a === void 0 ? void 0 : _a.headers.cookie);
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Get cookies by name
|
|
64
|
+
*
|
|
65
|
+
* @param name Cookie name
|
|
66
|
+
* @returns property value
|
|
67
|
+
*
|
|
68
|
+
* @author: Stepan Suvorov
|
|
69
|
+
* @since: 1.0.0
|
|
70
|
+
*/
|
|
71
|
+
get(name) {
|
|
72
|
+
var _a;
|
|
73
|
+
if (this.check(name)) {
|
|
74
|
+
name = encodeURIComponent(name);
|
|
75
|
+
const regExp = SsrCookieService.getCookieRegExp(name);
|
|
76
|
+
const result = regExp.exec(this.documentIsAccessible ? this.document.cookie : (_a = this.request) === null || _a === void 0 ? void 0 : _a.headers.cookie);
|
|
77
|
+
return result[1] ? SsrCookieService.safeDecodeURIComponent(result[1]) : '';
|
|
78
|
+
}
|
|
79
|
+
else {
|
|
80
|
+
return '';
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Get all cookies in JSON format
|
|
85
|
+
*
|
|
86
|
+
* @returns all the cookies in json
|
|
87
|
+
*
|
|
88
|
+
* @author: Stepan Suvorov
|
|
89
|
+
* @since: 1.0.0
|
|
90
|
+
*/
|
|
91
|
+
getAll() {
|
|
92
|
+
var _a, _b;
|
|
93
|
+
const cookies = {};
|
|
94
|
+
const cookieString = this.documentIsAccessible ? (_a = this.document) === null || _a === void 0 ? void 0 : _a.cookie : (_b = this.request) === null || _b === void 0 ? void 0 : _b.headers.cookie;
|
|
95
|
+
if (cookieString && cookieString !== '') {
|
|
96
|
+
cookieString.split(';').forEach((currentCookie) => {
|
|
97
|
+
const [cookieName, cookieValue] = currentCookie.split('=');
|
|
98
|
+
cookies[SsrCookieService.safeDecodeURIComponent(cookieName.replace(/^ /, ''))] = SsrCookieService.safeDecodeURIComponent(cookieValue);
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
return cookies;
|
|
102
|
+
}
|
|
103
|
+
set(name, value, expiresOrOptions, path, domain, secure, sameSite) {
|
|
104
|
+
if (!this.documentIsAccessible) {
|
|
105
|
+
return;
|
|
106
|
+
}
|
|
107
|
+
if (typeof expiresOrOptions === 'number' || expiresOrOptions instanceof Date || path || domain || secure || sameSite) {
|
|
108
|
+
const optionsBody = {
|
|
109
|
+
expires: expiresOrOptions,
|
|
110
|
+
path,
|
|
111
|
+
domain,
|
|
112
|
+
secure,
|
|
113
|
+
sameSite: sameSite ? sameSite : 'Lax',
|
|
114
|
+
};
|
|
115
|
+
this.set(name, value, optionsBody);
|
|
116
|
+
return;
|
|
117
|
+
}
|
|
118
|
+
let cookieString = encodeURIComponent(name) + '=' + encodeURIComponent(value) + ';';
|
|
119
|
+
const options = expiresOrOptions ? expiresOrOptions : {};
|
|
120
|
+
if (options.expires) {
|
|
121
|
+
if (typeof options.expires === 'number') {
|
|
122
|
+
const dateExpires = new Date(new Date().getTime() + options.expires * 1000 * 60 * 60 * 24);
|
|
123
|
+
cookieString += 'expires=' + dateExpires.toUTCString() + ';';
|
|
124
|
+
}
|
|
125
|
+
else {
|
|
126
|
+
cookieString += 'expires=' + options.expires.toUTCString() + ';';
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
if (options.path) {
|
|
130
|
+
cookieString += 'path=' + options.path + ';';
|
|
131
|
+
}
|
|
132
|
+
if (options.domain) {
|
|
133
|
+
cookieString += 'domain=' + options.domain + ';';
|
|
134
|
+
}
|
|
135
|
+
if (options.secure === false && options.sameSite === 'None') {
|
|
136
|
+
options.secure = true;
|
|
137
|
+
console.warn(`[ngx-cookie-service] Cookie ${name} was forced with secure flag because sameSite=None.` +
|
|
138
|
+
`More details : https://github.com/stevermeister/ngx-cookie-service/issues/86#issuecomment-597720130`);
|
|
139
|
+
}
|
|
140
|
+
if (options.secure) {
|
|
141
|
+
cookieString += 'secure;';
|
|
142
|
+
}
|
|
143
|
+
if (!options.sameSite) {
|
|
144
|
+
options.sameSite = 'Lax';
|
|
145
|
+
}
|
|
146
|
+
cookieString += 'sameSite=' + options.sameSite + ';';
|
|
147
|
+
this.document.cookie = cookieString;
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Delete cookie by name
|
|
151
|
+
*
|
|
152
|
+
* @param name Cookie name
|
|
153
|
+
* @param path Cookie path
|
|
154
|
+
* @param domain Cookie domain
|
|
155
|
+
* @param secure Cookie secure flag
|
|
156
|
+
* @param sameSite Cookie sameSite flag - https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie/SameSite
|
|
157
|
+
*
|
|
158
|
+
* @author: Stepan Suvorov
|
|
159
|
+
* @since: 1.0.0
|
|
160
|
+
*/
|
|
161
|
+
delete(name, path, domain, secure, sameSite = 'Lax') {
|
|
162
|
+
if (!this.documentIsAccessible) {
|
|
163
|
+
return;
|
|
164
|
+
}
|
|
165
|
+
const expiresDate = new Date('Thu, 01 Jan 1970 00:00:01 GMT');
|
|
166
|
+
this.set(name, '', { expires: expiresDate, path, domain, secure, sameSite });
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* Delete all cookies
|
|
170
|
+
*
|
|
171
|
+
* @param path Cookie path
|
|
172
|
+
* @param domain Cookie domain
|
|
173
|
+
* @param secure Is the Cookie secure
|
|
174
|
+
* @param sameSite Is the cookie same site
|
|
175
|
+
*
|
|
176
|
+
* @author: Stepan Suvorov
|
|
177
|
+
* @since: 1.0.0
|
|
178
|
+
*/
|
|
179
|
+
deleteAll(path, domain, secure, sameSite = 'Lax') {
|
|
180
|
+
if (!this.documentIsAccessible) {
|
|
181
|
+
return;
|
|
182
|
+
}
|
|
183
|
+
const cookies = this.getAll();
|
|
184
|
+
for (const cookieName in cookies) {
|
|
185
|
+
if (cookies.hasOwnProperty(cookieName)) {
|
|
186
|
+
this.delete(cookieName, path, domain, secure, sameSite);
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
SsrCookieService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.0", ngImport: i0, type: SsrCookieService, deps: [{ token: DOCUMENT }, { token: PLATFORM_ID }, { token: REQUEST, optional: true }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
192
|
+
SsrCookieService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.0.0", ngImport: i0, type: SsrCookieService, providedIn: 'root' });
|
|
193
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.0", ngImport: i0, type: SsrCookieService, decorators: [{
|
|
194
|
+
type: Injectable,
|
|
195
|
+
args: [{
|
|
196
|
+
providedIn: 'root',
|
|
197
|
+
}]
|
|
198
|
+
}], ctorParameters: function () {
|
|
199
|
+
return [{ type: Document, decorators: [{
|
|
200
|
+
type: Inject,
|
|
201
|
+
args: [DOCUMENT]
|
|
202
|
+
}] }, { type: undefined, decorators: [{
|
|
203
|
+
type: Inject,
|
|
204
|
+
args: [PLATFORM_ID]
|
|
205
|
+
}] }, { type: undefined, decorators: [{
|
|
206
|
+
type: Optional
|
|
207
|
+
}, {
|
|
208
|
+
type: Inject,
|
|
209
|
+
args: [REQUEST]
|
|
210
|
+
}] }];
|
|
211
|
+
} });
|
|
212
|
+
|
|
213
|
+
/*
|
|
214
|
+
* Public API Surface of ngx-cookie-service-ssr
|
|
215
|
+
*/
|
|
216
|
+
|
|
217
|
+
/**
|
|
218
|
+
* Generated bundle index. Do not edit.
|
|
219
|
+
*/
|
|
220
|
+
|
|
221
|
+
export { SsrCookieService };
|
|
222
|
+
//# sourceMappingURL=ngx-cookie-service-ssr.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ngx-cookie-service-ssr.mjs","sources":["../../../projects/ngx-cookie-service-ssr/src/lib/ssr-cookie.service.ts","../../../projects/ngx-cookie-service-ssr/src/public-api.ts","../../../projects/ngx-cookie-service-ssr/src/ngx-cookie-service-ssr.ts"],"sourcesContent":["import { Request } from 'express';\nimport { REQUEST } from '@nguniversal/express-engine/tokens';\nimport { Inject, Injectable, Optional, PLATFORM_ID } from '@angular/core';\nimport { DOCUMENT, isPlatformBrowser } from '@angular/common';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class SsrCookieService {\n private readonly documentIsAccessible: boolean;\n\n constructor(\n @Inject(DOCUMENT) private document: Document,\n // Get the `PLATFORM_ID` so we can check if we're in a browser.\n @Inject(PLATFORM_ID) private platformId: any,\n @Optional() @Inject(REQUEST) private request: Request\n ) {\n this.documentIsAccessible = isPlatformBrowser(this.platformId);\n }\n\n /**\n * Get cookie Regular Expression\n *\n * @param name Cookie name\n * @returns property RegExp\n *\n * @author: Stepan Suvorov\n * @since: 1.0.0\n */\n static getCookieRegExp(name: string): RegExp {\n const escapedName: string = name.replace(/([\\[\\]\\{\\}\\(\\)\\|\\=\\;\\+\\?\\,\\.\\*\\^\\$])/gi, '\\\\$1');\n\n return new RegExp('(?:^' + escapedName + '|;\\\\s*' + escapedName + ')=(.*?)(?:;|$)', 'g');\n }\n\n /**\n * Gets the unencoded version of an encoded component of a Uniform Resource Identifier (URI).\n *\n * @param encodedURIComponent A value representing an encoded URI component.\n *\n * @returns The unencoded version of an encoded component of a Uniform Resource Identifier (URI).\n *\n * @author: Stepan Suvorov\n * @since: 1.0.0\n */\n static safeDecodeURIComponent(encodedURIComponent: string): string {\n try {\n return decodeURIComponent(encodedURIComponent);\n } catch {\n // probably it is not uri encoded. return as is\n return encodedURIComponent;\n }\n }\n\n /**\n * Return `true` if {@link Document} is accessible, otherwise return `false`\n *\n * @param name Cookie name\n * @returns boolean - whether cookie with specified name exists\n *\n * @author: Stepan Suvorov\n * @since: 1.0.0\n */\n check(name: string): boolean {\n name = encodeURIComponent(name);\n const regExp: RegExp = SsrCookieService.getCookieRegExp(name);\n return regExp.test(this.documentIsAccessible ? this.document.cookie : this.request?.headers.cookie);\n }\n\n /**\n * Get cookies by name\n *\n * @param name Cookie name\n * @returns property value\n *\n * @author: Stepan Suvorov\n * @since: 1.0.0\n */\n get(name: string): string {\n if (this.check(name)) {\n name = encodeURIComponent(name);\n\n const regExp: RegExp = SsrCookieService.getCookieRegExp(name);\n const result: RegExpExecArray = regExp.exec(this.documentIsAccessible ? this.document.cookie : this.request?.headers.cookie);\n\n return result[1] ? SsrCookieService.safeDecodeURIComponent(result[1]) : '';\n } else {\n return '';\n }\n }\n\n /**\n * Get all cookies in JSON format\n *\n * @returns all the cookies in json\n *\n * @author: Stepan Suvorov\n * @since: 1.0.0\n */\n getAll(): { [key: string]: string } {\n const cookies: { [key: string]: string } = {};\n const cookieString: any = this.documentIsAccessible ? this.document?.cookie : this.request?.headers.cookie;\n\n if (cookieString && cookieString !== '') {\n cookieString.split(';').forEach((currentCookie) => {\n const [cookieName, cookieValue] = currentCookie.split('=');\n cookies[SsrCookieService.safeDecodeURIComponent(cookieName.replace(/^ /, ''))] = SsrCookieService.safeDecodeURIComponent(cookieValue);\n });\n }\n\n return cookies;\n }\n\n /**\n * Set cookie based on provided information\n *\n * @param name Cookie name\n * @param value Cookie value\n * @param expires Number of days until the cookies expires or an actual `Date`\n * @param path Cookie path\n * @param domain Cookie domain\n * @param secure Secure flag\n * @param sameSite OWASP samesite token `Lax`, `None`, or `Strict`. Defaults to `Lax`\n *\n * @author: Stepan Suvorov\n * @since: 1.0.0\n */\n set(name: string, value: string, expires?: number | Date, path?: string, domain?: string, secure?: boolean, sameSite?: 'Lax' | 'None' | 'Strict'): void;\n\n /**\n * Set cookie based on provided information\n *\n * Cookie's parameters:\n * <pre>\n * expires Number of days until the cookies expires or an actual `Date`\n * path Cookie path\n * domain Cookie domain\n * secure Secure flag\n * sameSite OWASP samesite token `Lax`, `None`, or `Strict`. Defaults to `Lax`\n * </pre>\n *\n * @param name Cookie name\n * @param value Cookie value\n * @param options Body with cookie's params\n *\n * @author: Stepan Suvorov\n * @since: 1.0.0\n */\n set(\n name: string,\n value: string,\n options?: {\n expires?: number | Date;\n path?: string;\n domain?: string;\n secure?: boolean;\n sameSite?: 'Lax' | 'None' | 'Strict';\n }\n ): void;\n\n set(\n name: string,\n value: string,\n expiresOrOptions?: number | Date | any,\n path?: string,\n domain?: string,\n secure?: boolean,\n sameSite?: 'Lax' | 'None' | 'Strict'\n ): void {\n if (!this.documentIsAccessible) {\n return;\n }\n\n if (typeof expiresOrOptions === 'number' || expiresOrOptions instanceof Date || path || domain || secure || sameSite) {\n const optionsBody = {\n expires: expiresOrOptions,\n path,\n domain,\n secure,\n sameSite: sameSite ? sameSite : 'Lax',\n };\n\n this.set(name, value, optionsBody);\n return;\n }\n\n let cookieString: string = encodeURIComponent(name) + '=' + encodeURIComponent(value) + ';';\n\n const options = expiresOrOptions ? expiresOrOptions : {};\n\n if (options.expires) {\n if (typeof options.expires === 'number') {\n const dateExpires: Date = new Date(new Date().getTime() + options.expires * 1000 * 60 * 60 * 24);\n\n cookieString += 'expires=' + dateExpires.toUTCString() + ';';\n } else {\n cookieString += 'expires=' + options.expires.toUTCString() + ';';\n }\n }\n\n if (options.path) {\n cookieString += 'path=' + options.path + ';';\n }\n\n if (options.domain) {\n cookieString += 'domain=' + options.domain + ';';\n }\n\n if (options.secure === false && options.sameSite === 'None') {\n options.secure = true;\n console.warn(\n `[ngx-cookie-service] Cookie ${name} was forced with secure flag because sameSite=None.` +\n `More details : https://github.com/stevermeister/ngx-cookie-service/issues/86#issuecomment-597720130`\n );\n }\n if (options.secure) {\n cookieString += 'secure;';\n }\n\n if (!options.sameSite) {\n options.sameSite = 'Lax';\n }\n\n cookieString += 'sameSite=' + options.sameSite + ';';\n\n this.document.cookie = cookieString;\n }\n\n /**\n * Delete cookie by name\n *\n * @param name Cookie name\n * @param path Cookie path\n * @param domain Cookie domain\n * @param secure Cookie secure flag\n * @param sameSite Cookie sameSite flag - https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie/SameSite\n *\n * @author: Stepan Suvorov\n * @since: 1.0.0\n */\n delete(name: string, path?: string, domain?: string, secure?: boolean, sameSite: 'Lax' | 'None' | 'Strict' = 'Lax'): void {\n if (!this.documentIsAccessible) {\n return;\n }\n const expiresDate = new Date('Thu, 01 Jan 1970 00:00:01 GMT');\n this.set(name, '', { expires: expiresDate, path, domain, secure, sameSite });\n }\n\n /**\n * Delete all cookies\n *\n * @param path Cookie path\n * @param domain Cookie domain\n * @param secure Is the Cookie secure\n * @param sameSite Is the cookie same site\n *\n * @author: Stepan Suvorov\n * @since: 1.0.0\n */\n deleteAll(path?: string, domain?: string, secure?: boolean, sameSite: 'Lax' | 'None' | 'Strict' = 'Lax'): void {\n if (!this.documentIsAccessible) {\n return;\n }\n\n const cookies: any = this.getAll();\n\n for (const cookieName in cookies) {\n if (cookies.hasOwnProperty(cookieName)) {\n this.delete(cookieName, path, domain, secure, sameSite);\n }\n }\n }\n}\n","/*\n * Public API Surface of ngx-cookie-service-ssr\n */\n\nexport * from './lib/ssr-cookie.service';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
import { REQUEST } from '@nguniversal/express-engine/tokens';
|
|
2
|
+
import * as i0 from '@angular/core';
|
|
3
|
+
import { PLATFORM_ID, Injectable, Inject, Optional } from '@angular/core';
|
|
4
|
+
import { isPlatformBrowser, DOCUMENT } from '@angular/common';
|
|
5
|
+
|
|
6
|
+
class SsrCookieService {
|
|
7
|
+
constructor(document,
|
|
8
|
+
// Get the `PLATFORM_ID` so we can check if we're in a browser.
|
|
9
|
+
platformId, request) {
|
|
10
|
+
this.document = document;
|
|
11
|
+
this.platformId = platformId;
|
|
12
|
+
this.request = request;
|
|
13
|
+
this.documentIsAccessible = isPlatformBrowser(this.platformId);
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Get cookie Regular Expression
|
|
17
|
+
*
|
|
18
|
+
* @param name Cookie name
|
|
19
|
+
* @returns property RegExp
|
|
20
|
+
*
|
|
21
|
+
* @author: Stepan Suvorov
|
|
22
|
+
* @since: 1.0.0
|
|
23
|
+
*/
|
|
24
|
+
static getCookieRegExp(name) {
|
|
25
|
+
const escapedName = name.replace(/([\[\]\{\}\(\)\|\=\;\+\?\,\.\*\^\$])/gi, '\\$1');
|
|
26
|
+
return new RegExp('(?:^' + escapedName + '|;\\s*' + escapedName + ')=(.*?)(?:;|$)', 'g');
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Gets the unencoded version of an encoded component of a Uniform Resource Identifier (URI).
|
|
30
|
+
*
|
|
31
|
+
* @param encodedURIComponent A value representing an encoded URI component.
|
|
32
|
+
*
|
|
33
|
+
* @returns The unencoded version of an encoded component of a Uniform Resource Identifier (URI).
|
|
34
|
+
*
|
|
35
|
+
* @author: Stepan Suvorov
|
|
36
|
+
* @since: 1.0.0
|
|
37
|
+
*/
|
|
38
|
+
static safeDecodeURIComponent(encodedURIComponent) {
|
|
39
|
+
try {
|
|
40
|
+
return decodeURIComponent(encodedURIComponent);
|
|
41
|
+
}
|
|
42
|
+
catch {
|
|
43
|
+
// probably it is not uri encoded. return as is
|
|
44
|
+
return encodedURIComponent;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Return `true` if {@link Document} is accessible, otherwise return `false`
|
|
49
|
+
*
|
|
50
|
+
* @param name Cookie name
|
|
51
|
+
* @returns boolean - whether cookie with specified name exists
|
|
52
|
+
*
|
|
53
|
+
* @author: Stepan Suvorov
|
|
54
|
+
* @since: 1.0.0
|
|
55
|
+
*/
|
|
56
|
+
check(name) {
|
|
57
|
+
name = encodeURIComponent(name);
|
|
58
|
+
const regExp = SsrCookieService.getCookieRegExp(name);
|
|
59
|
+
return regExp.test(this.documentIsAccessible ? this.document.cookie : this.request?.headers.cookie);
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Get cookies by name
|
|
63
|
+
*
|
|
64
|
+
* @param name Cookie name
|
|
65
|
+
* @returns property value
|
|
66
|
+
*
|
|
67
|
+
* @author: Stepan Suvorov
|
|
68
|
+
* @since: 1.0.0
|
|
69
|
+
*/
|
|
70
|
+
get(name) {
|
|
71
|
+
if (this.check(name)) {
|
|
72
|
+
name = encodeURIComponent(name);
|
|
73
|
+
const regExp = SsrCookieService.getCookieRegExp(name);
|
|
74
|
+
const result = regExp.exec(this.documentIsAccessible ? this.document.cookie : this.request?.headers.cookie);
|
|
75
|
+
return result[1] ? SsrCookieService.safeDecodeURIComponent(result[1]) : '';
|
|
76
|
+
}
|
|
77
|
+
else {
|
|
78
|
+
return '';
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Get all cookies in JSON format
|
|
83
|
+
*
|
|
84
|
+
* @returns all the cookies in json
|
|
85
|
+
*
|
|
86
|
+
* @author: Stepan Suvorov
|
|
87
|
+
* @since: 1.0.0
|
|
88
|
+
*/
|
|
89
|
+
getAll() {
|
|
90
|
+
const cookies = {};
|
|
91
|
+
const cookieString = this.documentIsAccessible ? this.document?.cookie : this.request?.headers.cookie;
|
|
92
|
+
if (cookieString && cookieString !== '') {
|
|
93
|
+
cookieString.split(';').forEach((currentCookie) => {
|
|
94
|
+
const [cookieName, cookieValue] = currentCookie.split('=');
|
|
95
|
+
cookies[SsrCookieService.safeDecodeURIComponent(cookieName.replace(/^ /, ''))] = SsrCookieService.safeDecodeURIComponent(cookieValue);
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
return cookies;
|
|
99
|
+
}
|
|
100
|
+
set(name, value, expiresOrOptions, path, domain, secure, sameSite) {
|
|
101
|
+
if (!this.documentIsAccessible) {
|
|
102
|
+
return;
|
|
103
|
+
}
|
|
104
|
+
if (typeof expiresOrOptions === 'number' || expiresOrOptions instanceof Date || path || domain || secure || sameSite) {
|
|
105
|
+
const optionsBody = {
|
|
106
|
+
expires: expiresOrOptions,
|
|
107
|
+
path,
|
|
108
|
+
domain,
|
|
109
|
+
secure,
|
|
110
|
+
sameSite: sameSite ? sameSite : 'Lax',
|
|
111
|
+
};
|
|
112
|
+
this.set(name, value, optionsBody);
|
|
113
|
+
return;
|
|
114
|
+
}
|
|
115
|
+
let cookieString = encodeURIComponent(name) + '=' + encodeURIComponent(value) + ';';
|
|
116
|
+
const options = expiresOrOptions ? expiresOrOptions : {};
|
|
117
|
+
if (options.expires) {
|
|
118
|
+
if (typeof options.expires === 'number') {
|
|
119
|
+
const dateExpires = new Date(new Date().getTime() + options.expires * 1000 * 60 * 60 * 24);
|
|
120
|
+
cookieString += 'expires=' + dateExpires.toUTCString() + ';';
|
|
121
|
+
}
|
|
122
|
+
else {
|
|
123
|
+
cookieString += 'expires=' + options.expires.toUTCString() + ';';
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
if (options.path) {
|
|
127
|
+
cookieString += 'path=' + options.path + ';';
|
|
128
|
+
}
|
|
129
|
+
if (options.domain) {
|
|
130
|
+
cookieString += 'domain=' + options.domain + ';';
|
|
131
|
+
}
|
|
132
|
+
if (options.secure === false && options.sameSite === 'None') {
|
|
133
|
+
options.secure = true;
|
|
134
|
+
console.warn(`[ngx-cookie-service] Cookie ${name} was forced with secure flag because sameSite=None.` +
|
|
135
|
+
`More details : https://github.com/stevermeister/ngx-cookie-service/issues/86#issuecomment-597720130`);
|
|
136
|
+
}
|
|
137
|
+
if (options.secure) {
|
|
138
|
+
cookieString += 'secure;';
|
|
139
|
+
}
|
|
140
|
+
if (!options.sameSite) {
|
|
141
|
+
options.sameSite = 'Lax';
|
|
142
|
+
}
|
|
143
|
+
cookieString += 'sameSite=' + options.sameSite + ';';
|
|
144
|
+
this.document.cookie = cookieString;
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Delete cookie by name
|
|
148
|
+
*
|
|
149
|
+
* @param name Cookie name
|
|
150
|
+
* @param path Cookie path
|
|
151
|
+
* @param domain Cookie domain
|
|
152
|
+
* @param secure Cookie secure flag
|
|
153
|
+
* @param sameSite Cookie sameSite flag - https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie/SameSite
|
|
154
|
+
*
|
|
155
|
+
* @author: Stepan Suvorov
|
|
156
|
+
* @since: 1.0.0
|
|
157
|
+
*/
|
|
158
|
+
delete(name, path, domain, secure, sameSite = 'Lax') {
|
|
159
|
+
if (!this.documentIsAccessible) {
|
|
160
|
+
return;
|
|
161
|
+
}
|
|
162
|
+
const expiresDate = new Date('Thu, 01 Jan 1970 00:00:01 GMT');
|
|
163
|
+
this.set(name, '', { expires: expiresDate, path, domain, secure, sameSite });
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* Delete all cookies
|
|
167
|
+
*
|
|
168
|
+
* @param path Cookie path
|
|
169
|
+
* @param domain Cookie domain
|
|
170
|
+
* @param secure Is the Cookie secure
|
|
171
|
+
* @param sameSite Is the cookie same site
|
|
172
|
+
*
|
|
173
|
+
* @author: Stepan Suvorov
|
|
174
|
+
* @since: 1.0.0
|
|
175
|
+
*/
|
|
176
|
+
deleteAll(path, domain, secure, sameSite = 'Lax') {
|
|
177
|
+
if (!this.documentIsAccessible) {
|
|
178
|
+
return;
|
|
179
|
+
}
|
|
180
|
+
const cookies = this.getAll();
|
|
181
|
+
for (const cookieName in cookies) {
|
|
182
|
+
if (cookies.hasOwnProperty(cookieName)) {
|
|
183
|
+
this.delete(cookieName, path, domain, secure, sameSite);
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
SsrCookieService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.0", ngImport: i0, type: SsrCookieService, deps: [{ token: DOCUMENT }, { token: PLATFORM_ID }, { token: REQUEST, optional: true }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
189
|
+
SsrCookieService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.0.0", ngImport: i0, type: SsrCookieService, providedIn: 'root' });
|
|
190
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.0", ngImport: i0, type: SsrCookieService, decorators: [{
|
|
191
|
+
type: Injectable,
|
|
192
|
+
args: [{
|
|
193
|
+
providedIn: 'root',
|
|
194
|
+
}]
|
|
195
|
+
}], ctorParameters: function () { return [{ type: Document, decorators: [{
|
|
196
|
+
type: Inject,
|
|
197
|
+
args: [DOCUMENT]
|
|
198
|
+
}] }, { type: undefined, decorators: [{
|
|
199
|
+
type: Inject,
|
|
200
|
+
args: [PLATFORM_ID]
|
|
201
|
+
}] }, { type: undefined, decorators: [{
|
|
202
|
+
type: Optional
|
|
203
|
+
}, {
|
|
204
|
+
type: Inject,
|
|
205
|
+
args: [REQUEST]
|
|
206
|
+
}] }]; } });
|
|
207
|
+
|
|
208
|
+
/*
|
|
209
|
+
* Public API Surface of ngx-cookie-service-ssr
|
|
210
|
+
*/
|
|
211
|
+
|
|
212
|
+
/**
|
|
213
|
+
* Generated bundle index. Do not edit.
|
|
214
|
+
*/
|
|
215
|
+
|
|
216
|
+
export { SsrCookieService };
|
|
217
|
+
//# sourceMappingURL=ngx-cookie-service-ssr.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ngx-cookie-service-ssr.mjs","sources":["../../../projects/ngx-cookie-service-ssr/src/lib/ssr-cookie.service.ts","../../../projects/ngx-cookie-service-ssr/src/public-api.ts","../../../projects/ngx-cookie-service-ssr/src/ngx-cookie-service-ssr.ts"],"sourcesContent":["import { Request } from 'express';\nimport { REQUEST } from '@nguniversal/express-engine/tokens';\nimport { Inject, Injectable, Optional, PLATFORM_ID } from '@angular/core';\nimport { DOCUMENT, isPlatformBrowser } from '@angular/common';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class SsrCookieService {\n private readonly documentIsAccessible: boolean;\n\n constructor(\n @Inject(DOCUMENT) private document: Document,\n // Get the `PLATFORM_ID` so we can check if we're in a browser.\n @Inject(PLATFORM_ID) private platformId: any,\n @Optional() @Inject(REQUEST) private request: Request\n ) {\n this.documentIsAccessible = isPlatformBrowser(this.platformId);\n }\n\n /**\n * Get cookie Regular Expression\n *\n * @param name Cookie name\n * @returns property RegExp\n *\n * @author: Stepan Suvorov\n * @since: 1.0.0\n */\n static getCookieRegExp(name: string): RegExp {\n const escapedName: string = name.replace(/([\\[\\]\\{\\}\\(\\)\\|\\=\\;\\+\\?\\,\\.\\*\\^\\$])/gi, '\\\\$1');\n\n return new RegExp('(?:^' + escapedName + '|;\\\\s*' + escapedName + ')=(.*?)(?:;|$)', 'g');\n }\n\n /**\n * Gets the unencoded version of an encoded component of a Uniform Resource Identifier (URI).\n *\n * @param encodedURIComponent A value representing an encoded URI component.\n *\n * @returns The unencoded version of an encoded component of a Uniform Resource Identifier (URI).\n *\n * @author: Stepan Suvorov\n * @since: 1.0.0\n */\n static safeDecodeURIComponent(encodedURIComponent: string): string {\n try {\n return decodeURIComponent(encodedURIComponent);\n } catch {\n // probably it is not uri encoded. return as is\n return encodedURIComponent;\n }\n }\n\n /**\n * Return `true` if {@link Document} is accessible, otherwise return `false`\n *\n * @param name Cookie name\n * @returns boolean - whether cookie with specified name exists\n *\n * @author: Stepan Suvorov\n * @since: 1.0.0\n */\n check(name: string): boolean {\n name = encodeURIComponent(name);\n const regExp: RegExp = SsrCookieService.getCookieRegExp(name);\n return regExp.test(this.documentIsAccessible ? this.document.cookie : this.request?.headers.cookie);\n }\n\n /**\n * Get cookies by name\n *\n * @param name Cookie name\n * @returns property value\n *\n * @author: Stepan Suvorov\n * @since: 1.0.0\n */\n get(name: string): string {\n if (this.check(name)) {\n name = encodeURIComponent(name);\n\n const regExp: RegExp = SsrCookieService.getCookieRegExp(name);\n const result: RegExpExecArray = regExp.exec(this.documentIsAccessible ? this.document.cookie : this.request?.headers.cookie);\n\n return result[1] ? SsrCookieService.safeDecodeURIComponent(result[1]) : '';\n } else {\n return '';\n }\n }\n\n /**\n * Get all cookies in JSON format\n *\n * @returns all the cookies in json\n *\n * @author: Stepan Suvorov\n * @since: 1.0.0\n */\n getAll(): { [key: string]: string } {\n const cookies: { [key: string]: string } = {};\n const cookieString: any = this.documentIsAccessible ? this.document?.cookie : this.request?.headers.cookie;\n\n if (cookieString && cookieString !== '') {\n cookieString.split(';').forEach((currentCookie) => {\n const [cookieName, cookieValue] = currentCookie.split('=');\n cookies[SsrCookieService.safeDecodeURIComponent(cookieName.replace(/^ /, ''))] = SsrCookieService.safeDecodeURIComponent(cookieValue);\n });\n }\n\n return cookies;\n }\n\n /**\n * Set cookie based on provided information\n *\n * @param name Cookie name\n * @param value Cookie value\n * @param expires Number of days until the cookies expires or an actual `Date`\n * @param path Cookie path\n * @param domain Cookie domain\n * @param secure Secure flag\n * @param sameSite OWASP samesite token `Lax`, `None`, or `Strict`. Defaults to `Lax`\n *\n * @author: Stepan Suvorov\n * @since: 1.0.0\n */\n set(name: string, value: string, expires?: number | Date, path?: string, domain?: string, secure?: boolean, sameSite?: 'Lax' | 'None' | 'Strict'): void;\n\n /**\n * Set cookie based on provided information\n *\n * Cookie's parameters:\n * <pre>\n * expires Number of days until the cookies expires or an actual `Date`\n * path Cookie path\n * domain Cookie domain\n * secure Secure flag\n * sameSite OWASP samesite token `Lax`, `None`, or `Strict`. Defaults to `Lax`\n * </pre>\n *\n * @param name Cookie name\n * @param value Cookie value\n * @param options Body with cookie's params\n *\n * @author: Stepan Suvorov\n * @since: 1.0.0\n */\n set(\n name: string,\n value: string,\n options?: {\n expires?: number | Date;\n path?: string;\n domain?: string;\n secure?: boolean;\n sameSite?: 'Lax' | 'None' | 'Strict';\n }\n ): void;\n\n set(\n name: string,\n value: string,\n expiresOrOptions?: number | Date | any,\n path?: string,\n domain?: string,\n secure?: boolean,\n sameSite?: 'Lax' | 'None' | 'Strict'\n ): void {\n if (!this.documentIsAccessible) {\n return;\n }\n\n if (typeof expiresOrOptions === 'number' || expiresOrOptions instanceof Date || path || domain || secure || sameSite) {\n const optionsBody = {\n expires: expiresOrOptions,\n path,\n domain,\n secure,\n sameSite: sameSite ? sameSite : 'Lax',\n };\n\n this.set(name, value, optionsBody);\n return;\n }\n\n let cookieString: string = encodeURIComponent(name) + '=' + encodeURIComponent(value) + ';';\n\n const options = expiresOrOptions ? expiresOrOptions : {};\n\n if (options.expires) {\n if (typeof options.expires === 'number') {\n const dateExpires: Date = new Date(new Date().getTime() + options.expires * 1000 * 60 * 60 * 24);\n\n cookieString += 'expires=' + dateExpires.toUTCString() + ';';\n } else {\n cookieString += 'expires=' + options.expires.toUTCString() + ';';\n }\n }\n\n if (options.path) {\n cookieString += 'path=' + options.path + ';';\n }\n\n if (options.domain) {\n cookieString += 'domain=' + options.domain + ';';\n }\n\n if (options.secure === false && options.sameSite === 'None') {\n options.secure = true;\n console.warn(\n `[ngx-cookie-service] Cookie ${name} was forced with secure flag because sameSite=None.` +\n `More details : https://github.com/stevermeister/ngx-cookie-service/issues/86#issuecomment-597720130`\n );\n }\n if (options.secure) {\n cookieString += 'secure;';\n }\n\n if (!options.sameSite) {\n options.sameSite = 'Lax';\n }\n\n cookieString += 'sameSite=' + options.sameSite + ';';\n\n this.document.cookie = cookieString;\n }\n\n /**\n * Delete cookie by name\n *\n * @param name Cookie name\n * @param path Cookie path\n * @param domain Cookie domain\n * @param secure Cookie secure flag\n * @param sameSite Cookie sameSite flag - https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie/SameSite\n *\n * @author: Stepan Suvorov\n * @since: 1.0.0\n */\n delete(name: string, path?: string, domain?: string, secure?: boolean, sameSite: 'Lax' | 'None' | 'Strict' = 'Lax'): void {\n if (!this.documentIsAccessible) {\n return;\n }\n const expiresDate = new Date('Thu, 01 Jan 1970 00:00:01 GMT');\n this.set(name, '', { expires: expiresDate, path, domain, secure, sameSite });\n }\n\n /**\n * Delete all cookies\n *\n * @param path Cookie path\n * @param domain Cookie domain\n * @param secure Is the Cookie secure\n * @param sameSite Is the cookie same site\n *\n * @author: Stepan Suvorov\n * @since: 1.0.0\n */\n deleteAll(path?: string, domain?: string, secure?: boolean, sameSite: 'Lax' | 'None' | 'Strict' = 'Lax'): void {\n if (!this.documentIsAccessible) {\n return;\n }\n\n const cookies: any = this.getAll();\n\n for (const cookieName in cookies) {\n if (cookies.hasOwnProperty(cookieName)) {\n this.delete(cookieName, path, domain, secure, sameSite);\n }\n }\n }\n}\n","/*\n * Public API Surface of ngx-cookie-service-ssr\n */\n\nexport * from './lib/ssr-cookie.service';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":";;;;;MAQa,gBAAgB,CAAA;AAG3B,IAAA,WAAA,CAC4B,QAAkB;;AAEf,IAAA,UAAe,EACP,OAAgB,EAAA;QAH3B,IAAQ,CAAA,QAAA,GAAR,QAAQ,CAAU;QAEf,IAAU,CAAA,UAAA,GAAV,UAAU,CAAK;QACP,IAAO,CAAA,OAAA,GAAP,OAAO,CAAS;QAErD,IAAI,CAAC,oBAAoB,GAAG,iBAAiB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;KAChE;AAED;;;;;;;;AAQG;IACH,OAAO,eAAe,CAAC,IAAY,EAAA;QACjC,MAAM,WAAW,GAAW,IAAI,CAAC,OAAO,CAAC,wCAAwC,EAAE,MAAM,CAAC,CAAC;AAE3F,QAAA,OAAO,IAAI,MAAM,CAAC,MAAM,GAAG,WAAW,GAAG,QAAQ,GAAG,WAAW,GAAG,gBAAgB,EAAE,GAAG,CAAC,CAAC;KAC1F;AAED;;;;;;;;;AASG;IACH,OAAO,sBAAsB,CAAC,mBAA2B,EAAA;QACvD,IAAI;AACF,YAAA,OAAO,kBAAkB,CAAC,mBAAmB,CAAC,CAAC;AAChD,SAAA;QAAC,MAAM;;AAEN,YAAA,OAAO,mBAAmB,CAAC;AAC5B,SAAA;KACF;AAED;;;;;;;;AAQG;AACH,IAAA,KAAK,CAAC,IAAY,EAAA;AAChB,QAAA,IAAI,GAAG,kBAAkB,CAAC,IAAI,CAAC,CAAC;QAChC,MAAM,MAAM,GAAW,gBAAgB,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;QAC9D,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;KACrG;AAED;;;;;;;;AAQG;AACH,IAAA,GAAG,CAAC,IAAY,EAAA;AACd,QAAA,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE;AACpB,YAAA,IAAI,GAAG,kBAAkB,CAAC,IAAI,CAAC,CAAC;YAEhC,MAAM,MAAM,GAAW,gBAAgB,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;AAC9D,YAAA,MAAM,MAAM,GAAoB,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;YAE7H,OAAO,MAAM,CAAC,CAAC,CAAC,GAAG,gBAAgB,CAAC,sBAAsB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;AAC5E,SAAA;AAAM,aAAA;AACL,YAAA,OAAO,EAAE,CAAC;AACX,SAAA;KACF;AAED;;;;;;;AAOG;IACH,MAAM,GAAA;QACJ,MAAM,OAAO,GAA8B,EAAE,CAAC;QAC9C,MAAM,YAAY,GAAQ,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC;AAE3G,QAAA,IAAI,YAAY,IAAI,YAAY,KAAK,EAAE,EAAE;YACvC,YAAY,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,aAAa,KAAI;AAChD,gBAAA,MAAM,CAAC,UAAU,EAAE,WAAW,CAAC,GAAG,aAAa,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;gBAC3D,OAAO,CAAC,gBAAgB,CAAC,sBAAsB,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,gBAAgB,CAAC,sBAAsB,CAAC,WAAW,CAAC,CAAC;AACxI,aAAC,CAAC,CAAC;AACJ,SAAA;AAED,QAAA,OAAO,OAAO,CAAC;KAChB;AAiDD,IAAA,GAAG,CACD,IAAY,EACZ,KAAa,EACb,gBAAsC,EACtC,IAAa,EACb,MAAe,EACf,MAAgB,EAChB,QAAoC,EAAA;AAEpC,QAAA,IAAI,CAAC,IAAI,CAAC,oBAAoB,EAAE;YAC9B,OAAO;AACR,SAAA;AAED,QAAA,IAAI,OAAO,gBAAgB,KAAK,QAAQ,IAAI,gBAAgB,YAAY,IAAI,IAAI,IAAI,IAAI,MAAM,IAAI,MAAM,IAAI,QAAQ,EAAE;AACpH,YAAA,MAAM,WAAW,GAAG;AAClB,gBAAA,OAAO,EAAE,gBAAgB;gBACzB,IAAI;gBACJ,MAAM;gBACN,MAAM;gBACN,QAAQ,EAAE,QAAQ,GAAG,QAAQ,GAAG,KAAK;aACtC,CAAC;YAEF,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE,WAAW,CAAC,CAAC;YACnC,OAAO;AACR,SAAA;AAED,QAAA,IAAI,YAAY,GAAW,kBAAkB,CAAC,IAAI,CAAC,GAAG,GAAG,GAAG,kBAAkB,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC;QAE5F,MAAM,OAAO,GAAG,gBAAgB,GAAG,gBAAgB,GAAG,EAAE,CAAC;QAEzD,IAAI,OAAO,CAAC,OAAO,EAAE;AACnB,YAAA,IAAI,OAAO,OAAO,CAAC,OAAO,KAAK,QAAQ,EAAE;gBACvC,MAAM,WAAW,GAAS,IAAI,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC,OAAO,EAAE,GAAG,OAAO,CAAC,OAAO,GAAG,IAAI,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;gBAEjG,YAAY,IAAI,UAAU,GAAG,WAAW,CAAC,WAAW,EAAE,GAAG,GAAG,CAAC;AAC9D,aAAA;AAAM,iBAAA;gBACL,YAAY,IAAI,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,WAAW,EAAE,GAAG,GAAG,CAAC;AAClE,aAAA;AACF,SAAA;QAED,IAAI,OAAO,CAAC,IAAI,EAAE;YAChB,YAAY,IAAI,OAAO,GAAG,OAAO,CAAC,IAAI,GAAG,GAAG,CAAC;AAC9C,SAAA;QAED,IAAI,OAAO,CAAC,MAAM,EAAE;YAClB,YAAY,IAAI,SAAS,GAAG,OAAO,CAAC,MAAM,GAAG,GAAG,CAAC;AAClD,SAAA;QAED,IAAI,OAAO,CAAC,MAAM,KAAK,KAAK,IAAI,OAAO,CAAC,QAAQ,KAAK,MAAM,EAAE;AAC3D,YAAA,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;AACtB,YAAA,OAAO,CAAC,IAAI,CACV,CAAA,4BAAA,EAA+B,IAAI,CAAqD,mDAAA,CAAA;AACtF,gBAAA,CAAA,mGAAA,CAAqG,CACxG,CAAC;AACH,SAAA;QACD,IAAI,OAAO,CAAC,MAAM,EAAE;YAClB,YAAY,IAAI,SAAS,CAAC;AAC3B,SAAA;AAED,QAAA,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE;AACrB,YAAA,OAAO,CAAC,QAAQ,GAAG,KAAK,CAAC;AAC1B,SAAA;QAED,YAAY,IAAI,WAAW,GAAG,OAAO,CAAC,QAAQ,GAAG,GAAG,CAAC;AAErD,QAAA,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,YAAY,CAAC;KACrC;AAED;;;;;;;;;;;AAWG;IACH,MAAM,CAAC,IAAY,EAAE,IAAa,EAAE,MAAe,EAAE,MAAgB,EAAE,QAAA,GAAsC,KAAK,EAAA;AAChH,QAAA,IAAI,CAAC,IAAI,CAAC,oBAAoB,EAAE;YAC9B,OAAO;AACR,SAAA;AACD,QAAA,MAAM,WAAW,GAAG,IAAI,IAAI,CAAC,+BAA+B,CAAC,CAAC;QAC9D,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,EAAE,EAAE,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;KAC9E;AAED;;;;;;;;;;AAUG;IACH,SAAS,CAAC,IAAa,EAAE,MAAe,EAAE,MAAgB,EAAE,WAAsC,KAAK,EAAA;AACrG,QAAA,IAAI,CAAC,IAAI,CAAC,oBAAoB,EAAE;YAC9B,OAAO;AACR,SAAA;AAED,QAAA,MAAM,OAAO,GAAQ,IAAI,CAAC,MAAM,EAAE,CAAC;AAEnC,QAAA,KAAK,MAAM,UAAU,IAAI,OAAO,EAAE;AAChC,YAAA,IAAI,OAAO,CAAC,cAAc,CAAC,UAAU,CAAC,EAAE;AACtC,gBAAA,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;AACzD,aAAA;AACF,SAAA;KACF;;AAvQU,gBAAA,CAAA,IAAA,GAAA,EAAA,CAAA,kBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,gBAAgB,EAIjB,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,QAAQ,EAER,EAAA,EAAA,KAAA,EAAA,WAAW,aACC,OAAO,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AAPlB,gBAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,gBAAgB,cAFf,MAAM,EAAA,CAAA,CAAA;2FAEP,gBAAgB,EAAA,UAAA,EAAA,CAAA;kBAH5B,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA,CAAA;0DAKuC,QAAQ,EAAA,UAAA,EAAA,CAAA;0BAA3C,MAAM;2BAAC,QAAQ,CAAA;;0BAEf,MAAM;2BAAC,WAAW,CAAA;;0BAClB,QAAQ;;0BAAI,MAAM;2BAAC,OAAO,CAAA;;;ACf/B;;AAEG;;ACFH;;AAEG;;;;"}
|
package/index.d.ts
ADDED
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
import { Request } from 'express';
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
export declare class SsrCookieService {
|
|
4
|
+
private document;
|
|
5
|
+
private platformId;
|
|
6
|
+
private request;
|
|
7
|
+
private readonly documentIsAccessible;
|
|
8
|
+
constructor(document: Document, platformId: any, request: Request);
|
|
9
|
+
/**
|
|
10
|
+
* Get cookie Regular Expression
|
|
11
|
+
*
|
|
12
|
+
* @param name Cookie name
|
|
13
|
+
* @returns property RegExp
|
|
14
|
+
*
|
|
15
|
+
* @author: Stepan Suvorov
|
|
16
|
+
* @since: 1.0.0
|
|
17
|
+
*/
|
|
18
|
+
static getCookieRegExp(name: string): RegExp;
|
|
19
|
+
/**
|
|
20
|
+
* Gets the unencoded version of an encoded component of a Uniform Resource Identifier (URI).
|
|
21
|
+
*
|
|
22
|
+
* @param encodedURIComponent A value representing an encoded URI component.
|
|
23
|
+
*
|
|
24
|
+
* @returns The unencoded version of an encoded component of a Uniform Resource Identifier (URI).
|
|
25
|
+
*
|
|
26
|
+
* @author: Stepan Suvorov
|
|
27
|
+
* @since: 1.0.0
|
|
28
|
+
*/
|
|
29
|
+
static safeDecodeURIComponent(encodedURIComponent: string): string;
|
|
30
|
+
/**
|
|
31
|
+
* Return `true` if {@link Document} is accessible, otherwise return `false`
|
|
32
|
+
*
|
|
33
|
+
* @param name Cookie name
|
|
34
|
+
* @returns boolean - whether cookie with specified name exists
|
|
35
|
+
*
|
|
36
|
+
* @author: Stepan Suvorov
|
|
37
|
+
* @since: 1.0.0
|
|
38
|
+
*/
|
|
39
|
+
check(name: string): boolean;
|
|
40
|
+
/**
|
|
41
|
+
* Get cookies by name
|
|
42
|
+
*
|
|
43
|
+
* @param name Cookie name
|
|
44
|
+
* @returns property value
|
|
45
|
+
*
|
|
46
|
+
* @author: Stepan Suvorov
|
|
47
|
+
* @since: 1.0.0
|
|
48
|
+
*/
|
|
49
|
+
get(name: string): string;
|
|
50
|
+
/**
|
|
51
|
+
* Get all cookies in JSON format
|
|
52
|
+
*
|
|
53
|
+
* @returns all the cookies in json
|
|
54
|
+
*
|
|
55
|
+
* @author: Stepan Suvorov
|
|
56
|
+
* @since: 1.0.0
|
|
57
|
+
*/
|
|
58
|
+
getAll(): {
|
|
59
|
+
[key: string]: string;
|
|
60
|
+
};
|
|
61
|
+
/**
|
|
62
|
+
* Set cookie based on provided information
|
|
63
|
+
*
|
|
64
|
+
* @param name Cookie name
|
|
65
|
+
* @param value Cookie value
|
|
66
|
+
* @param expires Number of days until the cookies expires or an actual `Date`
|
|
67
|
+
* @param path Cookie path
|
|
68
|
+
* @param domain Cookie domain
|
|
69
|
+
* @param secure Secure flag
|
|
70
|
+
* @param sameSite OWASP samesite token `Lax`, `None`, or `Strict`. Defaults to `Lax`
|
|
71
|
+
*
|
|
72
|
+
* @author: Stepan Suvorov
|
|
73
|
+
* @since: 1.0.0
|
|
74
|
+
*/
|
|
75
|
+
set(name: string, value: string, expires?: number | Date, path?: string, domain?: string, secure?: boolean, sameSite?: 'Lax' | 'None' | 'Strict'): void;
|
|
76
|
+
/**
|
|
77
|
+
* Set cookie based on provided information
|
|
78
|
+
*
|
|
79
|
+
* Cookie's parameters:
|
|
80
|
+
* <pre>
|
|
81
|
+
* expires Number of days until the cookies expires or an actual `Date`
|
|
82
|
+
* path Cookie path
|
|
83
|
+
* domain Cookie domain
|
|
84
|
+
* secure Secure flag
|
|
85
|
+
* sameSite OWASP samesite token `Lax`, `None`, or `Strict`. Defaults to `Lax`
|
|
86
|
+
* </pre>
|
|
87
|
+
*
|
|
88
|
+
* @param name Cookie name
|
|
89
|
+
* @param value Cookie value
|
|
90
|
+
* @param options Body with cookie's params
|
|
91
|
+
*
|
|
92
|
+
* @author: Stepan Suvorov
|
|
93
|
+
* @since: 1.0.0
|
|
94
|
+
*/
|
|
95
|
+
set(name: string, value: string, options?: {
|
|
96
|
+
expires?: number | Date;
|
|
97
|
+
path?: string;
|
|
98
|
+
domain?: string;
|
|
99
|
+
secure?: boolean;
|
|
100
|
+
sameSite?: 'Lax' | 'None' | 'Strict';
|
|
101
|
+
}): void;
|
|
102
|
+
/**
|
|
103
|
+
* Delete cookie by name
|
|
104
|
+
*
|
|
105
|
+
* @param name Cookie name
|
|
106
|
+
* @param path Cookie path
|
|
107
|
+
* @param domain Cookie domain
|
|
108
|
+
* @param secure Cookie secure flag
|
|
109
|
+
* @param sameSite Cookie sameSite flag - https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie/SameSite
|
|
110
|
+
*
|
|
111
|
+
* @author: Stepan Suvorov
|
|
112
|
+
* @since: 1.0.0
|
|
113
|
+
*/
|
|
114
|
+
delete(name: string, path?: string, domain?: string, secure?: boolean, sameSite?: 'Lax' | 'None' | 'Strict'): void;
|
|
115
|
+
/**
|
|
116
|
+
* Delete all cookies
|
|
117
|
+
*
|
|
118
|
+
* @param path Cookie path
|
|
119
|
+
* @param domain Cookie domain
|
|
120
|
+
* @param secure Is the Cookie secure
|
|
121
|
+
* @param sameSite Is the cookie same site
|
|
122
|
+
*
|
|
123
|
+
* @author: Stepan Suvorov
|
|
124
|
+
* @since: 1.0.0
|
|
125
|
+
*/
|
|
126
|
+
deleteAll(path?: string, domain?: string, secure?: boolean, sameSite?: 'Lax' | 'None' | 'Strict'): void;
|
|
127
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<SsrCookieService, [null, null, { optional: true; }]>;
|
|
128
|
+
static ɵprov: i0.ɵɵInjectableDeclaration<SsrCookieService>;
|
|
129
|
+
}
|
package/package.json
ADDED
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "ngx-cookie-service-ssr",
|
|
3
|
+
"description": "Angular SSR cookie service",
|
|
4
|
+
"version": "14.0.0-beta.0",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"author": "Stepan Suvorov <stevermeister@gmail.com>",
|
|
7
|
+
"keywords": [
|
|
8
|
+
"angular",
|
|
9
|
+
"angular2",
|
|
10
|
+
"angular4",
|
|
11
|
+
"angular5",
|
|
12
|
+
"angular-2",
|
|
13
|
+
"angular-4",
|
|
14
|
+
"angular-5",
|
|
15
|
+
"angular-6",
|
|
16
|
+
"angular-7",
|
|
17
|
+
"angular-8",
|
|
18
|
+
"angular-9",
|
|
19
|
+
"angular-10",
|
|
20
|
+
"angular-11",
|
|
21
|
+
"angular-12",
|
|
22
|
+
"angular-13",
|
|
23
|
+
"angular-14",
|
|
24
|
+
"ivy",
|
|
25
|
+
"ivy-compatible",
|
|
26
|
+
"ivy-compilation",
|
|
27
|
+
"ngx",
|
|
28
|
+
"ng2",
|
|
29
|
+
"ng",
|
|
30
|
+
"service",
|
|
31
|
+
"angular-service",
|
|
32
|
+
"cookie-service",
|
|
33
|
+
"cookie",
|
|
34
|
+
"cookies"
|
|
35
|
+
],
|
|
36
|
+
"contributors": [
|
|
37
|
+
{
|
|
38
|
+
"name": "Pavan Kumar Jadda"
|
|
39
|
+
},
|
|
40
|
+
{
|
|
41
|
+
"name": "Christopher Parotat",
|
|
42
|
+
"email": "c.parotat@7leads.org"
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
"name": "Stefan Bauer",
|
|
46
|
+
"email": "bauer.stefan@live.de"
|
|
47
|
+
},
|
|
48
|
+
{
|
|
49
|
+
"name": "Kristian Thy",
|
|
50
|
+
"email": "thy@42.dk"
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
"name": "Jared Clemence"
|
|
54
|
+
},
|
|
55
|
+
{
|
|
56
|
+
"name": "flakolefluk"
|
|
57
|
+
},
|
|
58
|
+
{
|
|
59
|
+
"name": "mattbanks"
|
|
60
|
+
},
|
|
61
|
+
{
|
|
62
|
+
"name": "DBaker85"
|
|
63
|
+
},
|
|
64
|
+
{
|
|
65
|
+
"name": "Matt Lewis",
|
|
66
|
+
"email": "npm@mattlewis.me"
|
|
67
|
+
},
|
|
68
|
+
{
|
|
69
|
+
"name": "IceBreakerG"
|
|
70
|
+
}
|
|
71
|
+
],
|
|
72
|
+
"repository": {
|
|
73
|
+
"type": "git",
|
|
74
|
+
"url": "https://github.com/stevermeister/ngx-cookie-service.git"
|
|
75
|
+
},
|
|
76
|
+
"bugs": {
|
|
77
|
+
"url": "https://github.com/stevermeister/ngx-cookie-service/issues",
|
|
78
|
+
"email": "stepan@studytube.nl"
|
|
79
|
+
},
|
|
80
|
+
"peerDependencies": {
|
|
81
|
+
"@angular/common": "^14.0.0",
|
|
82
|
+
"@angular/core": "^14.0.0",
|
|
83
|
+
"@nguniversal/express-engine": "^14.0.0"
|
|
84
|
+
},
|
|
85
|
+
"dependencies": {
|
|
86
|
+
"tslib": "^2.0.0"
|
|
87
|
+
},
|
|
88
|
+
"resolve": {
|
|
89
|
+
"fallback": {
|
|
90
|
+
"path": false,
|
|
91
|
+
"http": false,
|
|
92
|
+
"stream": false,
|
|
93
|
+
"util": false
|
|
94
|
+
}
|
|
95
|
+
},
|
|
96
|
+
"module": "fesm2015/ngx-cookie-service-ssr.mjs",
|
|
97
|
+
"es2020": "fesm2020/ngx-cookie-service-ssr.mjs",
|
|
98
|
+
"esm2020": "esm2020/ngx-cookie-service-ssr.mjs",
|
|
99
|
+
"fesm2020": "fesm2020/ngx-cookie-service-ssr.mjs",
|
|
100
|
+
"fesm2015": "fesm2015/ngx-cookie-service-ssr.mjs",
|
|
101
|
+
"typings": "index.d.ts",
|
|
102
|
+
"exports": {
|
|
103
|
+
"./package.json": {
|
|
104
|
+
"default": "./package.json"
|
|
105
|
+
},
|
|
106
|
+
".": {
|
|
107
|
+
"types": "./index.d.ts",
|
|
108
|
+
"esm2020": "./esm2020/ngx-cookie-service-ssr.mjs",
|
|
109
|
+
"es2020": "./fesm2020/ngx-cookie-service-ssr.mjs",
|
|
110
|
+
"es2015": "./fesm2015/ngx-cookie-service-ssr.mjs",
|
|
111
|
+
"node": "./fesm2015/ngx-cookie-service-ssr.mjs",
|
|
112
|
+
"default": "./fesm2020/ngx-cookie-service-ssr.mjs"
|
|
113
|
+
}
|
|
114
|
+
},
|
|
115
|
+
"sideEffects": false
|
|
116
|
+
}
|
package/public-api.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './lib/ssr-cookie.service';
|