@osdk/react-devtools 0.11.0 ā 0.11.1-main-566ecd3ac93ee1753de8e32a4083d39c439c8b07
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 +11 -0
- package/build/esm/inspector/utils/elementBounds.js +2 -2
- package/build/esm/inspector/utils/elementBounds.js.map +1 -1
- package/build/esm/store/ConsoleLogStore.js +4 -4
- package/build/esm/store/ConsoleLogStore.js.map +1 -1
- package/build/esm/utils/ComponentContextCapture.js +10 -10
- package/build/esm/utils/ComponentContextCapture.js.map +1 -1
- package/build/esm/utils/ComponentQueryRegistry.js +3 -3
- package/build/esm/utils/ComponentQueryRegistry.js.map +1 -1
- package/build/esm/utils/ComputeMonitor.js +1 -1
- package/build/esm/utils/ComputeMonitor.js.map +1 -1
- package/build/esm/utils/MockDataGenerator.js +1 -1
- package/build/esm/utils/MockDataGenerator.js.map +1 -1
- package/build/esm/utils/PerformanceRecommendationEngine.js +1 -1
- package/build/esm/utils/PerformanceRecommendationEngine.js.map +1 -1
- package/build/esm/utils/UnusedFieldAnalyzer.js +1 -1
- package/build/esm/utils/UnusedFieldAnalyzer.js.map +1 -1
- package/build/types/utils/ComponentContextCapture.d.ts.map +1 -1
- package/package.json +4 -4
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,16 @@
|
|
|
1
1
|
# @osdk/react-devtools
|
|
2
2
|
|
|
3
|
+
## 0.11.1-main-566ecd3ac93ee1753de8e32a4083d39c439c8b07
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- 566ecd3: Add the `u` (unicode) flag to regular expressions to satisfy the require-unicode-regexp lint rule
|
|
8
|
+
- Updated dependencies [3c48f5a]
|
|
9
|
+
- Updated dependencies [566ecd3]
|
|
10
|
+
- @osdk/client@2.42.1-main-566ecd3ac93ee1753de8e32a4083d39c439c8b07
|
|
11
|
+
- @osdk/react@2.42.1-main-566ecd3ac93ee1753de8e32a4083d39c439c8b07
|
|
12
|
+
- @osdk/api@2.42.1-main-566ecd3ac93ee1753de8e32a4083d39c439c8b07
|
|
13
|
+
|
|
3
14
|
## 0.11.0
|
|
4
15
|
|
|
5
16
|
### Minor Changes
|
|
@@ -20,7 +20,7 @@ function stripTranslateFromTransform(element) {
|
|
|
20
20
|
if (!transform || transform === "none") {
|
|
21
21
|
return "";
|
|
22
22
|
}
|
|
23
|
-
const matrixMatch = transform.match(/matrix\(([^,]+),\s*([^,]+),\s*([^,]+),\s*([^,]+),\s*[^,]+,\s*[^)]+\)/);
|
|
23
|
+
const matrixMatch = transform.match(/matrix\(([^,]+),\s*([^,]+),\s*([^,]+),\s*([^,]+),\s*[^,]+,\s*[^)]+\)/u);
|
|
24
24
|
if (matrixMatch) {
|
|
25
25
|
const [, a, b, c, d] = matrixMatch;
|
|
26
26
|
if (a === "1" && b === "0" && c === "0" && d === "1") {
|
|
@@ -28,7 +28,7 @@ function stripTranslateFromTransform(element) {
|
|
|
28
28
|
}
|
|
29
29
|
return `matrix(${a}, ${b}, ${c}, ${d}, 0, 0)`;
|
|
30
30
|
}
|
|
31
|
-
const matrix3dMatch = transform.match(/matrix3d\(([^)]+)\)/);
|
|
31
|
+
const matrix3dMatch = transform.match(/matrix3d\(([^)]+)\)/u);
|
|
32
32
|
if (matrix3dMatch) {
|
|
33
33
|
const values = matrix3dMatch[1].split(",").map(v => v.trim());
|
|
34
34
|
if (values.length === 16) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"elementBounds.js","names":["stripTranslateFromTransform","element","computedStyle","window","getComputedStyle","transform","matrixMatch","match","a","b","c","d","matrix3dMatch","values","split","map","v","trim","length","join","createElementBounds","boundingRect","getBoundingClientRect","x","left","y","top","width","height","borderRadius","getElementAtPosition","clientX","clientY","ignoreSelector","elementsAtPoint","document","elementsFromPoint","matches","hasAttribute","tagName","toLowerCase"],"sources":["elementBounds.ts"],"sourcesContent":["/*\n * Copyright 2025 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type { OverlayBounds } from \"../types.js\";\n\nfunction stripTranslateFromTransform(element: Element): string {\n const computedStyle = window.getComputedStyle(element);\n const transform = computedStyle.transform;\n\n if (!transform || transform === \"none\") {\n return \"\";\n }\n\n const matrixMatch = transform.match(\n /matrix\\(([^,]+),\\s*([^,]+),\\s*([^,]+),\\s*([^,]+),\\s*[^,]+,\\s*[^)]+\\)
|
|
1
|
+
{"version":3,"file":"elementBounds.js","names":["stripTranslateFromTransform","element","computedStyle","window","getComputedStyle","transform","matrixMatch","match","a","b","c","d","matrix3dMatch","values","split","map","v","trim","length","join","createElementBounds","boundingRect","getBoundingClientRect","x","left","y","top","width","height","borderRadius","getElementAtPosition","clientX","clientY","ignoreSelector","elementsAtPoint","document","elementsFromPoint","matches","hasAttribute","tagName","toLowerCase"],"sources":["elementBounds.ts"],"sourcesContent":["/*\n * Copyright 2025 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type { OverlayBounds } from \"../types.js\";\n\nfunction stripTranslateFromTransform(element: Element): string {\n const computedStyle = window.getComputedStyle(element);\n const transform = computedStyle.transform;\n\n if (!transform || transform === \"none\") {\n return \"\";\n }\n\n const matrixMatch = transform.match(\n /matrix\\(([^,]+),\\s*([^,]+),\\s*([^,]+),\\s*([^,]+),\\s*[^,]+,\\s*[^)]+\\)/u\n );\n\n if (matrixMatch) {\n const [, a, b, c, d] = matrixMatch;\n if (a === \"1\" && b === \"0\" && c === \"0\" && d === \"1\") {\n return \"\";\n }\n return `matrix(${a}, ${b}, ${c}, ${d}, 0, 0)`;\n }\n\n const matrix3dMatch = transform.match(/matrix3d\\(([^)]+)\\)/u);\n if (matrix3dMatch) {\n const values = matrix3dMatch[1].split(\",\").map((v) => v.trim());\n if (values.length === 16) {\n values[12] = \"0\";\n values[13] = \"0\";\n values[14] = \"0\";\n return `matrix3d(${values.join(\", \")})`;\n }\n }\n\n return \"\";\n}\n\nexport function createElementBounds(element: Element): OverlayBounds {\n const boundingRect = element.getBoundingClientRect();\n const computedStyle = window.getComputedStyle(element);\n\n return {\n x: boundingRect.left,\n y: boundingRect.top,\n width: boundingRect.width,\n height: boundingRect.height,\n borderRadius: computedStyle.borderRadius || \"0px\",\n transform: stripTranslateFromTransform(element),\n };\n}\n\nexport function getElementAtPosition(\n clientX: number,\n clientY: number,\n ignoreSelector?: string\n): Element | null {\n const elementsAtPoint = document.elementsFromPoint(clientX, clientY);\n\n for (const element of elementsAtPoint) {\n if (ignoreSelector && element.matches(ignoreSelector)) {\n continue;\n }\n\n if (element.hasAttribute(\"data-osdk-devtools-ignore\")) {\n continue;\n }\n\n const tagName = element.tagName.toLowerCase();\n if (\n tagName === \"script\" ||\n tagName === \"style\" ||\n tagName === \"link\" ||\n tagName === \"meta\" ||\n tagName === \"head\" ||\n tagName === \"html\"\n ) {\n continue;\n }\n\n return element;\n }\n\n return null;\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -25,7 +25,7 @@ const MAX_DEPTH = 3;
|
|
|
25
25
|
const MAX_STRING_SIZE = 10240; // 10KB
|
|
26
26
|
const MAX_TOTAL_SIZE = 10240; // 10KB
|
|
27
27
|
|
|
28
|
-
const INTERNAL_FRAME_PATTERN = /ConsoleLogStore|serializeArg|serializeValue|getCallerLocation|capEntrySize|osdkConsoleWrapper
|
|
28
|
+
const INTERNAL_FRAME_PATTERN = /ConsoleLogStore|serializeArg|serializeValue|getCallerLocation|capEntrySize|osdkConsoleWrapper/u;
|
|
29
29
|
|
|
30
30
|
// BrowserLogger formats calls with %c CSS styling and a "border: 1px solid"
|
|
31
31
|
// pattern from its createStyle(). We filter these from the devtools console
|
|
@@ -34,9 +34,9 @@ const BROWSER_LOGGER_CSS = "border: 1px solid";
|
|
|
34
34
|
function isBrowserLoggerCall(args) {
|
|
35
35
|
return typeof args[0] === "string" && args[0].startsWith("%c") && typeof args[1] === "string" && args[1].includes(BROWSER_LOGGER_CSS);
|
|
36
36
|
}
|
|
37
|
-
const CHROME_FRAME_REGEX_PAREN = /at\s+.*?\((.*?):(\d+):\d+\)
|
|
38
|
-
const CHROME_FRAME_REGEX_BARE = /at\s+(.*?):(\d+):\d
|
|
39
|
-
const FIREFOX_FRAME_REGEX = /@(.*?):(\d+):\d
|
|
37
|
+
const CHROME_FRAME_REGEX_PAREN = /at\s+.*?\((.*?):(\d+):\d+\)/u;
|
|
38
|
+
const CHROME_FRAME_REGEX_BARE = /at\s+(.*?):(\d+):\d+/u;
|
|
39
|
+
const FIREFOX_FRAME_REGEX = /@(.*?):(\d+):\d+/u;
|
|
40
40
|
function serializeValue(value, depth, seen) {
|
|
41
41
|
if (value == null) {
|
|
42
42
|
return String(value);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ConsoleLogStore.js","names":["CircularBuffer","SubscribableStore","CONSOLE_LEVELS","entryCounter","nextId","Date","now","MAX_DEPTH","MAX_STRING_SIZE","MAX_TOTAL_SIZE","INTERNAL_FRAME_PATTERN","BROWSER_LOGGER_CSS","isBrowserLoggerCall","args","startsWith","includes","CHROME_FRAME_REGEX_PAREN","CHROME_FRAME_REGEX_BARE","FIREFOX_FRAME_REGEX","serializeValue","value","depth","seen","String","type","description","name","obj","Node","tagName","Error","stack","message","has","Array","isArray","length","add","items","i","push","join","entries","key","Object","keys","val","delete","serializeArg","arg","WeakSet","result","slice","getCallerLocation","err","undefined","lines","split","line","test","match","exec","filePath","lineNum","fileName","pop","capEntrySize","totalSize","longestIndex","longestLength","replacement","ConsoleLogStore","cachedEntries","originals","Map","wrappers","installed","suppressed","capturing","notifyScheduled","constructor","capacity","install","level","original","console","set","store","wrapper","skipCapture","source","Function","prototype","apply","call","queueMicrotask","serializedArgs","map","entry","id","timestamp","scheduleNotify","uninstall","get","ourWrapper","clear","suppress","unsuppress","getEntries","toArray","getSize","notifySubscribers","dispose","clearSubscribers"],"sources":["ConsoleLogStore.ts"],"sourcesContent":["/*\n * Copyright 2025 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { CircularBuffer } from \"../utils/CircularBuffer.js\";\nimport { SubscribableStore } from \"./SubscribableStore.js\";\n\nexport type ConsoleLogLevel = \"log\" | \"warn\" | \"error\" | \"info\" | \"debug\";\n\nconst CONSOLE_LEVELS: readonly ConsoleLogLevel[] = [\n \"log\",\n \"warn\",\n \"error\",\n \"info\",\n \"debug\",\n] as const;\n\nexport interface ConsoleLogEntry {\n readonly id: string;\n readonly level: ConsoleLogLevel;\n readonly args: readonly string[];\n readonly timestamp: number;\n readonly source?: string;\n}\n\nlet entryCounter = 0;\n\nfunction nextId(): string {\n return `console-${++entryCounter}-${Date.now()}`;\n}\n\nconst MAX_DEPTH = 3;\nconst MAX_STRING_SIZE = 10240; // 10KB\nconst MAX_TOTAL_SIZE = 10240; // 10KB\n\nconst INTERNAL_FRAME_PATTERN =\n /ConsoleLogStore|serializeArg|serializeValue|getCallerLocation|capEntrySize|osdkConsoleWrapper/;\n\n// BrowserLogger formats calls with %c CSS styling and a \"border: 1px solid\"\n// pattern from its createStyle(). We filter these from the devtools console\n// because devtools monitors the same operations through its own instrumentation.\nconst BROWSER_LOGGER_CSS = \"border: 1px solid\";\nfunction isBrowserLoggerCall(args: unknown[]): boolean {\n return (\n typeof args[0] === \"string\" &&\n args[0].startsWith(\"%c\") &&\n typeof args[1] === \"string\" &&\n args[1].includes(BROWSER_LOGGER_CSS)\n );\n}\n\nconst CHROME_FRAME_REGEX_PAREN = /at\\s+.*?\\((.*?):(\\d+):\\d+\\)/;\nconst CHROME_FRAME_REGEX_BARE = /at\\s+(.*?):(\\d+):\\d+/;\nconst FIREFOX_FRAME_REGEX = /@(.*?):(\\d+):\\d+/;\n\nfunction serializeValue(\n value: unknown,\n depth: number,\n seen: WeakSet<object>\n): string {\n if (value == null) {\n return String(value);\n }\n\n const type = typeof value;\n\n if (type === \"string\") {\n if (depth === 0) {\n return value as string;\n }\n return `\"${value as string}\"`;\n }\n if (type === \"number\" || type === \"boolean\") {\n return String(value);\n }\n if (type === \"bigint\") {\n return `BigInt(${String(value)})`;\n }\n if (type === \"symbol\") {\n return `Symbol(${(value as symbol).description ?? \"\"})`;\n }\n if (type === \"function\") {\n return `[Function: ${\n (value as (...args: readonly unknown[]) => unknown).name || \"anonymous\"\n }]`;\n }\n\n const obj = value as object;\n\n if (typeof Node !== \"undefined\" && obj instanceof Node) {\n const el = obj as { tagName?: string };\n return `[HTMLElement: ${el.tagName ?? \"unknown\"}]`;\n }\n\n if (obj instanceof Error) {\n return obj.stack ?? obj.message;\n }\n\n if (seen.has(obj)) {\n return \"[Circular]\";\n }\n\n if (depth >= MAX_DEPTH) {\n if (Array.isArray(obj)) {\n return `[Array(${obj.length})]`;\n }\n return \"[Object]\";\n }\n\n seen.add(obj);\n try {\n if (Array.isArray(obj)) {\n const items: string[] = [];\n for (let i = 0; i < obj.length; i++) {\n items.push(serializeValue(obj[i], depth + 1, seen));\n }\n return `[${items.join(\",\")}]`;\n }\n\n const entries: string[] = [];\n for (const key of Object.keys(obj)) {\n const val = serializeValue(\n (obj as Record<string, unknown>)[key],\n depth + 1,\n seen\n );\n entries.push(`\"${key}\":${val}`);\n }\n return `{${entries.join(\",\")}}`;\n } catch {\n return String(obj);\n } finally {\n seen.delete(obj);\n }\n}\n\nfunction serializeArg(arg: unknown): string {\n const seen = new WeakSet<object>();\n const result = serializeValue(arg, 0, seen);\n if (result.length > MAX_STRING_SIZE) {\n return `${result.slice(0, MAX_STRING_SIZE)}...truncated`;\n }\n return result;\n}\n\nfunction getCallerLocation(): string | undefined {\n const err = new Error();\n const stack = err.stack;\n if (!stack) {\n return undefined;\n }\n\n const lines = stack.split(\"\\n\");\n\n for (const line of lines) {\n if (INTERNAL_FRAME_PATTERN.test(line)) {\n continue;\n }\n\n let match = CHROME_FRAME_REGEX_PAREN.exec(line);\n if (!match) {\n match = CHROME_FRAME_REGEX_BARE.exec(line);\n }\n if (!match) {\n match = FIREFOX_FRAME_REGEX.exec(line);\n }\n\n if (match) {\n const filePath = match[1];\n const lineNum = match[2];\n const fileName = filePath.split(\"/\").pop() ?? filePath;\n return `${fileName}:${lineNum}`;\n }\n }\n\n return undefined;\n}\n\nfunction capEntrySize(args: string[]): string[] {\n let totalSize = 0;\n for (const arg of args) {\n totalSize += arg.length;\n }\n\n if (totalSize <= MAX_TOTAL_SIZE) {\n return args;\n }\n\n const result = [...args];\n while (totalSize > MAX_TOTAL_SIZE) {\n let longestIndex = 0;\n let longestLength = 0;\n for (let i = 0; i < result.length; i++) {\n if (result[i].length > longestLength) {\n longestLength = result[i].length;\n longestIndex = i;\n }\n }\n if (longestLength <= 40) {\n break;\n }\n const replacement = `...truncated (${longestLength} bytes)`;\n totalSize += replacement.length - longestLength;\n result[longestIndex] = replacement;\n }\n return result;\n}\n\nexport class ConsoleLogStore extends SubscribableStore {\n private readonly entries: CircularBuffer<ConsoleLogEntry>;\n private cachedEntries: readonly ConsoleLogEntry[] | null = null;\n private readonly originals = new Map<\n ConsoleLogLevel,\n (...args: unknown[]) => void\n >();\n private readonly wrappers = new Map<\n ConsoleLogLevel,\n (...args: unknown[]) => void\n >();\n private installed = false;\n private suppressed = false;\n private capturing = false;\n private notifyScheduled = false;\n\n constructor(capacity: number = 1000) {\n super();\n this.entries = new CircularBuffer(capacity);\n }\n\n install(): void {\n if (this.installed) {\n return;\n }\n\n for (const level of CONSOLE_LEVELS) {\n const original = console[level]; // eslint-disable-line no-console\n this.originals.set(level, original);\n\n const store = this;\n const wrapper = function osdkConsoleWrapper(\n this: Console,\n ...args: unknown[]\n ) {\n // Capture the source synchronously, before any async boundary, so the\n // user's frame is still on the stack. The in-panel `entry.source` is\n // canonical and accurate ā verified by ConsoleLogStore.test.ts.\n //\n // Browser DevTools source-link attribution (the clickable link beside\n // each console row) is decided by V8 and follows wherever the original\n // method was *called*. Routing the call through Function.prototype.apply\n // is best-effort; in practice the link may still resolve to the wrapper\n // file in some Chromium versions. There is no fully-portable JS-level\n // mitigation; if needed, prefer the panel-side source field.\n //\n // Reentrancy note: capture work runs in queueMicrotask, so `capturing`\n // resets between the wrapper microtask and any nested microtask. A\n // getter that calls console.log during serialization may therefore be\n // captured (one extra entry, no infinite loop). Strict synchronous\n // reentrancy guarding is incompatible with the microtask deferral that\n // makes the source attribution improvement possible.\n const skipCapture =\n store.suppressed || store.capturing || isBrowserLoggerCall(args);\n const source = skipCapture ? undefined : getCallerLocation();\n\n Function.prototype.apply.call(original, this ?? console, args);\n\n if (skipCapture) {\n return;\n }\n\n queueMicrotask(() => {\n if (store.capturing) {\n return;\n }\n store.capturing = true;\n try {\n const serializedArgs = capEntrySize(args.map(serializeArg));\n const entry: ConsoleLogEntry = {\n id: nextId(),\n level,\n args: serializedArgs,\n timestamp: Date.now(),\n ...(source !== undefined ? { source } : {}),\n };\n\n store.entries.push(entry);\n store.cachedEntries = null;\n store.scheduleNotify();\n } catch {\n } finally {\n store.capturing = false;\n }\n });\n };\n\n console[level] = wrapper; // eslint-disable-line no-console\n this.wrappers.set(level, wrapper);\n }\n\n this.installed = true;\n }\n\n uninstall(): void {\n if (!this.installed) {\n return;\n }\n\n for (const level of CONSOLE_LEVELS) {\n const original = this.originals.get(level);\n const ourWrapper = this.wrappers.get(level);\n if (original && ourWrapper && console[level] === ourWrapper) {\n // eslint-disable-line no-console\n console[level] = original; // eslint-disable-line no-console\n }\n }\n\n this.originals.clear();\n this.wrappers.clear();\n this.installed = false;\n }\n\n suppress(): void {\n this.suppressed = true;\n }\n\n unsuppress(): void {\n this.suppressed = false;\n }\n\n getEntries(): readonly ConsoleLogEntry[] {\n if (this.cachedEntries != null) {\n return this.cachedEntries;\n }\n this.cachedEntries = this.entries.toArray();\n return this.cachedEntries;\n }\n\n getSize(): number {\n return this.entries.getSize();\n }\n\n clear(): void {\n this.entries.clear();\n this.cachedEntries = null;\n this.notifySubscribers();\n }\n\n dispose(): void {\n this.uninstall();\n this.entries.clear();\n this.cachedEntries = null;\n this.clearSubscribers();\n }\n\n private scheduleNotify(): void {\n if (this.notifyScheduled) {\n return;\n }\n this.notifyScheduled = true;\n queueMicrotask(() => {\n this.notifyScheduled = false;\n this.notifySubscribers();\n });\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"ConsoleLogStore.js","names":["CircularBuffer","SubscribableStore","CONSOLE_LEVELS","entryCounter","nextId","Date","now","MAX_DEPTH","MAX_STRING_SIZE","MAX_TOTAL_SIZE","INTERNAL_FRAME_PATTERN","BROWSER_LOGGER_CSS","isBrowserLoggerCall","args","startsWith","includes","CHROME_FRAME_REGEX_PAREN","CHROME_FRAME_REGEX_BARE","FIREFOX_FRAME_REGEX","serializeValue","value","depth","seen","String","type","description","name","obj","Node","tagName","Error","stack","message","has","Array","isArray","length","add","items","i","push","join","entries","key","Object","keys","val","delete","serializeArg","arg","WeakSet","result","slice","getCallerLocation","err","undefined","lines","split","line","test","match","exec","filePath","lineNum","fileName","pop","capEntrySize","totalSize","longestIndex","longestLength","replacement","ConsoleLogStore","cachedEntries","originals","Map","wrappers","installed","suppressed","capturing","notifyScheduled","constructor","capacity","install","level","original","console","set","store","wrapper","skipCapture","source","Function","prototype","apply","call","queueMicrotask","serializedArgs","map","entry","id","timestamp","scheduleNotify","uninstall","get","ourWrapper","clear","suppress","unsuppress","getEntries","toArray","getSize","notifySubscribers","dispose","clearSubscribers"],"sources":["ConsoleLogStore.ts"],"sourcesContent":["/*\n * Copyright 2025 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { CircularBuffer } from \"../utils/CircularBuffer.js\";\nimport { SubscribableStore } from \"./SubscribableStore.js\";\n\nexport type ConsoleLogLevel = \"log\" | \"warn\" | \"error\" | \"info\" | \"debug\";\n\nconst CONSOLE_LEVELS: readonly ConsoleLogLevel[] = [\n \"log\",\n \"warn\",\n \"error\",\n \"info\",\n \"debug\",\n] as const;\n\nexport interface ConsoleLogEntry {\n readonly id: string;\n readonly level: ConsoleLogLevel;\n readonly args: readonly string[];\n readonly timestamp: number;\n readonly source?: string;\n}\n\nlet entryCounter = 0;\n\nfunction nextId(): string {\n return `console-${++entryCounter}-${Date.now()}`;\n}\n\nconst MAX_DEPTH = 3;\nconst MAX_STRING_SIZE = 10240; // 10KB\nconst MAX_TOTAL_SIZE = 10240; // 10KB\n\nconst INTERNAL_FRAME_PATTERN =\n /ConsoleLogStore|serializeArg|serializeValue|getCallerLocation|capEntrySize|osdkConsoleWrapper/u;\n\n// BrowserLogger formats calls with %c CSS styling and a \"border: 1px solid\"\n// pattern from its createStyle(). We filter these from the devtools console\n// because devtools monitors the same operations through its own instrumentation.\nconst BROWSER_LOGGER_CSS = \"border: 1px solid\";\nfunction isBrowserLoggerCall(args: unknown[]): boolean {\n return (\n typeof args[0] === \"string\" &&\n args[0].startsWith(\"%c\") &&\n typeof args[1] === \"string\" &&\n args[1].includes(BROWSER_LOGGER_CSS)\n );\n}\n\nconst CHROME_FRAME_REGEX_PAREN = /at\\s+.*?\\((.*?):(\\d+):\\d+\\)/u;\nconst CHROME_FRAME_REGEX_BARE = /at\\s+(.*?):(\\d+):\\d+/u;\nconst FIREFOX_FRAME_REGEX = /@(.*?):(\\d+):\\d+/u;\n\nfunction serializeValue(\n value: unknown,\n depth: number,\n seen: WeakSet<object>\n): string {\n if (value == null) {\n return String(value);\n }\n\n const type = typeof value;\n\n if (type === \"string\") {\n if (depth === 0) {\n return value as string;\n }\n return `\"${value as string}\"`;\n }\n if (type === \"number\" || type === \"boolean\") {\n return String(value);\n }\n if (type === \"bigint\") {\n return `BigInt(${String(value)})`;\n }\n if (type === \"symbol\") {\n return `Symbol(${(value as symbol).description ?? \"\"})`;\n }\n if (type === \"function\") {\n return `[Function: ${\n (value as (...args: readonly unknown[]) => unknown).name || \"anonymous\"\n }]`;\n }\n\n const obj = value as object;\n\n if (typeof Node !== \"undefined\" && obj instanceof Node) {\n const el = obj as { tagName?: string };\n return `[HTMLElement: ${el.tagName ?? \"unknown\"}]`;\n }\n\n if (obj instanceof Error) {\n return obj.stack ?? obj.message;\n }\n\n if (seen.has(obj)) {\n return \"[Circular]\";\n }\n\n if (depth >= MAX_DEPTH) {\n if (Array.isArray(obj)) {\n return `[Array(${obj.length})]`;\n }\n return \"[Object]\";\n }\n\n seen.add(obj);\n try {\n if (Array.isArray(obj)) {\n const items: string[] = [];\n for (let i = 0; i < obj.length; i++) {\n items.push(serializeValue(obj[i], depth + 1, seen));\n }\n return `[${items.join(\",\")}]`;\n }\n\n const entries: string[] = [];\n for (const key of Object.keys(obj)) {\n const val = serializeValue(\n (obj as Record<string, unknown>)[key],\n depth + 1,\n seen\n );\n entries.push(`\"${key}\":${val}`);\n }\n return `{${entries.join(\",\")}}`;\n } catch {\n return String(obj);\n } finally {\n seen.delete(obj);\n }\n}\n\nfunction serializeArg(arg: unknown): string {\n const seen = new WeakSet<object>();\n const result = serializeValue(arg, 0, seen);\n if (result.length > MAX_STRING_SIZE) {\n return `${result.slice(0, MAX_STRING_SIZE)}...truncated`;\n }\n return result;\n}\n\nfunction getCallerLocation(): string | undefined {\n const err = new Error();\n const stack = err.stack;\n if (!stack) {\n return undefined;\n }\n\n const lines = stack.split(\"\\n\");\n\n for (const line of lines) {\n if (INTERNAL_FRAME_PATTERN.test(line)) {\n continue;\n }\n\n let match = CHROME_FRAME_REGEX_PAREN.exec(line);\n if (!match) {\n match = CHROME_FRAME_REGEX_BARE.exec(line);\n }\n if (!match) {\n match = FIREFOX_FRAME_REGEX.exec(line);\n }\n\n if (match) {\n const filePath = match[1];\n const lineNum = match[2];\n const fileName = filePath.split(\"/\").pop() ?? filePath;\n return `${fileName}:${lineNum}`;\n }\n }\n\n return undefined;\n}\n\nfunction capEntrySize(args: string[]): string[] {\n let totalSize = 0;\n for (const arg of args) {\n totalSize += arg.length;\n }\n\n if (totalSize <= MAX_TOTAL_SIZE) {\n return args;\n }\n\n const result = [...args];\n while (totalSize > MAX_TOTAL_SIZE) {\n let longestIndex = 0;\n let longestLength = 0;\n for (let i = 0; i < result.length; i++) {\n if (result[i].length > longestLength) {\n longestLength = result[i].length;\n longestIndex = i;\n }\n }\n if (longestLength <= 40) {\n break;\n }\n const replacement = `...truncated (${longestLength} bytes)`;\n totalSize += replacement.length - longestLength;\n result[longestIndex] = replacement;\n }\n return result;\n}\n\nexport class ConsoleLogStore extends SubscribableStore {\n private readonly entries: CircularBuffer<ConsoleLogEntry>;\n private cachedEntries: readonly ConsoleLogEntry[] | null = null;\n private readonly originals = new Map<\n ConsoleLogLevel,\n (...args: unknown[]) => void\n >();\n private readonly wrappers = new Map<\n ConsoleLogLevel,\n (...args: unknown[]) => void\n >();\n private installed = false;\n private suppressed = false;\n private capturing = false;\n private notifyScheduled = false;\n\n constructor(capacity: number = 1000) {\n super();\n this.entries = new CircularBuffer(capacity);\n }\n\n install(): void {\n if (this.installed) {\n return;\n }\n\n for (const level of CONSOLE_LEVELS) {\n const original = console[level]; // eslint-disable-line no-console\n this.originals.set(level, original);\n\n const store = this;\n const wrapper = function osdkConsoleWrapper(\n this: Console,\n ...args: unknown[]\n ) {\n // Capture the source synchronously, before any async boundary, so the\n // user's frame is still on the stack. The in-panel `entry.source` is\n // canonical and accurate ā verified by ConsoleLogStore.test.ts.\n //\n // Browser DevTools source-link attribution (the clickable link beside\n // each console row) is decided by V8 and follows wherever the original\n // method was *called*. Routing the call through Function.prototype.apply\n // is best-effort; in practice the link may still resolve to the wrapper\n // file in some Chromium versions. There is no fully-portable JS-level\n // mitigation; if needed, prefer the panel-side source field.\n //\n // Reentrancy note: capture work runs in queueMicrotask, so `capturing`\n // resets between the wrapper microtask and any nested microtask. A\n // getter that calls console.log during serialization may therefore be\n // captured (one extra entry, no infinite loop). Strict synchronous\n // reentrancy guarding is incompatible with the microtask deferral that\n // makes the source attribution improvement possible.\n const skipCapture =\n store.suppressed || store.capturing || isBrowserLoggerCall(args);\n const source = skipCapture ? undefined : getCallerLocation();\n\n Function.prototype.apply.call(original, this ?? console, args);\n\n if (skipCapture) {\n return;\n }\n\n queueMicrotask(() => {\n if (store.capturing) {\n return;\n }\n store.capturing = true;\n try {\n const serializedArgs = capEntrySize(args.map(serializeArg));\n const entry: ConsoleLogEntry = {\n id: nextId(),\n level,\n args: serializedArgs,\n timestamp: Date.now(),\n ...(source !== undefined ? { source } : {}),\n };\n\n store.entries.push(entry);\n store.cachedEntries = null;\n store.scheduleNotify();\n } catch {\n } finally {\n store.capturing = false;\n }\n });\n };\n\n console[level] = wrapper; // eslint-disable-line no-console\n this.wrappers.set(level, wrapper);\n }\n\n this.installed = true;\n }\n\n uninstall(): void {\n if (!this.installed) {\n return;\n }\n\n for (const level of CONSOLE_LEVELS) {\n const original = this.originals.get(level);\n const ourWrapper = this.wrappers.get(level);\n if (original && ourWrapper && console[level] === ourWrapper) {\n // eslint-disable-line no-console\n console[level] = original; // eslint-disable-line no-console\n }\n }\n\n this.originals.clear();\n this.wrappers.clear();\n this.installed = false;\n }\n\n suppress(): void {\n this.suppressed = true;\n }\n\n unsuppress(): void {\n this.suppressed = false;\n }\n\n getEntries(): readonly ConsoleLogEntry[] {\n if (this.cachedEntries != null) {\n return this.cachedEntries;\n }\n this.cachedEntries = this.entries.toArray();\n return this.cachedEntries;\n }\n\n getSize(): number {\n return this.entries.getSize();\n }\n\n clear(): void {\n this.entries.clear();\n this.cachedEntries = null;\n this.notifySubscribers();\n }\n\n dispose(): void {\n this.uninstall();\n this.entries.clear();\n this.cachedEntries = null;\n this.clearSubscribers();\n }\n\n private scheduleNotify(): void {\n if (this.notifyScheduled) {\n return;\n }\n this.notifyScheduled = true;\n queueMicrotask(() => {\n this.notifyScheduled = false;\n this.notifySubscribers();\n });\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -88,7 +88,7 @@ export class ComponentContextCapture {
|
|
|
88
88
|
}
|
|
89
89
|
parseStackTrace(stack) {
|
|
90
90
|
const lines = stack.split("\n");
|
|
91
|
-
const internalPatterns = [/node_modules
|
|
91
|
+
const internalPatterns = [/node_modules/u, /@osdk\/react/u, /react-devtools/u, /ComponentContextCapture/u, /ObservableClientMonitor/u, /ComponentQueryRegistry/u, /packages\/react\/build/u, /packages\/react\/esm/u, /packages\/react\/src/u, /Proxy/u];
|
|
92
92
|
const internalFuncNames = new Set(["Proxy", "ComponentContextCapture", "Object", "Array", "Function", "Promise", "eval", "anonymous", "Module"]);
|
|
93
93
|
const isInternalFrame = (filePath, funcName) => {
|
|
94
94
|
if (internalFuncNames.has(funcName)) {
|
|
@@ -107,14 +107,14 @@ export class ComponentContextCapture {
|
|
|
107
107
|
return false;
|
|
108
108
|
}
|
|
109
109
|
}
|
|
110
|
-
return /\.(tsx?|jsx?)(\?|:|$)
|
|
110
|
+
return /\.(tsx?|jsx?)(\?|:|$)/u.test(filePath) && !/node_modules/u.test(filePath);
|
|
111
111
|
};
|
|
112
112
|
const extractComponentNameFromPath = filePath => {
|
|
113
|
-
const match = filePath.match(/\/([A-Z][a-zA-Z0-9]*)\.(tsx?|jsx?)[?:]/);
|
|
113
|
+
const match = filePath.match(/\/([A-Z][a-zA-Z0-9]*)\.(tsx?|jsx?)[?:]/u);
|
|
114
114
|
if (match) {
|
|
115
115
|
return match[1];
|
|
116
116
|
}
|
|
117
|
-
const match2 = filePath.match(/([A-Z][a-zA-Z0-9]*)\.(tsx?|jsx?)[?:]?$/);
|
|
117
|
+
const match2 = filePath.match(/([A-Z][a-zA-Z0-9]*)\.(tsx?|jsx?)[?:]?$/u);
|
|
118
118
|
if (match2) {
|
|
119
119
|
return match2[1];
|
|
120
120
|
}
|
|
@@ -123,7 +123,7 @@ export class ComponentContextCapture {
|
|
|
123
123
|
const maxLines = Math.min(lines.length, 40);
|
|
124
124
|
for (let i = 3; i < maxLines; i++) {
|
|
125
125
|
const line = lines[i];
|
|
126
|
-
const chromeMatch = line.match(/at\s+([A-Z]\w+)\s+\((.*?):(\d+):(\d+)\)/);
|
|
126
|
+
const chromeMatch = line.match(/at\s+([A-Z]\w+)\s+\((.*?):(\d+):(\d+)\)/u);
|
|
127
127
|
if (chromeMatch) {
|
|
128
128
|
const [, funcName, filePath, lineNum, colNum] = chromeMatch;
|
|
129
129
|
if (!isInternalFrame(filePath, funcName)) {
|
|
@@ -136,7 +136,7 @@ export class ComponentContextCapture {
|
|
|
136
136
|
}
|
|
137
137
|
continue;
|
|
138
138
|
}
|
|
139
|
-
const firefoxMatch = line.match(/([A-Z]\w+)@(.*?):(\d+):(\d+)/);
|
|
139
|
+
const firefoxMatch = line.match(/([A-Z]\w+)@(.*?):(\d+):(\d+)/u);
|
|
140
140
|
if (firefoxMatch) {
|
|
141
141
|
const [, funcName, filePath, lineNum, colNum] = firefoxMatch;
|
|
142
142
|
if (!isInternalFrame(filePath, funcName)) {
|
|
@@ -152,13 +152,13 @@ export class ComponentContextCapture {
|
|
|
152
152
|
}
|
|
153
153
|
for (let i = 3; i < maxLines; i++) {
|
|
154
154
|
const line = lines[i];
|
|
155
|
-
const fileMatch = line.match(/\((https?:\/\/[^)]+|\/[^)]+)\)|at\s+(https?:\/\/\S+|\/\S+)/);
|
|
155
|
+
const fileMatch = line.match(/\((https?:\/\/[^)]+|\/[^)]+)\)|at\s+(https?:\/\/\S+|\/\S+)/u);
|
|
156
156
|
if (fileMatch) {
|
|
157
157
|
const filePath = fileMatch[1] || fileMatch[2];
|
|
158
158
|
if (isAppFilePath(filePath)) {
|
|
159
159
|
const componentName = extractComponentNameFromPath(filePath);
|
|
160
160
|
if (componentName) {
|
|
161
|
-
const locationMatch = filePath.match(/:(\d+):(\d+)$/);
|
|
161
|
+
const locationMatch = filePath.match(/:(\d+):(\d+)$/u);
|
|
162
162
|
return {
|
|
163
163
|
componentName,
|
|
164
164
|
filePath,
|
|
@@ -171,7 +171,7 @@ export class ComponentContextCapture {
|
|
|
171
171
|
}
|
|
172
172
|
for (let i = 3; i < maxLines; i++) {
|
|
173
173
|
const line = lines[i];
|
|
174
|
-
const anyFuncMatch = line.match(/at\s+(\w+)\s+\((.*?):(\d+):(\d+)\)/);
|
|
174
|
+
const anyFuncMatch = line.match(/at\s+(\w+)\s+\((.*?):(\d+):(\d+)\)/u);
|
|
175
175
|
if (anyFuncMatch) {
|
|
176
176
|
const [, funcName, filePath, lineNum, colNum] = anyFuncMatch;
|
|
177
177
|
if (funcName.length >= 3 && !internalFuncNames.has(funcName) && isAppFilePath(filePath)) {
|
|
@@ -187,7 +187,7 @@ export class ComponentContextCapture {
|
|
|
187
187
|
}
|
|
188
188
|
for (let i = 3; i < maxLines; i++) {
|
|
189
189
|
const line = lines[i];
|
|
190
|
-
const nameMatch = line.match(/at\s+([A-Z]\w+)/);
|
|
190
|
+
const nameMatch = line.match(/at\s+([A-Z]\w+)/u);
|
|
191
191
|
if (nameMatch) {
|
|
192
192
|
const funcName = nameMatch[1];
|
|
193
193
|
if (!internalFuncNames.has(funcName)) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ComponentContextCapture.js","names":["getComponentId","getComponentName","getSourceLocation","ComponentContextCapture","fiberToId","WeakMap","idCounter","enabled","captureNow","tryStackTraceAnalysis","contextFromFiber","fiber","id","getComponentIdForFiber","name","displayName","getFiberDisplayName","sourceLocation","filePath","fileName","lineNumber","columnNumber","stackTrace","get","shortPath","split","slice","join","set","type","undefined","error","Error","stack","parsed","parseStackTrace","componentName","lines","internalPatterns","internalFuncNames","Set","isInternalFrame","funcName","has","pattern","test","isAppFilePath","extractComponentNameFromPath","match","match2","maxLines","Math","min","length","i","line","chromeMatch","lineNum","colNum","Number","parseInt","firefoxMatch","fileMatch","locationMatch","anyFuncMatch","pathName","nameMatch","disable","enable","clearCache","componentContextCapture"],"sources":["ComponentContextCapture.ts"],"sourcesContent":["/*\n * Copyright 2025 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n getComponentId,\n getComponentName,\n getSourceLocation,\n} from \"../fiber/FiberInspection.js\";\nimport type { Fiber } from \"../fiber/types.js\";\n\nexport interface ComponentContext {\n id: string;\n name: string;\n displayName?: string;\n filePath?: string;\n lineNumber?: number;\n columnNumber?: number;\n stackTrace: string;\n}\n\nexport class ComponentContextCapture {\n private fiberToId = new WeakMap<Fiber, string>();\n private idCounter = 0;\n private enabled = true;\n\n captureNow(): ComponentContext | null {\n if (!this.enabled) {\n return null;\n }\n\n return this.tryStackTraceAnalysis();\n }\n\n /**\n * Extract context from a fiber node when one is available.\n * Only use this at click-time when we have a fiber from DOM element.\n */\n contextFromFiber(fiber: Fiber): ComponentContext {\n const id = this.getComponentIdForFiber(fiber);\n const name = getComponentName(fiber);\n const displayName = this.getFiberDisplayName(fiber);\n const sourceLocation = getSourceLocation(fiber);\n\n return {\n id,\n name,\n displayName,\n filePath: sourceLocation?.fileName,\n lineNumber: sourceLocation?.lineNumber,\n columnNumber: sourceLocation?.columnNumber,\n stackTrace: \"\",\n };\n }\n\n getComponentIdForFiber(fiber: Fiber): string {\n let id = this.fiberToId.get(fiber);\n if (!id) {\n id = getComponentId(fiber);\n\n // If no stable ID available, generate one\n if (!id || id === \"unknown-0\") {\n const name = getComponentName(fiber);\n const sourceLocation = getSourceLocation(fiber);\n\n if (sourceLocation) {\n const shortPath =\n sourceLocation.fileName?.split(\"/\").slice(-2).join(\"/\") ||\n \"unknown\";\n id = `fiber-${name}-${shortPath}-${sourceLocation.lineNumber || 0}`;\n } else {\n id = `fiber-${name}-${this.idCounter++}`;\n }\n }\n\n this.fiberToId.set(fiber, id);\n }\n return id;\n }\n\n private getFiberDisplayName(fiber: Fiber): string | undefined {\n if (\n typeof fiber.type === \"function\" &&\n \"displayName\" in fiber.type &&\n typeof fiber.type.displayName === \"string\"\n ) {\n return fiber.type.displayName;\n }\n return undefined;\n }\n\n private tryStackTraceAnalysis(): ComponentContext | null {\n const error = new Error();\n const stack = error.stack || \"\";\n\n const parsed = this.parseStackTrace(stack);\n\n const shortPath =\n parsed.filePath?.split(\"/\").slice(-2).join(\"/\") || \"unknown\";\n const id = `stack-${parsed.componentName || \"Unknown\"}-${shortPath}-${\n parsed.lineNumber || 0\n }`;\n\n return {\n id,\n name: parsed.componentName || \"Unknown\",\n filePath: parsed.filePath,\n lineNumber: parsed.lineNumber,\n columnNumber: parsed.columnNumber,\n stackTrace: stack,\n };\n }\n\n private parseStackTrace(stack: string): {\n componentName: string | null;\n filePath?: string;\n lineNumber?: number;\n columnNumber?: number;\n } {\n const lines = stack.split(\"\\n\");\n\n const internalPatterns = [\n /node_modules/,\n /@osdk\\/react/,\n /react-devtools/,\n /ComponentContextCapture/,\n /ObservableClientMonitor/,\n /ComponentQueryRegistry/,\n /packages\\/react\\/build/,\n /packages\\/react\\/esm/,\n /packages\\/react\\/src/,\n /Proxy/,\n ];\n\n const internalFuncNames = new Set([\n \"Proxy\",\n \"ComponentContextCapture\",\n \"Object\",\n \"Array\",\n \"Function\",\n \"Promise\",\n \"eval\",\n \"anonymous\",\n \"Module\",\n ]);\n\n const isInternalFrame = (filePath: string, funcName: string): boolean => {\n if (internalFuncNames.has(funcName)) {\n return true;\n }\n for (const pattern of internalPatterns) {\n if (pattern.test(filePath)) {\n return true;\n }\n }\n return false;\n };\n\n const isAppFilePath = (filePath: string): boolean => {\n for (const pattern of internalPatterns) {\n if (pattern.test(filePath)) {\n return false;\n }\n }\n return (\n /\\.(tsx?|jsx?)(\\?|:|$)/.test(filePath) && !/node_modules/.test(filePath)\n );\n };\n\n const extractComponentNameFromPath = (filePath: string): string | null => {\n const match = filePath.match(/\\/([A-Z][a-zA-Z0-9]*)\\.(tsx?|jsx?)[?:]/);\n if (match) {\n return match[1];\n }\n const match2 = filePath.match(/([A-Z][a-zA-Z0-9]*)\\.(tsx?|jsx?)[?:]?$/);\n if (match2) {\n return match2[1];\n }\n return null;\n };\n\n const maxLines = Math.min(lines.length, 40);\n\n for (let i = 3; i < maxLines; i++) {\n const line = lines[i];\n\n const chromeMatch = line.match(/at\\s+([A-Z]\\w+)\\s+\\((.*?):(\\d+):(\\d+)\\)/);\n if (chromeMatch) {\n const [, funcName, filePath, lineNum, colNum] = chromeMatch;\n if (!isInternalFrame(filePath, funcName)) {\n return {\n componentName: funcName,\n filePath,\n lineNumber: Number.parseInt(lineNum, 10),\n columnNumber: Number.parseInt(colNum, 10),\n };\n }\n continue;\n }\n\n const firefoxMatch = line.match(/([A-Z]\\w+)@(.*?):(\\d+):(\\d+)/);\n if (firefoxMatch) {\n const [, funcName, filePath, lineNum, colNum] = firefoxMatch;\n if (!isInternalFrame(filePath, funcName)) {\n return {\n componentName: funcName,\n filePath,\n lineNumber: Number.parseInt(lineNum, 10),\n columnNumber: Number.parseInt(colNum, 10),\n };\n }\n continue;\n }\n }\n\n for (let i = 3; i < maxLines; i++) {\n const line = lines[i];\n\n const fileMatch = line.match(\n /\\((https?:\\/\\/[^)]+|\\/[^)]+)\\)|at\\s+(https?:\\/\\/\\S+|\\/\\S+)/\n );\n if (fileMatch) {\n const filePath = fileMatch[1] || fileMatch[2];\n if (isAppFilePath(filePath)) {\n const componentName = extractComponentNameFromPath(filePath);\n if (componentName) {\n const locationMatch = filePath.match(/:(\\d+):(\\d+)$/);\n return {\n componentName,\n filePath,\n lineNumber: locationMatch\n ? Number.parseInt(locationMatch[1], 10)\n : undefined,\n columnNumber: locationMatch\n ? Number.parseInt(locationMatch[2], 10)\n : undefined,\n };\n }\n }\n }\n }\n\n for (let i = 3; i < maxLines; i++) {\n const line = lines[i];\n\n const anyFuncMatch = line.match(/at\\s+(\\w+)\\s+\\((.*?):(\\d+):(\\d+)\\)/);\n if (anyFuncMatch) {\n const [, funcName, filePath, lineNum, colNum] = anyFuncMatch;\n if (\n funcName.length >= 3 &&\n !internalFuncNames.has(funcName) &&\n isAppFilePath(filePath)\n ) {\n const pathName = extractComponentNameFromPath(filePath);\n return {\n componentName: pathName || funcName,\n filePath,\n lineNumber: Number.parseInt(lineNum, 10),\n columnNumber: Number.parseInt(colNum, 10),\n };\n }\n }\n }\n\n for (let i = 3; i < maxLines; i++) {\n const line = lines[i];\n const nameMatch = line.match(/at\\s+([A-Z]\\w+)/);\n if (nameMatch) {\n const funcName = nameMatch[1];\n if (!internalFuncNames.has(funcName)) {\n return { componentName: funcName };\n }\n }\n }\n\n return { componentName: null };\n }\n\n disable(): void {\n this.enabled = false;\n }\n\n enable(): void {\n this.enabled = true;\n }\n\n clearCache(): void {\n this.fiberToId = new WeakMap();\n }\n}\n\nexport const componentContextCapture: ComponentContextCapture =\n new ComponentContextCapture();\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,SACEA,cAAc,EACdC,gBAAgB,EAChBC,iBAAiB,QACZ,6BAA6B;AAapC,OAAO,MAAMC,uBAAuB,CAAC;EAC3BC,SAAS,GAAG,IAAIC,OAAO,CAAgB,CAAC;EACxCC,SAAS,GAAG,CAAC;EACbC,OAAO,GAAG,IAAI;EAEtBC,UAAUA,CAAA,EAA4B;IACpC,IAAI,CAAC,IAAI,CAACD,OAAO,EAAE;MACjB,OAAO,IAAI;IACb;IAEA,OAAO,IAAI,CAACE,qBAAqB,CAAC,CAAC;EACrC;;EAEA;AACF;AACA;AACA;EACEC,gBAAgBA,CAACC,KAAY,EAAoB;IAC/C,MAAMC,EAAE,GAAG,IAAI,CAACC,sBAAsB,CAACF,KAAK,CAAC;IAC7C,MAAMG,IAAI,GAAGb,gBAAgB,CAACU,KAAK,CAAC;IACpC,MAAMI,WAAW,GAAG,IAAI,CAACC,mBAAmB,CAACL,KAAK,CAAC;IACnD,MAAMM,cAAc,GAAGf,iBAAiB,CAACS,KAAK,CAAC;IAE/C,OAAO;MACLC,EAAE;MACFE,IAAI;MACJC,WAAW;MACXG,QAAQ,EAAED,cAAc,EAAEE,QAAQ;MAClCC,UAAU,EAAEH,cAAc,EAAEG,UAAU;MACtCC,YAAY,EAAEJ,cAAc,EAAEI,YAAY;MAC1CC,UAAU,EAAE;IACd,CAAC;EACH;EAEAT,sBAAsBA,CAACF,KAAY,EAAU;IAC3C,IAAIC,EAAE,GAAG,IAAI,CAACR,SAAS,CAACmB,GAAG,CAACZ,KAAK,CAAC;IAClC,IAAI,CAACC,EAAE,EAAE;MACPA,EAAE,GAAGZ,cAAc,CAACW,KAAK,CAAC;;MAE1B;MACA,IAAI,CAACC,EAAE,IAAIA,EAAE,KAAK,WAAW,EAAE;QAC7B,MAAME,IAAI,GAAGb,gBAAgB,CAACU,KAAK,CAAC;QACpC,MAAMM,cAAc,GAAGf,iBAAiB,CAACS,KAAK,CAAC;QAE/C,IAAIM,cAAc,EAAE;UAClB,MAAMO,SAAS,GACbP,cAAc,CAACE,QAAQ,EAAEM,KAAK,CAAC,GAAG,CAAC,CAACC,KAAK,CAAC,CAAC,CAAC,CAAC,CAACC,IAAI,CAAC,GAAG,CAAC,IACvD,SAAS;UACXf,EAAE,GAAG,SAASE,IAAI,IAAIU,SAAS,IAAIP,cAAc,CAACG,UAAU,IAAI,CAAC,EAAE;QACrE,CAAC,MAAM;UACLR,EAAE,GAAG,SAASE,IAAI,IAAI,IAAI,CAACR,SAAS,EAAE,EAAE;QAC1C;MACF;MAEA,IAAI,CAACF,SAAS,CAACwB,GAAG,CAACjB,KAAK,EAAEC,EAAE,CAAC;IAC/B;IACA,OAAOA,EAAE;EACX;EAEQI,mBAAmBA,CAACL,KAAY,EAAsB;IAC5D,IACE,OAAOA,KAAK,CAACkB,IAAI,KAAK,UAAU,IAChC,aAAa,IAAIlB,KAAK,CAACkB,IAAI,IAC3B,OAAOlB,KAAK,CAACkB,IAAI,CAACd,WAAW,KAAK,QAAQ,EAC1C;MACA,OAAOJ,KAAK,CAACkB,IAAI,CAACd,WAAW;IAC/B;IACA,OAAOe,SAAS;EAClB;EAEQrB,qBAAqBA,CAAA,EAA4B;IACvD,MAAMsB,KAAK,GAAG,IAAIC,KAAK,CAAC,CAAC;IACzB,MAAMC,KAAK,GAAGF,KAAK,CAACE,KAAK,IAAI,EAAE;IAE/B,MAAMC,MAAM,GAAG,IAAI,CAACC,eAAe,CAACF,KAAK,CAAC;IAE1C,MAAMT,SAAS,GACbU,MAAM,CAAChB,QAAQ,EAAEO,KAAK,CAAC,GAAG,CAAC,CAACC,KAAK,CAAC,CAAC,CAAC,CAAC,CAACC,IAAI,CAAC,GAAG,CAAC,IAAI,SAAS;IAC9D,MAAMf,EAAE,GAAG,SAASsB,MAAM,CAACE,aAAa,IAAI,SAAS,IAAIZ,SAAS,IAChEU,MAAM,CAACd,UAAU,IAAI,CAAC,EACtB;IAEF,OAAO;MACLR,EAAE;MACFE,IAAI,EAAEoB,MAAM,CAACE,aAAa,IAAI,SAAS;MACvClB,QAAQ,EAAEgB,MAAM,CAAChB,QAAQ;MACzBE,UAAU,EAAEc,MAAM,CAACd,UAAU;MAC7BC,YAAY,EAAEa,MAAM,CAACb,YAAY;MACjCC,UAAU,EAAEW;IACd,CAAC;EACH;EAEQE,eAAeA,CAACF,KAAa,EAKnC;IACA,MAAMI,KAAK,GAAGJ,KAAK,CAACR,KAAK,CAAC,IAAI,CAAC;IAE/B,MAAMa,gBAAgB,GAAG,CACvB,cAAc,EACd,cAAc,EACd,gBAAgB,EAChB,yBAAyB,EACzB,yBAAyB,EACzB,wBAAwB,EACxB,wBAAwB,EACxB,sBAAsB,EACtB,sBAAsB,EACtB,OAAO,CACR;IAED,MAAMC,iBAAiB,GAAG,IAAIC,GAAG,CAAC,CAChC,OAAO,EACP,yBAAyB,EACzB,QAAQ,EACR,OAAO,EACP,UAAU,EACV,SAAS,EACT,MAAM,EACN,WAAW,EACX,QAAQ,CACT,CAAC;IAEF,MAAMC,eAAe,GAAGA,CAACvB,QAAgB,EAAEwB,QAAgB,KAAc;MACvE,IAAIH,iBAAiB,CAACI,GAAG,CAACD,QAAQ,CAAC,EAAE;QACnC,OAAO,IAAI;MACb;MACA,KAAK,MAAME,OAAO,IAAIN,gBAAgB,EAAE;QACtC,IAAIM,OAAO,CAACC,IAAI,CAAC3B,QAAQ,CAAC,EAAE;UAC1B,OAAO,IAAI;QACb;MACF;MACA,OAAO,KAAK;IACd,CAAC;IAED,MAAM4B,aAAa,GAAI5B,QAAgB,IAAc;MACnD,KAAK,MAAM0B,OAAO,IAAIN,gBAAgB,EAAE;QACtC,IAAIM,OAAO,CAACC,IAAI,CAAC3B,QAAQ,CAAC,EAAE;UAC1B,OAAO,KAAK;QACd;MACF;MACA,OACE,uBAAuB,CAAC2B,IAAI,CAAC3B,QAAQ,CAAC,IAAI,CAAC,cAAc,CAAC2B,IAAI,CAAC3B,QAAQ,CAAC;IAE5E,CAAC;IAED,MAAM6B,4BAA4B,GAAI7B,QAAgB,IAAoB;MACxE,MAAM8B,KAAK,GAAG9B,QAAQ,CAAC8B,KAAK,CAAC,wCAAwC,CAAC;MACtE,IAAIA,KAAK,EAAE;QACT,OAAOA,KAAK,CAAC,CAAC,CAAC;MACjB;MACA,MAAMC,MAAM,GAAG/B,QAAQ,CAAC8B,KAAK,CAAC,wCAAwC,CAAC;MACvE,IAAIC,MAAM,EAAE;QACV,OAAOA,MAAM,CAAC,CAAC,CAAC;MAClB;MACA,OAAO,IAAI;IACb,CAAC;IAED,MAAMC,QAAQ,GAAGC,IAAI,CAACC,GAAG,CAACf,KAAK,CAACgB,MAAM,EAAE,EAAE,CAAC;IAE3C,KAAK,IAAIC,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGJ,QAAQ,EAAEI,CAAC,EAAE,EAAE;MACjC,MAAMC,IAAI,GAAGlB,KAAK,CAACiB,CAAC,CAAC;MAErB,MAAME,WAAW,GAAGD,IAAI,CAACP,KAAK,CAAC,yCAAyC,CAAC;MACzE,IAAIQ,WAAW,EAAE;QACf,MAAM,GAAGd,QAAQ,EAAExB,QAAQ,EAAEuC,OAAO,EAAEC,MAAM,CAAC,GAAGF,WAAW;QAC3D,IAAI,CAACf,eAAe,CAACvB,QAAQ,EAAEwB,QAAQ,CAAC,EAAE;UACxC,OAAO;YACLN,aAAa,EAAEM,QAAQ;YACvBxB,QAAQ;YACRE,UAAU,EAAEuC,MAAM,CAACC,QAAQ,CAACH,OAAO,EAAE,EAAE,CAAC;YACxCpC,YAAY,EAAEsC,MAAM,CAACC,QAAQ,CAACF,MAAM,EAAE,EAAE;UAC1C,CAAC;QACH;QACA;MACF;MAEA,MAAMG,YAAY,GAAGN,IAAI,CAACP,KAAK,CAAC,8BAA8B,CAAC;MAC/D,IAAIa,YAAY,EAAE;QAChB,MAAM,GAAGnB,QAAQ,EAAExB,QAAQ,EAAEuC,OAAO,EAAEC,MAAM,CAAC,GAAGG,YAAY;QAC5D,IAAI,CAACpB,eAAe,CAACvB,QAAQ,EAAEwB,QAAQ,CAAC,EAAE;UACxC,OAAO;YACLN,aAAa,EAAEM,QAAQ;YACvBxB,QAAQ;YACRE,UAAU,EAAEuC,MAAM,CAACC,QAAQ,CAACH,OAAO,EAAE,EAAE,CAAC;YACxCpC,YAAY,EAAEsC,MAAM,CAACC,QAAQ,CAACF,MAAM,EAAE,EAAE;UAC1C,CAAC;QACH;QACA;MACF;IACF;IAEA,KAAK,IAAIJ,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGJ,QAAQ,EAAEI,CAAC,EAAE,EAAE;MACjC,MAAMC,IAAI,GAAGlB,KAAK,CAACiB,CAAC,CAAC;MAErB,MAAMQ,SAAS,GAAGP,IAAI,CAACP,KAAK,CAC1B,4DACF,CAAC;MACD,IAAIc,SAAS,EAAE;QACb,MAAM5C,QAAQ,GAAG4C,SAAS,CAAC,CAAC,CAAC,IAAIA,SAAS,CAAC,CAAC,CAAC;QAC7C,IAAIhB,aAAa,CAAC5B,QAAQ,CAAC,EAAE;UAC3B,MAAMkB,aAAa,GAAGW,4BAA4B,CAAC7B,QAAQ,CAAC;UAC5D,IAAIkB,aAAa,EAAE;YACjB,MAAM2B,aAAa,GAAG7C,QAAQ,CAAC8B,KAAK,CAAC,eAAe,CAAC;YACrD,OAAO;cACLZ,aAAa;cACblB,QAAQ;cACRE,UAAU,EAAE2C,aAAa,GACrBJ,MAAM,CAACC,QAAQ,CAACG,aAAa,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GACrCjC,SAAS;cACbT,YAAY,EAAE0C,aAAa,GACvBJ,MAAM,CAACC,QAAQ,CAACG,aAAa,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GACrCjC;YACN,CAAC;UACH;QACF;MACF;IACF;IAEA,KAAK,IAAIwB,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGJ,QAAQ,EAAEI,CAAC,EAAE,EAAE;MACjC,MAAMC,IAAI,GAAGlB,KAAK,CAACiB,CAAC,CAAC;MAErB,MAAMU,YAAY,GAAGT,IAAI,CAACP,KAAK,CAAC,oCAAoC,CAAC;MACrE,IAAIgB,YAAY,EAAE;QAChB,MAAM,GAAGtB,QAAQ,EAAExB,QAAQ,EAAEuC,OAAO,EAAEC,MAAM,CAAC,GAAGM,YAAY;QAC5D,IACEtB,QAAQ,CAACW,MAAM,IAAI,CAAC,IACpB,CAACd,iBAAiB,CAACI,GAAG,CAACD,QAAQ,CAAC,IAChCI,aAAa,CAAC5B,QAAQ,CAAC,EACvB;UACA,MAAM+C,QAAQ,GAAGlB,4BAA4B,CAAC7B,QAAQ,CAAC;UACvD,OAAO;YACLkB,aAAa,EAAE6B,QAAQ,IAAIvB,QAAQ;YACnCxB,QAAQ;YACRE,UAAU,EAAEuC,MAAM,CAACC,QAAQ,CAACH,OAAO,EAAE,EAAE,CAAC;YACxCpC,YAAY,EAAEsC,MAAM,CAACC,QAAQ,CAACF,MAAM,EAAE,EAAE;UAC1C,CAAC;QACH;MACF;IACF;IAEA,KAAK,IAAIJ,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGJ,QAAQ,EAAEI,CAAC,EAAE,EAAE;MACjC,MAAMC,IAAI,GAAGlB,KAAK,CAACiB,CAAC,CAAC;MACrB,MAAMY,SAAS,GAAGX,IAAI,CAACP,KAAK,CAAC,iBAAiB,CAAC;MAC/C,IAAIkB,SAAS,EAAE;QACb,MAAMxB,QAAQ,GAAGwB,SAAS,CAAC,CAAC,CAAC;QAC7B,IAAI,CAAC3B,iBAAiB,CAACI,GAAG,CAACD,QAAQ,CAAC,EAAE;UACpC,OAAO;YAAEN,aAAa,EAAEM;UAAS,CAAC;QACpC;MACF;IACF;IAEA,OAAO;MAAEN,aAAa,EAAE;IAAK,CAAC;EAChC;EAEA+B,OAAOA,CAAA,EAAS;IACd,IAAI,CAAC5D,OAAO,GAAG,KAAK;EACtB;EAEA6D,MAAMA,CAAA,EAAS;IACb,IAAI,CAAC7D,OAAO,GAAG,IAAI;EACrB;EAEA8D,UAAUA,CAAA,EAAS;IACjB,IAAI,CAACjE,SAAS,GAAG,IAAIC,OAAO,CAAC,CAAC;EAChC;AACF;AAEA,OAAO,MAAMiE,uBAAgD,GAC3D,IAAInE,uBAAuB,CAAC,CAAC","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"ComponentContextCapture.js","names":["getComponentId","getComponentName","getSourceLocation","ComponentContextCapture","fiberToId","WeakMap","idCounter","enabled","captureNow","tryStackTraceAnalysis","contextFromFiber","fiber","id","getComponentIdForFiber","name","displayName","getFiberDisplayName","sourceLocation","filePath","fileName","lineNumber","columnNumber","stackTrace","get","shortPath","split","slice","join","set","type","undefined","error","Error","stack","parsed","parseStackTrace","componentName","lines","internalPatterns","internalFuncNames","Set","isInternalFrame","funcName","has","pattern","test","isAppFilePath","extractComponentNameFromPath","match","match2","maxLines","Math","min","length","i","line","chromeMatch","lineNum","colNum","Number","parseInt","firefoxMatch","fileMatch","locationMatch","anyFuncMatch","pathName","nameMatch","disable","enable","clearCache","componentContextCapture"],"sources":["ComponentContextCapture.ts"],"sourcesContent":["/*\n * Copyright 2025 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n getComponentId,\n getComponentName,\n getSourceLocation,\n} from \"../fiber/FiberInspection.js\";\nimport type { Fiber } from \"../fiber/types.js\";\n\nexport interface ComponentContext {\n id: string;\n name: string;\n displayName?: string;\n filePath?: string;\n lineNumber?: number;\n columnNumber?: number;\n stackTrace: string;\n}\n\nexport class ComponentContextCapture {\n private fiberToId = new WeakMap<Fiber, string>();\n private idCounter = 0;\n private enabled = true;\n\n captureNow(): ComponentContext | null {\n if (!this.enabled) {\n return null;\n }\n\n return this.tryStackTraceAnalysis();\n }\n\n /**\n * Extract context from a fiber node when one is available.\n * Only use this at click-time when we have a fiber from DOM element.\n */\n contextFromFiber(fiber: Fiber): ComponentContext {\n const id = this.getComponentIdForFiber(fiber);\n const name = getComponentName(fiber);\n const displayName = this.getFiberDisplayName(fiber);\n const sourceLocation = getSourceLocation(fiber);\n\n return {\n id,\n name,\n displayName,\n filePath: sourceLocation?.fileName,\n lineNumber: sourceLocation?.lineNumber,\n columnNumber: sourceLocation?.columnNumber,\n stackTrace: \"\",\n };\n }\n\n getComponentIdForFiber(fiber: Fiber): string {\n let id = this.fiberToId.get(fiber);\n if (!id) {\n id = getComponentId(fiber);\n\n // If no stable ID available, generate one\n if (!id || id === \"unknown-0\") {\n const name = getComponentName(fiber);\n const sourceLocation = getSourceLocation(fiber);\n\n if (sourceLocation) {\n const shortPath =\n sourceLocation.fileName?.split(\"/\").slice(-2).join(\"/\") ||\n \"unknown\";\n id = `fiber-${name}-${shortPath}-${sourceLocation.lineNumber || 0}`;\n } else {\n id = `fiber-${name}-${this.idCounter++}`;\n }\n }\n\n this.fiberToId.set(fiber, id);\n }\n return id;\n }\n\n private getFiberDisplayName(fiber: Fiber): string | undefined {\n if (\n typeof fiber.type === \"function\" &&\n \"displayName\" in fiber.type &&\n typeof fiber.type.displayName === \"string\"\n ) {\n return fiber.type.displayName;\n }\n return undefined;\n }\n\n private tryStackTraceAnalysis(): ComponentContext | null {\n const error = new Error();\n const stack = error.stack || \"\";\n\n const parsed = this.parseStackTrace(stack);\n\n const shortPath =\n parsed.filePath?.split(\"/\").slice(-2).join(\"/\") || \"unknown\";\n const id = `stack-${parsed.componentName || \"Unknown\"}-${shortPath}-${\n parsed.lineNumber || 0\n }`;\n\n return {\n id,\n name: parsed.componentName || \"Unknown\",\n filePath: parsed.filePath,\n lineNumber: parsed.lineNumber,\n columnNumber: parsed.columnNumber,\n stackTrace: stack,\n };\n }\n\n private parseStackTrace(stack: string): {\n componentName: string | null;\n filePath?: string;\n lineNumber?: number;\n columnNumber?: number;\n } {\n const lines = stack.split(\"\\n\");\n\n const internalPatterns = [\n /node_modules/u,\n /@osdk\\/react/u,\n /react-devtools/u,\n /ComponentContextCapture/u,\n /ObservableClientMonitor/u,\n /ComponentQueryRegistry/u,\n /packages\\/react\\/build/u,\n /packages\\/react\\/esm/u,\n /packages\\/react\\/src/u,\n /Proxy/u,\n ];\n\n const internalFuncNames = new Set([\n \"Proxy\",\n \"ComponentContextCapture\",\n \"Object\",\n \"Array\",\n \"Function\",\n \"Promise\",\n \"eval\",\n \"anonymous\",\n \"Module\",\n ]);\n\n const isInternalFrame = (filePath: string, funcName: string): boolean => {\n if (internalFuncNames.has(funcName)) {\n return true;\n }\n for (const pattern of internalPatterns) {\n if (pattern.test(filePath)) {\n return true;\n }\n }\n return false;\n };\n\n const isAppFilePath = (filePath: string): boolean => {\n for (const pattern of internalPatterns) {\n if (pattern.test(filePath)) {\n return false;\n }\n }\n return (\n /\\.(tsx?|jsx?)(\\?|:|$)/u.test(filePath) &&\n !/node_modules/u.test(filePath)\n );\n };\n\n const extractComponentNameFromPath = (filePath: string): string | null => {\n const match = filePath.match(/\\/([A-Z][a-zA-Z0-9]*)\\.(tsx?|jsx?)[?:]/u);\n if (match) {\n return match[1];\n }\n const match2 = filePath.match(/([A-Z][a-zA-Z0-9]*)\\.(tsx?|jsx?)[?:]?$/u);\n if (match2) {\n return match2[1];\n }\n return null;\n };\n\n const maxLines = Math.min(lines.length, 40);\n\n for (let i = 3; i < maxLines; i++) {\n const line = lines[i];\n\n const chromeMatch = line.match(\n /at\\s+([A-Z]\\w+)\\s+\\((.*?):(\\d+):(\\d+)\\)/u\n );\n if (chromeMatch) {\n const [, funcName, filePath, lineNum, colNum] = chromeMatch;\n if (!isInternalFrame(filePath, funcName)) {\n return {\n componentName: funcName,\n filePath,\n lineNumber: Number.parseInt(lineNum, 10),\n columnNumber: Number.parseInt(colNum, 10),\n };\n }\n continue;\n }\n\n const firefoxMatch = line.match(/([A-Z]\\w+)@(.*?):(\\d+):(\\d+)/u);\n if (firefoxMatch) {\n const [, funcName, filePath, lineNum, colNum] = firefoxMatch;\n if (!isInternalFrame(filePath, funcName)) {\n return {\n componentName: funcName,\n filePath,\n lineNumber: Number.parseInt(lineNum, 10),\n columnNumber: Number.parseInt(colNum, 10),\n };\n }\n continue;\n }\n }\n\n for (let i = 3; i < maxLines; i++) {\n const line = lines[i];\n\n const fileMatch = line.match(\n /\\((https?:\\/\\/[^)]+|\\/[^)]+)\\)|at\\s+(https?:\\/\\/\\S+|\\/\\S+)/u\n );\n if (fileMatch) {\n const filePath = fileMatch[1] || fileMatch[2];\n if (isAppFilePath(filePath)) {\n const componentName = extractComponentNameFromPath(filePath);\n if (componentName) {\n const locationMatch = filePath.match(/:(\\d+):(\\d+)$/u);\n return {\n componentName,\n filePath,\n lineNumber: locationMatch\n ? Number.parseInt(locationMatch[1], 10)\n : undefined,\n columnNumber: locationMatch\n ? Number.parseInt(locationMatch[2], 10)\n : undefined,\n };\n }\n }\n }\n }\n\n for (let i = 3; i < maxLines; i++) {\n const line = lines[i];\n\n const anyFuncMatch = line.match(/at\\s+(\\w+)\\s+\\((.*?):(\\d+):(\\d+)\\)/u);\n if (anyFuncMatch) {\n const [, funcName, filePath, lineNum, colNum] = anyFuncMatch;\n if (\n funcName.length >= 3 &&\n !internalFuncNames.has(funcName) &&\n isAppFilePath(filePath)\n ) {\n const pathName = extractComponentNameFromPath(filePath);\n return {\n componentName: pathName || funcName,\n filePath,\n lineNumber: Number.parseInt(lineNum, 10),\n columnNumber: Number.parseInt(colNum, 10),\n };\n }\n }\n }\n\n for (let i = 3; i < maxLines; i++) {\n const line = lines[i];\n const nameMatch = line.match(/at\\s+([A-Z]\\w+)/u);\n if (nameMatch) {\n const funcName = nameMatch[1];\n if (!internalFuncNames.has(funcName)) {\n return { componentName: funcName };\n }\n }\n }\n\n return { componentName: null };\n }\n\n disable(): void {\n this.enabled = false;\n }\n\n enable(): void {\n this.enabled = true;\n }\n\n clearCache(): void {\n this.fiberToId = new WeakMap();\n }\n}\n\nexport const componentContextCapture: ComponentContextCapture =\n new ComponentContextCapture();\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -14,9 +14,9 @@
|
|
|
14
14
|
* limitations under the License.
|
|
15
15
|
*/
|
|
16
16
|
|
|
17
|
-
const INTERNAL_FRAME_PATTERNS = [/node_modules
|
|
18
|
-
const CHROME_STACK_RE = /\((.*?):(\d+):(\d+)\)
|
|
19
|
-
const FIREFOX_STACK_RE = /@(.*?):(\d+):(\d+)
|
|
17
|
+
const INTERNAL_FRAME_PATTERNS = [/node_modules/u, /@osdk\/react/u, /react-devtools/u, /ComponentContextCapture/u, /ObservableClientMonitor/u, /ComponentQueryRegistry/u, /packages\/react\/build/u, /packages\/react\/esm/u, /packages\/react\/src/u];
|
|
18
|
+
const CHROME_STACK_RE = /\((.*?):(\d+):(\d+)\)/u;
|
|
19
|
+
const FIREFOX_STACK_RE = /@(.*?):(\d+):(\d+)/u;
|
|
20
20
|
function isInternalFrame(filePath) {
|
|
21
21
|
for (const pattern of INTERNAL_FRAME_PATTERNS) {
|
|
22
22
|
if (pattern.test(filePath)) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ComponentQueryRegistry.js","names":["INTERNAL_FRAME_PATTERNS","CHROME_STACK_RE","FIREFOX_STACK_RE","isInternalFrame","filePath","pattern","test","ComponentQueryRegistry","bindings","Map","componentToBindings","queryToBindings","subscriptionToBinding","bindingIdCounter","changeVersion","changeListeners","Set","getVersion","subscribe","listener","add","delete","notifyChange","registerBinding","options","existingBindings","get","componentId","existingId","existing","hookType","querySignature","unmountedAt","bindingId","stack","Error","location","parseStackTrace","binding","subscriptionId","stackTrace","file","lineNumber","line","columnNumber","column","mountedAt","Date","now","renderCount","lastRenderDuration","avgRenderDuration","set","has","componentBindings","queryBindings","linkSubscription","unregisterComponent","bindingIds","recordRender","duration","getComponentBindings","map","id","filter","b","undefined","getQuerySubscribers","getBindingBySubscription","getActiveComponents","result","length","lines","split","i","Math","min","chromeMatch","match","Number","parseInt","firefoxMatch","updateFromFiberDiscovery","discovered","seenComponentIds","component","existingBindingIds","size","componentName","hookMeta","hooks","buildQuerySignature","mapHookType","queryParams","buildQueryParams","hookIndex","objectType","primaryKey","JSON","stringify","where","orderBy","actionName","sourceObjectType","linkName","aggregate","type","pageSize","sourceObject","cleanupOldBindings","maxAgeMs","cleanedCount","entries","clear","getStats","activeBindings","unmountedBindings","values","totalBindings","components","queries","getAllBindings"],"sources":["ComponentQueryRegistry.ts"],"sourcesContent":["/*\n * Copyright 2025 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type { DiscoveredComponent } from \"../fiber/HookStateInspector.js\";\n\nexport interface ComponentHookBinding {\n componentId: string;\n componentName: string;\n componentDisplayName?: string;\n\n hookType:\n | \"useOsdkObject\"\n | \"useOsdkObjects\"\n | \"useOsdkAction\"\n | \"useOsdkAggregation\"\n | \"useLinks\"\n | \"useObjectSet\";\n hookIndex: number;\n\n subscriptionId: string;\n querySignature: string;\n queryParams: QueryParams;\n\n stackTrace: string;\n filePath?: string;\n lineNumber?: number;\n columnNumber?: number;\n mountedAt: number;\n unmountedAt?: number;\n renderCount: number;\n\n lastRenderDuration: number;\n avgRenderDuration: number;\n}\n\nexport type QueryParams =\n | { type: \"object\"; objectType: string; primaryKey: string }\n | {\n type: \"list\";\n objectType: string;\n where?: unknown;\n orderBy?: unknown;\n pageSize?: number;\n }\n | { type: \"action\"; actionName: string }\n | { type: \"links\"; sourceObject: string; linkName: string }\n | { type: \"objectSet\"; baseObjectSet: string; operations: unknown[] }\n | {\n type: \"aggregation\";\n objectType: string;\n where?: unknown;\n aggregate?: unknown;\n };\n\nconst INTERNAL_FRAME_PATTERNS = [\n /node_modules/,\n /@osdk\\/react/,\n /react-devtools/,\n /ComponentContextCapture/,\n /ObservableClientMonitor/,\n /ComponentQueryRegistry/,\n /packages\\/react\\/build/,\n /packages\\/react\\/esm/,\n /packages\\/react\\/src/,\n];\n\nconst CHROME_STACK_RE = /\\((.*?):(\\d+):(\\d+)\\)/;\nconst FIREFOX_STACK_RE = /@(.*?):(\\d+):(\\d+)/;\n\nfunction isInternalFrame(filePath: string): boolean {\n for (const pattern of INTERNAL_FRAME_PATTERNS) {\n if (pattern.test(filePath)) {\n return true;\n }\n }\n return false;\n}\n\nexport class ComponentQueryRegistry {\n private bindings = new Map<string, ComponentHookBinding>();\n private componentToBindings = new Map<string, Set<string>>();\n private queryToBindings = new Map<string, Set<string>>();\n private subscriptionToBinding = new Map<string, string>();\n\n private bindingIdCounter = 0;\n private changeVersion = 0;\n private changeListeners = new Set<() => void>();\n\n getVersion(): number {\n return this.changeVersion;\n }\n\n subscribe(listener: () => void): () => void {\n this.changeListeners.add(listener);\n return () => this.changeListeners.delete(listener);\n }\n\n private notifyChange(): void {\n this.changeVersion++;\n for (const listener of this.changeListeners) {\n listener();\n }\n }\n\n registerBinding(options: {\n componentId: string;\n componentName: string;\n componentDisplayName?: string;\n hookType: ComponentHookBinding[\"hookType\"];\n hookIndex: number;\n querySignature: string;\n queryParams: QueryParams;\n subscriptionId?: string;\n }): string {\n const existingBindings = this.componentToBindings.get(options.componentId);\n if (existingBindings) {\n for (const existingId of existingBindings) {\n const existing = this.bindings.get(existingId);\n if (\n existing &&\n existing.hookType === options.hookType &&\n existing.querySignature === options.querySignature &&\n !existing.unmountedAt\n ) {\n return existingId;\n }\n }\n }\n\n const bindingId = `binding-${this.bindingIdCounter++}`;\n\n const stack = new Error().stack || \"\";\n const location = this.parseStackTrace(stack);\n\n const binding: ComponentHookBinding = {\n ...options,\n subscriptionId: options.subscriptionId || \"\",\n stackTrace: stack,\n filePath: location.file,\n lineNumber: location.line,\n columnNumber: location.column,\n mountedAt: Date.now(),\n renderCount: 0,\n lastRenderDuration: 0,\n avgRenderDuration: 0,\n };\n\n this.bindings.set(bindingId, binding);\n\n if (!this.componentToBindings.has(options.componentId)) {\n this.componentToBindings.set(options.componentId, new Set());\n }\n const componentBindings = this.componentToBindings.get(options.componentId);\n if (componentBindings) {\n componentBindings.add(bindingId);\n }\n\n if (!this.queryToBindings.has(options.querySignature)) {\n this.queryToBindings.set(options.querySignature, new Set());\n }\n const queryBindings = this.queryToBindings.get(options.querySignature);\n if (queryBindings) {\n queryBindings.add(bindingId);\n }\n\n if (options.subscriptionId) {\n this.subscriptionToBinding.set(options.subscriptionId, bindingId);\n }\n\n this.notifyChange();\n return bindingId;\n }\n\n linkSubscription(bindingId: string, subscriptionId: string): void {\n const binding = this.bindings.get(bindingId);\n if (!binding) return;\n\n binding.subscriptionId = subscriptionId;\n this.subscriptionToBinding.set(subscriptionId, bindingId);\n }\n\n unregisterComponent(componentId: string): void {\n const bindingIds = this.componentToBindings.get(componentId);\n if (!bindingIds) {\n return;\n }\n\n const now = Date.now();\n for (const bindingId of bindingIds) {\n const binding = this.bindings.get(bindingId);\n if (binding) {\n binding.unmountedAt = now;\n }\n }\n this.notifyChange();\n }\n\n recordRender(componentId: string, duration: number): void {\n const bindingIds = this.componentToBindings.get(componentId);\n if (!bindingIds) return;\n\n for (const bindingId of bindingIds) {\n const binding = this.bindings.get(bindingId);\n if (binding && !binding.unmountedAt) {\n binding.renderCount++;\n binding.lastRenderDuration = duration;\n binding.avgRenderDuration =\n (binding.avgRenderDuration * (binding.renderCount - 1) + duration) /\n binding.renderCount;\n }\n }\n }\n\n getComponentBindings(componentId: string): ComponentHookBinding[] {\n const bindingIds = this.componentToBindings.get(componentId);\n if (!bindingIds) return [];\n\n return [...bindingIds]\n .map((id) => this.bindings.get(id))\n .filter((b): b is ComponentHookBinding => b !== undefined);\n }\n\n getQuerySubscribers(querySignature: string): ComponentHookBinding[] {\n const bindingIds = this.queryToBindings.get(querySignature);\n if (!bindingIds) return [];\n\n return [...bindingIds]\n .map((id) => this.bindings.get(id))\n .filter((b): b is ComponentHookBinding => b !== undefined)\n .filter((b) => !b.unmountedAt);\n }\n\n getBindingBySubscription(\n subscriptionId: string\n ): ComponentHookBinding | undefined {\n const bindingId = this.subscriptionToBinding.get(subscriptionId);\n return bindingId ? this.bindings.get(bindingId) : undefined;\n }\n\n getActiveComponents(): Map<string, ComponentHookBinding[]> {\n const result = new Map<string, ComponentHookBinding[]>();\n\n for (const [componentId, bindingIds] of this.componentToBindings) {\n const bindings = [...bindingIds]\n .map((id) => this.bindings.get(id))\n .filter(\n (b): b is ComponentHookBinding => b !== undefined && !b.unmountedAt\n );\n\n if (bindings.length > 0) {\n result.set(componentId, bindings);\n }\n }\n\n return result;\n }\n\n private parseStackTrace(stack: string): {\n file?: string;\n line?: number;\n column?: number;\n } {\n const lines = stack.split(\"\\n\");\n\n for (let i = 3; i < Math.min(lines.length, 25); i++) {\n const line = lines[i];\n\n const chromeMatch = line.match(CHROME_STACK_RE);\n if (chromeMatch) {\n const filePath = chromeMatch[1];\n if (!isInternalFrame(filePath)) {\n return {\n file: filePath,\n line: Number.parseInt(chromeMatch[2], 10),\n column: Number.parseInt(chromeMatch[3], 10),\n };\n }\n continue;\n }\n\n const firefoxMatch = line.match(FIREFOX_STACK_RE);\n if (firefoxMatch) {\n const filePath = firefoxMatch[1];\n if (!isInternalFrame(filePath)) {\n return {\n file: filePath,\n line: Number.parseInt(firefoxMatch[2], 10),\n column: Number.parseInt(firefoxMatch[3], 10),\n };\n }\n continue;\n }\n }\n\n return {};\n }\n\n updateFromFiberDiscovery(discovered: Map<string, DiscoveredComponent>): void {\n const seenComponentIds = new Set<string>();\n\n for (const [componentId, component] of discovered) {\n seenComponentIds.add(componentId);\n\n const existingBindingIds = this.componentToBindings.get(componentId);\n\n if (existingBindingIds && existingBindingIds.size > 0) {\n for (const bindingId of existingBindingIds) {\n const binding = this.bindings.get(bindingId);\n if (binding && !binding.unmountedAt) {\n binding.componentName = component.componentName;\n }\n }\n } else {\n for (const hookMeta of component.hooks) {\n const querySignature = this.buildQuerySignature(hookMeta);\n const hookType = this.mapHookType(hookMeta.hookType);\n const queryParams = this.buildQueryParams(hookMeta);\n\n this.registerBinding({\n componentId,\n componentName: component.componentName,\n hookType,\n hookIndex: 0,\n querySignature,\n queryParams,\n });\n }\n }\n }\n\n const now = Date.now();\n for (const [componentId, bindingIds] of this.componentToBindings) {\n if (!seenComponentIds.has(componentId)) {\n for (const bindingId of bindingIds) {\n const binding = this.bindings.get(bindingId);\n if (binding && !binding.unmountedAt) {\n binding.unmountedAt = now;\n }\n }\n }\n }\n }\n\n private buildQuerySignature(\n hookMeta: DiscoveredComponent[\"hooks\"][0]\n ): string {\n switch (hookMeta.hookType) {\n case \"useOsdkObject\":\n return `object:${hookMeta.objectType}:${hookMeta.primaryKey}`;\n case \"useOsdkObjects\":\n return `useOsdkObjects:${hookMeta.objectType}:${JSON.stringify(\n hookMeta.where\n )}:${JSON.stringify(hookMeta.orderBy)}`;\n case \"useOsdkAction\":\n return `action:${hookMeta.actionName}`;\n case \"useLinks\":\n return `links:${hookMeta.sourceObjectType || \"unknown\"}:${\n hookMeta.linkName || \"unknown\"\n }`;\n case \"useOsdkAggregation\":\n return `aggregation:${hookMeta.objectType}:${JSON.stringify(\n hookMeta.aggregate\n )}`;\n default:\n return `unknown:${JSON.stringify(hookMeta)}`;\n }\n }\n\n private mapHookType(\n hookType: DiscoveredComponent[\"hooks\"][0][\"hookType\"]\n ): ComponentHookBinding[\"hookType\"] {\n switch (hookType) {\n case \"useOsdkObject\":\n return \"useOsdkObject\";\n case \"useOsdkObjects\":\n return \"useOsdkObjects\";\n case \"useOsdkAction\":\n return \"useOsdkAction\";\n case \"useLinks\":\n return \"useLinks\";\n case \"useOsdkAggregation\":\n return \"useOsdkAggregation\";\n default:\n return \"useOsdkObject\";\n }\n }\n\n private buildQueryParams(\n hookMeta: DiscoveredComponent[\"hooks\"][0]\n ): QueryParams {\n switch (hookMeta.hookType) {\n case \"useOsdkObject\":\n return {\n type: \"object\",\n objectType: hookMeta.objectType || \"Unknown\",\n primaryKey: hookMeta.primaryKey || \"\",\n };\n case \"useOsdkObjects\":\n return {\n type: \"list\",\n objectType: hookMeta.objectType || \"Unknown\",\n where: hookMeta.where,\n orderBy: hookMeta.orderBy,\n pageSize: hookMeta.pageSize,\n };\n case \"useOsdkAction\":\n return {\n type: \"action\",\n actionName: hookMeta.actionName || \"Unknown\",\n };\n case \"useLinks\":\n return {\n type: \"links\",\n sourceObject: hookMeta.sourceObjectType || \"Unknown\",\n linkName: hookMeta.linkName || \"Unknown\",\n };\n case \"useOsdkAggregation\":\n return {\n type: \"aggregation\",\n objectType: hookMeta.objectType || \"Unknown\",\n where: hookMeta.where,\n aggregate: hookMeta.aggregate,\n };\n default:\n return {\n type: \"object\",\n objectType: \"Unknown\",\n primaryKey: \"\",\n };\n }\n }\n\n cleanupOldBindings(maxAgeMs: number = 5 * 60 * 1000): number {\n const now = Date.now();\n let cleanedCount = 0;\n\n for (const [bindingId, binding] of this.bindings.entries()) {\n if (binding.unmountedAt && now - binding.unmountedAt > maxAgeMs) {\n this.bindings.delete(bindingId);\n\n this.componentToBindings.get(binding.componentId)?.delete(bindingId);\n this.queryToBindings.get(binding.querySignature)?.delete(bindingId);\n if (binding.subscriptionId) {\n this.subscriptionToBinding.delete(binding.subscriptionId);\n }\n\n cleanedCount++;\n }\n }\n\n return cleanedCount;\n }\n\n clear(): void {\n this.bindings.clear();\n this.componentToBindings.clear();\n this.queryToBindings.clear();\n this.subscriptionToBinding.clear();\n }\n\n getStats(): {\n totalBindings: number;\n activeBindings: number;\n unmountedBindings: number;\n components: number;\n queries: number;\n } {\n let activeBindings = 0;\n let unmountedBindings = 0;\n\n for (const binding of this.bindings.values()) {\n if (binding.unmountedAt) {\n unmountedBindings++;\n } else {\n activeBindings++;\n }\n }\n\n return {\n totalBindings: this.bindings.size,\n activeBindings,\n unmountedBindings,\n components: this.componentToBindings.size,\n queries: this.queryToBindings.size,\n };\n }\n\n getAllBindings(): ComponentHookBinding[] {\n return [...this.bindings.values()];\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"ComponentQueryRegistry.js","names":["INTERNAL_FRAME_PATTERNS","CHROME_STACK_RE","FIREFOX_STACK_RE","isInternalFrame","filePath","pattern","test","ComponentQueryRegistry","bindings","Map","componentToBindings","queryToBindings","subscriptionToBinding","bindingIdCounter","changeVersion","changeListeners","Set","getVersion","subscribe","listener","add","delete","notifyChange","registerBinding","options","existingBindings","get","componentId","existingId","existing","hookType","querySignature","unmountedAt","bindingId","stack","Error","location","parseStackTrace","binding","subscriptionId","stackTrace","file","lineNumber","line","columnNumber","column","mountedAt","Date","now","renderCount","lastRenderDuration","avgRenderDuration","set","has","componentBindings","queryBindings","linkSubscription","unregisterComponent","bindingIds","recordRender","duration","getComponentBindings","map","id","filter","b","undefined","getQuerySubscribers","getBindingBySubscription","getActiveComponents","result","length","lines","split","i","Math","min","chromeMatch","match","Number","parseInt","firefoxMatch","updateFromFiberDiscovery","discovered","seenComponentIds","component","existingBindingIds","size","componentName","hookMeta","hooks","buildQuerySignature","mapHookType","queryParams","buildQueryParams","hookIndex","objectType","primaryKey","JSON","stringify","where","orderBy","actionName","sourceObjectType","linkName","aggregate","type","pageSize","sourceObject","cleanupOldBindings","maxAgeMs","cleanedCount","entries","clear","getStats","activeBindings","unmountedBindings","values","totalBindings","components","queries","getAllBindings"],"sources":["ComponentQueryRegistry.ts"],"sourcesContent":["/*\n * Copyright 2025 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type { DiscoveredComponent } from \"../fiber/HookStateInspector.js\";\n\nexport interface ComponentHookBinding {\n componentId: string;\n componentName: string;\n componentDisplayName?: string;\n\n hookType:\n | \"useOsdkObject\"\n | \"useOsdkObjects\"\n | \"useOsdkAction\"\n | \"useOsdkAggregation\"\n | \"useLinks\"\n | \"useObjectSet\";\n hookIndex: number;\n\n subscriptionId: string;\n querySignature: string;\n queryParams: QueryParams;\n\n stackTrace: string;\n filePath?: string;\n lineNumber?: number;\n columnNumber?: number;\n mountedAt: number;\n unmountedAt?: number;\n renderCount: number;\n\n lastRenderDuration: number;\n avgRenderDuration: number;\n}\n\nexport type QueryParams =\n | { type: \"object\"; objectType: string; primaryKey: string }\n | {\n type: \"list\";\n objectType: string;\n where?: unknown;\n orderBy?: unknown;\n pageSize?: number;\n }\n | { type: \"action\"; actionName: string }\n | { type: \"links\"; sourceObject: string; linkName: string }\n | { type: \"objectSet\"; baseObjectSet: string; operations: unknown[] }\n | {\n type: \"aggregation\";\n objectType: string;\n where?: unknown;\n aggregate?: unknown;\n };\n\nconst INTERNAL_FRAME_PATTERNS = [\n /node_modules/u,\n /@osdk\\/react/u,\n /react-devtools/u,\n /ComponentContextCapture/u,\n /ObservableClientMonitor/u,\n /ComponentQueryRegistry/u,\n /packages\\/react\\/build/u,\n /packages\\/react\\/esm/u,\n /packages\\/react\\/src/u,\n];\n\nconst CHROME_STACK_RE = /\\((.*?):(\\d+):(\\d+)\\)/u;\nconst FIREFOX_STACK_RE = /@(.*?):(\\d+):(\\d+)/u;\n\nfunction isInternalFrame(filePath: string): boolean {\n for (const pattern of INTERNAL_FRAME_PATTERNS) {\n if (pattern.test(filePath)) {\n return true;\n }\n }\n return false;\n}\n\nexport class ComponentQueryRegistry {\n private bindings = new Map<string, ComponentHookBinding>();\n private componentToBindings = new Map<string, Set<string>>();\n private queryToBindings = new Map<string, Set<string>>();\n private subscriptionToBinding = new Map<string, string>();\n\n private bindingIdCounter = 0;\n private changeVersion = 0;\n private changeListeners = new Set<() => void>();\n\n getVersion(): number {\n return this.changeVersion;\n }\n\n subscribe(listener: () => void): () => void {\n this.changeListeners.add(listener);\n return () => this.changeListeners.delete(listener);\n }\n\n private notifyChange(): void {\n this.changeVersion++;\n for (const listener of this.changeListeners) {\n listener();\n }\n }\n\n registerBinding(options: {\n componentId: string;\n componentName: string;\n componentDisplayName?: string;\n hookType: ComponentHookBinding[\"hookType\"];\n hookIndex: number;\n querySignature: string;\n queryParams: QueryParams;\n subscriptionId?: string;\n }): string {\n const existingBindings = this.componentToBindings.get(options.componentId);\n if (existingBindings) {\n for (const existingId of existingBindings) {\n const existing = this.bindings.get(existingId);\n if (\n existing &&\n existing.hookType === options.hookType &&\n existing.querySignature === options.querySignature &&\n !existing.unmountedAt\n ) {\n return existingId;\n }\n }\n }\n\n const bindingId = `binding-${this.bindingIdCounter++}`;\n\n const stack = new Error().stack || \"\";\n const location = this.parseStackTrace(stack);\n\n const binding: ComponentHookBinding = {\n ...options,\n subscriptionId: options.subscriptionId || \"\",\n stackTrace: stack,\n filePath: location.file,\n lineNumber: location.line,\n columnNumber: location.column,\n mountedAt: Date.now(),\n renderCount: 0,\n lastRenderDuration: 0,\n avgRenderDuration: 0,\n };\n\n this.bindings.set(bindingId, binding);\n\n if (!this.componentToBindings.has(options.componentId)) {\n this.componentToBindings.set(options.componentId, new Set());\n }\n const componentBindings = this.componentToBindings.get(options.componentId);\n if (componentBindings) {\n componentBindings.add(bindingId);\n }\n\n if (!this.queryToBindings.has(options.querySignature)) {\n this.queryToBindings.set(options.querySignature, new Set());\n }\n const queryBindings = this.queryToBindings.get(options.querySignature);\n if (queryBindings) {\n queryBindings.add(bindingId);\n }\n\n if (options.subscriptionId) {\n this.subscriptionToBinding.set(options.subscriptionId, bindingId);\n }\n\n this.notifyChange();\n return bindingId;\n }\n\n linkSubscription(bindingId: string, subscriptionId: string): void {\n const binding = this.bindings.get(bindingId);\n if (!binding) return;\n\n binding.subscriptionId = subscriptionId;\n this.subscriptionToBinding.set(subscriptionId, bindingId);\n }\n\n unregisterComponent(componentId: string): void {\n const bindingIds = this.componentToBindings.get(componentId);\n if (!bindingIds) {\n return;\n }\n\n const now = Date.now();\n for (const bindingId of bindingIds) {\n const binding = this.bindings.get(bindingId);\n if (binding) {\n binding.unmountedAt = now;\n }\n }\n this.notifyChange();\n }\n\n recordRender(componentId: string, duration: number): void {\n const bindingIds = this.componentToBindings.get(componentId);\n if (!bindingIds) return;\n\n for (const bindingId of bindingIds) {\n const binding = this.bindings.get(bindingId);\n if (binding && !binding.unmountedAt) {\n binding.renderCount++;\n binding.lastRenderDuration = duration;\n binding.avgRenderDuration =\n (binding.avgRenderDuration * (binding.renderCount - 1) + duration) /\n binding.renderCount;\n }\n }\n }\n\n getComponentBindings(componentId: string): ComponentHookBinding[] {\n const bindingIds = this.componentToBindings.get(componentId);\n if (!bindingIds) return [];\n\n return [...bindingIds]\n .map((id) => this.bindings.get(id))\n .filter((b): b is ComponentHookBinding => b !== undefined);\n }\n\n getQuerySubscribers(querySignature: string): ComponentHookBinding[] {\n const bindingIds = this.queryToBindings.get(querySignature);\n if (!bindingIds) return [];\n\n return [...bindingIds]\n .map((id) => this.bindings.get(id))\n .filter((b): b is ComponentHookBinding => b !== undefined)\n .filter((b) => !b.unmountedAt);\n }\n\n getBindingBySubscription(\n subscriptionId: string\n ): ComponentHookBinding | undefined {\n const bindingId = this.subscriptionToBinding.get(subscriptionId);\n return bindingId ? this.bindings.get(bindingId) : undefined;\n }\n\n getActiveComponents(): Map<string, ComponentHookBinding[]> {\n const result = new Map<string, ComponentHookBinding[]>();\n\n for (const [componentId, bindingIds] of this.componentToBindings) {\n const bindings = [...bindingIds]\n .map((id) => this.bindings.get(id))\n .filter(\n (b): b is ComponentHookBinding => b !== undefined && !b.unmountedAt\n );\n\n if (bindings.length > 0) {\n result.set(componentId, bindings);\n }\n }\n\n return result;\n }\n\n private parseStackTrace(stack: string): {\n file?: string;\n line?: number;\n column?: number;\n } {\n const lines = stack.split(\"\\n\");\n\n for (let i = 3; i < Math.min(lines.length, 25); i++) {\n const line = lines[i];\n\n const chromeMatch = line.match(CHROME_STACK_RE);\n if (chromeMatch) {\n const filePath = chromeMatch[1];\n if (!isInternalFrame(filePath)) {\n return {\n file: filePath,\n line: Number.parseInt(chromeMatch[2], 10),\n column: Number.parseInt(chromeMatch[3], 10),\n };\n }\n continue;\n }\n\n const firefoxMatch = line.match(FIREFOX_STACK_RE);\n if (firefoxMatch) {\n const filePath = firefoxMatch[1];\n if (!isInternalFrame(filePath)) {\n return {\n file: filePath,\n line: Number.parseInt(firefoxMatch[2], 10),\n column: Number.parseInt(firefoxMatch[3], 10),\n };\n }\n continue;\n }\n }\n\n return {};\n }\n\n updateFromFiberDiscovery(discovered: Map<string, DiscoveredComponent>): void {\n const seenComponentIds = new Set<string>();\n\n for (const [componentId, component] of discovered) {\n seenComponentIds.add(componentId);\n\n const existingBindingIds = this.componentToBindings.get(componentId);\n\n if (existingBindingIds && existingBindingIds.size > 0) {\n for (const bindingId of existingBindingIds) {\n const binding = this.bindings.get(bindingId);\n if (binding && !binding.unmountedAt) {\n binding.componentName = component.componentName;\n }\n }\n } else {\n for (const hookMeta of component.hooks) {\n const querySignature = this.buildQuerySignature(hookMeta);\n const hookType = this.mapHookType(hookMeta.hookType);\n const queryParams = this.buildQueryParams(hookMeta);\n\n this.registerBinding({\n componentId,\n componentName: component.componentName,\n hookType,\n hookIndex: 0,\n querySignature,\n queryParams,\n });\n }\n }\n }\n\n const now = Date.now();\n for (const [componentId, bindingIds] of this.componentToBindings) {\n if (!seenComponentIds.has(componentId)) {\n for (const bindingId of bindingIds) {\n const binding = this.bindings.get(bindingId);\n if (binding && !binding.unmountedAt) {\n binding.unmountedAt = now;\n }\n }\n }\n }\n }\n\n private buildQuerySignature(\n hookMeta: DiscoveredComponent[\"hooks\"][0]\n ): string {\n switch (hookMeta.hookType) {\n case \"useOsdkObject\":\n return `object:${hookMeta.objectType}:${hookMeta.primaryKey}`;\n case \"useOsdkObjects\":\n return `useOsdkObjects:${hookMeta.objectType}:${JSON.stringify(\n hookMeta.where\n )}:${JSON.stringify(hookMeta.orderBy)}`;\n case \"useOsdkAction\":\n return `action:${hookMeta.actionName}`;\n case \"useLinks\":\n return `links:${hookMeta.sourceObjectType || \"unknown\"}:${\n hookMeta.linkName || \"unknown\"\n }`;\n case \"useOsdkAggregation\":\n return `aggregation:${hookMeta.objectType}:${JSON.stringify(\n hookMeta.aggregate\n )}`;\n default:\n return `unknown:${JSON.stringify(hookMeta)}`;\n }\n }\n\n private mapHookType(\n hookType: DiscoveredComponent[\"hooks\"][0][\"hookType\"]\n ): ComponentHookBinding[\"hookType\"] {\n switch (hookType) {\n case \"useOsdkObject\":\n return \"useOsdkObject\";\n case \"useOsdkObjects\":\n return \"useOsdkObjects\";\n case \"useOsdkAction\":\n return \"useOsdkAction\";\n case \"useLinks\":\n return \"useLinks\";\n case \"useOsdkAggregation\":\n return \"useOsdkAggregation\";\n default:\n return \"useOsdkObject\";\n }\n }\n\n private buildQueryParams(\n hookMeta: DiscoveredComponent[\"hooks\"][0]\n ): QueryParams {\n switch (hookMeta.hookType) {\n case \"useOsdkObject\":\n return {\n type: \"object\",\n objectType: hookMeta.objectType || \"Unknown\",\n primaryKey: hookMeta.primaryKey || \"\",\n };\n case \"useOsdkObjects\":\n return {\n type: \"list\",\n objectType: hookMeta.objectType || \"Unknown\",\n where: hookMeta.where,\n orderBy: hookMeta.orderBy,\n pageSize: hookMeta.pageSize,\n };\n case \"useOsdkAction\":\n return {\n type: \"action\",\n actionName: hookMeta.actionName || \"Unknown\",\n };\n case \"useLinks\":\n return {\n type: \"links\",\n sourceObject: hookMeta.sourceObjectType || \"Unknown\",\n linkName: hookMeta.linkName || \"Unknown\",\n };\n case \"useOsdkAggregation\":\n return {\n type: \"aggregation\",\n objectType: hookMeta.objectType || \"Unknown\",\n where: hookMeta.where,\n aggregate: hookMeta.aggregate,\n };\n default:\n return {\n type: \"object\",\n objectType: \"Unknown\",\n primaryKey: \"\",\n };\n }\n }\n\n cleanupOldBindings(maxAgeMs: number = 5 * 60 * 1000): number {\n const now = Date.now();\n let cleanedCount = 0;\n\n for (const [bindingId, binding] of this.bindings.entries()) {\n if (binding.unmountedAt && now - binding.unmountedAt > maxAgeMs) {\n this.bindings.delete(bindingId);\n\n this.componentToBindings.get(binding.componentId)?.delete(bindingId);\n this.queryToBindings.get(binding.querySignature)?.delete(bindingId);\n if (binding.subscriptionId) {\n this.subscriptionToBinding.delete(binding.subscriptionId);\n }\n\n cleanedCount++;\n }\n }\n\n return cleanedCount;\n }\n\n clear(): void {\n this.bindings.clear();\n this.componentToBindings.clear();\n this.queryToBindings.clear();\n this.subscriptionToBinding.clear();\n }\n\n getStats(): {\n totalBindings: number;\n activeBindings: number;\n unmountedBindings: number;\n components: number;\n queries: number;\n } {\n let activeBindings = 0;\n let unmountedBindings = 0;\n\n for (const binding of this.bindings.values()) {\n if (binding.unmountedAt) {\n unmountedBindings++;\n } else {\n activeBindings++;\n }\n }\n\n return {\n totalBindings: this.bindings.size,\n activeBindings,\n unmountedBindings,\n components: this.componentToBindings.size,\n queries: this.queryToBindings.size,\n };\n }\n\n getAllBindings(): ComponentHookBinding[] {\n return [...this.bindings.values()];\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -22,7 +22,7 @@ const OSDK_URL_PREFIXES = ["/api/v2/ontologies/", "/multipass/", "/ontology-meta
|
|
|
22
22
|
function isOsdkUrl(pathname) {
|
|
23
23
|
return OSDK_URL_PREFIXES.some(prefix => pathname.startsWith(prefix));
|
|
24
24
|
}
|
|
25
|
-
const RID_REGEX = /ri\.([a-z][a-z0-9-]*)\.([a-z0-9][a-z0-9-]*)?\.([a-z][a-z0-9-]*)\.([a-zA-Z0-9\-._]+)
|
|
25
|
+
const RID_REGEX = /ri\.([a-z][a-z0-9-]*)\.([a-z0-9][a-z0-9-]*)?\.([a-z][a-z0-9-]*)\.([a-zA-Z0-9\-._]+)/u;
|
|
26
26
|
export class ComputeMonitor {
|
|
27
27
|
interceptedFetch = null;
|
|
28
28
|
constructor(computeStore, logger = createMonitorLogger(), originalFetch = globalThis.fetch, eventTimeline) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ComputeMonitor.js","names":["hashPayload","stringifyPayload","truncatePayload","createMonitorLogger","RID_PLACEHOLDER","COMPUTE_COST_ENDPOINTS","Set","OSDK_URL_PREFIXES","isOsdkUrl","pathname","some","prefix","startsWith","RID_REGEX","ComputeMonitor","interceptedFetch","constructor","computeStore","logger","originalFetch","globalThis","fetch","eventTimeline","bind","createInterceptedFetch","debug","self","input","init","extractPathnameFromRequest","isRecording","shouldTrack","doesEndpointTrackComputeCost","isPaused","getIsNetworkPaused","isOsdk","hasBody","body","undefined","bodyType","record","type","timestamp","Date","now","parsed","JSON","parse","requestId","createPendingRequest","requestUrl","requestTimestamp","requestPayload","requestPayloadHash","failRequest","Error","reason","json","e","newBody","includeComputeUsage","res","clonedRes","clone","arrayBuffer","jsonRes","text","TextDecoder","decode","parseError","warn","message","computeUsage","status","hasComputeUsage","fulfillRequest","responsePayloadBytes","byteLength","responsePayloadHash","responsePayload","fulfillWithoutUsage","errorCode","errorInstanceId","errorName","statusText","trim","error","request","URL","url","normalized","replace","has"],"sources":["ComputeMonitor.ts"],"sourcesContent":["/*\n * Copyright 2025 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type { Logger } from \"@osdk/api\";\n\nimport type { ComputeStore } from \"../store/ComputeStore.js\";\nimport {\n hashPayload,\n stringifyPayload,\n truncatePayload,\n} from \"./computePayload.js\";\nimport type { EventTimeline } from \"./EventTimeline.js\";\nimport { createMonitorLogger } from \"./logger.js\";\n\nconst RID_PLACEHOLDER = \"ri.compute.tools.rid.placeholder\";\nconst COMPUTE_COST_ENDPOINTS = new Set([\n `/api/v2/ontologies/${RID_PLACEHOLDER}/objectSets/loadObjects`,\n `/api/v2/ontologies/${RID_PLACEHOLDER}/objectSets/aggregate`,\n `/api/v2/ontologies/${RID_PLACEHOLDER}/objectSets/loadObjectsMultipleObjectTypes`,\n]);\n\nconst OSDK_URL_PREFIXES = [\n \"/api/v2/ontologies/\",\n \"/multipass/\",\n \"/ontology-metadata/\",\n \"/object-set-watcher/\",\n \"/object-set-service/\",\n];\n\nfunction isOsdkUrl(pathname: string): boolean {\n return OSDK_URL_PREFIXES.some((prefix) => pathname.startsWith(prefix));\n}\n\nconst RID_REGEX =\n /ri\\.([a-z][a-z0-9-]*)\\.([a-z0-9][a-z0-9-]*)?\\.([a-z][a-z0-9-]*)\\.([a-zA-Z0-9\\-._]+)/;\n\nexport class ComputeMonitor {\n private readonly originalFetch: typeof globalThis.fetch;\n private readonly computeStore: ComputeStore;\n private readonly logger: Logger;\n private readonly eventTimeline: EventTimeline | undefined;\n private interceptedFetch: typeof globalThis.fetch | null = null;\n\n constructor(\n computeStore: ComputeStore,\n logger: Logger = createMonitorLogger(),\n originalFetch: typeof globalThis.fetch = globalThis.fetch,\n eventTimeline?: EventTimeline\n ) {\n this.computeStore = computeStore;\n this.logger = logger;\n this.eventTimeline = eventTimeline;\n this.originalFetch = originalFetch.bind(globalThis);\n }\n\n createInterceptedFetch(): typeof globalThis.fetch {\n if (this.interceptedFetch) {\n return this.interceptedFetch;\n }\n\n this.logger.debug(\"Creating fetch interceptor\");\n const self = this;\n\n this.interceptedFetch = async (\n input: RequestInfo | URL,\n init?: RequestInit\n ): Promise<Response> => {\n const pathname = self.extractPathnameFromRequest(input);\n\n const isRecording = self.computeStore.isRecording();\n const shouldTrack = self.doesEndpointTrackComputeCost(pathname);\n const isPaused = self.computeStore.getIsNetworkPaused();\n const isOsdk = isOsdkUrl(pathname);\n\n self.logger.debug(\"Fetch intercepted:\", {\n pathname,\n isRecording,\n shouldTrack,\n isPaused,\n isOsdk,\n hasBody: init?.body !== undefined,\n bodyType: typeof init?.body,\n });\n\n if (isPaused && isOsdk) {\n self.logger.debug(\"Network paused, blocking OSDK request\");\n self.eventTimeline?.record({\n type: \"OSDK_PAUSE_BLOCK\",\n pathname,\n timestamp: Date.now(),\n });\n if (shouldTrack && isRecording && typeof init?.body === \"string\") {\n let parsed: unknown;\n try {\n parsed = JSON.parse(init.body);\n } catch {\n parsed = undefined;\n }\n if (parsed !== undefined) {\n const requestId = self.computeStore.createPendingRequest({\n requestUrl: pathname,\n requestTimestamp: new Date(),\n requestPayload: truncatePayload(init.body),\n requestPayloadHash: hashPayload(parsed),\n });\n self.computeStore.failRequest(requestId, {\n type: \"osdk-network-paused\",\n });\n }\n }\n throw new Error(\n \"OSDK network requests are paused by OSDK ComputeTools\"\n );\n }\n\n if (!shouldTrack || !isRecording || typeof init?.body !== \"string\") {\n self.logger.debug(\"Skipping tracking:\", {\n reason: !shouldTrack\n ? \"endpoint not tracked\"\n : !isRecording\n ? \"not recording\"\n : \"body not string\",\n });\n return self.originalFetch(input, init);\n }\n\n self.logger.debug(\"Tracking request for:\", pathname);\n\n let json;\n try {\n json = JSON.parse(init.body);\n } catch (e) {\n self.logger.debug(\"Failed to parse request body\", e);\n return self.originalFetch(input, init);\n }\n\n const newBody = stringifyPayload({ ...json, includeComputeUsage: true });\n\n const requestId = self.computeStore.createPendingRequest({\n requestUrl: pathname,\n requestTimestamp: new Date(),\n requestPayload: truncatePayload(newBody),\n requestPayloadHash: hashPayload(json),\n });\n\n self.logger.debug(\"Created pending request:\", requestId);\n\n try {\n const res = await self.originalFetch(input, { ...init, body: newBody });\n\n const clonedRes = res.clone();\n const arrayBuffer = await clonedRes.arrayBuffer();\n\n let jsonRes;\n try {\n const text = new TextDecoder().decode(arrayBuffer);\n jsonRes = JSON.parse(text);\n } catch (parseError) {\n self.logger.warn(\"Failed to parse response as JSON:\", parseError);\n self.computeStore.failRequest(requestId, {\n type: \"fetch-error\",\n message: \"Failed to parse response JSON\",\n });\n return res;\n }\n\n const computeUsage = jsonRes.computeUsage;\n\n self.logger.debug(\"Response received:\", {\n status: res.status,\n computeUsage,\n hasComputeUsage: typeof computeUsage === \"number\",\n });\n\n if (typeof computeUsage === \"number\") {\n self.logger.debug(\n \"Fulfilling request with compute usage:\",\n computeUsage\n );\n self.computeStore.fulfillRequest(requestId, {\n computeUsage,\n responsePayloadBytes: arrayBuffer.byteLength,\n responsePayloadHash: hashPayload(jsonRes),\n responsePayload: truncatePayload(stringifyPayload(jsonRes)),\n });\n } else if (res.status === 200) {\n self.logger.warn(\"Request succeeded but no computeUsage in response\");\n self.computeStore.fulfillWithoutUsage(requestId, {\n responsePayloadBytes: arrayBuffer.byteLength,\n responsePayloadHash: hashPayload(jsonRes),\n responsePayload: truncatePayload(stringifyPayload(jsonRes)),\n });\n } else if (\n typeof jsonRes.errorCode === \"string\" &&\n typeof jsonRes.errorInstanceId === \"string\" &&\n typeof jsonRes.errorName === \"string\"\n ) {\n self.computeStore.failRequest(requestId, {\n type: \"api-gateway-error\",\n status: res.status,\n errorCode: jsonRes.errorCode,\n errorInstanceId: jsonRes.errorInstanceId,\n errorName: jsonRes.errorName,\n });\n } else {\n self.computeStore.failRequest(requestId, {\n type: \"http-error\",\n status: res.status,\n message: res.statusText.trim() === \"\" ? undefined : res.statusText,\n });\n }\n\n return res;\n } catch (error) {\n self.logger.error(\"Fetch error:\", error);\n self.computeStore.failRequest(\n requestId,\n error instanceof Error\n ? {\n type: \"fetch-error\",\n message: error.message,\n }\n : { type: \"unknown\" }\n );\n throw error;\n }\n };\n\n return this.interceptedFetch;\n }\n\n private extractPathnameFromRequest(request: RequestInfo | URL): string {\n if (request instanceof URL) {\n return request.pathname;\n }\n\n if (typeof request === \"string\") {\n try {\n return new URL(request).pathname;\n } catch {\n return request;\n }\n }\n\n try {\n return new URL(request.url).pathname;\n } catch {\n return request.url;\n }\n }\n\n private doesEndpointTrackComputeCost(pathname: string): boolean {\n const normalized = pathname.replace(RID_REGEX, RID_PLACEHOLDER);\n return COMPUTE_COST_ENDPOINTS.has(normalized);\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"ComputeMonitor.js","names":["hashPayload","stringifyPayload","truncatePayload","createMonitorLogger","RID_PLACEHOLDER","COMPUTE_COST_ENDPOINTS","Set","OSDK_URL_PREFIXES","isOsdkUrl","pathname","some","prefix","startsWith","RID_REGEX","ComputeMonitor","interceptedFetch","constructor","computeStore","logger","originalFetch","globalThis","fetch","eventTimeline","bind","createInterceptedFetch","debug","self","input","init","extractPathnameFromRequest","isRecording","shouldTrack","doesEndpointTrackComputeCost","isPaused","getIsNetworkPaused","isOsdk","hasBody","body","undefined","bodyType","record","type","timestamp","Date","now","parsed","JSON","parse","requestId","createPendingRequest","requestUrl","requestTimestamp","requestPayload","requestPayloadHash","failRequest","Error","reason","json","e","newBody","includeComputeUsage","res","clonedRes","clone","arrayBuffer","jsonRes","text","TextDecoder","decode","parseError","warn","message","computeUsage","status","hasComputeUsage","fulfillRequest","responsePayloadBytes","byteLength","responsePayloadHash","responsePayload","fulfillWithoutUsage","errorCode","errorInstanceId","errorName","statusText","trim","error","request","URL","url","normalized","replace","has"],"sources":["ComputeMonitor.ts"],"sourcesContent":["/*\n * Copyright 2025 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type { Logger } from \"@osdk/api\";\n\nimport type { ComputeStore } from \"../store/ComputeStore.js\";\nimport {\n hashPayload,\n stringifyPayload,\n truncatePayload,\n} from \"./computePayload.js\";\nimport type { EventTimeline } from \"./EventTimeline.js\";\nimport { createMonitorLogger } from \"./logger.js\";\n\nconst RID_PLACEHOLDER = \"ri.compute.tools.rid.placeholder\";\nconst COMPUTE_COST_ENDPOINTS = new Set([\n `/api/v2/ontologies/${RID_PLACEHOLDER}/objectSets/loadObjects`,\n `/api/v2/ontologies/${RID_PLACEHOLDER}/objectSets/aggregate`,\n `/api/v2/ontologies/${RID_PLACEHOLDER}/objectSets/loadObjectsMultipleObjectTypes`,\n]);\n\nconst OSDK_URL_PREFIXES = [\n \"/api/v2/ontologies/\",\n \"/multipass/\",\n \"/ontology-metadata/\",\n \"/object-set-watcher/\",\n \"/object-set-service/\",\n];\n\nfunction isOsdkUrl(pathname: string): boolean {\n return OSDK_URL_PREFIXES.some((prefix) => pathname.startsWith(prefix));\n}\n\nconst RID_REGEX =\n /ri\\.([a-z][a-z0-9-]*)\\.([a-z0-9][a-z0-9-]*)?\\.([a-z][a-z0-9-]*)\\.([a-zA-Z0-9\\-._]+)/u;\n\nexport class ComputeMonitor {\n private readonly originalFetch: typeof globalThis.fetch;\n private readonly computeStore: ComputeStore;\n private readonly logger: Logger;\n private readonly eventTimeline: EventTimeline | undefined;\n private interceptedFetch: typeof globalThis.fetch | null = null;\n\n constructor(\n computeStore: ComputeStore,\n logger: Logger = createMonitorLogger(),\n originalFetch: typeof globalThis.fetch = globalThis.fetch,\n eventTimeline?: EventTimeline\n ) {\n this.computeStore = computeStore;\n this.logger = logger;\n this.eventTimeline = eventTimeline;\n this.originalFetch = originalFetch.bind(globalThis);\n }\n\n createInterceptedFetch(): typeof globalThis.fetch {\n if (this.interceptedFetch) {\n return this.interceptedFetch;\n }\n\n this.logger.debug(\"Creating fetch interceptor\");\n const self = this;\n\n this.interceptedFetch = async (\n input: RequestInfo | URL,\n init?: RequestInit\n ): Promise<Response> => {\n const pathname = self.extractPathnameFromRequest(input);\n\n const isRecording = self.computeStore.isRecording();\n const shouldTrack = self.doesEndpointTrackComputeCost(pathname);\n const isPaused = self.computeStore.getIsNetworkPaused();\n const isOsdk = isOsdkUrl(pathname);\n\n self.logger.debug(\"Fetch intercepted:\", {\n pathname,\n isRecording,\n shouldTrack,\n isPaused,\n isOsdk,\n hasBody: init?.body !== undefined,\n bodyType: typeof init?.body,\n });\n\n if (isPaused && isOsdk) {\n self.logger.debug(\"Network paused, blocking OSDK request\");\n self.eventTimeline?.record({\n type: \"OSDK_PAUSE_BLOCK\",\n pathname,\n timestamp: Date.now(),\n });\n if (shouldTrack && isRecording && typeof init?.body === \"string\") {\n let parsed: unknown;\n try {\n parsed = JSON.parse(init.body);\n } catch {\n parsed = undefined;\n }\n if (parsed !== undefined) {\n const requestId = self.computeStore.createPendingRequest({\n requestUrl: pathname,\n requestTimestamp: new Date(),\n requestPayload: truncatePayload(init.body),\n requestPayloadHash: hashPayload(parsed),\n });\n self.computeStore.failRequest(requestId, {\n type: \"osdk-network-paused\",\n });\n }\n }\n throw new Error(\n \"OSDK network requests are paused by OSDK ComputeTools\"\n );\n }\n\n if (!shouldTrack || !isRecording || typeof init?.body !== \"string\") {\n self.logger.debug(\"Skipping tracking:\", {\n reason: !shouldTrack\n ? \"endpoint not tracked\"\n : !isRecording\n ? \"not recording\"\n : \"body not string\",\n });\n return self.originalFetch(input, init);\n }\n\n self.logger.debug(\"Tracking request for:\", pathname);\n\n let json;\n try {\n json = JSON.parse(init.body);\n } catch (e) {\n self.logger.debug(\"Failed to parse request body\", e);\n return self.originalFetch(input, init);\n }\n\n const newBody = stringifyPayload({ ...json, includeComputeUsage: true });\n\n const requestId = self.computeStore.createPendingRequest({\n requestUrl: pathname,\n requestTimestamp: new Date(),\n requestPayload: truncatePayload(newBody),\n requestPayloadHash: hashPayload(json),\n });\n\n self.logger.debug(\"Created pending request:\", requestId);\n\n try {\n const res = await self.originalFetch(input, { ...init, body: newBody });\n\n const clonedRes = res.clone();\n const arrayBuffer = await clonedRes.arrayBuffer();\n\n let jsonRes;\n try {\n const text = new TextDecoder().decode(arrayBuffer);\n jsonRes = JSON.parse(text);\n } catch (parseError) {\n self.logger.warn(\"Failed to parse response as JSON:\", parseError);\n self.computeStore.failRequest(requestId, {\n type: \"fetch-error\",\n message: \"Failed to parse response JSON\",\n });\n return res;\n }\n\n const computeUsage = jsonRes.computeUsage;\n\n self.logger.debug(\"Response received:\", {\n status: res.status,\n computeUsage,\n hasComputeUsage: typeof computeUsage === \"number\",\n });\n\n if (typeof computeUsage === \"number\") {\n self.logger.debug(\n \"Fulfilling request with compute usage:\",\n computeUsage\n );\n self.computeStore.fulfillRequest(requestId, {\n computeUsage,\n responsePayloadBytes: arrayBuffer.byteLength,\n responsePayloadHash: hashPayload(jsonRes),\n responsePayload: truncatePayload(stringifyPayload(jsonRes)),\n });\n } else if (res.status === 200) {\n self.logger.warn(\"Request succeeded but no computeUsage in response\");\n self.computeStore.fulfillWithoutUsage(requestId, {\n responsePayloadBytes: arrayBuffer.byteLength,\n responsePayloadHash: hashPayload(jsonRes),\n responsePayload: truncatePayload(stringifyPayload(jsonRes)),\n });\n } else if (\n typeof jsonRes.errorCode === \"string\" &&\n typeof jsonRes.errorInstanceId === \"string\" &&\n typeof jsonRes.errorName === \"string\"\n ) {\n self.computeStore.failRequest(requestId, {\n type: \"api-gateway-error\",\n status: res.status,\n errorCode: jsonRes.errorCode,\n errorInstanceId: jsonRes.errorInstanceId,\n errorName: jsonRes.errorName,\n });\n } else {\n self.computeStore.failRequest(requestId, {\n type: \"http-error\",\n status: res.status,\n message: res.statusText.trim() === \"\" ? undefined : res.statusText,\n });\n }\n\n return res;\n } catch (error) {\n self.logger.error(\"Fetch error:\", error);\n self.computeStore.failRequest(\n requestId,\n error instanceof Error\n ? {\n type: \"fetch-error\",\n message: error.message,\n }\n : { type: \"unknown\" }\n );\n throw error;\n }\n };\n\n return this.interceptedFetch;\n }\n\n private extractPathnameFromRequest(request: RequestInfo | URL): string {\n if (request instanceof URL) {\n return request.pathname;\n }\n\n if (typeof request === \"string\") {\n try {\n return new URL(request).pathname;\n } catch {\n return request;\n }\n }\n\n try {\n return new URL(request.url).pathname;\n } catch {\n return request.url;\n }\n }\n\n private doesEndpointTrackComputeCost(pathname: string): boolean {\n const normalized = pathname.replace(RID_REGEX, RID_PLACEHOLDER);\n return COMPUTE_COST_ENDPOINTS.has(normalized);\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -380,7 +380,7 @@ function generateId() {
|
|
|
380
380
|
createdAt: new Date().toISOString()`;
|
|
381
381
|
}
|
|
382
382
|
static extractObjectTypeFromAction(actionName) {
|
|
383
|
-
const patterns = [/create[_-]?(\w+)/
|
|
383
|
+
const patterns = [/create[_-]?(\w+)/iu, /add[_-]?(\w+)/iu, /new[_-]?(\w+)/iu, /(\w+)[_-]?create/iu, /(\w+)[_-]?add/iu];
|
|
384
384
|
for (const pattern of patterns) {
|
|
385
385
|
const match = actionName.match(pattern);
|
|
386
386
|
if (match && match[1]) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MockDataGenerator.js","names":["MockDataGenerator","generatePayload","primitive","type","actionName","data","name","parameters","toLowerCase","includes","objectType","extractObjectTypeFromAction","generateCreateParameters","generateUpdateParameters","generateDeleteParameters","id","crypto","randomUUID","field1","field2","JSON","stringify","options","mode","returnEdits","generateStaticData","generateActionMockData","generateObjectMockData","generateObjectSetMockData","generateLinksMockData","generateQueryMockData","generateFunctionCode","generateActionFunctionCode","generateObjectFunctionCode","generateObjectSetFunctionCode","generateLinksFunctionCode","generateQueryFunctionCode","actionData","actionId","mockData","addedObjects","primaryKey","modifiedObjects","deletedObjects","addedLinks","deletedLinks","deletedObjectsCount","deletedLinksCount","editedObjectTypes","objectData","__apiName","__primaryKey","__title","generateFieldsForObjectType","objectSetData","pageSize","objects","Array","from","length","Math","min","_","index","totalCount","String","linkData","linkName","sourceType","linkedType","inferLinkedTypeFromLinkName","linkedObjects","$apiName","$primaryKey","$objectType","$title","queryData","customField1","customField2","customField3","metadata","queryType","hookType","signature","generateDynamicFieldsForObjectType","title","isComplete","description","createdAt","Date","toISOString","employeeId","floor","random","fullName","email","department","officeId","location","capacity","status","modifiedAt","patterns","pattern","match","charAt","toUpperCase","slice","singular","endsWith","Todo","is_complete","todo","employee","object","reason"],"sources":["MockDataGenerator.ts"],"sourcesContent":["/*\n * Copyright 2025 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type { SelectedPrimitive } from \"../components/PrimitiveSelectionPanel.js\";\nimport type {\n DiscoveredAction,\n DiscoveredLink,\n DiscoveredObject,\n DiscoveredObjectSet,\n DiscoveredQuery,\n} from \"./ComponentPrimitiveDiscovery.js\";\n\nexport class MockDataGenerator {\n static generatePayload(primitive: SelectedPrimitive): string {\n if (primitive.type !== \"action\") {\n return \"{}\";\n }\n\n const actionName = primitive.data.name;\n\n let parameters: Record<string, unknown>;\n\n if (actionName.toLowerCase().includes(\"create\")) {\n const objectType = this.extractObjectTypeFromAction(actionName);\n parameters = this.generateCreateParameters(objectType);\n } else if (\n actionName.toLowerCase().includes(\"update\") ||\n actionName.toLowerCase().includes(\"modify\")\n ) {\n const objectType = this.extractObjectTypeFromAction(actionName);\n parameters = this.generateUpdateParameters(objectType);\n } else if (actionName.toLowerCase().includes(\"delete\")) {\n const objectType = this.extractObjectTypeFromAction(actionName);\n parameters = this.generateDeleteParameters(objectType);\n } else {\n parameters = {\n id: crypto.randomUUID(),\n data: {\n field1: \"value1\",\n field2: 42,\n },\n };\n }\n\n return JSON.stringify(\n {\n parameters,\n options: {\n mode: \"VALIDATE_AND_EXECUTE\",\n returnEdits: \"ALL_V2_WITH_DELETIONS\",\n },\n },\n null,\n 2\n );\n }\n\n static generateStaticData(primitive: SelectedPrimitive): string {\n switch (primitive.type) {\n case \"action\":\n return this.generateActionMockData(primitive.data);\n case \"object\":\n return this.generateObjectMockData(primitive.data);\n case \"objectSet\":\n return this.generateObjectSetMockData(primitive.data);\n case \"link\":\n return this.generateLinksMockData(primitive.data);\n case \"query\":\n return this.generateQueryMockData(primitive.data);\n case \"aggregation\":\n return '{\\n \"data\": {},\\n \"status\": \"SUCCESS\"\\n}';\n }\n }\n\n static generateFunctionCode(primitive: SelectedPrimitive): string {\n switch (primitive.type) {\n case \"action\":\n return this.generateActionFunctionCode(primitive.data);\n case \"object\":\n return this.generateObjectFunctionCode(primitive.data);\n case \"objectSet\":\n return this.generateObjectSetFunctionCode(primitive.data);\n case \"link\":\n return this.generateLinksFunctionCode(primitive.data);\n case \"query\":\n return this.generateQueryFunctionCode(primitive.data);\n case \"aggregation\":\n return 'function generateMock(params) {\\n return {\\n data: {},\\n status: \"SUCCESS\"\\n };\\n}';\n }\n }\n\n private static generateActionMockData(actionData: DiscoveredAction): string {\n const actionName = actionData.name;\n const actionId = crypto.randomUUID();\n\n let objectType: string;\n\n if (actionName === \"createTodo\") {\n objectType = \"TodoLike\";\n } else {\n objectType = this.extractObjectTypeFromAction(actionName);\n }\n\n const mockData = {\n type: \"edits\",\n addedObjects: [\n {\n primaryKey: actionId,\n objectType,\n },\n ],\n modifiedObjects: [],\n deletedObjects: [],\n addedLinks: [],\n deletedLinks: [],\n deletedObjectsCount: 0,\n deletedLinksCount: 0,\n editedObjectTypes: [objectType],\n };\n\n return JSON.stringify(mockData, null, 2);\n }\n\n private static generateObjectMockData(objectData: DiscoveredObject): string {\n const objectType = objectData.type;\n const primaryKey = objectData.primaryKey || crypto.randomUUID();\n\n const mockData = {\n id: primaryKey,\n __apiName: objectType,\n __primaryKey: primaryKey,\n __title: `Mock ${objectType}`,\n ...this.generateFieldsForObjectType(objectType),\n };\n\n return JSON.stringify(mockData, null, 2);\n }\n\n private static generateObjectSetMockData(\n objectSetData: DiscoveredObjectSet\n ): string {\n const objectType = objectSetData.type;\n const pageSize = objectSetData.pageSize || 10;\n\n const objects = Array.from(\n { length: Math.min(pageSize, 3) },\n (_, index) => {\n const id = crypto.randomUUID();\n return {\n id,\n __apiName: objectType,\n __primaryKey: id,\n __title: `${objectType} ${index + 1}`,\n ...this.generateFieldsForObjectType(objectType),\n };\n }\n );\n\n const mockData = {\n data: objects,\n totalCount: String(objects.length),\n };\n\n return JSON.stringify(mockData, null, 2);\n }\n\n private static generateLinksMockData(linkData: DiscoveredLink): string {\n const linkName = linkData.linkName;\n const sourceType = linkData.sourceType;\n\n const linkedType = this.inferLinkedTypeFromLinkName(linkName, sourceType);\n\n const linkedObjects = Array.from({ length: 2 }, (_, index) => {\n const id = crypto.randomUUID();\n return {\n $apiName: linkedType,\n $primaryKey: id,\n $objectType: linkedType,\n $title: `${linkedType} ${index + 1}`,\n ...this.generateFieldsForObjectType(linkedType),\n };\n });\n\n const mockData = {\n data: linkedObjects,\n totalCount: String(linkedObjects.length),\n };\n\n return JSON.stringify(mockData, null, 2);\n }\n\n private static generateQueryMockData(queryData: DiscoveredQuery): string {\n const mockData = {\n data: [\n {\n id: crypto.randomUUID(),\n __apiName: \"QueryResult\",\n __primaryKey: crypto.randomUUID(),\n __title: \"Query Result 1\",\n customField1: \"value1\",\n customField2: 42,\n customField3: true,\n },\n ],\n totalCount: \"1\",\n metadata: {\n queryType: queryData.hookType || \"advanced\",\n signature: queryData.signature || \"custom query\",\n },\n };\n\n return JSON.stringify(mockData, null, 2);\n }\n\n private static generateActionFunctionCode(\n actionData: DiscoveredAction\n ): string {\n const actionName = actionData.name;\n\n return `function generateMock(params) {\n // Access action parameters\n console.log(\"Action: ${actionName}\", params);\n\n // Generate dynamic response based on parameters\n const primaryKey = generateId();\n\n return {\n validation: {\n result: \"VALID\",\n submissionCriteria: [],\n parameters: params\n },\n edits: {\n type: \"edits\",\n edits: [\n {\n type: \"addObject\",\n primaryKey: primaryKey,\n objectType: \"${this.extractObjectTypeFromAction(actionName)}\"\n }\n ],\n addedObjectCount: 1,\n modifiedObjectsCount: 0,\n deletedObjectsCount: 0,\n addedLinksCount: 0,\n deletedLinksCount: 0\n }\n };\n}\n\nfunction generateId() {\n return crypto.randomUUID();\n}`;\n }\n\n private static generateObjectFunctionCode(\n objectData: DiscoveredObject\n ): string {\n const objectType = objectData.type;\n\n return `function generateMock(params) {\n // Access object primary key\n const primaryKey = params.primaryKey || generateId();\n\n return {\n id: primaryKey,\n __apiName: \"${objectType}\",\n __primaryKey: primaryKey,\n __title: \\`Mock ${objectType} \\${primaryKey}\\`,\n // Add dynamic fields based on context\n createdAt: new Date().toISOString(),\n modifiedAt: new Date().toISOString(),\n ${this.generateDynamicFieldsForObjectType(objectType)}\n };\n}\n\nfunction generateId() {\n return crypto.randomUUID();\n}`;\n }\n\n private static generateObjectSetFunctionCode(\n objectSetData: DiscoveredObjectSet\n ): string {\n const objectType = objectSetData.type;\n\n return `function generateMock(params) {\n // Access query parameters\n const pageSize = params.pageSize || 10;\n const where = params.where || {};\n\n // Generate dynamic list based on parameters\n const objects = Array.from({ length: pageSize }, (_, index) => {\n const id = generateId();\n return {\n id,\n __apiName: \"${objectType}\",\n __primaryKey: id,\n __title: \\`${objectType} \\${index + 1}\\`,\n // Add fields based on where clause\n ${this.generateDynamicFieldsForObjectType(objectType)}\n };\n });\n\n return {\n data: objects,\n totalCount: String(objects.length)\n };\n}\n\nfunction generateId() {\n return crypto.randomUUID();\n}`;\n }\n\n private static generateLinksFunctionCode(linkData: DiscoveredLink): string {\n const linkName = linkData.linkName;\n const linkedType = this.inferLinkedTypeFromLinkName(\n linkName,\n linkData.sourceType\n );\n\n return `function generateMock(params) {\n // Access link traversal context\n const sourceObject = params.sourceObject;\n const linkName = \"${linkName}\";\n\n // Generate linked objects based on source\n const linkedObjects = Array.from({ length: 3 }, (_, index) => {\n const id = generateId();\n return {\n $apiName: \"${linkedType}\",\n $primaryKey: id,\n $objectType: \"${linkedType}\",\n $title: \\`${linkedType} \\${index + 1}\\`,\n // Add relationship fields\n sourceId: sourceObject?.$primaryKey,\n ${this.generateDynamicFieldsForObjectType(linkedType)}\n };\n });\n\n return {\n data: linkedObjects,\n totalCount: String(linkedObjects.length)\n };\n}\n\nfunction generateId() {\n return crypto.randomUUID();\n}`;\n }\n\n private static generateQueryFunctionCode(queryData: DiscoveredQuery): string {\n return `function generateMock(params) {\n // Access advanced query parameters\n console.log(\"Query params:\", params);\n\n // Generate dynamic results based on query\n const results = Array.from({ length: 5 }, (_, index) => ({\n id: generateId(),\n __apiName: \"QueryResult\",\n __primaryKey: generateId(),\n __title: \\`Result \\${index + 1}\\`,\n // Add computed fields\n score: Math.random() * 100,\n relevance: Math.random(),\n timestamp: new Date().toISOString()\n }));\n\n return {\n data: results,\n totalCount: String(results.length),\n metadata: {\n queryType: \"${queryData.hookType || \"advanced\"}\",\n executionTime: Math.random() * 1000\n }\n };\n}\n\nfunction generateId() {\n return crypto.randomUUID();\n}`;\n }\n\n private static generateFieldsForObjectType(\n objectType: string\n ): Record<string, unknown> {\n if (objectType === \"Todo\") {\n return {\n title: \"Sample Todo\",\n isComplete: false,\n description: \"This is a mock todo item\",\n createdAt: new Date().toISOString(),\n };\n }\n\n if (objectType === \"Employee\") {\n return {\n employeeId: Math.floor(Math.random() * 10000),\n fullName: \"John Doe\",\n email: \"john.doe@example.com\",\n department: \"Engineering\",\n };\n }\n\n if (objectType === \"Office\") {\n return {\n officeId: `OFFICE-${Math.floor(Math.random() * 100)}`,\n name: \"Main Office\",\n location: \"New York\",\n capacity: 100,\n };\n }\n\n return {\n name: `Sample ${objectType}`,\n status: \"ACTIVE\",\n createdAt: new Date().toISOString(),\n modifiedAt: new Date().toISOString(),\n };\n }\n\n private static generateDynamicFieldsForObjectType(\n objectType: string\n ): string {\n if (objectType === \"Todo\") {\n return `title: \\`Todo Item \\${index || \"\"}\\`,\n isComplete: Math.random() > 0.5,\n description: \"Generated todo description\",\n createdAt: new Date().toISOString()`;\n }\n\n if (objectType === \"Employee\") {\n return `employeeId: Math.floor(Math.random() * 10000),\n fullName: \\`Employee \\${index || \"\"}\\`,\n email: \\`employee\\${index || \"\"}@example.com\\`,\n department: [\"Engineering\", \"Sales\", \"Marketing\"][Math.floor(Math.random() * 3)]`;\n }\n\n return `name: \\`${objectType} \\${index || \"\"}\\`,\n status: \"ACTIVE\",\n createdAt: new Date().toISOString()`;\n }\n\n private static extractObjectTypeFromAction(actionName: string): string {\n const patterns = [\n /create[_-]?(\\w+)/i,\n /add[_-]?(\\w+)/i,\n /new[_-]?(\\w+)/i,\n /(\\w+)[_-]?create/i,\n /(\\w+)[_-]?add/i,\n ];\n\n for (const pattern of patterns) {\n const match = actionName.match(pattern);\n if (match && match[1]) {\n return (\n match[1].charAt(0).toUpperCase() + match[1].slice(1).toLowerCase()\n );\n }\n }\n\n return \"Object\";\n }\n\n private static inferLinkedTypeFromLinkName(\n linkName: string,\n sourceType: string\n ): string {\n if (linkName === \"occupants\" || linkName === \"employees\") {\n return \"Employee\";\n }\n if (linkName === \"offices\" || linkName === \"locations\") {\n return \"Office\";\n }\n if (linkName === \"todos\" || linkName === \"tasks\") {\n return \"Todo\";\n }\n if (linkName === \"children\" || linkName === \"parents\") {\n return sourceType;\n }\n\n let singular = linkName;\n if (linkName.endsWith(\"ies\")) {\n singular = `${linkName.slice(0, -3)}y`;\n } else if (linkName.endsWith(\"es\")) {\n singular = linkName.slice(0, -2);\n } else if (linkName.endsWith(\"s\")) {\n singular = linkName.slice(0, -1);\n }\n\n return singular.charAt(0).toUpperCase() + singular.slice(1);\n }\n\n private static generateCreateParameters(\n objectType: string\n ): Record<string, unknown> {\n if (objectType === \"Todo\") {\n return {\n Todo: \"New Todo Item\",\n is_complete: false,\n location: \"0,0\",\n };\n }\n\n if (objectType === \"Employee\") {\n return {\n fullName: \"John Doe\",\n email: \"john.doe@example.com\",\n employeeId: Math.floor(Math.random() * 10000),\n department: \"Engineering\",\n };\n }\n\n return {\n name: `New ${objectType}`,\n description: `Description for ${objectType}`,\n status: \"ACTIVE\",\n };\n }\n\n private static generateUpdateParameters(\n objectType: string\n ): Record<string, unknown> {\n if (objectType === \"Todo\") {\n return {\n todo: { $primaryKey: crypto.randomUUID() },\n is_complete: true,\n Todo: \"Updated Todo\",\n };\n }\n\n if (objectType === \"Employee\") {\n return {\n employee: { $primaryKey: crypto.randomUUID() },\n department: \"Marketing\",\n email: \"updated.email@example.com\",\n };\n }\n\n return {\n object: { $primaryKey: crypto.randomUUID() },\n name: `Updated ${objectType}`,\n status: \"MODIFIED\",\n };\n }\n\n private static generateDeleteParameters(\n _objectType: string\n ): Record<string, unknown> {\n return {\n object: { $primaryKey: crypto.randomUUID() },\n reason: \"No longer needed\",\n };\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"MockDataGenerator.js","names":["MockDataGenerator","generatePayload","primitive","type","actionName","data","name","parameters","toLowerCase","includes","objectType","extractObjectTypeFromAction","generateCreateParameters","generateUpdateParameters","generateDeleteParameters","id","crypto","randomUUID","field1","field2","JSON","stringify","options","mode","returnEdits","generateStaticData","generateActionMockData","generateObjectMockData","generateObjectSetMockData","generateLinksMockData","generateQueryMockData","generateFunctionCode","generateActionFunctionCode","generateObjectFunctionCode","generateObjectSetFunctionCode","generateLinksFunctionCode","generateQueryFunctionCode","actionData","actionId","mockData","addedObjects","primaryKey","modifiedObjects","deletedObjects","addedLinks","deletedLinks","deletedObjectsCount","deletedLinksCount","editedObjectTypes","objectData","__apiName","__primaryKey","__title","generateFieldsForObjectType","objectSetData","pageSize","objects","Array","from","length","Math","min","_","index","totalCount","String","linkData","linkName","sourceType","linkedType","inferLinkedTypeFromLinkName","linkedObjects","$apiName","$primaryKey","$objectType","$title","queryData","customField1","customField2","customField3","metadata","queryType","hookType","signature","generateDynamicFieldsForObjectType","title","isComplete","description","createdAt","Date","toISOString","employeeId","floor","random","fullName","email","department","officeId","location","capacity","status","modifiedAt","patterns","pattern","match","charAt","toUpperCase","slice","singular","endsWith","Todo","is_complete","todo","employee","object","reason"],"sources":["MockDataGenerator.ts"],"sourcesContent":["/*\n * Copyright 2025 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type { SelectedPrimitive } from \"../components/PrimitiveSelectionPanel.js\";\nimport type {\n DiscoveredAction,\n DiscoveredLink,\n DiscoveredObject,\n DiscoveredObjectSet,\n DiscoveredQuery,\n} from \"./ComponentPrimitiveDiscovery.js\";\n\nexport class MockDataGenerator {\n static generatePayload(primitive: SelectedPrimitive): string {\n if (primitive.type !== \"action\") {\n return \"{}\";\n }\n\n const actionName = primitive.data.name;\n\n let parameters: Record<string, unknown>;\n\n if (actionName.toLowerCase().includes(\"create\")) {\n const objectType = this.extractObjectTypeFromAction(actionName);\n parameters = this.generateCreateParameters(objectType);\n } else if (\n actionName.toLowerCase().includes(\"update\") ||\n actionName.toLowerCase().includes(\"modify\")\n ) {\n const objectType = this.extractObjectTypeFromAction(actionName);\n parameters = this.generateUpdateParameters(objectType);\n } else if (actionName.toLowerCase().includes(\"delete\")) {\n const objectType = this.extractObjectTypeFromAction(actionName);\n parameters = this.generateDeleteParameters(objectType);\n } else {\n parameters = {\n id: crypto.randomUUID(),\n data: {\n field1: \"value1\",\n field2: 42,\n },\n };\n }\n\n return JSON.stringify(\n {\n parameters,\n options: {\n mode: \"VALIDATE_AND_EXECUTE\",\n returnEdits: \"ALL_V2_WITH_DELETIONS\",\n },\n },\n null,\n 2\n );\n }\n\n static generateStaticData(primitive: SelectedPrimitive): string {\n switch (primitive.type) {\n case \"action\":\n return this.generateActionMockData(primitive.data);\n case \"object\":\n return this.generateObjectMockData(primitive.data);\n case \"objectSet\":\n return this.generateObjectSetMockData(primitive.data);\n case \"link\":\n return this.generateLinksMockData(primitive.data);\n case \"query\":\n return this.generateQueryMockData(primitive.data);\n case \"aggregation\":\n return '{\\n \"data\": {},\\n \"status\": \"SUCCESS\"\\n}';\n }\n }\n\n static generateFunctionCode(primitive: SelectedPrimitive): string {\n switch (primitive.type) {\n case \"action\":\n return this.generateActionFunctionCode(primitive.data);\n case \"object\":\n return this.generateObjectFunctionCode(primitive.data);\n case \"objectSet\":\n return this.generateObjectSetFunctionCode(primitive.data);\n case \"link\":\n return this.generateLinksFunctionCode(primitive.data);\n case \"query\":\n return this.generateQueryFunctionCode(primitive.data);\n case \"aggregation\":\n return 'function generateMock(params) {\\n return {\\n data: {},\\n status: \"SUCCESS\"\\n };\\n}';\n }\n }\n\n private static generateActionMockData(actionData: DiscoveredAction): string {\n const actionName = actionData.name;\n const actionId = crypto.randomUUID();\n\n let objectType: string;\n\n if (actionName === \"createTodo\") {\n objectType = \"TodoLike\";\n } else {\n objectType = this.extractObjectTypeFromAction(actionName);\n }\n\n const mockData = {\n type: \"edits\",\n addedObjects: [\n {\n primaryKey: actionId,\n objectType,\n },\n ],\n modifiedObjects: [],\n deletedObjects: [],\n addedLinks: [],\n deletedLinks: [],\n deletedObjectsCount: 0,\n deletedLinksCount: 0,\n editedObjectTypes: [objectType],\n };\n\n return JSON.stringify(mockData, null, 2);\n }\n\n private static generateObjectMockData(objectData: DiscoveredObject): string {\n const objectType = objectData.type;\n const primaryKey = objectData.primaryKey || crypto.randomUUID();\n\n const mockData = {\n id: primaryKey,\n __apiName: objectType,\n __primaryKey: primaryKey,\n __title: `Mock ${objectType}`,\n ...this.generateFieldsForObjectType(objectType),\n };\n\n return JSON.stringify(mockData, null, 2);\n }\n\n private static generateObjectSetMockData(\n objectSetData: DiscoveredObjectSet\n ): string {\n const objectType = objectSetData.type;\n const pageSize = objectSetData.pageSize || 10;\n\n const objects = Array.from(\n { length: Math.min(pageSize, 3) },\n (_, index) => {\n const id = crypto.randomUUID();\n return {\n id,\n __apiName: objectType,\n __primaryKey: id,\n __title: `${objectType} ${index + 1}`,\n ...this.generateFieldsForObjectType(objectType),\n };\n }\n );\n\n const mockData = {\n data: objects,\n totalCount: String(objects.length),\n };\n\n return JSON.stringify(mockData, null, 2);\n }\n\n private static generateLinksMockData(linkData: DiscoveredLink): string {\n const linkName = linkData.linkName;\n const sourceType = linkData.sourceType;\n\n const linkedType = this.inferLinkedTypeFromLinkName(linkName, sourceType);\n\n const linkedObjects = Array.from({ length: 2 }, (_, index) => {\n const id = crypto.randomUUID();\n return {\n $apiName: linkedType,\n $primaryKey: id,\n $objectType: linkedType,\n $title: `${linkedType} ${index + 1}`,\n ...this.generateFieldsForObjectType(linkedType),\n };\n });\n\n const mockData = {\n data: linkedObjects,\n totalCount: String(linkedObjects.length),\n };\n\n return JSON.stringify(mockData, null, 2);\n }\n\n private static generateQueryMockData(queryData: DiscoveredQuery): string {\n const mockData = {\n data: [\n {\n id: crypto.randomUUID(),\n __apiName: \"QueryResult\",\n __primaryKey: crypto.randomUUID(),\n __title: \"Query Result 1\",\n customField1: \"value1\",\n customField2: 42,\n customField3: true,\n },\n ],\n totalCount: \"1\",\n metadata: {\n queryType: queryData.hookType || \"advanced\",\n signature: queryData.signature || \"custom query\",\n },\n };\n\n return JSON.stringify(mockData, null, 2);\n }\n\n private static generateActionFunctionCode(\n actionData: DiscoveredAction\n ): string {\n const actionName = actionData.name;\n\n return `function generateMock(params) {\n // Access action parameters\n console.log(\"Action: ${actionName}\", params);\n\n // Generate dynamic response based on parameters\n const primaryKey = generateId();\n\n return {\n validation: {\n result: \"VALID\",\n submissionCriteria: [],\n parameters: params\n },\n edits: {\n type: \"edits\",\n edits: [\n {\n type: \"addObject\",\n primaryKey: primaryKey,\n objectType: \"${this.extractObjectTypeFromAction(actionName)}\"\n }\n ],\n addedObjectCount: 1,\n modifiedObjectsCount: 0,\n deletedObjectsCount: 0,\n addedLinksCount: 0,\n deletedLinksCount: 0\n }\n };\n}\n\nfunction generateId() {\n return crypto.randomUUID();\n}`;\n }\n\n private static generateObjectFunctionCode(\n objectData: DiscoveredObject\n ): string {\n const objectType = objectData.type;\n\n return `function generateMock(params) {\n // Access object primary key\n const primaryKey = params.primaryKey || generateId();\n\n return {\n id: primaryKey,\n __apiName: \"${objectType}\",\n __primaryKey: primaryKey,\n __title: \\`Mock ${objectType} \\${primaryKey}\\`,\n // Add dynamic fields based on context\n createdAt: new Date().toISOString(),\n modifiedAt: new Date().toISOString(),\n ${this.generateDynamicFieldsForObjectType(objectType)}\n };\n}\n\nfunction generateId() {\n return crypto.randomUUID();\n}`;\n }\n\n private static generateObjectSetFunctionCode(\n objectSetData: DiscoveredObjectSet\n ): string {\n const objectType = objectSetData.type;\n\n return `function generateMock(params) {\n // Access query parameters\n const pageSize = params.pageSize || 10;\n const where = params.where || {};\n\n // Generate dynamic list based on parameters\n const objects = Array.from({ length: pageSize }, (_, index) => {\n const id = generateId();\n return {\n id,\n __apiName: \"${objectType}\",\n __primaryKey: id,\n __title: \\`${objectType} \\${index + 1}\\`,\n // Add fields based on where clause\n ${this.generateDynamicFieldsForObjectType(objectType)}\n };\n });\n\n return {\n data: objects,\n totalCount: String(objects.length)\n };\n}\n\nfunction generateId() {\n return crypto.randomUUID();\n}`;\n }\n\n private static generateLinksFunctionCode(linkData: DiscoveredLink): string {\n const linkName = linkData.linkName;\n const linkedType = this.inferLinkedTypeFromLinkName(\n linkName,\n linkData.sourceType\n );\n\n return `function generateMock(params) {\n // Access link traversal context\n const sourceObject = params.sourceObject;\n const linkName = \"${linkName}\";\n\n // Generate linked objects based on source\n const linkedObjects = Array.from({ length: 3 }, (_, index) => {\n const id = generateId();\n return {\n $apiName: \"${linkedType}\",\n $primaryKey: id,\n $objectType: \"${linkedType}\",\n $title: \\`${linkedType} \\${index + 1}\\`,\n // Add relationship fields\n sourceId: sourceObject?.$primaryKey,\n ${this.generateDynamicFieldsForObjectType(linkedType)}\n };\n });\n\n return {\n data: linkedObjects,\n totalCount: String(linkedObjects.length)\n };\n}\n\nfunction generateId() {\n return crypto.randomUUID();\n}`;\n }\n\n private static generateQueryFunctionCode(queryData: DiscoveredQuery): string {\n return `function generateMock(params) {\n // Access advanced query parameters\n console.log(\"Query params:\", params);\n\n // Generate dynamic results based on query\n const results = Array.from({ length: 5 }, (_, index) => ({\n id: generateId(),\n __apiName: \"QueryResult\",\n __primaryKey: generateId(),\n __title: \\`Result \\${index + 1}\\`,\n // Add computed fields\n score: Math.random() * 100,\n relevance: Math.random(),\n timestamp: new Date().toISOString()\n }));\n\n return {\n data: results,\n totalCount: String(results.length),\n metadata: {\n queryType: \"${queryData.hookType || \"advanced\"}\",\n executionTime: Math.random() * 1000\n }\n };\n}\n\nfunction generateId() {\n return crypto.randomUUID();\n}`;\n }\n\n private static generateFieldsForObjectType(\n objectType: string\n ): Record<string, unknown> {\n if (objectType === \"Todo\") {\n return {\n title: \"Sample Todo\",\n isComplete: false,\n description: \"This is a mock todo item\",\n createdAt: new Date().toISOString(),\n };\n }\n\n if (objectType === \"Employee\") {\n return {\n employeeId: Math.floor(Math.random() * 10000),\n fullName: \"John Doe\",\n email: \"john.doe@example.com\",\n department: \"Engineering\",\n };\n }\n\n if (objectType === \"Office\") {\n return {\n officeId: `OFFICE-${Math.floor(Math.random() * 100)}`,\n name: \"Main Office\",\n location: \"New York\",\n capacity: 100,\n };\n }\n\n return {\n name: `Sample ${objectType}`,\n status: \"ACTIVE\",\n createdAt: new Date().toISOString(),\n modifiedAt: new Date().toISOString(),\n };\n }\n\n private static generateDynamicFieldsForObjectType(\n objectType: string\n ): string {\n if (objectType === \"Todo\") {\n return `title: \\`Todo Item \\${index || \"\"}\\`,\n isComplete: Math.random() > 0.5,\n description: \"Generated todo description\",\n createdAt: new Date().toISOString()`;\n }\n\n if (objectType === \"Employee\") {\n return `employeeId: Math.floor(Math.random() * 10000),\n fullName: \\`Employee \\${index || \"\"}\\`,\n email: \\`employee\\${index || \"\"}@example.com\\`,\n department: [\"Engineering\", \"Sales\", \"Marketing\"][Math.floor(Math.random() * 3)]`;\n }\n\n return `name: \\`${objectType} \\${index || \"\"}\\`,\n status: \"ACTIVE\",\n createdAt: new Date().toISOString()`;\n }\n\n private static extractObjectTypeFromAction(actionName: string): string {\n const patterns = [\n /create[_-]?(\\w+)/iu,\n /add[_-]?(\\w+)/iu,\n /new[_-]?(\\w+)/iu,\n /(\\w+)[_-]?create/iu,\n /(\\w+)[_-]?add/iu,\n ];\n\n for (const pattern of patterns) {\n const match = actionName.match(pattern);\n if (match && match[1]) {\n return (\n match[1].charAt(0).toUpperCase() + match[1].slice(1).toLowerCase()\n );\n }\n }\n\n return \"Object\";\n }\n\n private static inferLinkedTypeFromLinkName(\n linkName: string,\n sourceType: string\n ): string {\n if (linkName === \"occupants\" || linkName === \"employees\") {\n return \"Employee\";\n }\n if (linkName === \"offices\" || linkName === \"locations\") {\n return \"Office\";\n }\n if (linkName === \"todos\" || linkName === \"tasks\") {\n return \"Todo\";\n }\n if (linkName === \"children\" || linkName === \"parents\") {\n return sourceType;\n }\n\n let singular = linkName;\n if (linkName.endsWith(\"ies\")) {\n singular = `${linkName.slice(0, -3)}y`;\n } else if (linkName.endsWith(\"es\")) {\n singular = linkName.slice(0, -2);\n } else if (linkName.endsWith(\"s\")) {\n singular = linkName.slice(0, -1);\n }\n\n return singular.charAt(0).toUpperCase() + singular.slice(1);\n }\n\n private static generateCreateParameters(\n objectType: string\n ): Record<string, unknown> {\n if (objectType === \"Todo\") {\n return {\n Todo: \"New Todo Item\",\n is_complete: false,\n location: \"0,0\",\n };\n }\n\n if (objectType === \"Employee\") {\n return {\n fullName: \"John Doe\",\n email: \"john.doe@example.com\",\n employeeId: Math.floor(Math.random() * 10000),\n department: \"Engineering\",\n };\n }\n\n return {\n name: `New ${objectType}`,\n description: `Description for ${objectType}`,\n status: \"ACTIVE\",\n };\n }\n\n private static generateUpdateParameters(\n objectType: string\n ): Record<string, unknown> {\n if (objectType === \"Todo\") {\n return {\n todo: { $primaryKey: crypto.randomUUID() },\n is_complete: true,\n Todo: \"Updated Todo\",\n };\n }\n\n if (objectType === \"Employee\") {\n return {\n employee: { $primaryKey: crypto.randomUUID() },\n department: \"Marketing\",\n email: \"updated.email@example.com\",\n };\n }\n\n return {\n object: { $primaryKey: crypto.randomUUID() },\n name: `Updated ${objectType}`,\n status: \"MODIFIED\",\n };\n }\n\n private static generateDeleteParameters(\n _objectType: string\n ): Record<string, unknown> {\n return {\n object: { $primaryKey: crypto.randomUUID() },\n reason: \"No longer needed\",\n };\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -164,7 +164,7 @@ export class PerformanceRecommendationEngine {
|
|
|
164
164
|
const timeToFix = minutesToFix < 60 ? `${minutesToFix} minutes` : `${Math.round(minutesToFix / 60)} hours`;
|
|
165
165
|
const totalImpact = recommendations.reduce((sum, r) => {
|
|
166
166
|
if (r.impact.includes("Save")) {
|
|
167
|
-
const match = r.impact.match(/(\d+)(ms|KB|s)/);
|
|
167
|
+
const match = r.impact.match(/(\d+)(ms|KB|s)/u);
|
|
168
168
|
if (match) {
|
|
169
169
|
const value = Number.parseInt(match[1]);
|
|
170
170
|
const unit = match[2];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PerformanceRecommendationEngine.js","names":["CacheEfficiencyAnalyzer","UnusedFieldAnalyzer","WaterfallDetector","PerformanceRecommendationEngine","dismissedRecommendations","Set","constructor","metricsStore","registry","timeline","cacheAnalyzer","fieldAnalyzer","undefined","waterfallDetector","generateRecommendations","cacheSnapshot","recommendations","waterfalls","detectWaterfalls","wf","waterfallId","details","childQuery","parentQuery","has","push","id","level","priority","category","title","type","timeSaved","description","suggestion","impact","effort","code","dismissible","fieldReport","generateGlobalReport","offender","topOffenders","slice","querySignature","wastedBytes","componentName","fetched","length","accessed","toFixed","cacheMetrics","analyze","rec","message","priorityOrder","critical","high","medium","low","info","sort","a","b","calculatePerformanceScore","cacheScore","Math","round","score","queryScore","min","bandwidthScore","totalWastedBytes","codeQualityScore","averageEfficiency","overall","breakdown","penalty","count","fieldEfficiency","rate","cacheHitRate","hitRate","wastedBandwidth","bytes","grade","scoreToGrade","categories","cache","queries","bandwidth","codeQuality","dismissRecommendation","add","clearDismissed","clear","getSummary","criticalCount","filter","r","lowEffortCount","mediumEffortCount","highEffortCount","minutesToFix","timeToFix","totalImpact","reduce","sum","includes","match","value","Number","parseInt","unit","estimatedImprovement","issueCount"],"sources":["PerformanceRecommendationEngine.ts"],"sourcesContent":["/*\n * Copyright 2025 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type { CacheSnapshot } from \"@osdk/client/observable\";\n\nimport type { MetricsStore } from \"../store/MetricsStore.js\";\nimport { CacheEfficiencyAnalyzer } from \"./CacheEfficiencyAnalyzer.js\";\nimport type { ComponentQueryRegistry } from \"./ComponentQueryRegistry.js\";\nimport type { EventTimeline } from \"./EventTimeline.js\";\nimport { UnusedFieldAnalyzer } from \"./UnusedFieldAnalyzer.js\";\nimport { WaterfallDetector } from \"./WaterfallDetector.js\";\n\nexport type RecommendationLevel =\n | \"critical\"\n | \"high\"\n | \"medium\"\n | \"low\"\n | \"info\";\nexport type RecommendationCategory =\n | \"Performance\"\n | \"Bandwidth\"\n | \"Code Quality\"\n | \"Cache\"\n | \"Queries\";\n\nexport interface Recommendation {\n id: string;\n level: RecommendationLevel;\n category: RecommendationCategory;\n title: string;\n description: string;\n impact: string; // What will improve (e.g., \"Save 50ms on page load\")\n effort: \"Low\" | \"Medium\" | \"High\";\n suggestion: string;\n code?: string;\n dismissible: boolean;\n}\n\nexport interface PerformanceScore {\n overall: number; // 0-100\n grade: \"A\" | \"B\" | \"C\" | \"D\" | \"F\";\n categories: {\n cache: number;\n queries: number;\n bandwidth: number;\n codeQuality: number;\n };\n breakdown: {\n waterfalls: { penalty: number; count: number };\n fieldEfficiency: { penalty: number; rate: number };\n cacheHitRate: { penalty: number; rate: number };\n wastedBandwidth: { penalty: number; bytes: number };\n };\n}\n\nexport class PerformanceRecommendationEngine {\n private cacheAnalyzer: CacheEfficiencyAnalyzer;\n private fieldAnalyzer: UnusedFieldAnalyzer;\n private waterfallDetector: WaterfallDetector;\n private dismissedRecommendations = new Set<string>();\n\n constructor(\n private metricsStore: MetricsStore,\n private registry: ComponentQueryRegistry,\n private timeline: EventTimeline\n ) {\n this.cacheAnalyzer = new CacheEfficiencyAnalyzer(metricsStore);\n this.fieldAnalyzer = new UnusedFieldAnalyzer(registry, undefined);\n this.waterfallDetector = new WaterfallDetector(registry, timeline);\n }\n\n generateRecommendations(cacheSnapshot: CacheSnapshot): Recommendation[] {\n const recommendations: Recommendation[] = [];\n\n const waterfalls = this.waterfallDetector.detectWaterfalls();\n for (const wf of waterfalls) {\n const waterfallId = wf.details.childQuery\n ? `waterfall-${wf.details.parentQuery}->${wf.details.childQuery}`\n : `waterfall-${wf.details.parentQuery}`;\n\n if (this.dismissedRecommendations.has(waterfallId)) {\n continue;\n }\n\n recommendations.push({\n id: waterfallId,\n level: wf.priority === \"high\" ? \"high\" : \"medium\",\n category: \"Performance\",\n title: `${\n wf.type === \"LINK_WATERFALL\" ? \"Link\" : \"Query\"\n } waterfall - ${wf.timeSaved}ms overhead`,\n description: wf.suggestion,\n impact: `Save ${wf.timeSaved}ms on load time`,\n effort: \"Low\",\n suggestion: wf.suggestion,\n code: wf.code,\n dismissible: true,\n });\n }\n\n const fieldReport = this.fieldAnalyzer.generateGlobalReport(cacheSnapshot);\n for (const offender of fieldReport.topOffenders.slice(0, 3)) {\n if (\n this.dismissedRecommendations.has(`field-${offender.querySignature}`)\n ) {\n continue;\n }\n\n recommendations.push({\n id: `field-${offender.querySignature}`,\n level: offender.wastedBytes > 50000 ? \"high\" : \"medium\",\n category: \"Bandwidth\",\n title: `${offender.componentName} fetches unused data`,\n description: `This component fetches ${offender.fetched.length} properties but only uses ${offender.accessed.length}`,\n impact: `Save ${(offender.wastedBytes / 1024).toFixed(\n 1\n )}KB bandwidth per load`,\n effort: \"Low\",\n suggestion: \"Use $select to only fetch used properties\",\n code: offender.suggestion,\n dismissible: true,\n });\n }\n\n const cacheMetrics = this.cacheAnalyzer.analyze(cacheSnapshot);\n for (const rec of cacheMetrics.recommendations) {\n if (this.dismissedRecommendations.has(`cache-${rec.title}`)) {\n continue;\n }\n\n if (rec.level === \"warning\" || rec.level === \"critical\") {\n recommendations.push({\n id: `cache-${rec.title}`,\n level: rec.level === \"critical\" ? \"critical\" : \"high\",\n category: \"Cache\",\n title: rec.title,\n description: rec.message,\n impact: rec.suggestion,\n effort: \"Medium\",\n suggestion: rec.suggestion,\n dismissible: true,\n });\n }\n }\n\n const priorityOrder: Record<RecommendationLevel, number> = {\n critical: 5,\n high: 4,\n medium: 3,\n low: 2,\n info: 1,\n };\n\n return recommendations\n .sort((a, b) => priorityOrder[b.level] - priorityOrder[a.level])\n .slice(0, 10); // Top 10 recommendations\n }\n\n calculatePerformanceScore(cacheSnapshot: CacheSnapshot): PerformanceScore {\n const waterfalls = this.waterfallDetector.detectWaterfalls();\n const fieldReport = this.fieldAnalyzer.generateGlobalReport(cacheSnapshot);\n const cacheMetrics = this.cacheAnalyzer.analyze(cacheSnapshot);\n\n const cacheScore = Math.round(cacheMetrics.score);\n const queryScore = Math.round(100 - Math.min(waterfalls.length * 5, 50));\n const bandwidthScore = Math.round(\n 100 - Math.min((fieldReport.totalWastedBytes / 1024 / 100) * 10, 40)\n );\n const codeQualityScore = Math.round(\n 100 - Math.min((1 - fieldReport.averageEfficiency) * 30, 50)\n );\n\n const overall = Math.round(\n cacheScore * 0.3 +\n queryScore * 0.3 +\n bandwidthScore * 0.2 +\n codeQualityScore * 0.2\n );\n\n const breakdown = {\n waterfalls: {\n penalty: Math.min(waterfalls.length * 5, 30),\n count: waterfalls.length,\n },\n fieldEfficiency: {\n penalty: (1 - fieldReport.averageEfficiency) * 20,\n rate: fieldReport.averageEfficiency,\n },\n cacheHitRate: {\n penalty: (1 - cacheMetrics.hitRate) * 20,\n rate: cacheMetrics.hitRate,\n },\n wastedBandwidth: {\n penalty: Math.min(fieldReport.totalWastedBytes / 10000, 15),\n bytes: fieldReport.totalWastedBytes,\n },\n };\n\n return {\n overall,\n grade: this.scoreToGrade(overall),\n categories: {\n cache: cacheScore,\n queries: queryScore,\n bandwidth: bandwidthScore,\n codeQuality: codeQualityScore,\n },\n breakdown,\n };\n }\n\n private scoreToGrade(score: number): \"A\" | \"B\" | \"C\" | \"D\" | \"F\" {\n if (score >= 90) {\n return \"A\";\n }\n if (score >= 80) {\n return \"B\";\n }\n if (score >= 70) {\n return \"C\";\n }\n if (score >= 60) {\n return \"D\";\n }\n return \"F\";\n }\n\n dismissRecommendation(id: string): void {\n this.dismissedRecommendations.add(id);\n }\n\n clearDismissed(): void {\n this.dismissedRecommendations.clear();\n }\n\n getSummary(cacheSnapshot: CacheSnapshot): {\n issueCount: number;\n criticalCount: number;\n timeToFix: string;\n estimatedImprovement: string;\n } {\n const recommendations = this.generateRecommendations(cacheSnapshot);\n const criticalCount = recommendations.filter(\n (r) => r.level === \"critical\"\n ).length;\n\n const lowEffortCount = recommendations.filter(\n (r) => r.effort === \"Low\"\n ).length;\n const mediumEffortCount = recommendations.filter(\n (r) => r.effort === \"Medium\"\n ).length;\n const highEffortCount = recommendations.filter(\n (r) => r.effort === \"High\"\n ).length;\n\n const minutesToFix =\n lowEffortCount * 5 + mediumEffortCount * 20 + highEffortCount * 60;\n const timeToFix =\n minutesToFix < 60\n ? `${minutesToFix} minutes`\n : `${Math.round(minutesToFix / 60)} hours`;\n\n const totalImpact = recommendations.reduce((sum, r) => {\n if (r.impact.includes(\"Save\")) {\n const match = r.impact.match(/(\\d+)(ms|KB|s)/);\n if (match) {\n const value = Number.parseInt(match[1]);\n const unit = match[2];\n return (\n sum +\n (unit === \"ms\" ? value : unit === \"KB\" ? value / 100 : value * 1000)\n );\n }\n }\n return sum;\n }, 0);\n\n const estimatedImprovement =\n totalImpact > 1000\n ? `~${(totalImpact / 1000).toFixed(1)}s improvement`\n : `~${Math.round(totalImpact)}ms improvement`;\n\n return {\n issueCount: recommendations.length,\n criticalCount,\n timeToFix,\n estimatedImprovement,\n };\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"PerformanceRecommendationEngine.js","names":["CacheEfficiencyAnalyzer","UnusedFieldAnalyzer","WaterfallDetector","PerformanceRecommendationEngine","dismissedRecommendations","Set","constructor","metricsStore","registry","timeline","cacheAnalyzer","fieldAnalyzer","undefined","waterfallDetector","generateRecommendations","cacheSnapshot","recommendations","waterfalls","detectWaterfalls","wf","waterfallId","details","childQuery","parentQuery","has","push","id","level","priority","category","title","type","timeSaved","description","suggestion","impact","effort","code","dismissible","fieldReport","generateGlobalReport","offender","topOffenders","slice","querySignature","wastedBytes","componentName","fetched","length","accessed","toFixed","cacheMetrics","analyze","rec","message","priorityOrder","critical","high","medium","low","info","sort","a","b","calculatePerformanceScore","cacheScore","Math","round","score","queryScore","min","bandwidthScore","totalWastedBytes","codeQualityScore","averageEfficiency","overall","breakdown","penalty","count","fieldEfficiency","rate","cacheHitRate","hitRate","wastedBandwidth","bytes","grade","scoreToGrade","categories","cache","queries","bandwidth","codeQuality","dismissRecommendation","add","clearDismissed","clear","getSummary","criticalCount","filter","r","lowEffortCount","mediumEffortCount","highEffortCount","minutesToFix","timeToFix","totalImpact","reduce","sum","includes","match","value","Number","parseInt","unit","estimatedImprovement","issueCount"],"sources":["PerformanceRecommendationEngine.ts"],"sourcesContent":["/*\n * Copyright 2025 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type { CacheSnapshot } from \"@osdk/client/observable\";\n\nimport type { MetricsStore } from \"../store/MetricsStore.js\";\nimport { CacheEfficiencyAnalyzer } from \"./CacheEfficiencyAnalyzer.js\";\nimport type { ComponentQueryRegistry } from \"./ComponentQueryRegistry.js\";\nimport type { EventTimeline } from \"./EventTimeline.js\";\nimport { UnusedFieldAnalyzer } from \"./UnusedFieldAnalyzer.js\";\nimport { WaterfallDetector } from \"./WaterfallDetector.js\";\n\nexport type RecommendationLevel =\n | \"critical\"\n | \"high\"\n | \"medium\"\n | \"low\"\n | \"info\";\nexport type RecommendationCategory =\n | \"Performance\"\n | \"Bandwidth\"\n | \"Code Quality\"\n | \"Cache\"\n | \"Queries\";\n\nexport interface Recommendation {\n id: string;\n level: RecommendationLevel;\n category: RecommendationCategory;\n title: string;\n description: string;\n impact: string; // What will improve (e.g., \"Save 50ms on page load\")\n effort: \"Low\" | \"Medium\" | \"High\";\n suggestion: string;\n code?: string;\n dismissible: boolean;\n}\n\nexport interface PerformanceScore {\n overall: number; // 0-100\n grade: \"A\" | \"B\" | \"C\" | \"D\" | \"F\";\n categories: {\n cache: number;\n queries: number;\n bandwidth: number;\n codeQuality: number;\n };\n breakdown: {\n waterfalls: { penalty: number; count: number };\n fieldEfficiency: { penalty: number; rate: number };\n cacheHitRate: { penalty: number; rate: number };\n wastedBandwidth: { penalty: number; bytes: number };\n };\n}\n\nexport class PerformanceRecommendationEngine {\n private cacheAnalyzer: CacheEfficiencyAnalyzer;\n private fieldAnalyzer: UnusedFieldAnalyzer;\n private waterfallDetector: WaterfallDetector;\n private dismissedRecommendations = new Set<string>();\n\n constructor(\n private metricsStore: MetricsStore,\n private registry: ComponentQueryRegistry,\n private timeline: EventTimeline\n ) {\n this.cacheAnalyzer = new CacheEfficiencyAnalyzer(metricsStore);\n this.fieldAnalyzer = new UnusedFieldAnalyzer(registry, undefined);\n this.waterfallDetector = new WaterfallDetector(registry, timeline);\n }\n\n generateRecommendations(cacheSnapshot: CacheSnapshot): Recommendation[] {\n const recommendations: Recommendation[] = [];\n\n const waterfalls = this.waterfallDetector.detectWaterfalls();\n for (const wf of waterfalls) {\n const waterfallId = wf.details.childQuery\n ? `waterfall-${wf.details.parentQuery}->${wf.details.childQuery}`\n : `waterfall-${wf.details.parentQuery}`;\n\n if (this.dismissedRecommendations.has(waterfallId)) {\n continue;\n }\n\n recommendations.push({\n id: waterfallId,\n level: wf.priority === \"high\" ? \"high\" : \"medium\",\n category: \"Performance\",\n title: `${\n wf.type === \"LINK_WATERFALL\" ? \"Link\" : \"Query\"\n } waterfall - ${wf.timeSaved}ms overhead`,\n description: wf.suggestion,\n impact: `Save ${wf.timeSaved}ms on load time`,\n effort: \"Low\",\n suggestion: wf.suggestion,\n code: wf.code,\n dismissible: true,\n });\n }\n\n const fieldReport = this.fieldAnalyzer.generateGlobalReport(cacheSnapshot);\n for (const offender of fieldReport.topOffenders.slice(0, 3)) {\n if (\n this.dismissedRecommendations.has(`field-${offender.querySignature}`)\n ) {\n continue;\n }\n\n recommendations.push({\n id: `field-${offender.querySignature}`,\n level: offender.wastedBytes > 50000 ? \"high\" : \"medium\",\n category: \"Bandwidth\",\n title: `${offender.componentName} fetches unused data`,\n description: `This component fetches ${offender.fetched.length} properties but only uses ${offender.accessed.length}`,\n impact: `Save ${(offender.wastedBytes / 1024).toFixed(\n 1\n )}KB bandwidth per load`,\n effort: \"Low\",\n suggestion: \"Use $select to only fetch used properties\",\n code: offender.suggestion,\n dismissible: true,\n });\n }\n\n const cacheMetrics = this.cacheAnalyzer.analyze(cacheSnapshot);\n for (const rec of cacheMetrics.recommendations) {\n if (this.dismissedRecommendations.has(`cache-${rec.title}`)) {\n continue;\n }\n\n if (rec.level === \"warning\" || rec.level === \"critical\") {\n recommendations.push({\n id: `cache-${rec.title}`,\n level: rec.level === \"critical\" ? \"critical\" : \"high\",\n category: \"Cache\",\n title: rec.title,\n description: rec.message,\n impact: rec.suggestion,\n effort: \"Medium\",\n suggestion: rec.suggestion,\n dismissible: true,\n });\n }\n }\n\n const priorityOrder: Record<RecommendationLevel, number> = {\n critical: 5,\n high: 4,\n medium: 3,\n low: 2,\n info: 1,\n };\n\n return recommendations\n .sort((a, b) => priorityOrder[b.level] - priorityOrder[a.level])\n .slice(0, 10); // Top 10 recommendations\n }\n\n calculatePerformanceScore(cacheSnapshot: CacheSnapshot): PerformanceScore {\n const waterfalls = this.waterfallDetector.detectWaterfalls();\n const fieldReport = this.fieldAnalyzer.generateGlobalReport(cacheSnapshot);\n const cacheMetrics = this.cacheAnalyzer.analyze(cacheSnapshot);\n\n const cacheScore = Math.round(cacheMetrics.score);\n const queryScore = Math.round(100 - Math.min(waterfalls.length * 5, 50));\n const bandwidthScore = Math.round(\n 100 - Math.min((fieldReport.totalWastedBytes / 1024 / 100) * 10, 40)\n );\n const codeQualityScore = Math.round(\n 100 - Math.min((1 - fieldReport.averageEfficiency) * 30, 50)\n );\n\n const overall = Math.round(\n cacheScore * 0.3 +\n queryScore * 0.3 +\n bandwidthScore * 0.2 +\n codeQualityScore * 0.2\n );\n\n const breakdown = {\n waterfalls: {\n penalty: Math.min(waterfalls.length * 5, 30),\n count: waterfalls.length,\n },\n fieldEfficiency: {\n penalty: (1 - fieldReport.averageEfficiency) * 20,\n rate: fieldReport.averageEfficiency,\n },\n cacheHitRate: {\n penalty: (1 - cacheMetrics.hitRate) * 20,\n rate: cacheMetrics.hitRate,\n },\n wastedBandwidth: {\n penalty: Math.min(fieldReport.totalWastedBytes / 10000, 15),\n bytes: fieldReport.totalWastedBytes,\n },\n };\n\n return {\n overall,\n grade: this.scoreToGrade(overall),\n categories: {\n cache: cacheScore,\n queries: queryScore,\n bandwidth: bandwidthScore,\n codeQuality: codeQualityScore,\n },\n breakdown,\n };\n }\n\n private scoreToGrade(score: number): \"A\" | \"B\" | \"C\" | \"D\" | \"F\" {\n if (score >= 90) {\n return \"A\";\n }\n if (score >= 80) {\n return \"B\";\n }\n if (score >= 70) {\n return \"C\";\n }\n if (score >= 60) {\n return \"D\";\n }\n return \"F\";\n }\n\n dismissRecommendation(id: string): void {\n this.dismissedRecommendations.add(id);\n }\n\n clearDismissed(): void {\n this.dismissedRecommendations.clear();\n }\n\n getSummary(cacheSnapshot: CacheSnapshot): {\n issueCount: number;\n criticalCount: number;\n timeToFix: string;\n estimatedImprovement: string;\n } {\n const recommendations = this.generateRecommendations(cacheSnapshot);\n const criticalCount = recommendations.filter(\n (r) => r.level === \"critical\"\n ).length;\n\n const lowEffortCount = recommendations.filter(\n (r) => r.effort === \"Low\"\n ).length;\n const mediumEffortCount = recommendations.filter(\n (r) => r.effort === \"Medium\"\n ).length;\n const highEffortCount = recommendations.filter(\n (r) => r.effort === \"High\"\n ).length;\n\n const minutesToFix =\n lowEffortCount * 5 + mediumEffortCount * 20 + highEffortCount * 60;\n const timeToFix =\n minutesToFix < 60\n ? `${minutesToFix} minutes`\n : `${Math.round(minutesToFix / 60)} hours`;\n\n const totalImpact = recommendations.reduce((sum, r) => {\n if (r.impact.includes(\"Save\")) {\n const match = r.impact.match(/(\\d+)(ms|KB|s)/u);\n if (match) {\n const value = Number.parseInt(match[1]);\n const unit = match[2];\n return (\n sum +\n (unit === \"ms\" ? value : unit === \"KB\" ? value / 100 : value * 1000)\n );\n }\n }\n return sum;\n }, 0);\n\n const estimatedImprovement =\n totalImpact > 1000\n ? `~${(totalImpact / 1000).toFixed(1)}s improvement`\n : `~${Math.round(totalImpact)}ms improvement`;\n\n return {\n issueCount: recommendations.length,\n criticalCount,\n timeToFix,\n estimatedImprovement,\n };\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
* limitations under the License.
|
|
15
15
|
*/
|
|
16
16
|
|
|
17
|
-
const QUERY_SIGNATURE_RE = /^(\w+):(.+)
|
|
17
|
+
const QUERY_SIGNATURE_RE = /^(\w+):(.+)/u;
|
|
18
18
|
export class UnusedFieldAnalyzer {
|
|
19
19
|
constructor(registry, propertyTracker, estimateCacheEntrySize = data => UnusedFieldAnalyzer.defaultSizeEstimator(data)) {
|
|
20
20
|
this.registry = registry;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"UnusedFieldAnalyzer.js","names":["QUERY_SIGNATURE_RE","UnusedFieldAnalyzer","constructor","registry","propertyTracker","estimateCacheEntrySize","data","defaultSizeEstimator","analyzeBinding","binding","cacheSnapshot","componentId","querySignature","componentName","accessed","getAccessedProperties","cacheEntry","entries","find","e","key","fetchedProps","Object","keys","cleanFetched","filter","p","startsWith","unused","prop","has","entrySize","metadata","size","wastedBytes","length","Math","floor","efficiency","suggestion","generateSuggestion","renderCount","fetched","generateGlobalReport","allBindings","getAllBindings","b","unmountedAt","analyses","map","inefficient","a","sort","totalWaste","reduce","sum","commonUnused","findCommonUnusedFields","avgEfficiency","recommendation","generateGlobalRecommendation","totalComponents","inefficientComponents","totalWastedBytes","topOffenders","slice","averageEfficiency","Set","fieldCount","Map","analysis","match","objectType","undefined","field","current","get","total","set","unusedCount","totalQueries","unusedRate","f","usedProps","hookType","queryParams","type","join","trim","JSON","stringify","where","inefficientCount","inefficiencyRate","toFixed","Array","isArray","item","values","value"],"sources":["UnusedFieldAnalyzer.ts"],"sourcesContent":["/*\n * Copyright 2025 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type { CacheSnapshot } from \"@osdk/client/observable\";\n\nimport type {\n ComponentHookBinding,\n ComponentQueryRegistry,\n} from \"./ComponentQueryRegistry.js\";\nimport type { PropertyAccessTracker } from \"./PropertyAccessTracker.js\";\n\nexport interface PropertyAccessTrackerWithAnalysis extends PropertyAccessTracker {\n getAccessedProperties(\n componentId: string,\n querySignature: string\n ): Set<string>;\n}\n\nexport interface FieldUsageReport {\n componentName: string;\n querySignature: string;\n fetched: string[];\n accessed: string[];\n unused: string[];\n efficiency: number; // 0-1 ratio of accessed/fetched\n wastedBytes: number;\n renderCount: number;\n suggestion: string;\n}\n\nexport interface CommonUnusedField {\n field: string;\n objectType?: string;\n unusedCount: number;\n totalQueries: number;\n unusedRate: number;\n}\n\nexport interface UnusedFieldReport {\n totalComponents: number;\n inefficientComponents: number;\n totalWastedBytes: number;\n topOffenders: FieldUsageReport[];\n commonUnused: CommonUnusedField[];\n averageEfficiency: number;\n recommendation: string;\n}\n\nconst QUERY_SIGNATURE_RE = /^(\\w+):(.+)/;\n\nexport class UnusedFieldAnalyzer {\n constructor(\n private registry: ComponentQueryRegistry,\n private propertyTracker: PropertyAccessTrackerWithAnalysis | undefined,\n private estimateCacheEntrySize: (data: unknown) => number = (data) =>\n UnusedFieldAnalyzer.defaultSizeEstimator(data)\n ) {}\n\n analyzeBinding(\n binding: ComponentHookBinding,\n cacheSnapshot: CacheSnapshot\n ): FieldUsageReport {\n const { componentId, querySignature, componentName } = binding;\n\n const accessed = this.getAccessedProperties(componentId, querySignature);\n\n const cacheEntry = cacheSnapshot.entries?.find(\n (e) => e.key === querySignature\n );\n const fetchedProps = cacheEntry?.data ? Object.keys(cacheEntry.data) : [];\n\n const cleanFetched = fetchedProps.filter(\n (p) => !p.startsWith(\"$\") && p !== \"__typename\"\n );\n\n const unused = cleanFetched.filter((prop) => !accessed.has(prop));\n\n const entrySize =\n cacheEntry?.metadata.size ??\n this.estimateCacheEntrySize(cacheEntry?.data);\n const wastedBytes =\n unused.length > 0 && cleanFetched.length > 0\n ? Math.floor(entrySize * (unused.length / cleanFetched.length))\n : 0;\n\n const efficiency =\n cleanFetched.length > 0 ? accessed.size / cleanFetched.length : 1;\n\n const suggestion = this.generateSuggestion(binding, [...accessed]);\n\n const renderCount = binding.renderCount;\n\n return {\n componentName,\n querySignature,\n fetched: cleanFetched,\n accessed: [...accessed],\n unused,\n efficiency,\n wastedBytes,\n renderCount,\n suggestion,\n };\n }\n\n generateGlobalReport(cacheSnapshot: CacheSnapshot): UnusedFieldReport {\n const allBindings = this.registry\n .getAllBindings()\n .filter((b) => !b.unmountedAt);\n\n const analyses = allBindings.map((b) =>\n this.analyzeBinding(b, cacheSnapshot)\n );\n\n const inefficient = analyses\n .filter((a) => a.efficiency < 0.7) // Using <70% of fetched data\n .sort((a, b) => a.efficiency - b.efficiency);\n\n const totalWaste = analyses.reduce((sum, a) => sum + a.wastedBytes, 0);\n const commonUnused = this.findCommonUnusedFields(analyses);\n const avgEfficiency =\n analyses.length > 0\n ? analyses.reduce((sum, a) => sum + a.efficiency, 0) / analyses.length\n : 1;\n\n const recommendation = this.generateGlobalRecommendation(\n analyses,\n totalWaste,\n commonUnused\n );\n\n return {\n totalComponents: analyses.length,\n inefficientComponents: inefficient.length,\n totalWastedBytes: totalWaste,\n topOffenders: inefficient.slice(0, 10),\n commonUnused,\n averageEfficiency: avgEfficiency,\n recommendation,\n };\n }\n\n private getAccessedProperties(\n componentId: string,\n querySignature: string\n ): Set<string> {\n if (!this.propertyTracker) {\n return new Set<string>();\n }\n return this.propertyTracker.getAccessedProperties(\n componentId,\n querySignature\n );\n }\n\n private findCommonUnusedFields(\n analyses: FieldUsageReport[]\n ): CommonUnusedField[] {\n const fieldCount = new Map<\n string,\n { unused: number; total: number; objectType?: string }\n >();\n\n for (const analysis of analyses) {\n const match = analysis.querySignature.match(QUERY_SIGNATURE_RE);\n const objectType = match ? match[1] : undefined;\n\n for (const field of analysis.unused) {\n const key = `${objectType}:${field}`;\n const current = fieldCount.get(key) || {\n unused: 0,\n total: 0,\n objectType,\n };\n current.unused++;\n current.total++;\n fieldCount.set(key, current);\n }\n }\n\n return [...fieldCount.entries()]\n .map(([key, { unused, total, objectType }]) => ({\n field: key,\n objectType,\n unusedCount: unused,\n totalQueries: total,\n unusedRate: unused / total,\n }))\n .filter((f) => f.unusedRate > 0.7 && f.totalQueries > 2) // 70%+ unused, 3+ queries\n .sort((a, b) => b.unusedCount - a.unusedCount);\n }\n\n private generateSuggestion(\n binding: ComponentHookBinding,\n usedProps: string[]\n ): string {\n const { hookType, queryParams, componentName } = binding;\n\n if (hookType === \"useOsdkObject\" && queryParams.type === \"object\") {\n return `\n// In ${componentName}.tsx:\n// Current: Fetching all properties\nconst { object } = useOsdkObject(${queryParams.objectType}, id);\n\n// Optimized: Only fetch what you use\nconst { object } = useOsdkObject(${queryParams.objectType}, id, {\n $select: [${\n usedProps.length > 0 ? usedProps.map((p) => `\"${p}\"`).join(\", \") : '\"id\"'\n }]\n});\n\n// This query will be more efficient!\n `.trim(); // fallback\n } else if (hookType === \"useOsdkObjects\" && queryParams.type === \"list\") {\n return `\n// In ${componentName}.tsx:\n// Current: Fetching all properties\nconst { data } = useOsdkObjects(${queryParams.objectType}, {\n where: ${JSON.stringify(queryParams.where || {})}\n});\n\n// Optimized: Only fetch what you use\nconst { data } = useOsdkObjects(${queryParams.objectType}, {\n where: ${JSON.stringify(queryParams.where || {})},\n $select: [${\n usedProps.length > 0 ? usedProps.map((p) => `\"${p}\"`).join(\", \") : '\"id\"'\n }]\n});\n `.trim();\n }\n\n return \"Consider using $select to only fetch used properties\";\n }\n\n private generateGlobalRecommendation(\n analyses: FieldUsageReport[],\n totalWaste: number,\n commonUnused: CommonUnusedField[]\n ): string {\n if (analyses.length === 0) {\n return \"No queries analyzed yet\";\n }\n\n const inefficientCount = analyses.filter((a) => a.efficiency < 0.7).length;\n const inefficiencyRate = inefficientCount / analyses.length;\n\n if (inefficiencyRate > 0.5) {\n return `\nš“ HIGH PRIORITY: ${inefficientCount} of ${analyses.length} components are fetching unused data (${(\n totalWaste / 1024\n ).toFixed(1)}KB total waste).\n\nConsider adding $select clauses to your queries to only fetch used properties.\nThis will reduce bandwidth, improve performance, and lower data costs.\n\nStart with the top offenders listed above.\n `.trim();\n } else if (inefficientCount > 0) {\n return `\nš” MEDIUM PRIORITY: ${inefficientCount} components have unused fields.\n\nYou could optimize these queries with $select to save ~${(\n totalWaste / 1024\n ).toFixed(1)}KB bandwidth.\n `.trim();\n } else {\n return `\nā
EXCELLENT: All queries are using fetched data efficiently!\nContinue monitoring as features change.\n `.trim();\n }\n }\n\n private static defaultSizeEstimator(data: unknown): number {\n if (!data) return 0;\n if (typeof data === \"string\") return data.length;\n if (typeof data === \"number\") return 8;\n if (typeof data === \"boolean\") return 1;\n if (Array.isArray(data)) {\n return data.reduce<number>(\n (sum, item) => sum + UnusedFieldAnalyzer.defaultSizeEstimator(item),\n 0\n );\n }\n if (typeof data === \"object\") {\n return Object.values(data as Record<string, unknown>).reduce<number>(\n (sum, value) => sum + UnusedFieldAnalyzer.defaultSizeEstimator(value),\n 0\n );\n }\n return 100; // Rough estimate for unknowns\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"UnusedFieldAnalyzer.js","names":["QUERY_SIGNATURE_RE","UnusedFieldAnalyzer","constructor","registry","propertyTracker","estimateCacheEntrySize","data","defaultSizeEstimator","analyzeBinding","binding","cacheSnapshot","componentId","querySignature","componentName","accessed","getAccessedProperties","cacheEntry","entries","find","e","key","fetchedProps","Object","keys","cleanFetched","filter","p","startsWith","unused","prop","has","entrySize","metadata","size","wastedBytes","length","Math","floor","efficiency","suggestion","generateSuggestion","renderCount","fetched","generateGlobalReport","allBindings","getAllBindings","b","unmountedAt","analyses","map","inefficient","a","sort","totalWaste","reduce","sum","commonUnused","findCommonUnusedFields","avgEfficiency","recommendation","generateGlobalRecommendation","totalComponents","inefficientComponents","totalWastedBytes","topOffenders","slice","averageEfficiency","Set","fieldCount","Map","analysis","match","objectType","undefined","field","current","get","total","set","unusedCount","totalQueries","unusedRate","f","usedProps","hookType","queryParams","type","join","trim","JSON","stringify","where","inefficientCount","inefficiencyRate","toFixed","Array","isArray","item","values","value"],"sources":["UnusedFieldAnalyzer.ts"],"sourcesContent":["/*\n * Copyright 2025 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type { CacheSnapshot } from \"@osdk/client/observable\";\n\nimport type {\n ComponentHookBinding,\n ComponentQueryRegistry,\n} from \"./ComponentQueryRegistry.js\";\nimport type { PropertyAccessTracker } from \"./PropertyAccessTracker.js\";\n\nexport interface PropertyAccessTrackerWithAnalysis extends PropertyAccessTracker {\n getAccessedProperties(\n componentId: string,\n querySignature: string\n ): Set<string>;\n}\n\nexport interface FieldUsageReport {\n componentName: string;\n querySignature: string;\n fetched: string[];\n accessed: string[];\n unused: string[];\n efficiency: number; // 0-1 ratio of accessed/fetched\n wastedBytes: number;\n renderCount: number;\n suggestion: string;\n}\n\nexport interface CommonUnusedField {\n field: string;\n objectType?: string;\n unusedCount: number;\n totalQueries: number;\n unusedRate: number;\n}\n\nexport interface UnusedFieldReport {\n totalComponents: number;\n inefficientComponents: number;\n totalWastedBytes: number;\n topOffenders: FieldUsageReport[];\n commonUnused: CommonUnusedField[];\n averageEfficiency: number;\n recommendation: string;\n}\n\nconst QUERY_SIGNATURE_RE = /^(\\w+):(.+)/u;\n\nexport class UnusedFieldAnalyzer {\n constructor(\n private registry: ComponentQueryRegistry,\n private propertyTracker: PropertyAccessTrackerWithAnalysis | undefined,\n private estimateCacheEntrySize: (data: unknown) => number = (data) =>\n UnusedFieldAnalyzer.defaultSizeEstimator(data)\n ) {}\n\n analyzeBinding(\n binding: ComponentHookBinding,\n cacheSnapshot: CacheSnapshot\n ): FieldUsageReport {\n const { componentId, querySignature, componentName } = binding;\n\n const accessed = this.getAccessedProperties(componentId, querySignature);\n\n const cacheEntry = cacheSnapshot.entries?.find(\n (e) => e.key === querySignature\n );\n const fetchedProps = cacheEntry?.data ? Object.keys(cacheEntry.data) : [];\n\n const cleanFetched = fetchedProps.filter(\n (p) => !p.startsWith(\"$\") && p !== \"__typename\"\n );\n\n const unused = cleanFetched.filter((prop) => !accessed.has(prop));\n\n const entrySize =\n cacheEntry?.metadata.size ??\n this.estimateCacheEntrySize(cacheEntry?.data);\n const wastedBytes =\n unused.length > 0 && cleanFetched.length > 0\n ? Math.floor(entrySize * (unused.length / cleanFetched.length))\n : 0;\n\n const efficiency =\n cleanFetched.length > 0 ? accessed.size / cleanFetched.length : 1;\n\n const suggestion = this.generateSuggestion(binding, [...accessed]);\n\n const renderCount = binding.renderCount;\n\n return {\n componentName,\n querySignature,\n fetched: cleanFetched,\n accessed: [...accessed],\n unused,\n efficiency,\n wastedBytes,\n renderCount,\n suggestion,\n };\n }\n\n generateGlobalReport(cacheSnapshot: CacheSnapshot): UnusedFieldReport {\n const allBindings = this.registry\n .getAllBindings()\n .filter((b) => !b.unmountedAt);\n\n const analyses = allBindings.map((b) =>\n this.analyzeBinding(b, cacheSnapshot)\n );\n\n const inefficient = analyses\n .filter((a) => a.efficiency < 0.7) // Using <70% of fetched data\n .sort((a, b) => a.efficiency - b.efficiency);\n\n const totalWaste = analyses.reduce((sum, a) => sum + a.wastedBytes, 0);\n const commonUnused = this.findCommonUnusedFields(analyses);\n const avgEfficiency =\n analyses.length > 0\n ? analyses.reduce((sum, a) => sum + a.efficiency, 0) / analyses.length\n : 1;\n\n const recommendation = this.generateGlobalRecommendation(\n analyses,\n totalWaste,\n commonUnused\n );\n\n return {\n totalComponents: analyses.length,\n inefficientComponents: inefficient.length,\n totalWastedBytes: totalWaste,\n topOffenders: inefficient.slice(0, 10),\n commonUnused,\n averageEfficiency: avgEfficiency,\n recommendation,\n };\n }\n\n private getAccessedProperties(\n componentId: string,\n querySignature: string\n ): Set<string> {\n if (!this.propertyTracker) {\n return new Set<string>();\n }\n return this.propertyTracker.getAccessedProperties(\n componentId,\n querySignature\n );\n }\n\n private findCommonUnusedFields(\n analyses: FieldUsageReport[]\n ): CommonUnusedField[] {\n const fieldCount = new Map<\n string,\n { unused: number; total: number; objectType?: string }\n >();\n\n for (const analysis of analyses) {\n const match = analysis.querySignature.match(QUERY_SIGNATURE_RE);\n const objectType = match ? match[1] : undefined;\n\n for (const field of analysis.unused) {\n const key = `${objectType}:${field}`;\n const current = fieldCount.get(key) || {\n unused: 0,\n total: 0,\n objectType,\n };\n current.unused++;\n current.total++;\n fieldCount.set(key, current);\n }\n }\n\n return [...fieldCount.entries()]\n .map(([key, { unused, total, objectType }]) => ({\n field: key,\n objectType,\n unusedCount: unused,\n totalQueries: total,\n unusedRate: unused / total,\n }))\n .filter((f) => f.unusedRate > 0.7 && f.totalQueries > 2) // 70%+ unused, 3+ queries\n .sort((a, b) => b.unusedCount - a.unusedCount);\n }\n\n private generateSuggestion(\n binding: ComponentHookBinding,\n usedProps: string[]\n ): string {\n const { hookType, queryParams, componentName } = binding;\n\n if (hookType === \"useOsdkObject\" && queryParams.type === \"object\") {\n return `\n// In ${componentName}.tsx:\n// Current: Fetching all properties\nconst { object } = useOsdkObject(${queryParams.objectType}, id);\n\n// Optimized: Only fetch what you use\nconst { object } = useOsdkObject(${queryParams.objectType}, id, {\n $select: [${\n usedProps.length > 0 ? usedProps.map((p) => `\"${p}\"`).join(\", \") : '\"id\"'\n }]\n});\n\n// This query will be more efficient!\n `.trim(); // fallback\n } else if (hookType === \"useOsdkObjects\" && queryParams.type === \"list\") {\n return `\n// In ${componentName}.tsx:\n// Current: Fetching all properties\nconst { data } = useOsdkObjects(${queryParams.objectType}, {\n where: ${JSON.stringify(queryParams.where || {})}\n});\n\n// Optimized: Only fetch what you use\nconst { data } = useOsdkObjects(${queryParams.objectType}, {\n where: ${JSON.stringify(queryParams.where || {})},\n $select: [${\n usedProps.length > 0 ? usedProps.map((p) => `\"${p}\"`).join(\", \") : '\"id\"'\n }]\n});\n `.trim();\n }\n\n return \"Consider using $select to only fetch used properties\";\n }\n\n private generateGlobalRecommendation(\n analyses: FieldUsageReport[],\n totalWaste: number,\n commonUnused: CommonUnusedField[]\n ): string {\n if (analyses.length === 0) {\n return \"No queries analyzed yet\";\n }\n\n const inefficientCount = analyses.filter((a) => a.efficiency < 0.7).length;\n const inefficiencyRate = inefficientCount / analyses.length;\n\n if (inefficiencyRate > 0.5) {\n return `\nš“ HIGH PRIORITY: ${inefficientCount} of ${analyses.length} components are fetching unused data (${(\n totalWaste / 1024\n ).toFixed(1)}KB total waste).\n\nConsider adding $select clauses to your queries to only fetch used properties.\nThis will reduce bandwidth, improve performance, and lower data costs.\n\nStart with the top offenders listed above.\n `.trim();\n } else if (inefficientCount > 0) {\n return `\nš” MEDIUM PRIORITY: ${inefficientCount} components have unused fields.\n\nYou could optimize these queries with $select to save ~${(\n totalWaste / 1024\n ).toFixed(1)}KB bandwidth.\n `.trim();\n } else {\n return `\nā
EXCELLENT: All queries are using fetched data efficiently!\nContinue monitoring as features change.\n `.trim();\n }\n }\n\n private static defaultSizeEstimator(data: unknown): number {\n if (!data) return 0;\n if (typeof data === \"string\") return data.length;\n if (typeof data === \"number\") return 8;\n if (typeof data === \"boolean\") return 1;\n if (Array.isArray(data)) {\n return data.reduce<number>(\n (sum, item) => sum + UnusedFieldAnalyzer.defaultSizeEstimator(item),\n 0\n );\n }\n if (typeof data === \"object\") {\n return Object.values(data as Record<string, unknown>).reduce<number>(\n (sum, value) => sum + UnusedFieldAnalyzer.defaultSizeEstimator(value),\n 0\n );\n }\n return 100; // Rough estimate for unknowns\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"mappings":"AAqBA,cAAc,aAAa,mBAAoB;AAE/C,iBAAiB,iBAAiB;CAChC;CACA;CACA;CACA;CACA;CACA;CACA;AACD;AAED,OAAO,cAAM,wBAAwB;CACnC,QAAQ;CACR,QAAQ;CACR,QAAQ;CAER,cAAc;;;;;CAYd,iBAAiBA,OAAO,QAAQ;CAiBhC,uBAAuBA,OAAO;CAyB9B,QAAQ;CAWR,QAAQ;CAsBR,QAAQ;
|
|
1
|
+
{"mappings":"AAqBA,cAAc,aAAa,mBAAoB;AAE/C,iBAAiB,iBAAiB;CAChC;CACA;CACA;CACA;CACA;CACA;CACA;AACD;AAED,OAAO,cAAM,wBAAwB;CACnC,QAAQ;CACR,QAAQ;CACR,QAAQ;CAER,cAAc;;;;;CAYd,iBAAiBA,OAAO,QAAQ;CAiBhC,uBAAuBA,OAAO;CAyB9B,QAAQ;CAWR,QAAQ;CAsBR,QAAQ;CAwKR;CAIA;CAIA;AAGD;AAED,OAAO,cAAMC,yBAAyB","names":["fiber: Fiber","componentContextCapture: ComponentContextCapture"],"sources":["../../../src/utils/ComponentContextCapture.ts"],"version":3,"file":"ComponentContextCapture.d.ts"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@osdk/react-devtools",
|
|
3
|
-
"version": "0.11.
|
|
3
|
+
"version": "0.11.1-main-566ecd3ac93ee1753de8e32a4083d39c439c8b07",
|
|
4
4
|
"description": "Developer tools and debugging utilities for OSDK React Toolkit",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"repository": {
|
|
@@ -73,11 +73,11 @@
|
|
|
73
73
|
"typescript": "~5.5.4",
|
|
74
74
|
"vite": "^6.3.5",
|
|
75
75
|
"vitest": "^2.0.0",
|
|
76
|
-
"@osdk/api": "2.42.
|
|
77
|
-
"@osdk/client": "2.42.
|
|
76
|
+
"@osdk/api": "2.42.1-main-566ecd3ac93ee1753de8e32a4083d39c439c8b07",
|
|
77
|
+
"@osdk/client": "2.42.1-main-566ecd3ac93ee1753de8e32a4083d39c439c8b07",
|
|
78
78
|
"@osdk/monorepo.api-extractor": "~0.7.0",
|
|
79
79
|
"@osdk/monorepo.tsconfig": "~0.7.0",
|
|
80
|
-
"@osdk/react": "2.42.
|
|
80
|
+
"@osdk/react": "2.42.1-main-566ecd3ac93ee1753de8e32a4083d39c439c8b07"
|
|
81
81
|
},
|
|
82
82
|
"publishConfig": {
|
|
83
83
|
"access": "public"
|