@ohbug/utils 2.0.9 → 2.0.10

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/dist/index.d.mts CHANGED
@@ -31,5 +31,20 @@ declare function parseUrl(url: string): {
31
31
  //#region src/dom.d.ts
32
32
  declare const getSelector: (event: Event) => any;
33
33
  //#endregion
34
- export { error, getGlobal, getOhbugObject, getSelector, isBrowser, isFunction, isNode, isNumber, isObject, isPromise, isString, logger, parseUrl, replace };
34
+ //#region src/safeCall.d.ts
35
+ /**
36
+ * Prevents recursive exceptions in error-handling paths where system
37
+ * APIs (e.g. `os.hostname()`) might throw inside an uncaughtException handler.
38
+ */
39
+ declare function safeCall<T>(fn: () => T, fallback: T): T;
40
+ //#endregion
41
+ //#region src/getCircularReplacer.d.ts
42
+ /**
43
+ * Creates a JSON replacer that strips circular references.
44
+ * Must be called fresh for each `JSON.stringify` — the internal WeakSet
45
+ * tracks objects from that single serialization pass.
46
+ */
47
+ declare const getCircularReplacer: () => (_: any, value: any) => any;
48
+ //#endregion
49
+ export { error, getCircularReplacer, getGlobal, getOhbugObject, getSelector, isBrowser, isFunction, isNode, isNumber, isObject, isPromise, isString, logger, parseUrl, replace, safeCall };
35
50
  //# sourceMappingURL=index.d.mts.map
package/dist/index.mjs CHANGED
@@ -105,6 +105,36 @@ const getSelector = (event) => {
105
105
  return path.reverse().map((node) => (node.localName || "") + (node.id ? `#${node.id}` : "") + (node.className ? `.${node.className}` : "") + (node.outerHTML === outerHTML ? `:nth-child(${elements.length})` : "")).filter((v) => Boolean(v)).join(" > ");
106
106
  };
107
107
  //#endregion
108
- export { error, getGlobal, getOhbugObject, getSelector, isBrowser, isFunction, isNode, isNumber, isObject, isPromise, isString, logger, parseUrl, replace };
108
+ //#region src/safeCall.ts
109
+ /**
110
+ * Prevents recursive exceptions in error-handling paths where system
111
+ * APIs (e.g. `os.hostname()`) might throw inside an uncaughtException handler.
112
+ */
113
+ function safeCall(fn, fallback) {
114
+ try {
115
+ return fn();
116
+ } catch {
117
+ return fallback;
118
+ }
119
+ }
120
+ //#endregion
121
+ //#region src/getCircularReplacer.ts
122
+ /**
123
+ * Creates a JSON replacer that strips circular references.
124
+ * Must be called fresh for each `JSON.stringify` — the internal WeakSet
125
+ * tracks objects from that single serialization pass.
126
+ */
127
+ const getCircularReplacer = () => {
128
+ const seen = /* @__PURE__ */ new WeakSet();
129
+ return (_, value) => {
130
+ if (typeof value === "object" && value !== null) {
131
+ if (seen.has(value)) return;
132
+ seen.add(value);
133
+ }
134
+ return value;
135
+ };
136
+ };
137
+ //#endregion
138
+ export { error, getCircularReplacer, getGlobal, getOhbugObject, getSelector, isBrowser, isFunction, isNode, isNumber, isObject, isPromise, isString, logger, parseUrl, replace, safeCall };
109
139
 
110
140
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":[],"sources":["../src/warning.ts","../src/logger.ts","../src/validators.ts","../src/get.ts","../src/mixin.ts","../src/dom.ts"],"sourcesContent":["export function error(condition: boolean, format: string, ...args: any[]) {\n if (format === undefined) {\n throw new Error(\n \"`Ohbug warning(condition, format, ...args)` requires a warning message argument\",\n );\n }\n\n if (!condition) {\n let argIndex = 0;\n const message = format.replace(/%s/g, () => args[argIndex++]);\n throw new Error(`Ohbug ${message}`);\n }\n}\n","/* eslint-disable no-console */\nimport type { OhbugLoggerConfig } from \"@ohbug/types\";\n\nexport const logger: OhbugLoggerConfig = {\n log(...args: any[]) {\n console.log(...args);\n },\n\n info(...args: any[]) {\n console.info(...args);\n },\n\n warn(...args: any[]) {\n console.warn(...args);\n },\n\n error(...args: any[]) {\n console.error(...args);\n },\n};\n","export function isString(value: any): value is string {\n return typeof value === \"string\";\n}\n\nexport function isNumber(value: any): value is number {\n return typeof value === \"number\" && parseInt(`${value}`, 10) === value;\n}\n\nexport function isFunction(value: any): value is Function {\n return typeof value === \"function\";\n}\n\nexport function isObject(value: any): value is object {\n return Object.prototype.toString.call(value) === \"[object Object]\";\n}\n\nexport function isPromise(value: any): value is Promise<any> {\n return value instanceof Promise;\n}\n","import type { OhbugGlobal, OhbugObject } from \"@ohbug/types\";\n\nimport { error } from \"./warning\";\n\nconst fallbackGlobalObject = {};\nexport function getGlobal<T = Window>(): T & OhbugGlobal {\n return (\n typeof window !== \"undefined\"\n ? window\n : typeof globalThis !== \"undefined\"\n ? globalThis\n : typeof self !== \"undefined\"\n ? self\n : fallbackGlobalObject\n ) as T & OhbugGlobal;\n}\n\nexport function getOhbugObject<T = Window>(): OhbugObject {\n const global = getGlobal<T>();\n\n error(Boolean(global.__OHBUG__), \"Failed to get `OhbugObject`, please confirm if `Ohbug.setup`\");\n\n return global.__OHBUG__;\n}\n\nexport function isNode(): boolean {\n return typeof globalThis !== \"undefined\" && typeof window === \"undefined\";\n}\n\nexport function isBrowser(): boolean {\n return typeof window !== \"undefined\";\n}\n","export function replace(source: any, name: string, behavior: (...args: any[]) => any) {\n if (!(name in source)) {\n return;\n }\n\n const original = source[name];\n const wrapped = behavior(original);\n source[name] = wrapped;\n\n return original;\n}\n\nexport function parseUrl(url: string): {\n host?: string;\n path?: string;\n protocol?: string;\n relative?: string;\n} {\n if (typeof url !== \"string\") {\n return {};\n }\n\n const match = url.match(/^(([^:/?#]+):)?(\\/\\/([^/?#]*))?([^?#]*)(\\?([^#]*))?(#(.*))?$/);\n\n if (!match) {\n return {};\n }\n\n const query = match[6] || \"\";\n const fragment = match[8] || \"\";\n return {\n host: match[4],\n path: match[5],\n protocol: match[2],\n relative: match[5] + query + fragment,\n };\n}\n","function getParentNode(node: Node, path: Node[]) {\n if (node.parentNode) {\n path.push(node.parentNode);\n getParentNode(node.parentNode, path);\n }\n}\nfunction getPath(node: Node) {\n const path: Node[] = [];\n path.push(node);\n getParentNode(node, path);\n return path;\n}\nexport const getSelector = (event: Event) => {\n const immutableTarget = (event.target || event.srcElement) as any;\n let target = (event.target || event.srcElement) as any;\n // 获取出错元素在同级元素的 index\n // 储存错误元素前元素\n const elements = [];\n for (\n let i = 0;\n target && target.nodeType === Node.ELEMENT_NODE && target.nodeType !== Node.DOCUMENT_TYPE_NODE;\n target = target.previousSibling\n ) {\n if (i) elements.push(target);\n i += 1;\n }\n const path =\n typeof (event as any).path === \"undefined\"\n ? getPath(event.target as Node)\n : (event as any).path;\n const { outerHTML } = immutableTarget;\n return path\n .reverse()\n .map(\n (node: Element) =>\n (node.localName || \"\") +\n (node.id ? `#${node.id}` : \"\") +\n (node.className ? `.${node.className}` : \"\") +\n (node.outerHTML === outerHTML ? `:nth-child(${elements.length})` : \"\"),\n )\n .filter((v: string): boolean => Boolean(v))\n .join(\" > \");\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.mjs","names":[],"sources":["../src/warning.ts","../src/logger.ts","../src/validators.ts","../src/get.ts","../src/mixin.ts","../src/dom.ts","../src/safeCall.ts","../src/getCircularReplacer.ts"],"sourcesContent":["export function error(condition: boolean, format: string, ...args: any[]) {\n if (format === undefined) {\n throw new Error(\n \"`Ohbug warning(condition, format, ...args)` requires a warning message argument\",\n );\n }\n\n if (!condition) {\n let argIndex = 0;\n const message = format.replace(/%s/g, () => args[argIndex++]);\n throw new Error(`Ohbug ${message}`);\n }\n}\n","/* eslint-disable no-console */\nimport type { OhbugLoggerConfig } from \"@ohbug/types\";\n\nexport const logger: OhbugLoggerConfig = {\n log(...args: any[]) {\n console.log(...args);\n },\n\n info(...args: any[]) {\n console.info(...args);\n },\n\n warn(...args: any[]) {\n console.warn(...args);\n },\n\n error(...args: any[]) {\n console.error(...args);\n },\n};\n","export function isString(value: any): value is string {\n return typeof value === \"string\";\n}\n\nexport function isNumber(value: any): value is number {\n return typeof value === \"number\" && parseInt(`${value}`, 10) === value;\n}\n\nexport function isFunction(value: any): value is Function {\n return typeof value === \"function\";\n}\n\nexport function isObject(value: any): value is object {\n return Object.prototype.toString.call(value) === \"[object Object]\";\n}\n\nexport function isPromise(value: any): value is Promise<any> {\n return value instanceof Promise;\n}\n","import type { OhbugGlobal, OhbugObject } from \"@ohbug/types\";\n\nimport { error } from \"./warning\";\n\nconst fallbackGlobalObject = {};\nexport function getGlobal<T = Window>(): T & OhbugGlobal {\n return (\n typeof window !== \"undefined\"\n ? window\n : typeof globalThis !== \"undefined\"\n ? globalThis\n : typeof self !== \"undefined\"\n ? self\n : fallbackGlobalObject\n ) as T & OhbugGlobal;\n}\n\nexport function getOhbugObject<T = Window>(): OhbugObject {\n const global = getGlobal<T>();\n\n error(Boolean(global.__OHBUG__), \"Failed to get `OhbugObject`, please confirm if `Ohbug.setup`\");\n\n return global.__OHBUG__;\n}\n\nexport function isNode(): boolean {\n return typeof globalThis !== \"undefined\" && typeof window === \"undefined\";\n}\n\nexport function isBrowser(): boolean {\n return typeof window !== \"undefined\";\n}\n","export function replace(source: any, name: string, behavior: (...args: any[]) => any) {\n if (!(name in source)) {\n return;\n }\n\n const original = source[name];\n const wrapped = behavior(original);\n source[name] = wrapped;\n\n return original;\n}\n\nexport function parseUrl(url: string): {\n host?: string;\n path?: string;\n protocol?: string;\n relative?: string;\n} {\n if (typeof url !== \"string\") {\n return {};\n }\n\n const match = url.match(/^(([^:/?#]+):)?(\\/\\/([^/?#]*))?([^?#]*)(\\?([^#]*))?(#(.*))?$/);\n\n if (!match) {\n return {};\n }\n\n const query = match[6] || \"\";\n const fragment = match[8] || \"\";\n return {\n host: match[4],\n path: match[5],\n protocol: match[2],\n relative: match[5] + query + fragment,\n };\n}\n","function getParentNode(node: Node, path: Node[]) {\n if (node.parentNode) {\n path.push(node.parentNode);\n getParentNode(node.parentNode, path);\n }\n}\nfunction getPath(node: Node) {\n const path: Node[] = [];\n path.push(node);\n getParentNode(node, path);\n return path;\n}\nexport const getSelector = (event: Event) => {\n const immutableTarget = (event.target || event.srcElement) as any;\n let target = (event.target || event.srcElement) as any;\n // 获取出错元素在同级元素的 index\n // 储存错误元素前元素\n const elements = [];\n for (\n let i = 0;\n target && target.nodeType === Node.ELEMENT_NODE && target.nodeType !== Node.DOCUMENT_TYPE_NODE;\n target = target.previousSibling\n ) {\n if (i) elements.push(target);\n i += 1;\n }\n const path =\n typeof (event as any).path === \"undefined\"\n ? getPath(event.target as Node)\n : (event as any).path;\n const { outerHTML } = immutableTarget;\n return path\n .reverse()\n .map(\n (node: Element) =>\n (node.localName || \"\") +\n (node.id ? `#${node.id}` : \"\") +\n (node.className ? `.${node.className}` : \"\") +\n (node.outerHTML === outerHTML ? `:nth-child(${elements.length})` : \"\"),\n )\n .filter((v: string): boolean => Boolean(v))\n .join(\" > \");\n};\n","/**\n * Prevents recursive exceptions in error-handling paths where system\n * APIs (e.g. `os.hostname()`) might throw inside an uncaughtException handler.\n */\nexport function safeCall<T>(fn: () => T, fallback: T): T {\n try {\n return fn();\n } catch {\n return fallback;\n }\n}\n","/**\n * Creates a JSON replacer that strips circular references.\n * Must be called fresh for each `JSON.stringify` — the internal WeakSet\n * tracks objects from that single serialization pass.\n */\nexport const getCircularReplacer = () => {\n const seen = new WeakSet();\n return (_: any, value: any) => {\n if (typeof value === \"object\" && value !== null) {\n if (seen.has(value)) {\n return;\n }\n\n seen.add(value);\n }\n return value;\n };\n};\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ohbug/utils",
3
- "version": "2.0.9",
3
+ "version": "2.0.10",
4
4
  "description": "Utilities for all Ohbug SDKs",
5
5
  "homepage": "https://github.com/ohbug-org/ohbug#readme",
6
6
  "bugs": {