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 +21 -0
- package/README.md +65 -0
- package/dist/chunk-EJKHJJ5M.js +6 -0
- package/dist/chunk-EJKHJJ5M.js.map +1 -0
- package/dist/index.cjs +6 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +5 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -0
- package/dist/runtime.cjs +44 -0
- package/dist/runtime.cjs.map +1 -0
- package/dist/runtime.d.cts +3 -0
- package/dist/runtime.d.ts +3 -0
- package/dist/runtime.js +44 -0
- package/dist/runtime.js.map +1 -0
- package/dist/vite.cjs +6 -0
- package/dist/vite.cjs.map +1 -0
- package/dist/vite.d.cts +2 -0
- package/dist/vite.d.ts +2 -0
- package/dist/vite.js +2 -0
- package/dist/vite.js.map +1 -0
- package/package.json +45 -0
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"]}
|
package/dist/index.d.cts
ADDED
package/dist/index.d.ts
ADDED
package/dist/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
package/dist/runtime.cjs
ADDED
|
@@ -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"]}
|
package/dist/runtime.js
ADDED
|
@@ -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"]}
|
package/dist/vite.d.cts
ADDED
package/dist/vite.d.ts
ADDED
package/dist/vite.js
ADDED
package/dist/vite.js.map
ADDED
|
@@ -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
|
+
}
|