interactive-react-inspector 1.0.0

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/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Jakub Sokol
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,65 @@
1
+ # interactive-react-inspector
2
+
3
+ React component inspector and source code jump utility. Quickly jump from your browser to your IDE by clicking on React components.
4
+
5
+ Inspired by [webfansplz/vite-plugin-vue-inspector](https://github.com/webfansplz/vite-plugin-vue-inspector).
6
+
7
+ ## Features
8
+ - Inspect React components directly in the browser.
9
+ - Click to jump to the exact source code line in your editor.
10
+ - Cross-framework support for Vite and Next.js.
11
+
12
+ ## Installation
13
+
14
+ ```bash
15
+ npm install interactive-react-inspector
16
+ ```
17
+
18
+ ## Usage
19
+
20
+ ### Vite
21
+
22
+ Add the plugin to your `vite.config.ts`:
23
+
24
+ ```ts
25
+ import { defineConfig } from 'vite'
26
+ import Inspector from 'interactive-react-inspector'
27
+
28
+ export default defineConfig({
29
+ plugins: [
30
+ Inspector.vite(),
31
+ ],
32
+ })
33
+ ```
34
+
35
+ ### Next.js
36
+
37
+ > IMPORTANT]
38
+ > `interactive-react-inspector` currently requires **Webpack**. It is not compatible with Turbopack yet. Ensure you run your dev server with the `--webpack` flag or have it enabled in your config.
39
+
40
+ 1. Add the plugin to your `next.config.ts`:
41
+
42
+ ```ts
43
+ import Inspector from 'interactive-react-inspector'
44
+
45
+ const nextConfig = {
46
+ webpack(config) {
47
+ config.plugins.push(
48
+ Inspector.webpack(),
49
+ )
50
+ return config
51
+ },
52
+ }
53
+
54
+ export default nextConfig
55
+ ```
56
+
57
+ 2. Run Next.js with Webpack:
58
+
59
+ ```bash
60
+ next dev --webpack
61
+ ```
62
+
63
+ ## License
64
+ MIT
65
+
@@ -0,0 +1,6 @@
1
+ import{createUnplugin as W}from"unplugin";import c from"path";import{fileURLToPath as C}from"url";import z from"launch-editor";import D from"fs";import I from"path";import{parse as R}from"@babel/parser";import d from"@babel/traverse";import $ from"magic-string";var T=d.default||d,g="data-source";function y(t){return t.split("?")[0].split("#")[0].replace(/\\/g,"/")}function A(t){return/\.(mjs|js|jsx|ts|tsx)$/.test(y(t))}function O(t){return t.type==="JSXIdentifier"&&/^[a-z]/.test(t.name)}function h(t,n){if(process.env.NODE_ENV==="production")return;let r=y(n);if(!A(r))return null;let e=new $(t),s;try{s=R(t,{sourceType:"unambiguous",plugins:["jsx","typescript","decorators-legacy","classProperties","classPrivateProperties","classPrivateMethods","importAttributes"]})}catch{return null}let i=I.relative(process.cwd(),r).replaceAll("\\","/");return T(s,{JSXOpeningElement(o){let a=o.node;if(!a.loc||!O(a.name)||a.attributes.some(m=>m.type==="JSXAttribute"&&m.name.name===g))return;let b=a.end-(a.selfClosing?2:1),{line:k,column:v}=a.loc.start;e.prependLeft(b,` ${g}="${i}:${k}:${v}"`)}}),{code:e.toString(),map:e.generateMap()}}var f="virtual:react-inspector",j="\0"+f,E=/\.(mjs|js|jsx|ts|tsx)$/,M=/\/(node_modules|dist|build|coverage|\.next|\.nuxt|\.svelte-kit|\.output|\.astro)\//;function u(t){return t?t.split("?")[0].split("#")[0].replace(/\\/g,"/"):""}var p=c.dirname(C(import.meta.url)),x=u(D.existsSync(c.resolve(p,"../runtime/install.ts"))?c.resolve(p,"../runtime/install.ts"):c.resolve(p,"./runtime.js"));function N(t,n){let r=t.split(/\r?\n/),e=!1;for(let s of r){let i=s.trim();if(!i)continue;if(e){i.includes("*/")&&(e=!1);continue}if(i.startsWith("/*")){i.includes("*/")||(e=!0);continue}if(i.startsWith("//"))continue;return i.match(/^(['"])(.+)\1;?$/)?.[2]===n}return!1}function _(t){return N(t,"use client")}function P(t){if(!t)return!1;let n=u(t);return M.test(n)||n.includes("\0")?!1:E.test(n)}function L(t){return/from\s+["']react-dom\/client["']/.test(t)||/require\(\s*["']react-dom\/client["']\s*\)/.test(t)}function U(t){let e=(u(t).split("/").pop()??"").replace(E,"");return["main","index","app","_app","root","client","entry-client","entry.client"].includes(e)}function J(t,n,r){if(!t)return!1;let e=u(t);return r==="webpack"||r==="rspack"?!1:e.endsWith("/pages/_app.tsx")||e.endsWith("/pages/_app.jsx")||e.endsWith("/pages/_app.js")?!0:e.endsWith("/app/layout.tsx")||e.endsWith("/app/layout.jsx")||e.endsWith("/app/page.tsx")||e.endsWith("/app/page.jsx")?_(n):_(n)||L(n)||U(e)}function w(t){return t.framework==="vite"?`/@fs/${x}`:x}function l(t,n){return typeof t=="string"?t===n?t:[n,t]:Array.isArray(t)?t.includes(n)?t:[n,...t]:t&&typeof t=="object"&&"import"in t?{...t,import:l(t.import,n)}:t}function X(t,n){let r=t.options.name?.toLowerCase()??"";if(r.includes("server")||r.includes("edge"))return;let e=t.options.entry;t.options.entry=async()=>{let s=typeof e=="function"?await e():e;return typeof s=="string"||Array.isArray(s)?l(s,n):s&&typeof s=="object"?Object.fromEntries(Object.entries(s).map(([i,o])=>[i,l(o,n)])):s}}function S(t){t.use("/__open",(n,r)=>{let e="";n.on("data",s=>e+=s),n.on("end",()=>{try{let{file:s,line:i,column:o}=JSON.parse(e);z(`${s}:${i}:${o}`),r.statusCode=204,r.end()}catch{r.statusCode=400,r.end()}})})}function H(t){let n=t.options.devServer;if(!n||typeof n!="object")return;let r=n.setupMiddlewares;n.setupMiddlewares=(e,s)=>(s.app&&S(s.app),typeof r=="function"?r(e,s):e)}var rt=W((t,n)=>({name:"react-inspector",enforce:"pre",resolveId(r){if(r===f)return j},load(r){if(r===j)return`
2
+ "use client";
3
+ import ${JSON.stringify(w(n))};
4
+ `},transform(r,e){if(!P(e))return;let s=h(r,e);return J(e,r,n.framework)&&s&&(s.code=`import "${f}";
5
+ `+s.code),s},vite:{configureServer(r){S(r.middlewares)}},webpack(r){X(r,w(n)),H(r)}}));export{rt as a};
6
+ //# sourceMappingURL=chunk-EJKHJJ5M.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/unplugin/index.ts","../src/core/transform.ts"],"sourcesContent":["import { createUnplugin } from \"unplugin\";\r\nimport path from \"node:path\";\r\nimport { fileURLToPath } from \"node:url\";\r\nimport launch from \"launch-editor\";\r\n\r\nimport fs from \"node:fs\";\r\n\r\nimport { transform as sourceTransform } from \"../core/transform.ts\";\r\n\r\nconst VIRTUAL_ID = \"virtual:react-inspector\";\r\nconst RESOLVED_ID = \"\\0\" + VIRTUAL_ID;\r\nconst SOURCE_EXT_RE = /\\.(mjs|js|jsx|ts|tsx)$/;\r\nconst IGNORED_PATH_RE = /\\/(node_modules|dist|build|coverage|\\.next|\\.nuxt|\\.svelte-kit|\\.output|\\.astro)\\//;\r\n\r\nfunction normalizeId(id?: string) {\r\n if (!id) return \"\";\r\n\r\n // Strip query/hash and normalize Windows paths for consistent matching.\r\n const cleaned = id.split(\"?\")[0].split(\"#\")[0];\r\n return cleaned.replace(/\\\\/g, \"/\");\r\n}\r\n\r\nconst __dirname = path.dirname(fileURLToPath(import.meta.url));\r\nconst RUNTIME_PATH = normalizeId(\r\n fs.existsSync(path.resolve(__dirname, \"../runtime/install.ts\"))\r\n ? path.resolve(__dirname, \"../runtime/install.ts\")\r\n : path.resolve(__dirname, \"./runtime.js\"),\r\n);\r\n\r\nfunction hasDirective(code: string, directive: string) {\r\n const lines = code.split(/\\r?\\n/);\r\n let inBlockComment = false;\r\n\r\n for (const line of lines) {\r\n const trimmed = line.trim();\r\n\r\n if (!trimmed) continue;\r\n\r\n if (inBlockComment) {\r\n if (trimmed.includes(\"*/\")) inBlockComment = false;\r\n continue;\r\n }\r\n\r\n if (trimmed.startsWith(\"/*\")) {\r\n if (!trimmed.includes(\"*/\")) inBlockComment = true;\r\n continue;\r\n }\r\n\r\n if (trimmed.startsWith(\"//\")) continue;\r\n\r\n const match = trimmed.match(/^(['\"])(.+)\\1;?$/);\r\n\r\n if (match?.[2] === directive) return true;\r\n\r\n // First non-directive statement means no `use client`.\r\n return false;\r\n }\r\n\r\n return false;\r\n}\r\n\r\nfunction hasUseClientDirective(code: string) {\r\n return hasDirective(code, \"use client\");\r\n}\r\n\r\nfunction shouldTransform(id?: string) {\r\n if (!id) return false;\r\n\r\n const normalized = normalizeId(id);\r\n\r\n if (\r\n IGNORED_PATH_RE.test(normalized) ||\r\n normalized.includes(\"\\0\")\r\n ) return false;\r\n\r\n return SOURCE_EXT_RE.test(normalized);\r\n}\r\n\r\nfunction importsClientRenderer(code: string) {\r\n return /from\\s+[\"']react-dom\\/client[\"']/.test(code) ||\r\n /require\\(\\s*[\"']react-dom\\/client[\"']\\s*\\)/.test(code);\r\n}\r\n\r\nfunction isLikelyClientEntry(id: string) {\r\n const normalized = normalizeId(id);\r\n const file = normalized.split(\"/\").pop() ?? \"\";\r\n const stem = file.replace(SOURCE_EXT_RE, \"\");\r\n\r\n return [\r\n \"main\",\r\n \"index\",\r\n \"app\",\r\n \"_app\",\r\n \"root\",\r\n \"client\",\r\n \"entry-client\",\r\n \"entry.client\",\r\n ].includes(stem);\r\n}\r\n\r\nfunction shouldInjectRuntime(id: string | undefined, code: string, framework: string) {\r\n if (!id) return false;\r\n\r\n const normalized = normalizeId(id);\r\n\r\n if (framework === \"webpack\" || framework === \"rspack\") {\r\n return false;\r\n }\r\n\r\n if (\r\n normalized.endsWith(\"/pages/_app.tsx\") ||\r\n normalized.endsWith(\"/pages/_app.jsx\") ||\r\n normalized.endsWith(\"/pages/_app.js\")\r\n ) return true;\r\n\r\n if (\r\n normalized.endsWith(\"/app/layout.tsx\") ||\r\n normalized.endsWith(\"/app/layout.jsx\") ||\r\n normalized.endsWith(\"/app/page.tsx\") ||\r\n normalized.endsWith(\"/app/page.jsx\")\r\n ) {\r\n return hasUseClientDirective(code);\r\n }\r\n\r\n return hasUseClientDirective(code) ||\r\n importsClientRenderer(code) ||\r\n isLikelyClientEntry(normalized);\r\n}\r\n\r\nfunction getRuntimeImport(meta: { framework: string }) {\r\n if (meta.framework === \"vite\") {\r\n return `/@fs/${RUNTIME_PATH}`;\r\n }\r\n\r\n return RUNTIME_PATH;\r\n}\r\n\r\nfunction prependImport(value: unknown, id: string): unknown {\r\n if (typeof value === \"string\") {\r\n return value === id ? value : [id, value];\r\n }\r\n\r\n if (Array.isArray(value)) {\r\n return value.includes(id) ? value : [id, ...value];\r\n }\r\n\r\n if (value && typeof value === \"object\" && \"import\" in value) {\r\n return {\r\n ...value,\r\n import: prependImport((value as { import: unknown }).import, id),\r\n };\r\n }\r\n\r\n return value;\r\n}\r\n\r\nfunction injectWebpackEntry(\r\n compiler: { options: { name?: string; entry?: unknown } },\r\n id: string,\r\n) {\r\n const name = compiler.options.name?.toLowerCase() ?? \"\";\r\n\r\n if (name.includes(\"server\") || name.includes(\"edge\")) return;\r\n\r\n const originalEntry = compiler.options.entry;\r\n\r\n compiler.options.entry = async () => {\r\n const entry =\r\n typeof originalEntry === \"function\"\r\n ? await originalEntry()\r\n : originalEntry;\r\n\r\n if (typeof entry === \"string\" || Array.isArray(entry)) {\r\n return prependImport(entry, id);\r\n }\r\n\r\n if (entry && typeof entry === \"object\") {\r\n return Object.fromEntries(\r\n Object.entries(entry).map(([key, value]) => [\r\n key,\r\n prependImport(value, id),\r\n ]),\r\n );\r\n }\r\n\r\n return entry;\r\n };\r\n}\r\n\r\nfunction installOpenMiddleware(app: any) {\r\n app.use(\"/__open\", (req: any, res: any) => {\r\n let body = \"\";\r\n\r\n req.on(\"data\", (c: Buffer | string) => body += c);\r\n\r\n req.on(\"end\", () => {\r\n try {\r\n const { file, line, column } = JSON.parse(body);\r\n\r\n launch(`${file}:${line}:${column}`);\r\n\r\n res.statusCode = 204;\r\n res.end();\r\n } catch {\r\n res.statusCode = 400;\r\n res.end();\r\n }\r\n });\r\n },\r\n );\r\n}\r\n\r\nfunction injectWebpackDevServerOpenRoute(compiler: { options: { devServer?: any } }) {\r\n const devServer = compiler.options.devServer;\r\n\r\n if (!devServer || typeof devServer !== \"object\") return;\r\n\r\n const originalSetupMiddlewares = devServer.setupMiddlewares;\r\n\r\n devServer.setupMiddlewares = (middlewares: unknown[], server: { app?: any }) => {\r\n if (server.app) installOpenMiddleware(server.app);\r\n\r\n return typeof originalSetupMiddlewares === \"function\"\r\n ? originalSetupMiddlewares(middlewares, server)\r\n : middlewares;\r\n };\r\n}\r\n\r\nexport default createUnplugin((_options, meta) => ({\r\n name: \"react-inspector\",\r\n enforce: \"pre\",\r\n\r\n resolveId(id) {\r\n if (id === VIRTUAL_ID) {\r\n return RESOLVED_ID;\r\n }\r\n },\r\n\r\n load(id) {\r\n if (id === RESOLVED_ID) {\r\n return `\r\n\"use client\";\r\nimport ${JSON.stringify(getRuntimeImport(meta))};\r\n`;\r\n }\r\n },\r\n\r\n transform(code, id) {\r\n if (!shouldTransform(id)) return;\r\n\r\n let result = sourceTransform(code, id);\r\n\r\n if (shouldInjectRuntime(id, code, meta.framework) && result) {\r\n result.code =\r\n `import \"${VIRTUAL_ID}\";\\n` +\r\n result.code;\r\n }\r\n\r\n return result;\r\n },\r\n\r\n vite: {\r\n configureServer(server) {\r\n installOpenMiddleware(server.middlewares);\r\n },\r\n },\r\n\r\n webpack(compiler) {\r\n injectWebpackEntry(compiler, getRuntimeImport(meta));\r\n injectWebpackDevServerOpenRoute(compiler);\r\n },\r\n}));\r\n","import path from \"node:path\";\r\nimport { parse } from \"@babel/parser\";\r\nimport _traverse from \"@babel/traverse\";\r\nimport MagicString from \"magic-string\";\r\n\r\n// Unwrap the default export for ESM compatibility\r\nconst traverse = (_traverse as any).default || _traverse;\r\n\r\nconst ATTR = \"data-source\";\r\n\r\nfunction normalizeId(id: string) {\r\n return id.split(\"?\")[0].split(\"#\")[0].replace(/\\\\/g, \"/\");\r\n}\r\n\r\nfunction shouldTransform(id: string) {\r\n return /\\.(mjs|js|jsx|ts|tsx)$/.test(normalizeId(id));\r\n}\r\n\r\nfunction isHostElementName(name: any) {\r\n return name.type === \"JSXIdentifier\" && /^[a-z]/.test(name.name);\r\n}\r\n\r\nexport function transform(code: string, id: string) {\r\n if (process.env.NODE_ENV === \"production\") return;\r\n\r\n const normalizedId = normalizeId(id);\r\n\r\n if (!shouldTransform(normalizedId)) return null;\r\n\r\n const s = new MagicString(code);\r\n\r\n let ast;\r\n\r\n try {\r\n ast = parse(code, {\r\n sourceType: \"unambiguous\",\r\n plugins: [\r\n \"jsx\",\r\n \"typescript\",\r\n \"decorators-legacy\",\r\n \"classProperties\",\r\n \"classPrivateProperties\",\r\n \"classPrivateMethods\",\r\n \"importAttributes\",\r\n ],\r\n });\r\n } catch {\r\n return null;\r\n }\r\n\r\n const relative = path.relative(\r\n process.cwd(),\r\n normalizedId,\r\n ).replaceAll(\"\\\\\", \"/\");\r\n\r\n traverse(ast, {\r\n JSXOpeningElement(p: { node: any; }) {\r\n const node = p.node;\r\n\r\n if (!node.loc) return;\r\n if (!isHostElementName(node.name)) return;\r\n\r\n const exists = node.attributes.some(\r\n (a: { type: string; name: { name: string; }; }) =>\r\n a.type === \"JSXAttribute\"\r\n && a.name.name === ATTR,\r\n );\r\n\r\n if (exists) return;\r\n\r\n const insert = node.end! - (\r\n node.selfClosing\r\n ? 2\r\n : 1\r\n );\r\n\r\n const { line, column } = node.loc.start;\r\n\r\n s.prependLeft(\r\n insert,\r\n ` ${ATTR}=\"${relative}:${line}:${column}\"`,\r\n );\r\n },\r\n });\r\n\r\n return {\r\n code: s.toString(),\r\n map: s.generateMap(),\r\n }\r\n}\r\n"],"mappings":"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","names":["createUnplugin","path","fileURLToPath","launch","fs","path","parse","_traverse","MagicString","traverse","ATTR","normalizeId","id","shouldTransform","isHostElementName","name","transform","code","normalizedId","s","ast","relative","p","node","a","insert","line","column","VIRTUAL_ID","RESOLVED_ID","SOURCE_EXT_RE","IGNORED_PATH_RE","normalizeId","id","__dirname","path","fileURLToPath","RUNTIME_PATH","fs","hasDirective","code","directive","lines","inBlockComment","line","trimmed","hasUseClientDirective","shouldTransform","normalized","importsClientRenderer","isLikelyClientEntry","stem","shouldInjectRuntime","framework","getRuntimeImport","meta","prependImport","value","injectWebpackEntry","compiler","name","originalEntry","entry","key","installOpenMiddleware","app","req","res","body","c","file","column","launch","injectWebpackDevServerOpenRoute","devServer","originalSetupMiddlewares","middlewares","server","unplugin_default","createUnplugin","_options","result","transform"]}
package/dist/index.cjs ADDED
@@ -0,0 +1,6 @@
1
+ "use strict";var M=Object.create;var p=Object.defineProperty;var N=Object.getOwnPropertyDescriptor;var P=Object.getOwnPropertyNames;var L=Object.getPrototypeOf,U=Object.prototype.hasOwnProperty;var J=(t,n)=>{for(var e in n)p(t,e,{get:n[e],enumerable:!0})},h=(t,n,e,r)=>{if(n&&typeof n=="object"||typeof n=="function")for(let s of P(n))!U.call(t,s)&&s!==e&&p(t,s,{get:()=>n[s],enumerable:!(r=N(n,s))||r.enumerable});return t};var c=(t,n,e)=>(e=t!=null?M(L(t)):{},h(n||!t||!t.__esModule?p(e,"default",{value:t,enumerable:!0}):e,t)),X=t=>h(p({},"__esModule",{value:!0}),t);var et={};J(et,{default:()=>nt});module.exports=X(et);var R=require("unplugin"),u=c(require("path"),1),$=require("url"),T=c(require("launch-editor"),1),A=c(require("fs"),1);var x=c(require("path"),1),_=require("@babel/parser"),l=c(require("@babel/traverse"),1),w=c(require("magic-string"),1),H=l.default.default||l.default,j="data-source";function E(t){return t.split("?")[0].split("#")[0].replace(/\\/g,"/")}function V(t){return/\.(mjs|js|jsx|ts|tsx)$/.test(E(t))}function B(t){return t.type==="JSXIdentifier"&&/^[a-z]/.test(t.name)}function S(t,n){if(process.env.NODE_ENV==="production")return;let e=E(n);if(!V(e))return null;let r=new w.default(t),s;try{s=(0,_.parse)(t,{sourceType:"unambiguous",plugins:["jsx","typescript","decorators-legacy","classProperties","classPrivateProperties","classPrivateMethods","importAttributes"]})}catch{return null}let i=x.default.relative(process.cwd(),e).replaceAll("\\","/");return H(s,{JSXOpeningElement(o){let a=o.node;if(!a.loc||!B(a.name)||a.attributes.some(y=>y.type==="JSXAttribute"&&y.name.name===j))return;let C=a.end-(a.selfClosing?2:1),{line:z,column:D}=a.loc.start;r.prependLeft(C,` ${j}="${i}:${z}:${D}"`)}}),{code:r.toString(),map:r.generateMap()}}var rt={},d="virtual:react-inspector",b="\0"+d,O=/\.(mjs|js|jsx|ts|tsx)$/,G=/\/(node_modules|dist|build|coverage|\.next|\.nuxt|\.svelte-kit|\.output|\.astro)\//;function f(t){return t?t.split("?")[0].split("#")[0].replace(/\\/g,"/"):""}var m=u.default.dirname((0,$.fileURLToPath)(rt.url)),k=f(A.default.existsSync(u.default.resolve(m,"../runtime/install.ts"))?u.default.resolve(m,"../runtime/install.ts"):u.default.resolve(m,"./runtime.js"));function q(t,n){let e=t.split(/\r?\n/),r=!1;for(let s of e){let i=s.trim();if(!i)continue;if(r){i.includes("*/")&&(r=!1);continue}if(i.startsWith("/*")){i.includes("*/")||(r=!0);continue}if(i.startsWith("//"))continue;return i.match(/^(['"])(.+)\1;?$/)?.[2]===n}return!1}function v(t){return q(t,"use client")}function F(t){if(!t)return!1;let n=f(t);return G.test(n)||n.includes("\0")?!1:O.test(n)}function K(t){return/from\s+["']react-dom\/client["']/.test(t)||/require\(\s*["']react-dom\/client["']\s*\)/.test(t)}function Q(t){let r=(f(t).split("/").pop()??"").replace(O,"");return["main","index","app","_app","root","client","entry-client","entry.client"].includes(r)}function Y(t,n,e){if(!t)return!1;let r=f(t);return e==="webpack"||e==="rspack"?!1:r.endsWith("/pages/_app.tsx")||r.endsWith("/pages/_app.jsx")||r.endsWith("/pages/_app.js")?!0:r.endsWith("/app/layout.tsx")||r.endsWith("/app/layout.jsx")||r.endsWith("/app/page.tsx")||r.endsWith("/app/page.jsx")?v(n):v(n)||K(n)||Q(r)}function I(t){return t.framework==="vite"?`/@fs/${k}`:k}function g(t,n){return typeof t=="string"?t===n?t:[n,t]:Array.isArray(t)?t.includes(n)?t:[n,...t]:t&&typeof t=="object"&&"import"in t?{...t,import:g(t.import,n)}:t}function Z(t,n){let e=t.options.name?.toLowerCase()??"";if(e.includes("server")||e.includes("edge"))return;let r=t.options.entry;t.options.entry=async()=>{let s=typeof r=="function"?await r():r;return typeof s=="string"||Array.isArray(s)?g(s,n):s&&typeof s=="object"?Object.fromEntries(Object.entries(s).map(([i,o])=>[i,g(o,n)])):s}}function W(t){t.use("/__open",(n,e)=>{let r="";n.on("data",s=>r+=s),n.on("end",()=>{try{let{file:s,line:i,column:o}=JSON.parse(r);(0,T.default)(`${s}:${i}:${o}`),e.statusCode=204,e.end()}catch{e.statusCode=400,e.end()}})})}function tt(t){let n=t.options.devServer;if(!n||typeof n!="object")return;let e=n.setupMiddlewares;n.setupMiddlewares=(r,s)=>(s.app&&W(s.app),typeof e=="function"?e(r,s):r)}var nt=(0,R.createUnplugin)((t,n)=>({name:"react-inspector",enforce:"pre",resolveId(e){if(e===d)return b},load(e){if(e===b)return`
2
+ "use client";
3
+ import ${JSON.stringify(I(n))};
4
+ `},transform(e,r){if(!F(r))return;let s=S(e,r);return Y(r,e,n.framework)&&s&&(s.code=`import "${d}";
5
+ `+s.code),s},vite:{configureServer(e){W(e.middlewares)}},webpack(e){Z(e,I(n)),tt(e)}}));
6
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/unplugin/index.ts","../src/core/transform.ts"],"sourcesContent":["import { createUnplugin } from \"unplugin\";\r\nimport path from \"node:path\";\r\nimport { fileURLToPath } from \"node:url\";\r\nimport launch from \"launch-editor\";\r\n\r\nimport fs from \"node:fs\";\r\n\r\nimport { transform as sourceTransform } from \"../core/transform.ts\";\r\n\r\nconst VIRTUAL_ID = \"virtual:react-inspector\";\r\nconst RESOLVED_ID = \"\\0\" + VIRTUAL_ID;\r\nconst SOURCE_EXT_RE = /\\.(mjs|js|jsx|ts|tsx)$/;\r\nconst IGNORED_PATH_RE = /\\/(node_modules|dist|build|coverage|\\.next|\\.nuxt|\\.svelte-kit|\\.output|\\.astro)\\//;\r\n\r\nfunction normalizeId(id?: string) {\r\n if (!id) return \"\";\r\n\r\n // Strip query/hash and normalize Windows paths for consistent matching.\r\n const cleaned = id.split(\"?\")[0].split(\"#\")[0];\r\n return cleaned.replace(/\\\\/g, \"/\");\r\n}\r\n\r\nconst __dirname = path.dirname(fileURLToPath(import.meta.url));\r\nconst RUNTIME_PATH = normalizeId(\r\n fs.existsSync(path.resolve(__dirname, \"../runtime/install.ts\"))\r\n ? path.resolve(__dirname, \"../runtime/install.ts\")\r\n : path.resolve(__dirname, \"./runtime.js\"),\r\n);\r\n\r\nfunction hasDirective(code: string, directive: string) {\r\n const lines = code.split(/\\r?\\n/);\r\n let inBlockComment = false;\r\n\r\n for (const line of lines) {\r\n const trimmed = line.trim();\r\n\r\n if (!trimmed) continue;\r\n\r\n if (inBlockComment) {\r\n if (trimmed.includes(\"*/\")) inBlockComment = false;\r\n continue;\r\n }\r\n\r\n if (trimmed.startsWith(\"/*\")) {\r\n if (!trimmed.includes(\"*/\")) inBlockComment = true;\r\n continue;\r\n }\r\n\r\n if (trimmed.startsWith(\"//\")) continue;\r\n\r\n const match = trimmed.match(/^(['\"])(.+)\\1;?$/);\r\n\r\n if (match?.[2] === directive) return true;\r\n\r\n // First non-directive statement means no `use client`.\r\n return false;\r\n }\r\n\r\n return false;\r\n}\r\n\r\nfunction hasUseClientDirective(code: string) {\r\n return hasDirective(code, \"use client\");\r\n}\r\n\r\nfunction shouldTransform(id?: string) {\r\n if (!id) return false;\r\n\r\n const normalized = normalizeId(id);\r\n\r\n if (\r\n IGNORED_PATH_RE.test(normalized) ||\r\n normalized.includes(\"\\0\")\r\n ) return false;\r\n\r\n return SOURCE_EXT_RE.test(normalized);\r\n}\r\n\r\nfunction importsClientRenderer(code: string) {\r\n return /from\\s+[\"']react-dom\\/client[\"']/.test(code) ||\r\n /require\\(\\s*[\"']react-dom\\/client[\"']\\s*\\)/.test(code);\r\n}\r\n\r\nfunction isLikelyClientEntry(id: string) {\r\n const normalized = normalizeId(id);\r\n const file = normalized.split(\"/\").pop() ?? \"\";\r\n const stem = file.replace(SOURCE_EXT_RE, \"\");\r\n\r\n return [\r\n \"main\",\r\n \"index\",\r\n \"app\",\r\n \"_app\",\r\n \"root\",\r\n \"client\",\r\n \"entry-client\",\r\n \"entry.client\",\r\n ].includes(stem);\r\n}\r\n\r\nfunction shouldInjectRuntime(id: string | undefined, code: string, framework: string) {\r\n if (!id) return false;\r\n\r\n const normalized = normalizeId(id);\r\n\r\n if (framework === \"webpack\" || framework === \"rspack\") {\r\n return false;\r\n }\r\n\r\n if (\r\n normalized.endsWith(\"/pages/_app.tsx\") ||\r\n normalized.endsWith(\"/pages/_app.jsx\") ||\r\n normalized.endsWith(\"/pages/_app.js\")\r\n ) return true;\r\n\r\n if (\r\n normalized.endsWith(\"/app/layout.tsx\") ||\r\n normalized.endsWith(\"/app/layout.jsx\") ||\r\n normalized.endsWith(\"/app/page.tsx\") ||\r\n normalized.endsWith(\"/app/page.jsx\")\r\n ) {\r\n return hasUseClientDirective(code);\r\n }\r\n\r\n return hasUseClientDirective(code) ||\r\n importsClientRenderer(code) ||\r\n isLikelyClientEntry(normalized);\r\n}\r\n\r\nfunction getRuntimeImport(meta: { framework: string }) {\r\n if (meta.framework === \"vite\") {\r\n return `/@fs/${RUNTIME_PATH}`;\r\n }\r\n\r\n return RUNTIME_PATH;\r\n}\r\n\r\nfunction prependImport(value: unknown, id: string): unknown {\r\n if (typeof value === \"string\") {\r\n return value === id ? value : [id, value];\r\n }\r\n\r\n if (Array.isArray(value)) {\r\n return value.includes(id) ? value : [id, ...value];\r\n }\r\n\r\n if (value && typeof value === \"object\" && \"import\" in value) {\r\n return {\r\n ...value,\r\n import: prependImport((value as { import: unknown }).import, id),\r\n };\r\n }\r\n\r\n return value;\r\n}\r\n\r\nfunction injectWebpackEntry(\r\n compiler: { options: { name?: string; entry?: unknown } },\r\n id: string,\r\n) {\r\n const name = compiler.options.name?.toLowerCase() ?? \"\";\r\n\r\n if (name.includes(\"server\") || name.includes(\"edge\")) return;\r\n\r\n const originalEntry = compiler.options.entry;\r\n\r\n compiler.options.entry = async () => {\r\n const entry =\r\n typeof originalEntry === \"function\"\r\n ? await originalEntry()\r\n : originalEntry;\r\n\r\n if (typeof entry === \"string\" || Array.isArray(entry)) {\r\n return prependImport(entry, id);\r\n }\r\n\r\n if (entry && typeof entry === \"object\") {\r\n return Object.fromEntries(\r\n Object.entries(entry).map(([key, value]) => [\r\n key,\r\n prependImport(value, id),\r\n ]),\r\n );\r\n }\r\n\r\n return entry;\r\n };\r\n}\r\n\r\nfunction installOpenMiddleware(app: any) {\r\n app.use(\"/__open\", (req: any, res: any) => {\r\n let body = \"\";\r\n\r\n req.on(\"data\", (c: Buffer | string) => body += c);\r\n\r\n req.on(\"end\", () => {\r\n try {\r\n const { file, line, column } = JSON.parse(body);\r\n\r\n launch(`${file}:${line}:${column}`);\r\n\r\n res.statusCode = 204;\r\n res.end();\r\n } catch {\r\n res.statusCode = 400;\r\n res.end();\r\n }\r\n });\r\n },\r\n );\r\n}\r\n\r\nfunction injectWebpackDevServerOpenRoute(compiler: { options: { devServer?: any } }) {\r\n const devServer = compiler.options.devServer;\r\n\r\n if (!devServer || typeof devServer !== \"object\") return;\r\n\r\n const originalSetupMiddlewares = devServer.setupMiddlewares;\r\n\r\n devServer.setupMiddlewares = (middlewares: unknown[], server: { app?: any }) => {\r\n if (server.app) installOpenMiddleware(server.app);\r\n\r\n return typeof originalSetupMiddlewares === \"function\"\r\n ? originalSetupMiddlewares(middlewares, server)\r\n : middlewares;\r\n };\r\n}\r\n\r\nexport default createUnplugin((_options, meta) => ({\r\n name: \"react-inspector\",\r\n enforce: \"pre\",\r\n\r\n resolveId(id) {\r\n if (id === VIRTUAL_ID) {\r\n return RESOLVED_ID;\r\n }\r\n },\r\n\r\n load(id) {\r\n if (id === RESOLVED_ID) {\r\n return `\r\n\"use client\";\r\nimport ${JSON.stringify(getRuntimeImport(meta))};\r\n`;\r\n }\r\n },\r\n\r\n transform(code, id) {\r\n if (!shouldTransform(id)) return;\r\n\r\n let result = sourceTransform(code, id);\r\n\r\n if (shouldInjectRuntime(id, code, meta.framework) && result) {\r\n result.code =\r\n `import \"${VIRTUAL_ID}\";\\n` +\r\n result.code;\r\n }\r\n\r\n return result;\r\n },\r\n\r\n vite: {\r\n configureServer(server) {\r\n installOpenMiddleware(server.middlewares);\r\n },\r\n },\r\n\r\n webpack(compiler) {\r\n injectWebpackEntry(compiler, getRuntimeImport(meta));\r\n injectWebpackDevServerOpenRoute(compiler);\r\n },\r\n}));\r\n","import path from \"node:path\";\r\nimport { parse } from \"@babel/parser\";\r\nimport _traverse from \"@babel/traverse\";\r\nimport MagicString from \"magic-string\";\r\n\r\n// Unwrap the default export for ESM compatibility\r\nconst traverse = (_traverse as any).default || _traverse;\r\n\r\nconst ATTR = \"data-source\";\r\n\r\nfunction normalizeId(id: string) {\r\n return id.split(\"?\")[0].split(\"#\")[0].replace(/\\\\/g, \"/\");\r\n}\r\n\r\nfunction shouldTransform(id: string) {\r\n return /\\.(mjs|js|jsx|ts|tsx)$/.test(normalizeId(id));\r\n}\r\n\r\nfunction isHostElementName(name: any) {\r\n return name.type === \"JSXIdentifier\" && /^[a-z]/.test(name.name);\r\n}\r\n\r\nexport function transform(code: string, id: string) {\r\n if (process.env.NODE_ENV === \"production\") return;\r\n\r\n const normalizedId = normalizeId(id);\r\n\r\n if (!shouldTransform(normalizedId)) return null;\r\n\r\n const s = new MagicString(code);\r\n\r\n let ast;\r\n\r\n try {\r\n ast = parse(code, {\r\n sourceType: \"unambiguous\",\r\n plugins: [\r\n \"jsx\",\r\n \"typescript\",\r\n \"decorators-legacy\",\r\n \"classProperties\",\r\n \"classPrivateProperties\",\r\n \"classPrivateMethods\",\r\n \"importAttributes\",\r\n ],\r\n });\r\n } catch {\r\n return null;\r\n }\r\n\r\n const relative = path.relative(\r\n process.cwd(),\r\n normalizedId,\r\n ).replaceAll(\"\\\\\", \"/\");\r\n\r\n traverse(ast, {\r\n JSXOpeningElement(p: { node: any; }) {\r\n const node = p.node;\r\n\r\n if (!node.loc) return;\r\n if (!isHostElementName(node.name)) return;\r\n\r\n const exists = node.attributes.some(\r\n (a: { type: string; name: { name: string; }; }) =>\r\n a.type === \"JSXAttribute\"\r\n && a.name.name === ATTR,\r\n );\r\n\r\n if (exists) return;\r\n\r\n const insert = node.end! - (\r\n node.selfClosing\r\n ? 2\r\n : 1\r\n );\r\n\r\n const { line, column } = node.loc.start;\r\n\r\n s.prependLeft(\r\n insert,\r\n ` ${ATTR}=\"${relative}:${line}:${column}\"`,\r\n );\r\n },\r\n });\r\n\r\n return {\r\n code: s.toString(),\r\n map: s.generateMap(),\r\n }\r\n}\r\n"],"mappings":"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","names":["unplugin_exports","__export","unplugin_default","__toCommonJS","import_unplugin","import_node_path","import_node_url","import_launch_editor","import_node_fs","import_node_path","import_parser","import_traverse","import_magic_string","traverse","_traverse","ATTR","normalizeId","id","shouldTransform","isHostElementName","name","transform","code","normalizedId","s","MagicString","ast","relative","path","p","node","a","insert","line","column","import_meta","VIRTUAL_ID","RESOLVED_ID","SOURCE_EXT_RE","IGNORED_PATH_RE","normalizeId","id","__dirname","path","RUNTIME_PATH","fs","hasDirective","code","directive","lines","inBlockComment","line","trimmed","hasUseClientDirective","shouldTransform","normalized","importsClientRenderer","isLikelyClientEntry","stem","shouldInjectRuntime","framework","getRuntimeImport","meta","prependImport","value","injectWebpackEntry","compiler","name","originalEntry","entry","key","installOpenMiddleware","app","req","res","body","c","file","column","launch","injectWebpackDevServerOpenRoute","devServer","originalSetupMiddlewares","middlewares","server","unplugin_default","_options","result","transform"]}
@@ -0,0 +1,5 @@
1
+ import * as unplugin from 'unplugin';
2
+
3
+ declare const _default: unplugin.UnpluginInstance<unknown, boolean>;
4
+
5
+ export { _default as default };
@@ -0,0 +1,5 @@
1
+ import * as unplugin from 'unplugin';
2
+
3
+ declare const _default: unplugin.UnpluginInstance<unknown, boolean>;
4
+
5
+ export { _default as default };
package/dist/index.js ADDED
@@ -0,0 +1,2 @@
1
+ import{a}from"./chunk-EJKHJJ5M.js";export{a as default};
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -0,0 +1,44 @@
1
+ "use strict";var d=Object.defineProperty;var h=Object.getOwnPropertyDescriptor;var S=Object.getOwnPropertyNames;var M=Object.prototype.hasOwnProperty;var v=(e,t)=>{for(var n in t)d(e,n,{get:t[n],enumerable:!0})},j=(e,t,n,y)=>{if(t&&typeof t=="object"||typeof t=="function")for(let c of S(t))!M.call(e,c)&&c!==n&&d(e,c,{get:()=>t[c],enumerable:!(y=h(t,c))||y.enumerable});return e};var E=e=>j(d({},"__esModule",{value:!0}),e);var k={};v(k,{installInspector:()=>b});module.exports=E(k);var p="data-source",x="__react_inspector_overlay__",P=/(.+):(\d+):(\d+)$/;function H(e){if(!e)return null;let t=e.match(P);return t?{file:t[1],line:Number(t[2]),column:Number(t[3])}:null}async function T(e){if(!e||(await fetch("/__open",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(e)})).ok)return;let n=new URLSearchParams({file:e.file,line1:String(e.line),column1:String(e.column)});await fetch(`/__nextjs_launch-editor?${n}`)}var m=!1,o=!1,r=null,l=null,a=null,s=null,i=null;function N(){l=document.createElement("div"),l.id=x,l.style.all="initial",l.style.position="fixed",l.style.top="16px",l.style.right="16px",l.style.zIndex="2147483647",l.style.fontFamily='ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif',l.style.pointerEvents="auto";let e=l.attachShadow({mode:"open"}),t=document.createElement("style");t.textContent=`
2
+ :host {
3
+ all: initial;
4
+ }
5
+
6
+ button {
7
+ align-items: center;
8
+ background-color: black;
9
+ border: 1px solid rgba(255, 255, 255, 0.28);
10
+ border-radius: 8px;
11
+ color: #f9fafb;
12
+ cursor: pointer;
13
+ display: inline-flex;
14
+ font: 600 13px/1 ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
15
+ gap: 8px;
16
+ min-height: 34px;
17
+ padding: 0 12px;
18
+ outline: none;
19
+ transition: background-color 100ms ease-in-out;
20
+ }
21
+
22
+ button:hover {
23
+ background-color: hsl(0, 0%, 7%);
24
+ }
25
+
26
+ button::before {
27
+ background: currentColor;
28
+ content: "";
29
+ display: block;
30
+ height: 14px;
31
+ mask: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDI0IDI0IiBmaWxsPSJub25lIiBzdHJva2U9ImN1cnJlbnRDb2xvciIgc3Ryb2tlLXdpZHRoPSIyIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIGNsYXNzPSJsdWNpZGUgbHVjaWRlLWNyb3NzaGFpci1pY29uIGx1Y2lkZS1jcm9zc2hhaXIiPjxjaXJjbGUgY3g9IjEyIiBjeT0iMTIiIHI9IjEwIi8+PGxpbmUgeDE9IjIyIiB4Mj0iMTgiIHkxPSIxMiIgeTI9IjEyIi8+PGxpbmUgeDE9IjYiIHgyPSIyIiB5MT0iMTIiIHkyPSIxMiIvPjxsaW5lIHgxPSIxMiIgeDI9IjEyIiB5MT0iNiIgeTI9IjIiLz48bGluZSB4MT0iMTIiIHgyPSIxMiIgeTE9IjIyIiB5Mj0iMTgiLz48L3N2Zz4=") center / contain no-repeat;
32
+ -webkit-mask: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDI0IDI0IiBmaWxsPSJub25lIiBzdHJva2U9ImN1cnJlbnRDb2xvciIgc3Ryb2tlLXdpZHRoPSIyIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIGNsYXNzPSJsdWNpZGUgbHVjaWRlLWNyb3NzaGFpci1pY29uIGx1Y2lkZS1jcm9zc2hhaXIiPjxjaXJjbGUgY3g9IjEyIiBjeT0iMTIiIHI9IjEwIi8+PGxpbmUgeDE9IjIyIiB4Mj0iMTgiIHkxPSIxMiIgeTI9IjEyIi8+PGxpbmUgeDE9IjYiIHgyPSIyIiB5MT0iMTIiIHkyPSIxMiIvPjxsaW5lIHgxPSIxMiIgeDI9IjEyIiB5MT0iNiIgeTI9IjIiLz48bGluZSB4MT0iMTIiIHgyPSIxMiIgeTE9IjIyIiB5Mj0iMTgiLz48L3N2Zz4=") center / contain no-repeat;
33
+ width: 14px;
34
+ }
35
+
36
+ button[data-active="true"] {
37
+ background-color: hsl(0, 0%, 10%);
38
+ }
39
+
40
+ button[data-active="true"]::before {
41
+ background: #fef3c7;
42
+ }
43
+ `,a=document.createElement("button"),a.type="button",a.textContent="Select",a.setAttribute("aria-pressed","false"),a.addEventListener("click",()=>u(!o)),e.append(t,a),document.documentElement.appendChild(l),s=document.createElement("div"),s.style.position="fixed",s.style.zIndex="2147483646",s.style.border="2px solid hsl(193, 80%, 50%)",s.style.borderRadius="4px",s.style.boxShadow="0 0 0 999999px hsla(193, 80%, 50%, 0.12), 0 0 24px hsla(193, 80%, 50%, 0.55)",s.style.pointerEvents="none",s.style.display="none",s.style.transition="left 0.15s ease-out, top 0.15s ease-out, width 0.15s ease-out, height 0.15s ease-out",i=document.createElement("div"),i.style.position="fixed",i.style.zIndex="2147483646",i.style.maxWidth="min(520px, calc(100vw - 24px))",i.style.overflow="hidden",i.style.textOverflow="ellipsis",i.style.whiteSpace="nowrap",i.style.background="hsl(193, 90%, 50%)",i.style.color="black",i.style.borderRadius="6px",i.style.boxShadow="0 8px 20px rgba(0, 0, 0, 0.22)",i.style.font='600 12px/1 ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif',i.style.padding="6px 8px",i.style.pointerEvents="none",i.style.display="none",i.style.transition="left 0.15s ease-out, top 0.15s ease-out",document.documentElement.append(s,i)}function u(e){o=e,a&&(a.dataset.active=String(o),a.textContent=o?"Selecting":"Select",a.setAttribute("aria-pressed",String(o))),document.documentElement.style.cursor=o?"crosshair":"",o||(r=null,f())}function f(){s&&(s.style.display="none"),i&&(i.style.display="none")}function g(e){return e.composedPath().find(n=>n instanceof Element&&n.id!==x&&!l?.contains(n)&&n.hasAttribute(p))}function I(e){if(!s||!i)return;if(!(e instanceof Element)){f();return}let t=e.getAttribute(p)||"",n=e.getBoundingClientRect();s.style.display="block",s.style.left=`${n.left}px`,s.style.top=`${n.top}px`,s.style.width=`${n.width}px`,s.style.height=`${n.height}px`,i.textContent=t,i.style.display="block",i.style.left=`${Math.max(8,Math.min(n.left,window.innerWidth-532))}px`,i.style.top=`${Math.max(8,n.top-30)}px`}function b(){m||typeof document>"u"||(console.log("[react-inspector] installing"),m=!0,N(),document.addEventListener("pointermove",e=>{if(!o)return;let t=g(e);t!==r&&(r=t,I(r))},!0),document.addEventListener("scroll",()=>{!o||!(r instanceof Element)||I(r)},!0),window.addEventListener("resize",()=>{!o||!(r instanceof Element)||I(r)}),document.addEventListener("keydown",e=>{e.key==="Escape"&&o&&u(!1)},!0),document.addEventListener("click",async e=>{if(!o||e.button!==0)return;let t=g(e);if(!(t instanceof Element))return;let n=H(t.getAttribute(p));e.preventDefault(),e.stopPropagation(),u(!1),await T(n)},!0))}b();0&&(module.exports={installInspector});
44
+ //# sourceMappingURL=runtime.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/runtime/install.ts"],"sourcesContent":["// @ts-nocheck\r\n\r\nconst ATTR = \"data-source\";\r\nconst INSPECTOR_ROOT_ID = \"__react_inspector_overlay__\";\r\n\r\nconst REGEX = /(.+):(\\d+):(\\d+)$/;\r\n\r\n/**\r\n * @param {string | null} value\r\n */\r\nfunction parseSource(value) {\r\n if (!value) return null;\r\n\r\n const match = value.match(REGEX);\r\n\r\n if (!match) return null;\r\n\r\n return {\r\n file: match[1],\r\n line: Number(match[2]),\r\n column: Number(match[3])\r\n }\r\n}\r\n\r\n/**\r\n * @param {{ file: string; line: number; column: number } | null} source\r\n */\r\nasync function openSource(source) {\r\n if (!source) return;\r\n\r\n const viteResponse = await fetch(\"/__open\", {\r\n method: \"POST\",\r\n headers: {\r\n \"Content-Type\": \"application/json\"\r\n },\r\n body: JSON.stringify(source),\r\n },\r\n );\r\n\r\n if (viteResponse.ok) return;\r\n\r\n const params = new URLSearchParams({\r\n file: source.file,\r\n line1: String(source.line),\r\n column1: String(source.column),\r\n });\r\n\r\n await fetch(`/__nextjs_launch-editor?${params}`);\r\n}\r\n\r\nlet installed = false\r\nlet selectMode = false;\r\nlet activeTarget = null;\r\nlet root = null;\r\nlet toggleButton = null;\r\nlet highlight = null;\r\nlet label = null;\r\n\r\nfunction createOverlay() {\r\n root = document.createElement(\"div\");\r\n root.id = INSPECTOR_ROOT_ID;\r\n root.style.all = \"initial\";\r\n root.style.position = \"fixed\";\r\n root.style.top = \"16px\";\r\n root.style.right = \"16px\";\r\n root.style.zIndex = \"2147483647\";\r\n root.style.fontFamily = \"ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, \\\"Segoe UI\\\", sans-serif\";\r\n root.style.pointerEvents = \"auto\";\r\n\r\n const shadow = root.attachShadow({ mode: \"open\" });\r\n\r\n const style = document.createElement(\"style\");\r\n style.textContent = `\r\n :host {\r\n all: initial;\r\n }\r\n\r\n button {\r\n align-items: center;\r\n background-color: black;\r\n border: 1px solid rgba(255, 255, 255, 0.28);\r\n border-radius: 8px;\r\n color: #f9fafb;\r\n cursor: pointer;\r\n display: inline-flex;\r\n font: 600 13px/1 ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", sans-serif;\r\n gap: 8px;\r\n min-height: 34px;\r\n padding: 0 12px;\r\n outline: none;\r\n transition: background-color 100ms ease-in-out;\r\n }\r\n \r\n button:hover {\r\n background-color: hsl(0, 0%, 7%);\r\n }\r\n\r\n button::before {\r\n background: currentColor;\r\n content: \"\";\r\n display: block;\r\n height: 14px;\r\n mask: url(\"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDI0IDI0IiBmaWxsPSJub25lIiBzdHJva2U9ImN1cnJlbnRDb2xvciIgc3Ryb2tlLXdpZHRoPSIyIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIGNsYXNzPSJsdWNpZGUgbHVjaWRlLWNyb3NzaGFpci1pY29uIGx1Y2lkZS1jcm9zc2hhaXIiPjxjaXJjbGUgY3g9IjEyIiBjeT0iMTIiIHI9IjEwIi8+PGxpbmUgeDE9IjIyIiB4Mj0iMTgiIHkxPSIxMiIgeTI9IjEyIi8+PGxpbmUgeDE9IjYiIHgyPSIyIiB5MT0iMTIiIHkyPSIxMiIvPjxsaW5lIHgxPSIxMiIgeDI9IjEyIiB5MT0iNiIgeTI9IjIiLz48bGluZSB4MT0iMTIiIHgyPSIxMiIgeTE9IjIyIiB5Mj0iMTgiLz48L3N2Zz4=\") center / contain no-repeat;\r\n -webkit-mask: url(\"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDI0IDI0IiBmaWxsPSJub25lIiBzdHJva2U9ImN1cnJlbnRDb2xvciIgc3Ryb2tlLXdpZHRoPSIyIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIGNsYXNzPSJsdWNpZGUgbHVjaWRlLWNyb3NzaGFpci1pY29uIGx1Y2lkZS1jcm9zc2hhaXIiPjxjaXJjbGUgY3g9IjEyIiBjeT0iMTIiIHI9IjEwIi8+PGxpbmUgeDE9IjIyIiB4Mj0iMTgiIHkxPSIxMiIgeTI9IjEyIi8+PGxpbmUgeDE9IjYiIHgyPSIyIiB5MT0iMTIiIHkyPSIxMiIvPjxsaW5lIHgxPSIxMiIgeDI9IjEyIiB5MT0iNiIgeTI9IjIiLz48bGluZSB4MT0iMTIiIHgyPSIxMiIgeTE9IjIyIiB5Mj0iMTgiLz48L3N2Zz4=\") center / contain no-repeat;\r\n width: 14px;\r\n }\r\n\r\n button[data-active=\"true\"] {\r\n background-color: hsl(0, 0%, 10%);\r\n }\r\n\r\n button[data-active=\"true\"]::before {\r\n background: #fef3c7;\r\n }\r\n `;\r\n\r\n toggleButton = document.createElement(\"button\");\r\n toggleButton.type = \"button\";\r\n toggleButton.textContent = \"Select\";\r\n toggleButton.setAttribute(\"aria-pressed\", \"false\");\r\n toggleButton.addEventListener(\"click\", () => setSelectMode(!selectMode));\r\n\r\n shadow.append(style, toggleButton);\r\n document.documentElement.appendChild(root);\r\n\r\n highlight = document.createElement(\"div\");\r\n highlight.style.position = \"fixed\";\r\n highlight.style.zIndex = \"2147483646\";\r\n highlight.style.border = \"2px solid hsl(193, 80%, 50%)\";\r\n highlight.style.borderRadius = \"4px\";\r\n highlight.style.boxShadow = \"0 0 0 999999px hsla(193, 80%, 50%, 0.12), 0 0 24px hsla(193, 80%, 50%, 0.55)\";\r\n highlight.style.pointerEvents = \"none\";\r\n highlight.style.display = \"none\";\r\n highlight.style.transition = \"left 0.15s ease-out, top 0.15s ease-out, width 0.15s ease-out, height 0.15s ease-out\";\r\n\r\n label = document.createElement(\"div\");\r\n label.style.position = \"fixed\";\r\n label.style.zIndex = \"2147483646\";\r\n label.style.maxWidth = \"min(520px, calc(100vw - 24px))\";\r\n label.style.overflow = \"hidden\";\r\n label.style.textOverflow = \"ellipsis\";\r\n label.style.whiteSpace = \"nowrap\";\r\n label.style.background = \"hsl(193, 90%, 50%)\";\r\n label.style.color = \"black\";\r\n label.style.borderRadius = \"6px\";\r\n label.style.boxShadow = \"0 8px 20px rgba(0, 0, 0, 0.22)\";\r\n label.style.font = \"600 12px/1 ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, \\\"Segoe UI\\\", sans-serif\";\r\n label.style.padding = \"6px 8px\";\r\n label.style.pointerEvents = \"none\";\r\n label.style.display = \"none\";\r\n label.style.transition = \"left 0.15s ease-out, top 0.15s ease-out\";\r\n\r\n document.documentElement.append(highlight, label);\r\n}\r\n\r\nfunction setSelectMode(next) {\r\n selectMode = next;\r\n\r\n if (toggleButton) {\r\n toggleButton.dataset.active = String(selectMode);\r\n toggleButton.textContent = selectMode ? \"Selecting\" : \"Select\";\r\n toggleButton.setAttribute(\"aria-pressed\", String(selectMode));\r\n }\r\n\r\n document.documentElement.style.cursor = selectMode ? \"crosshair\" : \"\";\r\n\r\n if (!selectMode) {\r\n activeTarget = null;\r\n hideHighlight();\r\n }\r\n}\r\n\r\nfunction hideHighlight() {\r\n if (highlight) highlight.style.display = \"none\";\r\n if (label) label.style.display = \"none\";\r\n}\r\n\r\nfunction getSourceTarget(e) {\r\n const path = e.composedPath();\r\n\r\n return path.find(\r\n (node) =>\r\n node instanceof Element\r\n && node.id !== INSPECTOR_ROOT_ID\r\n && !root?.contains(node)\r\n && node.hasAttribute(ATTR)\r\n );\r\n}\r\n\r\nfunction renderHighlight(target) {\r\n if (!highlight || !label) return;\r\n if (!(target instanceof Element)) {\r\n hideHighlight();\r\n return;\r\n }\r\n\r\n const source = target.getAttribute(ATTR) || \"\";\r\n const rect = target.getBoundingClientRect();\r\n\r\n highlight.style.display = \"block\";\r\n highlight.style.left = `${rect.left}px`;\r\n highlight.style.top = `${rect.top}px`;\r\n highlight.style.width = `${rect.width}px`;\r\n highlight.style.height = `${rect.height}px`;\r\n\r\n label.textContent = source;\r\n label.style.display = \"block\";\r\n label.style.left = `${Math.max(8, Math.min(rect.left, window.innerWidth - 532))}px`;\r\n label.style.top = `${Math.max(8, rect.top - 30)}px`;\r\n}\r\n\r\nexport function installInspector() {\r\n if (installed || typeof document === \"undefined\") return;\r\n console.log(\"[react-inspector] installing\");\r\n \r\n installed = true\r\n createOverlay();\r\n \r\n document.addEventListener(\"pointermove\", (e) => {\r\n if (!selectMode) return;\r\n\r\n const target = getSourceTarget(e);\r\n\r\n if (target === activeTarget) return;\r\n\r\n activeTarget = target;\r\n renderHighlight(activeTarget);\r\n }, true);\r\n\r\n document.addEventListener(\"scroll\", () => {\r\n if (!selectMode || !(activeTarget instanceof Element)) return;\r\n renderHighlight(activeTarget);\r\n }, true);\r\n\r\n window.addEventListener(\"resize\", () => {\r\n if (!selectMode || !(activeTarget instanceof Element)) return;\r\n renderHighlight(activeTarget);\r\n });\r\n\r\n document.addEventListener(\"keydown\", (e) => {\r\n if (e.key === \"Escape\" && selectMode) setSelectMode(false);\r\n }, true);\r\n\r\n document.addEventListener(\"click\", async (e) => {\r\n if (!selectMode) return;\r\n if (e.button !== 0) return;\r\n\r\n const target = getSourceTarget(e);\r\n\r\n if (!(target instanceof Element)) return;\r\n\r\n const parsed = parseSource(target.getAttribute(ATTR));\r\n\r\n e.preventDefault();\r\n e.stopPropagation();\r\n setSelectMode(false);\r\n\r\n await openSource(parsed);\r\n }, true);\r\n}\r\n\r\ninstallInspector();\r\n"],"mappings":"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","names":["install_exports","__export","installInspector","__toCommonJS","ATTR","INSPECTOR_ROOT_ID","REGEX","parseSource","value","match","openSource","source","params","installed","selectMode","activeTarget","root","toggleButton","highlight","label","createOverlay","shadow","style","setSelectMode","next","hideHighlight","getSourceTarget","node","renderHighlight","target","rect","parsed"]}
@@ -0,0 +1,3 @@
1
+ declare function installInspector(): void;
2
+
3
+ export { installInspector };
@@ -0,0 +1,3 @@
1
+ declare function installInspector(): void;
2
+
3
+ export { installInspector };
@@ -0,0 +1,44 @@
1
+ var I="data-source",y="__react_inspector_overlay__",g=/(.+):(\d+):(\d+)$/;function x(e){if(!e)return null;let n=e.match(g);return n?{file:n[1],line:Number(n[2]),column:Number(n[3])}:null}async function f(e){if(!e||(await fetch("/__open",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(e)})).ok)return;let s=new URLSearchParams({file:e.file,line1:String(e.line),column1:String(e.column)});await fetch(`/__nextjs_launch-editor?${s}`)}var u=!1,o=!1,r=null,l=null,a=null,i=null,t=null;function b(){l=document.createElement("div"),l.id=y,l.style.all="initial",l.style.position="fixed",l.style.top="16px",l.style.right="16px",l.style.zIndex="2147483647",l.style.fontFamily='ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif',l.style.pointerEvents="auto";let e=l.attachShadow({mode:"open"}),n=document.createElement("style");n.textContent=`
2
+ :host {
3
+ all: initial;
4
+ }
5
+
6
+ button {
7
+ align-items: center;
8
+ background-color: black;
9
+ border: 1px solid rgba(255, 255, 255, 0.28);
10
+ border-radius: 8px;
11
+ color: #f9fafb;
12
+ cursor: pointer;
13
+ display: inline-flex;
14
+ font: 600 13px/1 ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
15
+ gap: 8px;
16
+ min-height: 34px;
17
+ padding: 0 12px;
18
+ outline: none;
19
+ transition: background-color 100ms ease-in-out;
20
+ }
21
+
22
+ button:hover {
23
+ background-color: hsl(0, 0%, 7%);
24
+ }
25
+
26
+ button::before {
27
+ background: currentColor;
28
+ content: "";
29
+ display: block;
30
+ height: 14px;
31
+ mask: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDI0IDI0IiBmaWxsPSJub25lIiBzdHJva2U9ImN1cnJlbnRDb2xvciIgc3Ryb2tlLXdpZHRoPSIyIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIGNsYXNzPSJsdWNpZGUgbHVjaWRlLWNyb3NzaGFpci1pY29uIGx1Y2lkZS1jcm9zc2hhaXIiPjxjaXJjbGUgY3g9IjEyIiBjeT0iMTIiIHI9IjEwIi8+PGxpbmUgeDE9IjIyIiB4Mj0iMTgiIHkxPSIxMiIgeTI9IjEyIi8+PGxpbmUgeDE9IjYiIHgyPSIyIiB5MT0iMTIiIHkyPSIxMiIvPjxsaW5lIHgxPSIxMiIgeDI9IjEyIiB5MT0iNiIgeTI9IjIiLz48bGluZSB4MT0iMTIiIHgyPSIxMiIgeTE9IjIyIiB5Mj0iMTgiLz48L3N2Zz4=") center / contain no-repeat;
32
+ -webkit-mask: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDI0IDI0IiBmaWxsPSJub25lIiBzdHJva2U9ImN1cnJlbnRDb2xvciIgc3Ryb2tlLXdpZHRoPSIyIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIGNsYXNzPSJsdWNpZGUgbHVjaWRlLWNyb3NzaGFpci1pY29uIGx1Y2lkZS1jcm9zc2hhaXIiPjxjaXJjbGUgY3g9IjEyIiBjeT0iMTIiIHI9IjEwIi8+PGxpbmUgeDE9IjIyIiB4Mj0iMTgiIHkxPSIxMiIgeTI9IjEyIi8+PGxpbmUgeDE9IjYiIHgyPSIyIiB5MT0iMTIiIHkyPSIxMiIvPjxsaW5lIHgxPSIxMiIgeDI9IjEyIiB5MT0iNiIgeTI9IjIiLz48bGluZSB4MT0iMTIiIHgyPSIxMiIgeTE9IjIyIiB5Mj0iMTgiLz48L3N2Zz4=") center / contain no-repeat;
33
+ width: 14px;
34
+ }
35
+
36
+ button[data-active="true"] {
37
+ background-color: hsl(0, 0%, 10%);
38
+ }
39
+
40
+ button[data-active="true"]::before {
41
+ background: #fef3c7;
42
+ }
43
+ `,a=document.createElement("button"),a.type="button",a.textContent="Select",a.setAttribute("aria-pressed","false"),a.addEventListener("click",()=>d(!o)),e.append(n,a),document.documentElement.appendChild(l),i=document.createElement("div"),i.style.position="fixed",i.style.zIndex="2147483646",i.style.border="2px solid hsl(193, 80%, 50%)",i.style.borderRadius="4px",i.style.boxShadow="0 0 0 999999px hsla(193, 80%, 50%, 0.12), 0 0 24px hsla(193, 80%, 50%, 0.55)",i.style.pointerEvents="none",i.style.display="none",i.style.transition="left 0.15s ease-out, top 0.15s ease-out, width 0.15s ease-out, height 0.15s ease-out",t=document.createElement("div"),t.style.position="fixed",t.style.zIndex="2147483646",t.style.maxWidth="min(520px, calc(100vw - 24px))",t.style.overflow="hidden",t.style.textOverflow="ellipsis",t.style.whiteSpace="nowrap",t.style.background="hsl(193, 90%, 50%)",t.style.color="black",t.style.borderRadius="6px",t.style.boxShadow="0 8px 20px rgba(0, 0, 0, 0.22)",t.style.font='600 12px/1 ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif',t.style.padding="6px 8px",t.style.pointerEvents="none",t.style.display="none",t.style.transition="left 0.15s ease-out, top 0.15s ease-out",document.documentElement.append(i,t)}function d(e){o=e,a&&(a.dataset.active=String(o),a.textContent=o?"Selecting":"Select",a.setAttribute("aria-pressed",String(o))),document.documentElement.style.cursor=o?"crosshair":"",o||(r=null,m())}function m(){i&&(i.style.display="none"),t&&(t.style.display="none")}function p(e){return e.composedPath().find(s=>s instanceof Element&&s.id!==y&&!l?.contains(s)&&s.hasAttribute(I))}function c(e){if(!i||!t)return;if(!(e instanceof Element)){m();return}let n=e.getAttribute(I)||"",s=e.getBoundingClientRect();i.style.display="block",i.style.left=`${s.left}px`,i.style.top=`${s.top}px`,i.style.width=`${s.width}px`,i.style.height=`${s.height}px`,t.textContent=n,t.style.display="block",t.style.left=`${Math.max(8,Math.min(s.left,window.innerWidth-532))}px`,t.style.top=`${Math.max(8,s.top-30)}px`}function h(){u||typeof document>"u"||(console.log("[react-inspector] installing"),u=!0,b(),document.addEventListener("pointermove",e=>{if(!o)return;let n=p(e);n!==r&&(r=n,c(r))},!0),document.addEventListener("scroll",()=>{!o||!(r instanceof Element)||c(r)},!0),window.addEventListener("resize",()=>{!o||!(r instanceof Element)||c(r)}),document.addEventListener("keydown",e=>{e.key==="Escape"&&o&&d(!1)},!0),document.addEventListener("click",async e=>{if(!o||e.button!==0)return;let n=p(e);if(!(n instanceof Element))return;let s=x(n.getAttribute(I));e.preventDefault(),e.stopPropagation(),d(!1),await f(s)},!0))}h();export{h as installInspector};
44
+ //# sourceMappingURL=runtime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/runtime/install.ts"],"sourcesContent":["// @ts-nocheck\r\n\r\nconst ATTR = \"data-source\";\r\nconst INSPECTOR_ROOT_ID = \"__react_inspector_overlay__\";\r\n\r\nconst REGEX = /(.+):(\\d+):(\\d+)$/;\r\n\r\n/**\r\n * @param {string | null} value\r\n */\r\nfunction parseSource(value) {\r\n if (!value) return null;\r\n\r\n const match = value.match(REGEX);\r\n\r\n if (!match) return null;\r\n\r\n return {\r\n file: match[1],\r\n line: Number(match[2]),\r\n column: Number(match[3])\r\n }\r\n}\r\n\r\n/**\r\n * @param {{ file: string; line: number; column: number } | null} source\r\n */\r\nasync function openSource(source) {\r\n if (!source) return;\r\n\r\n const viteResponse = await fetch(\"/__open\", {\r\n method: \"POST\",\r\n headers: {\r\n \"Content-Type\": \"application/json\"\r\n },\r\n body: JSON.stringify(source),\r\n },\r\n );\r\n\r\n if (viteResponse.ok) return;\r\n\r\n const params = new URLSearchParams({\r\n file: source.file,\r\n line1: String(source.line),\r\n column1: String(source.column),\r\n });\r\n\r\n await fetch(`/__nextjs_launch-editor?${params}`);\r\n}\r\n\r\nlet installed = false\r\nlet selectMode = false;\r\nlet activeTarget = null;\r\nlet root = null;\r\nlet toggleButton = null;\r\nlet highlight = null;\r\nlet label = null;\r\n\r\nfunction createOverlay() {\r\n root = document.createElement(\"div\");\r\n root.id = INSPECTOR_ROOT_ID;\r\n root.style.all = \"initial\";\r\n root.style.position = \"fixed\";\r\n root.style.top = \"16px\";\r\n root.style.right = \"16px\";\r\n root.style.zIndex = \"2147483647\";\r\n root.style.fontFamily = \"ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, \\\"Segoe UI\\\", sans-serif\";\r\n root.style.pointerEvents = \"auto\";\r\n\r\n const shadow = root.attachShadow({ mode: \"open\" });\r\n\r\n const style = document.createElement(\"style\");\r\n style.textContent = `\r\n :host {\r\n all: initial;\r\n }\r\n\r\n button {\r\n align-items: center;\r\n background-color: black;\r\n border: 1px solid rgba(255, 255, 255, 0.28);\r\n border-radius: 8px;\r\n color: #f9fafb;\r\n cursor: pointer;\r\n display: inline-flex;\r\n font: 600 13px/1 ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", sans-serif;\r\n gap: 8px;\r\n min-height: 34px;\r\n padding: 0 12px;\r\n outline: none;\r\n transition: background-color 100ms ease-in-out;\r\n }\r\n \r\n button:hover {\r\n background-color: hsl(0, 0%, 7%);\r\n }\r\n\r\n button::before {\r\n background: currentColor;\r\n content: \"\";\r\n display: block;\r\n height: 14px;\r\n mask: url(\"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDI0IDI0IiBmaWxsPSJub25lIiBzdHJva2U9ImN1cnJlbnRDb2xvciIgc3Ryb2tlLXdpZHRoPSIyIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIGNsYXNzPSJsdWNpZGUgbHVjaWRlLWNyb3NzaGFpci1pY29uIGx1Y2lkZS1jcm9zc2hhaXIiPjxjaXJjbGUgY3g9IjEyIiBjeT0iMTIiIHI9IjEwIi8+PGxpbmUgeDE9IjIyIiB4Mj0iMTgiIHkxPSIxMiIgeTI9IjEyIi8+PGxpbmUgeDE9IjYiIHgyPSIyIiB5MT0iMTIiIHkyPSIxMiIvPjxsaW5lIHgxPSIxMiIgeDI9IjEyIiB5MT0iNiIgeTI9IjIiLz48bGluZSB4MT0iMTIiIHgyPSIxMiIgeTE9IjIyIiB5Mj0iMTgiLz48L3N2Zz4=\") center / contain no-repeat;\r\n -webkit-mask: url(\"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDI0IDI0IiBmaWxsPSJub25lIiBzdHJva2U9ImN1cnJlbnRDb2xvciIgc3Ryb2tlLXdpZHRoPSIyIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIGNsYXNzPSJsdWNpZGUgbHVjaWRlLWNyb3NzaGFpci1pY29uIGx1Y2lkZS1jcm9zc2hhaXIiPjxjaXJjbGUgY3g9IjEyIiBjeT0iMTIiIHI9IjEwIi8+PGxpbmUgeDE9IjIyIiB4Mj0iMTgiIHkxPSIxMiIgeTI9IjEyIi8+PGxpbmUgeDE9IjYiIHgyPSIyIiB5MT0iMTIiIHkyPSIxMiIvPjxsaW5lIHgxPSIxMiIgeDI9IjEyIiB5MT0iNiIgeTI9IjIiLz48bGluZSB4MT0iMTIiIHgyPSIxMiIgeTE9IjIyIiB5Mj0iMTgiLz48L3N2Zz4=\") center / contain no-repeat;\r\n width: 14px;\r\n }\r\n\r\n button[data-active=\"true\"] {\r\n background-color: hsl(0, 0%, 10%);\r\n }\r\n\r\n button[data-active=\"true\"]::before {\r\n background: #fef3c7;\r\n }\r\n `;\r\n\r\n toggleButton = document.createElement(\"button\");\r\n toggleButton.type = \"button\";\r\n toggleButton.textContent = \"Select\";\r\n toggleButton.setAttribute(\"aria-pressed\", \"false\");\r\n toggleButton.addEventListener(\"click\", () => setSelectMode(!selectMode));\r\n\r\n shadow.append(style, toggleButton);\r\n document.documentElement.appendChild(root);\r\n\r\n highlight = document.createElement(\"div\");\r\n highlight.style.position = \"fixed\";\r\n highlight.style.zIndex = \"2147483646\";\r\n highlight.style.border = \"2px solid hsl(193, 80%, 50%)\";\r\n highlight.style.borderRadius = \"4px\";\r\n highlight.style.boxShadow = \"0 0 0 999999px hsla(193, 80%, 50%, 0.12), 0 0 24px hsla(193, 80%, 50%, 0.55)\";\r\n highlight.style.pointerEvents = \"none\";\r\n highlight.style.display = \"none\";\r\n highlight.style.transition = \"left 0.15s ease-out, top 0.15s ease-out, width 0.15s ease-out, height 0.15s ease-out\";\r\n\r\n label = document.createElement(\"div\");\r\n label.style.position = \"fixed\";\r\n label.style.zIndex = \"2147483646\";\r\n label.style.maxWidth = \"min(520px, calc(100vw - 24px))\";\r\n label.style.overflow = \"hidden\";\r\n label.style.textOverflow = \"ellipsis\";\r\n label.style.whiteSpace = \"nowrap\";\r\n label.style.background = \"hsl(193, 90%, 50%)\";\r\n label.style.color = \"black\";\r\n label.style.borderRadius = \"6px\";\r\n label.style.boxShadow = \"0 8px 20px rgba(0, 0, 0, 0.22)\";\r\n label.style.font = \"600 12px/1 ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, \\\"Segoe UI\\\", sans-serif\";\r\n label.style.padding = \"6px 8px\";\r\n label.style.pointerEvents = \"none\";\r\n label.style.display = \"none\";\r\n label.style.transition = \"left 0.15s ease-out, top 0.15s ease-out\";\r\n\r\n document.documentElement.append(highlight, label);\r\n}\r\n\r\nfunction setSelectMode(next) {\r\n selectMode = next;\r\n\r\n if (toggleButton) {\r\n toggleButton.dataset.active = String(selectMode);\r\n toggleButton.textContent = selectMode ? \"Selecting\" : \"Select\";\r\n toggleButton.setAttribute(\"aria-pressed\", String(selectMode));\r\n }\r\n\r\n document.documentElement.style.cursor = selectMode ? \"crosshair\" : \"\";\r\n\r\n if (!selectMode) {\r\n activeTarget = null;\r\n hideHighlight();\r\n }\r\n}\r\n\r\nfunction hideHighlight() {\r\n if (highlight) highlight.style.display = \"none\";\r\n if (label) label.style.display = \"none\";\r\n}\r\n\r\nfunction getSourceTarget(e) {\r\n const path = e.composedPath();\r\n\r\n return path.find(\r\n (node) =>\r\n node instanceof Element\r\n && node.id !== INSPECTOR_ROOT_ID\r\n && !root?.contains(node)\r\n && node.hasAttribute(ATTR)\r\n );\r\n}\r\n\r\nfunction renderHighlight(target) {\r\n if (!highlight || !label) return;\r\n if (!(target instanceof Element)) {\r\n hideHighlight();\r\n return;\r\n }\r\n\r\n const source = target.getAttribute(ATTR) || \"\";\r\n const rect = target.getBoundingClientRect();\r\n\r\n highlight.style.display = \"block\";\r\n highlight.style.left = `${rect.left}px`;\r\n highlight.style.top = `${rect.top}px`;\r\n highlight.style.width = `${rect.width}px`;\r\n highlight.style.height = `${rect.height}px`;\r\n\r\n label.textContent = source;\r\n label.style.display = \"block\";\r\n label.style.left = `${Math.max(8, Math.min(rect.left, window.innerWidth - 532))}px`;\r\n label.style.top = `${Math.max(8, rect.top - 30)}px`;\r\n}\r\n\r\nexport function installInspector() {\r\n if (installed || typeof document === \"undefined\") return;\r\n console.log(\"[react-inspector] installing\");\r\n \r\n installed = true\r\n createOverlay();\r\n \r\n document.addEventListener(\"pointermove\", (e) => {\r\n if (!selectMode) return;\r\n\r\n const target = getSourceTarget(e);\r\n\r\n if (target === activeTarget) return;\r\n\r\n activeTarget = target;\r\n renderHighlight(activeTarget);\r\n }, true);\r\n\r\n document.addEventListener(\"scroll\", () => {\r\n if (!selectMode || !(activeTarget instanceof Element)) return;\r\n renderHighlight(activeTarget);\r\n }, true);\r\n\r\n window.addEventListener(\"resize\", () => {\r\n if (!selectMode || !(activeTarget instanceof Element)) return;\r\n renderHighlight(activeTarget);\r\n });\r\n\r\n document.addEventListener(\"keydown\", (e) => {\r\n if (e.key === \"Escape\" && selectMode) setSelectMode(false);\r\n }, true);\r\n\r\n document.addEventListener(\"click\", async (e) => {\r\n if (!selectMode) return;\r\n if (e.button !== 0) return;\r\n\r\n const target = getSourceTarget(e);\r\n\r\n if (!(target instanceof Element)) return;\r\n\r\n const parsed = parseSource(target.getAttribute(ATTR));\r\n\r\n e.preventDefault();\r\n e.stopPropagation();\r\n setSelectMode(false);\r\n\r\n await openSource(parsed);\r\n }, true);\r\n}\r\n\r\ninstallInspector();\r\n"],"mappings":"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","names":["ATTR","INSPECTOR_ROOT_ID","REGEX","parseSource","value","match","openSource","source","params","installed","selectMode","activeTarget","root","toggleButton","highlight","label","createOverlay","shadow","style","setSelectMode","next","hideHighlight","getSourceTarget","node","renderHighlight","target","rect","installInspector","parsed"]}
package/dist/vite.cjs ADDED
@@ -0,0 +1,6 @@
1
+ "use strict";var M=Object.create;var p=Object.defineProperty;var N=Object.getOwnPropertyDescriptor;var P=Object.getOwnPropertyNames;var L=Object.getPrototypeOf,U=Object.prototype.hasOwnProperty;var J=(t,n)=>{for(var e in n)p(t,e,{get:n[e],enumerable:!0})},h=(t,n,e,r)=>{if(n&&typeof n=="object"||typeof n=="function")for(let s of P(n))!U.call(t,s)&&s!==e&&p(t,s,{get:()=>n[s],enumerable:!(r=N(n,s))||r.enumerable});return t};var c=(t,n,e)=>(e=t!=null?M(L(t)):{},h(n||!t||!t.__esModule?p(e,"default",{value:t,enumerable:!0}):e,t)),X=t=>h(p({},"__esModule",{value:!0}),t);var et={};J(et,{default:()=>nt});module.exports=X(et);var R=require("unplugin"),u=c(require("path"),1),$=require("url"),T=c(require("launch-editor"),1),A=c(require("fs"),1);var x=c(require("path"),1),_=require("@babel/parser"),l=c(require("@babel/traverse"),1),w=c(require("magic-string"),1),H=l.default.default||l.default,j="data-source";function E(t){return t.split("?")[0].split("#")[0].replace(/\\/g,"/")}function V(t){return/\.(mjs|js|jsx|ts|tsx)$/.test(E(t))}function B(t){return t.type==="JSXIdentifier"&&/^[a-z]/.test(t.name)}function S(t,n){if(process.env.NODE_ENV==="production")return;let e=E(n);if(!V(e))return null;let r=new w.default(t),s;try{s=(0,_.parse)(t,{sourceType:"unambiguous",plugins:["jsx","typescript","decorators-legacy","classProperties","classPrivateProperties","classPrivateMethods","importAttributes"]})}catch{return null}let i=x.default.relative(process.cwd(),e).replaceAll("\\","/");return H(s,{JSXOpeningElement(o){let a=o.node;if(!a.loc||!B(a.name)||a.attributes.some(y=>y.type==="JSXAttribute"&&y.name.name===j))return;let C=a.end-(a.selfClosing?2:1),{line:z,column:D}=a.loc.start;r.prependLeft(C,` ${j}="${i}:${z}:${D}"`)}}),{code:r.toString(),map:r.generateMap()}}var rt={},d="virtual:react-inspector",b="\0"+d,O=/\.(mjs|js|jsx|ts|tsx)$/,G=/\/(node_modules|dist|build|coverage|\.next|\.nuxt|\.svelte-kit|\.output|\.astro)\//;function f(t){return t?t.split("?")[0].split("#")[0].replace(/\\/g,"/"):""}var m=u.default.dirname((0,$.fileURLToPath)(rt.url)),k=f(A.default.existsSync(u.default.resolve(m,"../runtime/install.ts"))?u.default.resolve(m,"../runtime/install.ts"):u.default.resolve(m,"./runtime.js"));function q(t,n){let e=t.split(/\r?\n/),r=!1;for(let s of e){let i=s.trim();if(!i)continue;if(r){i.includes("*/")&&(r=!1);continue}if(i.startsWith("/*")){i.includes("*/")||(r=!0);continue}if(i.startsWith("//"))continue;return i.match(/^(['"])(.+)\1;?$/)?.[2]===n}return!1}function v(t){return q(t,"use client")}function F(t){if(!t)return!1;let n=f(t);return G.test(n)||n.includes("\0")?!1:O.test(n)}function K(t){return/from\s+["']react-dom\/client["']/.test(t)||/require\(\s*["']react-dom\/client["']\s*\)/.test(t)}function Q(t){let r=(f(t).split("/").pop()??"").replace(O,"");return["main","index","app","_app","root","client","entry-client","entry.client"].includes(r)}function Y(t,n,e){if(!t)return!1;let r=f(t);return e==="webpack"||e==="rspack"?!1:r.endsWith("/pages/_app.tsx")||r.endsWith("/pages/_app.jsx")||r.endsWith("/pages/_app.js")?!0:r.endsWith("/app/layout.tsx")||r.endsWith("/app/layout.jsx")||r.endsWith("/app/page.tsx")||r.endsWith("/app/page.jsx")?v(n):v(n)||K(n)||Q(r)}function I(t){return t.framework==="vite"?`/@fs/${k}`:k}function g(t,n){return typeof t=="string"?t===n?t:[n,t]:Array.isArray(t)?t.includes(n)?t:[n,...t]:t&&typeof t=="object"&&"import"in t?{...t,import:g(t.import,n)}:t}function Z(t,n){let e=t.options.name?.toLowerCase()??"";if(e.includes("server")||e.includes("edge"))return;let r=t.options.entry;t.options.entry=async()=>{let s=typeof r=="function"?await r():r;return typeof s=="string"||Array.isArray(s)?g(s,n):s&&typeof s=="object"?Object.fromEntries(Object.entries(s).map(([i,o])=>[i,g(o,n)])):s}}function W(t){t.use("/__open",(n,e)=>{let r="";n.on("data",s=>r+=s),n.on("end",()=>{try{let{file:s,line:i,column:o}=JSON.parse(r);(0,T.default)(`${s}:${i}:${o}`),e.statusCode=204,e.end()}catch{e.statusCode=400,e.end()}})})}function tt(t){let n=t.options.devServer;if(!n||typeof n!="object")return;let e=n.setupMiddlewares;n.setupMiddlewares=(r,s)=>(s.app&&W(s.app),typeof e=="function"?e(r,s):r)}var nt=(0,R.createUnplugin)((t,n)=>({name:"react-inspector",enforce:"pre",resolveId(e){if(e===d)return b},load(e){if(e===b)return`
2
+ "use client";
3
+ import ${JSON.stringify(I(n))};
4
+ `},transform(e,r){if(!F(r))return;let s=S(e,r);return Y(r,e,n.framework)&&s&&(s.code=`import "${d}";
5
+ `+s.code),s},vite:{configureServer(e){W(e.middlewares)}},webpack(e){Z(e,I(n)),tt(e)}}));
6
+ //# sourceMappingURL=vite.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/unplugin/index.ts","../src/core/transform.ts"],"sourcesContent":["import { createUnplugin } from \"unplugin\";\r\nimport path from \"node:path\";\r\nimport { fileURLToPath } from \"node:url\";\r\nimport launch from \"launch-editor\";\r\n\r\nimport fs from \"node:fs\";\r\n\r\nimport { transform as sourceTransform } from \"../core/transform.ts\";\r\n\r\nconst VIRTUAL_ID = \"virtual:react-inspector\";\r\nconst RESOLVED_ID = \"\\0\" + VIRTUAL_ID;\r\nconst SOURCE_EXT_RE = /\\.(mjs|js|jsx|ts|tsx)$/;\r\nconst IGNORED_PATH_RE = /\\/(node_modules|dist|build|coverage|\\.next|\\.nuxt|\\.svelte-kit|\\.output|\\.astro)\\//;\r\n\r\nfunction normalizeId(id?: string) {\r\n if (!id) return \"\";\r\n\r\n // Strip query/hash and normalize Windows paths for consistent matching.\r\n const cleaned = id.split(\"?\")[0].split(\"#\")[0];\r\n return cleaned.replace(/\\\\/g, \"/\");\r\n}\r\n\r\nconst __dirname = path.dirname(fileURLToPath(import.meta.url));\r\nconst RUNTIME_PATH = normalizeId(\r\n fs.existsSync(path.resolve(__dirname, \"../runtime/install.ts\"))\r\n ? path.resolve(__dirname, \"../runtime/install.ts\")\r\n : path.resolve(__dirname, \"./runtime.js\"),\r\n);\r\n\r\nfunction hasDirective(code: string, directive: string) {\r\n const lines = code.split(/\\r?\\n/);\r\n let inBlockComment = false;\r\n\r\n for (const line of lines) {\r\n const trimmed = line.trim();\r\n\r\n if (!trimmed) continue;\r\n\r\n if (inBlockComment) {\r\n if (trimmed.includes(\"*/\")) inBlockComment = false;\r\n continue;\r\n }\r\n\r\n if (trimmed.startsWith(\"/*\")) {\r\n if (!trimmed.includes(\"*/\")) inBlockComment = true;\r\n continue;\r\n }\r\n\r\n if (trimmed.startsWith(\"//\")) continue;\r\n\r\n const match = trimmed.match(/^(['\"])(.+)\\1;?$/);\r\n\r\n if (match?.[2] === directive) return true;\r\n\r\n // First non-directive statement means no `use client`.\r\n return false;\r\n }\r\n\r\n return false;\r\n}\r\n\r\nfunction hasUseClientDirective(code: string) {\r\n return hasDirective(code, \"use client\");\r\n}\r\n\r\nfunction shouldTransform(id?: string) {\r\n if (!id) return false;\r\n\r\n const normalized = normalizeId(id);\r\n\r\n if (\r\n IGNORED_PATH_RE.test(normalized) ||\r\n normalized.includes(\"\\0\")\r\n ) return false;\r\n\r\n return SOURCE_EXT_RE.test(normalized);\r\n}\r\n\r\nfunction importsClientRenderer(code: string) {\r\n return /from\\s+[\"']react-dom\\/client[\"']/.test(code) ||\r\n /require\\(\\s*[\"']react-dom\\/client[\"']\\s*\\)/.test(code);\r\n}\r\n\r\nfunction isLikelyClientEntry(id: string) {\r\n const normalized = normalizeId(id);\r\n const file = normalized.split(\"/\").pop() ?? \"\";\r\n const stem = file.replace(SOURCE_EXT_RE, \"\");\r\n\r\n return [\r\n \"main\",\r\n \"index\",\r\n \"app\",\r\n \"_app\",\r\n \"root\",\r\n \"client\",\r\n \"entry-client\",\r\n \"entry.client\",\r\n ].includes(stem);\r\n}\r\n\r\nfunction shouldInjectRuntime(id: string | undefined, code: string, framework: string) {\r\n if (!id) return false;\r\n\r\n const normalized = normalizeId(id);\r\n\r\n if (framework === \"webpack\" || framework === \"rspack\") {\r\n return false;\r\n }\r\n\r\n if (\r\n normalized.endsWith(\"/pages/_app.tsx\") ||\r\n normalized.endsWith(\"/pages/_app.jsx\") ||\r\n normalized.endsWith(\"/pages/_app.js\")\r\n ) return true;\r\n\r\n if (\r\n normalized.endsWith(\"/app/layout.tsx\") ||\r\n normalized.endsWith(\"/app/layout.jsx\") ||\r\n normalized.endsWith(\"/app/page.tsx\") ||\r\n normalized.endsWith(\"/app/page.jsx\")\r\n ) {\r\n return hasUseClientDirective(code);\r\n }\r\n\r\n return hasUseClientDirective(code) ||\r\n importsClientRenderer(code) ||\r\n isLikelyClientEntry(normalized);\r\n}\r\n\r\nfunction getRuntimeImport(meta: { framework: string }) {\r\n if (meta.framework === \"vite\") {\r\n return `/@fs/${RUNTIME_PATH}`;\r\n }\r\n\r\n return RUNTIME_PATH;\r\n}\r\n\r\nfunction prependImport(value: unknown, id: string): unknown {\r\n if (typeof value === \"string\") {\r\n return value === id ? value : [id, value];\r\n }\r\n\r\n if (Array.isArray(value)) {\r\n return value.includes(id) ? value : [id, ...value];\r\n }\r\n\r\n if (value && typeof value === \"object\" && \"import\" in value) {\r\n return {\r\n ...value,\r\n import: prependImport((value as { import: unknown }).import, id),\r\n };\r\n }\r\n\r\n return value;\r\n}\r\n\r\nfunction injectWebpackEntry(\r\n compiler: { options: { name?: string; entry?: unknown } },\r\n id: string,\r\n) {\r\n const name = compiler.options.name?.toLowerCase() ?? \"\";\r\n\r\n if (name.includes(\"server\") || name.includes(\"edge\")) return;\r\n\r\n const originalEntry = compiler.options.entry;\r\n\r\n compiler.options.entry = async () => {\r\n const entry =\r\n typeof originalEntry === \"function\"\r\n ? await originalEntry()\r\n : originalEntry;\r\n\r\n if (typeof entry === \"string\" || Array.isArray(entry)) {\r\n return prependImport(entry, id);\r\n }\r\n\r\n if (entry && typeof entry === \"object\") {\r\n return Object.fromEntries(\r\n Object.entries(entry).map(([key, value]) => [\r\n key,\r\n prependImport(value, id),\r\n ]),\r\n );\r\n }\r\n\r\n return entry;\r\n };\r\n}\r\n\r\nfunction installOpenMiddleware(app: any) {\r\n app.use(\"/__open\", (req: any, res: any) => {\r\n let body = \"\";\r\n\r\n req.on(\"data\", (c: Buffer | string) => body += c);\r\n\r\n req.on(\"end\", () => {\r\n try {\r\n const { file, line, column } = JSON.parse(body);\r\n\r\n launch(`${file}:${line}:${column}`);\r\n\r\n res.statusCode = 204;\r\n res.end();\r\n } catch {\r\n res.statusCode = 400;\r\n res.end();\r\n }\r\n });\r\n },\r\n );\r\n}\r\n\r\nfunction injectWebpackDevServerOpenRoute(compiler: { options: { devServer?: any } }) {\r\n const devServer = compiler.options.devServer;\r\n\r\n if (!devServer || typeof devServer !== \"object\") return;\r\n\r\n const originalSetupMiddlewares = devServer.setupMiddlewares;\r\n\r\n devServer.setupMiddlewares = (middlewares: unknown[], server: { app?: any }) => {\r\n if (server.app) installOpenMiddleware(server.app);\r\n\r\n return typeof originalSetupMiddlewares === \"function\"\r\n ? originalSetupMiddlewares(middlewares, server)\r\n : middlewares;\r\n };\r\n}\r\n\r\nexport default createUnplugin((_options, meta) => ({\r\n name: \"react-inspector\",\r\n enforce: \"pre\",\r\n\r\n resolveId(id) {\r\n if (id === VIRTUAL_ID) {\r\n return RESOLVED_ID;\r\n }\r\n },\r\n\r\n load(id) {\r\n if (id === RESOLVED_ID) {\r\n return `\r\n\"use client\";\r\nimport ${JSON.stringify(getRuntimeImport(meta))};\r\n`;\r\n }\r\n },\r\n\r\n transform(code, id) {\r\n if (!shouldTransform(id)) return;\r\n\r\n let result = sourceTransform(code, id);\r\n\r\n if (shouldInjectRuntime(id, code, meta.framework) && result) {\r\n result.code =\r\n `import \"${VIRTUAL_ID}\";\\n` +\r\n result.code;\r\n }\r\n\r\n return result;\r\n },\r\n\r\n vite: {\r\n configureServer(server) {\r\n installOpenMiddleware(server.middlewares);\r\n },\r\n },\r\n\r\n webpack(compiler) {\r\n injectWebpackEntry(compiler, getRuntimeImport(meta));\r\n injectWebpackDevServerOpenRoute(compiler);\r\n },\r\n}));\r\n","import path from \"node:path\";\r\nimport { parse } from \"@babel/parser\";\r\nimport _traverse from \"@babel/traverse\";\r\nimport MagicString from \"magic-string\";\r\n\r\n// Unwrap the default export for ESM compatibility\r\nconst traverse = (_traverse as any).default || _traverse;\r\n\r\nconst ATTR = \"data-source\";\r\n\r\nfunction normalizeId(id: string) {\r\n return id.split(\"?\")[0].split(\"#\")[0].replace(/\\\\/g, \"/\");\r\n}\r\n\r\nfunction shouldTransform(id: string) {\r\n return /\\.(mjs|js|jsx|ts|tsx)$/.test(normalizeId(id));\r\n}\r\n\r\nfunction isHostElementName(name: any) {\r\n return name.type === \"JSXIdentifier\" && /^[a-z]/.test(name.name);\r\n}\r\n\r\nexport function transform(code: string, id: string) {\r\n if (process.env.NODE_ENV === \"production\") return;\r\n\r\n const normalizedId = normalizeId(id);\r\n\r\n if (!shouldTransform(normalizedId)) return null;\r\n\r\n const s = new MagicString(code);\r\n\r\n let ast;\r\n\r\n try {\r\n ast = parse(code, {\r\n sourceType: \"unambiguous\",\r\n plugins: [\r\n \"jsx\",\r\n \"typescript\",\r\n \"decorators-legacy\",\r\n \"classProperties\",\r\n \"classPrivateProperties\",\r\n \"classPrivateMethods\",\r\n \"importAttributes\",\r\n ],\r\n });\r\n } catch {\r\n return null;\r\n }\r\n\r\n const relative = path.relative(\r\n process.cwd(),\r\n normalizedId,\r\n ).replaceAll(\"\\\\\", \"/\");\r\n\r\n traverse(ast, {\r\n JSXOpeningElement(p: { node: any; }) {\r\n const node = p.node;\r\n\r\n if (!node.loc) return;\r\n if (!isHostElementName(node.name)) return;\r\n\r\n const exists = node.attributes.some(\r\n (a: { type: string; name: { name: string; }; }) =>\r\n a.type === \"JSXAttribute\"\r\n && a.name.name === ATTR,\r\n );\r\n\r\n if (exists) return;\r\n\r\n const insert = node.end! - (\r\n node.selfClosing\r\n ? 2\r\n : 1\r\n );\r\n\r\n const { line, column } = node.loc.start;\r\n\r\n s.prependLeft(\r\n insert,\r\n ` ${ATTR}=\"${relative}:${line}:${column}\"`,\r\n );\r\n },\r\n });\r\n\r\n return {\r\n code: s.toString(),\r\n map: s.generateMap(),\r\n }\r\n}\r\n"],"mappings":"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","names":["unplugin_exports","__export","unplugin_default","__toCommonJS","import_unplugin","import_node_path","import_node_url","import_launch_editor","import_node_fs","import_node_path","import_parser","import_traverse","import_magic_string","traverse","_traverse","ATTR","normalizeId","id","shouldTransform","isHostElementName","name","transform","code","normalizedId","s","MagicString","ast","relative","path","p","node","a","insert","line","column","import_meta","VIRTUAL_ID","RESOLVED_ID","SOURCE_EXT_RE","IGNORED_PATH_RE","normalizeId","id","__dirname","path","RUNTIME_PATH","fs","hasDirective","code","directive","lines","inBlockComment","line","trimmed","hasUseClientDirective","shouldTransform","normalized","importsClientRenderer","isLikelyClientEntry","stem","shouldInjectRuntime","framework","getRuntimeImport","meta","prependImport","value","injectWebpackEntry","compiler","name","originalEntry","entry","key","installOpenMiddleware","app","req","res","body","c","file","column","launch","injectWebpackDevServerOpenRoute","devServer","originalSetupMiddlewares","middlewares","server","unplugin_default","_options","result","transform"]}
@@ -0,0 +1,2 @@
1
+ import 'unplugin';
2
+ export { default } from './index.cjs';
package/dist/vite.d.ts ADDED
@@ -0,0 +1,2 @@
1
+ import 'unplugin';
2
+ export { default } from './index.js';
package/dist/vite.js ADDED
@@ -0,0 +1,2 @@
1
+ import{a}from"./chunk-EJKHJJ5M.js";export{a as default};
2
+ //# sourceMappingURL=vite.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
package/package.json ADDED
@@ -0,0 +1,45 @@
1
+ {
2
+ "name": "interactive-react-inspector",
3
+ "version": "1.0.0",
4
+ "description": "React component inspector and source code jump utility",
5
+ "author": "Jakub Sokol",
6
+ "license": "MIT",
7
+ "type": "module",
8
+ "exports": {
9
+ ".": "./dist/index.js",
10
+ "./vite": "./dist/vite.js",
11
+ "./runtime": "./dist/runtime.js"
12
+ },
13
+ "main": "dist/index.js",
14
+ "module": "dist/index.js",
15
+ "types": "dist/index.d.ts",
16
+ "files": [
17
+ "dist"
18
+ ],
19
+ "keywords": [
20
+ "react",
21
+ "inspector",
22
+ "debug",
23
+ "vite",
24
+ "unplugin",
25
+ "nextjs"
26
+ ],
27
+ "dependencies": {
28
+ "@babel/parser": "^7.29.3",
29
+ "@babel/traverse": "^7.29.0",
30
+ "launch-editor": "^2.13.2",
31
+ "magic-string": "^0.30.21",
32
+ "unplugin": "^3.0.0"
33
+ },
34
+ "devDependencies": {
35
+ "@types/babel__traverse": "^7.28.0",
36
+ "@types/node": "^20.19.41",
37
+ "tsup": "^8.3.5",
38
+ "typescript": "^5.7.3"
39
+ },
40
+ "scripts": {
41
+ "build": "tsup",
42
+ "dev": "tsup --watch",
43
+ "test": "echo \"Error: no test specified\" && exit 1"
44
+ }
45
+ }