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 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":"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"}
package/index.d.ts ADDED
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Generated bundle index. Do not edit.
3
+ */
4
+ /// <amd-module name="ngx-cookie-service-ssr" />
5
+ export * from './public-api';
@@ -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
+ }
@@ -0,0 +1 @@
1
+ export * from './lib/ssr-cookie.service';