@metamask-previews/snap-networks-utils 1.0.0-preview-47643fc → 1.0.0-preview-73bc702

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/CHANGELOG.md CHANGED
@@ -7,9 +7,14 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ### Added
11
+
12
+ - Add a `safeMerge` utility for shallowly merging objects. ([#166](https://github.com/MetaMask/internal-snaps/pull/166))
13
+
10
14
  ### Changed
11
15
 
12
- - **BREAKING** Replace the logger utilities with a configurable `Logger` class that requires a log level and supports level filtering, per-instance prefixes, and method decorators.
16
+ - **BREAKING** Replace the logger utilities with a configurable `Logger` class that requires a log level and supports level filtering, per-instance prefixes, and method decorators. ([#136](https://github.com/MetaMask/internal-snaps/pull/136))
17
+ - Bump `@metamask/utils` from `^11.9.0` to `^11.11.9` ([#161](https://github.com/MetaMask/internal-snaps/pull/161))
13
18
 
14
19
  ## [1.0.0]
15
20
 
package/dist/index.cjs CHANGED
@@ -1,10 +1,15 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.RemoteFeatureFlagsProvider = exports.REMOTE_FEATURE_FLAGS_PROVIDER_NAME = exports.AssetsProvider = exports.ASSETS_PROVIDER_NAME = void 0;
3
+ exports.LogLevel = exports.Logger = exports.safeMerge = exports.RemoteFeatureFlagsProvider = exports.REMOTE_FEATURE_FLAGS_PROVIDER_NAME = exports.AssetsProvider = exports.ASSETS_PROVIDER_NAME = void 0;
4
4
  var AssetsProvider_1 = require("./providers/assets/AssetsProvider.cjs");
5
5
  Object.defineProperty(exports, "ASSETS_PROVIDER_NAME", { enumerable: true, get: function () { return AssetsProvider_1.ASSETS_PROVIDER_NAME; } });
6
6
  Object.defineProperty(exports, "AssetsProvider", { enumerable: true, get: function () { return AssetsProvider_1.AssetsProvider; } });
7
7
  var RemoteFeatureFlagsProvider_1 = require("./providers/remote-feature-flags/RemoteFeatureFlagsProvider.cjs");
8
8
  Object.defineProperty(exports, "REMOTE_FEATURE_FLAGS_PROVIDER_NAME", { enumerable: true, get: function () { return RemoteFeatureFlagsProvider_1.REMOTE_FEATURE_FLAGS_PROVIDER_NAME; } });
9
9
  Object.defineProperty(exports, "RemoteFeatureFlagsProvider", { enumerable: true, get: function () { return RemoteFeatureFlagsProvider_1.RemoteFeatureFlagsProvider; } });
10
+ var safeMerge_1 = require("./safeMerge/safeMerge.cjs");
11
+ Object.defineProperty(exports, "safeMerge", { enumerable: true, get: function () { return safeMerge_1.safeMerge; } });
12
+ var logger_1 = require("./logger/index.cjs");
13
+ Object.defineProperty(exports, "Logger", { enumerable: true, get: function () { return logger_1.Logger; } });
14
+ Object.defineProperty(exports, "LogLevel", { enumerable: true, get: function () { return logger_1.LogLevel; } });
10
15
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,wEAI2C;AAHzC,sHAAA,oBAAoB,OAAA;AACpB,gHAAA,cAAc,OAAA;AAGhB,8GAIqE;AAHnE,gJAAA,kCAAkC,OAAA;AAClC,wIAAA,0BAA0B,OAAA","sourcesContent":["export {\n ASSETS_PROVIDER_NAME,\n AssetsProvider,\n type AssetsProviderMessenger,\n} from './providers/assets/AssetsProvider';\nexport {\n REMOTE_FEATURE_FLAGS_PROVIDER_NAME,\n RemoteFeatureFlagsProvider,\n type RemoteFeatureFlagsProviderMessenger,\n} from './providers/remote-feature-flags/RemoteFeatureFlagsProvider';\n"]}
1
+ {"version":3,"file":"index.cjs","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,wEAI2C;AAHzC,sHAAA,oBAAoB,OAAA;AACpB,gHAAA,cAAc,OAAA;AAGhB,8GAIqE;AAHnE,gJAAA,kCAAkC,OAAA;AAClC,wIAAA,0BAA0B,OAAA;AAG5B,uDAAkD;AAAzC,sGAAA,SAAS,OAAA;AAClB,6CAA4C;AAAnC,gGAAA,MAAM,OAAA;AAAE,kGAAA,QAAQ,OAAA","sourcesContent":["export {\n ASSETS_PROVIDER_NAME,\n AssetsProvider,\n type AssetsProviderMessenger,\n} from './providers/assets/AssetsProvider';\nexport {\n REMOTE_FEATURE_FLAGS_PROVIDER_NAME,\n RemoteFeatureFlagsProvider,\n type RemoteFeatureFlagsProviderMessenger,\n} from './providers/remote-feature-flags/RemoteFeatureFlagsProvider';\nexport { safeMerge } from './safeMerge/safeMerge';\nexport { Logger, LogLevel } from './logger';\nexport type {\n LoggerOptions,\n LoggerMethod,\n LogMethod,\n LogMethodDecorator,\n LoggerDecorators,\n} from './logger';\n"]}
package/dist/index.d.cts CHANGED
@@ -1,3 +1,6 @@
1
1
  export { ASSETS_PROVIDER_NAME, AssetsProvider, type AssetsProviderMessenger, } from "./providers/assets/AssetsProvider.cjs";
2
2
  export { REMOTE_FEATURE_FLAGS_PROVIDER_NAME, RemoteFeatureFlagsProvider, type RemoteFeatureFlagsProviderMessenger, } from "./providers/remote-feature-flags/RemoteFeatureFlagsProvider.cjs";
3
+ export { safeMerge } from "./safeMerge/safeMerge.cjs";
4
+ export { Logger, LogLevel } from "./logger/index.cjs";
5
+ export type { LoggerOptions, LoggerMethod, LogMethod, LogMethodDecorator, LoggerDecorators, } from "./logger/index.cjs";
3
6
  //# sourceMappingURL=index.d.cts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.cts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,oBAAoB,EACpB,cAAc,EACd,KAAK,uBAAuB,GAC7B,8CAA0C;AAC3C,OAAO,EACL,kCAAkC,EAClC,0BAA0B,EAC1B,KAAK,mCAAmC,GACzC,wEAAoE"}
1
+ {"version":3,"file":"index.d.cts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,oBAAoB,EACpB,cAAc,EACd,KAAK,uBAAuB,GAC7B,8CAA0C;AAC3C,OAAO,EACL,kCAAkC,EAClC,0BAA0B,EAC1B,KAAK,mCAAmC,GACzC,wEAAoE;AACrE,OAAO,EAAE,SAAS,EAAE,kCAA8B;AAClD,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,2BAAiB;AAC5C,YAAY,EACV,aAAa,EACb,YAAY,EACZ,SAAS,EACT,kBAAkB,EAClB,gBAAgB,GACjB,2BAAiB"}
package/dist/index.d.mts CHANGED
@@ -1,3 +1,6 @@
1
1
  export { ASSETS_PROVIDER_NAME, AssetsProvider, type AssetsProviderMessenger, } from "./providers/assets/AssetsProvider.mjs";
2
2
  export { REMOTE_FEATURE_FLAGS_PROVIDER_NAME, RemoteFeatureFlagsProvider, type RemoteFeatureFlagsProviderMessenger, } from "./providers/remote-feature-flags/RemoteFeatureFlagsProvider.mjs";
3
+ export { safeMerge } from "./safeMerge/safeMerge.mjs";
4
+ export { Logger, LogLevel } from "./logger/index.mjs";
5
+ export type { LoggerOptions, LoggerMethod, LogMethod, LogMethodDecorator, LoggerDecorators, } from "./logger/index.mjs";
3
6
  //# sourceMappingURL=index.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.mts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,oBAAoB,EACpB,cAAc,EACd,KAAK,uBAAuB,GAC7B,8CAA0C;AAC3C,OAAO,EACL,kCAAkC,EAClC,0BAA0B,EAC1B,KAAK,mCAAmC,GACzC,wEAAoE"}
1
+ {"version":3,"file":"index.d.mts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,oBAAoB,EACpB,cAAc,EACd,KAAK,uBAAuB,GAC7B,8CAA0C;AAC3C,OAAO,EACL,kCAAkC,EAClC,0BAA0B,EAC1B,KAAK,mCAAmC,GACzC,wEAAoE;AACrE,OAAO,EAAE,SAAS,EAAE,kCAA8B;AAClD,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,2BAAiB;AAC5C,YAAY,EACV,aAAa,EACb,YAAY,EACZ,SAAS,EACT,kBAAkB,EAClB,gBAAgB,GACjB,2BAAiB"}
package/dist/index.mjs CHANGED
@@ -1,3 +1,5 @@
1
1
  export { ASSETS_PROVIDER_NAME, AssetsProvider } from "./providers/assets/AssetsProvider.mjs";
2
2
  export { REMOTE_FEATURE_FLAGS_PROVIDER_NAME, RemoteFeatureFlagsProvider } from "./providers/remote-feature-flags/RemoteFeatureFlagsProvider.mjs";
3
+ export { safeMerge } from "./safeMerge/safeMerge.mjs";
4
+ export { Logger, LogLevel } from "./logger/index.mjs";
3
5
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,oBAAoB,EACpB,cAAc,EAEf,8CAA0C;AAC3C,OAAO,EACL,kCAAkC,EAClC,0BAA0B,EAE3B,wEAAoE","sourcesContent":["export {\n ASSETS_PROVIDER_NAME,\n AssetsProvider,\n type AssetsProviderMessenger,\n} from './providers/assets/AssetsProvider';\nexport {\n REMOTE_FEATURE_FLAGS_PROVIDER_NAME,\n RemoteFeatureFlagsProvider,\n type RemoteFeatureFlagsProviderMessenger,\n} from './providers/remote-feature-flags/RemoteFeatureFlagsProvider';\n"]}
1
+ {"version":3,"file":"index.mjs","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,oBAAoB,EACpB,cAAc,EAEf,8CAA0C;AAC3C,OAAO,EACL,kCAAkC,EAClC,0BAA0B,EAE3B,wEAAoE;AACrE,OAAO,EAAE,SAAS,EAAE,kCAA8B;AAClD,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,2BAAiB","sourcesContent":["export {\n ASSETS_PROVIDER_NAME,\n AssetsProvider,\n type AssetsProviderMessenger,\n} from './providers/assets/AssetsProvider';\nexport {\n REMOTE_FEATURE_FLAGS_PROVIDER_NAME,\n RemoteFeatureFlagsProvider,\n type RemoteFeatureFlagsProviderMessenger,\n} from './providers/remote-feature-flags/RemoteFeatureFlagsProvider';\nexport { safeMerge } from './safeMerge/safeMerge';\nexport { Logger, LogLevel } from './logger';\nexport type {\n LoggerOptions,\n LoggerMethod,\n LogMethod,\n LogMethodDecorator,\n LoggerDecorators,\n} from './logger';\n"]}
@@ -49,7 +49,7 @@ const LogLevelStruct = (0, superstruct_1.enums)(Object.values(exports.LogLevel))
49
49
  * **Example: create an enabled logger.**
50
50
  *
51
51
  * ```ts
52
- * import { Logger } from '@metamask/snap-networks-utils/logger';
52
+ * import { Logger } from '@metamask/snap-networks-utils';
53
53
  *
54
54
  * const logger = new Logger({ level: LogLevel.TRACE });
55
55
  * logger.info('Account synced');
@@ -1 +1 @@
1
- {"version":3,"file":"Logger.cjs","sourceRoot":"","sources":["../../src/logger/Logger.ts"],"names":[],"mappings":"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","sourcesContent":["import { assert, enums } from '@metamask/superstruct';\n\n/**\n * The severity levels supported by {@link Logger}.\n */\nexport const LogLevel = {\n SILENT: 'silent',\n ERROR: 'error',\n WARN: 'warn',\n INFO: 'info',\n DEBUG: 'debug',\n TRACE: 'trace',\n} as const;\n\nexport type LogLevel = (typeof LogLevel)[keyof typeof LogLevel];\n\n/**\n * Defines the severity ordering used to filter log messages.\n *\n * Lower values are less verbose. Changing these numeric priorities changes\n * which messages are emitted for each configured {@link LogLevel}, including\n * in production.\n */\nconst logLevelPriority = {\n [LogLevel.SILENT]: 0,\n [LogLevel.ERROR]: 1,\n [LogLevel.WARN]: 2,\n [LogLevel.INFO]: 3,\n [LogLevel.DEBUG]: 4,\n [LogLevel.TRACE]: 5,\n};\n\nconst LogLevelStruct = enums(Object.values(LogLevel));\n\nexport type LoggerMethod = Exclude<LogLevel, typeof LogLevel.SILENT>;\n\nexport type LogMethod = (...args: unknown[]) => void;\n\n/**\n * A function that can add behavior around a logger method.\n *\n * Call `next` to forward a message through the logger's configured output.\n */\nexport type LogMethodDecorator = (next: LogMethod, ...args: unknown[]) => void;\n\nexport type LoggerDecorators = Partial<\n Record<LoggerMethod, LogMethodDecorator>\n>;\n\n/**\n * Configuration for a {@link Logger}.\n *\n * **Example: configure logging with `LOG_LEVEL`.**\n *\n * ```ts\n * const logger = new Logger({\n * level: process.env.LOG_LEVEL\n * });\n * ```\n */\nexport type LoggerOptions = {\n /**\n * The most verbose severity level that should be logged. Use\n * {@link LogLevel.SILENT} to disable logging.\n */\n level: LogLevel;\n /**\n * An optional prefix prepended to every message.\n *\n * Use {@link Logger.withPrefix} to add prefixes after construction.\n */\n prefix?: string;\n /**\n * Optional behavior to apply to individual log methods.\n *\n * Decorators receive `next`, which preserves this logger's configured level,\n * prefix, and console output.\n */\n decorators?: LoggerDecorators;\n};\n\n/**\n * Logs network Snap messages to the console at configurable severity levels.\n *\n * Disable output with {@link LogLevel.SILENT}.\n *\n * **Example: create an enabled logger.**\n *\n * ```ts\n * import { Logger } from '@metamask/snap-networks-utils/logger';\n *\n * const logger = new Logger({ level: LogLevel.TRACE });\n * logger.info('Account synced');\n * ```\n *\n * **Example: add a Snap or component prefix.**\n *\n * ```ts\n * const rootLogger = new Logger({ level: LogLevel.TRACE });\n * const snapLogger = rootLogger.withPrefix('[tron-wallet-snap]');\n * const accountsLogger = snapLogger.withPrefix('[accounts]');\n *\n * accountsLogger.debug('Refreshing account balances');\n * ```\n *\n * **Example: decorate a method with Snap-specific behavior.**\n *\n * ```ts\n * const logger = new Logger({\n * level: LogLevel.TRACE,\n * decorators: {\n * error: (next, error) => {\n * const details = getSolanaErrorDetails(error);\n * next(details ?? error);\n * },\n * },\n * });\n * ```\n */\nexport class Logger {\n readonly #level: LogLevel;\n\n readonly #prefix?: string;\n\n readonly #decorators?: LoggerDecorators;\n\n constructor({ level, prefix, decorators }: LoggerOptions) {\n assert(level, LogLevelStruct);\n\n this.#level = level;\n this.#prefix = prefix;\n this.#decorators = decorators;\n }\n\n /**\n * Returns a logger with an additional prefix.\n *\n * The returned logger has the same log level and decorators as this one. Call\n * this method as many times as needed; each derived logger appends its prefix\n * to the existing prefix.\n *\n * @param prefix - The prefix to add to each message.\n * @returns A derived logger.\n */\n withPrefix(prefix: string): Logger {\n return new Logger({\n level: this.#level,\n prefix: this.#prefix ? `${this.#prefix} ${prefix}` : prefix,\n decorators: this.#decorators,\n });\n }\n\n error(...args: unknown[]): void {\n this.#write(LogLevel.ERROR, console.error, args);\n }\n\n warn(...args: unknown[]): void {\n this.#write(LogLevel.WARN, console.warn, args);\n }\n\n /**\n * Logs an informational message.\n *\n * @param args - The values to write to the console.\n * @deprecated Use {@link Logger.info} instead.\n */\n log(...args: unknown[]): void {\n this.info(...args);\n }\n\n info(...args: unknown[]): void {\n this.#write(LogLevel.INFO, console.info, args);\n }\n\n debug(...args: unknown[]): void {\n this.#write(LogLevel.DEBUG, console.debug, args);\n }\n\n trace(...args: unknown[]): void {\n this.#write(LogLevel.TRACE, console.trace, args);\n }\n\n #isLevelDisabled(level: LoggerMethod): boolean {\n return logLevelPriority[level] > logLevelPriority[this.#level];\n }\n\n #write(\n level: LoggerMethod,\n writeToConsole: (...args: unknown[]) => void,\n args: unknown[],\n ): void {\n if (this.#isLevelDisabled(level)) {\n return;\n }\n\n const next: LogMethod = this.#prefix\n ? (...nextArgs: unknown[]): void =>\n writeToConsole(this.#prefix, ...nextArgs)\n : writeToConsole;\n\n const decorator = this.#decorators?.[level];\n\n if (decorator) {\n decorator(next, ...args);\n return;\n }\n\n next(...args);\n }\n}\n"]}
1
+ {"version":3,"file":"Logger.cjs","sourceRoot":"","sources":["../../src/logger/Logger.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,uDAAsD;AAEtD;;GAEG;AACU,QAAA,QAAQ,GAAG;IACtB,MAAM,EAAE,QAAQ;IAChB,KAAK,EAAE,OAAO;IACd,IAAI,EAAE,MAAM;IACZ,IAAI,EAAE,MAAM;IACZ,KAAK,EAAE,OAAO;IACd,KAAK,EAAE,OAAO;CACN,CAAC;AAIX;;;;;;GAMG;AACH,MAAM,gBAAgB,GAAG;IACvB,CAAC,gBAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;IACpB,CAAC,gBAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;IACnB,CAAC,gBAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;IAClB,CAAC,gBAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;IAClB,CAAC,gBAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;IACnB,CAAC,gBAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;CACpB,CAAC;AAEF,MAAM,cAAc,GAAG,IAAA,mBAAK,EAAC,MAAM,CAAC,MAAM,CAAC,gBAAQ,CAAC,CAAC,CAAC;AAiDtD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqCG;AACH,MAAa,MAAM;IAOjB,YAAY,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,EAAiB;;QAN/C,gCAAiB;QAEjB,iCAAiB;QAEjB,qCAA+B;QAGtC,IAAA,oBAAM,EAAC,KAAK,EAAE,cAAc,CAAC,CAAC;QAE9B,uBAAA,IAAI,iBAAU,KAAK,MAAA,CAAC;QACpB,uBAAA,IAAI,kBAAW,MAAM,MAAA,CAAC;QACtB,uBAAA,IAAI,sBAAe,UAAU,MAAA,CAAC;IAChC,CAAC;IAED;;;;;;;;;OASG;IACH,UAAU,CAAC,MAAc;QACvB,OAAO,IAAI,MAAM,CAAC;YAChB,KAAK,EAAE,uBAAA,IAAI,qBAAO;YAClB,MAAM,EAAE,uBAAA,IAAI,sBAAQ,CAAC,CAAC,CAAC,GAAG,uBAAA,IAAI,sBAAQ,IAAI,MAAM,EAAE,CAAC,CAAC,CAAC,MAAM;YAC3D,UAAU,EAAE,uBAAA,IAAI,0BAAY;SAC7B,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,GAAG,IAAe;QACtB,uBAAA,IAAI,wCAAO,MAAX,IAAI,EAAQ,gBAAQ,CAAC,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IACnD,CAAC;IAED,IAAI,CAAC,GAAG,IAAe;QACrB,uBAAA,IAAI,wCAAO,MAAX,IAAI,EAAQ,gBAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IACjD,CAAC;IAED;;;;;OAKG;IACH,GAAG,CAAC,GAAG,IAAe;QACpB,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC;IACrB,CAAC;IAED,IAAI,CAAC,GAAG,IAAe;QACrB,uBAAA,IAAI,wCAAO,MAAX,IAAI,EAAQ,gBAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IACjD,CAAC;IAED,KAAK,CAAC,GAAG,IAAe;QACtB,uBAAA,IAAI,wCAAO,MAAX,IAAI,EAAQ,gBAAQ,CAAC,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IACnD,CAAC;IAED,KAAK,CAAC,GAAG,IAAe;QACtB,uBAAA,IAAI,wCAAO,MAAX,IAAI,EAAQ,gBAAQ,CAAC,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IACnD,CAAC;CA6BF;AA1FD,wBA0FC;iMA3BkB,KAAmB;IAClC,OAAO,gBAAgB,CAAC,KAAK,CAAC,GAAG,gBAAgB,CAAC,uBAAA,IAAI,qBAAO,CAAC,CAAC;AACjE,CAAC,yCAGC,KAAmB,EACnB,cAA4C,EAC5C,IAAe;IAEf,IAAI,uBAAA,IAAI,kDAAiB,MAArB,IAAI,EAAkB,KAAK,CAAC,EAAE,CAAC;QACjC,OAAO;IACT,CAAC;IAED,MAAM,IAAI,GAAc,uBAAA,IAAI,sBAAQ;QAClC,CAAC,CAAC,CAAC,GAAG,QAAmB,EAAQ,EAAE,CAC/B,cAAc,CAAC,uBAAA,IAAI,sBAAQ,EAAE,GAAG,QAAQ,CAAC;QAC7C,CAAC,CAAC,cAAc,CAAC;IAEnB,MAAM,SAAS,GAAG,uBAAA,IAAI,0BAAY,EAAE,CAAC,KAAK,CAAC,CAAC;IAE5C,IAAI,SAAS,EAAE,CAAC;QACd,SAAS,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,CAAC;QACzB,OAAO;IACT,CAAC;IAED,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC;AAChB,CAAC","sourcesContent":["import { assert, enums } from '@metamask/superstruct';\n\n/**\n * The severity levels supported by {@link Logger}.\n */\nexport const LogLevel = {\n SILENT: 'silent',\n ERROR: 'error',\n WARN: 'warn',\n INFO: 'info',\n DEBUG: 'debug',\n TRACE: 'trace',\n} as const;\n\nexport type LogLevel = (typeof LogLevel)[keyof typeof LogLevel];\n\n/**\n * Defines the severity ordering used to filter log messages.\n *\n * Lower values are less verbose. Changing these numeric priorities changes\n * which messages are emitted for each configured {@link LogLevel}, including\n * in production.\n */\nconst logLevelPriority = {\n [LogLevel.SILENT]: 0,\n [LogLevel.ERROR]: 1,\n [LogLevel.WARN]: 2,\n [LogLevel.INFO]: 3,\n [LogLevel.DEBUG]: 4,\n [LogLevel.TRACE]: 5,\n};\n\nconst LogLevelStruct = enums(Object.values(LogLevel));\n\nexport type LoggerMethod = Exclude<LogLevel, typeof LogLevel.SILENT>;\n\nexport type LogMethod = (...args: unknown[]) => void;\n\n/**\n * A function that can add behavior around a logger method.\n *\n * Call `next` to forward a message through the logger's configured output.\n */\nexport type LogMethodDecorator = (next: LogMethod, ...args: unknown[]) => void;\n\nexport type LoggerDecorators = Partial<\n Record<LoggerMethod, LogMethodDecorator>\n>;\n\n/**\n * Configuration for a {@link Logger}.\n *\n * **Example: configure logging with `LOG_LEVEL`.**\n *\n * ```ts\n * const logger = new Logger({\n * level: process.env.LOG_LEVEL\n * });\n * ```\n */\nexport type LoggerOptions = {\n /**\n * The most verbose severity level that should be logged. Use\n * {@link LogLevel.SILENT} to disable logging.\n */\n level: LogLevel;\n /**\n * An optional prefix prepended to every message.\n *\n * Use {@link Logger.withPrefix} to add prefixes after construction.\n */\n prefix?: string;\n /**\n * Optional behavior to apply to individual log methods.\n *\n * Decorators receive `next`, which preserves this logger's configured level,\n * prefix, and console output.\n */\n decorators?: LoggerDecorators;\n};\n\n/**\n * Logs network Snap messages to the console at configurable severity levels.\n *\n * Disable output with {@link LogLevel.SILENT}.\n *\n * **Example: create an enabled logger.**\n *\n * ```ts\n * import { Logger } from '@metamask/snap-networks-utils';\n *\n * const logger = new Logger({ level: LogLevel.TRACE });\n * logger.info('Account synced');\n * ```\n *\n * **Example: add a Snap or component prefix.**\n *\n * ```ts\n * const rootLogger = new Logger({ level: LogLevel.TRACE });\n * const snapLogger = rootLogger.withPrefix('[tron-wallet-snap]');\n * const accountsLogger = snapLogger.withPrefix('[accounts]');\n *\n * accountsLogger.debug('Refreshing account balances');\n * ```\n *\n * **Example: decorate a method with Snap-specific behavior.**\n *\n * ```ts\n * const logger = new Logger({\n * level: LogLevel.TRACE,\n * decorators: {\n * error: (next, error) => {\n * const details = getSolanaErrorDetails(error);\n * next(details ?? error);\n * },\n * },\n * });\n * ```\n */\nexport class Logger {\n readonly #level: LogLevel;\n\n readonly #prefix?: string;\n\n readonly #decorators?: LoggerDecorators;\n\n constructor({ level, prefix, decorators }: LoggerOptions) {\n assert(level, LogLevelStruct);\n\n this.#level = level;\n this.#prefix = prefix;\n this.#decorators = decorators;\n }\n\n /**\n * Returns a logger with an additional prefix.\n *\n * The returned logger has the same log level and decorators as this one. Call\n * this method as many times as needed; each derived logger appends its prefix\n * to the existing prefix.\n *\n * @param prefix - The prefix to add to each message.\n * @returns A derived logger.\n */\n withPrefix(prefix: string): Logger {\n return new Logger({\n level: this.#level,\n prefix: this.#prefix ? `${this.#prefix} ${prefix}` : prefix,\n decorators: this.#decorators,\n });\n }\n\n error(...args: unknown[]): void {\n this.#write(LogLevel.ERROR, console.error, args);\n }\n\n warn(...args: unknown[]): void {\n this.#write(LogLevel.WARN, console.warn, args);\n }\n\n /**\n * Logs an informational message.\n *\n * @param args - The values to write to the console.\n * @deprecated Use {@link Logger.info} instead.\n */\n log(...args: unknown[]): void {\n this.info(...args);\n }\n\n info(...args: unknown[]): void {\n this.#write(LogLevel.INFO, console.info, args);\n }\n\n debug(...args: unknown[]): void {\n this.#write(LogLevel.DEBUG, console.debug, args);\n }\n\n trace(...args: unknown[]): void {\n this.#write(LogLevel.TRACE, console.trace, args);\n }\n\n #isLevelDisabled(level: LoggerMethod): boolean {\n return logLevelPriority[level] > logLevelPriority[this.#level];\n }\n\n #write(\n level: LoggerMethod,\n writeToConsole: (...args: unknown[]) => void,\n args: unknown[],\n ): void {\n if (this.#isLevelDisabled(level)) {\n return;\n }\n\n const next: LogMethod = this.#prefix\n ? (...nextArgs: unknown[]): void =>\n writeToConsole(this.#prefix, ...nextArgs)\n : writeToConsole;\n\n const decorator = this.#decorators?.[level];\n\n if (decorator) {\n decorator(next, ...args);\n return;\n }\n\n next(...args);\n }\n}\n"]}
@@ -58,7 +58,7 @@ export type LoggerOptions = {
58
58
  * **Example: create an enabled logger.**
59
59
  *
60
60
  * ```ts
61
- * import { Logger } from '@metamask/snap-networks-utils/logger';
61
+ * import { Logger } from '@metamask/snap-networks-utils';
62
62
  *
63
63
  * const logger = new Logger({ level: LogLevel.TRACE });
64
64
  * logger.info('Account synced');
@@ -58,7 +58,7 @@ export type LoggerOptions = {
58
58
  * **Example: create an enabled logger.**
59
59
  *
60
60
  * ```ts
61
- * import { Logger } from '@metamask/snap-networks-utils/logger';
61
+ * import { Logger } from '@metamask/snap-networks-utils';
62
62
  *
63
63
  * const logger = new Logger({ level: LogLevel.TRACE });
64
64
  * logger.info('Account synced');
@@ -46,7 +46,7 @@ const LogLevelStruct = enums(Object.values(LogLevel));
46
46
  * **Example: create an enabled logger.**
47
47
  *
48
48
  * ```ts
49
- * import { Logger } from '@metamask/snap-networks-utils/logger';
49
+ * import { Logger } from '@metamask/snap-networks-utils';
50
50
  *
51
51
  * const logger = new Logger({ level: LogLevel.TRACE });
52
52
  * logger.info('Account synced');
@@ -1 +1 @@
1
- {"version":3,"file":"Logger.mjs","sourceRoot":"","sources":["../../src/logger/Logger.ts"],"names":[],"mappings":"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","sourcesContent":["import { assert, enums } from '@metamask/superstruct';\n\n/**\n * The severity levels supported by {@link Logger}.\n */\nexport const LogLevel = {\n SILENT: 'silent',\n ERROR: 'error',\n WARN: 'warn',\n INFO: 'info',\n DEBUG: 'debug',\n TRACE: 'trace',\n} as const;\n\nexport type LogLevel = (typeof LogLevel)[keyof typeof LogLevel];\n\n/**\n * Defines the severity ordering used to filter log messages.\n *\n * Lower values are less verbose. Changing these numeric priorities changes\n * which messages are emitted for each configured {@link LogLevel}, including\n * in production.\n */\nconst logLevelPriority = {\n [LogLevel.SILENT]: 0,\n [LogLevel.ERROR]: 1,\n [LogLevel.WARN]: 2,\n [LogLevel.INFO]: 3,\n [LogLevel.DEBUG]: 4,\n [LogLevel.TRACE]: 5,\n};\n\nconst LogLevelStruct = enums(Object.values(LogLevel));\n\nexport type LoggerMethod = Exclude<LogLevel, typeof LogLevel.SILENT>;\n\nexport type LogMethod = (...args: unknown[]) => void;\n\n/**\n * A function that can add behavior around a logger method.\n *\n * Call `next` to forward a message through the logger's configured output.\n */\nexport type LogMethodDecorator = (next: LogMethod, ...args: unknown[]) => void;\n\nexport type LoggerDecorators = Partial<\n Record<LoggerMethod, LogMethodDecorator>\n>;\n\n/**\n * Configuration for a {@link Logger}.\n *\n * **Example: configure logging with `LOG_LEVEL`.**\n *\n * ```ts\n * const logger = new Logger({\n * level: process.env.LOG_LEVEL\n * });\n * ```\n */\nexport type LoggerOptions = {\n /**\n * The most verbose severity level that should be logged. Use\n * {@link LogLevel.SILENT} to disable logging.\n */\n level: LogLevel;\n /**\n * An optional prefix prepended to every message.\n *\n * Use {@link Logger.withPrefix} to add prefixes after construction.\n */\n prefix?: string;\n /**\n * Optional behavior to apply to individual log methods.\n *\n * Decorators receive `next`, which preserves this logger's configured level,\n * prefix, and console output.\n */\n decorators?: LoggerDecorators;\n};\n\n/**\n * Logs network Snap messages to the console at configurable severity levels.\n *\n * Disable output with {@link LogLevel.SILENT}.\n *\n * **Example: create an enabled logger.**\n *\n * ```ts\n * import { Logger } from '@metamask/snap-networks-utils/logger';\n *\n * const logger = new Logger({ level: LogLevel.TRACE });\n * logger.info('Account synced');\n * ```\n *\n * **Example: add a Snap or component prefix.**\n *\n * ```ts\n * const rootLogger = new Logger({ level: LogLevel.TRACE });\n * const snapLogger = rootLogger.withPrefix('[tron-wallet-snap]');\n * const accountsLogger = snapLogger.withPrefix('[accounts]');\n *\n * accountsLogger.debug('Refreshing account balances');\n * ```\n *\n * **Example: decorate a method with Snap-specific behavior.**\n *\n * ```ts\n * const logger = new Logger({\n * level: LogLevel.TRACE,\n * decorators: {\n * error: (next, error) => {\n * const details = getSolanaErrorDetails(error);\n * next(details ?? error);\n * },\n * },\n * });\n * ```\n */\nexport class Logger {\n readonly #level: LogLevel;\n\n readonly #prefix?: string;\n\n readonly #decorators?: LoggerDecorators;\n\n constructor({ level, prefix, decorators }: LoggerOptions) {\n assert(level, LogLevelStruct);\n\n this.#level = level;\n this.#prefix = prefix;\n this.#decorators = decorators;\n }\n\n /**\n * Returns a logger with an additional prefix.\n *\n * The returned logger has the same log level and decorators as this one. Call\n * this method as many times as needed; each derived logger appends its prefix\n * to the existing prefix.\n *\n * @param prefix - The prefix to add to each message.\n * @returns A derived logger.\n */\n withPrefix(prefix: string): Logger {\n return new Logger({\n level: this.#level,\n prefix: this.#prefix ? `${this.#prefix} ${prefix}` : prefix,\n decorators: this.#decorators,\n });\n }\n\n error(...args: unknown[]): void {\n this.#write(LogLevel.ERROR, console.error, args);\n }\n\n warn(...args: unknown[]): void {\n this.#write(LogLevel.WARN, console.warn, args);\n }\n\n /**\n * Logs an informational message.\n *\n * @param args - The values to write to the console.\n * @deprecated Use {@link Logger.info} instead.\n */\n log(...args: unknown[]): void {\n this.info(...args);\n }\n\n info(...args: unknown[]): void {\n this.#write(LogLevel.INFO, console.info, args);\n }\n\n debug(...args: unknown[]): void {\n this.#write(LogLevel.DEBUG, console.debug, args);\n }\n\n trace(...args: unknown[]): void {\n this.#write(LogLevel.TRACE, console.trace, args);\n }\n\n #isLevelDisabled(level: LoggerMethod): boolean {\n return logLevelPriority[level] > logLevelPriority[this.#level];\n }\n\n #write(\n level: LoggerMethod,\n writeToConsole: (...args: unknown[]) => void,\n args: unknown[],\n ): void {\n if (this.#isLevelDisabled(level)) {\n return;\n }\n\n const next: LogMethod = this.#prefix\n ? (...nextArgs: unknown[]): void =>\n writeToConsole(this.#prefix, ...nextArgs)\n : writeToConsole;\n\n const decorator = this.#decorators?.[level];\n\n if (decorator) {\n decorator(next, ...args);\n return;\n }\n\n next(...args);\n }\n}\n"]}
1
+ {"version":3,"file":"Logger.mjs","sourceRoot":"","sources":["../../src/logger/Logger.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,8BAA8B;AAEtD;;GAEG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAG;IACtB,MAAM,EAAE,QAAQ;IAChB,KAAK,EAAE,OAAO;IACd,IAAI,EAAE,MAAM;IACZ,IAAI,EAAE,MAAM;IACZ,KAAK,EAAE,OAAO;IACd,KAAK,EAAE,OAAO;CACN,CAAC;AAIX;;;;;;GAMG;AACH,MAAM,gBAAgB,GAAG;IACvB,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;IACpB,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;IACnB,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;IAClB,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;IAClB,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;IACnB,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;CACpB,CAAC;AAEF,MAAM,cAAc,GAAG,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;AAiDtD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqCG;AACH,MAAM,OAAO,MAAM;IAOjB,YAAY,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,EAAiB;;QAN/C,gCAAiB;QAEjB,iCAAiB;QAEjB,qCAA+B;QAGtC,MAAM,CAAC,KAAK,EAAE,cAAc,CAAC,CAAC;QAE9B,uBAAA,IAAI,iBAAU,KAAK,MAAA,CAAC;QACpB,uBAAA,IAAI,kBAAW,MAAM,MAAA,CAAC;QACtB,uBAAA,IAAI,sBAAe,UAAU,MAAA,CAAC;IAChC,CAAC;IAED;;;;;;;;;OASG;IACH,UAAU,CAAC,MAAc;QACvB,OAAO,IAAI,MAAM,CAAC;YAChB,KAAK,EAAE,uBAAA,IAAI,qBAAO;YAClB,MAAM,EAAE,uBAAA,IAAI,sBAAQ,CAAC,CAAC,CAAC,GAAG,uBAAA,IAAI,sBAAQ,IAAI,MAAM,EAAE,CAAC,CAAC,CAAC,MAAM;YAC3D,UAAU,EAAE,uBAAA,IAAI,0BAAY;SAC7B,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,GAAG,IAAe;QACtB,uBAAA,IAAI,wCAAO,MAAX,IAAI,EAAQ,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IACnD,CAAC;IAED,IAAI,CAAC,GAAG,IAAe;QACrB,uBAAA,IAAI,wCAAO,MAAX,IAAI,EAAQ,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IACjD,CAAC;IAED;;;;;OAKG;IACH,GAAG,CAAC,GAAG,IAAe;QACpB,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC;IACrB,CAAC;IAED,IAAI,CAAC,GAAG,IAAe;QACrB,uBAAA,IAAI,wCAAO,MAAX,IAAI,EAAQ,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IACjD,CAAC;IAED,KAAK,CAAC,GAAG,IAAe;QACtB,uBAAA,IAAI,wCAAO,MAAX,IAAI,EAAQ,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IACnD,CAAC;IAED,KAAK,CAAC,GAAG,IAAe;QACtB,uBAAA,IAAI,wCAAO,MAAX,IAAI,EAAQ,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IACnD,CAAC;CA6BF;iMA3BkB,KAAmB;IAClC,OAAO,gBAAgB,CAAC,KAAK,CAAC,GAAG,gBAAgB,CAAC,uBAAA,IAAI,qBAAO,CAAC,CAAC;AACjE,CAAC,yCAGC,KAAmB,EACnB,cAA4C,EAC5C,IAAe;IAEf,IAAI,uBAAA,IAAI,kDAAiB,MAArB,IAAI,EAAkB,KAAK,CAAC,EAAE,CAAC;QACjC,OAAO;IACT,CAAC;IAED,MAAM,IAAI,GAAc,uBAAA,IAAI,sBAAQ;QAClC,CAAC,CAAC,CAAC,GAAG,QAAmB,EAAQ,EAAE,CAC/B,cAAc,CAAC,uBAAA,IAAI,sBAAQ,EAAE,GAAG,QAAQ,CAAC;QAC7C,CAAC,CAAC,cAAc,CAAC;IAEnB,MAAM,SAAS,GAAG,uBAAA,IAAI,0BAAY,EAAE,CAAC,KAAK,CAAC,CAAC;IAE5C,IAAI,SAAS,EAAE,CAAC;QACd,SAAS,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,CAAC;QACzB,OAAO;IACT,CAAC;IAED,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC;AAChB,CAAC","sourcesContent":["import { assert, enums } from '@metamask/superstruct';\n\n/**\n * The severity levels supported by {@link Logger}.\n */\nexport const LogLevel = {\n SILENT: 'silent',\n ERROR: 'error',\n WARN: 'warn',\n INFO: 'info',\n DEBUG: 'debug',\n TRACE: 'trace',\n} as const;\n\nexport type LogLevel = (typeof LogLevel)[keyof typeof LogLevel];\n\n/**\n * Defines the severity ordering used to filter log messages.\n *\n * Lower values are less verbose. Changing these numeric priorities changes\n * which messages are emitted for each configured {@link LogLevel}, including\n * in production.\n */\nconst logLevelPriority = {\n [LogLevel.SILENT]: 0,\n [LogLevel.ERROR]: 1,\n [LogLevel.WARN]: 2,\n [LogLevel.INFO]: 3,\n [LogLevel.DEBUG]: 4,\n [LogLevel.TRACE]: 5,\n};\n\nconst LogLevelStruct = enums(Object.values(LogLevel));\n\nexport type LoggerMethod = Exclude<LogLevel, typeof LogLevel.SILENT>;\n\nexport type LogMethod = (...args: unknown[]) => void;\n\n/**\n * A function that can add behavior around a logger method.\n *\n * Call `next` to forward a message through the logger's configured output.\n */\nexport type LogMethodDecorator = (next: LogMethod, ...args: unknown[]) => void;\n\nexport type LoggerDecorators = Partial<\n Record<LoggerMethod, LogMethodDecorator>\n>;\n\n/**\n * Configuration for a {@link Logger}.\n *\n * **Example: configure logging with `LOG_LEVEL`.**\n *\n * ```ts\n * const logger = new Logger({\n * level: process.env.LOG_LEVEL\n * });\n * ```\n */\nexport type LoggerOptions = {\n /**\n * The most verbose severity level that should be logged. Use\n * {@link LogLevel.SILENT} to disable logging.\n */\n level: LogLevel;\n /**\n * An optional prefix prepended to every message.\n *\n * Use {@link Logger.withPrefix} to add prefixes after construction.\n */\n prefix?: string;\n /**\n * Optional behavior to apply to individual log methods.\n *\n * Decorators receive `next`, which preserves this logger's configured level,\n * prefix, and console output.\n */\n decorators?: LoggerDecorators;\n};\n\n/**\n * Logs network Snap messages to the console at configurable severity levels.\n *\n * Disable output with {@link LogLevel.SILENT}.\n *\n * **Example: create an enabled logger.**\n *\n * ```ts\n * import { Logger } from '@metamask/snap-networks-utils';\n *\n * const logger = new Logger({ level: LogLevel.TRACE });\n * logger.info('Account synced');\n * ```\n *\n * **Example: add a Snap or component prefix.**\n *\n * ```ts\n * const rootLogger = new Logger({ level: LogLevel.TRACE });\n * const snapLogger = rootLogger.withPrefix('[tron-wallet-snap]');\n * const accountsLogger = snapLogger.withPrefix('[accounts]');\n *\n * accountsLogger.debug('Refreshing account balances');\n * ```\n *\n * **Example: decorate a method with Snap-specific behavior.**\n *\n * ```ts\n * const logger = new Logger({\n * level: LogLevel.TRACE,\n * decorators: {\n * error: (next, error) => {\n * const details = getSolanaErrorDetails(error);\n * next(details ?? error);\n * },\n * },\n * });\n * ```\n */\nexport class Logger {\n readonly #level: LogLevel;\n\n readonly #prefix?: string;\n\n readonly #decorators?: LoggerDecorators;\n\n constructor({ level, prefix, decorators }: LoggerOptions) {\n assert(level, LogLevelStruct);\n\n this.#level = level;\n this.#prefix = prefix;\n this.#decorators = decorators;\n }\n\n /**\n * Returns a logger with an additional prefix.\n *\n * The returned logger has the same log level and decorators as this one. Call\n * this method as many times as needed; each derived logger appends its prefix\n * to the existing prefix.\n *\n * @param prefix - The prefix to add to each message.\n * @returns A derived logger.\n */\n withPrefix(prefix: string): Logger {\n return new Logger({\n level: this.#level,\n prefix: this.#prefix ? `${this.#prefix} ${prefix}` : prefix,\n decorators: this.#decorators,\n });\n }\n\n error(...args: unknown[]): void {\n this.#write(LogLevel.ERROR, console.error, args);\n }\n\n warn(...args: unknown[]): void {\n this.#write(LogLevel.WARN, console.warn, args);\n }\n\n /**\n * Logs an informational message.\n *\n * @param args - The values to write to the console.\n * @deprecated Use {@link Logger.info} instead.\n */\n log(...args: unknown[]): void {\n this.info(...args);\n }\n\n info(...args: unknown[]): void {\n this.#write(LogLevel.INFO, console.info, args);\n }\n\n debug(...args: unknown[]): void {\n this.#write(LogLevel.DEBUG, console.debug, args);\n }\n\n trace(...args: unknown[]): void {\n this.#write(LogLevel.TRACE, console.trace, args);\n }\n\n #isLevelDisabled(level: LoggerMethod): boolean {\n return logLevelPriority[level] > logLevelPriority[this.#level];\n }\n\n #write(\n level: LoggerMethod,\n writeToConsole: (...args: unknown[]) => void,\n args: unknown[],\n ): void {\n if (this.#isLevelDisabled(level)) {\n return;\n }\n\n const next: LogMethod = this.#prefix\n ? (...nextArgs: unknown[]): void =>\n writeToConsole(this.#prefix, ...nextArgs)\n : writeToConsole;\n\n const decorator = this.#decorators?.[level];\n\n if (decorator) {\n decorator(next, ...args);\n return;\n }\n\n next(...args);\n }\n}\n"]}
@@ -0,0 +1,26 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.safeMerge = void 0;
4
+ /**
5
+ * Shallowly merges two objects at the top level, keeping values from the overridee object when the overrider's
6
+ * corresponding top-level properties are undefined, null, or empty objects. Non-undefined values from the overrider
7
+ * take precedence. Empty objects in the overrider are filtered out to preserve the overridee's values. Nested objects
8
+ * are not merged recursively: if a nested property exists in the overrider, it replaces the overridee's value entirely.
9
+ *
10
+ * @param overridee - The object to override.
11
+ * @param overrider - The object to override with.
12
+ * @returns The merged object (using shallow, top-level merge semantics).
13
+ * @example
14
+ * const overridee = { name: 'John' };
15
+ * const overrider = { name: undefined, age: 30 };
16
+ * const merged = safeMerge(overridee, overrider);
17
+ * // merged is { name: 'John', age: 30 }
18
+ */
19
+ const safeMerge = (overridee, overrider) => ({
20
+ ...overridee,
21
+ ...Object.fromEntries(Object.entries(overrider).filter(([_key, value]) => value !== undefined &&
22
+ value !== null &&
23
+ (!value || typeof value !== 'object' || Object.keys(value).length > 0))),
24
+ });
25
+ exports.safeMerge = safeMerge;
26
+ //# sourceMappingURL=safeMerge.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"safeMerge.cjs","sourceRoot":"","sources":["../../src/safeMerge/safeMerge.ts"],"names":[],"mappings":";;;AAAA;;;;;;;;;;;;;;GAcG;AACI,MAAM,SAAS,GAAG,CACvB,SAAqB,EACrB,SAAqB,EACI,EAAE,CAAC,CAAC;IAC7B,GAAG,SAAS;IACZ,GAAI,MAAM,CAAC,WAAW,CACpB,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,MAAM,CAC9B,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,EAAE,CAChB,KAAK,KAAK,SAAS;QACnB,KAAK,KAAK,IAAI;QACd,CAAC,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CACzE,CACa;CACjB,CAAC,CAAC;AAbU,QAAA,SAAS,aAanB","sourcesContent":["/**\n * Shallowly merges two objects at the top level, keeping values from the overridee object when the overrider's\n * corresponding top-level properties are undefined, null, or empty objects. Non-undefined values from the overrider\n * take precedence. Empty objects in the overrider are filtered out to preserve the overridee's values. Nested objects\n * are not merged recursively: if a nested property exists in the overrider, it replaces the overridee's value entirely.\n *\n * @param overridee - The object to override.\n * @param overrider - The object to override with.\n * @returns The merged object (using shallow, top-level merge semantics).\n * @example\n * const overridee = { name: 'John' };\n * const overrider = { name: undefined, age: 30 };\n * const merged = safeMerge(overridee, overrider);\n * // merged is { name: 'John', age: 30 }\n */\nexport const safeMerge = <TOverridee extends object, TOverrider extends object>(\n overridee: TOverridee,\n overrider: TOverrider,\n): TOverridee & TOverrider => ({\n ...overridee,\n ...(Object.fromEntries(\n Object.entries(overrider).filter(\n ([_key, value]) =>\n value !== undefined &&\n value !== null &&\n (!value || typeof value !== 'object' || Object.keys(value).length > 0),\n ),\n ) as TOverrider),\n});\n"]}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Shallowly merges two objects at the top level, keeping values from the overridee object when the overrider's
3
+ * corresponding top-level properties are undefined, null, or empty objects. Non-undefined values from the overrider
4
+ * take precedence. Empty objects in the overrider are filtered out to preserve the overridee's values. Nested objects
5
+ * are not merged recursively: if a nested property exists in the overrider, it replaces the overridee's value entirely.
6
+ *
7
+ * @param overridee - The object to override.
8
+ * @param overrider - The object to override with.
9
+ * @returns The merged object (using shallow, top-level merge semantics).
10
+ * @example
11
+ * const overridee = { name: 'John' };
12
+ * const overrider = { name: undefined, age: 30 };
13
+ * const merged = safeMerge(overridee, overrider);
14
+ * // merged is { name: 'John', age: 30 }
15
+ */
16
+ export declare const safeMerge: <TOverridee extends object, TOverrider extends object>(overridee: TOverridee, overrider: TOverrider) => TOverridee & TOverrider;
17
+ //# sourceMappingURL=safeMerge.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"safeMerge.d.cts","sourceRoot":"","sources":["../../src/safeMerge/safeMerge.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,SAAS,GAAI,UAAU,SAAS,MAAM,EAAE,UAAU,SAAS,MAAM,EAC5E,WAAW,UAAU,EACrB,WAAW,UAAU,KACpB,UAAU,GAAG,UAUd,CAAC"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Shallowly merges two objects at the top level, keeping values from the overridee object when the overrider's
3
+ * corresponding top-level properties are undefined, null, or empty objects. Non-undefined values from the overrider
4
+ * take precedence. Empty objects in the overrider are filtered out to preserve the overridee's values. Nested objects
5
+ * are not merged recursively: if a nested property exists in the overrider, it replaces the overridee's value entirely.
6
+ *
7
+ * @param overridee - The object to override.
8
+ * @param overrider - The object to override with.
9
+ * @returns The merged object (using shallow, top-level merge semantics).
10
+ * @example
11
+ * const overridee = { name: 'John' };
12
+ * const overrider = { name: undefined, age: 30 };
13
+ * const merged = safeMerge(overridee, overrider);
14
+ * // merged is { name: 'John', age: 30 }
15
+ */
16
+ export declare const safeMerge: <TOverridee extends object, TOverrider extends object>(overridee: TOverridee, overrider: TOverrider) => TOverridee & TOverrider;
17
+ //# sourceMappingURL=safeMerge.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"safeMerge.d.mts","sourceRoot":"","sources":["../../src/safeMerge/safeMerge.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,SAAS,GAAI,UAAU,SAAS,MAAM,EAAE,UAAU,SAAS,MAAM,EAC5E,WAAW,UAAU,EACrB,WAAW,UAAU,KACpB,UAAU,GAAG,UAUd,CAAC"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Shallowly merges two objects at the top level, keeping values from the overridee object when the overrider's
3
+ * corresponding top-level properties are undefined, null, or empty objects. Non-undefined values from the overrider
4
+ * take precedence. Empty objects in the overrider are filtered out to preserve the overridee's values. Nested objects
5
+ * are not merged recursively: if a nested property exists in the overrider, it replaces the overridee's value entirely.
6
+ *
7
+ * @param overridee - The object to override.
8
+ * @param overrider - The object to override with.
9
+ * @returns The merged object (using shallow, top-level merge semantics).
10
+ * @example
11
+ * const overridee = { name: 'John' };
12
+ * const overrider = { name: undefined, age: 30 };
13
+ * const merged = safeMerge(overridee, overrider);
14
+ * // merged is { name: 'John', age: 30 }
15
+ */
16
+ export const safeMerge = (overridee, overrider) => ({
17
+ ...overridee,
18
+ ...Object.fromEntries(Object.entries(overrider).filter(([_key, value]) => value !== undefined &&
19
+ value !== null &&
20
+ (!value || typeof value !== 'object' || Object.keys(value).length > 0))),
21
+ });
22
+ //# sourceMappingURL=safeMerge.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"safeMerge.mjs","sourceRoot":"","sources":["../../src/safeMerge/safeMerge.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,MAAM,CAAC,MAAM,SAAS,GAAG,CACvB,SAAqB,EACrB,SAAqB,EACI,EAAE,CAAC,CAAC;IAC7B,GAAG,SAAS;IACZ,GAAI,MAAM,CAAC,WAAW,CACpB,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,MAAM,CAC9B,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,EAAE,CAChB,KAAK,KAAK,SAAS;QACnB,KAAK,KAAK,IAAI;QACd,CAAC,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CACzE,CACa;CACjB,CAAC,CAAC","sourcesContent":["/**\n * Shallowly merges two objects at the top level, keeping values from the overridee object when the overrider's\n * corresponding top-level properties are undefined, null, or empty objects. Non-undefined values from the overrider\n * take precedence. Empty objects in the overrider are filtered out to preserve the overridee's values. Nested objects\n * are not merged recursively: if a nested property exists in the overrider, it replaces the overridee's value entirely.\n *\n * @param overridee - The object to override.\n * @param overrider - The object to override with.\n * @returns The merged object (using shallow, top-level merge semantics).\n * @example\n * const overridee = { name: 'John' };\n * const overrider = { name: undefined, age: 30 };\n * const merged = safeMerge(overridee, overrider);\n * // merged is { name: 'John', age: 30 }\n */\nexport const safeMerge = <TOverridee extends object, TOverrider extends object>(\n overridee: TOverridee,\n overrider: TOverrider,\n): TOverridee & TOverrider => ({\n ...overridee,\n ...(Object.fromEntries(\n Object.entries(overrider).filter(\n ([_key, value]) =>\n value !== undefined &&\n value !== null &&\n (!value || typeof value !== 'object' || Object.keys(value).length > 0),\n ),\n ) as TOverrider),\n});\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@metamask-previews/snap-networks-utils",
3
- "version": "1.0.0-preview-47643fc",
3
+ "version": "1.0.0-preview-73bc702",
4
4
  "description": "Shared utilities for MetaMask network snaps",
5
5
  "keywords": [
6
6
  "Ethereum",
@@ -65,7 +65,7 @@
65
65
  "@metamask/remote-feature-flag-controller": "^5.0.0",
66
66
  "@metamask/snaps-sdk": "^11.2.0",
67
67
  "@metamask/superstruct": "^3.4.1",
68
- "@metamask/utils": "^11.9.0"
68
+ "@metamask/utils": "^11.11.0"
69
69
  },
70
70
  "devDependencies": {
71
71
  "@metamask/auto-changelog": "^6.1.1",