@angular/common 21.2.0 → 21.2.1

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.
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @license Angular v21.2.0
2
+ * @license Angular v21.2.1
3
3
  * (c) 2010-2026 Google LLC. https://angular.dev/
4
4
  * License: MIT
5
5
  */
@@ -227,7 +227,7 @@ class HttpClientTestingBackend {
227
227
  }
228
228
  static ɵfac = i0.ɵɵngDeclareFactory({
229
229
  minVersion: "12.0.0",
230
- version: "21.2.0",
230
+ version: "21.2.1",
231
231
  ngImport: i0,
232
232
  type: HttpClientTestingBackend,
233
233
  deps: [],
@@ -235,14 +235,14 @@ class HttpClientTestingBackend {
235
235
  });
236
236
  static ɵprov = i0.ɵɵngDeclareInjectable({
237
237
  minVersion: "12.0.0",
238
- version: "21.2.0",
238
+ version: "21.2.1",
239
239
  ngImport: i0,
240
240
  type: HttpClientTestingBackend
241
241
  });
242
242
  }
243
243
  i0.ɵɵngDeclareClassMetadata({
244
244
  minVersion: "12.0.0",
245
- version: "21.2.0",
245
+ version: "21.2.1",
246
246
  ngImport: i0,
247
247
  type: HttpClientTestingBackend,
248
248
  decorators: [{
@@ -271,7 +271,7 @@ function provideHttpClientTesting() {
271
271
  class HttpClientTestingModule {
272
272
  static ɵfac = i0.ɵɵngDeclareFactory({
273
273
  minVersion: "12.0.0",
274
- version: "21.2.0",
274
+ version: "21.2.1",
275
275
  ngImport: i0,
276
276
  type: HttpClientTestingModule,
277
277
  deps: [],
@@ -279,14 +279,14 @@ class HttpClientTestingModule {
279
279
  });
280
280
  static ɵmod = i0.ɵɵngDeclareNgModule({
281
281
  minVersion: "14.0.0",
282
- version: "21.2.0",
282
+ version: "21.2.1",
283
283
  ngImport: i0,
284
284
  type: HttpClientTestingModule,
285
285
  imports: [HttpClientModule]
286
286
  });
287
287
  static ɵinj = i0.ɵɵngDeclareInjector({
288
288
  minVersion: "12.0.0",
289
- version: "21.2.0",
289
+ version: "21.2.1",
290
290
  ngImport: i0,
291
291
  type: HttpClientTestingModule,
292
292
  providers: [provideHttpClientTesting()],
@@ -295,7 +295,7 @@ class HttpClientTestingModule {
295
295
  }
296
296
  i0.ɵɵngDeclareClassMetadata({
297
297
  minVersion: "12.0.0",
298
- version: "21.2.0",
298
+ version: "21.2.1",
299
299
  ngImport: i0,
300
300
  type: HttpClientTestingModule,
301
301
  decorators: [{
package/fesm2022/http.mjs CHANGED
@@ -1,166 +1,17 @@
1
1
  /**
2
- * @license Angular v21.2.0
2
+ * @license Angular v21.2.1
3
3
  * (c) 2010-2026 Google LLC. https://angular.dev/
4
4
  * License: MIT
5
5
  */
6
6
 
7
- import { HttpHeaders, HttpParams, HttpRequest, HttpEventType, HttpErrorResponse, HttpClient, HTTP_ROOT_INTERCEPTOR_FNS, HttpResponse } from './_module-chunk.mjs';
7
+ import { HTTP_ROOT_INTERCEPTOR_FNS, HttpResponse, HttpHeaders, HttpParams, HttpRequest, HttpEventType, HttpErrorResponse, HttpClient } from './_module-chunk.mjs';
8
8
  export { FetchBackend, HTTP_INTERCEPTORS, HttpBackend, HttpClientJsonpModule, HttpClientModule, HttpClientXsrfModule, HttpContext, HttpContextToken, HttpFeatureKind, HttpHandler, HttpHeaderResponse, HttpResponseBase, HttpStatusCode, HttpUrlEncodingCodec, HttpXhrBackend, HttpXsrfTokenExtractor, JsonpClientBackend, JsonpInterceptor, provideHttpClient, withFetch, withInterceptors, withInterceptorsFromDi, withJsonpSupport, withNoXsrfProtection, withRequestsMadeViaParent, withXsrfConfiguration, HttpInterceptorHandler as ɵHttpInterceptingHandler, REQUESTS_CONTRIBUTE_TO_STABILITY as ɵREQUESTS_CONTRIBUTE_TO_STABILITY } from './_module-chunk.mjs';
9
- import { assertInInjectionContext, inject, Injector, ɵResourceImpl as _ResourceImpl, linkedSignal, computed, signal, ɵencapsulateResourceError as _encapsulateResourceError, ɵRuntimeError as _RuntimeError, InjectionToken, ɵperformanceMarkFeature as _performanceMarkFeature, APP_BOOTSTRAP_LISTENER, ApplicationRef, TransferState, makeStateKey, ɵtruncateMiddle as _truncateMiddle, ɵformatRuntimeError as _formatRuntimeError } from '@angular/core';
9
+ import { InjectionToken, ɵperformanceMarkFeature as _performanceMarkFeature, APP_BOOTSTRAP_LISTENER, inject, ApplicationRef, TransferState, makeStateKey, ɵRuntimeError as _RuntimeError, ɵtruncateMiddle as _truncateMiddle, ɵformatRuntimeError as _formatRuntimeError, assertInInjectionContext, Injector, ɵResourceImpl as _ResourceImpl, linkedSignal, computed, signal, ɵencapsulateResourceError as _encapsulateResourceError } from '@angular/core';
10
10
  import { of } from 'rxjs';
11
11
  import { tap } from 'rxjs/operators';
12
12
  import './_xhr-chunk.mjs';
13
13
  import './_platform_location-chunk.mjs';
14
14
 
15
- const httpResource = (() => {
16
- const jsonFn = makeHttpResourceFn('json');
17
- jsonFn.arrayBuffer = makeHttpResourceFn('arraybuffer');
18
- jsonFn.blob = makeHttpResourceFn('blob');
19
- jsonFn.text = makeHttpResourceFn('text');
20
- return jsonFn;
21
- })();
22
- function makeHttpResourceFn(responseType) {
23
- return function httpResource(request, options) {
24
- if (ngDevMode && !options?.injector) {
25
- assertInInjectionContext(httpResource);
26
- }
27
- const injector = options?.injector ?? inject(Injector);
28
- return new HttpResourceImpl(injector, () => normalizeRequest(request, responseType), options?.defaultValue, options?.debugName, options?.parse, options?.equal);
29
- };
30
- }
31
- function normalizeRequest(request, responseType) {
32
- let unwrappedRequest = typeof request === 'function' ? request() : request;
33
- if (unwrappedRequest === undefined) {
34
- return undefined;
35
- } else if (typeof unwrappedRequest === 'string') {
36
- unwrappedRequest = {
37
- url: unwrappedRequest
38
- };
39
- }
40
- const headers = unwrappedRequest.headers instanceof HttpHeaders ? unwrappedRequest.headers : new HttpHeaders(unwrappedRequest.headers);
41
- const params = unwrappedRequest.params instanceof HttpParams ? unwrappedRequest.params : new HttpParams({
42
- fromObject: unwrappedRequest.params
43
- });
44
- return new HttpRequest(unwrappedRequest.method ?? 'GET', unwrappedRequest.url, unwrappedRequest.body ?? null, {
45
- headers,
46
- params,
47
- reportProgress: unwrappedRequest.reportProgress,
48
- withCredentials: unwrappedRequest.withCredentials,
49
- keepalive: unwrappedRequest.keepalive,
50
- cache: unwrappedRequest.cache,
51
- priority: unwrappedRequest.priority,
52
- mode: unwrappedRequest.mode,
53
- redirect: unwrappedRequest.redirect,
54
- responseType,
55
- context: unwrappedRequest.context,
56
- transferCache: unwrappedRequest.transferCache,
57
- credentials: unwrappedRequest.credentials,
58
- referrer: unwrappedRequest.referrer,
59
- referrerPolicy: unwrappedRequest.referrerPolicy,
60
- integrity: unwrappedRequest.integrity,
61
- timeout: unwrappedRequest.timeout
62
- });
63
- }
64
- class HttpResourceImpl extends _ResourceImpl {
65
- client;
66
- _headers = linkedSignal({
67
- ...(ngDevMode ? {
68
- debugName: "_headers"
69
- } : {}),
70
- source: this.extRequest,
71
- computation: () => undefined
72
- });
73
- _progress = linkedSignal({
74
- ...(ngDevMode ? {
75
- debugName: "_progress"
76
- } : {}),
77
- source: this.extRequest,
78
- computation: () => undefined
79
- });
80
- _statusCode = linkedSignal({
81
- ...(ngDevMode ? {
82
- debugName: "_statusCode"
83
- } : {}),
84
- source: this.extRequest,
85
- computation: () => undefined
86
- });
87
- headers = computed(() => this.status() === 'resolved' || this.status() === 'error' ? this._headers() : undefined, ...(ngDevMode ? [{
88
- debugName: "headers"
89
- }] : []));
90
- progress = this._progress.asReadonly();
91
- statusCode = this._statusCode.asReadonly();
92
- constructor(injector, request, defaultValue, debugName, parse, equal) {
93
- super(request, ({
94
- params: request,
95
- abortSignal
96
- }) => {
97
- let sub;
98
- const onAbort = () => sub.unsubscribe();
99
- abortSignal.addEventListener('abort', onAbort);
100
- const stream = signal({
101
- value: undefined
102
- }, ...(ngDevMode ? [{
103
- debugName: "stream"
104
- }] : []));
105
- let resolve;
106
- const promise = new Promise(r => resolve = r);
107
- const send = value => {
108
- stream.set(value);
109
- resolve?.(stream);
110
- resolve = undefined;
111
- };
112
- sub = this.client.request(request).subscribe({
113
- next: event => {
114
- switch (event.type) {
115
- case HttpEventType.Response:
116
- this._headers.set(event.headers);
117
- this._statusCode.set(event.status);
118
- try {
119
- send({
120
- value: parse ? parse(event.body) : event.body
121
- });
122
- } catch (error) {
123
- send({
124
- error: _encapsulateResourceError(error)
125
- });
126
- }
127
- break;
128
- case HttpEventType.DownloadProgress:
129
- this._progress.set(event);
130
- break;
131
- }
132
- },
133
- error: error => {
134
- if (error instanceof HttpErrorResponse) {
135
- this._headers.set(error.headers);
136
- this._statusCode.set(error.status);
137
- }
138
- send({
139
- error
140
- });
141
- abortSignal.removeEventListener('abort', onAbort);
142
- },
143
- complete: () => {
144
- if (resolve) {
145
- send({
146
- error: new _RuntimeError(991, ngDevMode && 'Resource completed before producing a value')
147
- });
148
- }
149
- abortSignal.removeEventListener('abort', onAbort);
150
- }
151
- });
152
- return promise;
153
- }, defaultValue, equal, debugName, injector);
154
- this.client = injector.get(HttpClient);
155
- }
156
- set(value) {
157
- super.set(value);
158
- this._headers.set(undefined);
159
- this._progress.set(undefined);
160
- this._statusCode.set(undefined);
161
- }
162
- }
163
-
164
15
  const HTTP_TRANSFER_CACHE_ORIGIN_MAP = new InjectionToken(typeof ngDevMode !== 'undefined' && ngDevMode ? 'HTTP_TRANSFER_CACHE_ORIGIN_MAP' : '');
165
16
  const BODY = 'b';
166
17
  const HEADERS = 'h';
@@ -170,32 +21,44 @@ const REQ_URL = 'u';
170
21
  const RESPONSE_TYPE = 'rt';
171
22
  const CACHE_OPTIONS = new InjectionToken(typeof ngDevMode !== 'undefined' && ngDevMode ? 'HTTP_TRANSFER_STATE_CACHE_OPTIONS' : '');
172
23
  const ALLOWED_METHODS = ['GET', 'HEAD'];
173
- function transferCacheInterceptorFn(req, next) {
24
+ function shouldCacheRequest(req, options) {
174
25
  const {
175
26
  isCacheActive,
176
27
  ...globalOptions
177
- } = inject(CACHE_OPTIONS);
28
+ } = options;
178
29
  const {
179
30
  transferCache: requestOptions,
180
31
  method: requestMethod
181
32
  } = req;
182
33
  if (!isCacheActive || requestOptions === false || requestMethod === 'POST' && !globalOptions.includePostRequests && !requestOptions || requestMethod !== 'POST' && !ALLOWED_METHODS.includes(requestMethod) || !globalOptions.includeRequestsWithAuthHeaders && hasAuthHeaders(req) || globalOptions.filter?.(req) === false) {
183
- return next(req);
34
+ return false;
35
+ }
36
+ return true;
37
+ }
38
+ function getHeadersToInclude(options, requestOptions) {
39
+ const {
40
+ includeHeaders: globalHeaders
41
+ } = options;
42
+ let headersToInclude = globalHeaders;
43
+ if (typeof requestOptions === 'object' && requestOptions.includeHeaders) {
44
+ headersToInclude = requestOptions.includeHeaders;
45
+ }
46
+ return headersToInclude;
47
+ }
48
+ function retrieveStateFromCache(req, options, transferState, originMap) {
49
+ const {
50
+ transferCache: requestOptions
51
+ } = req;
52
+ if (!shouldCacheRequest(req, options)) {
53
+ return null;
184
54
  }
185
- const transferState = inject(TransferState);
186
- const originMap = inject(HTTP_TRANSFER_CACHE_ORIGIN_MAP, {
187
- optional: true
188
- });
189
55
  if (typeof ngServerMode !== 'undefined' && !ngServerMode && originMap) {
190
56
  throw new _RuntimeError(2803, ngDevMode && 'Angular detected that the `HTTP_TRANSFER_CACHE_ORIGIN_MAP` token is configured and ' + 'present in the client side code. Please ensure that this token is only provided in the ' + 'server code of the application.');
191
57
  }
192
58
  const requestUrl = typeof ngServerMode !== 'undefined' && ngServerMode && originMap ? mapRequestOriginUrl(req.url, originMap) : req.url;
193
59
  const storeKey = makeCacheKey(req, requestUrl);
194
60
  const response = transferState.get(storeKey, null);
195
- let headersToInclude = globalOptions.includeHeaders;
196
- if (typeof requestOptions === 'object' && requestOptions.includeHeaders) {
197
- headersToInclude = requestOptions.includeHeaders;
198
- }
61
+ const headersToInclude = getHeadersToInclude(options, requestOptions);
199
62
  if (response) {
200
63
  const {
201
64
  [BODY]: undecodedBody,
@@ -218,13 +81,34 @@ function transferCacheInterceptorFn(req, next) {
218
81
  if (typeof ngDevMode === 'undefined' || ngDevMode) {
219
82
  headers = appendMissingHeadersDetection(req.url, headers, headersToInclude ?? []);
220
83
  }
221
- return of(new HttpResponse({
84
+ return new HttpResponse({
222
85
  body,
223
86
  headers,
224
87
  status,
225
88
  statusText,
226
89
  url
227
- }));
90
+ });
91
+ }
92
+ return null;
93
+ }
94
+ function transferCacheInterceptorFn(req, next) {
95
+ const options = inject(CACHE_OPTIONS);
96
+ const transferState = inject(TransferState);
97
+ const originMap = inject(HTTP_TRANSFER_CACHE_ORIGIN_MAP, {
98
+ optional: true
99
+ });
100
+ const cachedResponse = retrieveStateFromCache(req, options, transferState, originMap);
101
+ if (cachedResponse) {
102
+ return of(cachedResponse);
103
+ }
104
+ const {
105
+ transferCache: requestOptions
106
+ } = req;
107
+ const headersToInclude = getHeadersToInclude(options, requestOptions);
108
+ const requestUrl = typeof ngServerMode !== 'undefined' && ngServerMode && originMap ? mapRequestOriginUrl(req.url, originMap) : req.url;
109
+ const storeKey = makeCacheKey(req, requestUrl);
110
+ if (!shouldCacheRequest(req, options)) {
111
+ return next(req);
228
112
  }
229
113
  const event$ = next(req);
230
114
  if (typeof ngServerMode !== 'undefined' && ngServerMode) {
@@ -368,5 +252,182 @@ function verifyMappedOrigin(url) {
368
252
  }
369
253
  }
370
254
 
255
+ const httpResource = (() => {
256
+ const jsonFn = makeHttpResourceFn('json');
257
+ jsonFn.arrayBuffer = makeHttpResourceFn('arraybuffer');
258
+ jsonFn.blob = makeHttpResourceFn('blob');
259
+ jsonFn.text = makeHttpResourceFn('text');
260
+ return jsonFn;
261
+ })();
262
+ function makeHttpResourceFn(responseType) {
263
+ return function httpResource(request, options) {
264
+ if (ngDevMode && !options?.injector) {
265
+ assertInInjectionContext(httpResource);
266
+ }
267
+ const injector = options?.injector ?? inject(Injector);
268
+ const cacheOptions = injector.get(CACHE_OPTIONS, null, {
269
+ optional: true
270
+ });
271
+ const transferState = injector.get(TransferState, null, {
272
+ optional: true
273
+ });
274
+ const originMap = injector.get(HTTP_TRANSFER_CACHE_ORIGIN_MAP, null, {
275
+ optional: true
276
+ });
277
+ const getInitialStream = req => {
278
+ if (cacheOptions && transferState && req) {
279
+ const cachedResponse = retrieveStateFromCache(req, cacheOptions, transferState, originMap);
280
+ if (cachedResponse) {
281
+ try {
282
+ const body = cachedResponse.body;
283
+ const parsed = options?.parse ? options.parse(body) : body;
284
+ return signal({
285
+ value: parsed
286
+ });
287
+ } catch (e) {
288
+ if (typeof ngDevMode === 'undefined' || ngDevMode) {
289
+ console.warn(`Angular detected an error while parsing the cached response for the httpResource at \`${req.url}\`. ` + `The resource will fall back to its default value and try again asynchronously.`, e);
290
+ }
291
+ }
292
+ }
293
+ }
294
+ return undefined;
295
+ };
296
+ return new HttpResourceImpl(injector, () => normalizeRequest(request, responseType), options?.defaultValue, options?.debugName, options?.parse, options?.equal, getInitialStream);
297
+ };
298
+ }
299
+ function normalizeRequest(request, responseType) {
300
+ let unwrappedRequest = typeof request === 'function' ? request() : request;
301
+ if (unwrappedRequest === undefined) {
302
+ return undefined;
303
+ } else if (typeof unwrappedRequest === 'string') {
304
+ unwrappedRequest = {
305
+ url: unwrappedRequest
306
+ };
307
+ }
308
+ const headers = unwrappedRequest.headers instanceof HttpHeaders ? unwrappedRequest.headers : new HttpHeaders(unwrappedRequest.headers);
309
+ const params = unwrappedRequest.params instanceof HttpParams ? unwrappedRequest.params : new HttpParams({
310
+ fromObject: unwrappedRequest.params
311
+ });
312
+ return new HttpRequest(unwrappedRequest.method ?? 'GET', unwrappedRequest.url, unwrappedRequest.body ?? null, {
313
+ headers,
314
+ params,
315
+ reportProgress: unwrappedRequest.reportProgress,
316
+ withCredentials: unwrappedRequest.withCredentials,
317
+ keepalive: unwrappedRequest.keepalive,
318
+ cache: unwrappedRequest.cache,
319
+ priority: unwrappedRequest.priority,
320
+ mode: unwrappedRequest.mode,
321
+ redirect: unwrappedRequest.redirect,
322
+ responseType,
323
+ context: unwrappedRequest.context,
324
+ transferCache: unwrappedRequest.transferCache,
325
+ credentials: unwrappedRequest.credentials,
326
+ referrer: unwrappedRequest.referrer,
327
+ referrerPolicy: unwrappedRequest.referrerPolicy,
328
+ integrity: unwrappedRequest.integrity,
329
+ timeout: unwrappedRequest.timeout
330
+ });
331
+ }
332
+ class HttpResourceImpl extends _ResourceImpl {
333
+ client;
334
+ _headers = linkedSignal({
335
+ ...(ngDevMode ? {
336
+ debugName: "_headers"
337
+ } : {}),
338
+ source: this.extRequest,
339
+ computation: () => undefined
340
+ });
341
+ _progress = linkedSignal({
342
+ ...(ngDevMode ? {
343
+ debugName: "_progress"
344
+ } : {}),
345
+ source: this.extRequest,
346
+ computation: () => undefined
347
+ });
348
+ _statusCode = linkedSignal({
349
+ ...(ngDevMode ? {
350
+ debugName: "_statusCode"
351
+ } : {}),
352
+ source: this.extRequest,
353
+ computation: () => undefined
354
+ });
355
+ headers = computed(() => this.status() === 'resolved' || this.status() === 'error' ? this._headers() : undefined, ...(ngDevMode ? [{
356
+ debugName: "headers"
357
+ }] : []));
358
+ progress = this._progress.asReadonly();
359
+ statusCode = this._statusCode.asReadonly();
360
+ constructor(injector, request, defaultValue, debugName, parse, equal, getInitialStream) {
361
+ super(request, ({
362
+ params: request,
363
+ abortSignal
364
+ }) => {
365
+ let sub;
366
+ const onAbort = () => sub.unsubscribe();
367
+ abortSignal.addEventListener('abort', onAbort);
368
+ const stream = signal({
369
+ value: undefined
370
+ }, ...(ngDevMode ? [{
371
+ debugName: "stream"
372
+ }] : []));
373
+ let resolve;
374
+ const promise = new Promise(r => resolve = r);
375
+ const send = value => {
376
+ stream.set(value);
377
+ resolve?.(stream);
378
+ resolve = undefined;
379
+ };
380
+ sub = this.client.request(request).subscribe({
381
+ next: event => {
382
+ switch (event.type) {
383
+ case HttpEventType.Response:
384
+ this._headers.set(event.headers);
385
+ this._statusCode.set(event.status);
386
+ try {
387
+ send({
388
+ value: parse ? parse(event.body) : event.body
389
+ });
390
+ } catch (error) {
391
+ send({
392
+ error: _encapsulateResourceError(error)
393
+ });
394
+ }
395
+ break;
396
+ case HttpEventType.DownloadProgress:
397
+ this._progress.set(event);
398
+ break;
399
+ }
400
+ },
401
+ error: error => {
402
+ if (error instanceof HttpErrorResponse) {
403
+ this._headers.set(error.headers);
404
+ this._statusCode.set(error.status);
405
+ }
406
+ send({
407
+ error
408
+ });
409
+ abortSignal.removeEventListener('abort', onAbort);
410
+ },
411
+ complete: () => {
412
+ if (resolve) {
413
+ send({
414
+ error: new _RuntimeError(991, ngDevMode && 'Resource completed before producing a value')
415
+ });
416
+ }
417
+ abortSignal.removeEventListener('abort', onAbort);
418
+ }
419
+ });
420
+ return promise;
421
+ }, defaultValue, equal, debugName, injector, getInitialStream);
422
+ this.client = injector.get(HttpClient);
423
+ }
424
+ set(value) {
425
+ super.set(value);
426
+ this._headers.set(undefined);
427
+ this._progress.set(undefined);
428
+ this._statusCode.set(undefined);
429
+ }
430
+ }
431
+
371
432
  export { HTTP_TRANSFER_CACHE_ORIGIN_MAP, HttpClient, HttpErrorResponse, HttpEventType, HttpHeaders, HttpParams, HttpRequest, HttpResponse, httpResource, HTTP_ROOT_INTERCEPTOR_FNS as ɵHTTP_ROOT_INTERCEPTOR_FNS, withHttpTransferCache as ɵwithHttpTransferCache };
372
433
  //# sourceMappingURL=http.mjs.map