@arcgis/toolkit 5.0.0-next.87 → 5.0.0-next.88

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.
@@ -26,8 +26,29 @@ const log = (level, context, message, options) => {
26
26
  }
27
27
  loggedMessages.add(key);
28
28
  }
29
- esriConfig?.log.interceptors?.forEach((interceptor) => interceptor(level, contextString, message));
30
- console[level](`[${contextString}]`, message);
29
+ let memorySafeDetail;
30
+ if (options?.detail) {
31
+ memorySafeDetail = {};
32
+ for (const [key, value] of Object.entries(options.detail)) {
33
+ if ((typeof value === "object" || typeof value === "function") && value !== null) {
34
+ const weakRefValue = new WeakRef(value);
35
+ Object.defineProperty(memorySafeDetail, key, {
36
+ get() {
37
+ return weakRefValue.deref();
38
+ }
39
+ });
40
+ } else {
41
+ memorySafeDetail[key] = value;
42
+ }
43
+ }
44
+ esriConfig?.log.interceptors?.forEach(
45
+ (interceptor) => interceptor(level, contextString, message, memorySafeDetail)
46
+ );
47
+ console[level](`[${contextString}]`, message, memorySafeDetail);
48
+ } else {
49
+ esriConfig?.log.interceptors?.forEach((interceptor) => interceptor(level, contextString, message));
50
+ console[level](`[${contextString}]`, message);
51
+ }
31
52
  };
32
53
  const composeMissingPropertyMessage = (property) => (
33
54
  //#endregion composeMissingPropertyMessage
@@ -11,8 +11,10 @@ type AccessorLike = {
11
11
  };
12
12
  export type LogContext = AccessorLike | CustomElementLike | string;
13
13
  type LogOptions = {
14
- /** Whether the message should only be logged once */
14
+ /** Whether the message should only be logged once. */
15
15
  once?: boolean;
16
+ /** Additional objects to log after `message`. Use this to avoid memory leaks when logging objects to the console. Each object value will be automatically wrapped in a `WeakRef` before logging so it can be garbage-collected. */
17
+ detail?: Record<string, unknown>;
16
18
  };
17
19
  type EsriConfig = {
18
20
  log: {
@@ -47,14 +49,19 @@ export declare const setEsriConfig: (config: EsriConfig) => void;
47
49
  *
48
50
  * @example
49
51
  * ```ts
50
- * log("error", this, "message to log",
51
- * {
52
- * once: true, // only log this message once
53
- * }
54
- * );
52
+ * // Basic usage
53
+ * log("error", this, "message to log");
55
54
  * ```
55
+ *
56
+ * @example
57
+ * ```ts
58
+ * // Optional usage
59
+ * log("warn", this, "message to log", {
60
+ * once: true,
61
+ * detail: { object1, object2 }
62
+ * });
56
63
  */
57
- export declare const log: (level: LogLevel, context: LogContext, message: unknown, options?: LogOptions) => void;
64
+ export declare const log: (level: LogLevel, context: LogContext, message: string, options?: LogOptions) => void;
58
65
  type LogContextOrObject = Exclude<LogContext, string> | object;
59
66
  type InferPropertyType<T extends LogContextOrObject> = [object] extends [T] ? string : keyof T;
60
67
  /**
@@ -11,8 +11,10 @@ type AccessorLike = {
11
11
  };
12
12
  export type LogContext = AccessorLike | CustomElementLike | string;
13
13
  type LogOptions = {
14
- /** Whether the message should only be logged once */
14
+ /** Whether the message should only be logged once. */
15
15
  once?: boolean;
16
+ /** Additional objects to log after `message`. Use this to avoid memory leaks when logging objects to the console. Each object value will be automatically wrapped in a `WeakRef` before logging so it can be garbage-collected. */
17
+ detail?: Record<string, unknown>;
16
18
  };
17
19
  type EsriConfig = {
18
20
  log: {
@@ -47,14 +49,19 @@ export declare const setEsriConfig: (config: EsriConfig) => void;
47
49
  *
48
50
  * @example
49
51
  * ```ts
50
- * log("error", this, "message to log",
51
- * {
52
- * once: true, // only log this message once
53
- * }
54
- * );
52
+ * // Basic usage
53
+ * log("error", this, "message to log");
55
54
  * ```
55
+ *
56
+ * @example
57
+ * ```ts
58
+ * // Optional usage
59
+ * log("warn", this, "message to log", {
60
+ * once: true,
61
+ * detail: { object1, object2 }
62
+ * });
56
63
  */
57
- export declare const log: (level: LogLevel, context: LogContext, message: unknown, options?: LogOptions) => void;
64
+ export declare const log: (level: LogLevel, context: LogContext, message: string, options?: LogOptions) => void;
58
65
  type LogContextOrObject = Exclude<LogContext, string> | object;
59
66
  type InferPropertyType<T extends LogContextOrObject> = [object] extends [T] ? string : keyof T;
60
67
  /**
package/dist/log/index.js CHANGED
@@ -24,8 +24,29 @@ const log = (level, context, message, options) => {
24
24
  }
25
25
  loggedMessages.add(key);
26
26
  }
27
- esriConfig?.log.interceptors?.forEach((interceptor) => interceptor(level, contextString, message));
28
- console[level](`[${contextString}]`, message);
27
+ let memorySafeDetail;
28
+ if (options?.detail) {
29
+ memorySafeDetail = {};
30
+ for (const [key, value] of Object.entries(options.detail)) {
31
+ if ((typeof value === "object" || typeof value === "function") && value !== null) {
32
+ const weakRefValue = new WeakRef(value);
33
+ Object.defineProperty(memorySafeDetail, key, {
34
+ get() {
35
+ return weakRefValue.deref();
36
+ }
37
+ });
38
+ } else {
39
+ memorySafeDetail[key] = value;
40
+ }
41
+ }
42
+ esriConfig?.log.interceptors?.forEach(
43
+ (interceptor) => interceptor(level, contextString, message, memorySafeDetail)
44
+ );
45
+ console[level](`[${contextString}]`, message, memorySafeDetail);
46
+ } else {
47
+ esriConfig?.log.interceptors?.forEach((interceptor) => interceptor(level, contextString, message));
48
+ console[level](`[${contextString}]`, message);
49
+ }
29
50
  };
30
51
  const composeMissingPropertyMessage = (property) => (
31
52
  //#endregion composeMissingPropertyMessage
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@arcgis/toolkit",
3
- "version": "5.0.0-next.87",
3
+ "version": "5.0.0-next.88",
4
4
  "description": "Collection of common internal patterns and utilities for ArcGIS Maps SDK for JavaScript components.",
5
5
  "homepage": "https://developers.arcgis.com/javascript/latest/",
6
6
  "sideEffects": false,