ngx-cookie-service 22.0.0 → 22.1.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 CHANGED
@@ -148,6 +148,9 @@ server.get('*', (req, res) => {
148
148
  use `REQUEST.cookies` to access the
149
149
  cookies in SSR. Then proceed to use `ngx-cookie-service` as usual.
150
150
  4. See the [sample repo](https://github.com/pavankjadda/angular-ssr-docker) for more details.
151
+ 5. On the server, `get()`, `check()` and `getAll()` also see cookies set or deleted earlier while rendering the same
152
+ request, whatever their `path` or `domain`. Cookies with `httpOnly: true` can only be set on the server; in the
153
+ browser the call is skipped with a console warning.
151
154
 
152
155
  ## Demo
153
156
 
@@ -212,17 +215,27 @@ to `Lax`.
212
215
  Read [this](https://stackoverflow.com/a/1063760) and [this](https://stackoverflow.com/a/17777005/1007003) StackOverflow
213
216
  answer for a more in-depth explanation.
214
217
 
215
- **Important:** Browsers do not accept cookies flagged sameSite = 'None' if secure flag isn't set as well. CookieService
216
- will override the secure flag to true if sameSite='None'.
218
+ **Important:** Browsers do not accept cookies flagged sameSite = 'None' or partitioned unless the secure flag is set as
219
+ well. CookieService will override the secure flag to true if sameSite='None' or partitioned is true.
220
+
221
+ If `path` or `domain` contains `;` or a control character, the cookie is not written or deleted, and a warning is
222
+ logged to the console. An invalid `expires` or `sameSite` value is ignored with a warning.
217
223
 
218
224
  ## delete( name: string, path?: string, domain?: string, secure?: boolean, sameSite: 'Lax' | 'None' | 'Strict' = 'Lax'): void;
219
225
 
226
+ ## delete( name: string, options?: { path?: string, domain?: string, secure?: boolean, sameSite?: 'Lax' | 'None' | 'Strict', partitioned?: boolean }): void;
227
+
220
228
  ```typescript
221
229
  cookieService.delete('test');
230
+ cookieService.delete('test', { path: '/', secure: true, sameSite: 'None', partitioned: true });
222
231
  ```
223
232
 
224
- Deletes a cookie with the specified `name`. It is best practice to always define a path. If you are unsure about the
225
- path value, use `'/'`.
233
+ Deletes a cookie with the specified `name`. The attributes must match the ones the cookie was set with: `path` and
234
+ `domain` select the cookie, and `partitioned: true` is needed to delete a Partitioned cookie.
235
+
236
+ It is best practice to always define a path. If you are unsure about the path value, use `'/'`. Without a path, the
237
+ browser uses the directory of the URL the page was loaded at, so in a single-page app the result depends on the URL the
238
+ user first landed on.
226
239
 
227
240
  **Important:** For security reasons, it is not possible to delete cookies for other domains. Browsers do not allow this.
228
241
  Read [this](https://stackoverflow.com/a/1063760) and [this](https://stackoverflow.com/a/17777005/1007003) StackOverflow
@@ -230,12 +243,15 @@ answer for a more in-depth explanation.
230
243
 
231
244
  ## deleteAll( path?: string, domain?: string, secure?: boolean, sameSite: 'Lax' | 'None' | 'Strict' = 'Lax' ): void;
232
245
 
246
+ ## deleteAll( options?: { path?: string, domain?: string, secure?: boolean, sameSite?: 'Lax' | 'None' | 'Strict', partitioned?: boolean }): void;
247
+
233
248
  ```typescript
234
249
  cookieService.deleteAll();
250
+ cookieService.deleteAll({ path: '/' });
235
251
  ```
236
252
 
237
- Deletes all cookies that can currently be accessed. It is best practice to always define a path. If you are unsure about
238
- the path value, use `'/'`.
253
+ Deletes all cookies that can currently be accessed, using the same attributes for each one. It is best practice to
254
+ always define a path. If you are unsure about the path value, use `'/'`.
239
255
 
240
256
  # FAQ
241
257
 
@@ -1,212 +1,178 @@
1
- import { isPlatformBrowser } from '@angular/common';
2
- import * as i0 from '@angular/core';
3
- import { inject, DOCUMENT, PLATFORM_ID, Injectable } from '@angular/core';
4
-
5
- class CookieService {
6
- constructor() {
7
- this.document = inject(DOCUMENT);
8
- this.platformId = inject(PLATFORM_ID);
9
- this.documentIsAccessible = isPlatformBrowser(this.platformId);
10
- }
11
- /**
12
- * Get cookie Regular Expression
13
- *
14
- * @param name Cookie name
15
- * @returns property RegExp
16
- *
17
- * @author: Stepan Suvorov
18
- * @since: 1.0.0
19
- */
20
- static getCookieRegExp(name) {
21
- const escapedName = name.replace(/([[\]{}()|=;+?,.*^$\\])/gi, '\\$1');
22
- return new RegExp('(?:^' + escapedName + '|;\\s*' + escapedName + ')=(.*?)(?:;|$)');
23
- }
24
- /**
25
- * Gets the decoded version of an encoded component of a Uniform Resource Identifier (URI).
26
- *
27
- * @param encodedURIComponent A value representing an encoded URI component.
28
- *
29
- * @returns The decoded version of an encoded component of a Uniform Resource Identifier (URI).
30
- *
31
- * @author: Stepan Suvorov
32
- * @since: 1.0.0
33
- */
34
- static safeDecodeURIComponent(encodedURIComponent) {
35
- try {
36
- return decodeURIComponent(encodedURIComponent);
37
- }
38
- catch {
39
- // probably it is not uri encoded. return as is
40
- return encodedURIComponent;
41
- }
42
- }
43
- /**
44
- * Return `true` if {@link Document} is accessible, otherwise return `false`
45
- *
46
- * @param name Cookie name
47
- * @returns boolean - whether cookie with specified name exists
48
- *
49
- * @author: Stepan Suvorov
50
- * @since: 1.0.0
51
- */
52
- check(name) {
53
- if (!this.documentIsAccessible) {
54
- return false;
55
- }
56
- name = encodeURIComponent(name);
57
- const regExp = CookieService.getCookieRegExp(name);
58
- return regExp.test(this.document.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 = CookieService.getCookieRegExp(name);
73
- const result = regExp.exec(this.document.cookie);
74
- return result?.[1] ? CookieService.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
- if (!this.documentIsAccessible) {
90
- return {};
91
- }
92
- const cookies = {};
93
- const document = this.document;
94
- if (document.cookie && document.cookie !== '') {
95
- document.cookie.split(';').forEach((currentCookie) => {
96
- const [cookieName, cookieValue] = currentCookie.split('=');
97
- cookies[CookieService.safeDecodeURIComponent(cookieName.replace(/^ /, ''))] = CookieService.safeDecodeURIComponent(cookieValue);
98
- });
99
- }
100
- return cookies;
101
- }
102
- set(name, value, expiresOrOptions, path, domain, secure, sameSite, partitioned) {
103
- if (!this.documentIsAccessible) {
104
- return;
105
- }
106
- if (typeof expiresOrOptions === 'number' || expiresOrOptions instanceof Date || path || domain || secure || sameSite) {
107
- const optionsBody = {
108
- expires: expiresOrOptions,
109
- path,
110
- domain,
111
- secure,
112
- sameSite: sameSite || 'Lax',
113
- partitioned,
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
- if (options.partitioned) {
148
- cookieString += 'Partitioned;';
149
- }
150
- this.document.cookie = cookieString;
151
- }
152
- /**
153
- * Delete cookie by name at given path and domain. If not path is not specified, cookie at '/' path will be deleted.
154
- *
155
- * @param name Cookie name
156
- * @param path Cookie path
157
- * @param domain Cookie domain
158
- * @param secure Cookie secure flag
159
- * @param sameSite Cookie sameSite flag - https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie/SameSite
160
- *
161
- * @author: Stepan Suvorov
162
- * @since: 1.0.0
163
- */
164
- delete(name, path, domain, secure, sameSite = 'Lax') {
165
- if (!this.documentIsAccessible) {
166
- return;
167
- }
168
- const expiresDate = new Date('Thu, 01 Jan 1970 00:00:01 GMT');
169
- this.set(name, '', { expires: expiresDate, path, domain, secure, sameSite });
170
- }
171
- /**
172
- * Delete all cookies at given path and domain. If not path is not specified, all cookies at '/' path will be deleted.
173
- *
174
- * @param path Cookie path
175
- * @param domain Cookie domain
176
- * @param secure Is the Cookie secure
177
- * @param sameSite Is the cookie same site
178
- *
179
- * @author: Stepan Suvorov
180
- * @since: 1.0.0
181
- */
182
- deleteAll(path, domain, secure, sameSite = 'Lax') {
183
- if (!this.documentIsAccessible) {
184
- return;
185
- }
186
- const cookies = this.getAll();
187
- for (const cookieName in cookies) {
188
- if (cookies.hasOwnProperty(cookieName)) {
189
- this.delete(cookieName, path, domain, secure, sameSite);
190
- }
191
- }
192
- }
193
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: CookieService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
194
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: CookieService, providedIn: 'root' }); }
195
- }
196
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: CookieService, decorators: [{
197
- type: Injectable,
198
- args: [{
199
- providedIn: 'root',
200
- }]
201
- }], ctorParameters: () => [] });
202
-
203
- /*
204
- * Public API Surface of ngx-cookie-service
205
- */
206
-
207
- /**
208
- * Generated bundle index. Do not edit.
209
- */
210
-
1
+ import { isPlatformBrowser } from "@angular/common";
2
+ import * as i0 from "@angular/core";
3
+ import { DOCUMENT, Injectable, PLATFORM_ID, inject } from "@angular/core";
4
+ const SAME_SITE_VALUES = [
5
+ "Lax",
6
+ "Strict",
7
+ "None"
8
+ ];
9
+ var CookieService = class CookieService {
10
+ constructor() {
11
+ this.document = inject(DOCUMENT);
12
+ this.platformId = inject(PLATFORM_ID);
13
+ this.documentIsAccessible = isPlatformBrowser(this.platformId);
14
+ }
15
+ static getCookieRegExp(name) {
16
+ const escapedName = name.replace(/([[\]{}()|=;+?,.*^$\\])/gi, "\\$1");
17
+ return new RegExp("(?:^" + escapedName + "|;\\s*" + escapedName + ")=(.*?)(?:;|$)");
18
+ }
19
+ static safeDecodeURIComponent(encodedURIComponent) {
20
+ try {
21
+ return decodeURIComponent(encodedURIComponent);
22
+ } catch {
23
+ return encodedURIComponent;
24
+ }
25
+ }
26
+ check(name) {
27
+ if (!this.documentIsAccessible) return false;
28
+ name = encodeURIComponent(name);
29
+ return CookieService.getCookieRegExp(name).test(this.document.cookie);
30
+ }
31
+ get(name) {
32
+ if (this.check(name)) {
33
+ name = encodeURIComponent(name);
34
+ const result = CookieService.getCookieRegExp(name).exec(this.document.cookie);
35
+ return result?.[1] ? CookieService.safeDecodeURIComponent(result[1]) : "";
36
+ } else return "";
37
+ }
38
+ getAll() {
39
+ if (!this.documentIsAccessible) return {};
40
+ const cookies = {};
41
+ const document = this.document;
42
+ if (document.cookie && document.cookie !== "") document.cookie.split(";").forEach((currentCookie) => {
43
+ const trimmedCookie = currentCookie.trim();
44
+ if (!trimmedCookie) return;
45
+ const equalIndex = trimmedCookie.indexOf("=");
46
+ if (equalIndex === -1) return;
47
+ const cookieName = CookieService.safeDecodeURIComponent(trimmedCookie.substring(0, equalIndex));
48
+ if (Object.hasOwn(cookies, cookieName)) return;
49
+ Object.defineProperty(cookies, cookieName, {
50
+ value: CookieService.safeDecodeURIComponent(trimmedCookie.substring(equalIndex + 1)),
51
+ enumerable: true,
52
+ writable: true,
53
+ configurable: true
54
+ });
55
+ });
56
+ return cookies;
57
+ }
58
+ set(name, value, expiresOrOptions, path, domain, secure, sameSite, partitioned) {
59
+ if (!this.documentIsAccessible) return;
60
+ if (typeof expiresOrOptions !== "object" || expiresOrOptions === null || expiresOrOptions instanceof Date) {
61
+ const optionsBody = {
62
+ expires: expiresOrOptions,
63
+ path,
64
+ domain,
65
+ secure,
66
+ sameSite: sameSite || "Lax",
67
+ partitioned
68
+ };
69
+ this.set(name, value, optionsBody);
70
+ return;
71
+ }
72
+ const options = CookieService.validateOptions(name, expiresOrOptions);
73
+ if (!options) return;
74
+ let cookieString = encodeURIComponent(name) + "=" + encodeURIComponent(value) + ";";
75
+ if (options.expires) cookieString += "Expires=" + options.expires.toUTCString() + ";";
76
+ if (options.path) cookieString += "Path=" + options.path + ";";
77
+ if (options.domain) cookieString += "Domain=" + options.domain + ";";
78
+ if (options.sameSite === "None" && !options.secure) {
79
+ options.secure = true;
80
+ console.warn(`[ngx-cookie-service] Cookie ${name} was forced with secure flag because sameSite=None.More details : https://github.com/stevermeister/ngx-cookie-service/issues/86#issuecomment-597720130`);
81
+ }
82
+ if (options.partitioned && !options.secure) {
83
+ options.secure = true;
84
+ console.warn(`[ngx-cookie-service] Cookie ${name} was forced with secure flag because Partitioned cookies must be Secure.`);
85
+ }
86
+ if (options.secure) cookieString += "Secure;";
87
+ if (!options.sameSite) options.sameSite = "Lax";
88
+ cookieString += "SameSite=" + options.sameSite + ";";
89
+ if (options.partitioned) cookieString += "Partitioned;";
90
+ this.document.cookie = cookieString;
91
+ }
92
+ delete(name, pathOrOptions, domain, secure, sameSite = "Lax") {
93
+ if (!this.documentIsAccessible) return;
94
+ const options = CookieService.toDeleteOptions(pathOrOptions, domain, secure, sameSite);
95
+ this.set(name, "", {
96
+ ...options,
97
+ expires: /* @__PURE__ */ new Date("Thu, 01 Jan 1970 00:00:01 GMT")
98
+ });
99
+ }
100
+ deleteAll(pathOrOptions, domain, secure, sameSite = "Lax") {
101
+ if (!this.documentIsAccessible) return;
102
+ for (const cookieName of Object.keys(this.getAll())) if (typeof pathOrOptions === "object" && pathOrOptions !== null) this.delete(cookieName, pathOrOptions);
103
+ else this.delete(cookieName, pathOrOptions, domain, secure, sameSite);
104
+ }
105
+ static validateOptions(name, options = {}) {
106
+ const { expires, ...valid } = options;
107
+ const result = valid;
108
+ for (const attribute of ["path", "domain"]) {
109
+ const attributeValue = result[attribute];
110
+ if (typeof attributeValue === "string" && CookieService.hasUnsafeCharacter(attributeValue)) {
111
+ console.warn(`[ngx-cookie-service] Cookie ${name} was skipped because its ${attribute} contains ";" or a control character.`);
112
+ return;
113
+ }
114
+ }
115
+ if (expires) {
116
+ const date = typeof expires === "number" ? new Date(Date.now() + expires * 1e3 * 60 * 60 * 24) : expires;
117
+ if (date instanceof Date && Number.isFinite(date.getTime())) result.expires = date;
118
+ else console.warn(`[ngx-cookie-service] Cookie ${name}: ignoring invalid expires value "${String(expires)}".`);
119
+ }
120
+ if (result.sameSite !== void 0 && result.sameSite !== null) {
121
+ const sameSite = SAME_SITE_VALUES.find((value) => value.toLowerCase() === String(result.sameSite).toLowerCase());
122
+ if (sameSite) result.sameSite = sameSite;
123
+ else {
124
+ console.warn(`[ngx-cookie-service] Cookie ${name}: ignoring invalid sameSite value "${String(result.sameSite)}".`);
125
+ delete result.sameSite;
126
+ }
127
+ }
128
+ return result;
129
+ }
130
+ static hasUnsafeCharacter(value) {
131
+ return [...value].some((character) => {
132
+ const code = character.charCodeAt(0);
133
+ return character === ";" || code < 32 || code === 127;
134
+ });
135
+ }
136
+ static toDeleteOptions(pathOrOptions, domain, secure, sameSite) {
137
+ if (typeof pathOrOptions === "object" && pathOrOptions !== null) return { ...pathOrOptions };
138
+ return {
139
+ path: pathOrOptions,
140
+ domain,
141
+ secure,
142
+ sameSite
143
+ };
144
+ }
145
+ static {
146
+ this.ɵfac = i0.ɵɵngDeclareFactory({
147
+ minVersion: "12.0.0",
148
+ version: "22.2.2",
149
+ ngImport: i0,
150
+ type: CookieService,
151
+ deps: [],
152
+ target: i0.ɵɵFactoryTarget.Injectable
153
+ });
154
+ }
155
+ static {
156
+ this.ɵprov = i0.ɵɵngDeclareInjectable({
157
+ minVersion: "12.0.0",
158
+ version: "22.2.2",
159
+ ngImport: i0,
160
+ type: CookieService,
161
+ providedIn: "root"
162
+ });
163
+ }
164
+ };
165
+ i0.ɵɵngDeclareClassMetadata({
166
+ minVersion: "12.0.0",
167
+ version: "22.2.2",
168
+ ngImport: i0,
169
+ type: CookieService,
170
+ decorators: [{
171
+ type: Injectable,
172
+ args: [{ providedIn: "root" }]
173
+ }],
174
+ ctorParameters: () => []
175
+ });
211
176
  export { CookieService };
212
- //# sourceMappingURL=ngx-cookie-service.mjs.map
177
+
178
+ //# sourceMappingURL=ngx-cookie-service.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"ngx-cookie-service.mjs","sources":["../../../projects/ngx-cookie-service/src/lib/cookie.service.ts","../../../projects/ngx-cookie-service/src/public-api.ts","../../../projects/ngx-cookie-service/src/ngx-cookie-service.ts"],"sourcesContent":["import { isPlatformBrowser } from '@angular/common';\nimport { DOCUMENT, inject, Injectable, PLATFORM_ID } from '@angular/core';\n\nexport type SameSite = 'Lax' | 'None' | 'Strict';\n\nexport interface CookieOptions {\n expires?: number | Date;\n path?: string;\n domain?: string;\n secure?: boolean;\n sameSite?: SameSite;\n partitioned?: boolean;\n}\n\n@Injectable({\n providedIn: 'root',\n})\nexport class CookieService {\n private readonly documentIsAccessible: boolean;\n private readonly document = inject<Document>(DOCUMENT);\n private readonly platformId = inject<object>(PLATFORM_ID);\n\n constructor() {\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 private static getCookieRegExp(name: string): RegExp {\n const escapedName: string = name.replace(/([[\\]{}()|=;+?,.*^$\\\\])/gi, '\\\\$1');\n\n return new RegExp('(?:^' + escapedName + '|;\\\\s*' + escapedName + ')=(.*?)(?:;|$)');\n }\n\n /**\n * Gets the decoded 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 decoded version of an encoded component of a Uniform Resource Identifier (URI).\n *\n * @author: Stepan Suvorov\n * @since: 1.0.0\n */\n private 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 if (!this.documentIsAccessible) {\n return false;\n }\n name = encodeURIComponent(name);\n const regExp = CookieService.getCookieRegExp(name);\n return regExp.test(this.document.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 const regExp: RegExp = CookieService.getCookieRegExp(name);\n const result = regExp.exec(this.document.cookie);\n return result?.[1] ? CookieService.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(): Record<string, string> {\n if (!this.documentIsAccessible) {\n return {};\n }\n\n const cookies: Record<string, string> = {};\n const document: Document = this.document;\n\n if (document.cookie && document.cookie !== '') {\n document.cookie.split(';').forEach((currentCookie: string) => {\n const [cookieName, cookieValue] = currentCookie.split('=');\n cookies[CookieService.safeDecodeURIComponent(cookieName.replace(/^ /, ''))] = CookieService.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 partitioned Partitioned flag\n * @param sameSite OWASP same site token `Lax`, `None`, or `Strict`. Defaults to `Lax`\n *\n * @author: Stepan Suvorov\n * @since: 1.0.0\n */\n set(\n name: string,\n value: string,\n expires?: CookieOptions['expires'],\n path?: CookieOptions['path'],\n domain?: CookieOptions['domain'],\n secure?: CookieOptions['secure'],\n sameSite?: SameSite,\n partitioned?: CookieOptions['partitioned']\n ): 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 flag\n * sameSite OWASP same site 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(name: string, value: string, options?: CookieOptions): void;\n\n set(\n name: string,\n value: string,\n expiresOrOptions?: CookieOptions['expires'] | CookieOptions,\n path?: CookieOptions['path'],\n domain?: CookieOptions['domain'],\n secure?: CookieOptions['secure'],\n sameSite?: SameSite,\n partitioned?: CookieOptions['partitioned']\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 as CookieOptions['expires'],\n path,\n domain,\n secure,\n sameSite: sameSite || 'Lax',\n partitioned,\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 if (options.partitioned) {\n cookieString += 'Partitioned;';\n }\n\n this.document.cookie = cookieString;\n }\n\n /**\n * Delete cookie by name at given path and domain. If not path is not specified, cookie at '/' path will be deleted.\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?: CookieOptions['path'], domain?: CookieOptions['domain'], secure?: CookieOptions['secure'], sameSite: SameSite = '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 at given path and domain. If not path is not specified, all cookies at '/' path will be deleted.\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?: CookieOptions['path'], domain?: CookieOptions['domain'], secure?: CookieOptions['secure'], sameSite: SameSite = '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\n */\n\nexport * from './lib/cookie.service';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ngx-cookie-service.mjs","names":[],"sources":["../../../projects/ngx-cookie-service/src/lib/cookie.service.ts"],"sourcesContent":["import { isPlatformBrowser } from '@angular/common';\nimport { DOCUMENT, inject, Injectable, PLATFORM_ID } from '@angular/core';\n\nexport type SameSite = 'Lax' | 'None' | 'Strict';\n\nexport interface CookieOptions {\n expires?: number | Date;\n path?: string;\n domain?: string;\n secure?: boolean;\n sameSite?: SameSite;\n partitioned?: boolean;\n}\n\n/**\n * Attributes that identify the cookie to delete. They must match the attributes the cookie was set with.\n */\nexport type DeleteCookieOptions = Omit<CookieOptions, 'expires'>;\n\n/**\n * Cookie options after validation: invalid values are removed and `expires` is always a `Date`.\n */\ntype ValidCookieOptions = Omit<CookieOptions, 'expires'> & { expires?: Date };\n\n/**\n * The `SameSite` values browsers accept, in their canonical spelling.\n */\nconst SAME_SITE_VALUES: readonly SameSite[] = ['Lax', 'Strict', 'None'];\n\n@Injectable({\n providedIn: 'root',\n})\nexport class CookieService {\n private readonly documentIsAccessible: boolean;\n private readonly document = inject<Document>(DOCUMENT);\n private readonly platformId = inject<object>(PLATFORM_ID);\n\n constructor() {\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 private static getCookieRegExp(name: string): RegExp {\n const escapedName: string = name.replace(/([[\\]{}()|=;+?,.*^$\\\\])/gi, '\\\\$1');\n\n return new RegExp('(?:^' + escapedName + '|;\\\\s*' + escapedName + ')=(.*?)(?:;|$)');\n }\n\n /**\n * Gets the decoded 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 decoded version of an encoded component of a Uniform Resource Identifier (URI).\n *\n * @author: Stepan Suvorov\n * @since: 1.0.0\n */\n private 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 if (!this.documentIsAccessible) {\n return false;\n }\n name = encodeURIComponent(name);\n const regExp = CookieService.getCookieRegExp(name);\n return regExp.test(this.document.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 const regExp: RegExp = CookieService.getCookieRegExp(name);\n const result = regExp.exec(this.document.cookie);\n return result?.[1] ? CookieService.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(): Record<string, string> {\n if (!this.documentIsAccessible) {\n return {};\n }\n\n const cookies: Record<string, string> = {};\n const document: Document = this.document;\n\n if (document.cookie && document.cookie !== '') {\n document.cookie.split(';').forEach((currentCookie: string) => {\n const trimmedCookie = currentCookie.trim();\n if (!trimmedCookie) {\n return;\n }\n // Split on the first '=' only, so values containing '=' (e.g. base64 padding) are preserved\n const equalIndex = trimmedCookie.indexOf('=');\n if (equalIndex === -1) {\n // Cookie without value (invalid, but handle gracefully)\n return;\n }\n const cookieName = CookieService.safeDecodeURIComponent(trimmedCookie.substring(0, equalIndex));\n // Browsers list the most specific cookie first when several share a name. Keep that one, as get() does.\n if (Object.hasOwn(cookies, cookieName)) {\n return;\n }\n // defineProperty stores names such as \"__proto__\" as normal entries instead of touching the object's prototype\n Object.defineProperty(cookies, cookieName, {\n value: CookieService.safeDecodeURIComponent(trimmedCookie.substring(equalIndex + 1)),\n enumerable: true,\n writable: true,\n configurable: true,\n });\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 partitioned Partitioned flag\n * @param sameSite OWASP same site token `Lax`, `None`, or `Strict`. Defaults to `Lax`\n *\n * @author: Stepan Suvorov\n * @since: 1.0.0\n */\n set(\n name: string,\n value: string,\n expires?: CookieOptions['expires'],\n path?: CookieOptions['path'],\n domain?: CookieOptions['domain'],\n secure?: CookieOptions['secure'],\n sameSite?: SameSite,\n partitioned?: CookieOptions['partitioned']\n ): 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 flag\n * sameSite OWASP same site 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(name: string, value: string, options?: CookieOptions): void;\n\n set(\n name: string,\n value: string,\n expiresOrOptions?: CookieOptions['expires'] | CookieOptions,\n path?: CookieOptions['path'],\n domain?: CookieOptions['domain'],\n secure?: CookieOptions['secure'],\n sameSite?: SameSite,\n partitioned?: CookieOptions['partitioned']\n ): void {\n if (!this.documentIsAccessible) {\n return;\n }\n\n // Anything but an options object means the positional form, so no positional argument (e.g. a lone `partitioned`) is dropped\n if (typeof expiresOrOptions !== 'object' || expiresOrOptions === null || expiresOrOptions instanceof Date) {\n const optionsBody = {\n expires: expiresOrOptions as CookieOptions['expires'],\n path,\n domain,\n secure,\n sameSite: sameSite || 'Lax',\n partitioned,\n };\n\n this.set(name, value, optionsBody);\n return;\n }\n\n // validateOptions() returns a copy, so the defaults applied below don't leak back into the caller's object\n const options = CookieService.validateOptions(name, expiresOrOptions);\n if (!options) {\n return;\n }\n\n let cookieString: string = encodeURIComponent(name) + '=' + encodeURIComponent(value) + ';';\n\n if (options.expires) {\n cookieString += 'Expires=' + options.expires.toUTCString() + ';';\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.sameSite === 'None' && !options.secure) {\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.partitioned && !options.secure) {\n options.secure = true;\n console.warn(`[ngx-cookie-service] Cookie ${name} was forced with secure flag because Partitioned cookies must be Secure.`);\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 if (options.partitioned) {\n cookieString += 'Partitioned;';\n }\n\n this.document.cookie = cookieString;\n }\n\n /**\n * Delete cookie by name at given path and domain.\n *\n * If `path` is not specified, no `Path` attribute is written and the browser uses its default path: the directory of the URL\n * the page was loaded at (not the current router URL). To delete a cookie that was set with `path: '/'`, pass `'/'` here too.\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?: CookieOptions['path'], domain?: CookieOptions['domain'], secure?: CookieOptions['secure'], sameSite?: SameSite): void;\n\n /**\n * Delete cookie by name. The options must match the attributes the cookie was set with: `path` and `domain` select the\n * cookie, and `partitioned: true` is required to delete a Partitioned cookie.\n *\n * If `path` is not specified, no `Path` attribute is written and the browser uses its default path: the directory of the URL\n * the page was loaded at (not the current router URL). To delete a cookie that was set with `path: '/'`, pass `'/'` here too.\n *\n * @param name Cookie name\n * @param options Cookie attributes: `path`, `domain`, `secure`, `sameSite` and `partitioned`\n *\n * @author: Pavankumar Jadda\n * @since: 22.1.0\n */\n delete(name: string, options?: DeleteCookieOptions): void;\n\n delete(\n name: string,\n pathOrOptions?: CookieOptions['path'] | DeleteCookieOptions,\n domain?: CookieOptions['domain'],\n secure?: CookieOptions['secure'],\n sameSite: SameSite = 'Lax'\n ): void {\n if (!this.documentIsAccessible) {\n return;\n }\n const options = CookieService.toDeleteOptions(pathOrOptions, domain, secure, sameSite);\n this.set(name, '', { ...options, expires: new Date('Thu, 01 Jan 1970 00:00:01 GMT') });\n }\n\n /**\n * Delete all cookies at given path and domain.\n *\n * If `path` is not specified, the browser's default path is used for each cookie, as described for {@link delete}.\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?: CookieOptions['path'], domain?: CookieOptions['domain'], secure?: CookieOptions['secure'], sameSite?: SameSite): void;\n\n /**\n * Delete all cookies that can currently be accessed, using the same attributes for each one.\n *\n * If `path` is not specified, the browser's default path is used for each cookie, as described for {@link delete}.\n *\n * @param options Cookie attributes: `path`, `domain`, `secure`, `sameSite` and `partitioned`\n *\n * @author: Pavankumar Jadda\n * @since: 22.1.0\n */\n deleteAll(options?: DeleteCookieOptions): void;\n\n deleteAll(\n pathOrOptions?: CookieOptions['path'] | DeleteCookieOptions,\n domain?: CookieOptions['domain'],\n secure?: CookieOptions['secure'],\n sameSite: SameSite = 'Lax'\n ): void {\n if (!this.documentIsAccessible) {\n return;\n }\n\n // Object.keys() rather than for...in with cookies.hasOwnProperty(): a cookie named \"hasOwnProperty\" would shadow that method\n for (const cookieName of Object.keys(this.getAll())) {\n // Call delete() the same way deleteAll() was called, so overrides and spies of the positional form keep working\n if (typeof pathOrOptions === 'object' && pathOrOptions !== null) {\n this.delete(cookieName, pathOrOptions);\n } else {\n this.delete(cookieName, pathOrOptions, domain, secure, sameSite);\n }\n }\n }\n\n /**\n * Returns a validated copy of the options, or `undefined` if the cookie must not be written.\n *\n * A `path` or `domain` containing `;` or a control character could inject attributes or change the cookie's scope, so the\n * whole write is skipped. An invalid `expires` is dropped, which makes a session cookie as browsers already did, and an\n * unknown `sameSite` falls back to the `Lax` default. Each case logs a warning. A numeric `expires` (days\n * from now) is converted to a `Date`, and `sameSite` is matched case-insensitively.\n *\n * @param name Cookie name, used in warnings\n * @param options Cookie options\n * @returns A validated copy of the options, or `undefined` to skip the write\n *\n * @author: Pavankumar Jadda\n * @since: 22.1.0\n */\n private static validateOptions(name: string, options: CookieOptions = {}): ValidCookieOptions | undefined {\n const { expires, ...valid }: CookieOptions = options;\n const result: ValidCookieOptions = valid;\n\n for (const attribute of ['path', 'domain'] as const) {\n const attributeValue = result[attribute];\n if (typeof attributeValue === 'string' && CookieService.hasUnsafeCharacter(attributeValue)) {\n console.warn(`[ngx-cookie-service] Cookie ${name} was skipped because its ${attribute} contains \";\" or a control character.`);\n return undefined;\n }\n }\n if (expires) {\n const date = typeof expires === 'number' ? new Date(Date.now() + expires * 1000 * 60 * 60 * 24) : expires;\n if (date instanceof Date && Number.isFinite(date.getTime())) {\n result.expires = date;\n } else {\n console.warn(`[ngx-cookie-service] Cookie ${name}: ignoring invalid expires value \"${String(expires)}\".`);\n }\n }\n if (result.sameSite !== undefined && result.sameSite !== null) {\n const sameSite = SAME_SITE_VALUES.find((value) => value.toLowerCase() === String(result.sameSite).toLowerCase());\n if (sameSite) {\n result.sameSite = sameSite;\n } else {\n console.warn(`[ngx-cookie-service] Cookie ${name}: ignoring invalid sameSite value \"${String(result.sameSite)}\".`);\n delete result.sameSite;\n }\n }\n return result;\n }\n\n /**\n * Whether a cookie attribute value contains `;` or an ASCII control character, which would end the attribute early or\n * corrupt the header.\n *\n * @param value Attribute value\n * @returns `true` if the value is unsafe to write\n *\n * @author: Pavankumar Jadda\n * @since: 22.1.0\n */\n private static hasUnsafeCharacter(value: string): boolean {\n return [...value].some((character) => {\n const code = character.charCodeAt(0);\n return character === ';' || code < 0x20 || code === 0x7f;\n });\n }\n\n /**\n * Builds delete options from either an options object or the positional `path`, `domain`, `secure` and `sameSite` arguments.\n *\n * @param pathOrOptions Either a DeleteCookieOptions object or the cookie path\n * @param domain Cookie domain\n * @param secure Cookie secure flag\n * @param sameSite Cookie sameSite flag\n * @returns A new DeleteCookieOptions object\n *\n * @author: Pavankumar Jadda\n * @since: 22.1.0\n */\n private static toDeleteOptions(\n pathOrOptions?: CookieOptions['path'] | DeleteCookieOptions,\n domain?: CookieOptions['domain'],\n secure?: CookieOptions['secure'],\n sameSite?: SameSite\n ): DeleteCookieOptions {\n if (typeof pathOrOptions === 'object' && pathOrOptions !== null) {\n return { ...pathOrOptions };\n }\n return { path: pathOrOptions, domain, secure, sameSite };\n }\n}\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "ngx-cookie-service",
3
3
  "description": "Angular cookie service",
4
- "version": "22.0.0",
4
+ "version": "22.1.0",
5
5
  "license": "MIT",
6
6
  "author": "Stepan Suvorov <stevermeister@gmail.com>",
7
7
  "keywords": [
@@ -113,4 +113,4 @@
113
113
  },
114
114
  "sideEffects": false,
115
115
  "type": "module"
116
- }
116
+ }
@@ -1,133 +1,203 @@
1
- import * as i0 from '@angular/core';
2
-
3
- type SameSite = 'Lax' | 'None' | 'Strict';
4
- interface CookieOptions {
5
- expires?: number | Date;
6
- path?: string;
7
- domain?: string;
8
- secure?: boolean;
9
- sameSite?: SameSite;
10
- partitioned?: boolean;
1
+ import * as i0 from "@angular/core";
2
+ export type SameSite = 'Lax' | 'None' | 'Strict';
3
+ export interface CookieOptions {
4
+ expires?: number | Date;
5
+ path?: string;
6
+ domain?: string;
7
+ secure?: boolean;
8
+ sameSite?: SameSite;
9
+ partitioned?: boolean;
11
10
  }
12
- declare class CookieService {
13
- private readonly documentIsAccessible;
14
- private readonly document;
15
- private readonly platformId;
16
- constructor();
17
- /**
18
- * Get cookie Regular Expression
19
- *
20
- * @param name Cookie name
21
- * @returns property RegExp
22
- *
23
- * @author: Stepan Suvorov
24
- * @since: 1.0.0
25
- */
26
- private static getCookieRegExp;
27
- /**
28
- * Gets the decoded 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 decoded version of an encoded component of a Uniform Resource Identifier (URI).
33
- *
34
- * @author: Stepan Suvorov
35
- * @since: 1.0.0
36
- */
37
- private static safeDecodeURIComponent;
38
- /**
39
- * Return `true` if {@link Document} is accessible, otherwise return `false`
40
- *
41
- * @param name Cookie name
42
- * @returns boolean - whether cookie with specified name exists
43
- *
44
- * @author: Stepan Suvorov
45
- * @since: 1.0.0
46
- */
47
- check(name: string): boolean;
48
- /**
49
- * Get cookies by name
50
- *
51
- * @param name Cookie name
52
- * @returns property value
53
- *
54
- * @author: Stepan Suvorov
55
- * @since: 1.0.0
56
- */
57
- get(name: string): string;
58
- /**
59
- * Get all cookies in JSON format
60
- *
61
- * @returns all the cookies in json
62
- *
63
- * @author: Stepan Suvorov
64
- * @since: 1.0.0
65
- */
66
- getAll(): Record<string, string>;
67
- /**
68
- * Set cookie based on provided information
69
- *
70
- * @param name Cookie name
71
- * @param value Cookie value
72
- * @param expires Number of days until the cookies expires or an actual `Date`
73
- * @param path Cookie path
74
- * @param domain Cookie domain
75
- * @param secure Secure flag
76
- * @param partitioned Partitioned flag
77
- * @param sameSite OWASP same site token `Lax`, `None`, or `Strict`. Defaults to `Lax`
78
- *
79
- * @author: Stepan Suvorov
80
- * @since: 1.0.0
81
- */
82
- set(name: string, value: string, expires?: CookieOptions['expires'], path?: CookieOptions['path'], domain?: CookieOptions['domain'], secure?: CookieOptions['secure'], sameSite?: SameSite, partitioned?: CookieOptions['partitioned']): void;
83
- /**
84
- * Set cookie based on provided information
85
- *
86
- * Cookie's parameters:
87
- * <pre>
88
- * expires Number of days until the cookies expires or an actual `Date`
89
- * path Cookie path
90
- * domain Cookie domain
91
- * secure flag
92
- * sameSite OWASP same site token `Lax`, `None`, or `Strict`. Defaults to `Lax`
93
- * </pre>
94
- *
95
- * @param name Cookie name
96
- * @param value Cookie value
97
- * @param options Body with cookie's params
98
- *
99
- * @author: Stepan Suvorov
100
- * @since: 1.0.0
101
- */
102
- set(name: string, value: string, options?: CookieOptions): void;
103
- /**
104
- * Delete cookie by name at given path and domain. If not path is not specified, cookie at '/' path will be deleted.
105
- *
106
- * @param name Cookie name
107
- * @param path Cookie path
108
- * @param domain Cookie domain
109
- * @param secure Cookie secure flag
110
- * @param sameSite Cookie sameSite flag - https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie/SameSite
111
- *
112
- * @author: Stepan Suvorov
113
- * @since: 1.0.0
114
- */
115
- delete(name: string, path?: CookieOptions['path'], domain?: CookieOptions['domain'], secure?: CookieOptions['secure'], sameSite?: SameSite): void;
116
- /**
117
- * Delete all cookies at given path and domain. If not path is not specified, all cookies at '/' path will be deleted.
118
- *
119
- * @param path Cookie path
120
- * @param domain Cookie domain
121
- * @param secure Is the Cookie secure
122
- * @param sameSite Is the cookie same site
123
- *
124
- * @author: Stepan Suvorov
125
- * @since: 1.0.0
126
- */
127
- deleteAll(path?: CookieOptions['path'], domain?: CookieOptions['domain'], secure?: CookieOptions['secure'], sameSite?: SameSite): void;
128
- static ɵfac: i0.ɵɵFactoryDeclaration<CookieService, never>;
129
- static ɵprov: i0.ɵɵInjectableDeclaration<CookieService>;
130
- }
131
-
132
- export { CookieService };
133
- export type { CookieOptions, SameSite };
11
+ /**
12
+ * Attributes that identify the cookie to delete. They must match the attributes the cookie was set with.
13
+ */
14
+ export type DeleteCookieOptions = Omit<CookieOptions, 'expires'>;
15
+ export declare class CookieService {
16
+ private readonly documentIsAccessible;
17
+ private readonly document;
18
+ private readonly platformId;
19
+ constructor();
20
+ /**
21
+ * Get cookie Regular Expression
22
+ *
23
+ * @param name Cookie name
24
+ * @returns property RegExp
25
+ *
26
+ * @author: Stepan Suvorov
27
+ * @since: 1.0.0
28
+ */
29
+ private static getCookieRegExp;
30
+ /**
31
+ * Gets the decoded version of an encoded component of a Uniform Resource Identifier (URI).
32
+ *
33
+ * @param encodedURIComponent A value representing an encoded URI component.
34
+ *
35
+ * @returns The decoded version of an encoded component of a Uniform Resource Identifier (URI).
36
+ *
37
+ * @author: Stepan Suvorov
38
+ * @since: 1.0.0
39
+ */
40
+ private static safeDecodeURIComponent;
41
+ /**
42
+ * Return `true` if {@link Document} is accessible, otherwise return `false`
43
+ *
44
+ * @param name Cookie name
45
+ * @returns boolean - whether cookie with specified name exists
46
+ *
47
+ * @author: Stepan Suvorov
48
+ * @since: 1.0.0
49
+ */
50
+ check(name: string): boolean;
51
+ /**
52
+ * Get cookies by name
53
+ *
54
+ * @param name Cookie name
55
+ * @returns property value
56
+ *
57
+ * @author: Stepan Suvorov
58
+ * @since: 1.0.0
59
+ */
60
+ get(name: string): string;
61
+ /**
62
+ * Get all cookies in JSON format
63
+ *
64
+ * @returns all the cookies in json
65
+ *
66
+ * @author: Stepan Suvorov
67
+ * @since: 1.0.0
68
+ */
69
+ getAll(): Record<string, string>;
70
+ /**
71
+ * Set cookie based on provided information
72
+ *
73
+ * @param name Cookie name
74
+ * @param value Cookie value
75
+ * @param expires Number of days until the cookies expires or an actual `Date`
76
+ * @param path Cookie path
77
+ * @param domain Cookie domain
78
+ * @param secure Secure flag
79
+ * @param partitioned Partitioned flag
80
+ * @param sameSite OWASP same site token `Lax`, `None`, or `Strict`. Defaults to `Lax`
81
+ *
82
+ * @author: Stepan Suvorov
83
+ * @since: 1.0.0
84
+ */
85
+ set(name: string, value: string, expires?: CookieOptions['expires'], path?: CookieOptions['path'], domain?: CookieOptions['domain'], secure?: CookieOptions['secure'], sameSite?: SameSite, partitioned?: CookieOptions['partitioned']): void;
86
+ /**
87
+ * Set cookie based on provided information
88
+ *
89
+ * Cookie's parameters:
90
+ * <pre>
91
+ * expires Number of days until the cookies expires or an actual `Date`
92
+ * path Cookie path
93
+ * domain Cookie domain
94
+ * secure flag
95
+ * sameSite OWASP same site token `Lax`, `None`, or `Strict`. Defaults to `Lax`
96
+ * </pre>
97
+ *
98
+ * @param name Cookie name
99
+ * @param value Cookie value
100
+ * @param options Body with cookie's params
101
+ *
102
+ * @author: Stepan Suvorov
103
+ * @since: 1.0.0
104
+ */
105
+ set(name: string, value: string, options?: CookieOptions): void;
106
+ /**
107
+ * Delete cookie by name at given path and domain.
108
+ *
109
+ * If `path` is not specified, no `Path` attribute is written and the browser uses its default path: the directory of the URL
110
+ * the page was loaded at (not the current router URL). To delete a cookie that was set with `path: '/'`, pass `'/'` here too.
111
+ *
112
+ * @param name Cookie name
113
+ * @param path Cookie path
114
+ * @param domain Cookie domain
115
+ * @param secure Cookie secure flag
116
+ * @param sameSite Cookie sameSite flag - https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie/SameSite
117
+ *
118
+ * @author: Stepan Suvorov
119
+ * @since: 1.0.0
120
+ */
121
+ delete(name: string, path?: CookieOptions['path'], domain?: CookieOptions['domain'], secure?: CookieOptions['secure'], sameSite?: SameSite): void;
122
+ /**
123
+ * Delete cookie by name. The options must match the attributes the cookie was set with: `path` and `domain` select the
124
+ * cookie, and `partitioned: true` is required to delete a Partitioned cookie.
125
+ *
126
+ * If `path` is not specified, no `Path` attribute is written and the browser uses its default path: the directory of the URL
127
+ * the page was loaded at (not the current router URL). To delete a cookie that was set with `path: '/'`, pass `'/'` here too.
128
+ *
129
+ * @param name Cookie name
130
+ * @param options Cookie attributes: `path`, `domain`, `secure`, `sameSite` and `partitioned`
131
+ *
132
+ * @author: Pavankumar Jadda
133
+ * @since: 22.1.0
134
+ */
135
+ delete(name: string, options?: DeleteCookieOptions): void;
136
+ /**
137
+ * Delete all cookies at given path and domain.
138
+ *
139
+ * If `path` is not specified, the browser's default path is used for each cookie, as described for {@link delete}.
140
+ *
141
+ * @param path Cookie path
142
+ * @param domain Cookie domain
143
+ * @param secure Is the Cookie secure
144
+ * @param sameSite Is the cookie same site
145
+ *
146
+ * @author: Stepan Suvorov
147
+ * @since: 1.0.0
148
+ */
149
+ deleteAll(path?: CookieOptions['path'], domain?: CookieOptions['domain'], secure?: CookieOptions['secure'], sameSite?: SameSite): void;
150
+ /**
151
+ * Delete all cookies that can currently be accessed, using the same attributes for each one.
152
+ *
153
+ * If `path` is not specified, the browser's default path is used for each cookie, as described for {@link delete}.
154
+ *
155
+ * @param options Cookie attributes: `path`, `domain`, `secure`, `sameSite` and `partitioned`
156
+ *
157
+ * @author: Pavankumar Jadda
158
+ * @since: 22.1.0
159
+ */
160
+ deleteAll(options?: DeleteCookieOptions): void;
161
+ /**
162
+ * Returns a validated copy of the options, or `undefined` if the cookie must not be written.
163
+ *
164
+ * A `path` or `domain` containing `;` or a control character could inject attributes or change the cookie's scope, so the
165
+ * whole write is skipped. An invalid `expires` is dropped, which makes a session cookie as browsers already did, and an
166
+ * unknown `sameSite` falls back to the `Lax` default. Each case logs a warning. A numeric `expires` (days
167
+ * from now) is converted to a `Date`, and `sameSite` is matched case-insensitively.
168
+ *
169
+ * @param name Cookie name, used in warnings
170
+ * @param options Cookie options
171
+ * @returns A validated copy of the options, or `undefined` to skip the write
172
+ *
173
+ * @author: Pavankumar Jadda
174
+ * @since: 22.1.0
175
+ */
176
+ private static validateOptions;
177
+ /**
178
+ * Whether a cookie attribute value contains `;` or an ASCII control character, which would end the attribute early or
179
+ * corrupt the header.
180
+ *
181
+ * @param value Attribute value
182
+ * @returns `true` if the value is unsafe to write
183
+ *
184
+ * @author: Pavankumar Jadda
185
+ * @since: 22.1.0
186
+ */
187
+ private static hasUnsafeCharacter;
188
+ /**
189
+ * Builds delete options from either an options object or the positional `path`, `domain`, `secure` and `sameSite` arguments.
190
+ *
191
+ * @param pathOrOptions Either a DeleteCookieOptions object or the cookie path
192
+ * @param domain Cookie domain
193
+ * @param secure Cookie secure flag
194
+ * @param sameSite Cookie sameSite flag
195
+ * @returns A new DeleteCookieOptions object
196
+ *
197
+ * @author: Pavankumar Jadda
198
+ * @since: 22.1.0
199
+ */
200
+ private static toDeleteOptions;
201
+ static ɵfac: i0.ɵɵFactoryDeclaration<CookieService, never>;
202
+ static ɵprov: i0.ɵɵInjectableDeclaration<any>;
203
+ }