@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 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*[^)]+\\)/\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\\(([^)]+)\\)/);\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":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAIA,SAASA,2BAA2BA,CAACC,OAAgB,EAAU;EAC7D,MAAMC,aAAa,GAAGC,MAAM,CAACC,gBAAgB,CAACH,OAAO,CAAC;EACtD,MAAMI,SAAS,GAAGH,aAAa,CAACG,SAAS;EAEzC,IAAI,CAACA,SAAS,IAAIA,SAAS,KAAK,MAAM,EAAE;IACtC,OAAO,EAAE;EACX;EAEA,MAAMC,WAAW,GAAGD,SAAS,CAACE,KAAK,CACjC,sEACF,CAAC;EAED,IAAID,WAAW,EAAE;IACf,MAAM,GAAGE,CAAC,EAAEC,CAAC,EAAEC,CAAC,EAAEC,CAAC,CAAC,GAAGL,WAAW;IAClC,IAAIE,CAAC,KAAK,GAAG,IAAIC,CAAC,KAAK,GAAG,IAAIC,CAAC,KAAK,GAAG,IAAIC,CAAC,KAAK,GAAG,EAAE;MACpD,OAAO,EAAE;IACX;IACA,OAAO,UAAUH,CAAC,KAAKC,CAAC,KAAKC,CAAC,KAAKC,CAAC,SAAS;EAC/C;EAEA,MAAMC,aAAa,GAAGP,SAAS,CAACE,KAAK,CAAC,qBAAqB,CAAC;EAC5D,IAAIK,aAAa,EAAE;IACjB,MAAMC,MAAM,GAAGD,aAAa,CAAC,CAAC,CAAC,CAACE,KAAK,CAAC,GAAG,CAAC,CAACC,GAAG,CAAEC,CAAC,IAAKA,CAAC,CAACC,IAAI,CAAC,CAAC,CAAC;IAC/D,IAAIJ,MAAM,CAACK,MAAM,KAAK,EAAE,EAAE;MACxBL,MAAM,CAAC,EAAE,CAAC,GAAG,GAAG;MAChBA,MAAM,CAAC,EAAE,CAAC,GAAG,GAAG;MAChBA,MAAM,CAAC,EAAE,CAAC,GAAG,GAAG;MAChB,OAAO,YAAYA,MAAM,CAACM,IAAI,CAAC,IAAI,CAAC,GAAG;IACzC;EACF;EAEA,OAAO,EAAE;AACX;AAEA,OAAO,SAASC,mBAAmBA,CAACnB,OAAgB,EAAiB;EACnE,MAAMoB,YAAY,GAAGpB,OAAO,CAACqB,qBAAqB,CAAC,CAAC;EACpD,MAAMpB,aAAa,GAAGC,MAAM,CAACC,gBAAgB,CAACH,OAAO,CAAC;EAEtD,OAAO;IACLsB,CAAC,EAAEF,YAAY,CAACG,IAAI;IACpBC,CAAC,EAAEJ,YAAY,CAACK,GAAG;IACnBC,KAAK,EAAEN,YAAY,CAACM,KAAK;IACzBC,MAAM,EAAEP,YAAY,CAACO,MAAM;IAC3BC,YAAY,EAAE3B,aAAa,CAAC2B,YAAY,IAAI,KAAK;IACjDxB,SAAS,EAAEL,2BAA2B,CAACC,OAAO;EAChD,CAAC;AACH;AAEA,OAAO,SAAS6B,oBAAoBA,CAClCC,OAAe,EACfC,OAAe,EACfC,cAAuB,EACP;EAChB,MAAMC,eAAe,GAAGC,QAAQ,CAACC,iBAAiB,CAACL,OAAO,EAAEC,OAAO,CAAC;EAEpE,KAAK,MAAM/B,OAAO,IAAIiC,eAAe,EAAE;IACrC,IAAID,cAAc,IAAIhC,OAAO,CAACoC,OAAO,CAACJ,cAAc,CAAC,EAAE;MACrD;IACF;IAEA,IAAIhC,OAAO,CAACqC,YAAY,CAAC,2BAA2B,CAAC,EAAE;MACrD;IACF;IAEA,MAAMC,OAAO,GAAGtC,OAAO,CAACsC,OAAO,CAACC,WAAW,CAAC,CAAC;IAC7C,IACED,OAAO,KAAK,QAAQ,IACpBA,OAAO,KAAK,OAAO,IACnBA,OAAO,KAAK,MAAM,IAClBA,OAAO,KAAK,MAAM,IAClBA,OAAO,KAAK,MAAM,IAClBA,OAAO,KAAK,MAAM,EAClB;MACA;IACF;IAEA,OAAOtC,OAAO;EAChB;EAEA,OAAO,IAAI;AACb","ignoreList":[]}
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/, /@osdk\/react/, /react-devtools/, /ComponentContextCapture/, /ObservableClientMonitor/, /ComponentQueryRegistry/, /packages\/react\/build/, /packages\/react\/esm/, /packages\/react\/src/, /Proxy/];
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?)(\?|:|$)/.test(filePath) && !/node_modules/.test(filePath);
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":"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","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/, /@osdk\/react/, /react-devtools/, /ComponentContextCapture/, /ObservableClientMonitor/, /ComponentQueryRegistry/, /packages\/react\/build/, /packages\/react\/esm/, /packages\/react\/src/];
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+)/i, /add[_-]?(\w+)/i, /new[_-]?(\w+)/i, /(\w+)[_-]?create/i, /(\w+)[_-]?add/i];
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":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAKA,SAASA,uBAAuB,QAAQ,8BAA8B;AAGtE,SAASC,mBAAmB,QAAQ,0BAA0B;AAC9D,SAASC,iBAAiB,QAAQ,wBAAwB;AA6C1D,OAAO,MAAMC,+BAA+B,CAAC;EAInCC,wBAAwB,GAAG,IAAIC,GAAG,CAAS,CAAC;EAEpDC,WAAWA,CACDC,YAA0B,EAC1BC,QAAgC,EAChCC,QAAuB,EAC/B;IAAA,KAHQF,YAA0B,GAA1BA,YAA0B;IAAA,KAC1BC,QAAgC,GAAhCA,QAAgC;IAAA,KAChCC,QAAuB,GAAvBA,QAAuB;IAE/B,IAAI,CAACC,aAAa,GAAG,IAAIV,uBAAuB,CAACO,YAAY,CAAC;IAC9D,IAAI,CAACI,aAAa,GAAG,IAAIV,mBAAmB,CAACO,QAAQ,EAAEI,SAAS,CAAC;IACjE,IAAI,CAACC,iBAAiB,GAAG,IAAIX,iBAAiB,CAACM,QAAQ,EAAEC,QAAQ,CAAC;EACpE;EAEAK,uBAAuBA,CAACC,aAA4B,EAAoB;IACtE,MAAMC,eAAiC,GAAG,EAAE;IAE5C,MAAMC,UAAU,GAAG,IAAI,CAACJ,iBAAiB,CAACK,gBAAgB,CAAC,CAAC;IAC5D,KAAK,MAAMC,EAAE,IAAIF,UAAU,EAAE;MAC3B,MAAMG,WAAW,GAAGD,EAAE,CAACE,OAAO,CAACC,UAAU,GACrC,aAAaH,EAAE,CAACE,OAAO,CAACE,WAAW,KAAKJ,EAAE,CAACE,OAAO,CAACC,UAAU,EAAE,GAC/D,aAAaH,EAAE,CAACE,OAAO,CAACE,WAAW,EAAE;MAEzC,IAAI,IAAI,CAACnB,wBAAwB,CAACoB,GAAG,CAACJ,WAAW,CAAC,EAAE;QAClD;MACF;MAEAJ,eAAe,CAACS,IAAI,CAAC;QACnBC,EAAE,EAAEN,WAAW;QACfO,KAAK,EAAER,EAAE,CAACS,QAAQ,KAAK,MAAM,GAAG,MAAM,GAAG,QAAQ;QACjDC,QAAQ,EAAE,aAAa;QACvBC,KAAK,EAAE,GACLX,EAAE,CAACY,IAAI,KAAK,gBAAgB,GAAG,MAAM,GAAG,OAAO,gBACjCZ,EAAE,CAACa,SAAS,aAAa;QACzCC,WAAW,EAAEd,EAAE,CAACe,UAAU;QAC1BC,MAAM,EAAE,QAAQhB,EAAE,CAACa,SAAS,iBAAiB;QAC7CI,MAAM,EAAE,KAAK;QACbF,UAAU,EAAEf,EAAE,CAACe,UAAU;QACzBG,IAAI,EAAElB,EAAE,CAACkB,IAAI;QACbC,WAAW,EAAE;MACf,CAAC,CAAC;IACJ;IAEA,MAAMC,WAAW,GAAG,IAAI,CAAC5B,aAAa,CAAC6B,oBAAoB,CAACzB,aAAa,CAAC;IAC1E,KAAK,MAAM0B,QAAQ,IAAIF,WAAW,CAACG,YAAY,CAACC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE;MAC3D,IACE,IAAI,CAACvC,wBAAwB,CAACoB,GAAG,CAAC,SAASiB,QAAQ,CAACG,cAAc,EAAE,CAAC,EACrE;QACA;MACF;MAEA5B,eAAe,CAACS,IAAI,CAAC;QACnBC,EAAE,EAAE,SAASe,QAAQ,CAACG,cAAc,EAAE;QACtCjB,KAAK,EAAEc,QAAQ,CAACI,WAAW,GAAG,KAAK,GAAG,MAAM,GAAG,QAAQ;QACvDhB,QAAQ,EAAE,WAAW;QACrBC,KAAK,EAAE,GAAGW,QAAQ,CAACK,aAAa,sBAAsB;QACtDb,WAAW,EAAE,0BAA0BQ,QAAQ,CAACM,OAAO,CAACC,MAAM,6BAA6BP,QAAQ,CAACQ,QAAQ,CAACD,MAAM,EAAE;QACrHb,MAAM,EAAE,QAAQ,CAACM,QAAQ,CAACI,WAAW,GAAG,IAAI,EAAEK,OAAO,CACnD,CACF,CAAC,uBAAuB;QACxBd,MAAM,EAAE,KAAK;QACbF,UAAU,EAAE,2CAA2C;QACvDG,IAAI,EAAEI,QAAQ,CAACP,UAAU;QACzBI,WAAW,EAAE;MACf,CAAC,CAAC;IACJ;IAEA,MAAMa,YAAY,GAAG,IAAI,CAACzC,aAAa,CAAC0C,OAAO,CAACrC,aAAa,CAAC;IAC9D,KAAK,MAAMsC,GAAG,IAAIF,YAAY,CAACnC,eAAe,EAAE;MAC9C,IAAI,IAAI,CAACZ,wBAAwB,CAACoB,GAAG,CAAC,SAAS6B,GAAG,CAACvB,KAAK,EAAE,CAAC,EAAE;QAC3D;MACF;MAEA,IAAIuB,GAAG,CAAC1B,KAAK,KAAK,SAAS,IAAI0B,GAAG,CAAC1B,KAAK,KAAK,UAAU,EAAE;QACvDX,eAAe,CAACS,IAAI,CAAC;UACnBC,EAAE,EAAE,SAAS2B,GAAG,CAACvB,KAAK,EAAE;UACxBH,KAAK,EAAE0B,GAAG,CAAC1B,KAAK,KAAK,UAAU,GAAG,UAAU,GAAG,MAAM;UACrDE,QAAQ,EAAE,OAAO;UACjBC,KAAK,EAAEuB,GAAG,CAACvB,KAAK;UAChBG,WAAW,EAAEoB,GAAG,CAACC,OAAO;UACxBnB,MAAM,EAAEkB,GAAG,CAACnB,UAAU;UACtBE,MAAM,EAAE,QAAQ;UAChBF,UAAU,EAAEmB,GAAG,CAACnB,UAAU;UAC1BI,WAAW,EAAE;QACf,CAAC,CAAC;MACJ;IACF;IAEA,MAAMiB,aAAkD,GAAG;MACzDC,QAAQ,EAAE,CAAC;MACXC,IAAI,EAAE,CAAC;MACPC,MAAM,EAAE,CAAC;MACTC,GAAG,EAAE,CAAC;MACNC,IAAI,EAAE;IACR,CAAC;IAED,OAAO5C,eAAe,CACnB6C,IAAI,CAAC,CAACC,CAAC,EAAEC,CAAC,KAAKR,aAAa,CAACQ,CAAC,CAACpC,KAAK,CAAC,GAAG4B,aAAa,CAACO,CAAC,CAACnC,KAAK,CAAC,CAAC,CAC/DgB,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;EACnB;EAEAqB,yBAAyBA,CAACjD,aAA4B,EAAoB;IACxE,MAAME,UAAU,GAAG,IAAI,CAACJ,iBAAiB,CAACK,gBAAgB,CAAC,CAAC;IAC5D,MAAMqB,WAAW,GAAG,IAAI,CAAC5B,aAAa,CAAC6B,oBAAoB,CAACzB,aAAa,CAAC;IAC1E,MAAMoC,YAAY,GAAG,IAAI,CAACzC,aAAa,CAAC0C,OAAO,CAACrC,aAAa,CAAC;IAE9D,MAAMkD,UAAU,GAAGC,IAAI,CAACC,KAAK,CAAChB,YAAY,CAACiB,KAAK,CAAC;IACjD,MAAMC,UAAU,GAAGH,IAAI,CAACC,KAAK,CAAC,GAAG,GAAGD,IAAI,CAACI,GAAG,CAACrD,UAAU,CAAC+B,MAAM,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC;IACxE,MAAMuB,cAAc,GAAGL,IAAI,CAACC,KAAK,CAC/B,GAAG,GAAGD,IAAI,CAACI,GAAG,CAAE/B,WAAW,CAACiC,gBAAgB,GAAG,IAAI,GAAG,GAAG,GAAI,EAAE,EAAE,EAAE,CACrE,CAAC;IACD,MAAMC,gBAAgB,GAAGP,IAAI,CAACC,KAAK,CACjC,GAAG,GAAGD,IAAI,CAACI,GAAG,CAAC,CAAC,CAAC,GAAG/B,WAAW,CAACmC,iBAAiB,IAAI,EAAE,EAAE,EAAE,CAC7D,CAAC;IAED,MAAMC,OAAO,GAAGT,IAAI,CAACC,KAAK,CACxBF,UAAU,GAAG,GAAG,GACdI,UAAU,GAAG,GAAG,GAChBE,cAAc,GAAG,GAAG,GACpBE,gBAAgB,GAAG,GACvB,CAAC;IAED,MAAMG,SAAS,GAAG;MAChB3D,UAAU,EAAE;QACV4D,OAAO,EAAEX,IAAI,CAACI,GAAG,CAACrD,UAAU,CAAC+B,MAAM,GAAG,CAAC,EAAE,EAAE,CAAC;QAC5C8B,KAAK,EAAE7D,UAAU,CAAC+B;MACpB,CAAC;MACD+B,eAAe,EAAE;QACfF,OAAO,EAAE,CAAC,CAAC,GAAGtC,WAAW,CAACmC,iBAAiB,IAAI,EAAE;QACjDM,IAAI,EAAEzC,WAAW,CAACmC;MACpB,CAAC;MACDO,YAAY,EAAE;QACZJ,OAAO,EAAE,CAAC,CAAC,GAAG1B,YAAY,CAAC+B,OAAO,IAAI,EAAE;QACxCF,IAAI,EAAE7B,YAAY,CAAC+B;MACrB,CAAC;MACDC,eAAe,EAAE;QACfN,OAAO,EAAEX,IAAI,CAACI,GAAG,CAAC/B,WAAW,CAACiC,gBAAgB,GAAG,KAAK,EAAE,EAAE,CAAC;QAC3DY,KAAK,EAAE7C,WAAW,CAACiC;MACrB;IACF,CAAC;IAED,OAAO;MACLG,OAAO;MACPU,KAAK,EAAE,IAAI,CAACC,YAAY,CAACX,OAAO,CAAC;MACjCY,UAAU,EAAE;QACVC,KAAK,EAAEvB,UAAU;QACjBwB,OAAO,EAAEpB,UAAU;QACnBqB,SAAS,EAAEnB,cAAc;QACzBoB,WAAW,EAAElB;MACf,CAAC;MACDG;IACF,CAAC;EACH;EAEQU,YAAYA,CAAClB,KAAa,EAA+B;IAC/D,IAAIA,KAAK,IAAI,EAAE,EAAE;MACf,OAAO,GAAG;IACZ;IACA,IAAIA,KAAK,IAAI,EAAE,EAAE;MACf,OAAO,GAAG;IACZ;IACA,IAAIA,KAAK,IAAI,EAAE,EAAE;MACf,OAAO,GAAG;IACZ;IACA,IAAIA,KAAK,IAAI,EAAE,EAAE;MACf,OAAO,GAAG;IACZ;IACA,OAAO,GAAG;EACZ;EAEAwB,qBAAqBA,CAAClE,EAAU,EAAQ;IACtC,IAAI,CAACtB,wBAAwB,CAACyF,GAAG,CAACnE,EAAE,CAAC;EACvC;EAEAoE,cAAcA,CAAA,EAAS;IACrB,IAAI,CAAC1F,wBAAwB,CAAC2F,KAAK,CAAC,CAAC;EACvC;EAEAC,UAAUA,CAACjF,aAA4B,EAKrC;IACA,MAAMC,eAAe,GAAG,IAAI,CAACF,uBAAuB,CAACC,aAAa,CAAC;IACnE,MAAMkF,aAAa,GAAGjF,eAAe,CAACkF,MAAM,CACzCC,CAAC,IAAKA,CAAC,CAACxE,KAAK,KAAK,UACrB,CAAC,CAACqB,MAAM;IAER,MAAMoD,cAAc,GAAGpF,eAAe,CAACkF,MAAM,CAC1CC,CAAC,IAAKA,CAAC,CAAC/D,MAAM,KAAK,KACtB,CAAC,CAACY,MAAM;IACR,MAAMqD,iBAAiB,GAAGrF,eAAe,CAACkF,MAAM,CAC7CC,CAAC,IAAKA,CAAC,CAAC/D,MAAM,KAAK,QACtB,CAAC,CAACY,MAAM;IACR,MAAMsD,eAAe,GAAGtF,eAAe,CAACkF,MAAM,CAC3CC,CAAC,IAAKA,CAAC,CAAC/D,MAAM,KAAK,MACtB,CAAC,CAACY,MAAM;IAER,MAAMuD,YAAY,GAChBH,cAAc,GAAG,CAAC,GAAGC,iBAAiB,GAAG,EAAE,GAAGC,eAAe,GAAG,EAAE;IACpE,MAAME,SAAS,GACbD,YAAY,GAAG,EAAE,GACb,GAAGA,YAAY,UAAU,GACzB,GAAGrC,IAAI,CAACC,KAAK,CAACoC,YAAY,GAAG,EAAE,CAAC,QAAQ;IAE9C,MAAME,WAAW,GAAGzF,eAAe,CAAC0F,MAAM,CAAC,CAACC,GAAG,EAAER,CAAC,KAAK;MACrD,IAAIA,CAAC,CAAChE,MAAM,CAACyE,QAAQ,CAAC,MAAM,CAAC,EAAE;QAC7B,MAAMC,KAAK,GAAGV,CAAC,CAAChE,MAAM,CAAC0E,KAAK,CAAC,iBAAiB,CAAC;QAC/C,IAAIA,KAAK,EAAE;UACT,MAAMC,KAAK,GAAGC,MAAM,CAACC,QAAQ,CAACH,KAAK,CAAC,CAAC,CAAC,CAAC;UACvC,MAAMI,IAAI,GAAGJ,KAAK,CAAC,CAAC,CAAC;UACrB,OACEF,GAAG,IACFM,IAAI,KAAK,IAAI,GAAGH,KAAK,GAAGG,IAAI,KAAK,IAAI,GAAGH,KAAK,GAAG,GAAG,GAAGA,KAAK,GAAG,IAAI,CAAC;QAExE;MACF;MACA,OAAOH,GAAG;IACZ,CAAC,EAAE,CAAC,CAAC;IAEL,MAAMO,oBAAoB,GACxBT,WAAW,GAAG,IAAI,GACd,IAAI,CAACA,WAAW,GAAG,IAAI,EAAEvD,OAAO,CAAC,CAAC,CAAC,eAAe,GAClD,IAAIgB,IAAI,CAACC,KAAK,CAACsC,WAAW,CAAC,gBAAgB;IAEjD,OAAO;MACLU,UAAU,EAAEnG,eAAe,CAACgC,MAAM;MAClCiD,aAAa;MACbO,SAAS;MACTU;IACF,CAAC;EACH;AACF","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":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AA+CA,MAAMA,kBAAkB,GAAG,aAAa;AAExC,OAAO,MAAMC,mBAAmB,CAAC;EAC/BC,WAAWA,CACDC,QAAgC,EAChCC,eAA8D,EAC9DC,sBAAiD,GAAIC,IAAI,IAC/DL,mBAAmB,CAACM,oBAAoB,CAACD,IAAI,CAAC,EAChD;IAAA,KAJQH,QAAgC,GAAhCA,QAAgC;IAAA,KAChCC,eAA8D,GAA9DA,eAA8D;IAAA,KAC9DC,sBAAiD,GAAjDA,sBAAiD;EAExD;EAEHG,cAAcA,CACZC,OAA6B,EAC7BC,aAA4B,EACV;IAClB,MAAM;MAAEC,WAAW;MAAEC,cAAc;MAAEC;IAAc,CAAC,GAAGJ,OAAO;IAE9D,MAAMK,QAAQ,GAAG,IAAI,CAACC,qBAAqB,CAACJ,WAAW,EAAEC,cAAc,CAAC;IAExE,MAAMI,UAAU,GAAGN,aAAa,CAACO,OAAO,EAAEC,IAAI,CAC3CC,CAAC,IAAKA,CAAC,CAACC,GAAG,KAAKR,cACnB,CAAC;IACD,MAAMS,YAAY,GAAGL,UAAU,EAAEV,IAAI,GAAGgB,MAAM,CAACC,IAAI,CAACP,UAAU,CAACV,IAAI,CAAC,GAAG,EAAE;IAEzE,MAAMkB,YAAY,GAAGH,YAAY,CAACI,MAAM,CACrCC,CAAC,IAAK,CAACA,CAAC,CAACC,UAAU,CAAC,GAAG,CAAC,IAAID,CAAC,KAAK,YACrC,CAAC;IAED,MAAME,MAAM,GAAGJ,YAAY,CAACC,MAAM,CAAEI,IAAI,IAAK,CAACf,QAAQ,CAACgB,GAAG,CAACD,IAAI,CAAC,CAAC;IAEjE,MAAME,SAAS,GACbf,UAAU,EAAEgB,QAAQ,CAACC,IAAI,IACzB,IAAI,CAAC5B,sBAAsB,CAACW,UAAU,EAAEV,IAAI,CAAC;IAC/C,MAAM4B,WAAW,GACfN,MAAM,CAACO,MAAM,GAAG,CAAC,IAAIX,YAAY,CAACW,MAAM,GAAG,CAAC,GACxCC,IAAI,CAACC,KAAK,CAACN,SAAS,IAAIH,MAAM,CAACO,MAAM,GAAGX,YAAY,CAACW,MAAM,CAAC,CAAC,GAC7D,CAAC;IAEP,MAAMG,UAAU,GACdd,YAAY,CAACW,MAAM,GAAG,CAAC,GAAGrB,QAAQ,CAACmB,IAAI,GAAGT,YAAY,CAACW,MAAM,GAAG,CAAC;IAEnE,MAAMI,UAAU,GAAG,IAAI,CAACC,kBAAkB,CAAC/B,OAAO,EAAE,CAAC,GAAGK,QAAQ,CAAC,CAAC;IAElE,MAAM2B,WAAW,GAAGhC,OAAO,CAACgC,WAAW;IAEvC,OAAO;MACL5B,aAAa;MACbD,cAAc;MACd8B,OAAO,EAAElB,YAAY;MACrBV,QAAQ,EAAE,CAAC,GAAGA,QAAQ,CAAC;MACvBc,MAAM;MACNU,UAAU;MACVJ,WAAW;MACXO,WAAW;MACXF;IACF,CAAC;EACH;EAEAI,oBAAoBA,CAACjC,aAA4B,EAAqB;IACpE,MAAMkC,WAAW,GAAG,IAAI,CAACzC,QAAQ,CAC9B0C,cAAc,CAAC,CAAC,CAChBpB,MAAM,CAAEqB,CAAC,IAAK,CAACA,CAAC,CAACC,WAAW,CAAC;IAEhC,MAAMC,QAAQ,GAAGJ,WAAW,CAACK,GAAG,CAAEH,CAAC,IACjC,IAAI,CAACtC,cAAc,CAACsC,CAAC,EAAEpC,aAAa,CACtC,CAAC;IAED,MAAMwC,WAAW,GAAGF,QAAQ,CACzBvB,MAAM,CAAE0B,CAAC,IAAKA,CAAC,CAACb,UAAU,GAAG,GAAG,CAAC,CAAC;IAAA,CAClCc,IAAI,CAAC,CAACD,CAAC,EAAEL,CAAC,KAAKK,CAAC,CAACb,UAAU,GAAGQ,CAAC,CAACR,UAAU,CAAC;IAE9C,MAAMe,UAAU,GAAGL,QAAQ,CAACM,MAAM,CAAC,CAACC,GAAG,EAAEJ,CAAC,KAAKI,GAAG,GAAGJ,CAAC,CAACjB,WAAW,EAAE,CAAC,CAAC;IACtE,MAAMsB,YAAY,GAAG,IAAI,CAACC,sBAAsB,CAACT,QAAQ,CAAC;IAC1D,MAAMU,aAAa,GACjBV,QAAQ,CAACb,MAAM,GAAG,CAAC,GACfa,QAAQ,CAACM,MAAM,CAAC,CAACC,GAAG,EAAEJ,CAAC,KAAKI,GAAG,GAAGJ,CAAC,CAACb,UAAU,EAAE,CAAC,CAAC,GAAGU,QAAQ,CAACb,MAAM,GACpE,CAAC;IAEP,MAAMwB,cAAc,GAAG,IAAI,CAACC,4BAA4B,CACtDZ,QAAQ,EACRK,UAAU,EACVG,YACF,CAAC;IAED,OAAO;MACLK,eAAe,EAAEb,QAAQ,CAACb,MAAM;MAChC2B,qBAAqB,EAAEZ,WAAW,CAACf,MAAM;MACzC4B,gBAAgB,EAAEV,UAAU;MAC5BW,YAAY,EAAEd,WAAW,CAACe,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC;MACtCT,YAAY;MACZU,iBAAiB,EAAER,aAAa;MAChCC;IACF,CAAC;EACH;EAEQ5C,qBAAqBA,CAC3BJ,WAAmB,EACnBC,cAAsB,EACT;IACb,IAAI,CAAC,IAAI,CAACR,eAAe,EAAE;MACzB,OAAO,IAAI+D,GAAG,CAAS,CAAC;IAC1B;IACA,OAAO,IAAI,CAAC/D,eAAe,CAACW,qBAAqB,CAC/CJ,WAAW,EACXC,cACF,CAAC;EACH;EAEQ6C,sBAAsBA,CAC5BT,QAA4B,EACP;IACrB,MAAMoB,UAAU,GAAG,IAAIC,GAAG,CAGxB,CAAC;IAEH,KAAK,MAAMC,QAAQ,IAAItB,QAAQ,EAAE;MAC/B,MAAMuB,KAAK,GAAGD,QAAQ,CAAC1D,cAAc,CAAC2D,KAAK,CAACvE,kBAAkB,CAAC;MAC/D,MAAMwE,UAAU,GAAGD,KAAK,GAAGA,KAAK,CAAC,CAAC,CAAC,GAAGE,SAAS;MAE/C,KAAK,MAAMC,KAAK,IAAIJ,QAAQ,CAAC1C,MAAM,EAAE;QACnC,MAAMR,GAAG,GAAG,GAAGoD,UAAU,IAAIE,KAAK,EAAE;QACpC,MAAMC,OAAO,GAAGP,UAAU,CAACQ,GAAG,CAACxD,GAAG,CAAC,IAAI;UACrCQ,MAAM,EAAE,CAAC;UACTiD,KAAK,EAAE,CAAC;UACRL;QACF,CAAC;QACDG,OAAO,CAAC/C,MAAM,EAAE;QAChB+C,OAAO,CAACE,KAAK,EAAE;QACfT,UAAU,CAACU,GAAG,CAAC1D,GAAG,EAAEuD,OAAO,CAAC;MAC9B;IACF;IAEA,OAAO,CAAC,GAAGP,UAAU,CAACnD,OAAO,CAAC,CAAC,CAAC,CAC7BgC,GAAG,CAAC,CAAC,CAAC7B,GAAG,EAAE;MAAEQ,MAAM;MAAEiD,KAAK;MAAEL;IAAW,CAAC,CAAC,MAAM;MAC9CE,KAAK,EAAEtD,GAAG;MACVoD,UAAU;MACVO,WAAW,EAAEnD,MAAM;MACnBoD,YAAY,EAAEH,KAAK;MACnBI,UAAU,EAAErD,MAAM,GAAGiD;IACvB,CAAC,CAAC,CAAC,CACFpD,MAAM,CAAEyD,CAAC,IAAKA,CAAC,CAACD,UAAU,GAAG,GAAG,IAAIC,CAAC,CAACF,YAAY,GAAG,CAAC,CAAC,CAAC;IAAA,CACxD5B,IAAI,CAAC,CAACD,CAAC,EAAEL,CAAC,KAAKA,CAAC,CAACiC,WAAW,GAAG5B,CAAC,CAAC4B,WAAW,CAAC;EAClD;EAEQvC,kBAAkBA,CACxB/B,OAA6B,EAC7B0E,SAAmB,EACX;IACR,MAAM;MAAEC,QAAQ;MAAEC,WAAW;MAAExE;IAAc,CAAC,GAAGJ,OAAO;IAExD,IAAI2E,QAAQ,KAAK,eAAe,IAAIC,WAAW,CAACC,IAAI,KAAK,QAAQ,EAAE;MACjE,OAAO;AACb,QAAQzE,aAAa;AACrB;AACA,mCAAmCwE,WAAW,CAACb,UAAU;AACzD;AACA;AACA,mCAAmCa,WAAW,CAACb,UAAU;AACzD,cACIW,SAAS,CAAChD,MAAM,GAAG,CAAC,GAAGgD,SAAS,CAAClC,GAAG,CAAEvB,CAAC,IAAK,IAAIA,CAAC,GAAG,CAAC,CAAC6D,IAAI,CAAC,IAAI,CAAC,GAAG,MAAM;AAC7E;AACA;AACA;AACA,OACO,CAACC,IAAI,CAAC,CAAC,CAAC,CAAC;IACZ,CAAC,MAAM,IAAIJ,QAAQ,KAAK,gBAAgB,IAAIC,WAAW,CAACC,IAAI,KAAK,MAAM,EAAE;MACvE,OAAO;AACb,QAAQzE,aAAa;AACrB;AACA,kCAAkCwE,WAAW,CAACb,UAAU;AACxD,WAAWiB,IAAI,CAACC,SAAS,CAACL,WAAW,CAACM,KAAK,IAAI,CAAC,CAAC,CAAC;AAClD;AACA;AACA;AACA,kCAAkCN,WAAW,CAACb,UAAU;AACxD,WAAWiB,IAAI,CAACC,SAAS,CAACL,WAAW,CAACM,KAAK,IAAI,CAAC,CAAC,CAAC;AAClD,cACIR,SAAS,CAAChD,MAAM,GAAG,CAAC,GAAGgD,SAAS,CAAClC,GAAG,CAAEvB,CAAC,IAAK,IAAIA,CAAC,GAAG,CAAC,CAAC6D,IAAI,CAAC,IAAI,CAAC,GAAG,MAAM;AAC7E;AACA,OACO,CAACC,IAAI,CAAC,CAAC;IACV;IAEA,OAAO,sDAAsD;EAC/D;EAEQ5B,4BAA4BA,CAClCZ,QAA4B,EAC5BK,UAAkB,EAEV;IACR,IAAIL,QAAQ,CAACb,MAAM,KAAK,CAAC,EAAE;MACzB,OAAO,yBAAyB;IAClC;IAEA,MAAMyD,gBAAgB,GAAG5C,QAAQ,CAACvB,MAAM,CAAE0B,CAAC,IAAKA,CAAC,CAACb,UAAU,GAAG,GAAG,CAAC,CAACH,MAAM;IAC1E,MAAM0D,gBAAgB,GAAGD,gBAAgB,GAAG5C,QAAQ,CAACb,MAAM;IAE3D,IAAI0D,gBAAgB,GAAG,GAAG,EAAE;MAC1B,OAAO;AACb,oBAAoBD,gBAAgB,OAAO5C,QAAQ,CAACb,MAAM,yCAAyC,CAC3FkB,UAAU,GAAG,IAAI,EACjByC,OAAO,CAAC,CAAC,CAAC;AAClB;AACA;AACA;AACA;AACA;AACA,OAAO,CAACN,IAAI,CAAC,CAAC;IACV,CAAC,MAAM,IAAII,gBAAgB,GAAG,CAAC,EAAE;MAC/B,OAAO;AACb,sBAAsBA,gBAAgB;AACtC;AACA,yDAAyD,CACjDvC,UAAU,GAAG,IAAI,EACjByC,OAAO,CAAC,CAAC,CAAC;AAClB,OAAO,CAACN,IAAI,CAAC,CAAC;IACV,CAAC,MAAM;MACL,OAAO;AACb;AACA;AACA,OAAO,CAACA,IAAI,CAAC,CAAC;IACV;EACF;EAEA,OAAejF,oBAAoBA,CAACD,IAAa,EAAU;IACzD,IAAI,CAACA,IAAI,EAAE,OAAO,CAAC;IACnB,IAAI,OAAOA,IAAI,KAAK,QAAQ,EAAE,OAAOA,IAAI,CAAC6B,MAAM;IAChD,IAAI,OAAO7B,IAAI,KAAK,QAAQ,EAAE,OAAO,CAAC;IACtC,IAAI,OAAOA,IAAI,KAAK,SAAS,EAAE,OAAO,CAAC;IACvC,IAAIyF,KAAK,CAACC,OAAO,CAAC1F,IAAI,CAAC,EAAE;MACvB,OAAOA,IAAI,CAACgD,MAAM,CAChB,CAACC,GAAG,EAAE0C,IAAI,KAAK1C,GAAG,GAAGtD,mBAAmB,CAACM,oBAAoB,CAAC0F,IAAI,CAAC,EACnE,CACF,CAAC;IACH;IACA,IAAI,OAAO3F,IAAI,KAAK,QAAQ,EAAE;MAC5B,OAAOgB,MAAM,CAAC4E,MAAM,CAAC5F,IAA+B,CAAC,CAACgD,MAAM,CAC1D,CAACC,GAAG,EAAE4C,KAAK,KAAK5C,GAAG,GAAGtD,mBAAmB,CAACM,oBAAoB,CAAC4F,KAAK,CAAC,EACrE,CACF,CAAC;IACH;IACA,OAAO,GAAG,CAAC,CAAC;EACd;AACF","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;CAqKR;CAIA;CAIA;AAGD;AAED,OAAO,cAAMC,yBAAyB","names":["fiber: Fiber","componentContextCapture: ComponentContextCapture"],"sources":["../../../src/utils/ComponentContextCapture.ts"],"version":3,"file":"ComponentContextCapture.d.ts"}
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.0",
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.0",
77
- "@osdk/client": "2.42.0",
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.0"
80
+ "@osdk/react": "2.42.1-main-566ecd3ac93ee1753de8e32a4083d39c439c8b07"
81
81
  },
82
82
  "publishConfig": {
83
83
  "access": "public"